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