From fffbad8853e5849c64227635db70e5ce980d2f26 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Tue, 18 Jan 2011 07:10:14 +0000 Subject: [PATCH] Fix generic attribute arrays and array enabledness tracking --- flavors/gl/source/glstate.cpp | 83 ++++++++++++++++++++++------------- flavors/gl/source/glstate.h | 3 +- 2 files changed, 54 insertions(+), 32 deletions(-) diff --git a/flavors/gl/source/glstate.cpp b/flavors/gl/source/glstate.cpp index f910b49..e3c9871 100644 --- a/flavors/gl/source/glstate.cpp +++ b/flavors/gl/source/glstate.cpp @@ -84,6 +84,13 @@ GlState::GlState(): texcoord_arrays[i].index = i; } + decoder->glEnableClientState = glEnableClientState; + decoder->glDisableClientState = glDisableClientState; + decoder->glEnableVertexAttribArray = glEnableVertexAttribArray; + decoder->glEnableVertexAttribArrayARB = glEnableVertexAttribArray; + decoder->glDisableVertexAttribArray = glDisableVertexAttribArray; + decoder->glDisableVertexAttribArrayARB = glDisableVertexAttribArray; + decoder->glColor3ub = wrap_normalized; decoder->glColor3ubv = wrap_array >; decoder->glColor4ub = wrap_normalized; @@ -117,6 +124,8 @@ GlState::GlState(): decoder->glClientActiveTexture = glClientActiveTexture; decoder->glClientActiveTextureARB = glClientActiveTexture; decoder->glTexCoordPointer = glTexCoordPointer; + decoder->glVertexAttribPointer = glVertexAttribPointer; + decoder->glVertexAttribPointerARB = glVertexAttribPointer; decoder->glBindBuffer = glBindBuffer; decoder->glBindBufferARB = glBindBuffer; @@ -158,6 +167,35 @@ const BufferState &GlState::get_buffer(unsigned id) const return i->second; } +const ArrayState &GlState::get_array(GLenum array) const +{ + if(array==GL_VERTEX_ARRAY) + return vertex_array; + else if(array==GL_NORMAL_ARRAY) + return normal_array; + else if(array==GL_COLOR_ARRAY) + return color_array; + else if(array==GL_TEXTURE_COORD_ARRAY) + return texcoord_arrays[client_active_tex]; + else + throw logic_error("Invalid array"); +} + +const ArrayState &GlState::get_texture_coord_array(unsigned index) const +{ + return texcoord_arrays[index]; +} + +const ArrayState &GlState::get_attrib_array(unsigned index) const +{ + map::const_iterator i = attrib_arrays.find(index); + if(i!=attrib_arrays.end()) + return i->second; + + // XXX Return a dummy? + throw runtime_error("Unknown attribute array"); +} + const BufferState *GlState::get_current_buffer(GLenum target) const { return const_cast(this)->get_current_buffer(target); @@ -192,35 +230,6 @@ BufferState *GlState::get_current_buffer(GLenum target) return 0; } -const ArrayState &GlState::get_array(GLenum array) const -{ - if(array==GL_VERTEX_ARRAY) - return vertex_array; - else if(array==GL_NORMAL_ARRAY) - return normal_array; - else if(array==GL_COLOR_ARRAY) - return color_array; - else if(array==GL_TEXTURE_COORD_ARRAY) - return texcoord_arrays[client_active_tex]; - else - throw logic_error("Invalid array"); -} - -const ArrayState &GlState::get_texture_coord_array(unsigned index) const -{ - return texcoord_arrays[index]; -} - -const ArrayState &GlState::get_attrib_array(unsigned index) const -{ - map::const_iterator i = attrib_arrays.find(index); - if(i!=attrib_arrays.end()) - return i->second; - - // XXX Return a dummy? - throw runtime_error("Unknown attribute array"); -} - void GlState::set_current_texture(GLenum target, unsigned id) { TexUnitState &unit = texunits[active_tex]; @@ -255,6 +264,18 @@ void GlState::set_current_buffer(GLenum target, unsigned id) element_buffer = buf; } +ArrayState &GlState::get_attrib_array(unsigned index) +{ + map::iterator i = attrib_arrays.find(index); + if(i!=attrib_arrays.end()) + return i->second; + + ArrayState &array = attrib_arrays[index]; + array.index = index; + + return array; +} + // Boolean state void GlState::glEnableClientState(void *user_data, GLenum state) @@ -387,10 +408,10 @@ void GlState::glTexCoordPointer(void *user_data, int size, GLenum type, int stri self->texcoord_arrays[self->client_active_tex].set(size, type, false, stride, self->array_buffer, reinterpret_cast(data)); } -void GlState::glVertexAttribPointer(void *user_data, unsigned index, int size, GLenum type, int norm, int stride, const void *data) +void GlState::glVertexAttribPointer(void *user_data, unsigned index, int size, GLenum type, unsigned char norm, int stride, const void *data) { GlState *self = reinterpret_cast(user_data); - self->attrib_arrays[index].set(size, type, norm, stride, self->array_buffer, reinterpret_cast(data)); + self->get_attrib_array(index).set(size, type, norm, stride, self->array_buffer, reinterpret_cast(data)); } // Buffer objects diff --git a/flavors/gl/source/glstate.h b/flavors/gl/source/glstate.h index 43e8f39..ab70c67 100644 --- a/flavors/gl/source/glstate.h +++ b/flavors/gl/source/glstate.h @@ -86,6 +86,7 @@ private: BufferState *get_current_buffer(GLenum); void set_current_texture(GLenum, unsigned); void set_current_buffer(GLenum, unsigned); + ArrayState &get_attrib_array(unsigned); static void glEnableClientState(void *, GLenum); static void glDisableClientState(void *, GLenum); @@ -113,7 +114,7 @@ private: static void glColorPointer(void *, int, GLenum, int, const void *); static void glClientActiveTexture(void *, unsigned); static void glTexCoordPointer(void *, int, GLenum, int, const void *); - static void glVertexAttribPointer(void *, unsigned, int, GLenum, int, int, const void *); + static void glVertexAttribPointer(void *, unsigned, int, GLenum, unsigned char, int, const void *); static void glBindBuffer(void *, GLenum, unsigned); static void glBufferData(void *, GLenum, int, const void *, GLenum); -- 2.45.2