gfx_opengl_texture.hh

Go to the documentation of this file.
00001 /*
00024  * LEGAL:   COPYRIGHT (C) 2007 JIM E. BROOKS
00025  *          THIS SOURCE CODE IS RELEASED UNDER THE TERMS
00026  *          OF THE GNU GENERAL PUBLIC LICENSE VERSION 2 (GPL 2).
00027  ******************************************************************************/
00028 
00029 #ifndef GFX_OPENGL_TEXTURE_HH
00030 #define GFX_OPENGL_TEXTURE_HH 1
00031 
00032 namespace gfx {
00033 
00034 // Compile BGRA8 or RGBA8 texels.  BGRA8 is faster on Nvidia.
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;  // equal
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  // OpenGL defines 0 to mean no texture
00081     };
00082 
00083     enum eMipmap
00084     {
00085         eMipmap_OFF,  // bool
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         // Magnfication filter doesn't apply to mipmaps.
00107     };
00108 
00110     enum eWrap
00111     {
00112         eWrap_DEFAULT               = GL_REPEAT,
00113         eWrap_REPEAT                = GL_REPEAT,
00114         eWrap_CLAMP                 = GL_CLAMP,       // -- use CLAMP_TO_EDGE (else black border/seam will appear) --
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,     // byte indexs
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,       // RGBA
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,       // BGRA
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,      // BGRA
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         // --- REMINDER: Update TexelTypeToTexelLen() ---
00209         eTexelType_BGR8     = GL_BGR,
00210         eTexelType_RGB8     = GL_RGB,
00211         eTexelType_BGRA8    = GL_BGRA,  // GL_BGRA8 doesn't exist (RGBA8 does though)
00212         eTexelType_RGBA8    = GL_RGBA,
00213         eTexelType_Texel32  = GL_BGRA,
00214         eTexelType_DEFAULT  = GL_BGRA,  // faster than RGBA8
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 )  // -- BGRA args --
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         // Cast to uint or RGBA::operator[], which returns uint8, will cause truncation.
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:  // no Alpha
00267             case TexelDefs::eTexelType_RGB8:
00268                 return 3;
00269             break;
00270 
00271             case TexelDefs::eTexelType_BGRA8:  // has Alpha
00272             case TexelDefs::eTexelType_RGBA8:
00273           //case TexelDefs::eTexelType_Texel32:  // dup
00274           //case TexelDefs::eTexelType_DEFAULT:  // dup
00275                 return 4;
00276             break;
00277 
00278             default:
00279                 ASSERT(0); return 4;  // guess 4 in RELEASE
00280             break;
00281         }
00282 
00283         return 4;  // (shutup old gcc)
00284     }
00285 };
00286 
00290 class TextureBase
00291 :   public TextureModes, public TexelDefs, public TextureMethods,
00292     public Shared
00293 {
00294     // empty
00295 };
00296 
00297 } // namespace gfx
00298 
00299 #endif // GFX_OPENGL_TEXTURE_HH
Palomino 3D Engine documents generated by doxygen 1.5.3 on Fri Nov 23 11:26:11 2007