X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=gl_rsurf.c;h=72c5a472b936c48cc544512edc9739139af876e7;hb=135e0beb0c30b770396161df034c0e5e0c100c04;hp=8a915155459bc13c3cd212c29f42d8446b4ce378;hpb=30e9e3da5e1dc0e7214729dba936520a508aad4e;p=xonotic%2Fdarkplaces.git diff --git a/gl_rsurf.c b/gl_rsurf.c index 8a915155..72c5a472 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -524,6 +524,8 @@ void R_View_WorldVisibility(qboolean forcenovis) int leafstackpos; mportal_t *p; mleaf_t *leafstack[8192]; + vec3_t cullmins, cullmaxs; + float cullbias = r_nearclip.value * 2.0f; // the nearclip plane can easily end up culling portals in certain perfectly-aligned views, causing view blackouts // simple-frustum portal method: // follows portals leading outward from viewleaf, does not venture // offscreen or into leafs that are not visible, faster than @@ -548,20 +550,27 @@ void R_View_WorldVisibility(qboolean forcenovis) r_refdef.viewcache.world_surfacevisible[*mark] = true; // follow portals into other leafs // the checks are: - // if viewer is behind portal (portal faces outward into the scene) - // and the portal polygon's bounding box is on the screen - // and the leaf has not been visited yet + // the leaf has not been visited yet // and the leaf is visible in the pvs - // (the first two checks won't cause as many cache misses as the leaf checks) + // the portal polygon's bounding box is on the screen for (p = leaf->portals;p;p = p->next) { r_refdef.stats[r_stat_world_portals]++; - if (DotProduct(r_refdef.view.origin, p->plane.normal) < (p->plane.dist + 1) - && !r_refdef.viewcache.world_leafvisible[p->past - model->brush.data_leafs] - && CHECKPVSBIT(r_refdef.viewcache.world_pvsbits, p->past->clusterindex) - && !R_CullBox(p->mins, p->maxs) - && leafstackpos < (int)(sizeof(leafstack) / sizeof(leafstack[0]))) - leafstack[leafstackpos++] = p->past; + if (r_refdef.viewcache.world_leafvisible[p->past - model->brush.data_leafs]) + continue; + if (!CHECKPVSBIT(r_refdef.viewcache.world_pvsbits, p->past->clusterindex)) + continue; + cullmins[0] = p->mins[0] - cullbias; + cullmins[1] = p->mins[1] - cullbias; + cullmins[2] = p->mins[2] - cullbias; + cullmaxs[0] = p->maxs[0] + cullbias; + cullmaxs[1] = p->maxs[1] + cullbias; + cullmaxs[2] = p->maxs[2] + cullbias; + if (R_CullBox(cullmins, cullmaxs)) + continue; + if (leafstackpos >= (int)(sizeof(leafstack) / sizeof(leafstack[0]))) + break; + leafstack[leafstackpos++] = p->past; } } } @@ -637,7 +646,7 @@ void R_Q1BSP_Draw(entity_render_t *ent) void R_Q1BSP_DrawDepth(entity_render_t *ent) { dp_model_t *model = ent->model; - if (model == NULL) + if (model == NULL || model->surfmesh.isanimated) return; GL_ColorMask(0,0,0,0); GL_Color(1,1,1,1); @@ -766,13 +775,13 @@ static void R_Q1BSP_RecursiveGetLightInfo_BSP(r_q1bsp_getlightinfo_t *info, qboo // recurse front side first because the svbsp building prefers it if (info->relativelightorigin[plane->type] >= plane->dist) { - if (nodestackpos < GETLIGHTINFO_MAXNODESTACK) + if (nodestackpos < GETLIGHTINFO_MAXNODESTACK-1) nodestack[nodestackpos++] = node->children[0]; nodestack[nodestackpos++] = node->children[1]; } else { - if (nodestackpos < GETLIGHTINFO_MAXNODESTACK) + if (nodestackpos < GETLIGHTINFO_MAXNODESTACK-1) nodestack[nodestackpos++] = node->children[1]; nodestack[nodestackpos++] = node->children[0]; } @@ -796,13 +805,13 @@ static void R_Q1BSP_RecursiveGetLightInfo_BSP(r_q1bsp_getlightinfo_t *info, qboo // recurse front side first because the svbsp building prefers it if (PlaneDist(info->relativelightorigin, plane) >= 0) { - if (nodestackpos < GETLIGHTINFO_MAXNODESTACK) + if (nodestackpos < GETLIGHTINFO_MAXNODESTACK-1) nodestack[nodestackpos++] = node->children[0]; nodestack[nodestackpos++] = node->children[1]; } else { - if (nodestackpos < GETLIGHTINFO_MAXNODESTACK) + if (nodestackpos < GETLIGHTINFO_MAXNODESTACK-1) nodestack[nodestackpos++] = node->children[1]; nodestack[nodestackpos++] = node->children[0]; } @@ -1075,7 +1084,7 @@ static void R_Q1BSP_RecursiveGetLightInfo_BIH(r_q1bsp_getlightinfo_t *info, cons #endif if (info->lightmins[axis] <= node->backmax) { - if (info->lightmaxs[axis] >= node->frontmin && nodestackpos < GETLIGHTINFO_MAXNODESTACK) + if (info->lightmaxs[axis] >= node->frontmin && nodestackpos < GETLIGHTINFO_MAXNODESTACK-1) nodestack[nodestackpos++] = node->front; nodestack[nodestackpos++] = node->back; continue; @@ -1440,7 +1449,7 @@ static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, co // note: in practice this never actually receives batches R_Shadow_RenderMode_Begin(); R_Shadow_RenderMode_ActiveLight(rtlight); - R_Shadow_RenderMode_Lighting(false, true, false); + R_Shadow_RenderMode_Lighting(false, true, rtlight->shadowmapatlassidesize != 0, (ent->flags & RENDER_NOSELFSHADOW) != 0); R_Shadow_SetupEntityLight(ent); for (i = 0;i < numsurfaces;i = j) { @@ -1609,7 +1618,7 @@ static void R_ListWorldTextures (void) Con_Print("Worldmodel textures :\n"); for(i=0,t=m->data_textures;inum_textures;i++,t++) - if (t->numskinframes) + if (t->name[0] && strcasecmp(t->name, "NO TEXTURE FOUND")) Con_Printf("%s\n", t->name); }