diff --git a/GL/draw.c b/GL/draw.c index a076c0f..6cb7c6b 100644 --- a/GL/draw.c +++ b/GL/draw.c @@ -22,12 +22,6 @@ static AttribPointer ST_POINTER; static AttribPointer NORMAL_POINTER; static AttribPointer DIFFUSE_POINTER; -#define VERTEX_ENABLED_FLAG (1 << 0) -#define UV_ENABLED_FLAG (1 << 1) -#define ST_ENABLED_FLAG (1 << 2) -#define DIFFUSE_ENABLED_FLAG (1 << 3) -#define NORMAL_ENABLED_FLAG (1 << 4) - static GLuint ENABLED_VERTEX_ATTRIBUTES = 0; static GLubyte ACTIVE_CLIENT_TEXTURE = 0; @@ -78,6 +72,10 @@ typedef void (*FloatParseFunc)(GLfloat* out, const GLubyte* in); typedef void (*ByteParseFunc)(GLubyte* out, const GLubyte* in); typedef void (*PolyBuildFunc)(ClipVertex* first, ClipVertex* previous, ClipVertex* vertex, ClipVertex* next, const GLsizei i); +GLuint _glGetEnabledAttributes() { + return ENABLED_VERTEX_ATTRIBUTES; +} + static inline void _parseVec3FromShort3(GLfloat* out, const GLubyte* in) { GLshort* ptr = (GLshort*) in; diff --git a/GL/immediate.c b/GL/immediate.c index 30d7659..0d8308b 100644 --- a/GL/immediate.c +++ b/GL/immediate.c @@ -154,6 +154,13 @@ void APIENTRY glNormal3fv(const GLfloat* v) { void APIENTRY glEnd() { IMMEDIATE_MODE_ACTIVE = GL_FALSE; + GLboolean vertexArrayEnabled, colorArrayEnabled, normalArrayEnabled; + GLboolean texArray0Enabled, texArray1Enabled; + + glGetBooleanv(GL_VERTEX_ARRAY, &vertexArrayEnabled); + glGetBooleanv(GL_COLOR_ARRAY, &colorArrayEnabled); + glGetBooleanv(GL_NORMAL_ARRAY, &normalArrayEnabled); + /* FIXME: Push pointer state */ glEnableClientState(GL_VERTEX_ARRAY); @@ -168,23 +175,48 @@ void APIENTRY glEnd() { glGetIntegerv(GL_CLIENT_ACTIVE_TEXTURE, &activeTexture); glClientActiveTextureARB(GL_TEXTURE0); + glGetBooleanv(GL_TEXTURE_COORD_ARRAY, &texArray0Enabled); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, UV_COORDS.data); glClientActiveTextureARB(GL_TEXTURE1); + glGetBooleanv(GL_TEXTURE_COORD_ARRAY, &texArray1Enabled); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, ST_COORDS.data); glDrawArrays(ACTIVE_POLYGON_MODE, 0, VERTICES.size / 3); - glClientActiveTextureARB((GLuint) activeTexture); - aligned_vector_clear(&VERTICES); aligned_vector_clear(&COLOURS); aligned_vector_clear(&UV_COORDS); aligned_vector_clear(&ST_COORDS); aligned_vector_clear(&NORMALS); + if(!vertexArrayEnabled) { + glDisableClientState(GL_VERTEX_ARRAY); + } + + if(!colorArrayEnabled) { + glDisableClientState(GL_COLOR_ARRAY); + } + + if(!normalArrayEnabled) { + glDisableClientState(GL_NORMAL_ARRAY); + } + + if(!texArray0Enabled) { + glClientActiveTextureARB(GL_TEXTURE0); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } + + if(!texArray1Enabled) { + glClientActiveTextureARB(GL_TEXTURE1); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } + + glClientActiveTextureARB((GLuint) activeTexture); + + /* FIXME: Pop pointers */ } diff --git a/GL/private.h b/GL/private.h index 0494a90..956d309 100644 --- a/GL/private.h +++ b/GL/private.h @@ -9,6 +9,12 @@ #define TRACE_ENABLED 0 #define TRACE() if(TRACE_ENABLED) {fprintf(stderr, "%s\n", __func__);} +#define VERTEX_ENABLED_FLAG (1 << 0) +#define UV_ENABLED_FLAG (1 << 1) +#define ST_ENABLED_FLAG (1 << 2) +#define DIFFUSE_ENABLED_FLAG (1 << 3) +#define NORMAL_ENABLED_FLAG (1 << 4) + #define MAX_TEXTURE_SIZE 1024 #define CLIP_VERTEX_INT_PADDING 6 @@ -99,6 +105,8 @@ GLubyte _glKosInitTextures(); void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit); +GLuint _glGetEnabledAttributes(); + TextureObject* getTexture0(); TextureObject* getTexture1(); TextureObject* getBoundTexture(); diff --git a/GL/state.c b/GL/state.c index 03a5004..13eb477 100644 --- a/GL/state.c +++ b/GL/state.c @@ -483,10 +483,29 @@ static GLenum COMPRESSED_FORMATS [] = { static GLint NUM_COMPRESSED_FORMATS = sizeof(COMPRESSED_FORMATS) / sizeof(GLenum); void APIENTRY glGetBooleanv(GLenum pname, GLboolean* params) { + GLuint enabledAttrs = _glGetEnabledAttributes(); + GLuint activeClientTexture = _glGetActiveClientTexture(); + switch(pname) { case GL_TEXTURE_2D: *params = TEXTURES_ENABLED[_glGetActiveTexture()]; break; + case GL_VERTEX_ARRAY: + *params = (enabledAttrs & VERTEX_ENABLED_FLAG) == VERTEX_ENABLED_FLAG; + break; + case GL_COLOR_ARRAY: + *params = (enabledAttrs & DIFFUSE_ENABLED_FLAG) == DIFFUSE_ENABLED_FLAG; + break; + case GL_NORMAL_ARRAY: + *params = (enabledAttrs & NORMAL_ENABLED_FLAG) == NORMAL_ENABLED_FLAG; + break; + case GL_TEXTURE_COORD_ARRAY: { + if(activeClientTexture == 0) { + *params = (enabledAttrs & UV_ENABLED_FLAG) == UV_ENABLED_FLAG; + } else { + *params = (enabledAttrs & ST_ENABLED_FLAG) == ST_ENABLED_FLAG; + } + } break; default: _glKosThrowError(GL_INVALID_ENUM, __func__); _glKosPrintError();