00001
00024
00025
00026
00027
00028
00029 #ifndef GFX_OPENGL_TEXTURE_HH
00030 #define GFX_OPENGL_TEXTURE_HH 1
00031
00032 namespace gfx {
00033
00034
00035 #if 1
00036 #define COMPILE_TEXEL32_BGRA8 1
00037 #else
00038 #define COMPILE_TEXEL32_RGBA8 1
00039 #endif
00040
00044 class TexCoord
00045 {
00046 public:
00047 TexCoord( void ) : x(0), y(0) { }
00048 TexCoord( fp X, fp Y ) : x(X), y(Y) { }
00049 void Set( fp X, fp Y ) { x = X; y = Y; }
00050
00051 friend bool operator<( const TexCoord& a, const TexCoord& b )
00052 {
00053 RETURN_LT_TRUE_GT_FALSE( a.x, b.x )
00054 RETURN_LT_TRUE_GT_FALSE( a.y, b.y )
00055 return false;
00056 }
00057
00058 public:
00059 fp x;
00060 fp y;
00061 };
00062 typedef TexCoord TexCoord2;
00063
00064 INLINE ostream&
00065 operator<<( ostream& strm, const TexCoord& texCoord )
00066 {
00067 strm << '(' << texCoord.x << ',' << texCoord.y << ')';
00068 return strm;
00069 }
00070
00074 class TextureModes
00075 {
00076 PREVENT_INSTANTIATING(TextureModes)
00077 public:
00078 enum
00079 {
00080 TEXTURE_ID_INVALID = 0
00081 };
00082
00083 enum eMipmap
00084 {
00085 eMipmap_OFF,
00086 eMipmap_ON
00087 };
00088
00090 enum eMinFilter
00091 {
00092 eMinFilter_DEFAULT = GL_NEAREST,
00093 eMinFilter_NEAREST = GL_NEAREST,
00094 eMinFilter_LINEAR = GL_LINEAR,
00095 eMinFilter_NEAREST_MIPMAP_NEAREST = GL_NEAREST_MIPMAP_NEAREST,
00096 eMinFilter_NEAREST_MIPMAP_LINEAR = GL_NEAREST_MIPMAP_LINEAR,
00097 eMinFilter_LINEAR_MIPMAP_NEAREST = GL_LINEAR_MIPMAP_NEAREST,
00098 eMinFilter_LINEAR_MIPMAP_LINEAR = GL_LINEAR_MIPMAP_LINEAR,
00099 };
00100
00101 enum eMagFilter
00102 {
00103 eMagFilter_DEFAULT = GL_NEAREST,
00104 eMagFilter_NEAREST = GL_NEAREST,
00105 eMagFilter_LINEAR = GL_LINEAR,
00106
00107 };
00108
00110 enum eWrap
00111 {
00112 eWrap_DEFAULT = GL_REPEAT,
00113 eWrap_REPEAT = GL_REPEAT,
00114 eWrap_CLAMP = GL_CLAMP,
00115 eWrap_CLAMP_TO_EDGE = GL_CLAMP_TO_EDGE,
00116 eWrap_CLAMP_TO_BORDER = GL_CLAMP_TO_BORDER,
00117 };
00118
00121 enum eFunc
00122 {
00123 eFunc_DEFAULT = GL_MODULATE,
00124 eFunc_MODULATE = GL_MODULATE,
00125 eFunc_DECAL = GL_DECAL,
00126 eFunc_REPLACE = GL_REPLACE,
00127 eFunc_BLEND = GL_BLEND,
00128 };
00129 };
00130
00134 class TexelDefs
00135 {
00136 PREVENT_INSTANTIATING(TexelDefs)
00137 public:
00145 typedef uint32 Texel32;
00146
00149 enum
00150 {
00151 #if COMPILE_TEXEL32_RGBA8
00152 TEXEL32_RR = 0,
00153 TEXEL32_GG = 1,
00154 TEXEL32_BB = 2,
00155 TEXEL32_AA = 3,
00156 #else // default BGRA8
00157 TEXEL32_BB = 0,
00158 TEXEL32_GG = 1,
00159 TEXEL32_RR = 2,
00160 TEXEL32_AA = 3,
00161 #endif
00162 };
00163
00167 enum
00168 {
00169 #if BASE_LITTLE_ENDIAN
00170 #if COMPILE_TEXEL32_RGBA8
00171 TEXEL32_RR_BIT_SHIFT = 0,
00172 TEXEL32_GG_BIT_SHIFT = 8,
00173 TEXEL32_BB_BIT_SHIFT = 16,
00174 TEXEL32_AA_BIT_SHIFT = 24,
00175 #else // default COMPILE_TEXEL32_BGRA8
00176 TEXEL32_BB_BIT_SHIFT = 0,
00177 TEXEL32_GG_BIT_SHIFT = 8,
00178 TEXEL32_RR_BIT_SHIFT = 16,
00179 TEXEL32_AA_BIT_SHIFT = 24,
00180 #endif
00181 #elif BASE_BIG_ENDIAN
00182 #if COMPILE_TEXEL32_RGBA8 // RGBA
00183 TEXEL32_RR_BIT_SHIFT = 24,
00184 TEXEL32_GG_BIT_SHIFT = 16,
00185 TEXEL32_BB_BIT_SHIFT = 8,
00186 TEXEL32_AA_BIT_SHIFT = 0,
00187 #else // default COMPILE_TEXEL32_BGRA8
00188 TEXEL32_BB_BIT_SHIFT = 24,
00189 TEXEL32_GG_BIT_SHIFT = 16,
00190 TEXEL32_RR_BIT_SHIFT = 8,
00191 TEXEL32_AA_BIT_SHIFT = 0,
00192 #endif
00193 #endif
00194 };
00195
00197 enum
00198 {
00199 TEXEL32_LEN = 4,
00200 TEXEL32_BGRA8_LEN = 4,
00201 TEXEL32_RGBA8_LEN = 4,
00202 TEXEL_DEFAULT_LEN = 4,
00203 };
00204
00206 enum eTexelType
00207 {
00208
00209 eTexelType_BGR8 = GL_BGR,
00210 eTexelType_RGB8 = GL_RGB,
00211 eTexelType_BGRA8 = GL_BGRA,
00212 eTexelType_RGBA8 = GL_RGBA,
00213 eTexelType_Texel32 = GL_BGRA,
00214 eTexelType_DEFAULT = GL_BGRA,
00215 };
00216
00218 enum eTexEnv
00219 {
00220 eTexEnv_MODULATE = GL_MODULATE,
00221 eTexEnv_DECAL = GL_DECAL,
00222 eTexEnv_REPLACE = GL_REPLACE,
00223 };
00224 };
00225
00229 class TextureMethods
00230 {
00231 PREVENT_INSTANTIATING(TextureMethods)
00232 public:
00236 CLASS_METHOD
00237 TexelDefs::Texel32
00238 MakeTexel32( uint b, uint g, uint r, uint a )
00239 {
00240 return (b << TexelDefs::TEXEL32_BB_BIT_SHIFT)
00241 | (g << TexelDefs::TEXEL32_GG_BIT_SHIFT)
00242 | (r << TexelDefs::TEXEL32_RR_BIT_SHIFT)
00243 | (a << TexelDefs::TEXEL32_AA_BIT_SHIFT);
00244 }
00245
00246 CLASS_METHOD
00247 TexelDefs::Texel32
00248 MakeTexel32( const RGBA color )
00249 {
00250
00251 return (uint(color[BB]) << TexelDefs::TEXEL32_BB_BIT_SHIFT)
00252 | (uint(color[GG]) << TexelDefs::TEXEL32_GG_BIT_SHIFT)
00253 | (uint(color[RR]) << TexelDefs::TEXEL32_RR_BIT_SHIFT)
00254 | (uint(color[AA]) << TexelDefs::TEXEL32_AA_BIT_SHIFT);
00255 }
00256
00260 CLASS_METHOD
00261 uint
00262 TexelTypeToTexelLen( TexelDefs::eTexelType texelType )
00263 {
00264 switch ( texelType )
00265 {
00266 case TexelDefs::eTexelType_BGR8:
00267 case TexelDefs::eTexelType_RGB8:
00268 return 3;
00269 break;
00270
00271 case TexelDefs::eTexelType_BGRA8:
00272 case TexelDefs::eTexelType_RGBA8:
00273
00274
00275 return 4;
00276 break;
00277
00278 default:
00279 ASSERT(0); return 4;
00280 break;
00281 }
00282
00283 return 4;
00284 }
00285 };
00286
00290 class TextureBase
00291 : public TextureModes, public TexelDefs, public TextureMethods,
00292 public Shared
00293 {
00294
00295 };
00296
00297 }
00298
00299 #endif // GFX_OPENGL_TEXTURE_HH