10#ifndef EIGEN_OPENGL_MODULE_H
11#define EIGEN_OPENGL_MODULE_H
13#include "../../Eigen/Geometry"
15#if defined(__APPLE_CC__)
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); \
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); \
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()); \
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()); } \
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()); } \
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()); } \
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)
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)
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)
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)
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]); }
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)
149template <
typename Scalar>
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]); }
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)
165template <
typename Scalar>
167 glTranslate(t.vector());
169template <
typename Scalar>
171 glTranslate(t.vector());
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)
178template <
typename Scalar>
180 glMultMatrix(t.matrix());
182template <
typename Scalar>
184 glMultMatrix(t.matrix());
186template <
typename Scalar>
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)
195template <
typename Scalar>
197 glLoadMatrix(t.matrix());
199template <
typename Scalar>
201 glLoadMatrix(t.matrix());
203template <
typename Scalar>
208inline void glRotate(
const Rotation2D<float>& rot) { glRotatef(rot.angle() * 180.f /
float(EIGEN_PI), 0.f, 0.f, 1.f); }
210 glRotated(rot.angle() * 180.0 /
double(EIGEN_PI), 0.0, 0.0, 1.0);
213template <
typename Derived>
216 glMultMatrix(tr.matrix());
219#define EIGEN_GL_MAKE_CONST_const const
220#define EIGEN_GL_MAKE_CONST__
221#define EIGEN_GL_EVAL(X) X
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); \
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); \
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()); \
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()); \
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()); \
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()); \
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)
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); }
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); }
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); }
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); }
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)
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)
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); }
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)
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); }
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)
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); }
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)
Namespace containing all symbols from the Eigen library.