- GL_DepthMask(true);
- GL_DepthTest(true);
- GL_BlendFunc(GL_ONE, GL_ZERO);
- memset(&m, 0, sizeof(m));
- for (texturefaceindex = 0;texturefaceindex < texturenumfaces;texturefaceindex++)
- {
- q3msurface_t *face = texturefacelist[texturefaceindex];
- m.tex[0] = R_GetTexture(face->lightmaptexture);
- m.pointer_texcoord[0] = face->mesh.data_texcoordlightmap2f;
- if (face->lightmaptexture)
- m.pointer_color = NULL;
- else
- m.pointer_color = face->mesh.data_lightmapcolor4f;
- m.pointer_vertex = face->mesh.data_vertex3f;
- R_Mesh_State(&m);
- GL_LockArrays(0, face->mesh.num_vertices);
- R_Mesh_Draw(face->mesh.num_vertices, face->mesh.num_triangles, face->mesh.data_element3i);
- GL_LockArrays(0, 0);
- }
- }
- if (dobase)
- {
- GL_BlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
- GL_DepthMask(false);
- GL_DepthTest(true);
- GL_Color(r_lightmapintensity * ent->colormod[0], r_lightmapintensity * ent->colormod[1], r_lightmapintensity * ent->colormod[2], 1);
- memset(&m, 0, sizeof(m));
- m.tex[0] = R_GetTexture(t->skin.base);
- for (texturefaceindex = 0;texturefaceindex < texturenumfaces;texturefaceindex++)
- {
- q3msurface_t *face = texturefacelist[texturefaceindex];
- m.pointer_texcoord[0] = face->mesh.data_texcoordtexture2f;
- m.pointer_vertex = face->mesh.data_vertex3f;
- R_Mesh_State(&m);
- GL_LockArrays(0, face->mesh.num_vertices);
- R_Mesh_Draw(face->mesh.num_vertices, face->mesh.num_triangles, face->mesh.data_element3i);
- GL_LockArrays(0, 0);
- }
- }
- if (doambient)
- {
- GL_BlendFunc(GL_ONE, GL_ONE);
- GL_DepthMask(false);
- GL_DepthTest(true);
- GL_Color(r_ambient.value * (1.0f / 128.0f) * ent->colormod[0], r_ambient.value * (1.0f / 128.0f) * ent->colormod[1], r_ambient.value * (1.0f / 128.0f) * ent->colormod[2], 1);
- memset(&m, 0, sizeof(m));
- m.tex[0] = R_GetTexture(t->skin.base);
- for (texturefaceindex = 0;texturefaceindex < texturenumfaces;texturefaceindex++)
- {
- q3msurface_t *face = texturefacelist[texturefaceindex];
- m.pointer_texcoord[0] = face->mesh.data_texcoordtexture2f;
- m.pointer_vertex = face->mesh.data_vertex3f;
- R_Mesh_State(&m);
- GL_LockArrays(0, face->mesh.num_vertices);
- R_Mesh_Draw(face->mesh.num_vertices, face->mesh.num_triangles, face->mesh.data_element3i);
- GL_LockArrays(0, 0);
- }
- }
- if (doglow)
- {
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- GL_DepthMask(false);
- GL_DepthTest(true);
- GL_Color(1, 1, 1, 1);
- memset(&m, 0, sizeof(m));
- m.tex[0] = R_GetTexture(t->skin.glow);
- for (texturefaceindex = 0;texturefaceindex < texturenumfaces;texturefaceindex++)
- {
- q3msurface_t *face = texturefacelist[texturefaceindex];
- m.pointer_texcoord[0] = face->mesh.data_texcoordtexture2f;
- m.pointer_vertex = face->mesh.data_vertex3f;
- R_Mesh_State(&m);
- GL_LockArrays(0, face->mesh.num_vertices);
- R_Mesh_Draw(face->mesh.num_vertices, face->mesh.num_triangles, face->mesh.data_element3i);
- GL_LockArrays(0, 0);
- }
- }
- if (dofog)
- {
- float modelorg[3];
- Matrix4x4_Transform(&ent->inversematrix, r_vieworigin, modelorg);
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- GL_DepthMask(false);
- GL_DepthTest(true);
- GL_Color(1, 1, 1, 1);
- memset(&m, 0, sizeof(m));
- m.tex[0] = R_GetTexture(t->skin.fog);
- m.pointer_color = varray_color4f;
- for (texturefaceindex = 0;texturefaceindex < texturenumfaces;texturefaceindex++)
- {
- q3msurface_t *face = texturefacelist[texturefaceindex];
- if (m.tex[0])
- m.pointer_texcoord[0] = face->mesh.data_texcoordtexture2f;
- m.pointer_vertex = face->mesh.data_vertex3f;
- R_Mesh_State(&m);
- RSurf_FogPassColors_Vertex3f_Color4f(face->mesh.data_vertex3f, varray_color4f, fogcolor[0], fogcolor[1], fogcolor[2], 1, 1, face->mesh.num_vertices, modelorg);
- GL_LockArrays(0, face->mesh.num_vertices);
- R_Mesh_Draw(face->mesh.num_vertices, face->mesh.num_triangles, face->mesh.data_element3i);
- GL_LockArrays(0, 0);
- }
- }
- if (t->textureflags & Q3TEXTUREFLAG_TWOSIDED)
- qglEnable(GL_CULL_FACE);
-}
-
-void R_Q3BSP_DrawFaces(entity_render_t *ent, int skyfaces)
-{
- int i, j, f, flagsmask, flags;
- q3msurface_t *face;
- model_t *model = ent->model;
- q3mtexture_t *t;
- const int maxfaces = 1024;
- int numfaces = 0;
- q3msurface_t *facelist[1024];
- R_Mesh_Matrix(&ent->matrix);
- flagsmask = Q3SURFACEFLAG_NODRAW | Q3SURFACEFLAG_SKY;
- if (skyfaces)
- flags = Q3SURFACEFLAG_SKY;
- else
- flags = 0;
- t = NULL;
- f = 0;
- numfaces = 0;
- for (i = 0, j = model->firstmodelsurface;i < model->nummodelsurfaces;i++, j++)
- {
- if (ent != r_refdef.worldentity || r_worldsurfacevisible[j])
- {
- face = model->brushq3.data_faces + j;
- if (t != face->texture)
- {
- if (numfaces)
- {
- R_Q3BSP_DrawFaceList(ent, t, numfaces, facelist);
- numfaces = 0;
- }
- t = face->texture;
- f = t->surfaceflags & flagsmask;
- }
- if (f == flags)
- {
- if (!face->mesh.num_triangles)
- continue;
- facelist[numfaces++] = face;
- if (numfaces >= maxfaces)
- {
- R_Q3BSP_DrawFaceList(ent, t, numfaces, facelist);
- numfaces = 0;
- }
- }
- }