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 ¶m1, 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 ¶m1, 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 ¶m1) 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 ¶m1, 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 ¶m1, 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 ¶m1, 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*)¶meter_alpha_func); 00447 glGetFloatv (GL_ALPHA_TEST_REF, ¶meter_alpha_ref); 00448 glGetIntegerv (GL_BLEND_SRC, (GLint*)¶meter_blend_source); 00449 glGetIntegerv (GL_BLEND_DST, (GLint*)¶meter_blend_destination); 00450 glGetIntegerv (GL_CULL_FACE_MODE, (GLint*)¶meter_cull_mode); 00451 glGetIntegerv (GL_DEPTH_FUNC, (GLint*)¶meter_depth_func); 00452 glGetBooleanv (GL_DEPTH_WRITEMASK, ¶meter_depth_mask); 00453 glGetIntegerv (GL_SHADE_MODEL, (GLint*)¶meter_shade_model); 00454 glGetIntegerv (GL_STENCIL_BITS, (GLint*)¶meter_maskl); 00455 glGetIntegerv (GL_STENCIL_FUNC, (GLint*)¶meter_stencil_func); 00456 glGetIntegerv (GL_STENCIL_VALUE_MASK, (GLint*)¶meter_stencil_mask); 00457 glGetIntegerv (GL_STENCIL_REF, ¶meter_stencil_ref); 00458 glGetIntegerv (GL_STENCIL_FAIL, (GLint*)¶meter_stencil_fail); 00459 glGetIntegerv (GL_STENCIL_PASS_DEPTH_FAIL, (GLint*)¶meter_stencil_zfail); 00460 glGetIntegerv (GL_STENCIL_PASS_DEPTH_PASS, (GLint*)¶meter_stencil_zpass); 00461 glGetIntegerv (GL_MATRIX_MODE, (GLint*)¶meter_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*)¶meter_tsize[i]); 00500 glGetIntegerv (GL_TEXTURE_COORD_ARRAY_STRIDE, (GLint*)¶meter_tstride[i]); 00501 glGetIntegerv (GL_TEXTURE_COORD_ARRAY_TYPE, (GLint*)¶meter_ttype[i]); 00502 glGetPointerv (GL_TEXTURE_COORD_ARRAY_POINTER, ¶meter_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*)¶meter_tsize[0]); 00519 glGetIntegerv (GL_TEXTURE_COORD_ARRAY_STRIDE, (GLint*)¶meter_tstride[0]); 00520 glGetIntegerv (GL_TEXTURE_COORD_ARRAY_TYPE, (GLint*)¶meter_ttype[0]); 00521 glGetPointerv (GL_TEXTURE_COORD_ARRAY_POINTER, ¶meter_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*)¶meter_vsize); 00558 glGetIntegerv (GL_VERTEX_ARRAY_STRIDE, (GLint*)¶meter_vstride); 00559 glGetIntegerv (GL_VERTEX_ARRAY_TYPE, (GLint*)¶meter_vtype); 00560 glGetPointerv (GL_VERTEX_ARRAY_POINTER, ¶meter_vpointer); 00561 00562 glGetIntegerv (GL_NORMAL_ARRAY_STRIDE, (GLint*)¶meter_nstride); 00563 glGetIntegerv (GL_NORMAL_ARRAY_TYPE, (GLint*)¶meter_ntype); 00564 glGetPointerv (GL_NORMAL_ARRAY_POINTER, ¶meter_npointer); 00565 00566 glGetIntegerv (GL_COLOR_ARRAY_SIZE, (GLint*)¶meter_csize); 00567 glGetIntegerv (GL_COLOR_ARRAY_STRIDE, (GLint*)¶meter_cstride); 00568 glGetIntegerv (GL_COLOR_ARRAY_TYPE, (GLint*)¶meter_ctype); 00569 glGetPointerv (GL_COLOR_ARRAY_POINTER, ¶meter_cpointer); 00570 00571 if (extmgr->CS_GL_EXT_secondary_color) 00572 { 00573 glGetIntegerv (GL_SECONDARY_COLOR_ARRAY_SIZE_EXT, 00574 (GLint*)¶meter_scsize); 00575 glGetIntegerv (GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT, 00576 (GLint*)¶meter_scstride); 00577 glGetIntegerv (GL_SECONDARY_COLOR_ARRAY_TYPE_EXT, 00578 (GLint*)¶meter_sctype); 00579 glGetPointerv (GL_SECONDARY_COLOR_ARRAY_POINTER_EXT, 00580 ¶meter_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(¤tContext->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