]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_shadow.c
huge (16%) speed gain on surface rendering by eliminating the surfmesh chain in q1bsp...
[xonotic/darkplaces.git] / r_shadow.c
index 160d4cca8f6fbc9ae0d96ba03b5db3fe1276f210..52e4f3508b964520f157746ee9581174bd5aab10 100644 (file)
@@ -1238,7 +1238,7 @@ void R_Shadow_DiffuseLighting(int numverts, int numtriangles, const int *element
                        GL_BlendFunc(GL_DST_ALPHA, GL_ONE);
                        if (lightcubemap)
                                R_Shadow_Transform_Vertex3f_TexCoord3f(varray_texcoord3f[1], numverts, vertex3f, matrix_modeltofilter);
-                       VectorScale(lightcolor, r_colorscale * r_shadow_lightintensityscale.value, color2);
+                       VectorScale(lightcolor, r_shadow_lightintensityscale.value, color2);
                        for (renders = 0;renders < 64 && (color2[0] > 0 || color2[1] > 0 || color2[2] > 0);renders++, color2[0]--, color2[1]--, color2[2]--)
                        {
                                color[0] = bound(0, color2[0], 1);
@@ -1288,7 +1288,7 @@ void R_Shadow_DiffuseLighting(int numverts, int numtriangles, const int *element
                        GL_BlendFunc(GL_DST_ALPHA, GL_ONE);
                        if (lightcubemap)
                                R_Shadow_Transform_Vertex3f_TexCoord3f(varray_texcoord3f[1], numverts, vertex3f, matrix_modeltofilter);
-                       VectorScale(lightcolor, r_colorscale * r_shadow_lightintensityscale.value, color2);
+                       VectorScale(lightcolor, r_shadow_lightintensityscale.value, color2);
                        for (renders = 0;renders < 64 && (color2[0] > 0 || color2[1] > 0 || color2[2] > 0);renders++, color2[0]--, color2[1]--, color2[2]--)
                        {
                                color[0] = bound(0, color2[0], 1);
@@ -1327,7 +1327,7 @@ void R_Shadow_DiffuseLighting(int numverts, int numtriangles, const int *element
                        qglColorMask(1,1,1,0);
                        GL_BlendFunc(GL_DST_ALPHA, GL_ONE);
                        R_Shadow_Transform_Vertex3f_TexCoord3f(varray_texcoord3f[1], numverts, vertex3f, matrix_modeltoattenuationxyz);
-                       VectorScale(lightcolor, r_colorscale * r_shadow_lightintensityscale.value, color2);
+                       VectorScale(lightcolor, r_shadow_lightintensityscale.value, color2);
                        for (renders = 0;renders < 64 && (color2[0] > 0 || color2[1] > 0 || color2[2] > 0);renders++, color2[0]--, color2[1]--, color2[2]--)
                        {
                                color[0] = bound(0, color2[0], 1);
@@ -1373,7 +1373,7 @@ void R_Shadow_DiffuseLighting(int numverts, int numtriangles, const int *element
                        GL_BlendFunc(GL_DST_ALPHA, GL_ONE);
                        if (lightcubemap)
                                R_Shadow_Transform_Vertex3f_TexCoord3f(varray_texcoord3f[1], numverts, vertex3f, matrix_modeltofilter);
-                       VectorScale(lightcolor, r_colorscale * r_shadow_lightintensityscale.value, color2);
+                       VectorScale(lightcolor, r_shadow_lightintensityscale.value, color2);
                        for (renders = 0;renders < 64 && (color2[0] > 0 || color2[1] > 0 || color2[2] > 0);renders++, color2[0]--, color2[1]--, color2[2]--)
                        {
                                color[0] = bound(0, color2[0], 1);
@@ -1426,7 +1426,7 @@ void R_Shadow_DiffuseLighting(int numverts, int numtriangles, const int *element
                        GL_BlendFunc(GL_DST_ALPHA, GL_ONE);
                        if (lightcubemap)
                                R_Shadow_Transform_Vertex3f_TexCoord3f(varray_texcoord3f[1], numverts, vertex3f, matrix_modeltofilter);
-                       VectorScale(lightcolor, r_colorscale * r_shadow_lightintensityscale.value, color2);
+                       VectorScale(lightcolor, r_shadow_lightintensityscale.value, color2);
                        for (renders = 0;renders < 64 && (color2[0] > 0 || color2[1] > 0 || color2[2] > 0);renders++, color2[0]--, color2[1]--, color2[2]--)
                        {
                                color[0] = bound(0, color2[0], 1);
@@ -1445,7 +1445,7 @@ void R_Shadow_DiffuseLighting(int numverts, int numtriangles, const int *element
                GL_DepthMask(false);
                GL_DepthTest(true);
                GL_ColorPointer(varray_color4f);
-               VectorScale(lightcolor, r_colorscale * r_shadow_lightintensityscale.value, color2);
+               VectorScale(lightcolor, r_shadow_lightintensityscale.value, color2);
                memset(&m, 0, sizeof(m));
                m.tex[0] = R_GetTexture(basetexture);
                m.pointer_texcoord[0] = texcoord2f;
@@ -1484,7 +1484,7 @@ void R_Shadow_SpecularLighting(int numverts, int numtriangles, const int *elemen
                glosstexture = r_shadow_blankglosstexture;
        if (r_shadow_gloss.integer >= 2 || (r_shadow_gloss.integer >= 1 && glosstexture != r_shadow_blankglosstexture))
        {
-               colorscale = r_colorscale * r_shadow_glossintensity.value;
+               colorscale = r_shadow_glossintensity.value;
                if (!bumptexture)
                        bumptexture = r_shadow_blankbumptexture;
                if (glosstexture == r_shadow_blankglosstexture)
@@ -1711,7 +1711,6 @@ void R_Shadow_NewWorldLight(vec3_t origin, float radius, vec3_t color, int style
        shadowmesh_t *mesh, *castmesh;
        mleaf_t *leaf;
        msurface_t *surf;
-       surfmesh_t *surfmesh;
 
        if (radius < 15 || DotProduct(color, color) < 0.03)
        {
@@ -1760,7 +1759,7 @@ void R_Shadow_NewWorldLight(vec3_t origin, float radius, vec3_t color, int style
                        //byteleafpvs = Mem_Alloc(tempmempool, cl.worldmodel->brushq1.numleafs);
                        bytesurfacepvs = Mem_Alloc(tempmempool, cl.worldmodel->brushq1.numsurfaces);
 
-                       Portal_Visibility(cl.worldmodel, e->origin, NULL/*byteleafpvs*/, bytesurfacepvs, NULL, 0, true, RadiusFromBoundsAndOrigin(e->mins, e->maxs, e->origin), e->mins, e->maxs);
+                       Portal_Visibility(cl.worldmodel, e->origin, NULL/*byteleafpvs*/, bytesurfacepvs, NULL, 0, true, mins, maxs, e->mins, e->maxs);
 
                        /*
                        for (i = 0, leaf = cl.worldmodel->brushq1.leafs;i < cl.worldmodel->brushq1.numleafs;i++, leaf++)
@@ -1840,9 +1839,8 @@ void R_Shadow_NewWorldLight(vec3_t origin, float radius, vec3_t color, int style
                        // make a mesh to cast a shadow volume from
                        castmesh = Mod_ShadowMesh_Begin(r_shadow_mempool, 32768);
                        for (j = 0;j < e->numsurfaces;j++)
-                               if (e->surfaces[j]->castshadow == castshadowcount)
-                                       for (surfmesh = e->surfaces[j]->mesh;surfmesh;surfmesh = surfmesh->chain)
-                                               Mod_ShadowMesh_AddMesh(r_shadow_mempool, castmesh, surfmesh->vertex3f, surfmesh->numtriangles, surfmesh->element3i);
+                               if ((surf = e->surfaces[j])->castshadow == castshadowcount)
+                                       Mod_ShadowMesh_AddMesh(r_shadow_mempool, castmesh, surf->mesh.data_vertex3f, surf->mesh.num_triangles, surf->mesh.data_element3i);
                        castmesh = Mod_ShadowMesh_Finish(r_shadow_mempool, castmesh);
 
                        // cast shadow volume from castmesh