- if (R_Mesh_Draw_GetBuffer(&m))
- {
- cl = m.colorscale;
- memcpy(m.index, mesh->index, m.numtriangles * sizeof(int[3]));
-
- if (currentrenderentity->effects & EF_FULLBRIGHT)
- {
- if (softwaretransform_complexity)
- {
- for (i = 0, v = mesh->vertex, outv = m.vertex, outc = m.color, outst = m.texcoords[0];i < m.numverts;i++, v++, outv += 4, outc += 4, outst += 2)
- {
- softwaretransform(v->v, outv);
- outv[3] = 1;
- VectorSubtract(outv, r_origin, diff);
- outc[0] = outc[1] = outc[2] = 2.0f * cl * (1 - exp(fogdensity/DotProduct(diff, diff)));
- outc[3] = ca;
- outst[0] = v->st[0];
- outst[1] = v->st[1];
- }
- }
- else
- {
- for (i = 0, v = mesh->vertex, outv = m.vertex, outc = m.color, outst = m.texcoords[0];i < m.numverts;i++, v++, outv += 4, outc += 4, outst += 2)
- {
- VectorCopy(v->v, outv);
- outv[3] = 1;
- VectorSubtract(outv, r_origin, diff);
- outc[0] = outc[1] = outc[2] = 2.0f * cl * (1 - exp(fogdensity/DotProduct(diff, diff)));
- outc[3] = ca;
- outst[0] = v->st[0];
- outst[1] = v->st[1];
- }
- }
- }
- else
- {
- if (softwaretransform_complexity)
- {
- for (i = 0, v = mesh->vertex, outv = m.vertex, outc = m.color, outst = m.texcoords[0];i < m.numverts;i++, v++, outv += 4, outc += 4, outst += 2)
- {
- softwaretransform(v->v, outv);
- outv[3] = 1;
- VectorCopy(base, outc);
- outc[3] = ca;
- outst[0] = v->st[0];
- outst[1] = v->st[1];
- }
- }
- else
- {
- for (i = 0, v = mesh->vertex, outv = m.vertex, outc = m.color, outst = m.texcoords[0];i < m.numverts;i++, v++, outv += 4, outc += 4, outst += 2)
- {
- VectorCopy(v->v, outv);
- outv[3] = 1;
- VectorCopy(base, outc);
- outc[3] = ca;
- outst[0] = v->st[0];
- outst[1] = v->st[1];
- }
- }
-
- if (surf->dlightframe == r_framecount)
- RSurf_LightSeparate(surf->dlightbits, m.numverts, m.vertex, m.color);
-
- for (i = 0, v = mesh->vertex, outv = m.vertex, outc = m.color;i < m.numverts;i++, v++, outv += 4, outc += 4)
- {
- if (surf->styles[0] != 255)
- {
- lm = surf->samples + v->lightmapoffset;
- scale = d_lightstylevalue[surf->styles[0]] * (1.0f / 32768.0f);
- VectorMA(outc, scale, lm, outc);
- if (surf->styles[1] != 255)
- {
- lm += size3;
- scale = d_lightstylevalue[surf->styles[1]] * (1.0f / 32768.0f);
- VectorMA(outc, scale, lm, outc);
- if (surf->styles[2] != 255)
- {
- lm += size3;
- scale = d_lightstylevalue[surf->styles[2]] * (1.0f / 32768.0f);
- VectorMA(outc, scale, lm, outc);
- if (surf->styles[3] != 255)
- {
- lm += size3;
- scale = d_lightstylevalue[surf->styles[3]] * (1.0f / 32768.0f);
- VectorMA(outc, scale, lm, outc);
- }
- }
- }
- }
- if (fogenabled)
- {
- VectorSubtract(outv, r_origin, diff);
- f = cl * (1 - exp(fogdensity/DotProduct(diff, diff)));
- VectorScale(outc, f, outc);
- }
- else
- VectorScale(outc, cl, outc);
- }
- }
- }
+static void RSurfShader_OpaqueWall_Pass_BaseMTex(const entity_render_t *ent, const msurface_t *surf)
+{
+ const surfmesh_t *mesh;
+ rmeshstate_t m;
+ float cl;
+ memset(&m, 0, sizeof(m));
+ m.blendfunc1 = GL_ONE;
+ m.blendfunc2 = GL_ZERO;
+ m.wantoverbright = true;
+ m.tex[0] = R_GetTexture(surf->currenttexture->texture);
+ m.tex[1] = R_GetTexture(surf->lightmaptexture);
+ R_Mesh_State(&m);
+ for (mesh = surf->mesh;mesh;mesh = mesh->chain)
+ {
+ R_Mesh_ResizeCheck(mesh->numverts, mesh->numtriangles);
+ memcpy(varray_element, mesh->index, mesh->numtriangles * sizeof(int[3]));
+ memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4]));
+ memcpy(varray_texcoord[0], mesh->st, mesh->numverts * sizeof(float[2]));
+ memcpy(varray_texcoord[1], mesh->uv, mesh->numverts * sizeof(float[2]));
+ cl = (float) (1 << lightscalebit) * mesh_colorscale;
+ R_FillColors(varray_color, mesh->numverts, cl, cl, cl, 1);
+ R_Mesh_Draw(mesh->numverts, mesh->numtriangles);