DEADSOFTWARE

Merge branch 'stupidglesbug-fix' of https://github.com/SDLash3D/nanogl
authormittorn <mittorn@sibmail.com>
Sun, 18 Jun 2017 18:39:32 +0000 (18:39 +0000)
committermittorn <mittorn@sibmail.com>
Sun, 18 Jun 2017 18:39:32 +0000 (18:39 +0000)
1  2 
GL/gl.h
GL/glesinterface.h
nanoWrap.cpp

diff --combined GL/gl.h
index d027d132846c2d456e365bd6713356ae343dcd89,159d671a9b923f7c2b583678a3f97fe9e79f748a..833e96627db715bfe71e281c3a6611bed833c38e
+++ b/GL/gl.h
@@@ -572,6 -572,8 +572,8 @@@ typedef int GLclampx
  #define glVertex3d glVertex3f
  //#define glColor4ub(x,y,z,p) glColor4f(x,y,z,p) //nicknekit: wtf???
  #define glFogi glFogf
+ #define glActiveTextureARB glActiveTexture
+ #define glClientActiveTextureARB glClientActiveTexture
  //
  
  void glBegin( GLenum mode );
@@@ -665,15 -667,6 +667,15 @@@ void glTexParameterx( GLenum target, GL
  void glGenTextures( GLsizei n, GLuint *textures );
  void glFrontFace( GLenum mode );
  
 +// Rikku2000: Light
 +void glLightf( GLenum light, GLenum pname, GLfloat param );
 +void glLightfv( GLenum light, GLenum pname, const GLfloat *params );
 +void glLightModelf( GLenum pname, GLfloat param );
 +void glLightModelfv( GLenum pname, const GLfloat *params );
 +void glMaterialf( GLenum face, GLenum pname, GLfloat param );
 +void glMaterialfv( GLenum face, GLenum pname, const GLfloat *params );
 +void glColorMaterial( GLenum face, GLenum mode );
 +
  //nicknekit: for xash3d
  
  void glColor3ub( GLubyte red, GLubyte green, GLubyte blue );
@@@ -724,6 -717,17 +726,17 @@@ void glMultiTexCoord2f( GLenum, GLfloat
  
  void glDrawArrays( GLenum mode, GLint first, GLsizei count );
  
+ void glBindBufferARB( GLuint target, GLuint index );
+ void glGenBuffersARB( GLuint count, GLuint *indexes );
+ void glDeleteBuffersARB( GLuint count, GLuint *indexes );
+ void glBufferDataARB( GLuint target, GLuint size, void *buffer, GLuint type );
+ void glBufferSubDataARB( GLuint target, GLsizei offset, GLsizei size, void *buffer );
  #ifdef __cplusplus
  }
  #endif
diff --combined GL/glesinterface.h
index 710dfd33bbb54a959a8f2e2b39bddcb4b10cc8d1,ce35d88a84728ce5f8bda1724f829b33b802bc60..acb21bee96100f58706356c57fe64d618a581f56
@@@ -229,10 -229,6 +229,10 @@@ struct GlESInterfac
        void( APIENTRY *glOrtho )( double left, double right, double bottom, double top, double zNear, double zFar ) S;
        void( APIENTRY *glDepthRange )( double zNear, double zFar ) S;
  #endif
 +
 +      // Rikku2000: Light
 +      void( APIENTRY *glColorMaterial )( unsigned int face, unsigned int mode ) S;
 +
        void( APIENTRY *glGenFramebuffers )( unsigned int n, unsigned int *framebuffers ) S;
        void( APIENTRY *glGenRenderbuffers )( unsigned int n, unsigned int *renderbuffers ) S;
        void( APIENTRY *glRenderbufferStorage )( unsigned int target, unsigned int internalformat, unsigned int width, unsigned int height ) S;
        void( APIENTRY *glDeleteRenderbuffers )( unsigned int n, const unsigned int *renderbuffers ) S;
        void( APIENTRY *glDeleteFramebuffers )( unsigned int n, const unsigned int *framebuffers ) S;
        void( APIENTRY *glFramebufferRenderbuffer )( unsigned int target, unsigned int attachment, unsigned int renderbuffertarget, unsigned int renderbuffer ) S;
+       void( APIENTRY *glTexGenfvOES )(unsigned int coord, unsigned int pname, const float *params);
+       void( APIENTRY *glTexGeniOES )(unsigned int coord, unsigned int pname, int param);
  };
  #if !defined( __WINS__ )
  #if defined( __TARGET_FPU_VFP )
diff --combined nanoWrap.cpp
index 8fc82906ff06e3413374b0022a1b409e76e2c62c,3a6fb389186ffabacd6c7c2f95abab39d0631dd8..41eb4dda9ebacbbba3d3194bbb89ac8f3c115311
@@@ -44,14 -44,7 +44,14 @@@ struct nanoStat
        GLboolean depth_test;
        GLboolean dither;
        GLboolean fog;
 -      GLboolean lighti;
 +      GLboolean light0;
 +      GLboolean light1;
 +      GLboolean light2;
 +      GLboolean light3;
 +      GLboolean light4;
 +      GLboolean light5;
 +      GLboolean light6;
 +      GLboolean light7;
        GLboolean lighting;
        GLboolean line_smooth;
        GLboolean matrix_palette_oes;
@@@ -67,6 -60,7 +67,7 @@@
        GLboolean scissor_test;
        GLboolean stencil_test;
        GLboolean depthmask;
+       GLboolean stupidglesbug;
        GLclampf depth_range_near;
        GLclampf depth_range_far;
        GLenum depth_func;
@@@ -80,7 -74,7 +81,7 @@@
  static struct nanoState nanoglState;
  
  static struct nanoState nanoglInitState =
    {
+ {
          GL_FALSE,
          GL_FALSE,
          GL_FALSE,
          GL_FALSE,
          GL_FALSE,
          GL_FALSE,
 +        GL_FALSE,
 +        GL_FALSE,
 +        GL_FALSE,
 +        GL_FALSE,
 +        GL_FALSE,
 +        GL_FALSE,
 +        GL_FALSE,
          GL_TRUE,
          GL_FALSE,
          GL_FALSE,
          GL_FALSE,
          GL_FALSE,
          GL_TRUE,
+               GL_FALSE,
          0.0f,
          1.0f,
          GL_LESS,
@@@ -244,6 -232,8 +246,8 @@@ static GLushort *ptrIndexArray = NULL
  
  static GLboolean arraysValid = GL_FALSE;
  
+ static GLboolean skipnanogl;
  void InitGLStructs( )
  {
        ptrVertexAttribArray     = vertexattribs;
@@@ -329,7 -319,8 +333,8 @@@ void ResetNanoState( 
  
        glEsImpl->glMatrixMode( nanoglState.matrixmode );
  
-       glEsImpl->glColor4f( currentVertexAttrib.red, currentVertexAttrib.green, currentVertexAttrib.blue, currentVertexAttrib.alpha );
+       glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+                currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
  
        glEsImpl->glBlendFunc( nanoglState.sfactor, nanoglState.dfactor );
  
        glEsImpl->glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, activetmuState->texture_env_mode.value );
  
        arraysValid = GL_FALSE;
+       skipnanogl = GL_FALSE;
  }
  
  void FlushOnStateChange( )
  {
+       if( skipnanogl )
+               return;
        if ( delayedttmuchange )
        {
                delayedttmuchange = GL_FALSE;
@@@ -499,7 -493,7 +507,7 @@@ void glEnd( void 
                *ptrIndexArray++ = indexCount++;
                *ptrIndexArray++ = indexCount++;
                *ptrIndexArray++ = indexCount++;
 -              int vcount = ( ( vertexCount - vertexMark ) - 3 );
 +              int vcount       = ( ( vertexCount - vertexMark ) - 3 );
                for ( int count = 0; count < vcount; count++ )
                {
                        *ptrIndexArray++ = indexbase;
  
  void glEnable( GLenum cap )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glEnable( cap );
+               return;
+       }
        GLboolean statechanged = GL_FALSE;
        switch ( cap )
        {
                break;
        }
        case GL_FOG:
 -              //case GL_LIGHTi
 +      {
 +              if ( !nanoglState.fog )
                {
 -                      if ( !nanoglState.fog )
 -                      {
 -                              nanoglState.fog = GL_TRUE;
 -                              statechanged    = GL_TRUE;
 -                      }
 -                      break;
 +                      nanoglState.fog = GL_TRUE;
 +                      statechanged    = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT0:
 +      {
 +              if ( !nanoglState.light0 )
 +              {
 +                      nanoglState.light0 = GL_TRUE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT1:
 +      {
 +              if ( !nanoglState.light1 )
 +              {
 +                      nanoglState.light1 = GL_TRUE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT2:
 +      {
 +              if ( !nanoglState.light2 )
 +              {
 +                      nanoglState.light2 = GL_TRUE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT3:
 +      {
 +              if ( !nanoglState.light3 )
 +              {
 +                      nanoglState.light3 = GL_TRUE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT4:
 +      {
 +              if ( !nanoglState.light4 )
 +              {
 +                      nanoglState.light4 = GL_TRUE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT5:
 +      {
 +              if ( !nanoglState.light5 )
 +              {
 +                      nanoglState.light5 = GL_TRUE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT6:
 +      {
 +              if ( !nanoglState.light6 )
 +              {
 +                      nanoglState.light6 = GL_TRUE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT7:
 +      {
 +              if ( !nanoglState.light7 )
 +              {
 +                      nanoglState.light7 = GL_TRUE;
 +                      statechanged       = GL_TRUE;
                }
 +              break;
 +      }
        case GL_LIGHTING:
        {
                if ( !nanoglState.lighting )
        case GL_STENCIL_TEST:
        {
                return;
-               /*            if (!nanoglState.stencil_test)
+               if (!nanoglState.stencil_test)
                  {
                  nanoglState.stencil_test = GL_TRUE;
                  statechanged = GL_TRUE;
-                 }*/
+                 }
                break;
        }
        case GL_TEXTURE_2D:
                }
                break;
        }
+ #if 0 // todo: implement cubemap texgen
+       case GL_TEXTURE_GEN_S:
+       case GL_TEXTURE_GEN_T:
+       case GL_TEXTURE_GEN_R:
+       case GL_TEXTURE_GEN_Q:
+       {
+               FlushOnStateChange( );
+               nanoglState.texgen = true;
+               return;
+       }
+ #endif
        default:
                break;
        }
  
  void glDisable( GLenum cap )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glDisable( cap );
+               return;
+       }
        GLboolean statechanged = GL_FALSE;
        switch ( cap )
        {
                break;
        }
        case GL_FOG:
 -              //case GL_LIGHTi
 +      {
 +              if ( nanoglState.fog )
                {
 -                      if ( nanoglState.fog )
 -                      {
 -                              nanoglState.fog = GL_FALSE;
 -                              statechanged    = GL_TRUE;
 -                      }
 -                      break;
 +                      nanoglState.fog = GL_FALSE;
 +                      statechanged    = GL_TRUE;
                }
 +              break;
 +      }
 +      case GL_LIGHT0:
 +      {
 +              if ( !nanoglState.light0 )
 +              {
 +                      nanoglState.light0 = GL_FALSE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT1:
 +      {
 +              if ( !nanoglState.light1 )
 +              {
 +                      nanoglState.light1 = GL_FALSE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT2:
 +      {
 +              if ( !nanoglState.light2 )
 +              {
 +                      nanoglState.light2 = GL_FALSE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT3:
 +      {
 +              if ( !nanoglState.light3 )
 +              {
 +                      nanoglState.light3 = GL_FALSE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT4:
 +      {
 +              if ( !nanoglState.light4 )
 +              {
 +                      nanoglState.light4 = GL_FALSE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT5:
 +      {
 +              if ( !nanoglState.light5 )
 +              {
 +                      nanoglState.light5 = GL_FALSE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT6:
 +      {
 +              if ( !nanoglState.light6 )
 +              {
 +                      nanoglState.light6 = GL_FALSE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
 +      case GL_LIGHT7:
 +      {
 +              if ( !nanoglState.light7 )
 +              {
 +                      nanoglState.light7 = GL_FALSE;
 +                      statechanged       = GL_TRUE;
 +              }
 +              break;
 +      }
        case GL_LIGHTING:
        {
                if ( nanoglState.lighting )
        case GL_STENCIL_TEST:
        {
                return;
-               /*            if (nanoglState.stencil_test)
+               if (nanoglState.stencil_test)
                  {
                  nanoglState.stencil_test = GL_FALSE;
                  statechanged = GL_TRUE;
-                 }*/
+                 }
                break;
        }
        case GL_TEXTURE_2D:
                }
                break;
        }
+ #if 0
+       case GL_TEXTURE_GEN_S:
+       case GL_TEXTURE_GEN_T:
+       case GL_TEXTURE_GEN_R:
+       case GL_TEXTURE_GEN_Q:
+       {
+               FlushOnStateChange( );
+               nanoglState.texgen = false;
+               return;
+       }
+ #endif
        default:
                break;
        }
@@@ -1145,10 -1029,19 +1185,19 @@@ void glLoadIdentity( void 
  }
  
  void glColor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
- {
-       currentVertexAttrib.red   = (unsigned char)ClampTo255( red * 255.0f );
-       currentVertexAttrib.green = (unsigned char)ClampTo255( green * 255.0f );
-       currentVertexAttrib.blue  = (unsigned char)ClampTo255( blue * 255.0f );
+ {     
+       if( nanoglState.stupidglesbug )
+       {
+               currentVertexAttrib.red = (unsigned char)ClampTo255( ( red * alpha ) * 255.0f );
+               currentVertexAttrib.green = (unsigned char)ClampTo255( ( green * alpha ) * 255.0f );
+               currentVertexAttrib.blue = (unsigned char)ClampTo255( ( blue * alpha ) * 255.0f );
+       }
+       else
+       {
+               currentVertexAttrib.red   = (unsigned char)ClampTo255( red * 255.0f );
+               currentVertexAttrib.green = (unsigned char)ClampTo255( green * 255.0f );
+               currentVertexAttrib.blue  = (unsigned char)ClampTo255( blue * 255.0f );
+       }
        currentVertexAttrib.alpha = (unsigned char)ClampTo255( alpha * 255.0f );
  }
  
@@@ -1162,50 -1055,6 +1211,50 @@@ void glOrtho( GLfloat left, GLfloat rig
  #endif
  }
  
 +// Rikku2000: Light
 +void glLightf( GLenum light, GLenum pname, GLfloat param )
 +{
 +      FlushOnStateChange( );
 +
 +      glEsImpl->glLightf( light, pname, param );
 +}
 +void glLightfv( GLenum light, GLenum pname, const GLfloat *params )
 +{
 +      FlushOnStateChange( );
 +
 +      glEsImpl->glLightfv( light, pname, params );
 +}
 +void glLightModelf( GLenum pname, GLfloat param )
 +{
 +      FlushOnStateChange( );
 +
 +      glEsImpl->glLightModelf( pname, param );
 +}
 +void glLightModelfv( GLenum pname, const GLfloat *params )
 +{
 +      FlushOnStateChange( );
 +
 +      glEsImpl->glLightModelfv( pname, params );
 +}
 +void glMaterialf( GLenum face, GLenum pname, GLfloat param )
 +{
 +      FlushOnStateChange( );
 +
 +      glEsImpl->glMaterialf( face, pname, param );
 +}
 +void glMaterialfv( GLenum face, GLenum pname, const GLfloat *params )
 +{
 +      FlushOnStateChange( );
 +
 +      glEsImpl->glMaterialfv( face, pname, params );
 +}
 +void glColorMaterial( GLenum face, GLenum mode )
 +{
 +      FlushOnStateChange( );
 +
 +      glEsImpl->glColorMaterial( face, mode );
 +}
 +
  void glMatrixMode( GLenum mode )
  {
        if ( nanoglState.matrixmode == mode )
@@@ -1344,7 -1193,7 +1393,7 @@@ void glVertex3f( GLfloat x, GLfloat y, 
        GLfloat *vert = (GLfloat *)ptrVertexAttribArray++;
        *vert++       = x;
        *vert++       = y;
 -      *vert++ = z;
 +      *vert++       = z;
  #if defined( __MULTITEXTURE_SUPPORT__ )
        memcpy( vert, &currentVertexAttrib.red, 5 * sizeof( GLfloat ) );
  #else
  }
  
  void glColor4fv( const GLfloat *v )
- {
-       currentVertexAttrib.red   = (unsigned char)ClampTo255( v[0] * 255.0f );
-       currentVertexAttrib.green = (unsigned char)ClampTo255( v[1] * 255.0f );
-       currentVertexAttrib.blue  = (unsigned char)ClampTo255( v[2] * 255.0f );
+ {     
+       if( nanoglState.stupidglesbug )
+       {
+               currentVertexAttrib.red = (unsigned char)ClampTo255( ( v[0] * v[3] ) * 255.0f );
+               currentVertexAttrib.green = (unsigned char)ClampTo255( ( v[1] * v[3] ) * 255.0f );
+               currentVertexAttrib.blue = (unsigned char)ClampTo255( ( v[2] * v[3] ) * 255.0f );
+       }
+       else
+       {
+               currentVertexAttrib.red   = (unsigned char)ClampTo255( v[0] * 255.0f );
+               currentVertexAttrib.green = (unsigned char)ClampTo255( v[1] * 255.0f );
+               currentVertexAttrib.blue  = (unsigned char)ClampTo255( v[2] * 255.0f );
+       }
        currentVertexAttrib.alpha = (unsigned char)ClampTo255( v[3] * 255.0f );
+       if( skipnanogl )
+               glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+                        currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
  }
  
  void glColor3ubv( const GLubyte *v )
        currentVertexAttrib.green = v[1];
        currentVertexAttrib.blue  = v[2];
        currentVertexAttrib.alpha = 255;
+       if( skipnanogl )
+               glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+                        currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
  }
  
  void glColor4ubv( const GLubyte *v )
  {
        //*((unsigned int*)(&currentVertexAttrib.red)) = *((unsigned int*)(v));
-       currentVertexAttrib.red   = v[0];
-       currentVertexAttrib.green = v[1];
-       currentVertexAttrib.blue  = v[2];
+       if( nanoglState.stupidglesbug )
+       {
+               currentVertexAttrib.red   = (unsigned char)ClampTo255( v[0] * v[3] / 255.0f );
+               currentVertexAttrib.green = (unsigned char)ClampTo255( v[1] * v[3] / 255.0f );
+               currentVertexAttrib.blue  = (unsigned char)ClampTo255( v[2] * v[3] / 255.0f );
+       }
+       else
+       {
+               currentVertexAttrib.red   = v[0];
+               currentVertexAttrib.green = v[1];
+               currentVertexAttrib.blue  = v[2];
+       }
        currentVertexAttrib.alpha = v[3];
+       if( skipnanogl )
+               glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+                        currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
  }
  
  void glColor3fv( const GLfloat *v )
        currentVertexAttrib.green = (unsigned char)ClampTo255( v[1] * 255.0f );
        currentVertexAttrib.blue  = (unsigned char)ClampTo255( v[2] * 255.0f );
        currentVertexAttrib.alpha = 255;
+       if( skipnanogl )
+               glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+                        currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
  }
  
  //-- nicknekit: xash3d funcs --
  
  void glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha )
  {
-       currentVertexAttrib.red   = red;
-       currentVertexAttrib.green = green;
-       currentVertexAttrib.blue  = blue;
+       if( nanoglState.stupidglesbug )
+       {
+               currentVertexAttrib.red   = (unsigned char)ClampTo255( red   * alpha / 255.0f );
+               currentVertexAttrib.green = (unsigned char)ClampTo255( green * alpha / 255.0f );
+               currentVertexAttrib.blue  = (unsigned char)ClampTo255( blue  * alpha / 255.0f );
+       }
+       else
+       {
+               currentVertexAttrib.red   = red;
+               currentVertexAttrib.green = green;
+               currentVertexAttrib.blue  = blue;
+       }
        currentVertexAttrib.alpha = alpha;
+       if( skipnanogl )
+               glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+                        currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
  }
  
  void glColor3ub( GLubyte red, GLubyte green, GLubyte blue )
        currentVertexAttrib.green = green;
        currentVertexAttrib.blue  = blue;
        currentVertexAttrib.alpha = 255;
+       if( skipnanogl )
+               glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+                        currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
  }
  
  void glNormal3fv( const GLfloat *v )
@@@ -1446,14 -1340,18 +1540,18 @@@ GLboolean glIsTexture( GLuint texture 
        return glEsImpl->glIsTexture( texture );
  }
  
+ // TODO: add native normal/reflection map texgen support
  void glTexGeni( GLenum coord, GLenum pname, GLint param )
  {
-       //for mirrors? not needed for original hl?
+       FlushOnStateChange();
+       //glEsImpl->glTexGeniOES( coord, pname, param );
  }
  
  void glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
  {
-       //for mirrors? not needed for original hl?
+       FlushOnStateChange();
+       //glEsImpl->glTexGenfvOES( coord, pname, params );
  }
  
  //-- --//
@@@ -1466,10 -1364,24 +1564,24 @@@ void glHint( GLenum target, GLenum mod
  
  void glBlendFunc( GLenum sfactor, GLenum dfactor )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glBlendFunc( sfactor, dfactor );
+               return;
+       }
        if ( ( nanoglState.sfactor == sfactor ) && ( nanoglState.dfactor == dfactor ) )
        {
                return;
        }
+       
+       if( sfactor == GL_SRC_ALPHA && dfactor == GL_ONE ) 
+       {
+               sfactor = GL_ONE; // workaround gles bug
+               nanoglState.stupidglesbug = GL_TRUE;
+       }
+       else
+               nanoglState.stupidglesbug = GL_FALSE;
+       
        nanoglState.sfactor = sfactor;
        nanoglState.dfactor = dfactor;
        FlushOnStateChange( );
@@@ -1501,6 -1413,11 +1613,11 @@@ void glPushMatrix( void 
  
  void glTexEnvf( GLenum target, GLenum pname, GLfloat param )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glTexEnvf( target, pname, param );
+               return;
+       }
        if ( target == GL_TEXTURE_ENV )
        {
                if ( pname == GL_TEXTURE_ENV_MODE )
@@@ -1535,17 -1452,25 +1652,25 @@@ void glVertex3fv( const GLfloat *v 
  
  void glDepthMask( GLboolean flag )
  {
+       if( !skipnanogl )
+       {
        if ( nanoglState.depthmask == flag )
        {
                return;
        }
        nanoglState.depthmask = flag;
        FlushOnStateChange( );
+       }
        glEsImpl->glDepthMask( flag );
  }
  
  void glBindTexture( GLenum target, GLuint texture )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glBindTexture( target,texture );
+               return;
+       }
        if ( activetmuState->boundtexture.value == texture )
        {
                return;
@@@ -1631,6 -1556,11 +1756,11 @@@ GLenum glGetError( void 
  
  void glActiveTexture( GLenum texture )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glActiveTexture( texture );
+               return;
+       }
        if ( activetmu == texture )
        {
                return;
  
  void glClientActiveTexture( GLenum texture )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glClientActiveTexture( texture );
+               return;
+       }
        clientactivetmu = texture;
  }
  
@@@ -1724,6 -1659,11 +1859,11 @@@ struct ptrstate texture_coord_array
  
  void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glDrawElements( mode, count, type, indices );
+               return;
+       }
        // ensure that all primitives specified between glBegin/glEnd pairs
        // are rendered first, and that we have correct tmu in use..
        FlushOnStateChange( );
        glEsImpl->glDrawElements( mode, count, type, indices );
  }
  
+ bool vboarray;
  void glEnableClientState( GLenum array )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glEnableClientState( array );
+               if( array == GL_VERTEX_ARRAY )
+                       vboarray = true;
+               return;
+       }
        struct nanotmuState *clientstate = NULL;
        if ( clientactivetmu == GL_TEXTURE0 )
        {
  }
  void glDisableClientState( GLenum array )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glDisableClientState( array );
+               if( array == GL_VERTEX_ARRAY )
+                       vboarray = false;
+               return;
+       }
        struct nanotmuState *clientstate = NULL;
        if ( clientactivetmu == GL_TEXTURE0 )
        {
  }
  void glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glVertexPointer( size, type, stride, pointer );
+               return;
+       }
        if ( tmuState0.vertex_array.size == size &&
             tmuState0.vertex_array.stride == stride &&
             tmuState0.vertex_array.type == type &&
  }
  void glTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glTexCoordPointer( size, type, stride, pointer );
+               return;
+       }
        struct nanotmuState *clientstate = NULL;
        if ( clientactivetmu == GL_TEXTURE0 )
        {
@@@ -2117,6 -2084,11 +2284,11 @@@ void glFrontFace( GLenum mode 
  
  void glTexEnvi( GLenum target, GLenum pname, GLint param )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glTexEnvi( target, pname, param );
+               return;
+       }
        if ( target == GL_TEXTURE_ENV )
        {
                if ( pname == GL_TEXTURE_ENV_MODE )
@@@ -2144,12 -2116,18 +2316,18 @@@ void glMultiTexCoord3fARB( GLenum a, GL
        return glMultiTexCoord2fARB( a, b, c );
  }
  
- void glMultiTexCoord2f( GLenum, GLfloat, GLfloat )
+ void glMultiTexCoord2f( GLenum a, GLfloat b, GLfloat c )
  {
+       glMultiTexCoord2fARB(a,b,c);
  }
  #endif
  void glDrawArrays( GLenum mode, GLint first, GLsizei count )
  {
+       if( skipnanogl )
+       {
+               glEsImpl->glDrawArrays( mode, first, count );
+               return;
+       }
        // ensure that all primitives specified between glBegin/glEnd pairs
        // are rendered first, and that we have correct tmu in use..
        if ( mode == GL_QUADS )
@@@ -2311,3 -2289,42 +2489,42 @@@ void glRenderbufferStorage( GLenum targ
        FlushOnStateChange( );
        glEsImpl->glRenderbufferStorage( target, internalformat, width, height );
  }
+ void glBindBufferARB( GLuint target, GLuint index )
+ {
+       static int sindex;
+       if( index && !sindex && !skipnanogl )
+               FlushOnStateChange();
+       glEsImpl->glDisableClientState( GL_COLOR_ARRAY );
+       glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+                currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
+       skipnanogl = (!!index) || vboarray;
+       glEsImpl->glBindBuffer( target, index );
+       if( sindex && !index )
+       {
+               arraysValid = GL_FALSE;
+       }
+       sindex = index;
+ }
+ void glGenBuffersARB( GLuint count, GLuint *indexes )
+ {
+       glEsImpl->glGenBuffers( count, indexes );
+ }
+ void glDeleteBuffersARB( GLuint count, GLuint *indexes )
+ {
+       glEsImpl->glDeleteBuffers( count, indexes );
+ }
+ void glBufferDataARB( GLuint target, GLuint size, void *buffer, GLuint type )
+ {
+       glEsImpl->glBufferData( target, size, buffer, type );
+ }
+ void glBufferSubDataARB( GLuint target, GLsizei offset, GLsizei size, void *buffer )
+ {
+       glEsImpl->glBufferSubData( target, offset, size, buffer );
+ }