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