]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rsurf.c
r_replacemaptexture: no printings for GAME_BLOODOMNICIDE
[xonotic/darkplaces.git] / gl_rsurf.c
index 787b280f556f3f8649cf5ab9ac4a19e9ac71941d..32e657dc9c245f1d0b1617573e2971ddd2a46dd9 100644 (file)
@@ -23,8 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "r_shadow.h"
 #include "portals.h"
 
-#define MAX_LIGHTMAP_SIZE 256
-
 cvar_t r_ambient = {0, "r_ambient", "0", "brightens map, value is 0-128"};
 cvar_t r_lockpvs = {0, "r_lockpvs", "0", "disables pvs switching, allows you to walk around and inspect what is visible from a given location in the map (anything not visible from your current location will not be drawn)"};
 cvar_t r_lockvisibility = {0, "r_lockvisibility", "0", "disables visibility updates, allows you to walk around and inspect what is visible from a given viewpoint in the map (anything offscreen at the moment this is enabled will not be drawn)"};
@@ -364,7 +362,7 @@ static void R_DrawPortal_Callback(const entity_render_t *ent, const rtlight_t *r
                         isvis ? 0.125f : 0.03125f);
        for (i = 0, v = vertex3f;i < numpoints;i++, v += 3)
                VectorCopy(portal->points[i].position, v);
-       R_Mesh_Draw(0, numpoints, 0, numpoints - 2, NULL, polygonelements, 0, 0);
+       R_Mesh_Draw(0, numpoints, 0, numpoints - 2, polygonelement3i, polygonelement3s, 0, 0);
 }
 
 // LordHavoc: this is just a nice debugging tool, very slow
@@ -435,7 +433,7 @@ void R_View_WorldVisibility(qboolean forcenovis)
        viewleaf = model->brush.PointInLeaf ? model->brush.PointInLeaf(model, r_refdef.view.origin) : NULL;
        // if possible fetch the visible cluster bits
        if (!r_lockpvs.integer && model->brush.FatPVS)
-               model->brush.FatPVS(model, r_refdef.view.origin, 2, r_refdef.viewcache.world_pvsbits, sizeof(r_refdef.viewcache.world_pvsbits), false);
+               model->brush.FatPVS(model, r_refdef.view.origin, 2, r_refdef.viewcache.world_pvsbits, (r_refdef.viewcache.world_numclusters+7)>>3, false);
 
        if (!r_lockvisibility.integer)
        {
@@ -1019,7 +1017,7 @@ extern cvar_t r_polygonoffset_submodel_offset;
 void R_Q1BSP_DrawShadowVolume(entity_render_t *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int modelnumsurfaces, const int *modelsurfacelist, const vec3_t lightmins, const vec3_t lightmaxs)
 {
        dp_model_t *model = ent->model;
-       msurface_t *surface;
+       const msurface_t *surface;
        int modelsurfacelistindex;
        float projectdistance = relativelightdirection ? lightradius : lightradius + model->radius*2 + r_shadow_projectdistance.value;
        // check the box in modelspace, it was already checked in worldspace
@@ -1059,17 +1057,83 @@ void R_Q1BSP_DrawShadowVolume(entity_render_t *ent, const vec3_t relativelightor
                GL_PolygonOffset(r_refdef.shadowpolygonfactor, r_refdef.shadowpolygonoffset);
 }
 
+void R_Q1BSP_CompileShadowMap(entity_render_t *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist)
+{
+       dp_model_t *model = ent->model;
+       msurface_t *surface;
+       int surfacelistindex;
+       int sidetotals[6] = { 0, 0, 0, 0, 0, 0 }, sidemasks = 0;
+       int i;
+       r_shadow_compilingrtlight->static_meshchain_shadow_shadowmap = Mod_ShadowMesh_Begin(r_main_mempool, 32768, 32768, NULL, NULL, NULL, false, false, true);
+       R_Shadow_PrepareShadowSides(model->brush.shadowmesh->numtriangles);
+       for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++)
+       {
+               surface = model->data_surfaces + surfacelist[surfacelistindex];
+               sidemasks |= R_Shadow_ChooseSidesFromBox(surface->num_firstshadowmeshtriangle, surface->num_triangles, model->brush.shadowmesh->vertex3f, model->brush.shadowmesh->element3i, &r_shadow_compilingrtlight->matrix_worldtolight, relativelightorigin, relativelightdirection, r_shadow_compilingrtlight->cullmins, r_shadow_compilingrtlight->cullmaxs, surface->mins, surface->maxs, surface->texture->basematerialflags & MATERIALFLAG_NOSHADOW ? NULL : sidetotals);
+       }
+       R_Shadow_ShadowMapFromList(model->brush.shadowmesh->numverts, model->brush.shadowmesh->numtriangles, model->brush.shadowmesh->vertex3f, model->brush.shadowmesh->element3i, numshadowsides, sidetotals, shadowsides, shadowsideslist);
+       r_shadow_compilingrtlight->static_meshchain_shadow_shadowmap = Mod_ShadowMesh_Finish(r_main_mempool, r_shadow_compilingrtlight->static_meshchain_shadow_shadowmap, false, false, true);
+       r_shadow_compilingrtlight->static_shadowmap_receivers &= sidemasks;
+       for(i = 0;i<6;i++)
+               if(!sidetotals[i])
+                       r_shadow_compilingrtlight->static_shadowmap_casters &= ~(1 << i);
+}
+
+void R_Q1BSP_DrawShadowMap(int side, entity_render_t *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int modelnumsurfaces, const int *modelsurfacelist, const unsigned char *surfacesides, const vec3_t lightmins, const vec3_t lightmaxs)
+{
+       dp_model_t *model = ent->model;
+       const msurface_t *surface, *batch[1024];
+       int modelsurfacelistindex, batchsize;
+       // check the box in modelspace, it was already checked in worldspace
+       if (!BoxesOverlap(model->normalmins, model->normalmaxs, lightmins, lightmaxs))
+               return;
+       // identify lit faces within the bounding box
+       for (modelsurfacelistindex = 0;modelsurfacelistindex < modelnumsurfaces;modelsurfacelistindex++)
+       {
+               surface = model->data_surfaces + modelsurfacelist[modelsurfacelistindex];
+               if (surfacesides && !(surfacesides[modelsurfacelistindex] && (1 << side)))
+                       continue;
+               rsurface.texture = R_GetCurrentTexture(surface->texture);
+               if (rsurface.texture->currentmaterialflags & MATERIALFLAG_NOSHADOW)
+                       continue;
+               if (!BoxesOverlap(lightmins, lightmaxs, surface->mins, surface->maxs))
+                       continue;
+               r_refdef.stats.lights_dynamicshadowtriangles += surface->num_triangles;
+               r_refdef.stats.lights_shadowtriangles += surface->num_triangles;
+               batch[0] = surface;
+               batchsize = 1;
+               while(++modelsurfacelistindex < modelnumsurfaces && batchsize < (int)(sizeof(batch)/sizeof(batch[0])))
+               {
+                       surface = model->data_surfaces + modelsurfacelist[modelsurfacelistindex];
+                       if (surfacesides && !(surfacesides[modelsurfacelistindex] & (1 << side)))
+                               continue;
+                       if (surface->texture != batch[0]->texture)
+                               break;
+                       if (!BoxesOverlap(lightmins, lightmaxs, surface->mins, surface->maxs))
+                               continue;
+                       r_refdef.stats.lights_dynamicshadowtriangles += surface->num_triangles;
+                       r_refdef.stats.lights_shadowtriangles += surface->num_triangles;
+                       batch[batchsize++] = surface;
+               }
+               --modelsurfacelistindex;
+               GL_CullFace(rsurface.texture->currentmaterialflags & MATERIALFLAG_NOCULLFACE ? GL_NONE : r_refdef.view.cullface_back);
+               RSurf_PrepareVerticesForBatch(false, false, batchsize, batch);
+               RSurf_DrawBatch_Simple(batchsize, batch);
+               GL_LockArrays(0, 0);
+       }
+}
+
 #define BATCHSIZE 1024
 
 static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, const rtlight_t *rtlight, int numsurfaces, int *surfacelist)
 {
        int i, j, endsurface;
        texture_t *t;
-       msurface_t *surface;
+       const msurface_t *surface;
        // note: in practice this never actually receives batches), oh well
        R_Shadow_RenderMode_Begin();
        R_Shadow_RenderMode_ActiveLight(rtlight);
-       R_Shadow_RenderMode_Lighting(false, true);
+       R_Shadow_RenderMode_Lighting(false, true, false);
        R_Shadow_SetupEntityLight(ent);
        for (i = 0;i < numsurfaces;i = j)
        {
@@ -1095,7 +1159,7 @@ static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, co
 void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs)
 {
        dp_model_t *model = ent->model;
-       msurface_t *surface;
+       const msurface_t *surface;
        int i, k, kend, l, m, mend, endsurface, batchnumsurfaces, batchnumtriangles, batchfirstvertex, batchlastvertex, batchfirsttriangle;
        qboolean usebufferobject, culltriangles;
        const int *element3i;
@@ -1221,7 +1285,8 @@ void R_ReplaceWorldTexture (void)
        skinframe_t *skinframe;
        if (!r_refdef.scene.worldmodel)
        {
-               Con_Printf("There is no worldmodel\n");
+               if (gamemode != GAME_BLOODOMNICIDE)
+                       Con_Printf("There is no worldmodel\n");
                return;
        }
        m = r_refdef.scene.worldmodel;
@@ -1234,7 +1299,8 @@ void R_ReplaceWorldTexture (void)
        }
        if(!cl.islocalgame || !cl.worldmodel)
        {
-               Con_Print("This command works only in singleplayer\n");
+               if (gamemode != GAME_BLOODOMNICIDE)
+                       Con_Print("This command works only in singleplayer\n");
                return;
        }
        r = Cmd_Argv(1);
@@ -1250,11 +1316,13 @@ void R_ReplaceWorldTexture (void)
 //                             t->skinframes[0] = skinframe;
                                t->currentskinframe = skinframe;
                                t->currentskinframe = skinframe;
-                               Con_Printf("%s replaced with %s\n", r, newt);
+                               if (gamemode != GAME_BLOODOMNICIDE)
+                                       Con_Printf("%s replaced with %s\n", r, newt);
                        }
                        else
                        {
-                               Con_Printf("%s was not found\n", newt);
+                               if (gamemode != GAME_BLOODOMNICIDE)
+                                       Con_Printf("%s was not found\n", newt);
                                return;
                        }
                }