]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rsurf.c
detect bogus texture upload attempts and print the info to console
[xonotic/darkplaces.git] / gl_rsurf.c
index db6c318849ea20e965b866e9dda9e5291935ce77..61ea4d012dbf1bd7a559334e497370011b7943c6 100644 (file)
@@ -36,7 +36,7 @@ cvar_t r_drawportals = {0, "r_drawportals", "0"};
 cvar_t r_testvis = {0, "r_testvis", "0"};
 cvar_t r_floatbuildlightmap = {0, "r_floatbuildlightmap", "0"};
 cvar_t r_detailtextures = {CVAR_SAVE, "r_detailtextures", "1"};
-cvar_t r_surfaceworldnode = {0, "r_surfaceworldnode", "0"};
+cvar_t r_surfaceworldnode = {0, "r_surfaceworldnode", "1"};
 
 static int dlightdivtable[32768];
 
@@ -231,7 +231,7 @@ R_BuildLightMap
 Combine and scale multiple lightmaps into the 8.8 format in blocklights
 ===============
 */
-static void R_BuildLightMap (const entity_render_t *ent, msurface_t *surf, int dlightchanged)
+static void R_BuildLightMap (const entity_render_t *ent, msurface_t *surf)
 {
        if (!r_floatbuildlightmap.integer)
        {
@@ -241,12 +241,6 @@ static void R_BuildLightMap (const entity_render_t *ent, msurface_t *surf, int d
 
                // update cached lighting info
                surf->cached_dlight = 0;
-               surf->cached_lightmapscalebit = r_lightmapscalebit;
-               surf->cached_ambient = r_ambient.value;
-               surf->cached_light[0] = d_lightstylevalue[surf->styles[0]];
-               surf->cached_light[1] = d_lightstylevalue[surf->styles[1]];
-               surf->cached_light[2] = d_lightstylevalue[surf->styles[2]];
-               surf->cached_light[3] = d_lightstylevalue[surf->styles[3]];
 
                smax = (surf->extents[0]>>4)+1;
                tmax = (surf->extents[1]>>4)+1;
@@ -278,8 +272,6 @@ static void R_BuildLightMap (const entity_render_t *ent, msurface_t *surf, int d
                                surf->cached_dlight = R_IntAddDynamicLights(&ent->inversematrix, surf);
                                if (surf->cached_dlight)
                                        c_light_polys++;
-                               else if (dlightchanged)
-                                       return; // don't upload if only updating dlights and none mattered
                        }
 
        // add all the lightmaps
@@ -335,12 +327,6 @@ static void R_BuildLightMap (const entity_render_t *ent, msurface_t *surf, int d
 
                // update cached lighting info
                surf->cached_dlight = 0;
-               surf->cached_lightmapscalebit = r_lightmapscalebit;
-               surf->cached_ambient = r_ambient.value;
-               surf->cached_light[0] = d_lightstylevalue[surf->styles[0]];
-               surf->cached_light[1] = d_lightstylevalue[surf->styles[1]];
-               surf->cached_light[2] = d_lightstylevalue[surf->styles[2]];
-               surf->cached_light[3] = d_lightstylevalue[surf->styles[3]];
 
                smax = (surf->extents[0]>>4)+1;
                tmax = (surf->extents[1]>>4)+1;
@@ -369,8 +355,6 @@ static void R_BuildLightMap (const entity_render_t *ent, msurface_t *surf, int d
                        surf->cached_dlight = R_FloatAddDynamicLights(&ent->inversematrix, surf);
                        if (surf->cached_dlight)
                                c_light_polys++;
-                       else if (dlightchanged)
-                               return; // don't upload if only updating dlights and none mattered
                }
 
                // add all the lightmaps
@@ -802,9 +786,10 @@ static void RSurfShader_Sky(const entity_render_t *ent, const texture_t *texture
 
 static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
 {
+       int i;
        const entity_render_t *ent = calldata1;
        const msurface_t *surf = ent->model->surfaces + calldata2;
-       float f, colorscale;
+       float f, colorscale, scroll[2], *v;
        const surfmesh_t *mesh;
        rmeshstate_t m;
        float alpha;
@@ -832,7 +817,7 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
                m.blendfunc1 = GL_ONE;
                m.blendfunc2 = GL_ZERO;
        }
-       m.tex[0] = R_GetTexture(texture->texture);
+       m.tex[0] = R_GetTexture(texture->skin.base);
        colorscale = r_colorscale;
        if (gl_combine.integer)
        {
@@ -846,6 +831,13 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
                R_Mesh_ResizeCheck(mesh->numverts);
                memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4]));
                memcpy(varray_texcoord[0], mesh->str, mesh->numverts * sizeof(float[4]));
+               scroll[0] = sin(cl.time) * 0.125f;
+               scroll[1] = sin(cl.time * 0.8f) * 0.125f;
+               for (i = 0, v = varray_texcoord[0];i < mesh->numverts;i++, v += 4)
+               {
+                       v[0] += scroll[0];
+                       v[1] += scroll[1];
+               }
                f = surf->flags & SURF_DRAWFULLBRIGHT ? 1.0f : ((surf->flags & SURF_LIGHTMAP) ? 0 : 0.5f);
                R_FillColors(varray_color, mesh->numverts, f, f, f, alpha);
                if (!(surf->flags & SURF_DRAWFULLBRIGHT || ent->effects & EF_FULLBRIGHT))
@@ -864,7 +856,7 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
                memset(&m, 0, sizeof(m));
                m.blendfunc1 = GL_SRC_ALPHA;
                m.blendfunc2 = GL_ONE;
-               m.tex[0] = R_GetTexture(texture->fogtexture);
+               m.tex[0] = R_GetTexture(texture->skin.fog);
                R_Mesh_State(&m);
                for (mesh = surf->mesh;mesh;mesh = mesh->chain)
                {
@@ -885,7 +877,7 @@ static void RSurfShader_Water(const entity_render_t *ent, const texture_t *textu
        vec3_t center;
        if (texture->rendertype != SURFRENDER_OPAQUE)
        {
-               for (chain = surfchain;(surf = *chain) != NULL;*chain++)
+               for (chain = surfchain;(surf = *chain) != NULL;chain++)
                {
                        if (surf->visframe == r_framecount)
                        {
@@ -895,7 +887,7 @@ static void RSurfShader_Water(const entity_render_t *ent, const texture_t *textu
                }
        }
        else
-               for (chain = surfchain;(surf = *chain) != NULL;*chain++)
+               for (chain = surfchain;(surf = *chain) != NULL;chain++)
                        if (surf->visframe == r_framecount)
                                RSurfShader_Water_Callback(ent, surf - ent->model->surfaces);
 }
@@ -923,7 +915,7 @@ static void RSurfShader_Wall_Pass_BaseVertex(const entity_render_t *ent, const m
                m.blendfunc1 = GL_ONE;
                m.blendfunc2 = GL_ZERO;
        }
-       m.tex[0] = R_GetTexture(texture->texture);
+       m.tex[0] = R_GetTexture(texture->skin.base);
        colorscale = r_colorscale;
        if (gl_combine.integer)
        {
@@ -960,7 +952,7 @@ static void RSurfShader_Wall_Pass_Glow(const entity_render_t *ent, const msurfac
        memset(&m, 0, sizeof(m));
        m.blendfunc1 = GL_SRC_ALPHA;
        m.blendfunc2 = GL_ONE;
-       m.tex[0] = R_GetTexture(texture->glowtexture);
+       m.tex[0] = R_GetTexture(texture->skin.glow);
        R_Mesh_State(&m);
        GL_UseColorArray();
        for (mesh = surf->mesh;mesh;mesh = mesh->chain)
@@ -982,7 +974,7 @@ static void RSurfShader_Wall_Pass_Fog(const entity_render_t *ent, const msurface
        memset(&m, 0, sizeof(m));
        m.blendfunc1 = GL_SRC_ALPHA;
        m.blendfunc2 = GL_ONE;
-       m.tex[0] = R_GetTexture(texture->fogtexture);
+       m.tex[0] = R_GetTexture(texture->skin.fog);
        R_Mesh_State(&m);
        GL_UseColorArray();
        for (mesh = surf->mesh;mesh;mesh = mesh->chain)
@@ -1006,9 +998,9 @@ static void RSurfShader_OpaqueWall_Pass_BaseTripleTexCombine(const entity_render
        memset(&m, 0, sizeof(m));
        m.blendfunc1 = GL_ONE;
        m.blendfunc2 = GL_ZERO;
-       m.tex[0] = R_GetTexture(texture->texture);
+       m.tex[0] = R_GetTexture(texture->skin.base);
        m.tex[1] = R_GetTexture((**surfchain).lightmaptexture);
-       m.tex[2] = R_GetTexture(texture->detailtexture);
+       m.tex[2] = R_GetTexture(texture->skin.detail);
        m.texrgbscale[0] = 1;
        m.texrgbscale[1] = 4;
        m.texrgbscale[2] = 2;
@@ -1047,7 +1039,7 @@ static void RSurfShader_OpaqueWall_Pass_BaseDoubleTex(const entity_render_t *ent
        memset(&m, 0, sizeof(m));
        m.blendfunc1 = GL_ONE;
        m.blendfunc2 = GL_ZERO;
-       m.tex[0] = R_GetTexture(texture->texture);
+       m.tex[0] = R_GetTexture(texture->skin.base);
        m.tex[1] = R_GetTexture((**surfchain).lightmaptexture);
        if (gl_combine.integer)
                m.texrgbscale[1] = 4;
@@ -1083,7 +1075,7 @@ static void RSurfShader_OpaqueWall_Pass_BaseTexture(const entity_render_t *ent,
        memset(&m, 0, sizeof(m));
        m.blendfunc1 = GL_ONE;
        m.blendfunc2 = GL_ZERO;
-       m.tex[0] = R_GetTexture(texture->texture);
+       m.tex[0] = R_GetTexture(texture->skin.base);
        R_Mesh_State(&m);
        GL_Color(1, 1, 1, 1);
        while((surf = *surfchain++) != NULL)
@@ -1146,7 +1138,7 @@ static void RSurfShader_OpaqueWall_Pass_Light(const entity_render_t *ent, const
        memset(&m, 0, sizeof(m));
        m.blendfunc1 = GL_SRC_ALPHA;
        m.blendfunc2 = GL_ONE;
-       m.tex[0] = R_GetTexture(texture->texture);
+       m.tex[0] = R_GetTexture(texture->skin.base);
        colorscale = r_colorscale;
        if (gl_combine.integer)
        {
@@ -1213,7 +1205,7 @@ static void RSurfShader_OpaqueWall_Pass_BaseDetail(const entity_render_t *ent, c
        memset(&m, 0, sizeof(m));
        m.blendfunc1 = GL_DST_COLOR;
        m.blendfunc2 = GL_SRC_COLOR;
-       m.tex[0] = R_GetTexture(texture->detailtexture);
+       m.tex[0] = R_GetTexture(texture->skin.detail);
        R_Mesh_State(&m);
        GL_Color(1, 1, 1, 1);
        while((surf = *surfchain++) != NULL)
@@ -1239,7 +1231,7 @@ static void RSurfShader_OpaqueWall_Pass_Glow(const entity_render_t *ent, const t
        memset(&m, 0, sizeof(m));
        m.blendfunc1 = GL_SRC_ALPHA;
        m.blendfunc2 = GL_ONE;
-       m.tex[0] = R_GetTexture(texture->glowtexture);
+       m.tex[0] = R_GetTexture(texture->skin.glow);
        R_Mesh_State(&m);
        GL_Color(r_colorscale, r_colorscale, r_colorscale, 1);
        while((surf = *surfchain++) != NULL)
@@ -1265,7 +1257,7 @@ static void RSurfShader_OpaqueWall_Pass_OpaqueGlow(const entity_render_t *ent, c
        memset(&m, 0, sizeof(m));
        m.blendfunc1 = GL_SRC_ALPHA;
        m.blendfunc2 = GL_ZERO;
-       m.tex[0] = R_GetTexture(texture->glowtexture);
+       m.tex[0] = R_GetTexture(texture->skin.glow);
        R_Mesh_State(&m);
        if (m.tex[0])
                GL_Color(r_colorscale, r_colorscale, r_colorscale, 1);
@@ -1304,13 +1296,13 @@ static void RSurfShader_Wall_Vertex_Callback(const void *calldata1, int calldata
                currentalpha *= r_wateralpha.value;
        if (ent->effects & EF_ADDITIVE)
                rendertype = SURFRENDER_ADD;
-       else if (currentalpha < 1 || texture->fogtexture != NULL)
+       else if (currentalpha < 1 || texture->skin.fog != NULL)
                rendertype = SURFRENDER_ALPHA;
        else
                rendertype = SURFRENDER_OPAQUE;
 
        RSurfShader_Wall_Pass_BaseVertex(ent, surf, texture, rendertype, currentalpha);
-       if (texture->glowtexture)
+       if (texture->skin.glow)
                RSurfShader_Wall_Pass_Glow(ent, surf, texture, rendertype, currentalpha);
        if (fogenabled)
                RSurfShader_Wall_Pass_Fog(ent, surf, texture, rendertype, currentalpha);
@@ -1346,7 +1338,7 @@ static void RSurfShader_Wall_Lightmap(const entity_render_t *ent, const texture_
                for (chain = surfchain;(surf = *chain) != NULL;chain++)
                        if (surf->visframe == r_framecount)
                                RSurfShader_Wall_Pass_BaseVertex(ent, surf, texture, texture->rendertype, texture->currentalpha);
-               if (texture->glowtexture)
+               if (texture->skin.glow)
                        for (chain = surfchain;(surf = *chain) != NULL;chain++)
                                if (surf->visframe == r_framecount)
                                        RSurfShader_Wall_Pass_Glow(ent, surf, texture, texture->rendertype, texture->currentalpha);
@@ -1378,7 +1370,7 @@ static void RSurfShader_Wall_Lightmap(const entity_render_t *ent, const texture_
                }
                if (!r_dlightmap.integer && !(ent->effects & EF_FULLBRIGHT))
                        RSurfShader_OpaqueWall_Pass_Light(ent, texture, surfchain);
-               if (texture->glowtexture)
+               if (texture->skin.glow)
                        RSurfShader_OpaqueWall_Pass_Glow(ent, texture, surfchain);
                if (fogenabled)
                        RSurfShader_OpaqueWall_Pass_Fog(ent, texture, surfchain);
@@ -1415,7 +1407,7 @@ void R_UpdateTextureInfo(entity_render_t *ent)
                        t->currentalpha *= r_wateralpha.value;
                if (ent->effects & EF_ADDITIVE)
                        t->rendertype = SURFRENDER_ADD;
-               else if (t->currentalpha < 1 || t->fogtexture != NULL)
+               else if (t->currentalpha < 1 || t->skin.fog != NULL)
                        t->rendertype = SURFRENDER_ALPHA;
                else
                        t->rendertype = SURFRENDER_OPAQUE;
@@ -1430,7 +1422,7 @@ void R_PrepareSurfaces(entity_render_t *ent)
 {
        int i, numsurfaces, *surfacevisframes;
        model_t *model;
-       msurface_t *surf, *surfaces;
+       msurface_t *surf, *surfaces, **surfchain;
        vec3_t modelorg;
 
        if (!ent->model)
@@ -1447,6 +1439,26 @@ void R_PrepareSurfaces(entity_render_t *ent)
        if (r_dynamic.integer && r_shadow_lightingmode < 1)
                R_MarkLights(ent);
 
+       if (model->light_ambient != r_ambient.value || model->light_scalebit != r_lightmapscalebit)
+       {
+               model->light_ambient = r_ambient.value;
+               model->light_scalebit = r_lightmapscalebit;
+               for (i = 0;i < model->nummodelsurfaces;i++)
+                       model->surfaces[i + model->firstmodelsurface].cached_dlight = true;
+       }
+       else
+       {
+               for (i = 0;i < model->light_styles;i++)
+               {
+                       if (model->light_stylevalue[i] != d_lightstylevalue[model->light_style[i]])
+                       {
+                               model->light_stylevalue[i] = d_lightstylevalue[model->light_style[i]];
+                               for (surfchain = model->light_styleupdatechains[i];*surfchain;surfchain++)
+                                       (**surfchain).cached_dlight = true;
+                       }
+               }
+       }
+
        for (i = 0, surf = surfaces;i < numsurfaces;i++, surf++)
        {
                if (surfacevisframes[i] == r_framecount)
@@ -1468,23 +1480,8 @@ void R_PrepareSurfaces(entity_render_t *ent)
                        {
                                c_faces++;
                                surf->visframe = r_framecount;
-                               if (!r_vertexsurfaces.integer && surf->lightmaptexture != NULL)
-                               {
-                                       if (surf->cached_dlight
-                                        || surf->cached_ambient != r_ambient.value
-                                        || surf->cached_lightmapscalebit != r_lightmapscalebit)
-                                               R_BuildLightMap(ent, surf, false); // base lighting changed
-                                       else if (r_dynamic.integer)
-                                       {
-                                               if  (surf->styles[0] != 255 && (d_lightstylevalue[surf->styles[0]] != surf->cached_light[0]
-                                                || (surf->styles[1] != 255 && (d_lightstylevalue[surf->styles[1]] != surf->cached_light[1]
-                                                || (surf->styles[2] != 255 && (d_lightstylevalue[surf->styles[2]] != surf->cached_light[2]
-                                                || (surf->styles[3] != 255 && (d_lightstylevalue[surf->styles[3]] != surf->cached_light[3]))))))))
-                                                       R_BuildLightMap(ent, surf, false); // base lighting changed
-                                               else if (surf->dlightframe == r_framecount && r_dlightmap.integer)
-                                                       R_BuildLightMap(ent, surf, true); // only dlights
-                                       }
-                               }
+                               if (surf->cached_dlight && surf->lightmaptexture != NULL && !r_vertexsurfaces.integer)
+                                       R_BuildLightMap(ent, surf);
                        }
                }
        }
@@ -1849,8 +1846,8 @@ void R_Model_Brush_DrawLightForSurfaceList(entity_render_t *ent, vec3_t relative
                                {
                                        R_Mesh_ResizeCheck(mesh->numverts);
                                        memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4]));
-                                       R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->texture, t->nmaptexture, NULL);
-                                       R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->glosstexture, t->nmaptexture, NULL);
+                                       R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->skin.base, t->skin.nmap, NULL);
+                                       R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->skin.gloss, t->skin.nmap, NULL);
                                }
                        }
                }
@@ -1894,8 +1891,8 @@ void R_Model_Brush_DrawLight(entity_render_t *ent, vec3_t relativelightorigin, v
                                                        {
                                                                R_Mesh_ResizeCheck(mesh->numverts);
                                                                memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4]));
-                                                               R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->texture, t->nmaptexture, NULL);
-                                                               R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->glosstexture, t->nmaptexture, NULL);
+                                                               R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->skin.base, t->skin.nmap, NULL);
+                                                               R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->skin.gloss, t->skin.nmap, NULL);
                                                        }
                                                }
                                        }
@@ -1927,8 +1924,8 @@ void R_Model_Brush_DrawLight(entity_render_t *ent, vec3_t relativelightorigin, v
                                                        {
                                                                R_Mesh_ResizeCheck(mesh->numverts);
                                                                memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4]));
-                                                               R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->texture, t->nmaptexture, NULL);
-                                                               R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->glosstexture, t->nmaptexture, NULL);
+                                                               R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->skin.base, t->skin.nmap, NULL);
+                                                               R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->skin.gloss, t->skin.nmap, NULL);
                                                        }
                                                }
                                        }