]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
Overhauled bouncegrid light splatting for performance reasons - instead of a series...
[xonotic/darkplaces.git] / gl_backend.c
index 663c5f86fe951f11bd330836e659a0a3acb51cb8..1606c4af6c2bd9175a421bc2a1d8f07feddcd74e 100644 (file)
@@ -561,7 +561,7 @@ static void R_Viewport_ApplyNearClipPlaneFloatGL(const r_viewport_t *v, float *m
        Matrix4x4_Transform3x3(&v->viewmatrix, normal, clipPlane);
        VectorScale(normal, -dist, v3);
        Matrix4x4_Transform(&v->viewmatrix, v3, v4);
-       // FIXME: LordHavoc: I think this can be done more efficiently somehow but I can't remember the technique
+       // FIXME: LadyHavoc: I think this can be done more efficiently somehow but I can't remember the technique
        clipPlane[3] = -DotProduct(v4, clipPlane);
 
        // Calculate the clip-space corner point opposite the clipping plane
@@ -1916,7 +1916,7 @@ void R_Mesh_VertexPointer(int components, int gltype, size_t stride, const void
                        gl_state.pointer_vertex_offset = bufferoffset;
                        CHECKGLERROR
                        GL_BindVBO(bufferobject);
-                       // LordHavoc: special flag added to gltype for unnormalized types
+                       // LadyHavoc: special flag added to gltype for unnormalized types
                        qglVertexAttribPointer(GLSLATTRIB_POSITION, components, gltype & ~0x80000000, (gltype & 0x80000000) == 0, (GLsizei)stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
                }
                break;
@@ -1952,7 +1952,7 @@ void R_Mesh_ColorPointer(int components, int gltype, size_t stride, const void *
                                gl_state.pointer_color_offset = bufferoffset;
                                CHECKGLERROR
                                GL_BindVBO(bufferobject);
-                               // LordHavoc: special flag added to gltype for unnormalized types
+                               // LadyHavoc: special flag added to gltype for unnormalized types
                                qglVertexAttribPointer(GLSLATTRIB_COLOR, components, gltype & ~0x80000000, (gltype & 0x80000000) == 0, (GLsizei)stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
                        }
                }
@@ -2004,7 +2004,7 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, int components, int gltype, si
                                unit->pointer_texcoord_vertexbuffer = vertexbuffer;
                                unit->pointer_texcoord_offset = bufferoffset;
                                GL_BindVBO(bufferobject);
-                               // LordHavoc: special flag added to gltype for unnormalized types
+                               // LadyHavoc: special flag added to gltype for unnormalized types
                                qglVertexAttribPointer(unitnum+GLSLATTRIB_TEXCOORD0, components, gltype & ~0x80000000, (gltype & 0x80000000) == 0, (GLsizei)stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
                        }
                }
@@ -2067,39 +2067,52 @@ void R_Mesh_TexBind(unsigned int unitnum, rtexture_t *tex)
        int texnum;
        if (unitnum >= MAX_TEXTUREUNITS)
                Sys_Error("R_Mesh_TexBind: unitnum %i > max units %i\n", unitnum, MAX_TEXTUREUNITS);
-       if (unit->texture == tex)
-               return;
        switch(vid.renderpath)
        {
        case RENDERPATH_GL32:
        case RENDERPATH_GLES2:
-               if (!tex)
+               if (tex)
                {
-                       tex = r_texture_white;
-                       // not initialized enough yet...
-                       if (!tex)
-                               return;
+                       texnum = R_GetTexture(tex);
+                       switch (tex->gltexturetypeenum)
+                       {
+                       case GL_TEXTURE_2D:
+                               if (unit->t2d != texnum) { GL_ActiveTexture(unitnum);qglBindTexture(GL_TEXTURE_2D, texnum); CHECKGLERROR unit->t2d = texnum; }
+                               if (unit->t3d) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_3D, 0); CHECKGLERROR unit->t3d = 0; }
+                               if (unit->tcubemap) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_CUBE_MAP, 0); CHECKGLERROR unit->tcubemap = 0; }
+                               break;
+                       case GL_TEXTURE_3D:
+                               if (unit->t2d) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_2D, 0); CHECKGLERROR unit->t2d = 0; }
+                               if (unit->t3d != texnum) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_3D, texnum); CHECKGLERROR unit->t3d = texnum; }
+                               if (unit->tcubemap) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_CUBE_MAP, 0); CHECKGLERROR unit->tcubemap = 0; }
+                               break;
+                       case GL_TEXTURE_CUBE_MAP:
+                               if (unit->t2d) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_2D, 0); CHECKGLERROR unit->t2d = 0; }
+                               if (unit->t3d) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_3D, 0); CHECKGLERROR unit->t3d = 0; }
+                               if (unit->tcubemap != texnum) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_CUBE_MAP, texnum); CHECKGLERROR unit->tcubemap = texnum; }
+                               break;
+                       }
                }
-               unit->texture = tex;
-               texnum = R_GetTexture(tex);
-               switch(tex->gltexturetypeenum)
+               else
                {
-               case GL_TEXTURE_2D: if (unit->t2d != texnum) {GL_ActiveTexture(unitnum);unit->t2d = texnum;qglBindTexture(GL_TEXTURE_2D, unit->t2d);CHECKGLERROR}break;
-               case GL_TEXTURE_3D: if (unit->t3d != texnum) {GL_ActiveTexture(unitnum);unit->t3d = texnum;qglBindTexture(GL_TEXTURE_3D, unit->t3d);CHECKGLERROR}break;
-               case GL_TEXTURE_CUBE_MAP: if (unit->tcubemap != texnum) {GL_ActiveTexture(unitnum);unit->tcubemap = texnum;qglBindTexture(GL_TEXTURE_CUBE_MAP, unit->tcubemap);CHECKGLERROR}break;
+                       if (unit->t2d) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_2D, 0); CHECKGLERROR unit->t2d = 0; }
+                       if (unit->t3d) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_3D, 0); CHECKGLERROR unit->t3d = 0; }
+                       if (unit->tcubemap) { GL_ActiveTexture(unitnum); qglBindTexture(GL_TEXTURE_CUBE_MAP, 0); CHECKGLERROR unit->tcubemap = 0; }
                }
-               break;
        }
+       unit->texture = tex;
 }
 
 void R_Mesh_ResetTextureState(void)
 {
+#if 0
        unsigned int unitnum;
-
+       
        BACKENDACTIVECHECK
 
        for (unitnum = 0;unitnum < MAX_TEXTUREUNITS;unitnum++)
                R_Mesh_TexBind(unitnum, NULL);
+#endif
 }
 
 void R_Mesh_PrepareVertices_Vertex3f(int numvertices, const float *vertex3f, const r_meshbuffer_t *vertexbuffer, int bufferoffset)