+ if (dobase && dolightmap && gl_combine.integer)
+ {
+ dobase = false;
+ memset(&m, 0, sizeof(m));
+ m.tex[1] = R_GetTexture(texture->skin.base);
+ if (waterscrolling)
+ m.texmatrix[1] = r_surf_waterscrollmatrix;
+ m.texrgbscale[1] = 2;
+ m.pointer_color = varray_color4f;
+ colorscale = 1;
+ r = ent->colormod[0] * colorscale;
+ g = ent->colormod[1] * colorscale;
+ b = ent->colormod[2] * colorscale;
+ a = texture->currentalpha;
+ base = r_ambient.value * (1.0f / 64.0f);
+ for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
+ {
+ surface = texturesurfacelist[texturesurfaceindex];
+ m.pointer_vertex = RSurf_GetVertexPointer(ent, surface);
+ m.pointer_texcoord[0] = surface->mesh.data_texcoordlightmap2f;
+ m.pointer_texcoord[1] = surface->mesh.data_texcoordtexture2f;
+ if (surface->lightmaptexture)
+ {
+ m.tex[0] = R_GetTexture(surface->lightmaptexture);
+ if (fogallpasses)
+ {
+ m.pointer_color = varray_color4f;
+ for (i = 0, v = m.pointer_vertex, c = varray_color4f;i < surface->mesh.num_vertices;i++, v += 3, c += 4)
+ {
+ VectorSubtract(v, modelorg, diff);
+ f = 1 - exp(fogdensity/DotProduct(diff, diff));
+ c[0] = f * r;
+ c[1] = f * g;
+ c[2] = f * b;
+ c[3] = a;
+ }
+ }
+ else
+ {
+ m.pointer_color = NULL;
+ GL_Color(r, g, b, a);
+ }
+ }
+ else
+ {
+ m.tex[0] = R_GetTexture(r_texture_white);
+ m.pointer_color = varray_color4f;
+#ifdef LHREMOVESOON
+ if (surface->styles[0] != 255 || surface->dlightframe == r_framecount)
+#else
+ if (surface->styles[0] != 255)
+#endif
+ {
+ for (i = 0, v = m.pointer_vertex, c = varray_color4f;i < surface->mesh.num_vertices;i++, v += 3, c += 4)
+ {
+ c[0] = 0;
+ c[1] = 0;
+ c[2] = 0;
+ if (surface->styles[0] != 255)
+ {
+ if (surface->mesh.data_lightmapcolor4f)
+ {
+ float scale = d_lightstylevalue[surface->styles[0]] * (1.0f / 128.0f);
+ VectorMA(c, scale, surface->mesh.data_lightmapcolor4f + i*4, c);
+ }
+ else if (surface->mesh.data_lightmapoffsets)
+ {
+ const qbyte *lm = surface->samples + surface->mesh.data_lightmapoffsets[i];
+ float scale = d_lightstylevalue[surface->styles[0]] * (1.0f / 32768.0f);
+ VectorMA(c, scale, lm, c);
+ if (surface->styles[1] != 255)
+ {
+ int size3 = ((surface->extents[0]>>4)+1)*((surface->extents[1]>>4)+1)*3;
+ lm += size3;
+ scale = d_lightstylevalue[surface->styles[1]] * (1.0f / 32768.0f);
+ VectorMA(c, scale, lm, c);
+ if (surface->styles[2] != 255)
+ {
+ lm += size3;
+ scale = d_lightstylevalue[surface->styles[2]] * (1.0f / 32768.0f);
+ VectorMA(c, scale, lm, c);
+ if (surface->styles[3] != 255)
+ {
+ lm += size3;
+ scale = d_lightstylevalue[surface->styles[3]] * (1.0f / 32768.0f);
+ VectorMA(c, scale, lm, c);
+ }
+ }
+ }
+ }
+ }
+#ifdef LHREMOVESOON
+ if (surface->dlightframe == r_framecount)
+ {
+ int l;
+ float worldvertex[3];
+ // TODO: make this work with autosprite which uses identitymatrix
+ Matrix4x4_Transform(&ent->matrix, v, worldvertex);
+ for (l = 0;l < r_numdlights;l++)
+ {
+ if (surface->dlightbits[l >> 5] & (1 << (l & 31)))
+ {
+ float f2;
+ dlight_t *light = &r_dlight[l];
+ f2 = VectorDistance2(worldvertex, light->origin) + LIGHTOFFSET;
+ if (f2 < light->rtlight.lightmap_cullradius2)
+ {
+ f2 = (1.0f / f2) - light->rtlight.lightmap_subtract;
+ VectorMA(c, f2, light->rtlight.lightmap_light, c);
+ }
+ }
+ }
+ }
+#endif
+ c[0] *= r;
+ c[1] *= g;
+ c[2] *= b;
+ if (fogallpasses)
+ {
+ VectorSubtract(v, modelorg, diff);
+ f = 1 - exp(fogdensity/DotProduct(diff, diff));
+ VectorScale(c, f, c);
+ }
+ if (surface->mesh.data_lightmapcolor4f && (texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ c[3] = surface->mesh.data_lightmapcolor4f[i*4+3] * a;
+ else
+ c[3] = a;
+ }
+ }
+ else
+ {
+ if (surface->mesh.data_lightmapcolor4f && (texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ {
+ for (i = 0, v = m.pointer_vertex, c = varray_color4f;i < surface->mesh.num_vertices;i++, v += 3, c += 4)
+ {
+ c[0] = 0;
+ c[1] = 0;
+ c[2] = 0;
+ c[3] = surface->mesh.data_lightmapcolor4f[i*4+3] * a;
+ }
+ }
+ else
+ {
+ m.pointer_color = NULL;
+ GL_Color(0, 0, 0, a);
+ }
+ }
+ }
+ R_Mesh_State(&m);
+ GL_LockArrays(0, surface->mesh.num_vertices);
+ R_Mesh_Draw(surface->mesh.num_vertices, surface->mesh.num_triangles, surface->mesh.data_element3i);
+ GL_LockArrays(0, 0);
+ }
+ }
+ if (dobase)
+ {
+ dobase = false;
+ memset(&m, 0, sizeof(m));
+ m.tex[0] = R_GetTexture(texture->skin.base);
+ if (waterscrolling)
+ m.texmatrix[0] = r_surf_waterscrollmatrix;
+ m.texmatrix[0] = r_surf_waterscrollmatrix;
+ m.pointer_color = varray_color4f;
+ colorscale = 1;
+ if (gl_combine.integer)
+ {
+ m.texrgbscale[0] = 4;
+ colorscale *= 0.25f;
+ }
+ r = ent->colormod[0] * colorscale;
+ g = ent->colormod[1] * colorscale;
+ b = ent->colormod[2] * colorscale;
+ a = texture->currentalpha;
+ if (dolightmap)
+ {
+ for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
+ {
+ surface = texturesurfacelist[texturesurfaceindex];
+ m.pointer_vertex = RSurf_GetVertexPointer(ent, surface);
+ m.pointer_texcoord[0] = surface->mesh.data_texcoordtexture2f;
+ for (i = 0, v = m.pointer_vertex, c = varray_color4f;i < surface->mesh.num_vertices;i++, v += 3, c += 4)
+ {
+ c[0] = 0;
+ c[1] = 0;
+ c[2] = 0;
+ if (surface->styles[0] != 255)
+ {
+ if (surface->mesh.data_lightmapcolor4f)
+ {
+ float scale = d_lightstylevalue[surface->styles[0]] * (1.0f / 128.0f);
+ VectorMA(c, scale, surface->mesh.data_lightmapcolor4f + i*4, c);
+ }
+ else if (surface->mesh.data_lightmapoffsets)
+ {
+ const qbyte *lm = surface->samples + surface->mesh.data_lightmapoffsets[i];
+ float scale = d_lightstylevalue[surface->styles[0]] * (1.0f / 32768.0f);
+ VectorMA(c, scale, lm, c);
+ if (surface->styles[1] != 255)
+ {
+ int size3 = ((surface->extents[0]>>4)+1)*((surface->extents[1]>>4)+1)*3;
+ lm += size3;
+ scale = d_lightstylevalue[surface->styles[1]] * (1.0f / 32768.0f);
+ VectorMA(c, scale, lm, c);
+ if (surface->styles[2] != 255)
+ {
+ lm += size3;
+ scale = d_lightstylevalue[surface->styles[2]] * (1.0f / 32768.0f);
+ VectorMA(c, scale, lm, c);
+ if (surface->styles[3] != 255)
+ {
+ lm += size3;
+ scale = d_lightstylevalue[surface->styles[3]] * (1.0f / 32768.0f);
+ VectorMA(c, scale, lm, c);
+ }
+ }
+ }
+ }
+ }
+#ifdef LHREMOVESOON
+ if (surface->dlightframe == r_framecount)
+ {
+ // TODO: make this work with autosprite which uses identitymatrix
+ Matrix4x4_Transform(&ent->matrix, v, worldvertex);
+ for (l = 0;l < r_numdlights;l++)
+ {
+ if (surface->dlightbits[l >> 5] & (1 << (l & 31)))
+ {
+ float f2;
+ dlight_t *light = &r_dlight[l];
+ f2 = VectorDistance2(worldvertex, light->origin) + LIGHTOFFSET;
+ if (f2 < light->rtlight.lightmap_cullradius2)
+ {
+ f2 = (1.0f / f2) - light->rtlight.lightmap_subtract;
+ VectorMA(c, f2, light->rtlight.lightmap_light, c);
+ }
+ }
+ }
+ }
+#endif
+ c[0] *= r;
+ c[1] *= g;
+ c[2] *= b;
+ if (fogallpasses)
+ {
+ VectorSubtract(v, modelorg, diff);
+ f = 1 - exp(fogdensity/DotProduct(diff, diff));
+ VectorScale(c, f, c);
+ }
+ if (surface->mesh.data_lightmapcolor4f && (texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ c[3] = surface->mesh.data_lightmapcolor4f[i*4+3] * a;
+ else
+ c[3] = a;
+ }
+ R_Mesh_State(&m);
+ GL_LockArrays(0, surface->mesh.num_vertices);
+ R_Mesh_Draw(surface->mesh.num_vertices, surface->mesh.num_triangles, surface->mesh.data_element3i);
+ GL_LockArrays(0, 0);
+ }
+ }
+ else
+ {
+ if (fogallpasses)
+ {
+ for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
+ {
+ surface = texturesurfacelist[texturesurfaceindex];
+ m.pointer_vertex = RSurf_GetVertexPointer(ent, surface);
+ m.pointer_texcoord[0] = surface->mesh.data_texcoordtexture2f;
+ if (m.tex[1])
+ m.pointer_texcoord[1] = surface->mesh.data_texcoordtexture2f;
+ if (surface->mesh.data_lightmapcolor4f && (texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ {
+ m.pointer_color = varray_color4f;
+ for (i = 0, v = m.pointer_vertex, c = varray_color4f;i < surface->mesh.num_vertices;i++, v += 3, c += 4)
+ {
+ VectorSubtract(v, modelorg, diff);
+ f = 1 - exp(fogdensity/DotProduct(diff, diff));
+ c[0] = r * f;
+ c[1] = g * f;
+ c[2] = b * f;
+ c[3] = surface->mesh.data_lightmapcolor4f[i*4+3] * a;
+ }
+ }
+ else
+ {
+ m.pointer_color = varray_color4f;
+ for (i = 0, v = m.pointer_vertex, c = varray_color4f;i < surface->mesh.num_vertices;i++, v += 3, c += 4)
+ {
+ VectorSubtract(v, modelorg, diff);
+ f = 1 - exp(fogdensity/DotProduct(diff, diff));
+ c[0] = r * f;
+ c[1] = g * f;
+ c[2] = b * f;
+ c[3] = a;
+ }
+ }
+ R_Mesh_State(&m);
+ GL_LockArrays(0, surface->mesh.num_vertices);
+ R_Mesh_Draw(surface->mesh.num_vertices, surface->mesh.num_triangles, surface->mesh.data_element3i);
+ GL_LockArrays(0, 0);
+ }
+ }
+ else
+ {
+ for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
+ {
+ surface = texturesurfacelist[texturesurfaceindex];
+ m.pointer_vertex = RSurf_GetVertexPointer(ent, surface);
+ m.pointer_texcoord[0] = surface->mesh.data_texcoordtexture2f;
+ if (m.tex[1])
+ m.pointer_texcoord[1] = surface->mesh.data_texcoordtexture2f;
+ if (surface->mesh.data_lightmapcolor4f && (texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ {
+ m.pointer_color = varray_color4f;
+ for (i = 0, v = m.pointer_vertex, c = varray_color4f;i < surface->mesh.num_vertices;i++, v += 3, c += 4)
+ {
+ c[0] = r;
+ c[1] = g;
+ c[2] = b;
+ c[3] = surface->mesh.data_lightmapcolor4f[i*4+3] * a;
+ }
+ }
+ else
+ {
+ m.pointer_color = NULL;
+ GL_Color(r, g, b, a);
+ }
+ R_Mesh_State(&m);
+ GL_LockArrays(0, surface->mesh.num_vertices);
+ R_Mesh_Draw(surface->mesh.num_vertices, surface->mesh.num_triangles, surface->mesh.data_element3i);
+ GL_LockArrays(0, 0);
+ }
+ }
+ }
+ }