Eigen-unsupported  3.4.90 (git rev 9589cc4e7fd8e4538bedef80dd36c7738977a8be)
 
Loading...
Searching...
No Matches
OpenGLSupport
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_OPENGL_MODULE_H
11#define EIGEN_OPENGL_MODULE_H
12
13#include "../../Eigen/Geometry"
14
15#if defined(__APPLE_CC__)
16#include <OpenGL/gl.h>
17#else
18#include <GL/gl.h>
19#endif
20
21namespace Eigen {
22
47
48#define EIGEN_GL_FUNC_DECLARATION(FUNC) \
49 namespace internal { \
50 template <typename XprType, typename Scalar = typename XprType::Scalar, int Rows = XprType::RowsAtCompileTime, \
51 int Cols = XprType::ColsAtCompileTime, \
52 bool IsGLCompatible = bool(internal::evaluator<XprType>::Flags & LinearAccessBit) && \
53 bool(XprType::Flags & DirectAccessBit) && \
54 (XprType::IsVectorAtCompileTime || (XprType::Flags & RowMajorBit) == 0)> \
55 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl); \
56 \
57 template <typename XprType, typename Scalar, int Rows, int Cols> \
58 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, Scalar, Rows, Cols, false> { \
59 inline static void run(const XprType& p) { \
60 EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<typename plain_matrix_type_column_major<XprType>::type>::run(p); \
61 } \
62 }; \
63 } \
64 \
65 template <typename Derived> \
66 inline void FUNC(const Eigen::DenseBase<Derived>& p) { \
67 EIGEN_CAT(EIGEN_CAT(internal::gl_, FUNC), _impl)<Derived>::run(p.derived()); \
68 }
69
70#define EIGEN_GL_FUNC_SPECIALIZATION_MAT(FUNC, SCALAR, ROWS, COLS, SUFFIX) \
71 namespace internal { \
72 template <typename XprType> \
73 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, ROWS, COLS, true> { \
74 inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); } \
75 }; \
76 }
77
78#define EIGEN_GL_FUNC_SPECIALIZATION_VEC(FUNC, SCALAR, SIZE, SUFFIX) \
79 namespace internal { \
80 template <typename XprType> \
81 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, SIZE, 1, true> { \
82 inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); } \
83 }; \
84 template <typename XprType> \
85 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, 1, SIZE, true> { \
86 inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); } \
87 }; \
88 }
89
90EIGEN_GL_FUNC_DECLARATION(glVertex)
91EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, int, 2, 2iv)
92EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, short, 2, 2sv)
93EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, float, 2, 2fv)
94EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, double, 2, 2dv)
95EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, int, 3, 3iv)
96EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, short, 3, 3sv)
97EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, float, 3, 3fv)
98EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, double, 3, 3dv)
99EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, int, 4, 4iv)
100EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, short, 4, 4sv)
101EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, float, 4, 4fv)
102EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, double, 4, 4dv)
103
104EIGEN_GL_FUNC_DECLARATION(glTexCoord)
105EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, int, 2, 2iv)
106EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, short, 2, 2sv)
107EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, float, 2, 2fv)
108EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, double, 2, 2dv)
109EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, int, 3, 3iv)
110EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, short, 3, 3sv)
111EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, float, 3, 3fv)
112EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, double, 3, 3dv)
113EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, int, 4, 4iv)
114EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, short, 4, 4sv)
115EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, float, 4, 4fv)
116EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, double, 4, 4dv)
117
118EIGEN_GL_FUNC_DECLARATION(glColor)
119EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, int, 2, 2iv)
120EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, short, 2, 2sv)
121EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, float, 2, 2fv)
122EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, double, 2, 2dv)
123EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, int, 3, 3iv)
124EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, short, 3, 3sv)
125EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, float, 3, 3fv)
126EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, double, 3, 3dv)
127EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, int, 4, 4iv)
128EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, short, 4, 4sv)
129EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, float, 4, 4fv)
130EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, double, 4, 4dv)
131
132EIGEN_GL_FUNC_DECLARATION(glNormal)
133EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal, int, 3, 3iv)
134EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal, short, 3, 3sv)
135EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal, float, 3, 3fv)
136EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal, double, 3, 3dv)
137
138inline void glScale2fv(const float* v) { glScalef(v[0], v[1], 1.f); }
139inline void glScale2dv(const double* v) { glScaled(v[0], v[1], 1.0); }
140inline void glScale3fv(const float* v) { glScalef(v[0], v[1], v[2]); }
141inline void glScale3dv(const double* v) { glScaled(v[0], v[1], v[2]); }
142
143EIGEN_GL_FUNC_DECLARATION(glScale)
144EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale, float, 2, 2fv)
145EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale, double, 2, 2dv)
146EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale, float, 3, 3fv)
147EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale, double, 3, 3dv)
148
149template <typename Scalar>
150void glScale(const UniformScaling<Scalar>& s) {
151 glScale(Matrix<Scalar, 3, 1>::Constant(s.factor()));
152}
153
154inline void glTranslate2fv(const float* v) { glTranslatef(v[0], v[1], 0.f); }
155inline void glTranslate2dv(const double* v) { glTranslated(v[0], v[1], 0.0); }
156inline void glTranslate3fv(const float* v) { glTranslatef(v[0], v[1], v[2]); }
157inline void glTranslate3dv(const double* v) { glTranslated(v[0], v[1], v[2]); }
158
159EIGEN_GL_FUNC_DECLARATION(glTranslate)
160EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate, float, 2, 2fv)
161EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate, double, 2, 2dv)
162EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate, float, 3, 3fv)
163EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate, double, 3, 3dv)
164
165template <typename Scalar>
166void glTranslate(const Translation<Scalar, 2>& t) {
167 glTranslate(t.vector());
168}
169template <typename Scalar>
170void glTranslate(const Translation<Scalar, 3>& t) {
171 glTranslate(t.vector());
172}
173
174EIGEN_GL_FUNC_DECLARATION(glMultMatrix)
175EIGEN_GL_FUNC_SPECIALIZATION_MAT(glMultMatrix, float, 4, 4, f)
176EIGEN_GL_FUNC_SPECIALIZATION_MAT(glMultMatrix, double, 4, 4, d)
177
178template <typename Scalar>
179void glMultMatrix(const Transform<Scalar, 3, Affine>& t) {
180 glMultMatrix(t.matrix());
181}
182template <typename Scalar>
183void glMultMatrix(const Transform<Scalar, 3, Projective>& t) {
184 glMultMatrix(t.matrix());
185}
186template <typename Scalar>
187void glMultMatrix(const Transform<Scalar, 3, AffineCompact>& t) {
188 glMultMatrix(Transform<Scalar, 3, Affine>(t).matrix());
189}
190
191EIGEN_GL_FUNC_DECLARATION(glLoadMatrix)
192EIGEN_GL_FUNC_SPECIALIZATION_MAT(glLoadMatrix, float, 4, 4, f)
193EIGEN_GL_FUNC_SPECIALIZATION_MAT(glLoadMatrix, double, 4, 4, d)
194
195template <typename Scalar>
196void glLoadMatrix(const Transform<Scalar, 3, Affine>& t) {
197 glLoadMatrix(t.matrix());
198}
199template <typename Scalar>
200void glLoadMatrix(const Transform<Scalar, 3, Projective>& t) {
201 glLoadMatrix(t.matrix());
202}
203template <typename Scalar>
204void glLoadMatrix(const Transform<Scalar, 3, AffineCompact>& t) {
205 glLoadMatrix(Transform<Scalar, 3, Affine>(t).matrix());
206}
207
208inline void glRotate(const Rotation2D<float>& rot) { glRotatef(rot.angle() * 180.f / float(EIGEN_PI), 0.f, 0.f, 1.f); }
209inline void glRotate(const Rotation2D<double>& rot) {
210 glRotated(rot.angle() * 180.0 / double(EIGEN_PI), 0.0, 0.0, 1.0);
211}
212
213template <typename Derived>
214void glRotate(const RotationBase<Derived, 3>& rot) {
216 glMultMatrix(tr.matrix());
217}
218
219#define EIGEN_GL_MAKE_CONST_const const
220#define EIGEN_GL_MAKE_CONST__
221#define EIGEN_GL_EVAL(X) X
222
223#define EIGEN_GL_FUNC1_DECLARATION(FUNC, ARG1, CONST) \
224 namespace internal { \
225 template <typename XprType, typename Scalar = typename XprType::Scalar, int Rows = XprType::RowsAtCompileTime, \
226 int Cols = XprType::ColsAtCompileTime, \
227 bool IsGLCompatible = bool(internal::evaluator<XprType>::Flags & LinearAccessBit) && \
228 bool(XprType::Flags & DirectAccessBit) && \
229 (XprType::IsVectorAtCompileTime || (XprType::Flags & RowMajorBit) == 0)> \
230 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl); \
231 \
232 template <typename XprType, typename Scalar, int Rows, int Cols> \
233 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, Scalar, Rows, Cols, false> { \
234 inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { \
235 EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<typename plain_matrix_type_column_major<XprType>::type>::run(a, p); \
236 } \
237 }; \
238 } \
239 \
240 template <typename Derived> \
241 inline void FUNC(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) Eigen::DenseBase<Derived>& p) { \
242 EIGEN_CAT(EIGEN_CAT(internal::gl_, FUNC), _impl)<Derived>::run(a, p.derived()); \
243 }
244
245#define EIGEN_GL_FUNC1_SPECIALIZATION_MAT(FUNC, ARG1, CONST, SCALAR, ROWS, COLS, SUFFIX) \
246 namespace internal { \
247 template <typename XprType> \
248 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, ROWS, COLS, true> { \
249 inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { \
250 FUNC##SUFFIX(a, p.data()); \
251 } \
252 }; \
253 }
254
255#define EIGEN_GL_FUNC1_SPECIALIZATION_VEC(FUNC, ARG1, CONST, SCALAR, SIZE, SUFFIX) \
256 namespace internal { \
257 template <typename XprType> \
258 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, SIZE, 1, true> { \
259 inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { \
260 FUNC##SUFFIX(a, p.data()); \
261 } \
262 }; \
263 template <typename XprType> \
264 struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, 1, SIZE, true> { \
265 inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { \
266 FUNC##SUFFIX(a, p.data()); \
267 } \
268 }; \
269 }
270
271EIGEN_GL_FUNC1_DECLARATION(glGet, GLenum, _)
272EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glGet, GLenum, _, float, 4, 4, Floatv)
273EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glGet, GLenum, _, double, 4, 4, Doublev)
274
275// glUniform API
276
277#ifdef GL_VERSION_2_0
278
279inline void glUniform2fv_ei(GLint loc, const float* v) { glUniform2fv(loc, 1, v); }
280inline void glUniform2iv_ei(GLint loc, const int* v) { glUniform2iv(loc, 1, v); }
281
282inline void glUniform3fv_ei(GLint loc, const float* v) { glUniform3fv(loc, 1, v); }
283inline void glUniform3iv_ei(GLint loc, const int* v) { glUniform3iv(loc, 1, v); }
284
285inline void glUniform4fv_ei(GLint loc, const float* v) { glUniform4fv(loc, 1, v); }
286inline void glUniform4iv_ei(GLint loc, const int* v) { glUniform4iv(loc, 1, v); }
287
288inline void glUniformMatrix2fv_ei(GLint loc, const float* v) { glUniformMatrix2fv(loc, 1, false, v); }
289inline void glUniformMatrix3fv_ei(GLint loc, const float* v) { glUniformMatrix3fv(loc, 1, false, v); }
290inline void glUniformMatrix4fv_ei(GLint loc, const float* v) { glUniformMatrix4fv(loc, 1, false, v); }
291
292EIGEN_GL_FUNC1_DECLARATION(glUniform, GLint, const)
293EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, float, 2, 2fv_ei)
294EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, int, 2, 2iv_ei)
295EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, float, 3, 3fv_ei)
296EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, int, 3, 3iv_ei)
297EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, float, 4, 4fv_ei)
298EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, int, 4, 4iv_ei)
299
300EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 2, 2, Matrix2fv_ei)
301EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 3, 3, Matrix3fv_ei)
302EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 4, 4, Matrix4fv_ei)
303
304#endif
305
306#ifdef GL_VERSION_2_1
307
308inline void glUniformMatrix2x3fv_ei(GLint loc, const float* v) { glUniformMatrix2x3fv(loc, 1, false, v); }
309inline void glUniformMatrix3x2fv_ei(GLint loc, const float* v) { glUniformMatrix3x2fv(loc, 1, false, v); }
310inline void glUniformMatrix2x4fv_ei(GLint loc, const float* v) { glUniformMatrix2x4fv(loc, 1, false, v); }
311inline void glUniformMatrix4x2fv_ei(GLint loc, const float* v) { glUniformMatrix4x2fv(loc, 1, false, v); }
312inline void glUniformMatrix3x4fv_ei(GLint loc, const float* v) { glUniformMatrix3x4fv(loc, 1, false, v); }
313inline void glUniformMatrix4x3fv_ei(GLint loc, const float* v) { glUniformMatrix4x3fv(loc, 1, false, v); }
314
315EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 2, 3, Matrix2x3fv_ei)
316EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 3, 2, Matrix3x2fv_ei)
317EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 2, 4, Matrix2x4fv_ei)
318EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 4, 2, Matrix4x2fv_ei)
319EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 3, 4, Matrix3x4fv_ei)
320EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 4, 3, Matrix4x3fv_ei)
321
322#endif
323
324#ifdef GL_VERSION_3_0
325
326inline void glUniform2uiv_ei(GLint loc, const unsigned int* v) { glUniform2uiv(loc, 1, v); }
327inline void glUniform3uiv_ei(GLint loc, const unsigned int* v) { glUniform3uiv(loc, 1, v); }
328inline void glUniform4uiv_ei(GLint loc, const unsigned int* v) { glUniform4uiv(loc, 1, v); }
329
330EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, unsigned int, 2, 2uiv_ei)
331EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, unsigned int, 3, 3uiv_ei)
332EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, unsigned int, 4, 4uiv_ei)
333
334#endif
335
336#ifdef GL_ARB_gpu_shader_fp64
337inline void glUniform2dv_ei(GLint loc, const double* v) { glUniform2dv(loc, 1, v); }
338inline void glUniform3dv_ei(GLint loc, const double* v) { glUniform3dv(loc, 1, v); }
339inline void glUniform4dv_ei(GLint loc, const double* v) { glUniform4dv(loc, 1, v); }
340
341EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, double, 2, 2dv_ei)
342EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, double, 3, 3dv_ei)
343EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, double, 4, 4dv_ei)
344#endif
345
347
348} // namespace Eigen
349
350#endif // EIGEN_OPENGL_MODULE_H
Namespace containing all symbols from the Eigen library.