]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rsurf.c
hopefully fix a race condition in S_StartSound
[xonotic/darkplaces.git] / gl_rsurf.c
index a7d91f1cc1b37fc074dde12523429aeb807531a6..96f2bc8acf7a12fdd389c7026a2b90eafc33950a 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)"};
@@ -346,14 +344,14 @@ static void R_DrawPortal_Callback(const entity_render_t *ent, const rtlight_t *r
        GL_PolygonOffset(r_refdef.polygonfactor, r_refdef.polygonoffset);
        GL_DepthTest(true);
        GL_CullFace(GL_NONE);
-       R_Mesh_Matrix(&identitymatrix);
+       R_EntityMatrix(&identitymatrix);
 
        numpoints = min(portal->numpoints, POLYGONELEMENTS_MAXPOINTS);
 
        R_Mesh_VertexPointer(vertex3f, 0, 0);
        R_Mesh_ColorPointer(NULL, 0, 0);
        R_Mesh_ResetTextureState();
-       R_SetupGenericShader(false);
+       R_SetupShader_Generic(NULL, NULL, GL_MODULATE, 1);
 
        isvis = (portal->here->clusterindex >= 0 && portal->past->clusterindex >= 0 && portal->here->clusterindex != portal->past->clusterindex);
 
@@ -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)
        {
@@ -541,9 +539,9 @@ void R_Q1BSP_DrawSky(entity_render_t *ent)
        if (ent->model == NULL)
                return;
        if (ent == r_refdef.scene.worldentity)
-               R_DrawWorldSurfaces(true, true, false, false);
+               R_DrawWorldSurfaces(true, true, false, false, false);
        else
-               R_DrawModelSurfaces(ent, true, true, false, false);
+               R_DrawModelSurfaces(ent, true, true, false, false, false);
 }
 
 extern void R_Water_AddWaterPlane(msurface_t *surface);
@@ -558,7 +556,7 @@ void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent)
        if (ent == r_refdef.scene.worldentity)
                RSurf_ActiveWorldEntity();
        else
-               RSurf_ActiveModelEntity(ent, false, false);
+               RSurf_ActiveModelEntity(ent, false, false, false);
 
        surfaces = model->data_surfaces;
        flagsmask = MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION;
@@ -592,9 +590,9 @@ void R_Q1BSP_Draw(entity_render_t *ent)
        if (model == NULL)
                return;
        if (ent == r_refdef.scene.worldentity)
-               R_DrawWorldSurfaces(false, true, false, false);
+               R_DrawWorldSurfaces(false, true, false, false, false);
        else
-               R_DrawModelSurfaces(ent, false, true, false, false);
+               R_DrawModelSurfaces(ent, false, true, false, false, false);
 }
 
 void R_Q1BSP_DrawDepth(entity_render_t *ent)
@@ -610,11 +608,11 @@ void R_Q1BSP_DrawDepth(entity_render_t *ent)
        GL_AlphaTest(false);
        R_Mesh_ColorPointer(NULL, 0, 0);
        R_Mesh_ResetTextureState();
-       R_SetupDepthOrShadowShader();
+       R_SetupShader_DepthOrShadow();
        if (ent == r_refdef.scene.worldentity)
-               R_DrawWorldSurfaces(false, false, true, false);
+               R_DrawWorldSurfaces(false, false, true, false, false);
        else
-               R_DrawModelSurfaces(ent, false, false, true, false);
+               R_DrawModelSurfaces(ent, false, false, true, false, false);
        GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1);
 }
 
@@ -623,9 +621,20 @@ void R_Q1BSP_DrawDebug(entity_render_t *ent)
        if (ent->model == NULL)
                return;
        if (ent == r_refdef.scene.worldentity)
-               R_DrawWorldSurfaces(false, false, false, true);
+               R_DrawWorldSurfaces(false, false, false, true, false);
+       else
+               R_DrawModelSurfaces(ent, false, false, false, true, false);
+}
+
+void R_Q1BSP_DrawPrepass(entity_render_t *ent)
+{
+       dp_model_t *model = ent->model;
+       if (model == NULL)
+               return;
+       if (ent == r_refdef.scene.worldentity)
+               R_DrawWorldSurfaces(false, true, false, false, true);
        else
-               R_DrawModelSurfaces(ent, false, false, false, true);
+               R_DrawModelSurfaces(ent, false, true, false, false, true);
 }
 
 typedef struct r_q1bsp_getlightinfo_s
@@ -650,6 +659,8 @@ typedef struct r_q1bsp_getlightinfo_s
        const unsigned char *pvs;
        qboolean svbsp_active;
        qboolean svbsp_insertoccluder;
+       int numfrustumplanes;
+       const mplane_t *frustumplanes;
 }
 r_q1bsp_getlightinfo_t;
 
@@ -664,7 +675,7 @@ static void R_Q1BSP_RecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, mnode_t
                //      return;
                if (!plane)
                        break;
-               //if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(node->mins, node->maxs, rsurface.rtlight_numfrustumplanes, rsurface.rtlight_frustumplanes))
+               //if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(node->mins, node->maxs, rtlight->cached_numfrustumplanes, rtlight->cached_frustumplanes))
                //      return;
                if (plane->type < 3)
                {
@@ -706,14 +717,14 @@ static void R_Q1BSP_RecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, mnode_t
                                node = node->children[sides - 1];
                }
        }
-       if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(node->mins, node->maxs, rsurface.rtlight_numfrustumplanes, rsurface.rtlight_frustumplanes))
+       if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(node->mins, node->maxs, info->numfrustumplanes, info->frustumplanes))
                return;
        leaf = (mleaf_t *)node;
        if (info->svbsp_active)
        {
                int i;
                mportal_t *portal;
-               double points[128][3];
+               static float points[128][3];
                for (portal = leaf->portals;portal;portal = portal->next)
                {
                        for (i = 0;i < portal->numpoints;i++)
@@ -757,7 +768,7 @@ static void R_Q1BSP_RecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, mnode_t
                msurface_t *surface;
                const int *e;
                const vec_t *v[3];
-               double v2[3][3];
+               float v2[3][3];
                for (leafsurfaceindex = 0;leafsurfaceindex < leaf->numleafsurfaces;leafsurfaceindex++)
                {
                        surfaceindex = leaf->firstleafsurface[leafsurfaceindex];
@@ -779,8 +790,6 @@ static void R_Q1BSP_RecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, mnode_t
                                                {
                                                        if (info->svbsp_insertoccluder)
                                                        {
-                                                               if (!(currentmaterialflags & MATERIALFLAG_NOCULLFACE) && r_shadow_frontsidecasting.integer != PointInfrontOfTriangle(info->relativelightorigin, v[0], v[1], v[2]))
-                                                                       continue;
                                                                if (currentmaterialflags & MATERIALFLAG_NOSHADOW)
                                                                        continue;
                                                                VectorCopy(v[0], v2[0]);
@@ -848,7 +857,7 @@ static void R_Q1BSP_CallRecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, qboo
 {
        if (use_svbsp)
        {
-               double origin[3];
+               float origin[3];
                VectorCopy(info->relativelightorigin, origin);
                if (!r_svbsp.nodes)
                {
@@ -909,15 +918,15 @@ static void R_Q1BSP_CallRecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, qboo
 
        info->svbsp_insertoccluder = false;
        R_Q1BSP_RecursiveGetLightInfo(info, info->model->brush.data_nodes);
-       if (developer.integer >= 100 && use_svbsp)
+       if (developer_extra.integer && use_svbsp)
        {
-               Con_Printf("GetLightInfo: svbsp built with %i nodes, polygon stats:\n", r_svbsp.numnodes);
-               Con_Printf("occluders: %i accepted, %i rejected, %i fragments accepted, %i fragments rejected.\n", r_svbsp.stat_occluders_accepted, r_svbsp.stat_occluders_rejected, r_svbsp.stat_occluders_fragments_accepted, r_svbsp.stat_occluders_fragments_rejected);
-               Con_Printf("queries  : %i accepted, %i rejected, %i fragments accepted, %i fragments rejected.\n", r_svbsp.stat_queries_accepted, r_svbsp.stat_queries_rejected, r_svbsp.stat_queries_fragments_accepted, r_svbsp.stat_queries_fragments_rejected);
+               Con_DPrintf("GetLightInfo: svbsp built with %i nodes, polygon stats:\n", r_svbsp.numnodes);
+               Con_DPrintf("occluders: %i accepted, %i rejected, %i fragments accepted, %i fragments rejected.\n", r_svbsp.stat_occluders_accepted, r_svbsp.stat_occluders_rejected, r_svbsp.stat_occluders_fragments_accepted, r_svbsp.stat_occluders_fragments_rejected);
+               Con_DPrintf("queries  : %i accepted, %i rejected, %i fragments accepted, %i fragments rejected.\n", r_svbsp.stat_queries_accepted, r_svbsp.stat_queries_rejected, r_svbsp.stat_queries_fragments_accepted, r_svbsp.stat_queries_fragments_rejected);
        }
 }
 
-void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs, unsigned char *visitingleafpvs)
+void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs, unsigned char *visitingleafpvs, int numfrustumplanes, const mplane_t *frustumplanes)
 {
        r_q1bsp_getlightinfo_t info;
        VectorCopy(relativelightorigin, info.relativelightorigin);
@@ -946,6 +955,8 @@ void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, floa
        info.outshadowtrispvs = outshadowtrispvs;
        info.outlighttrispvs = outlighttrispvs;
        info.outnumsurfaces = 0;
+       info.numfrustumplanes = numfrustumplanes;
+       info.frustumplanes = frustumplanes;
        VectorCopy(info.relativelightorigin, info.outmins);
        VectorCopy(info.relativelightorigin, info.outmaxs);
        memset(visitingleafpvs, 0, (info.model->brush.num_leafs + 7) >> 3);
@@ -1158,18 +1169,18 @@ static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, co
 
 #define RSURF_MAX_BATCHSURFACES 8192
 
-void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs)
+extern qboolean r_shadow_usingdeferredprepass;
+void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surfacelist, const unsigned char *lighttrispvs)
 {
        dp_model_t *model = ent->model;
        const msurface_t *surface;
        int i, k, kend, l, m, mend, endsurface, batchnumsurfaces, batchnumtriangles, batchfirstvertex, batchlastvertex, batchfirsttriangle;
-       qboolean usebufferobject, culltriangles;
+       qboolean usebufferobject;
        const int *element3i;
-       msurface_t *batchsurfacelist[RSURF_MAX_BATCHSURFACES];
-       int batchelements[BATCHSIZE*3];
+       static msurface_t *batchsurfacelist[RSURF_MAX_BATCHSURFACES];
+       static int batchelements[BATCHSIZE*3];
        texture_t *tex;
        CHECKGLERROR
-       culltriangles = r_shadow_culltriangles.integer && !(ent->flags & RENDER_NOSELFSHADOW);
        element3i = rsurface.modelelement3i;
        // this is a double loop because non-visible surface skipping has to be
        // fast, and even if this is not the world model (and hence no visibility
@@ -1219,6 +1230,8 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
                                }
                                continue;
                        }
+                       if (r_shadow_usingdeferredprepass)
+                               continue;
                        batchnumtriangles = 0;
                        batchfirsttriangle = surface->num_firsttriangle;
                        m = 0; // hush warning
@@ -1228,17 +1241,9 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
                                RSurf_PrepareVerticesForBatch(true, true, 1, &surface);
                                for (m = surface->num_firsttriangle, mend = m + surface->num_triangles;m < mend;m++)
                                {
-                                       if (trispvs)
+                                       if (lighttrispvs && r_test.integer)
                                        {
-                                               if (!CHECKPVSBIT(trispvs, m))
-                                               {
-                                                       usebufferobject = false;
-                                                       continue;
-                                               }
-                                       }
-                                       else if (culltriangles)
-                                       {
-                                               if (r_shadow_frontsidecasting.integer && !PointInfrontOfTriangle(rsurface.entitylightorigin, rsurface.vertex3f + element3i[m*3+0]*3, rsurface.vertex3f + element3i[m*3+1]*3, rsurface.vertex3f + element3i[m*3+2]*3))
+                                               if (!CHECKPVSBIT(lighttrispvs, m))
                                                {
                                                        usebufferobject = false;
                                                        continue;
@@ -1287,7 +1292,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;
@@ -1300,7 +1306,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);
@@ -1311,16 +1318,18 @@ void R_ReplaceWorldTexture (void)
        {
                if(/*t->width && !strcasecmp(t->name, r)*/ matchpattern( t->name, r, true ) )
                {
-                       if ((skinframe = R_SkinFrame_LoadExternal(newt, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true)))
+                       if ((skinframe = R_SkinFrame_LoadExternal(newt, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PICMIP, true)))
                        {
 //                             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;
                        }
                }