Properly restore enabled client state when using immediate mode
This commit is contained in:
parent
edae8a9166
commit
9b0322ce8a
10
GL/draw.c
10
GL/draw.c
|
@ -22,12 +22,6 @@ static AttribPointer ST_POINTER;
|
||||||
static AttribPointer NORMAL_POINTER;
|
static AttribPointer NORMAL_POINTER;
|
||||||
static AttribPointer DIFFUSE_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 GLuint ENABLED_VERTEX_ATTRIBUTES = 0;
|
||||||
static GLubyte ACTIVE_CLIENT_TEXTURE = 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 (*ByteParseFunc)(GLubyte* out, const GLubyte* in);
|
||||||
typedef void (*PolyBuildFunc)(ClipVertex* first, ClipVertex* previous, ClipVertex* vertex, ClipVertex* next, const GLsizei i);
|
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) {
|
static inline void _parseVec3FromShort3(GLfloat* out, const GLubyte* in) {
|
||||||
GLshort* ptr = (GLshort*) in;
|
GLshort* ptr = (GLshort*) in;
|
||||||
|
|
||||||
|
|
|
@ -154,6 +154,13 @@ void APIENTRY glNormal3fv(const GLfloat* v) {
|
||||||
void APIENTRY glEnd() {
|
void APIENTRY glEnd() {
|
||||||
IMMEDIATE_MODE_ACTIVE = GL_FALSE;
|
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 */
|
/* FIXME: Push pointer state */
|
||||||
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
@ -168,23 +175,48 @@ void APIENTRY glEnd() {
|
||||||
glGetIntegerv(GL_CLIENT_ACTIVE_TEXTURE, &activeTexture);
|
glGetIntegerv(GL_CLIENT_ACTIVE_TEXTURE, &activeTexture);
|
||||||
|
|
||||||
glClientActiveTextureARB(GL_TEXTURE0);
|
glClientActiveTextureARB(GL_TEXTURE0);
|
||||||
|
glGetBooleanv(GL_TEXTURE_COORD_ARRAY, &texArray0Enabled);
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glTexCoordPointer(2, GL_FLOAT, 0, UV_COORDS.data);
|
glTexCoordPointer(2, GL_FLOAT, 0, UV_COORDS.data);
|
||||||
|
|
||||||
glClientActiveTextureARB(GL_TEXTURE1);
|
glClientActiveTextureARB(GL_TEXTURE1);
|
||||||
|
glGetBooleanv(GL_TEXTURE_COORD_ARRAY, &texArray1Enabled);
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glTexCoordPointer(2, GL_FLOAT, 0, ST_COORDS.data);
|
glTexCoordPointer(2, GL_FLOAT, 0, ST_COORDS.data);
|
||||||
|
|
||||||
glDrawArrays(ACTIVE_POLYGON_MODE, 0, VERTICES.size / 3);
|
glDrawArrays(ACTIVE_POLYGON_MODE, 0, VERTICES.size / 3);
|
||||||
|
|
||||||
glClientActiveTextureARB((GLuint) activeTexture);
|
|
||||||
|
|
||||||
aligned_vector_clear(&VERTICES);
|
aligned_vector_clear(&VERTICES);
|
||||||
aligned_vector_clear(&COLOURS);
|
aligned_vector_clear(&COLOURS);
|
||||||
aligned_vector_clear(&UV_COORDS);
|
aligned_vector_clear(&UV_COORDS);
|
||||||
aligned_vector_clear(&ST_COORDS);
|
aligned_vector_clear(&ST_COORDS);
|
||||||
aligned_vector_clear(&NORMALS);
|
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 */
|
/* FIXME: Pop pointers */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,12 @@
|
||||||
#define TRACE_ENABLED 0
|
#define TRACE_ENABLED 0
|
||||||
#define TRACE() if(TRACE_ENABLED) {fprintf(stderr, "%s\n", __func__);}
|
#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 MAX_TEXTURE_SIZE 1024
|
||||||
|
|
||||||
#define CLIP_VERTEX_INT_PADDING 6
|
#define CLIP_VERTEX_INT_PADDING 6
|
||||||
|
@ -99,6 +105,8 @@ GLubyte _glKosInitTextures();
|
||||||
|
|
||||||
void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit);
|
void _glUpdatePVRTextureContext(pvr_poly_cxt_t* context, GLshort textureUnit);
|
||||||
|
|
||||||
|
GLuint _glGetEnabledAttributes();
|
||||||
|
|
||||||
TextureObject* getTexture0();
|
TextureObject* getTexture0();
|
||||||
TextureObject* getTexture1();
|
TextureObject* getTexture1();
|
||||||
TextureObject* getBoundTexture();
|
TextureObject* getBoundTexture();
|
||||||
|
|
19
GL/state.c
19
GL/state.c
|
@ -483,10 +483,29 @@ static GLenum COMPRESSED_FORMATS [] = {
|
||||||
static GLint NUM_COMPRESSED_FORMATS = sizeof(COMPRESSED_FORMATS) / sizeof(GLenum);
|
static GLint NUM_COMPRESSED_FORMATS = sizeof(COMPRESSED_FORMATS) / sizeof(GLenum);
|
||||||
|
|
||||||
void APIENTRY glGetBooleanv(GLenum pname, GLboolean* params) {
|
void APIENTRY glGetBooleanv(GLenum pname, GLboolean* params) {
|
||||||
|
GLuint enabledAttrs = _glGetEnabledAttributes();
|
||||||
|
GLuint activeClientTexture = _glGetActiveClientTexture();
|
||||||
|
|
||||||
switch(pname) {
|
switch(pname) {
|
||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
*params = TEXTURES_ENABLED[_glGetActiveTexture()];
|
*params = TEXTURES_ENABLED[_glGetActiveTexture()];
|
||||||
break;
|
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:
|
default:
|
||||||
_glKosThrowError(GL_INVALID_ENUM, __func__);
|
_glKosThrowError(GL_INVALID_ENUM, __func__);
|
||||||
_glKosPrintError();
|
_glKosPrintError();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user