]> git.tdb.fi Git - gldbg.git/blobdiff - flavors/gl/source/glstate.cpp
More complete support for textures
[gldbg.git] / flavors / gl / source / glstate.cpp
index 750d70315835a45395512512ce04ff2a2963cf3d..fc355c7972aceb2a9b2f7e174eefe070b7766219 100644 (file)
@@ -80,6 +80,8 @@ GlState::GlState():
 
        decoder->glGetIntegerv = glGetIntegerv;
 
+       decoder->glEnable = glEnable;
+       decoder->glDisable = glDisable;
        decoder->glEnableClientState = glEnableClientState;
        decoder->glDisableClientState = glDisableClientState;
 
@@ -197,6 +199,21 @@ void GlState::glGetIntegerv(void *user_data, GLenum pname, int *param)
 // 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;
@@ -211,16 +228,26 @@ bool &GlState::get_boolean_state(GLenum state)
        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)
@@ -499,10 +526,36 @@ void GlState::glBindTexture(void *user_data, GLenum target, unsigned id)
        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)