00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00023 #ifndef VTK_IMPLEMENT_MESA_CXX
00024 # include "vtkOpenGL.h"
00025 #endif
00026
00027 #define vtkOpenGLCall_glEnable vtkOpenGLStateCache::CurrentGLCache->glEnable
00028 #define vtkOpenGLCall_glDisable vtkOpenGLStateCache::CurrentGLCache->glDisable
00029 #define vtkOpenGLCall_glAlphaFunc vtkOpenGLStateCache::CurrentGLCache->glAlphaFunc
00030 #define vtkOpenGLCall_glBlendFunc vtkOpenGLStateCache::CurrentGLCache->glBlendFunc
00031 #define vtkOpenGLCall_glDepthFunc vtkOpenGLStateCache::CurrentGLCache->glDepthFunc
00032 #define vtkOpenGLCall_glTexEnvf vtkOpenGLStateCache::CurrentGLCache->glTexEnvf
00033 #define vtkOpenGLCall_glLightModeli vtkOpenGLStateCache::CurrentGLCache->glLightModeli
00034 #define vtkOpenGLCall_glLightModelfv vtkOpenGLStateCache::CurrentGLCache->glLightMOdelfv
00035 #define vtkOpenGLCall_glLightfv vtkOpenGLStateCache::CurrentGLCache->glLightfv
00036 #define vtkOpenGLCall_glLightf vtkOpenGLStateCache::CurrentGLCache->glLightf
00037 #define vtkOpenGLCall_glLighti vtkOpenGLStateCache::CurrentGLCache->glLighti
00038 #define vtkOpenGLCall_glMaterialfv vtkOpenGLStateCache::CurrentGLCache->glMaterialfv
00039 #define vtkOpenGLCall_glShadeModel vtkOpenGLStateCache::CurrentGLCache->glShadeModel
00040 #define vtkOpenGLCall_glClearColor vtkOpenGLStateCache::CurrentGLCache->glClearColor
00041 #define vtkOpenGLCall_glClearDepth vtkOpenGLStateCache::CurrentGLCache->glClearDepth
00042 #define vtkOpenGLCall_glDepthMask vtkOpenGLStateCache::CurrentGLCache->glDepthMask
00043 #define vtkOpenGLCall_glCullFace vtkOpenGLStateCache::CurrentGLCache->glCullFace
00044 #define vtkOpenGLCall_glClear vtkOpenGLStateCache::CurrentGLCache->glClear
00045 #define vtkOpenGLCall_glDrawBuffer vtkOpenGLStateCache::CurrentGLCache->glDrawBuffer
00046 #define vtkOpenGLCall_glMatrixMode vtkOpenGLStateCache::CurrentGLCache->glMatrixMode
00047 #define vtkOpenGLCall_glViewport vtkOpenGLStateCache::CurrentGLCache->glViewport
00048 #define vtkOpenGLCall_glScissor vtkOpenGLStateCache::CurrentGLCache->glScissor
00049 #define vtkOpenGLCall_glClipPlane vtkOpenGLStateCache::CurrentGLCache->glClipPlane
00050 #define vtkOpenGLCall_glColorMaterial vtkOpenGLStateCache::CurrentGLCache->glColorMaterial
00051 #define vtkOpenGLCall_glPointSize vtkOpenGLStateCache::CurrentGLCache->glPointSize
00052 #define vtkOpenGLCall_glLineWidth vtkOpenGLStateCache::CurrentGLCache->glLineWidth
00053 #define vtkOpenGLCall_glLineStipple vtkOpenGLStateCache::CurrentGLCache->glLineStipple
00054 #define vtkOpenGLCall_glDepthRange vtkOpenGLStateCache::CurrentGLCache->glDepthRange
00055 #define vtkOpenGLCall_glPolygonOffset vtkOpenGLStateCache::CurrentGLCache->glPolygonOffset
00056
00057 #define vtkOpenGLCall_glPushMatrix glPushMatrix
00058 #define vtkOpenGLCall_glPopMatrix glPopMatrix
00059 #define vtkOpenGLCall_glMultMatrixd glMultMatrixd
00060 #define vtkOpenGLCall_glLoadMatrixd glLoadMatrixd
00061 #define vtkOpenGLCall_glLoadIdentity glLoadIdentity
00062 #define vtkOpenGLCall_glSelectBuffer glSelectBuffer
00063 #define vtkOpenGLCall_glRenderMode glRenderMode
00064 #define vtkOpenGLCall_glInitNames glInitNames
00065 #define vtkOpenGLCall_glPushName glPushName
00066 #define vtkOpenGLCall_glLoadName glLoadName
00067 #define vtkOpenGLCall_glGetIntegerv glGetIntegerv
00068 #define vtkOpenGLCall_glIsTexture glIsTexture
00069 #define vtkOpenGLCall_glDeleteTextures glDeleteTexture
00070 #define vtkOpenGLCall_glGenTextures glGenTextures
00071 #define vtkOpenGLCall_glBindTexture glBindTexture
00072 #define vtkOpenGLCall_glTexParameterf glTextParameterf
00073 #define vtkOpenGLCall_glTexCoord2fv glTexCoord2fv
00074 #define vtkOpenGLCall_glVertex3fv glVertex3fv
00075 #define vtkOpenGLCall_glNormal3fv glNormal3fv
00076 #define vtkOpenGLCall_glColor3f glColor3f
00077 #define vtkOpenGLCall_glColor4ubv glColor4ubv
00078 #define vtkOpenGLCall_glColor4fv glColor4fv
00079 #define vtkOpenGLCall_glBegin glBegin
00080 #define vtkOpenGLCall_glEnd glEnd
00081 #define vtkOpenGLCall_glTexImage2D glTextImage2D
00082 #define vtkOpenGLCall_glDeleteLists glDeleteLists
00083 #define vtkOpenGLCall_glIsList glIsList
00084 #define vtkOpenGLCall_glGenLists glGenLists
00085 #define vtkOpenGLCall_glCallList glCallList
00086 #define vtkOpenGLCall_glReadBuffer glReadBuffer
00087 #define vtkOpenGLCall_glPixelStorei glPixelStorei
00088 #define vtkOpenGLCall_glReadPixels glReadPixels
00089 #define vtkOpenGLCall_glRasterPos3f glRasterPos3f
00090 #define vtkOpenGLCall_glDrawPixels glDrawPixels
00091 #define vtkOpenGLCall_glRasterPos2f glRasterPos2f
00092 #define vtkOpenGLCall_glNewList glNewList
00093 #define vtkOpenGLCall_glEndList glEndList
00094
00095 class vtkOpenGLStateCache
00096 {
00097 public:
00098 static vtkOpenGLStateCache *CurrentGLCache;
00099
00100 vtkOpenGLStateCache();
00101 ~vtkOpenGLStateCache();
00102 void Initialize();
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 char Enable_buckets[0xDE1-0xB10+1];
00121 char Enable_GL_LIGHT_buckets[8];
00122 char Enable_GL_CLIP_PLANE_buckets[8];
00123
00124
00125
00126
00127
00128 inline void glEnable(GLenum e)
00129 {
00130 register int ex;
00131 register char *val=0;
00132 if(e&0x4000)
00133 {
00134 ex=e-0x4000;
00135 if(ex<8) {val=Enable_GL_LIGHT_buckets+ex; }
00136 }
00137 else
00138 {
00139 if(e&0x8000)
00140 {
00141 ex=e-0x8000;
00142 if(ex<8) { val=Enable_GL_CLIP_PLANE_buckets+ex; }
00143 }
00144 else
00145 {
00146 if(e>=0xB10 && e<=0xDE1)
00147 {
00148 ex=e-0xB10;
00149 val=Enable_buckets+ex;
00150 }
00151 else
00152 {
00153 printf("Error: glEnable of 0x%X failed\n",e);
00154 }
00155 }
00156 }
00157 if(val && *val!=1)
00158 {
00159 *val=1;
00160 ::glEnable(e);
00161 }
00162 }
00163 inline void glDisable(GLenum e)
00164 {
00165 register int ex;
00166 register char *val=0;
00167 if(e&0x4000)
00168 {
00169 ex=e-0x4000;
00170 if(ex<8) { val=Enable_GL_LIGHT_buckets+ex; }
00171 }
00172 else
00173 {
00174 if(e&0x8000)
00175 {
00176 ex=e-0x8000;
00177 if(ex<8) { val=Enable_GL_CLIP_PLANE_buckets+ex; }
00178 }
00179 else
00180 {
00181 if(e>=0xB10 && e<=0xDE1)
00182 {
00183 ex=e-0xB10;
00184 val=Enable_buckets+ex;
00185 }
00186 else
00187 {
00188 printf("Error: glEnable of 0x%X failed\n",e);
00189 }
00190 }
00191 }
00192 if(val && *val!=0)
00193 {
00194 *val=0;
00195 ::glDisable(e);
00196 }
00197 }
00198
00199
00200 GLclampf AlphaFunc_bucket;
00201 inline void glAlphaFunc(GLenum e,GLclampf cf)
00202 {
00203 if(e==GL_GREATER && cf!=AlphaFunc_bucket)
00204 {
00205 AlphaFunc_bucket=cf;
00206 ::glAlphaFunc(e,cf);
00207 }
00208 }
00209
00210
00211 GLenum BlendFunc_bucket;
00212 inline void glBlendFunc(GLenum e,GLenum e1)
00213 {
00214 if(e==GL_SRC_ALPHA && e1!=BlendFunc_bucket)
00215 {
00216 BlendFunc_bucket=e1;
00217 ::glBlendFunc(e,e1);
00218 }
00219 }
00220
00221
00222
00223
00224 GLenum DepthFunc_bucket;
00225 inline void glDepthFunc(GLenum e)
00226 {
00227 if(e!=DepthFunc_bucket)
00228 {
00229 DepthFunc_bucket=e;
00230 ::glDepthFunc(e);
00231 }
00232 }
00233
00234
00235 GLfloat TexEnvf_MODE_bucket;
00236 inline void glTexEnvf(GLenum e,GLenum e1,GLfloat f)
00237 {
00238 if(e==GL_TEXTURE_ENV && e1==GL_TEXTURE_ENV_MODE)
00239 {
00240 if(f!=TexEnvf_MODE_bucket)
00241 {
00242 TexEnvf_MODE_bucket=f;
00243 ::glTexEnvf(e,e1,f);
00244 }
00245 }
00246 }
00247
00248
00249
00250 GLint LightModeli_LIGHT_MODEL_TWO_SIDE_bucket;
00251 inline void glLightModeli(GLenum e,GLint i)
00252 {
00253 if(e==GL_LIGHT_MODEL_TWO_SIDE && i!=LightModeli_LIGHT_MODEL_TWO_SIDE_bucket){
00254 LightModeli_LIGHT_MODEL_TWO_SIDE_bucket=i;
00255 ::glLightModeli(e,i);
00256 }
00257 }
00258
00259
00260
00261 GLfloat LightModelfv_LIGHT_MODEL_AMBIENT_bucket[3];
00262 inline void glLightModelfv(GLenum e,GLfloat *fv)
00263 {
00264 if(e==GL_LIGHT_MODEL_AMBIENT &&
00265 (fv[0]!=LightModelfv_LIGHT_MODEL_AMBIENT_bucket[0] ||
00266 fv[1]!=LightModelfv_LIGHT_MODEL_AMBIENT_bucket[1] ||
00267 fv[2]!=LightModelfv_LIGHT_MODEL_AMBIENT_bucket[2])){
00268 fv[0]=LightModelfv_LIGHT_MODEL_AMBIENT_bucket[0];
00269 fv[1]=LightModelfv_LIGHT_MODEL_AMBIENT_bucket[1];
00270 fv[2]=LightModelfv_LIGHT_MODEL_AMBIENT_bucket[2];
00271 ::glLightModelfv(e,fv);
00272 }
00273 }
00274
00275
00276
00277
00278
00279
00280
00281 GLfloat Lightfv_buckets[8*4*8];
00282 inline void glLightfv( GLenum light, GLenum pname, const GLfloat *params)
00283 {
00284 register GLfloat *val = Lightfv_buckets + ((((int)(pname-0x1201))|((int)(light-GL_LIGHT0)<<3))<<2);
00285 if(params[0]!=val[0] ||
00286 params[1]!=val[1] ||
00287 params[2]!=val[2] ||
00288 params[3]!=val[3])
00289 {
00290 val[0]=params[0];
00291 val[1]=params[1];
00292 val[2]=params[2];
00293 val[3]=params[3];
00294 ::glLightfv(light,pname,params);
00295 }
00296 }
00297
00298
00299
00300
00301
00302
00303
00304
00305 GLfloat Lightf_buckets[8*8];
00306 GLint Lighti_SPOT_CUTOFF_buckets[8];
00307 inline void glLightf( GLenum light, GLenum pname, GLfloat f){
00308 register GLfloat *val=Lightf_buckets+(((int)(light-GL_LIGHT0)<<3)|((int)(pname-0x1205)));
00309 if(val[0]!=f)
00310 {
00311 val[0]=f;
00312 ::glLightf(light,pname,f);
00313 if(pname==GL_SPOT_CUTOFF)
00314 Lighti_SPOT_CUTOFF_buckets[light-GL_LIGHT0]=-1;
00315 }
00316 }
00317
00318
00319
00320
00321
00322 inline void glLighti( GLenum light, GLenum pname, GLint f)
00323 {
00324 if(pname==GL_SPOT_CUTOFF && f!=Lighti_SPOT_CUTOFF_buckets[light-GL_LIGHT0]){
00325 Lighti_SPOT_CUTOFF_buckets[light-GL_LIGHT0]=f;
00326 ::glLighti(light,pname,f);
00327
00328 Lightf_buckets[((int)(light-GL_LIGHT0)<<3)|0x02] = -1.0f;
00329 }
00330 }
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343 GLfloat Materialfv_buckets[8*8*4];
00344 inline void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params )
00345 {
00346 register int idx;
00347 register GLfloat *val;
00348 if(pname>=0x1600)
00349 {
00350 idx=pname-0x1600 + 4;
00351 }
00352 else
00353 {
00354 idx=pname-0x1200;
00355 }
00356
00357
00358
00359
00360
00361 val = Materialfv_buckets + ((((face-0x0404)<<3)|idx)<<2);
00362 if(val[0]!=params[0] ||
00363 val[1]!=params[1] ||
00364 val[2]!=params[2] ||
00365 val[3]!=params[3])
00366 {
00367 val[0]=params[0];
00368 val[1]=params[1];
00369 val[2]=params[2];
00370 val[3]=params[3];
00371 ::glMaterialfv(face,pname,params);
00372 }
00373 }
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 GLenum ShadeModel_bucket;
00385 inline void glShadeModel(GLenum e)
00386 {
00387 if(ShadeModel_bucket!=e)
00388 {
00389 ShadeModel_bucket=e;
00390 ::glShadeModel(e);
00391 }
00392 }
00393
00394 GLclampf ClearColor_buckets[4];
00395 inline void glClearColor(GLclampf r,GLclampf g,GLclampf b,GLclampf a)
00396 {
00397 register GLclampf *c=ClearColor_buckets;
00398 if(c[0]!=r ||
00399 c[1]!=g ||
00400 c[2]!=b ||
00401 c[3]!=a)
00402 {
00403 c[0]=r;
00404 c[1]=g;
00405 c[2]=b;
00406 c[3]=a;
00407 ::glClearColor(r,g,b,a);
00408 }
00409 }
00410
00411 GLclampd ClearDepth_bucket;
00412 inline void glClearDepth(GLclampd d)
00413 {
00414 if(d!=ClearDepth_bucket)
00415 {
00416 ClearDepth_bucket=d;
00417 ::glClearDepth(d);
00418 }
00419 }
00420
00421 GLclampf DepthMask_bucket;
00422 inline void glDepthMask(GLenum e)
00423 {
00424 if(DepthMask_bucket!=e)
00425 {
00426 DepthMask_bucket=e;
00427 ::glDepthMask(e);
00428 }
00429 }
00430
00431
00432
00433 GLenum CullFace_bucket;
00434 inline void glCullFace(GLenum e)
00435 {
00436 if(CullFace_bucket!=e)
00437 {
00438 CullFace_bucket=e;
00439 ::glCullFace(e);
00440 }
00441 }
00442
00443
00444 inline void glClear(GLbitfield b) { ::glClear(b);}
00445
00446
00447
00448
00449 GLenum DrawBuffer_bucket;
00450 inline void glDrawBuffer(GLenum e) {
00451 if(e!=DrawBuffer_bucket){
00452 DrawBuffer_bucket=e;
00453 ::glDrawBuffer(e);
00454 }
00455 }
00456
00457
00458
00459 GLenum MatrixMode_bucket;
00460 inline void glMatrixMode(GLenum e) {
00461 if(e!=MatrixMode_bucket){
00462 MatrixMode_bucket=e;
00463 ::glMatrixMode(e);
00464 }
00465 }
00466
00467 GLint Viewport_bucket[4];
00468 inline void glViewport(GLint llx,GLint lly,GLint u,GLint v){
00469 register GLint *val=Viewport_bucket;
00470 if(val[0]!=llx ||
00471 val[1]!=lly ||
00472 val[2]!=u ||
00473 val[3]!=v){
00474 val[0]=llx;
00475 val[1]=lly;
00476 val[2]=u;
00477 val[3]=v;
00478 ::glViewport(llx,lly,u,v);
00479 }
00480 }
00481
00482 GLint Scissor_bucket[4];
00483 inline void glScissor(GLint llx,GLint lly,GLint u,GLint v){
00484 register GLint *val=Scissor_bucket;
00485 if(val[0]!=llx ||
00486 val[1]!=lly ||
00487 val[2]!=u ||
00488 val[3]!=v){
00489 val[0]=llx;
00490 val[1]=lly;
00491 val[2]=u;
00492 val[3]=v;
00493 ::glScissor(llx,lly,u,v);
00494 }
00495 }
00496
00497
00498
00499 GLdouble ClipPlane_bucket[4*GL_MAX_CLIP_PLANES];
00500 inline void glClipPlane(GLenum e,const GLdouble *eqn){
00501 register GLdouble *val=ClipPlane_bucket + ((e-0x3000)<<2);
00502 if(val[0]!=eqn[0] ||
00503 val[1]!=eqn[1] ||
00504 val[2]!=eqn[2] ||
00505 val[3]!=eqn[3]){
00506 val[0]=eqn[0];
00507 val[1]=eqn[1];
00508 val[2]=eqn[2];
00509 val[3]=eqn[3];
00510 ::glClipPlane(e,eqn);
00511 }
00512 }
00513
00514
00515
00516
00517
00518 GLenum ColorMaterial_bucket[8];
00519 inline void glColorMaterial(GLenum face,GLenum mode ){
00520 register GLenum *val= ColorMaterial_bucket + (face-0x0404);
00521 if(*val!=mode){
00522 *val=mode;
00523 ::glColorMaterial(face,mode);
00524 }
00525 }
00526 GLfloat PointSize_bucket;
00527 inline void glPointSize(GLfloat f) {
00528 if(f!=PointSize_bucket){
00529 PointSize_bucket=f;
00530 ::glPointSize(f);
00531 }
00532 }
00533 GLfloat LineWidth_bucket;
00534 inline void glLineWidth(GLfloat f){
00535 if(f!=LineWidth_bucket){
00536 LineWidth_bucket=f;
00537 ::glPointSize(f);
00538 }
00539 }
00540 GLint LineStipple_FACTOR_bucket;
00541 GLushort LineStipple_PATTERN_bucket;
00542 inline void glLineStipple(GLint factor, GLushort pattern )
00543 {
00544 if(factor!=LineStipple_FACTOR_bucket ||
00545 pattern!=LineStipple_PATTERN_bucket)
00546 {
00547 LineStipple_FACTOR_bucket=factor;
00548 LineStipple_PATTERN_bucket=pattern;
00549 ::glLineStipple(factor,pattern);
00550 }
00551 }
00552
00553 GLclampd DepthRange_NEAR_bucket;
00554 GLclampd DepthRange_FAR_bucket;
00555 inline void glDepthRange(GLclampd nearval,GLclampd farval )
00556 {
00557 if(DepthRange_NEAR_bucket!=nearval ||
00558 DepthRange_FAR_bucket!=farval)
00559 {
00560 DepthRange_NEAR_bucket=nearval;
00561 DepthRange_FAR_bucket=farval;
00562 ::glDepthRange(nearval,farval);
00563 }
00564 }
00565
00566 #ifdef GL_VERSION_1_1
00567
00568 GLfloat PolygonOffset_bucket[2];
00569 inline void glPolygonOffset( GLfloat f,GLfloat u) {
00570 if(PolygonOffset_bucket[0]!=f ||
00571 PolygonOffset_bucket[1]!=u){
00572 PolygonOffset_bucket[0]=f;
00573 PolygonOffset_bucket[1]=u;
00574 ::glPolygonOffset(f,u);
00575 }
00576 }
00577 #endif
00578 };
00579
00580
00581
00582
00583