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)
GL/gl.h
GL/glesinterface.h
nanoWrap.cpp
nanogl.cpp

diff --git a/GL/gl.h b/GL/gl.h
index d027d132846c2d456e365bd6713356ae343dcd89..833e96627db715bfe71e281c3a6611bed833c38e 100644 (file)
--- a/GL/gl.h
+++ b/GL/gl.h
@@ -572,6 +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 );
@@ -724,6 +726,17 @@ void glMultiTexCoord2f( GLenum, GLfloat, 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
index 710dfd33bbb54a959a8f2e2b39bddcb4b10cc8d1..acb21bee96100f58706356c57fe64d618a581f56 100644 (file)
@@ -242,6 +242,8 @@ struct GlESInterface
        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 )
index 8fc82906ff06e3413374b0022a1b409e76e2c62c..41eb4dda9ebacbbba3d3194bbb89ac8f3c115311 100644 (file)
@@ -67,6 +67,7 @@ struct nanoState
        GLboolean scissor_test;
        GLboolean stencil_test;
        GLboolean depthmask;
+       GLboolean stupidglesbug;
        GLclampf depth_range_near;
        GLclampf depth_range_far;
        GLenum depth_func;
@@ -80,7 +81,7 @@ struct nanoState
 static struct nanoState nanoglState;
 
 static struct nanoState nanoglInitState =
-    {
+{
         GL_FALSE,
         GL_FALSE,
         GL_FALSE,
@@ -113,6 +114,7 @@ static struct nanoState nanoglInitState =
         GL_FALSE,
         GL_FALSE,
         GL_TRUE,
+               GL_FALSE,
         0.0f,
         1.0f,
         GL_LESS,
@@ -244,6 +246,8 @@ static GLushort *ptrIndexArray = NULL;
 
 static GLboolean arraysValid = GL_FALSE;
 
+static GLboolean skipnanogl;
+
 void InitGLStructs( )
 {
        ptrVertexAttribArray     = vertexattribs;
@@ -329,7 +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 );
 
@@ -338,10 +343,13 @@ void ResetNanoState( )
        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;
@@ -520,6 +528,11 @@ void glEnd( void )
 
 void glEnable( GLenum cap )
 {
+       if( skipnanogl )
+       {
+               glEsImpl->glEnable( cap );
+               return;
+       }
        GLboolean statechanged = GL_FALSE;
        switch ( cap )
        {
@@ -779,11 +792,11 @@ void glEnable( GLenum cap )
        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:
@@ -797,6 +810,17 @@ void glEnable( GLenum cap )
                }
                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;
        }
@@ -810,6 +834,11 @@ void glEnable( GLenum cap )
 
 void glDisable( GLenum cap )
 {
+       if( skipnanogl )
+       {
+               glEsImpl->glDisable( cap );
+               return;
+       }
        GLboolean statechanged = GL_FALSE;
        switch ( cap )
        {
@@ -1069,11 +1098,11 @@ void glDisable( GLenum cap )
        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:
@@ -1087,6 +1116,17 @@ void glDisable( GLenum cap )
                }
                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 +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 );
 }
 
@@ -1353,11 +1402,23 @@ void glVertex3f( GLfloat x, GLfloat y, GLfloat z )
 }
 
 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 )
@@ -1366,15 +1427,30 @@ 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 )
@@ -1383,16 +1459,31 @@ 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 )
@@ -1401,6 +1492,9 @@ 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 +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 +1564,24 @@ void glHint( GLenum target, GLenum mode )
 
 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 +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 +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 +1756,11 @@ GLenum glGetError( void )
 
 void glActiveTexture( GLenum texture )
 {
+       if( skipnanogl )
+       {
+               glEsImpl->glActiveTexture( texture );
+               return;
+       }
        if ( activetmu == texture )
        {
                return;
@@ -1657,6 +1787,11 @@ void glActiveTexture( GLenum texture )
 
 void glClientActiveTexture( GLenum texture )
 {
+       if( skipnanogl )
+       {
+               glEsImpl->glClientActiveTexture( texture );
+               return;
+       }
        clientactivetmu = texture;
 }
 
@@ -1724,6 +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( );
@@ -1821,8 +1961,17 @@ void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indi
        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 )
        {
@@ -1878,6 +2027,13 @@ void glEnableClientState( GLenum array )
 }
 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 )
        {
@@ -1933,6 +2089,12 @@ void glDisableClientState( GLenum array )
 }
 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 &&
@@ -1948,6 +2110,11 @@ void glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *poi
 }
 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 +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 +2316,18 @@ void glMultiTexCoord3fARB( GLenum a, GLfloat b, GLfloat c, GLfloat )
        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 +2489,42 @@ void glRenderbufferStorage( GLenum target, GLenum internalformat, GLsizei width,
        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 );
+}
\ No newline at end of file
index 9af6d1d36a6fdc9f898f4c19809a6052b881024e..b0a525f5819d84f4526bf12afc0207024ea7809b 100644 (file)
@@ -322,6 +322,10 @@ int nanoGL_Init( )
        *( (void **)&glEsImpl->glDeleteRenderbuffers ) = (void *)glEsImpl->eglGetProcAddress( "glDeleteRenderbuffersOES" );
        *( (void **)&glEsImpl->glDeleteFramebuffers ) = (void *)glEsImpl->eglGetProcAddress( "glDeleteFramebuffersOES" );
        *( (void **)&glEsImpl->glFramebufferRenderbuffer ) = (void *)glEsImpl->eglGetProcAddress( "glFramebufferRenderbufferOES" );
+       *( (void **)&glEsImpl->glTexGeniOES ) = (void *)glEsImpl->eglGetProcAddress( "glTexGeniOES" );
+       *( (void **)&glEsImpl->glTexGenfvOES ) = (void *)glEsImpl->eglGetProcAddress( "glTexGenfv" );
+
+
 #endif
 
        // Init nanoGL