00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GLIFT_PRIM_GL_H__
00020 #define GLIFT_PRIM_GL_H__
00021
00022 #include "rawPrim.h"
00023 #include "drawAlgorithm.h"
00024 #include <GL/glew.h>
00025
00026 namespace glift {
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 class _export_ PrimGL : public SinglePrim
00044 {
00045 public:
00046 PrimGL( GLenum primType, GLint minVerts, GLint vertDivisor, const gutz::vec3f& scale,
00047 const gutz::arrayw2f& vert,
00048 const gutz::arrayw2f& texCoord,
00049 const gutz::arrayw2f& norm = gutz::arrayo2f(),
00050 const gutz::arrayw1ui& indices = gutz::arrayo1ui(),
00051 DrawAlg drawAlgType = GLIFT_DRAW_IMM );
00052
00053 PrimGL( GLenum primType, GLint minVerts, GLint vertDivisor, const gutz::vec3f& scale,
00054 const gutz::arrayw2f& vert,
00055 const gutz::arrayw2f& texCoord,
00056 const gutz::arrayw2f& normalize = gutz::arrayo2f(),
00057 const gutz::arrayw1ui& indices = gutz::arrayo1ui(),
00058 const gutz::arrayw2f& color = gutz::arrayo2f(),
00059 const gutz::arrayw1ub& edgeFlag = gutz::arrayo1ub(),
00060 DrawAlg drawAlgType = GLIFT_DRAW_IMM );
00061
00062 PrimGL( const PrimGL& rhs );
00063 PrimGL& operator=( const PrimGL& rhs );
00064
00065 virtual ~PrimGL();
00066
00067
00068 virtual void bindTexCoords( const MultiPrimTexCoord* texCoords );
00069 virtual void bindTexCoords( const MultiTexCoord* texCoords );
00070 virtual void releaseTexCoords();
00071
00072 virtual void bindIndices( const MultiPrimIndices* indices );
00073 virtual void bindIndices( const gutz::arrayw1ui* indices );
00074 virtual void releaseIndices();
00075
00076
00077 virtual const gutz::arrayo2f& vert() const {return m_vert;}
00078 virtual const gutz::arrayo2f& texCoord() const {return m_curTexCoords ? (*m_curTexCoords)[0] : m_texCoords[0];}
00079 virtual const gutz::arrayo2f& texCoord(int texUnit) const {return m_curTexCoords ? (*m_curTexCoords)[texUnit] : m_texCoords[0];}
00080 virtual int numVerts() const {return m_vert.dim(0);}
00081 virtual const gutz::vec3f& scale() const {return m_scale;}
00082 virtual bool hasTexCoords() const {return !m_texCoords[0].empty(); }
00083
00084 protected:
00085 virtual void drawDef();
00086
00087 private:
00088 GLenum m_primType;
00089 GLint m_minVerts;
00090 GLint m_vertDiv;
00091 gutz::vec3f m_scale;
00092
00093 gutz::arrayo2f m_vert;
00094 MultiTexCoord m_texCoords;
00095 const MultiTexCoord* m_curTexCoords;
00096 gutz::arrayo2f m_norm;
00097 gutz::arrayo2f m_color;
00098 gutz::arrayo1ub m_edgeFlag;
00099 gutz::arrayo1ui m_indices;
00100 const gutz::arrayw1ui* m_curIndices;
00101 DrawAlgorithm* m_drawAlg;
00102
00103 PrimGL();
00104 void initMembers(const PrimGL& rhs);
00105 void initMembers( GLenum primType, GLint minVerts, GLint vertDivisor, const gutz::vec3f& scale,
00106 const gutz::arrayw2f& vert, const MultiTexCoord& texCoord, const MultiTexCoord* curTexCoords,
00107 const gutz::arrayw2f& normal, const gutz::arrayw1ui& indices, const gutz::arrayw2f& color,
00108 const gutz::arrayw1ub& edgeFlag, const gutz::arrayw1ui* curIndices, DrawAlgorithm* drawAlg );
00109
00110 void verifyScale();
00111 void verifySizes();
00112 void verifyMinVerts();
00113 void verifyPrimType();
00114 void verifyNumPrims();
00115 void setVertPos( const gutz::arrayw2f& vert, int vertNum );
00116 void setTexCoords( const Vecarrayw2f* curTexCoords, GLint vert );
00117 void outputTexCoords( const MultiTexCoord& texCoords, int texCoordDimen, int texUnit, int vertNum );
00118 };
00119
00120 }
00121
00122 #endif
00123