00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GLIFT_SINGLE_TEXTURE_H_
00020 #define GLIFT_SINGLE_TEXTURE_H_
00021
00022 #include "multiTexState.h"
00023 #include "texture.h"
00024 #include "texData.h"
00025 #include "../state/pbuffGlift.h"
00026 #include <GL/glew.h>
00027 #include <mathGutz.h>
00028 #include <arrayGutz.h>
00029 #include <vector>
00030 #include <smartptr.h>
00031
00032 namespace glift {
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 class _export_ SingleTex :
00049 public Texture
00050 {
00051
00052 public:
00053 virtual ~SingleTex() {}
00054
00055
00056 virtual int numTexUnits() const {return 1;}
00057
00058 virtual GLenum texType() const = 0;
00059
00060 virtual GLuint texNum() const = 0;
00061
00062 virtual PBuffGlift* pbuff() const = 0;
00063
00064 virtual gutz::vec3i dimen() const = 0;
00065
00066 virtual bool tryToBindPbuff() const = 0;
00067
00068
00069 virtual void setTexCoordNum(int texCNum) = 0;
00070 virtual int getTexCoordNum() = 0;
00071
00072
00073 virtual void getDataub( GLenum format, int mipLevel, gutz::arraybub& data ) = 0;
00074 virtual void getDataf( GLenum format, int mipLevel, gutz::arraybf& data ) = 0;
00075
00076
00077
00078 virtual void setTexData( TexData* texData, int mipLevel=0, bool setTexSize=true ) = 0;
00079
00080 virtual void setTexState( TexObjState* state ) = 0;
00081
00082 virtual void setTexState( const MultiTexOState& texState ) = 0;
00083
00084 virtual void tryToBindPbuff( bool tryToUsePbuff ) = 0;
00085
00086
00087 virtual void copyToTex( int mipLevel,
00088 const gutz::vec3i& texOrig,
00089 const gutz::vec2i& screenOrig,
00090 const gutz::vec2i& copySize ) = 0;
00091
00092 protected:
00093 virtual void bindDef() = 0;
00094 virtual void releaseDef() = 0;
00095 };
00096
00097 typedef gutz::SmartPtr<SingleTex> SingleTexSP;
00098 typedef std::vector<SingleTexSP> SingleTexSPVec;
00099 typedef SingleTexSPVec::iterator SingleTexSPVecIter;
00100 const SingleTexSPVec SingleTexSPVec_empty;
00101
00102
00103 typedef std::vector<SingleTex*> VecTexP;
00104 typedef VecTexP::iterator VecTexPIter;
00105 const VecTexP VecTexP_empty;
00106
00107
00108
00109
00110
00111
00112
00113
00114 class _export_ CoreTex : public SingleTex
00115 {
00116 public:
00117
00118 virtual ~CoreTex();
00119
00120
00121 virtual GLenum texType() const {return m_texType; }
00122 virtual GLuint texNum() const {return m_texNum;}
00123 virtual PBuffGlift* pbuff() const {return m_pbuff; }
00124 virtual gutz::vec3i dimen() const {return m_dataDimen; }
00125 virtual bool tryToBindPbuff() const {return m_tryToBindPbuff; }
00126
00127
00128 virtual void setTexCoordNum(int texCNum) {m_tcNum = texCNum;}
00129 virtual int getTexCoordNum() {return m_tcNum;}
00130
00131
00132
00133 virtual void getDataub( GLenum format, int mipLevel, gutz::arraybub& data );
00134 virtual void getDataf( GLenum format, int mipLevel, gutz::arraybf& data );
00135
00136
00137
00138 virtual void setTexData( TexData* texData, int mipLevel=0, bool setTexSize=true );
00139
00140 virtual void setTexState( TexObjState* state );
00141
00142 virtual void setTexState( const MultiTexOState& texState );
00143
00144 virtual void tryToBindPbuff( bool tryToUsePbuff ) {m_tryToBindPbuff = tryToUsePbuff;}
00145
00146 protected:
00147 CoreTex( GLenum texType, const MultiTexOState& texState, TexData* texData, PBuffGlift* pbuff=NULL );
00148
00149
00150 virtual void bindDef();
00151 virtual void releaseDef();
00152
00153
00154 void checkTexType( GLenum texType );
00155
00156
00157 void dataDimen( const gutz::vec3i& dimen ) { m_dataDimen = dimen; }
00158
00159 private:
00160 GLenum m_texType;
00161
00162 PBuffGlift* m_pbuff;
00163 GLuint m_texNum;
00164 bool m_tryToBindPbuff;
00165 bool m_pbuffBound;
00166 gutz::vec3i m_dataDimen;
00167
00168 int m_tcNum;
00169
00170
00171 void checkTexType( GLenum objTexType, GLenum dataTexType );
00172
00173 CoreTex();
00174 };
00175
00176 }
00177
00178 #endif
00179