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
}
}
-/*
-#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++)
}
}
+// 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)
{
if (mesh_var)
{
float *out = varray_texcoord2f[tmu];
- while (--numverts)
+ while (numverts--)
{
*out++ = *texcoord2f++;
*out++ = *texcoord2f++;
if (mesh_var)
{
float *out = varray_color4f;
- while (--numverts)
+ while (numverts--)
{
*out++ = *color4f++;
*out++ = *color4f++;
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
//===========================================================================