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