CrystalSpace

Public API Reference

csplugincommon/opengl/glstates.h

Go to the documentation of this file.
00001 /*
00002     Copyright (C) 2002 by Anders Stenberg
00003     Written by Anders Stenberg
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public
00016     License along with this library; if not, write to the Free
00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018 */
00019 
00020 #ifndef __CS_GLSTATES_H__
00021 #define __CS_GLSTATES_H__
00022 
00027 #if defined(CS_OPENGL_PATH)
00028 #include CS_HEADER_GLOBAL(CS_OPENGL_PATH,gl.h)
00029 #else
00030 #include <GL/gl.h>
00031 #endif
00032 
00033 #include "csextern_gl.h"
00034 #include "glextmanager.h"
00035 
00039 // Set to 'true' to force state changing commands. For debugging.
00040 #define FORCE_STATE_CHANGE                        false/*true*/
00041 
00042 #define DECLARE_CACHED_BOOL(name) \
00043   bool enabled_##name;
00044 
00045 #define IMPLEMENT_CACHED_BOOL(name) \
00046   void Enable_##name () \
00047   { \
00048     if (!currentContext->enabled_##name || FORCE_STATE_CHANGE) \
00049     { \
00050       currentContext->enabled_##name = true;  \
00051       glEnable (name); \
00052     } \
00053   } \
00054   void Disable_##name () \
00055   { \
00056     if (currentContext->enabled_##name || FORCE_STATE_CHANGE) { \
00057       currentContext->enabled_##name = false;  \
00058       glDisable (name); \
00059     } \
00060   } \
00061   bool IsEnabled_##name () const \
00062   { \
00063     return currentContext->enabled_##name; \
00064   }
00065 
00070 #define CS_GL_MAX_LAYER 16
00071 
00072 #define DECLARE_CACHED_BOOL_CURRENTLAYER(name) \
00073   bool enabled_##name[CS_GL_MAX_LAYER];
00074 
00075 #define IMPLEMENT_CACHED_BOOL_CURRENTLAYER(name)                              \
00076   void Enable_##name ()                                                       \
00077   {                                                                           \
00078     const int currentUnit = currentContext->currentUnit;                      \
00079     if (!currentContext->enabled_##name[currentUnit] || FORCE_STATE_CHANGE)   \
00080     {                                                                         \
00081       ActivateTU (activateTexEnable);                                         \
00082       currentContext->enabled_##name[currentUnit] = true;                     \
00083       glEnable (name);                                                        \
00084     }                                                                         \
00085   }                                                                           \
00086   void Disable_##name ()                                                      \
00087   {                                                                           \
00088     const int currentUnit = currentContext->currentUnit;                      \
00089     if (currentContext->enabled_##name[currentUnit] || FORCE_STATE_CHANGE)    \
00090     {                                                                         \
00091       ActivateTU (activateTexEnable);                                         \
00092       currentContext->enabled_##name[currentUnit] = false;                    \
00093       glDisable (name);                                                       \
00094     }                                                                         \
00095   }                                                                           \
00096   bool IsEnabled_##name () const                                              \
00097   {                                                                           \
00098     const int currentUnit = currentContext->currentUnit;                      \
00099     return currentContext->enabled_##name[currentUnit];                       \
00100   }
00101 
00102 #define DECLARE_CACHED_PARAMETER_1(func, name, type1, param1) \
00103   type1 parameter_##param1;
00104 
00105 #define IMPLEMENT_CACHED_PARAMETER_1(func, name, type1, param1) \
00106   void Set##name (type1 param1, bool forced = false) \
00107   { \
00108     if (forced || (param1 != currentContext->parameter_##param1) || FORCE_STATE_CHANGE) \
00109     { \
00110       currentContext->parameter_##param1 = param1;  \
00111       func (param1); \
00112     } \
00113   } \
00114   void Get##name (type1 & param1) const\
00115   { \
00116     param1 = currentContext->parameter_##param1;  \
00117   }
00118 
00119 #define DECLARE_CACHED_PARAMETER_2(func, name, type1, param1, type2, param2) \
00120   type1 parameter_##param1; \
00121   type2 parameter_##param2;
00122 
00123 #define IMPLEMENT_CACHED_PARAMETER_2(func, name, type1, param1, type2, param2) \
00124   void Set##name (type1 param1, type2 param2, bool forced = false) \
00125   { \
00126     if (forced || (param1 != currentContext->parameter_##param1) || \
00127         (param2 != currentContext->parameter_##param2) || FORCE_STATE_CHANGE) \
00128     { \
00129       currentContext->parameter_##param1 = param1;  \
00130       currentContext->parameter_##param2 = param2;  \
00131       func (param1, param2); \
00132     } \
00133   } \
00134   void Get##name (type1 & param1, type2 & param2) const\
00135   { \
00136     param1 = currentContext->parameter_##param1;  \
00137     param2 = currentContext->parameter_##param2;  \
00138   }
00139 
00140 #define DECLARE_CACHED_PARAMETER_3(func, name, type1, param1, type2, param2, type3, param3) \
00141   type1 parameter_##param1; \
00142   type2 parameter_##param2; \
00143   type3 parameter_##param3;
00144 
00145 #define IMPLEMENT_CACHED_PARAMETER_3(func, name, type1, param1, type2, param2, type3, param3) \
00146   void Set##name (type1 param1, type2 param2, type3 param3, bool forced = false) \
00147   { \
00148     if (forced || (param1 != currentContext->parameter_##param1) \
00149         || (param2 != currentContext->parameter_##param2) \
00150         || (param3 != currentContext->parameter_##param3) || FORCE_STATE_CHANGE) \
00151     { \
00152       currentContext->parameter_##param1 = param1;  \
00153       currentContext->parameter_##param2 = param2;  \
00154       currentContext->parameter_##param3 = param3;  \
00155       func (param1, param2, param3); \
00156     } \
00157   } \
00158   void Get##name (type1 &param1, type2 & param2, type3 & param3) const\
00159   { \
00160     param1 = currentContext->parameter_##param1;  \
00161     param2 = currentContext->parameter_##param2;  \
00162     param3 = currentContext->parameter_##param3;  \
00163   }
00164 
00165 #define DECLARE_CACHED_PARAMETER_4(func, name, type1, param1, \
00166   type2, param2, type3, param3, type4, param4) \
00167   type1 parameter_##param1; \
00168   type2 parameter_##param2; \
00169   type3 parameter_##param3; \
00170   type4 parameter_##param4;
00171 
00172 #define IMPLEMENT_CACHED_PARAMETER_4(func, name, type1, param1, \
00173     type2, param2, type3, param3, type4, param4) \
00174   void Set##name (type1 param1, type2 param2, type3 param3, type4 param4, \
00175     bool forced = false) \
00176   { \
00177     if (forced || (param1 != currentContext->parameter_##param1) || \
00178       (param2 != currentContext->parameter_##param2) || \
00179       (param3 != currentContext->parameter_##param3) || \
00180       (param4 != currentContext->parameter_##param4) || FORCE_STATE_CHANGE) \
00181     { \
00182       currentContext->parameter_##param1 = param1;  \
00183       currentContext->parameter_##param2 = param2;  \
00184       currentContext->parameter_##param3 = param3;  \
00185       currentContext->parameter_##param4 = param4;  \
00186       func (param1, param2, param3, param4); \
00187     } \
00188   } \
00189   void Get##name (type1 &param1, type2 & param2, type3 & param3, type4& param4) const\
00190   { \
00191     param1 = currentContext->parameter_##param1;  \
00192     param2 = currentContext->parameter_##param2;  \
00193     param3 = currentContext->parameter_##param3;  \
00194     param4 = currentContext->parameter_##param4;  \
00195   }
00196 
00197 #define DECLARE_CACHED_CLIENT_STATE(name)             \
00198   bool enabled_##name;
00199 
00200 #define IMPLEMENT_CACHED_CLIENT_STATE(name)           \
00201   void Enable_##name () \
00202   { \
00203     if (!currentContext->enabled_##name || FORCE_STATE_CHANGE) \
00204     { \
00205       currentContext->enabled_##name = true;  \
00206       glEnableClientState (name); \
00207     } \
00208   } \
00209   void Disable_##name () \
00210   { \
00211     if (currentContext->enabled_##name || FORCE_STATE_CHANGE) { \
00212       currentContext->enabled_##name = false;  \
00213       glDisableClientState (name); \
00214     } \
00215   } \
00216   bool IsEnabled_##name () const \
00217   { \
00218     return currentContext->enabled_##name; \
00219   }
00220 
00221 #define DECLARE_CACHED_CLIENT_STATE_LAYER(name)                               \
00222   bool enabled_##name[CS_GL_MAX_LAYER];
00223 
00224 #define IMPLEMENT_CACHED_CLIENT_STATE_LAYER(name)                             \
00225   void Enable_##name ()                                                       \
00226   {                                                                           \
00227     const int currentUnit = currentContext->currentUnit;                      \
00228     if (!currentContext->enabled_##name[currentUnit] || FORCE_STATE_CHANGE)   \
00229     {                                                                         \
00230       ActivateTU (activateTexCoord);                                          \
00231       currentContext->enabled_##name[currentUnit] = true;                     \
00232       glEnableClientState (name);                                             \
00233     }                                                                         \
00234   }                                                                           \
00235   void Disable_##name ()                                                      \
00236   {                                                                           \
00237     const int currentUnit = currentContext->currentUnit;                      \
00238     if (currentContext->enabled_##name[currentUnit] || FORCE_STATE_CHANGE)    \
00239     {                                                                         \
00240       ActivateTU (activateTexCoord);                                          \
00241       currentContext->enabled_##name[currentUnit] = false;                    \
00242       glDisableClientState (name);                                            \
00243     }                                                                         \
00244   }                                                                           \
00245   bool IsEnabled_##name () const                                              \
00246   {                                                                           \
00247     const int currentUnit = currentContext->currentUnit;                      \
00248     return currentContext->enabled_##name[currentUnit];                       \
00249   }
00250 
00251 #define DECLARE_CACHED_PARAMETER_1_LAYER(func, name, type1, param1) \
00252   type1 parameter_##param1[CS_GL_MAX_LAYER];
00253 
00254 #define IMPLEMENT_CACHED_PARAMETER_1_LAYER(func, name, type1, param1) \
00255   void Set##name (type1 param1, bool forced = false) \
00256   { \
00257     if (forced || \
00258         (param1 != currentContext->parameter_##param1[currentContext->currentUnit] \
00259         || FORCE_STATE_CHANGE)) \
00260     { \
00261       ActivateTU (); \
00262       currentContext->parameter_##param1[currentContext->currentUnit] = param1;  \
00263       func (param1); \
00264     } \
00265   } \
00266   void Get##name (type1 &param1) const\
00267   { \
00268     param1 = currentContext->parameter_##param1[currentContext->currentUnit];  \
00269   }
00270 
00271 #define DECLARE_CACHED_PARAMETER_2_LAYER(func, name, type1, param1, \
00272   type2, param2) \
00273   type1 parameter_##param1[CS_GL_MAX_LAYER]; \
00274   type2 parameter_##param2[CS_GL_MAX_LAYER];
00275 
00276 #define IMPLEMENT_CACHED_PARAMETER_2_LAYER(func, name, type1, param1, \
00277   type2, param2) \
00278   void Set##name (type1 param1, type2 param2, bool forced = false) \
00279   { \
00280     if (forced || (param1 != currentContext->parameter_##param1[ \
00281                     currentContext->currentUnit]) || \
00282                   (param2 != currentContext->parameter_##param2[ \
00283                     currentContext->currentUnit]) \
00284                || FORCE_STATE_CHANGE) \
00285     { \
00286       ActivateTU (); \
00287       currentContext->parameter_##param1[currentContext->currentUnit] = param1;  \
00288       currentContext->parameter_##param2[currentContext->currentUnit] = param2;  \
00289       func (param1, param2); \
00290     } \
00291   } \
00292   void Get##name (type1 &param1, type2 & param2) const\
00293   { \
00294     param1 = currentContext->parameter_##param1[currentContext->currentUnit];  \
00295     param2 = currentContext->parameter_##param2[currentContext->currentUnit];  \
00296   }
00297 
00298 #define DECLARE_CACHED_PARAMETER_3_LAYER(func, name, type1, param1, \
00299   type2, param2, type3, param3) \
00300   type1 parameter_##param1[CS_GL_MAX_LAYER]; \
00301   type2 parameter_##param2[CS_GL_MAX_LAYER]; \
00302   type3 parameter_##param3[CS_GL_MAX_LAYER];
00303 
00304 
00305 #define IMPLEMENT_CACHED_PARAMETER_3_LAYER(func, name, type1, param1, \
00306   type2, param2, type3, param3) \
00307   void Set##name (type1 param1, type2 param2, type3 param3,\
00308     bool forced = false) \
00309   { \
00310     if (forced || (param1 != currentContext->parameter_##param1[ \
00311                     currentContext->currentUnit]) || \
00312                   (param2 != currentContext->parameter_##param2[ \
00313                     currentContext->currentUnit]) || \
00314                   (param3 != currentContext->parameter_##param3[ \
00315                     currentContext->currentUnit]) \
00316                || FORCE_STATE_CHANGE) \
00317     { \
00318       ActivateTU (); \
00319       currentContext->parameter_##param1[currentContext->currentUnit] = param1;  \
00320       currentContext->parameter_##param2[currentContext->currentUnit] = param2;  \
00321       currentContext->parameter_##param3[currentContext->currentUnit] = param3;  \
00322       func (param1, param2, param3); \
00323     } \
00324   } \
00325   void Get##name (type1 &param1, type2 & param2, type3 & param3) const\
00326   { \
00327     param1 = currentContext->parameter_##param1[currentContext->currentUnit];  \
00328     param2 = currentContext->parameter_##param2[currentContext->currentUnit];  \
00329     param3 = currentContext->parameter_##param3[currentContext->currentUnit];  \
00330   }
00331 
00332 
00333 #define DECLARE_CACHED_PARAMETER_4_LAYER(func, name, type1, param1,           \
00334   type2, param2, type3, param3, type4, param4)                                \
00335   type1 parameter_##param1[CS_GL_MAX_LAYER];                                  \
00336   type2 parameter_##param2[CS_GL_MAX_LAYER];                                  \
00337   type3 parameter_##param3[CS_GL_MAX_LAYER];                                  \
00338   type4 parameter_##param4[CS_GL_MAX_LAYER];
00339 
00340 #define IMPLEMENT_CACHED_PARAMETER_4_LAYER(func, name, type1, param1,         \
00341     type2, param2, type3, param3, type4, param4)                              \
00342   void Set##name (type1 param1, type2 param2, type3 param3, type4 param4,     \
00343     bool forced = false)                                                      \
00344   {                                                                           \
00345     const int currentUnit = currentContext->currentUnit;                      \
00346     if (forced                                                                \
00347       || (param1 != currentContext->parameter_##param1[currentUnit])          \
00348       || (param2 != currentContext->parameter_##param2[currentUnit])          \
00349       || (param3 != currentContext->parameter_##param3[currentUnit])          \
00350       || (param4 != currentContext->parameter_##param4[currentUnit])          \
00351       || FORCE_STATE_CHANGE)                                                  \
00352     {                                                                         \
00353       ActivateTU (activateTexCoord);                                          \
00354       currentContext->parameter_##param1[currentUnit] = param1;               \
00355       currentContext->parameter_##param2[currentUnit] = param2;               \
00356       currentContext->parameter_##param3[currentUnit] = param3;               \
00357       currentContext->parameter_##param4[currentUnit] = param4;               \
00358       func (param1, param2, param3, param4);                                  \
00359     }                                                                         \
00360   }                                                                           \
00361   void Get##name (type1 &param1, type2 & param2, type3 & param3,              \
00362     type4& param4) const                                                      \
00363   {                                                                           \
00364     const int currentUnit = currentContext->currentUnit;                      \
00365     param1 = currentContext->parameter_##param1[currentUnit];                 \
00366     param2 = currentContext->parameter_##param2[currentUnit];                 \
00367     param3 = currentContext->parameter_##param3[currentUnit];                 \
00368     param4 = currentContext->parameter_##param4[currentUnit];                 \
00369   }
00370 
00371 
00372 class CS_CSPLUGINCOMMON_GL_EXPORT csGLStateCacheContext
00373 {
00374 public:
00375   csGLExtensionManager* extmgr;
00376 
00377   // Special caches
00378   GLuint boundtexture[CS_GL_MAX_LAYER]; // 32 max texture layers
00379   int currentUnit;
00380   int activeUnit[2];
00381   GLuint currentBufferID, currentIndexID;
00382 
00383   // Standardized caches
00384   DECLARE_CACHED_BOOL (GL_DEPTH_TEST)
00385   DECLARE_CACHED_BOOL (GL_BLEND)
00386   DECLARE_CACHED_BOOL (GL_DITHER)
00387   DECLARE_CACHED_BOOL (GL_STENCIL_TEST)
00388   DECLARE_CACHED_BOOL (GL_CULL_FACE)
00389   DECLARE_CACHED_BOOL (GL_POLYGON_OFFSET_FILL)
00390   DECLARE_CACHED_BOOL (GL_LIGHTING)
00391   DECLARE_CACHED_BOOL (GL_ALPHA_TEST)
00392   DECLARE_CACHED_BOOL (GL_SCISSOR_TEST)
00393   DECLARE_CACHED_BOOL (GL_TEXTURE_GEN_S)
00394   DECLARE_CACHED_BOOL (GL_TEXTURE_GEN_T)
00395   DECLARE_CACHED_BOOL (GL_TEXTURE_GEN_R)
00396   DECLARE_CACHED_BOOL (GL_TEXTURE_GEN_Q)
00397   DECLARE_CACHED_BOOL (GL_FOG)
00398   DECLARE_CACHED_BOOL (GL_COLOR_SUM_EXT)
00399   DECLARE_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_1D)
00400   DECLARE_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_2D)
00401   DECLARE_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_3D)
00402   DECLARE_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_CUBE_MAP)
00403   DECLARE_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_RECTANGLE_ARB)
00404   DECLARE_CACHED_PARAMETER_2 (glAlphaFunc, AlphaFunc, GLenum, alpha_func, GLclampf, alpha_ref)
00405   DECLARE_CACHED_PARAMETER_2 (glBlendFunc, BlendFunc, GLenum, blend_source, GLenum, blend_destination)
00406   DECLARE_CACHED_PARAMETER_1 (glCullFace, CullFace, GLenum, cull_mode)
00407   DECLARE_CACHED_PARAMETER_1 (glDepthFunc, DepthFunc, GLenum, depth_func)
00408   DECLARE_CACHED_PARAMETER_1 (glDepthMask, DepthMask, GLboolean, depth_mask)
00409   DECLARE_CACHED_PARAMETER_1 (glShadeModel, ShadeModel, GLenum, shade_model)
00410   DECLARE_CACHED_PARAMETER_3 (glStencilFunc, StencilFunc, GLenum, stencil_func, GLint, stencil_ref, GLuint, stencil_mask)
00411   DECLARE_CACHED_PARAMETER_3 (glStencilOp, StencilOp, GLenum, stencil_fail, GLenum, stencil_zfail, GLenum, stencil_zpass)
00412   DECLARE_CACHED_PARAMETER_1 (glStencilMask, StencilMask, GLuint, maskl)
00413   DECLARE_CACHED_PARAMETER_4 (glColorMask, ColorMask, GLboolean, wmRed, \
00414     GLboolean, wmGreen, GLboolean, wmBlue, GLboolean, wmAlpha)
00415 
00416   DECLARE_CACHED_CLIENT_STATE (GL_VERTEX_ARRAY)
00417   DECLARE_CACHED_CLIENT_STATE (GL_COLOR_ARRAY)
00418   DECLARE_CACHED_CLIENT_STATE (GL_SECONDARY_COLOR_ARRAY_EXT)
00419   DECLARE_CACHED_CLIENT_STATE (GL_NORMAL_ARRAY)
00420   DECLARE_CACHED_CLIENT_STATE_LAYER (GL_TEXTURE_COORD_ARRAY)
00421 
00422   DECLARE_CACHED_PARAMETER_1 (glMatrixMode, MatrixMode, GLenum, matrixMode)
00423   
00424   DECLARE_CACHED_PARAMETER_4 (glVertexPointer, VertexPointer, GLint, vsize,
00425     GLenum, vtype, GLsizei, vstride, GLvoid*, vpointer)
00426   DECLARE_CACHED_PARAMETER_3 (glNormalPointer, NormalPointer, GLenum, ntype,
00427     GLsizei, nstride, GLvoid*, npointer)
00428   DECLARE_CACHED_PARAMETER_4 (glColorPointer, ColorPointer, GLint, csize,
00429     GLenum, ctype, GLsizei, cstride, GLvoid*, cpointer)
00430   DECLARE_CACHED_PARAMETER_4 (extmgr->glSecondaryColorPointerEXT, 
00431     SecondaryColorPointerEXT, GLint, scsize, GLenum, sctype, GLsizei, scstride, 
00432     GLvoid*, scpointer);
00433   DECLARE_CACHED_PARAMETER_4_LAYER (glTexCoordPointer, TexCoordPointer, GLint, tsize,
00434     GLenum, ttype, GLsizei, tstride, GLvoid*, tpointer)
00435   
00436   csGLStateCacheContext (csGLExtensionManager* extmgr)
00437   {
00438     csGLStateCacheContext::extmgr = extmgr;
00439   }
00440 
00441 
00443   void InitCache()
00444   {
00445     int i;
00446     glGetIntegerv (GL_ALPHA_TEST_FUNC, (GLint*)&parameter_alpha_func);
00447     glGetFloatv (GL_ALPHA_TEST_REF, &parameter_alpha_ref);
00448     glGetIntegerv (GL_BLEND_SRC, (GLint*)&parameter_blend_source);
00449     glGetIntegerv (GL_BLEND_DST, (GLint*)&parameter_blend_destination);
00450     glGetIntegerv (GL_CULL_FACE_MODE, (GLint*)&parameter_cull_mode);
00451     glGetIntegerv (GL_DEPTH_FUNC, (GLint*)&parameter_depth_func);
00452     glGetBooleanv (GL_DEPTH_WRITEMASK, &parameter_depth_mask);
00453     glGetIntegerv (GL_SHADE_MODEL, (GLint*)&parameter_shade_model);
00454     glGetIntegerv (GL_STENCIL_BITS, (GLint*)&parameter_maskl);
00455     glGetIntegerv (GL_STENCIL_FUNC, (GLint*)&parameter_stencil_func);
00456     glGetIntegerv (GL_STENCIL_VALUE_MASK, (GLint*)&parameter_stencil_mask);
00457     glGetIntegerv (GL_STENCIL_REF, &parameter_stencil_ref);
00458     glGetIntegerv (GL_STENCIL_FAIL, (GLint*)&parameter_stencil_fail);
00459     glGetIntegerv (GL_STENCIL_PASS_DEPTH_FAIL, (GLint*)&parameter_stencil_zfail);
00460     glGetIntegerv (GL_STENCIL_PASS_DEPTH_PASS, (GLint*)&parameter_stencil_zpass);
00461     glGetIntegerv (GL_MATRIX_MODE, (GLint*)&parameter_matrixMode);
00462     GLboolean writemask[4];
00463     glGetBooleanv (GL_COLOR_WRITEMASK, writemask);
00464     parameter_wmRed = writemask[0];
00465     parameter_wmGreen = writemask[1];
00466     parameter_wmBlue = writemask[2];
00467     parameter_wmAlpha = writemask[3];
00468     enabled_GL_DEPTH_TEST = (glIsEnabled (GL_DEPTH_TEST) == GL_TRUE);
00469     enabled_GL_BLEND = (glIsEnabled (GL_BLEND) == GL_TRUE);
00470     enabled_GL_DITHER = (glIsEnabled (GL_DITHER) == GL_TRUE);
00471     enabled_GL_STENCIL_TEST = (glIsEnabled (GL_STENCIL_TEST) == GL_TRUE);
00472     enabled_GL_CULL_FACE = (glIsEnabled (GL_CULL_FACE) == GL_TRUE);
00473     enabled_GL_POLYGON_OFFSET_FILL = (glIsEnabled (GL_POLYGON_OFFSET_FILL) == GL_TRUE);
00474     enabled_GL_LIGHTING = (glIsEnabled (GL_LIGHTING) == GL_TRUE);
00475     enabled_GL_ALPHA_TEST = (glIsEnabled (GL_ALPHA_TEST) == GL_TRUE);
00476     enabled_GL_TEXTURE_GEN_S = (glIsEnabled (GL_TEXTURE_GEN_S) == GL_TRUE);
00477     enabled_GL_TEXTURE_GEN_T = (glIsEnabled (GL_TEXTURE_GEN_T) == GL_TRUE);
00478     enabled_GL_TEXTURE_GEN_R = (glIsEnabled (GL_TEXTURE_GEN_R) == GL_TRUE);
00479     enabled_GL_TEXTURE_GEN_Q = (glIsEnabled (GL_TEXTURE_GEN_Q) == GL_TRUE);
00480     enabled_GL_FOG = (glIsEnabled (GL_FOG) == GL_TRUE);
00481 
00482     if (extmgr->CS_GL_ARB_multitexture)
00483     {
00484       for (i = 0 ; i < CS_GL_MAX_LAYER; i++)
00485       {
00486         extmgr->glActiveTextureARB (GL_TEXTURE0_ARB + i);
00487         extmgr->glClientActiveTextureARB (GL_TEXTURE0_ARB + i);
00488         enabled_GL_TEXTURE_1D[i] = (glIsEnabled (GL_TEXTURE_1D) == GL_TRUE);
00489         enabled_GL_TEXTURE_2D[i] = (glIsEnabled (GL_TEXTURE_2D) == GL_TRUE);
00490         enabled_GL_TEXTURE_3D[i] = (glIsEnabled (GL_TEXTURE_3D) == GL_TRUE);
00491         enabled_GL_TEXTURE_CUBE_MAP[i] = (glIsEnabled (GL_TEXTURE_CUBE_MAP) == GL_TRUE);
00492         enabled_GL_TEXTURE_COORD_ARRAY[i] = (glIsEnabled (GL_TEXTURE_COORD_ARRAY) == GL_TRUE);
00493         if (extmgr->CS_GL_ARB_texture_rectangle
00494           || extmgr->CS_GL_EXT_texture_rectangle
00495           || extmgr->CS_GL_NV_texture_rectangle)
00496           enabled_GL_TEXTURE_RECTANGLE_ARB[i] = (glIsEnabled (GL_TEXTURE_RECTANGLE_ARB) == GL_TRUE);
00497         else
00498           enabled_GL_TEXTURE_RECTANGLE_ARB[i] = false;
00499         glGetIntegerv (GL_TEXTURE_COORD_ARRAY_SIZE, (GLint*)&parameter_tsize[i]);
00500         glGetIntegerv (GL_TEXTURE_COORD_ARRAY_STRIDE, (GLint*)&parameter_tstride[i]);
00501         glGetIntegerv (GL_TEXTURE_COORD_ARRAY_TYPE, (GLint*)&parameter_ttype[i]);
00502         glGetPointerv (GL_TEXTURE_COORD_ARRAY_POINTER, &parameter_tpointer[i]);
00503       }
00504     } 
00505     else 
00506     {
00507       enabled_GL_TEXTURE_1D[0] = (glIsEnabled (GL_TEXTURE_1D) == GL_TRUE);
00508       enabled_GL_TEXTURE_2D[0] = (glIsEnabled (GL_TEXTURE_2D) == GL_TRUE);
00509       enabled_GL_TEXTURE_3D[0] = (glIsEnabled (GL_TEXTURE_3D) == GL_TRUE);
00510       enabled_GL_TEXTURE_CUBE_MAP[0] = (glIsEnabled (GL_TEXTURE_CUBE_MAP) == GL_TRUE);
00511       enabled_GL_TEXTURE_COORD_ARRAY[0] = (glIsEnabled (GL_TEXTURE_COORD_ARRAY) == GL_TRUE);
00512         if (extmgr->CS_GL_ARB_texture_rectangle
00513           || extmgr->CS_GL_EXT_texture_rectangle
00514           || extmgr->CS_GL_NV_texture_rectangle)
00515           enabled_GL_TEXTURE_RECTANGLE_ARB[0] = (glIsEnabled (GL_TEXTURE_RECTANGLE_ARB) == GL_TRUE);
00516         else
00517           enabled_GL_TEXTURE_RECTANGLE_ARB[0] = false;
00518       glGetIntegerv (GL_TEXTURE_COORD_ARRAY_SIZE, (GLint*)&parameter_tsize[0]);
00519       glGetIntegerv (GL_TEXTURE_COORD_ARRAY_STRIDE, (GLint*)&parameter_tstride[0]);
00520       glGetIntegerv (GL_TEXTURE_COORD_ARRAY_TYPE, (GLint*)&parameter_ttype[0]);
00521       glGetPointerv (GL_TEXTURE_COORD_ARRAY_POINTER, &parameter_tpointer[0]);
00522       for (i = 1 ; i < CS_GL_MAX_LAYER; i++)
00523       {
00524         enabled_GL_TEXTURE_1D[i] = enabled_GL_TEXTURE_1D[0];
00525         enabled_GL_TEXTURE_2D[i] = enabled_GL_TEXTURE_2D[0];
00526         enabled_GL_TEXTURE_3D[i] = enabled_GL_TEXTURE_3D[0];
00527         enabled_GL_TEXTURE_CUBE_MAP[i] = enabled_GL_TEXTURE_CUBE_MAP[0];
00528         enabled_GL_TEXTURE_COORD_ARRAY[i] = enabled_GL_TEXTURE_COORD_ARRAY[0];
00529         enabled_GL_TEXTURE_RECTANGLE_ARB[i] = enabled_GL_TEXTURE_RECTANGLE_ARB[0];
00530         parameter_tsize[i] = parameter_tsize[0];
00531         parameter_tstride[i] = parameter_tstride[0];
00532         parameter_ttype[i] = parameter_ttype[0];
00533         parameter_tpointer[i] = parameter_tpointer[0];
00534       }
00535     }
00536     enabled_GL_SCISSOR_TEST = (glIsEnabled (GL_SCISSOR_TEST) == GL_TRUE);
00537     enabled_GL_VERTEX_ARRAY = (glIsEnabled (GL_VERTEX_ARRAY) == GL_TRUE);
00538     enabled_GL_COLOR_ARRAY = (glIsEnabled (GL_COLOR_ARRAY) == GL_TRUE);
00539     if (extmgr->CS_GL_EXT_secondary_color)
00540       enabled_GL_SECONDARY_COLOR_ARRAY_EXT = 
00541         (glIsEnabled (GL_SECONDARY_COLOR_ARRAY_EXT) == GL_TRUE);
00542     else
00543       enabled_GL_SECONDARY_COLOR_ARRAY_EXT = false;
00544     enabled_GL_NORMAL_ARRAY = (glIsEnabled (GL_NORMAL_ARRAY) == GL_TRUE);
00545 
00546     if (extmgr->CS_GL_ARB_multitexture)
00547     {
00548       extmgr->glActiveTextureARB (GL_TEXTURE0_ARB);
00549       extmgr->glClientActiveTextureARB (GL_TEXTURE0_ARB);
00550     }
00551     memset (boundtexture, 0, CS_GL_MAX_LAYER * sizeof (GLuint));
00552     currentUnit = 0;
00553     memset (activeUnit, 0, sizeof (activeUnit));
00554     currentBufferID = 0;
00555     currentIndexID = 0;
00556 
00557     glGetIntegerv (GL_VERTEX_ARRAY_SIZE, (GLint*)&parameter_vsize);
00558     glGetIntegerv (GL_VERTEX_ARRAY_STRIDE, (GLint*)&parameter_vstride);
00559     glGetIntegerv (GL_VERTEX_ARRAY_TYPE, (GLint*)&parameter_vtype);
00560     glGetPointerv (GL_VERTEX_ARRAY_POINTER, &parameter_vpointer);
00561 
00562     glGetIntegerv (GL_NORMAL_ARRAY_STRIDE, (GLint*)&parameter_nstride);
00563     glGetIntegerv (GL_NORMAL_ARRAY_TYPE, (GLint*)&parameter_ntype);
00564     glGetPointerv (GL_NORMAL_ARRAY_POINTER, &parameter_npointer);
00565 
00566     glGetIntegerv (GL_COLOR_ARRAY_SIZE, (GLint*)&parameter_csize);
00567     glGetIntegerv (GL_COLOR_ARRAY_STRIDE, (GLint*)&parameter_cstride);
00568     glGetIntegerv (GL_COLOR_ARRAY_TYPE, (GLint*)&parameter_ctype);
00569     glGetPointerv (GL_COLOR_ARRAY_POINTER, &parameter_cpointer);
00570     
00571     if (extmgr->CS_GL_EXT_secondary_color)
00572     {
00573       glGetIntegerv (GL_SECONDARY_COLOR_ARRAY_SIZE_EXT, 
00574         (GLint*)&parameter_scsize);
00575       glGetIntegerv (GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT, 
00576         (GLint*)&parameter_scstride);
00577       glGetIntegerv (GL_SECONDARY_COLOR_ARRAY_TYPE_EXT, 
00578         (GLint*)&parameter_sctype);
00579       glGetPointerv (GL_SECONDARY_COLOR_ARRAY_POINTER_EXT, 
00580         &parameter_scpointer);
00581       enabled_GL_COLOR_SUM_EXT = glIsEnabled (GL_COLOR_SUM_EXT) != GL_FALSE;
00582     }
00583     else
00584     {
00585       parameter_scsize = 0;
00586       parameter_scstride = 0;
00587       parameter_sctype = 0;
00588       parameter_scpointer = 0;
00589       enabled_GL_COLOR_SUM_EXT = false;
00590     }
00591   }
00592 };
00593 
00594 
00605 class CS_CSPLUGINCOMMON_GL_EXPORT csGLStateCache
00606 {
00607   enum
00608   {
00609     texServer = 0,
00610     texClient = 1
00611   };
00612 public:
00613   csGLExtensionManager* extmgr;
00614   csGLStateCacheContext* currentContext;
00615 
00616   csGLStateCache (csGLExtensionManager* extmgr)
00617   {
00618     csGLStateCache::extmgr = extmgr;
00619     currentContext = 0;
00620   }
00621 
00622   void SetContext (csGLStateCacheContext *context)
00623   {
00624     currentContext = context;
00625   }
00626 
00627   // Standardized caches
00628   IMPLEMENT_CACHED_BOOL (GL_DEPTH_TEST)
00629   IMPLEMENT_CACHED_BOOL (GL_BLEND)
00630   IMPLEMENT_CACHED_BOOL (GL_DITHER)
00631   IMPLEMENT_CACHED_BOOL (GL_STENCIL_TEST)
00632   IMPLEMENT_CACHED_BOOL (GL_CULL_FACE)
00633   IMPLEMENT_CACHED_BOOL (GL_POLYGON_OFFSET_FILL)
00634   IMPLEMENT_CACHED_BOOL (GL_LIGHTING)
00635   IMPLEMENT_CACHED_BOOL (GL_ALPHA_TEST)
00636   IMPLEMENT_CACHED_BOOL (GL_SCISSOR_TEST)
00637   IMPLEMENT_CACHED_BOOL (GL_TEXTURE_GEN_S)
00638   IMPLEMENT_CACHED_BOOL (GL_TEXTURE_GEN_T)
00639   IMPLEMENT_CACHED_BOOL (GL_TEXTURE_GEN_R)
00640   IMPLEMENT_CACHED_BOOL (GL_TEXTURE_GEN_Q)
00641   IMPLEMENT_CACHED_BOOL (GL_FOG)
00642   IMPLEMENT_CACHED_BOOL (GL_COLOR_SUM_EXT)
00643   IMPLEMENT_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_1D)
00644   IMPLEMENT_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_2D)
00645   IMPLEMENT_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_3D)
00646   IMPLEMENT_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_CUBE_MAP)
00647   IMPLEMENT_CACHED_BOOL_CURRENTLAYER (GL_TEXTURE_RECTANGLE_ARB)
00648   IMPLEMENT_CACHED_PARAMETER_2 (glAlphaFunc, AlphaFunc, GLenum, alpha_func, GLclampf, alpha_ref)
00649   IMPLEMENT_CACHED_PARAMETER_2 (glBlendFunc, BlendFunc, GLenum, blend_source, GLenum, blend_destination)
00650   IMPLEMENT_CACHED_PARAMETER_1 (glCullFace, CullFace, GLenum, cull_mode)
00651   IMPLEMENT_CACHED_PARAMETER_1 (glDepthFunc, DepthFunc, GLenum, depth_func)
00652   IMPLEMENT_CACHED_PARAMETER_1 (glDepthMask, DepthMask, GLboolean, depth_mask)
00653   IMPLEMENT_CACHED_PARAMETER_1 (glShadeModel, ShadeModel, GLenum, shade_model)
00654   IMPLEMENT_CACHED_PARAMETER_3 (glStencilFunc, StencilFunc, GLenum, stencil_func, GLint, stencil_ref, GLuint, stencil_mask)
00655   IMPLEMENT_CACHED_PARAMETER_3 (glStencilOp, StencilOp, GLenum, stencil_fail, GLenum, stencil_zfail, GLenum, stencil_zpass)
00656   IMPLEMENT_CACHED_PARAMETER_1 (glStencilMask, StencilMask, GLuint, maskl)
00657   IMPLEMENT_CACHED_PARAMETER_4 (glColorMask, ColorMask, GLboolean, wmRed, \
00658     GLboolean, wmGreen, GLboolean, wmBlue, GLboolean, wmAlpha)
00659 
00660   IMPLEMENT_CACHED_CLIENT_STATE (GL_VERTEX_ARRAY)
00661   IMPLEMENT_CACHED_CLIENT_STATE (GL_COLOR_ARRAY)
00662   IMPLEMENT_CACHED_CLIENT_STATE (GL_SECONDARY_COLOR_ARRAY_EXT)
00663   IMPLEMENT_CACHED_CLIENT_STATE (GL_NORMAL_ARRAY)
00664   IMPLEMENT_CACHED_CLIENT_STATE_LAYER (GL_TEXTURE_COORD_ARRAY)
00665 
00666   IMPLEMENT_CACHED_PARAMETER_1 (glMatrixMode, MatrixMode, GLenum, matrixMode)
00667   
00668   IMPLEMENT_CACHED_PARAMETER_4 (glVertexPointer, VertexPointer, GLint, vsize,
00669     GLenum, vtype, GLsizei, vstride, GLvoid*, vpointer);
00670   IMPLEMENT_CACHED_PARAMETER_3 (glNormalPointer, NormalPointer, GLenum, ntype,
00671     GLsizei, nstride, GLvoid*, npointer);
00672   IMPLEMENT_CACHED_PARAMETER_4 (glColorPointer, ColorPointer, GLint, csize,
00673     GLenum, ctype, GLsizei, cstride, GLvoid*, cpointer);
00674   IMPLEMENT_CACHED_PARAMETER_4 (extmgr->glSecondaryColorPointerEXT, 
00675     SecondaryColorPointerExt, GLint, scsize, GLenum, sctype, GLsizei, scstride, 
00676     GLvoid*, scpointer);
00677   IMPLEMENT_CACHED_PARAMETER_4_LAYER (glTexCoordPointer, TexCoordPointer, GLint, tsize,
00678     GLenum, ttype, GLsizei, tstride, GLvoid*, tpointer);
00679   
00680   // Special caches
00681   void SetTexture (GLenum target, GLuint texture)
00682   {
00683     const int currentUnit = currentContext->currentUnit;
00684     if (texture != currentContext->boundtexture[currentUnit])
00685     {
00686       ActivateTU (activateImage);
00687       currentContext->boundtexture[currentUnit] = texture;
00688       glBindTexture (target, texture);
00689     }
00690   }
00691   GLuint GetTexture (GLenum /*target*/)
00692   {
00693     const int currentUnit = currentContext->currentUnit;
00694     return currentContext->boundtexture[currentUnit];
00695   }
00696   GLuint GetTexture (GLenum /*target*/, int unit)
00697   {
00698     return currentContext->boundtexture[unit];
00699   }
00705   void SetCurrentTU (int unit)
00706   {
00707     currentContext->currentUnit = unit;   
00708   }
00710   int GetCurrentTU ()
00711   {
00712     return currentContext->currentUnit;
00713   }
00715   static const int activateTexCoord = 1 << texClient;
00717   static const int activateImage = 1 << texServer;
00719   static const int activateMatrix = 1 << texServer;
00721   static const int activateTexEnv = 1 << texServer;
00726   static const int activateTexGen = 1 << texServer;
00728   static const int activateTexEnable = 1 << texServer;
00736   void ActivateTU (uint usage)
00737   {
00738     int currentUnit = currentContext->currentUnit;
00739     for (int i = 0; i < 2; i++)
00740     {
00741       if (currentContext->activeUnit[i] != currentUnit)
00742       {
00743         GLuint tu = GL_TEXTURE0_ARB + currentUnit;
00744         if (usage & (1 << i))
00745         {
00746           if (i == texClient)
00747             extmgr->glClientActiveTextureARB (tu);
00748           else
00749             extmgr->glActiveTextureARB (tu);
00750           currentContext->activeUnit[i] = currentUnit;
00751         }
00752       }
00753     }
00754   }
00755 
00756   //VBO buffers
00757   void SetBufferARB (GLenum target, GLuint id)
00758   {
00759     if (target == GL_ELEMENT_ARRAY_BUFFER_ARB)
00760     {
00761       if (id != currentContext->currentIndexID)
00762       {
00763         extmgr->glBindBufferARB (target, id);
00764         currentContext->currentIndexID = id;
00765       }
00766     } 
00767     else 
00768     {
00769       if (id != currentContext->currentBufferID)
00770       {
00771         extmgr->glBindBufferARB (target, id);
00772         currentContext->currentBufferID = id;
00773         currentContext->parameter_vpointer = (GLvoid*)~0; //invalidate vertexpointer
00774         currentContext->parameter_npointer = (GLvoid*)~0; //invalidate vertexpointer
00775         currentContext->parameter_cpointer = (GLvoid*)~0; //invalidate vertexpointer
00776         memset(&currentContext->parameter_tpointer, ~0, sizeof(GLvoid*)*CS_GL_MAX_LAYER);
00777       }
00778     }
00779   }
00780 
00781   GLuint GetBufferARB (GLenum target)
00782   {
00783     if (target == GL_ELEMENT_ARRAY_BUFFER_ARB)
00784     {
00785       return currentContext->currentIndexID;
00786     } 
00787     else 
00788     {
00789       return currentContext->currentBufferID;
00790     }
00791   }
00792 };
00793 
00794 #undef IMPLEMENT_CACHED_BOOL
00795 #undef IMPLEMENT_CACHED_BOOL_CURRENTLAYER
00796 #undef IMPLEMENT_CACHED_PARAMETER_1
00797 #undef IMPLEMENT_CACHED_PARAMETER_2
00798 #undef IMPLEMENT_CACHED_PARAMETER_3
00799 #undef IMPLEMENT_CACHED_PARAMETER_4
00800 #undef IMPLEMENT_CACHED_PARAMETER_1_LAYER
00801 #undef IMPLEMENT_CACHED_PARAMETER_2_LAYER
00802 #undef IMPLEMENT_CACHED_PARAMETER_3_LAYER
00803 #undef IMPLEMENT_CACHED_PARAMETER_4_LAYER
00804 #undef IMPLEMENT_CACHED_CLIENT_STATE
00805 #undef IMPLEMENT_CACHED_CLIENT_STATE_LAYER
00806 
00807 #undef DECLARE_CACHED_BOOL
00808 #undef DECLARE_CACHED_BOOL_CURRENTLAYER
00809 #undef DECLARE_CACHED_PARAMETER_1
00810 #undef DECLARE_CACHED_PARAMETER_2
00811 #undef DECLARE_CACHED_PARAMETER_3
00812 #undef DECLARE_CACHED_PARAMETER_4
00813 #undef DECLARE_CACHED_PARAMETER_1_LAYER
00814 #undef DECLARE_CACHED_PARAMETER_2_LAYER
00815 #undef DECLARE_CACHED_PARAMETER_3_LAYER
00816 #undef DECLARE_CACHED_PARAMETER_4_LAYER
00817 #undef DECLARE_CACHED_CLIENT_STATE
00818 #undef DECLARE_CACHED_CLIENT_STATE_LAYER
00819 
00820 #undef FORCE_STATE_CHANGE
00821 
00824 #endif // __CS_GLSTATES_H__

Generated for Crystal Space by doxygen 1.4.7