- }
- else
- {
- qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);CHECKGLERROR
- qglEnable(GL_TEXTURE_2D);CHECKGLERROR
- if (usedarrays)
- {
- qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
- }
- }
- if (usedarrays)
- {
- qglDisableClientState(GL_COLOR_ARRAY);CHECKGLERROR
- qglDisableClientState(GL_VERTEX_ARRAY);CHECKGLERROR
- }
-
- qglDisable(GL_BLEND);CHECKGLERROR
- qglEnable(GL_DEPTH_TEST);CHECKGLERROR
- qglDepthMask(GL_TRUE);CHECKGLERROR
- qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);CHECKGLERROR
-}
-
-void R_Mesh_ClearDepth(void)
-{
- if (currentmesh)
- R_Mesh_Render();
- R_Mesh_Finish();
- qglClear(GL_DEPTH_BUFFER_BIT);
- R_Mesh_Start(r_mesh_farclip);
-}
-
-// allocates space in geometry buffers, and fills in pointers to the buffers in passsed struct
-// (this is used for very high speed rendering, no copying)
-int R_Mesh_Draw_GetBuffer(rmeshbufferinfo_t *m, int wantoverbright)
-{
- // these are static because gcc runs out of virtual registers otherwise
- int i, j, overbright;
- float scaler;
- buf_mesh_t *mesh;
-
- if (!backendactive)
- Sys_Error("R_Mesh_Draw_GetBuffer: called when backend is not active\n");
-
- if (!m->numtriangles
- || !m->numverts)
- Host_Error("R_Mesh_Draw_GetBuffer: no triangles or verts\n");
-
- // LordHavoc: removed this error condition because with floatcolors 0,
- // the 3DFX driver works with very large meshs
- // FIXME: we can work around this by falling back on non-array renderer if buffers are too big
- //if (m->numtriangles > 1024 || m->numverts > 3072)
- //{
- // Con_Printf("R_Mesh_Draw_GetBuffer: mesh too big for 3DFX drivers, rejected\n");
- // return false;
- //}
-
- i = max(m->numtriangles * 3, m->numverts);
- if (overflowedverts < i)
- overflowedverts = i;
-
- if (m->numtriangles > max_meshs || m->numverts > max_verts)
- {
- Con_Printf("R_Mesh_Draw_GetBuffer: mesh too big for current gl_mesh_maxtriangles setting, increasing limits\n");
- return false;
- }
-
- if (currentmesh)
- {
- R_Mesh_Render();
- Con_Printf("mesh queue not empty, flushing.\n");
- }
-
- c_meshs++;
- c_meshtris += m->numtriangles;
- m->index = &buf_tri[currenttriangle].index[0];
- m->vertex = &buf_vertex[currentvertex].v[0];
- m->color = &buf_fcolor[currentvertex].c[0];
- for (i = 0;i < backendunits;i++)
- m->texcoords[i] = &buf_texcoord[i][currentvertex].t[0];
-
- // opaque meshs are rendered directly
- mesh = &buf_mesh[currentmesh++];
- mesh->firsttriangle = currenttriangle;
- mesh->firstvert = currentvertex;
- currenttriangle += m->numtriangles;
- currentvertex += m->numverts;
-
- mesh->blendfunc1 = m->blendfunc1;
- mesh->blendfunc2 = m->blendfunc2;
- mesh->depthmask = (m->blendfunc2 == GL_ZERO || m->depthwrite);
- mesh->depthtest = !m->depthdisable;
- mesh->triangles = m->numtriangles;
- mesh->verts = m->numverts;
- mesh->matrix = m->matrix; // this copies the struct
-
- overbright = false;
- scaler = 1;
- if (m->blendfunc1 == GL_DST_COLOR)
- {
- // check if it is a 2x modulate with framebuffer
- if (m->blendfunc2 == GL_SRC_COLOR)
- scaler *= 0.5f;
- }
- else if (m->blendfunc2 != GL_SRC_COLOR)
- {
- if (m->tex[0])