]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
added R_ScrollTexCoord2f (copies while texture coordinates with an offset)
[xonotic/darkplaces.git] / gl_backend.c
index 55788e8934328995d468cdadcb5fc5ff6d0f5671..1ab98969ce70260e7872419c838aef201af7c7d8 100644 (file)
@@ -560,7 +560,7 @@ void GL_SetupTextureState(void)
                        qglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);CHECKGLERROR
                        qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);CHECKGLERROR
                        qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);CHECKGLERROR
-                       qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_CONSTANT_ARB);CHECKGLERROR
+                       qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_TEXTURE);CHECKGLERROR // for GL_INTERPOLATE_ARB mode
                        qglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);CHECKGLERROR
                        qglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);CHECKGLERROR
                        qglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA);CHECKGLERROR
@@ -852,16 +852,6 @@ void R_Mesh_GetSpace(int numverts)
                }
        }
 
-/*
-#ifdef MESH_BATCH
-       if (gl_mesh_batching.integer)
-       {
-               if (gl_batchvertexcount == 0)
-                       gl_batchvertexfirst = varray_offset;
-               gl_batchvertexcount += numverts;
-       }
-#endif
-*/
        varray_vertex3f = varray_buf_vertex3f + varray_offset * 3;
        varray_color4f = varray_buf_color4f + varray_offset * 4;
        for (i = 0;i < backendunits;i++)
@@ -952,6 +942,54 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements)
        }
 }
 
+// renders triangles using vertices from the most recent GetSpace call
+// (can be multiple Draw calls per GetSpace)
+void R_Mesh_Draw_NoBatching(int numverts, int numtriangles, const int *elements)
+{
+       int numelements = numtriangles * 3;
+       if (numtriangles == 0 || numverts == 0)
+       {
+               Con_Printf("R_Mesh_Draw_NoBatching(%d, %d, %08p);\n", numverts, numtriangles, elements);
+               return;
+       }
+       c_meshs++;
+       c_meshelements += numelements;
+       CHECKGLERROR
+       if (gl_state.pointervertexcount)
+       {
+               if (r_render.integer)
+               {
+                       GL_LockArrays(0, gl_state.pointervertexcount);
+                       if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL)
+                       {
+                               qglDrawRangeElements(GL_TRIANGLES, 0, gl_state.pointervertexcount, numelements, GL_UNSIGNED_INT, elements);CHECKGLERROR
+                       }
+                       else
+                       {
+                               qglDrawElements(GL_TRIANGLES, numelements, GL_UNSIGNED_INT, elements);CHECKGLERROR
+                       }
+                       GL_LockArrays(0, 0);
+               }
+       }
+       else
+       {
+               GL_Backend_RenumberElements(varray_buf_elements3i, numelements, elements, varray_offset);
+               if (r_render.integer)
+               {
+                       GL_LockArrays(varray_offset, numverts);
+                       if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL)
+                       {
+                               qglDrawRangeElements(GL_TRIANGLES, varray_offset, varray_offset + numverts, numelements, GL_UNSIGNED_INT, varray_buf_elements3i);CHECKGLERROR
+                       }
+                       else
+                       {
+                               qglDrawElements(GL_TRIANGLES, numelements, GL_UNSIGNED_INT, varray_buf_elements3i);CHECKGLERROR
+                       }
+                       GL_LockArrays(0, 0);
+               }
+       }
+}
+
 // restores backend state, used when done with 3D rendering
 void R_Mesh_Finish(void)
 {
@@ -1545,7 +1583,7 @@ void R_Mesh_CopyTexCoord2f(int tmu, const float *texcoord2f, int numverts)
        if (mesh_var)
        {
                float *out = varray_texcoord2f[tmu];
-               while (--numverts)
+               while (numverts--)
                {
                        *out++ = *texcoord2f++;
                        *out++ = *texcoord2f++;
@@ -1562,7 +1600,7 @@ void R_Mesh_CopyColor4f(const float *color4f, int numverts)
        if (mesh_var)
        {
                float *out = varray_color4f;
-               while (--numverts)
+               while (numverts--)
                {
                        *out++ = *color4f++;
                        *out++ = *color4f++;
@@ -1575,6 +1613,15 @@ void R_Mesh_CopyColor4f(const float *color4f, int numverts)
                memcpy(varray_color4f, color4f, numverts * sizeof(float[4]));
 }
 
+void R_ScrollTexCoord2f (float *out2f, const float *in2f, int numverts, float s, float t)
+{
+       while (numverts--)
+       {
+               *out2f++ = *in2f++ + s;
+               *out2f++ = *in2f++ + t;
+       }
+}
+
 //===========================================================================
 // vertex array caching subsystem
 //===========================================================================