X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=gl_rsurf.c;h=9478d237a3f8774077fa7b85b3cb376c8d354391;hb=aabde35b19947b4cb10b1fe716a9a603031b2809;hp=39e51aec3704709db92bb029f500182c9e1cbae8;hpb=9995e243c1af378170518a1308f24dc66094f1e1;p=xonotic%2Fdarkplaces.git diff --git a/gl_rsurf.c b/gl_rsurf.c index 39e51aec..9478d237 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -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); + 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, 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); @@ -1019,7 +1030,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 @@ -1084,7 +1095,7 @@ void R_Q1BSP_CompileShadowMap(entity_render_t *ent, vec3_t relativelightorigin, 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; - msurface_t *surface, *batch[1024]; + 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)) @@ -1121,7 +1132,6 @@ void R_Q1BSP_DrawShadowMap(int side, entity_render_t *ent, const vec3_t relative 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); } } @@ -1131,7 +1141,7 @@ static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, co { 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); @@ -1158,18 +1168,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; - msurface_t *surface; + 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 +1229,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 +1240,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 (!CHECKPVSBIT(trispvs, m)) - { - usebufferobject = false; - continue; - } - } - else if (culltriangles) + if (lighttrispvs && r_test.integer) { - 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 +1291,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 +1305,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 +1317,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; } }