1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_GPUHELPER_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_GPUHELPER_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Geometry>
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <GL/gl.h>
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <vector>
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathusing namespace Eigen;
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Vector4f Color;
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass GpuHelper
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    GpuHelper();
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ~GpuHelper();
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum ProjectionMode2D { PM_Normalized = 1, PM_Viewport = 2 };
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void pushProjectionMode2D(ProjectionMode2D pm);
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void popProjectionMode2D();
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Multiply the OpenGL matrix \a matrixTarget by the matrix \a mat.
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        Essentially, this helper function automatically calls glMatrixMode(matrixTarget) if required
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        and does a proper call to the right glMultMatrix*() function according to the scalar type
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        and storage order.
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        \warning glMatrixMode() must never be called directly. If your're unsure, use forceMatrixMode().
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        \sa Matrix, loadMatrix(), forceMatrixMode()
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Scalar, int _Flags>
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void multMatrix(const Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget);
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Load the matrix \a mat to the OpenGL matrix \a matrixTarget.
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        Essentially, this helper function automatically calls glMatrixMode(matrixTarget) if required
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        and does a proper call to the right glLoadMatrix*() or glLoadIdentity() function according to the scalar type
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        and storage order.
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        \warning glMatrixMode() must never be called directly. If your're unsure, use forceMatrixMode().
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        \sa Matrix, multMatrix(), forceMatrixMode()
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Scalar, int _Flags>
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void loadMatrix(const Eigen::Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget);
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Scalar, typename Derived>
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void loadMatrix(
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<Scalar>,Derived>&,
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        GLenum matrixTarget);
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Make the matrix \a matrixTarget the current OpenGL matrix target.
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        Call this function before loadMatrix() or multMatrix() if you cannot guarantee that glMatrixMode()
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        has never been called after the last loadMatrix() or multMatrix() calls.
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        \todo provides a debug mode checking the sanity of the cached matrix mode.
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void forceMatrixTarget(GLenum matrixTarget) {glMatrixMode(mCurrentMatrixTarget=matrixTarget);}
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void setMatrixTarget(GLenum matrixTarget);
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Push the OpenGL matrix \a matrixTarget and load \a mat.
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Scalar, int _Flags>
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void pushMatrix(const Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget);
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Scalar, typename Derived>
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void pushMatrix(
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<Scalar>,Derived>&,
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        GLenum matrixTarget);
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Push and clone the OpenGL matrix \a matrixTarget
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void pushMatrix(GLenum matrixTarget);
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Pop the OpenGL matrix \a matrixTarget
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void popMatrix(GLenum matrixTarget);
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void drawVector(const Vector3f& position, const Vector3f& vec, const Color& color, float aspect = 50.);
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void drawVectorBox(const Vector3f& position, const Vector3f& vec, const Color& color, float aspect = 50.);
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void drawUnitCube(void);
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void drawUnitSphere(int level=0);
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /// draw the \a nofElement first elements
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void draw(GLenum mode, uint nofElement);
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /// draw a range of elements
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void draw(GLenum mode, uint start, uint end);
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /// draw an indexed subset
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void draw(GLenum mode, const std::vector<uint>* pIndexes);
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected:
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void update(void);
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    GLuint mColorBufferId;
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    int mVpWidth, mVpHeight;
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    GLenum mCurrentMatrixTarget;
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool mInitialized;
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Singleton shortcut
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath*/
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathextern GpuHelper gpu;
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath*/
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<bool RowMajor, int _Flags> struct GlMatrixHelper;
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int _Flags> struct GlMatrixHelper<false,_Flags>
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static void loadMatrix(const Matrix<float, 4,4, _Flags, 4,4>&  mat) { glLoadMatrixf(mat.data()); }
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static void loadMatrix(const Matrix<double,4,4, _Flags, 4,4>& mat) { glLoadMatrixd(mat.data()); }
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static void multMatrix(const Matrix<float, 4,4, _Flags, 4,4>&  mat) { glMultMatrixf(mat.data()); }
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static void multMatrix(const Matrix<double,4,4, _Flags, 4,4>& mat) { glMultMatrixd(mat.data()); }
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int _Flags> struct GlMatrixHelper<true,_Flags>
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static void loadMatrix(const Matrix<float, 4,4, _Flags, 4,4>&  mat) { glLoadMatrixf(mat.transpose().eval().data()); }
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static void loadMatrix(const Matrix<double,4,4, _Flags, 4,4>& mat) { glLoadMatrixd(mat.transpose().eval().data()); }
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static void multMatrix(const Matrix<float, 4,4, _Flags, 4,4>&  mat) { glMultMatrixf(mat.transpose().eval().data()); }
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static void multMatrix(const Matrix<double,4,4, _Flags, 4,4>& mat) { glMultMatrixd(mat.transpose().eval().data()); }
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void GpuHelper::setMatrixTarget(GLenum matrixTarget)
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if (matrixTarget != mCurrentMatrixTarget)
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        glMatrixMode(mCurrentMatrixTarget=matrixTarget);
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int _Flags>
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::multMatrix(const Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget)
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    setMatrixTarget(matrixTarget);
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    GlMatrixHelper<_Flags&Eigen::RowMajorBit, _Flags>::multMatrix(mat);
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename Derived>
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::loadMatrix(
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<Scalar>,Derived>&,
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    GLenum matrixTarget)
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    setMatrixTarget(matrixTarget);
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    glLoadIdentity();
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int _Flags>
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::loadMatrix(const Eigen::Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget)
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    setMatrixTarget(matrixTarget);
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    GlMatrixHelper<(_Flags&Eigen::RowMajorBit)!=0, _Flags>::loadMatrix(mat);
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void GpuHelper::pushMatrix(GLenum matrixTarget)
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    setMatrixTarget(matrixTarget);
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    glPushMatrix();
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int _Flags>
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void GpuHelper::pushMatrix(const Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget)
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    pushMatrix(matrixTarget);
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    GlMatrixHelper<_Flags&Eigen::RowMajorBit,_Flags>::loadMatrix(mat);
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename Derived>
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::pushMatrix(
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<Scalar>,Derived>&,
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    GLenum matrixTarget)
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    pushMatrix(matrixTarget);
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    glLoadIdentity();
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void GpuHelper::popMatrix(GLenum matrixTarget)
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    setMatrixTarget(matrixTarget);
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    glPopMatrix();
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void GpuHelper::draw(GLenum mode, uint nofElement)
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    glDrawArrays(mode, 0, nofElement);
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void GpuHelper::draw(GLenum mode, const std::vector<uint>* pIndexes)
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    glDrawElements(mode, pIndexes->size(), GL_UNSIGNED_INT, &(pIndexes->front()));
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void GpuHelper::draw(GLenum mode, uint start, uint end)
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    glDrawArrays(mode, start, end-start);
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_GPUHELPER_H
208