diff --git a/nanoWrap.cpp b/nanoWrap.cpp
index 5c5eec805314a6a8deb061897e67b88e7b0e7d54..62e37ad3382b9be144ba24a03a1b5324629a60c9 100644 (file)
--- a/nanoWrap.cpp
+++ b/nanoWrap.cpp
static GLboolean skipnanogl;
static GLboolean skipnanogl;
+#define STACK_ATTRIB_ENABLE_BIT_LEN (sizeof(stackAttribEnableBit) / sizeof(stackAttribEnableBit[0]))
+static const GLenum stackAttribEnableBit[] =
+{
+ GL_ALPHA_TEST,
+ GL_BLEND,
+ GL_CLIP_PLANE0,
+ GL_CLIP_PLANE1,
+ GL_CLIP_PLANE2,
+ GL_CLIP_PLANE3,
+ GL_CLIP_PLANE4,
+ GL_CLIP_PLANE5,
+ GL_COLOR_MATERIAL,
+ GL_CULL_FACE,
+ GL_DEPTH_TEST,
+ GL_DITHER,
+ GL_FOG,
+ GL_LIGHT0,
+ GL_LIGHT1,
+ GL_LIGHT2,
+ GL_LIGHT3,
+ GL_LIGHT4,
+ GL_LIGHT5,
+ GL_LIGHT6,
+ GL_LIGHT7,
+ GL_LIGHTING,
+ GL_LINE_SMOOTH,
+ GL_COLOR_LOGIC_OP,
+ GL_MULTISAMPLE,
+ GL_NORMALIZE,
+ GL_POINT_SMOOTH,
+ GL_POLYGON_OFFSET_LINE,
+ GL_POLYGON_OFFSET_FILL,
+ GL_POLYGON_OFFSET_POINT,
+ GL_POLYGON_SMOOTH,
+ GL_POLYGON_STIPPLE,
+ GL_SAMPLE_ALPHA_TO_COVERAGE,
+ GL_SAMPLE_ALPHA_TO_ONE,
+ GL_SAMPLE_COVERAGE,
+ GL_SCISSOR_TEST,
+ GL_STENCIL_TEST,
+ GL_TEXTURE_1D,
+ GL_TEXTURE_2D,
+ GL_TEXTURE_GEN_S,
+ GL_TEXTURE_GEN_T,
+ GL_TEXTURE_GEN_R,
+ GL_TEXTURE_GEN_Q,
+};
+
+#define MAX_ATTRIB_STACK 16
+struct attribStore
+{
+ GLbitfield mask;
+ GLboolean enable[STACK_ATTRIB_ENABLE_BIT_LEN];
+};
+
+static struct attribStore attribStack[MAX_ATTRIB_STACK];
+static int attribStackCount = 0;
+
void InitGLStructs( )
{
ptrVertexAttribArray = vertexattribs;
void InitGLStructs( )
{
ptrVertexAttribArray = vertexattribs;
vertexMark = 0;
indexbase = 0;
arraysValid = GL_FALSE;
vertexMark = 0;
indexbase = 0;
arraysValid = GL_FALSE;
+
+ memset(attribStack, 0, sizeof( struct attribStore ));
+ attribStackCount = 0;
}
void ResetNanoState( )
}
void ResetNanoState( )
arraysValid = GL_FALSE;
skipnanogl = GL_FALSE;
arraysValid = GL_FALSE;
skipnanogl = GL_FALSE;
+
+ memset(attribStack, 0, sizeof( struct attribStore ));
+ attribStackCount = 0;
}
void FlushOnStateChange( )
}
void FlushOnStateChange( )
}
case GL_STENCIL_TEST:
{
}
case GL_STENCIL_TEST:
{
- return;
if (!nanoglState.stencil_test)
if (!nanoglState.stencil_test)
- {
- nanoglState.stencil_test = GL_TRUE;
- statechanged = GL_TRUE;
- }
+ {
+ nanoglState.stencil_test = GL_TRUE;
+ statechanged = GL_TRUE;
+ }
break;
}
case GL_TEXTURE_2D:
break;
}
case GL_TEXTURE_2D:
}
case GL_STENCIL_TEST:
{
}
case GL_STENCIL_TEST:
{
- return;
if (nanoglState.stencil_test)
if (nanoglState.stencil_test)
- {
- nanoglState.stencil_test = GL_FALSE;
- statechanged = GL_TRUE;
- }
+ {
+ nanoglState.stencil_test = GL_FALSE;
+ statechanged = GL_TRUE;
+ }
break;
}
case GL_TEXTURE_2D:
break;
}
case GL_TEXTURE_2D:
@@ -1281,7 +1343,7 @@ void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei wid
{
unsigned char *data = (unsigned char*)pixels;
{
unsigned char *data = (unsigned char*)pixels;
- if( internalformat == GL_RGB && format == GL_RGBA ) // strip alpha from texture
+ if( pixels && internalformat == GL_RGB && format == GL_RGBA ) // strip alpha from texture
{
unsigned char *in = data, *out;
int i = 0, size = width * height * 4;
{
unsigned char *in = data, *out;
int i = 0, size = width * height * 4;
}
void glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha )
{
}
void glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha )
{
+ FlushOnStateChange( );
+ glEsImpl->glColorMask( red, green, blue, alpha );
}
void glStencilFunc( GLenum func, GLint ref, GLuint mask )
{
}
void glStencilFunc( GLenum func, GLint ref, GLuint mask )
{
+ FlushOnStateChange( );
+ glEsImpl->glStencilFunc( func, ref, mask );
}
void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass )
{
}
void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass )
{
+ FlushOnStateChange( );
+ glEsImpl->glStencilOp( fail, zfail, zpass );
}
struct ptrstate vertex_array;
}
struct ptrstate vertex_array;
@@ -1913,6 +1981,9 @@ void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indi
else
{
glEsImpl->glDisableClientState( GL_COLOR_ARRAY );
else
{
glEsImpl->glDisableClientState( GL_COLOR_ARRAY );
+ glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+ currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
+
}
glEsImpl->glColorPointer( tmuState0.color_array.size,
tmuState0.color_array.type,
}
glEsImpl->glColorPointer( tmuState0.color_array.size,
tmuState0.color_array.type,
}
void glStencilMask( GLuint mask )
{
}
void glStencilMask( GLuint mask )
{
+ FlushOnStateChange( );
+ glEsImpl->glStencilMask( mask );
}
void glClearStencil( GLint s )
{
}
void glClearStencil( GLint s )
{
+ FlushOnStateChange( );
+ glEsImpl->glClearStencil( s );
}
#if defined( __MULTITEXTURE_SUPPORT__ )
}
#if defined( __MULTITEXTURE_SUPPORT__ )
else
{
glEsImpl->glDisableClientState( GL_COLOR_ARRAY );
else
{
glEsImpl->glDisableClientState( GL_COLOR_ARRAY );
+ glEsImpl->glColor4f( currentVertexAttrib.red/255.0f, currentVertexAttrib.green/255.0f,
+ currentVertexAttrib.blue/255.0f, currentVertexAttrib.alpha/255.0f );
+
}
glEsImpl->glColorPointer( tmuState0.color_array.size,
tmuState0.color_array.type,
}
glEsImpl->glColorPointer( tmuState0.color_array.size,
tmuState0.color_array.type,
@@ -2547,3 +2625,146 @@ void glBufferSubDataARB( GLuint target, GLsizei offset, GLsizei size, void *buff
{
glEsImpl->glBufferSubData( target, offset, size, buffer );
}
{
glEsImpl->glBufferSubData( target, offset, size, buffer );
}
+
+GLboolean glIsEnabled(GLenum cap)
+{
+ FlushOnStateChange( );
+
+ if( skipnanogl )
+ {
+ return glEsImpl->glIsEnabled(cap);
+ }
+
+ switch ( cap )
+ {
+ case GL_ALPHA_TEST:
+ return nanoglState.alpha_test;
+ case GL_BLEND:
+ return nanoglState.blend;
+ case GL_COLOR_LOGIC_OP:
+ return nanoglState.color_logic_op;
+ case GL_COLOR_MATERIAL:
+ return nanoglState.color_material;
+ case GL_CULL_FACE:
+ return nanoglState.cull_face;
+ case GL_DEPTH_TEST:
+ return nanoglState.depth_test;
+ case GL_DITHER:
+ return nanoglState.dither;
+ case GL_FOG:
+ return nanoglState.fog;
+ case GL_LIGHT0:
+ return nanoglState.light0;
+ case GL_LIGHT1:
+ return nanoglState.light1;
+ case GL_LIGHT2:
+ return nanoglState.light2;
+ case GL_LIGHT3:
+ return nanoglState.light3;
+ case GL_LIGHT4:
+ return nanoglState.light4;
+ case GL_LIGHT5:
+ return nanoglState.light5;
+ case GL_LIGHT6:
+ return nanoglState.light6;
+ case GL_LIGHT7:
+ return nanoglState.light7;
+ case GL_LIGHTING:
+ return nanoglState.lighting;
+ case GL_LINE_SMOOTH:
+ return nanoglState.line_smooth;
+ case GL_MULTISAMPLE:
+ return nanoglState.multisample;
+ case GL_NORMALIZE:
+ return nanoglState.normalize;
+ case GL_POLYGON_OFFSET_FILL:
+ return nanoglState.polygon_offset_fill;
+ case GL_RESCALE_NORMAL:
+ return nanoglState.rescale_normal;
+ case GL_SAMPLE_ALPHA_TO_COVERAGE:
+ return nanoglState.sample_alpha_to_coverage;
+ case GL_SAMPLE_ALPHA_TO_ONE:
+ return nanoglState.sample_alpha_to_one;
+ case GL_SAMPLE_COVERAGE:
+ return nanoglState.sample_coverage;
+ case GL_SCISSOR_TEST:
+ return nanoglState.scissor_test;
+ case GL_STENCIL_TEST:
+ return nanoglState.stencil_test;
+ case GL_TEXTURE_2D:
+ return activetmuState->texture_2d.value;
+ default:
+ return glIsEnabled(cap);
+ }
+}
+
+void glPushAttrib(GLbitfield mask)
+{
+ FlushOnStateChange( );
+
+ if( (attribStackCount < 0) || (attribStackCount > MAX_ATTRIB_STACK) )
+ {
+ return;
+ }
+
+ attribStack[attribStackCount].mask = mask;
+
+ if( mask & GL_ENABLE_BIT )
+ {
+ for(int i = 0; i < STACK_ATTRIB_ENABLE_BIT_LEN; i++)
+ {
+ attribStack[attribStackCount].enable[i] = glIsEnabled(stackAttribEnableBit[i]);
+ }
+ }
+
+ if( mask & GL_COLOR_BUFFER_BIT )
+ {
+ // TODO
+ }
+
+ if( mask & GL_CURRENT_BIT )
+ {
+ // TODO
+ }
+
+ attribStackCount += 1;
+}
+
+void glPopAttrib()
+{
+ FlushOnStateChange( );
+
+ attribStackCount -= 1;
+ if((attribStackCount < 0) || (attribStackCount > MAX_ATTRIB_STACK))
+ {
+ attribStackCount += 1;
+ return;
+ }
+
+ GLbitfield mask = attribStack[attribStackCount].mask;
+
+ if( mask & GL_ENABLE_BIT )
+ {
+ for(int i = 0; i < STACK_ATTRIB_ENABLE_BIT_LEN; i++)
+ {
+ if( attribStack[attribStackCount].enable[i] )
+ {
+ glEnable(stackAttribEnableBit[i]);
+ }
+ else
+ {
+ glDisable(stackAttribEnableBit[i]);
+ }
+ }
+ }
+
+ if( mask & GL_COLOR_BUFFER_BIT )
+ {
+ // TODO
+ }
+
+ if( mask & GL_CURRENT_BIT )
+ {
+ // TODO
+ }
+}