From: Akari Date: Tue, 29 Mar 2011 09:02:58 +0000 (+0300) Subject: fix gl_rsurf X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=854fba21d443e6a69a08199dc0e83661d914367a;p=xonotic%2Fdarkplaces.git fix gl_rsurf --- diff --git a/gl_rsurf.c b/gl_rsurf.c index 9f699501..06d8fb03 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -1076,127 +1076,6 @@ static void R_Q1BSP_RecursiveGetLightInfo_BIH(r_q1bsp_getlightinfo_t *info, cons } } -static void R_Q1BSP_RecursiveGetLightInfo_BIH(r_q1bsp_getlightinfo_t *info, const bih_t *bih) -{ - bih_leaf_t *leaf; - bih_node_t *node; - int nodenum; - int axis; - int surfaceindex; - int t; - int currentmaterialflags; - qboolean castshadow; - msurface_t *surface; - const int *e; - const vec_t *v[3]; - float v2[3][3]; - int nodestack[GETLIGHTINFO_MAXNODESTACK]; - int nodestackpos = 0; - // note: because the BSP leafs are not in the BIH tree, the _BSP function - // must be called to mark leafs visible for entity culling... - // we start at the root node - nodestack[nodestackpos++] = 0; - // we'll be done when the stack is empty - while (nodestackpos) - { - // pop one off the stack to process - nodenum = nodestack[--nodestackpos]; - if (nodenum >= 0) - { - // node - node = bih->nodes + nodenum; - axis = node->type - BIH_SPLITX; -#if 0 - if (!BoxesOverlap(info->lightmins, info->lightmaxs, node->mins, node->maxs)) - continue; -#endif -#if 0 - if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(node->mins, node->maxs, rtlight->cached_numfrustumplanes, rtlight->cached_frustumplanes)) - continue; -#endif - if (info->lightmins[axis] <= node->backmax) - { - if (info->lightmaxs[axis] >= node->frontmin && nodestackpos < GETLIGHTINFO_MAXNODESTACK) - nodestack[nodestackpos++] = node->front; - nodestack[nodestackpos++] = node->back; - } - else if (info->lightmaxs[axis] >= node->frontmin) - nodestack[nodestackpos++] = node->front; - else - continue; // light falls between children, nothing here - } - else - { - // leaf - leaf = bih->leafs + (-1-nodenum); - if (leaf->type != BIH_RENDERTRIANGLE) - continue; -#if 1 - if (!BoxesOverlap(info->lightmins, info->lightmaxs, leaf->mins, leaf->maxs)) - continue; -#endif -#if 1 - if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(leaf->mins, leaf->maxs, info->numfrustumplanes, info->frustumplanes)) - continue; -#endif - surfaceindex = leaf->surfaceindex; - surface = info->model->data_surfaces + surfaceindex; - currentmaterialflags = R_GetCurrentTexture(surface->texture)->currentmaterialflags; - castshadow = !(currentmaterialflags & MATERIALFLAG_NOSHADOW); - t = leaf->itemindex + surface->num_firstshadowmeshtriangle - surface->num_firsttriangle; - e = info->model->brush.shadowmesh->element3i + t * 3; - v[0] = info->model->brush.shadowmesh->vertex3f + e[0] * 3; - v[1] = info->model->brush.shadowmesh->vertex3f + e[1] * 3; - v[2] = info->model->brush.shadowmesh->vertex3f + e[2] * 3; - VectorCopy(v[0], v2[0]); - VectorCopy(v[1], v2[1]); - VectorCopy(v[2], v2[2]); - if (info->svbsp_insertoccluder) - { - if (castshadow) - SVBSP_AddPolygon(&r_svbsp, 3, v2[0], true, NULL, NULL, 0); - continue; - } - if (info->svbsp_active && !(SVBSP_AddPolygon(&r_svbsp, 3, v2[0], false, NULL, NULL, 0) & 2)) - continue; - // we don't occlude triangles from lighting even - // if they are backfacing, because when using - // shadowmapping they are often not fully occluded - // on the horizon of an edge - SETPVSBIT(info->outlighttrispvs, t); - if (castshadow) - { - if (currentmaterialflags & MATERIALFLAG_NOCULLFACE) - { - // if the material is double sided we - // can't cull by direction - SETPVSBIT(info->outshadowtrispvs, t); - } - else if (r_shadow_frontsidecasting.integer) - { - // front side casting occludes backfaces, - // so they are completely useless as both - // casters and lit polygons - if (PointInfrontOfTriangle(info->relativelightorigin, v2[0], v2[1], v2[2])) - SETPVSBIT(info->outshadowtrispvs, t); - } - else - { - // back side casting does not occlude - // anything so we can't cull lit polygons - if (!PointInfrontOfTriangle(info->relativelightorigin, v2[0], v2[1], v2[2])) - SETPVSBIT(info->outshadowtrispvs, t); - } - } - if (!CHECKPVSBIT(info->outsurfacepvs, surfaceindex)) - { - SETPVSBIT(info->outsurfacepvs, surfaceindex); - info->outsurfacelist[info->outnumsurfaces++] = surfaceindex; - } - } - } -} - static void R_Q1BSP_CallRecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, qboolean use_svbsp) { extern cvar_t r_shadow_usebihculling;