decoder->glGetIntegerv = glGetIntegerv;
+ decoder->glEnable = glEnable;
+ decoder->glDisable = glDisable;
decoder->glEnableClientState = glEnableClientState;
decoder->glDisableClientState = glDisableClientState;
// Boolean state
bool &GlState::get_boolean_state(GLenum state)
+{
+ if(state==GL_TEXTURE_1D)
+ return texunits[active_tex].binding_1d.enabled;
+ else if(state==GL_TEXTURE_2D)
+ return texunits[active_tex].binding_2d.enabled;
+ else if(state==GL_TEXTURE_3D)
+ return texunits[active_tex].binding_3d.enabled;
+ else if(state==GL_TEXTURE_CUBE_MAP)
+ return texunits[active_tex].binding_cube.enabled;
+
+ static bool dummy;
+ return dummy;
+}
+
+bool &GlState::get_boolean_client_state(GLenum state)
{
if(state==GL_VERTEX_ARRAY)
return vertex_array.enabled;
return dummy;
}
-void GlState::glEnableClientState(void *user_data, GLenum state)
+void GlState::glEnable(void *user_data, GLenum state)
{
reinterpret_cast<GlState *>(user_data)->get_boolean_state(state) = true;
}
-void GlState::glDisableClientState(void *user_data, GLenum state)
+void GlState::glDisable(void *user_data, GLenum state)
{
reinterpret_cast<GlState *>(user_data)->get_boolean_state(state) = false;
}
+void GlState::glEnableClientState(void *user_data, GLenum state)
+{
+ reinterpret_cast<GlState *>(user_data)->get_boolean_client_state(state) = true;
+}
+
+void GlState::glDisableClientState(void *user_data, GLenum state)
+{
+ reinterpret_cast<GlState *>(user_data)->get_boolean_client_state(state) = false;
+}
+
// Vertex attributes
void GlState::glColor3f(void *user_data, float r, float g, float b)
glBindBufferRange(user_data, target, index, id, 0, buffer->size);
}
-void GlState::glBindBufferRange(void *user_data, GLenum target, unsigned index, unsigned id, int offset, int size)
+void GlState::glBindBufferRange(void *user_data, GLenum target, unsigned index, unsigned id, ptrdiff_t offset, ptrdiff_t size)
{
GlState *self = reinterpret_cast<GlState *>(user_data);
if(BufferBindingState *binding = self->get_buffer_binding(target, index))
}
}
-void GlState::glBufferData(void *user_data, GLenum target, int size, const void *data, GLenum usage)
+void GlState::glBufferData(void *user_data, GLenum target, ptrdiff_t size, const void *data, GLenum usage)
{
if(BufferState *buf = reinterpret_cast<GlState *>(user_data)->get_current_buffer(target))
buf->set_data(size, data, usage);
}
-void GlState::glBufferSubData(void *user_data, GLenum target, int offset, int size, const void *data)
+void GlState::glBufferSubData(void *user_data, GLenum target, ptrdiff_t offset, ptrdiff_t size, const void *data)
{
if(BufferState *buf = reinterpret_cast<GlState *>(user_data)->get_current_buffer(target))
buf->set_sub_data(offset, size, data);
reinterpret_cast<GlState *>(user_data)->set_current_texture(target, id);
}
+void GlState::glTexImage1D(void *user_data, GLenum target, int level, int ifmt, int width, int, GLenum, GLenum, const void *)
+{
+ if(TextureState *tex = reinterpret_cast<GlState *>(user_data)->get_current_texture(target))
+ tex->set_image_1d(level, ifmt, width);
+}
+
void GlState::glTexImage2D(void *user_data, GLenum target, int level, int ifmt, int width, int height, int, GLenum, GLenum, const void *)
+{
+ GLenum face = 0;
+ for(unsigned i=0; i<6; ++i)
+ if(texture_cube_faces[i]==target)
+ {
+ face = target;
+ target = GL_TEXTURE_CUBE_MAP;
+ break;
+ }
+
+ if(TextureState *tex = reinterpret_cast<GlState *>(user_data)->get_current_texture(target))
+ {
+ if(face)
+ tex->set_face_image_2d(face, level, ifmt, width, height);
+ else
+ tex->set_image_2d(level, ifmt, width, height);
+ }
+}
+
+void GlState::glTexImage3D(void *user_data, GLenum target, int level, int ifmt, int width, int height, int depth, int, GLenum, GLenum, const void *)
{
if(TextureState *tex = reinterpret_cast<GlState *>(user_data)->get_current_texture(target))
- tex->set_image_2d(level, ifmt, width, height);
+ tex->set_image_3d(level, ifmt, width, height, depth);
}
void GlState::glTexParameteri(void *user_data, GLenum target, GLenum param, int value)