int *vertexremap;
int vertexupdatenum;
-int r_shadow_buffer_numclusterpvsbytes;
-qbyte *r_shadow_buffer_clusterpvs;
-int *r_shadow_buffer_clusterlist;
+int r_shadow_buffer_numleafpvsbytes;
+qbyte *r_shadow_buffer_leafpvs;
+int *r_shadow_buffer_leaflist;
int r_shadow_buffer_numsurfacepvsbytes;
qbyte *r_shadow_buffer_surfacepvs;
int *r_shadow_buffer_surfacelist;
rtexturepool_t *r_shadow_texturepool;
-rtexture_t *r_shadow_normalcubetexture;
rtexture_t *r_shadow_attenuation2dtexture;
rtexture_t *r_shadow_attenuation3dtexture;
-rtexture_t *r_shadow_blankwhitecubetexture;
// lights are reloaded when this changes
char r_shadow_mapname[MAX_QPATH];
cvar_t r_shadow_portallight = {0, "r_shadow_portallight", "1"};
cvar_t r_shadow_projectdistance = {0, "r_shadow_projectdistance", "1000000"};
cvar_t r_shadow_realtime_dlight = {CVAR_SAVE, "r_shadow_realtime_dlight", "1"};
-cvar_t r_shadow_realtime_dlight_shadows = {CVAR_SAVE, "r_shadow_realtime_dlight_shadows", "0"};
+cvar_t r_shadow_realtime_dlight_shadows = {CVAR_SAVE, "r_shadow_realtime_dlight_shadows", "1"};
+cvar_t r_shadow_realtime_dlight_portalculling = {0, "r_shadow_realtime_dlight_portalculling", "0"};
cvar_t r_shadow_realtime_world = {CVAR_SAVE, "r_shadow_realtime_world", "0"};
cvar_t r_shadow_realtime_world_dlightshadows = {CVAR_SAVE, "r_shadow_realtime_world_dlightshadows", "1"};
cvar_t r_shadow_realtime_world_lightmaps = {CVAR_SAVE, "r_shadow_realtime_world_lightmaps", "0"};
int i;
// allocate vertex processing arrays
numcubemaps = 0;
- r_shadow_normalcubetexture = NULL;
r_shadow_attenuation2dtexture = NULL;
r_shadow_attenuation3dtexture = NULL;
- r_shadow_blankwhitecubetexture = NULL;
r_shadow_texturepool = NULL;
r_shadow_filters_texturepool = NULL;
R_Shadow_ValidateCvars();
shadowmark = NULL;
shadowmarklist = NULL;
shadowmarkcount = 0;
- r_shadow_buffer_numclusterpvsbytes = 0;
- r_shadow_buffer_clusterpvs = NULL;
- r_shadow_buffer_clusterlist = NULL;
+ r_shadow_buffer_numleafpvsbytes = 0;
+ r_shadow_buffer_leafpvs = NULL;
+ r_shadow_buffer_leaflist = NULL;
r_shadow_buffer_numsurfacepvsbytes = 0;
r_shadow_buffer_surfacepvs = NULL;
r_shadow_buffer_surfacelist = NULL;
}
}
numcubemaps = 0;
- r_shadow_normalcubetexture = NULL;
r_shadow_attenuation2dtexture = NULL;
r_shadow_attenuation3dtexture = NULL;
- r_shadow_blankwhitecubetexture = NULL;
R_FreeTexturePool(&r_shadow_texturepool);
R_FreeTexturePool(&r_shadow_filters_texturepool);
maxshadowelements = 0;
Mem_Free(shadowmarklist);
shadowmarklist = NULL;
shadowmarkcount = 0;
- r_shadow_buffer_numclusterpvsbytes = 0;
- if (r_shadow_buffer_clusterpvs)
- Mem_Free(r_shadow_buffer_clusterpvs);
- r_shadow_buffer_clusterpvs = NULL;
- if (r_shadow_buffer_clusterlist)
- Mem_Free(r_shadow_buffer_clusterlist);
- r_shadow_buffer_clusterlist = NULL;
+ r_shadow_buffer_numleafpvsbytes = 0;
+ if (r_shadow_buffer_leafpvs)
+ Mem_Free(r_shadow_buffer_leafpvs);
+ r_shadow_buffer_leafpvs = NULL;
+ if (r_shadow_buffer_leaflist)
+ Mem_Free(r_shadow_buffer_leaflist);
+ r_shadow_buffer_leaflist = NULL;
r_shadow_buffer_numsurfacepvsbytes = 0;
if (r_shadow_buffer_surfacepvs)
Mem_Free(r_shadow_buffer_surfacepvs);
"r_shadow_projectdistance : shadow volume projection distance\n"
"r_shadow_realtime_dlight : use high quality dynamic lights in normal mode\n"
"r_shadow_realtime_dlight_shadows : cast shadows from dlights\n"
+"r_shadow_realtime_dlight_portalculling : work hard to reduce graphics work\n"
"r_shadow_realtime_world : use high quality world lighting mode\n"
"r_shadow_realtime_world_dlightshadows : cast shadows from dlights\n"
"r_shadow_realtime_world_lightmaps : use lightmaps in addition to lights\n"
Cvar_RegisterVariable(&r_shadow_projectdistance);
Cvar_RegisterVariable(&r_shadow_realtime_dlight);
Cvar_RegisterVariable(&r_shadow_realtime_dlight_shadows);
+ Cvar_RegisterVariable(&r_shadow_realtime_dlight_portalculling);
Cvar_RegisterVariable(&r_shadow_realtime_world);
Cvar_RegisterVariable(&r_shadow_realtime_world_dlightshadows);
Cvar_RegisterVariable(&r_shadow_realtime_world_lightmaps);
shadowmark = NULL;
shadowmarklist = NULL;
shadowmarkcount = 0;
- r_shadow_buffer_numclusterpvsbytes = 0;
- r_shadow_buffer_clusterpvs = NULL;
- r_shadow_buffer_clusterlist = NULL;
+ r_shadow_buffer_numleafpvsbytes = 0;
+ r_shadow_buffer_leafpvs = NULL;
+ r_shadow_buffer_leaflist = NULL;
r_shadow_buffer_numsurfacepvsbytes = 0;
r_shadow_buffer_surfacepvs = NULL;
r_shadow_buffer_surfacelist = NULL;
R_RegisterModule("R_Shadow", r_shadow_start, r_shadow_shutdown, r_shadow_newmap);
}
-matrix4x4_t matrix_attenuationxyz =
+static matrix4x4_t matrix_attenuationxyz =
{
{
{0.5, 0.0, 0.0, 0.5},
}
};
-matrix4x4_t matrix_attenuationz =
+static matrix4x4_t matrix_attenuationz =
{
{
{0.0, 0.0, 0.5, 0.5},
return shadowelements;
}
-void R_Shadow_EnlargeClusterSurfaceBuffer(int numclusters, int numsurfaces)
+static void R_Shadow_EnlargeLeafSurfaceBuffer(int numleafs, int numsurfaces)
{
- int numclusterpvsbytes = (((numclusters + 7) >> 3) + 255) & ~255;
+ int numleafpvsbytes = (((numleafs + 7) >> 3) + 255) & ~255;
int numsurfacepvsbytes = (((numsurfaces + 7) >> 3) + 255) & ~255;
- if (r_shadow_buffer_numclusterpvsbytes < numclusterpvsbytes)
+ if (r_shadow_buffer_numleafpvsbytes < numleafpvsbytes)
{
- if (r_shadow_buffer_clusterpvs)
- Mem_Free(r_shadow_buffer_clusterpvs);
- if (r_shadow_buffer_clusterlist)
- Mem_Free(r_shadow_buffer_clusterlist);
- r_shadow_buffer_numclusterpvsbytes = numclusterpvsbytes;
- r_shadow_buffer_clusterpvs = Mem_Alloc(r_shadow_mempool, r_shadow_buffer_numclusterpvsbytes);
- r_shadow_buffer_clusterlist = Mem_Alloc(r_shadow_mempool, r_shadow_buffer_numclusterpvsbytes * 8 * sizeof(*r_shadow_buffer_clusterlist));
+ if (r_shadow_buffer_leafpvs)
+ Mem_Free(r_shadow_buffer_leafpvs);
+ if (r_shadow_buffer_leaflist)
+ Mem_Free(r_shadow_buffer_leaflist);
+ r_shadow_buffer_numleafpvsbytes = numleafpvsbytes;
+ r_shadow_buffer_leafpvs = Mem_Alloc(r_shadow_mempool, r_shadow_buffer_numleafpvsbytes);
+ r_shadow_buffer_leaflist = Mem_Alloc(r_shadow_mempool, r_shadow_buffer_numleafpvsbytes * 8 * sizeof(*r_shadow_buffer_leaflist));
}
if (r_shadow_buffer_numsurfacepvsbytes < numsurfacepvsbytes)
{
static void R_Shadow_MakeTextures(void)
{
- int x, y, z, d, side;
- float v[3], s, t, intensity;
+ int x, y, z, d;
+ float v[3], intensity;
qbyte *data;
R_FreeTexturePool(&r_shadow_texturepool);
r_shadow_texturepool = R_AllocTexturePool();
r_shadow_attenpower = r_shadow_lightattenuationpower.value;
r_shadow_attenscale = r_shadow_lightattenuationscale.value;
-#define NORMSIZE 64
#define ATTEN2DSIZE 64
#define ATTEN3DSIZE 32
- data = Mem_Alloc(tempmempool, max(6*NORMSIZE*NORMSIZE*4, max(ATTEN3DSIZE*ATTEN3DSIZE*ATTEN3DSIZE*4, ATTEN2DSIZE*ATTEN2DSIZE*4)));
- r_shadow_blankwhitecubetexture = NULL;
- r_shadow_normalcubetexture = NULL;
- if (gl_texturecubemap)
- {
- data[ 0] = 255;data[ 1] = 255;data[ 2] = 255;data[ 3] = 255;
- data[ 4] = 255;data[ 5] = 255;data[ 6] = 255;data[ 7] = 255;
- data[ 8] = 255;data[ 9] = 255;data[10] = 255;data[11] = 255;
- data[12] = 255;data[13] = 255;data[14] = 255;data[15] = 255;
- data[16] = 255;data[17] = 255;data[18] = 255;data[19] = 255;
- data[20] = 255;data[21] = 255;data[22] = 255;data[23] = 255;
- r_shadow_blankwhitecubetexture = R_LoadTextureCubeMap(r_shadow_texturepool, "blankwhitecube", 1, data, TEXTYPE_RGBA, TEXF_PRECACHE | TEXF_CLAMP, NULL);
- for (side = 0;side < 6;side++)
- {
- for (y = 0;y < NORMSIZE;y++)
- {
- for (x = 0;x < NORMSIZE;x++)
- {
- s = (x + 0.5f) * (2.0f / NORMSIZE) - 1.0f;
- t = (y + 0.5f) * (2.0f / NORMSIZE) - 1.0f;
- switch(side)
- {
- case 0:
- v[0] = 1;
- v[1] = -t;
- v[2] = -s;
- break;
- case 1:
- v[0] = -1;
- v[1] = -t;
- v[2] = s;
- break;
- case 2:
- v[0] = s;
- v[1] = 1;
- v[2] = t;
- break;
- case 3:
- v[0] = s;
- v[1] = -1;
- v[2] = -t;
- break;
- case 4:
- v[0] = s;
- v[1] = -t;
- v[2] = 1;
- break;
- case 5:
- v[0] = -s;
- v[1] = -t;
- v[2] = -1;
- break;
- }
- intensity = 127.0f / sqrt(DotProduct(v, v));
- data[((side*NORMSIZE+y)*NORMSIZE+x)*4+0] = 128.0f + intensity * v[0];
- data[((side*NORMSIZE+y)*NORMSIZE+x)*4+1] = 128.0f + intensity * v[1];
- data[((side*NORMSIZE+y)*NORMSIZE+x)*4+2] = 128.0f + intensity * v[2];
- data[((side*NORMSIZE+y)*NORMSIZE+x)*4+3] = 255;
- }
- }
- }
- r_shadow_normalcubetexture = R_LoadTextureCubeMap(r_shadow_texturepool, "normalcube", NORMSIZE, data, TEXTYPE_RGBA, TEXF_PRECACHE | TEXF_CLAMP, NULL);
- }
+ data = Mem_Alloc(tempmempool, max(ATTEN3DSIZE*ATTEN3DSIZE*ATTEN3DSIZE*4, ATTEN2DSIZE*ATTEN2DSIZE*4));
for (y = 0;y < ATTEN2DSIZE;y++)
{
for (x = 0;x < ATTEN2DSIZE;x++)
if (r_shadow_gloss.integer < 1)
specularscale = 0;
if (!lightcubemap)
- lightcubemap = r_shadow_blankwhitecubetexture;
+ lightcubemap = r_texture_whitecube;
if ((ambientscale + diffusescale) * (VectorLength2(lightcolorbase) + VectorLength2(lightcolorpants) + VectorLength2(lightcolorshirt)) + specularscale * VectorLength2(lightcolorbase) <= 0.001)
return;
if (visiblelighting)
m.tex[0] = R_GetTexture(bumptexture);
m.texcombinergb[0] = GL_REPLACE;
m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_shadow_normalcubetexture);
+ m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
m.pointer_texcoord3f[1] = varray_texcoord3f[1];
R_Shadow_GenTexCoords_Diffuse_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin);
m.tex[0] = R_GetTexture(bumptexture);
m.texcombinergb[0] = GL_REPLACE;
m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_shadow_normalcubetexture);
+ m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
m.pointer_texcoord3f[1] = varray_texcoord3f[1];
R_Shadow_GenTexCoords_Diffuse_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin);
m.tex[0] = R_GetTexture(bumptexture);
m.texcombinergb[0] = GL_REPLACE;
m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_shadow_normalcubetexture);
+ m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
m.pointer_texcoord3f[1] = varray_texcoord3f[1];
R_Shadow_GenTexCoords_Diffuse_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin);
m.tex[0] = R_GetTexture(bumptexture);
m.texcombinergb[0] = GL_REPLACE;
m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_shadow_normalcubetexture);
+ m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
m.pointer_texcoord3f[1] = varray_texcoord3f[1];
R_Shadow_GenTexCoords_Diffuse_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin);
m.tex[0] = R_GetTexture(bumptexture);
m.texcombinergb[0] = GL_REPLACE;
m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_shadow_normalcubetexture);
+ m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
m.pointer_texcoord3f[1] = varray_texcoord3f[1];
R_Shadow_GenTexCoords_Diffuse_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin);
m.pointer_vertex = vertex3f;
m.tex[0] = R_GetTexture(bumptexture);
m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_shadow_normalcubetexture);
+ m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
m.pointer_texcoord3f[1] = varray_texcoord3f[1];
R_Shadow_GenTexCoords_Specular_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin, relativeeyeorigin);
m.pointer_vertex = vertex3f;
m.tex[0] = R_GetTexture(bumptexture);
m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_shadow_normalcubetexture);
+ m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
m.pointer_texcoord3f[1] = varray_texcoord3f[1];
R_Shadow_GenTexCoords_Specular_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin, relativeeyeorigin);
m.pointer_vertex = vertex3f;
m.tex[0] = R_GetTexture(bumptexture);
m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_shadow_normalcubetexture);
+ m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
m.pointer_texcoord3f[1] = varray_texcoord3f[1];
R_Shadow_GenTexCoords_Specular_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin, relativeeyeorigin);
// (undone by R_FreeCompiledRTLight, which R_UpdateLight calls)
void R_RTLight_Compile(rtlight_t *rtlight)
{
- int shadowmeshes, shadowtris, lightmeshes, lighttris, numclusters, numclusterpvsbytes, numsurfaces;
+ int shadowmeshes, shadowtris, lightmeshes, lighttris, numleafs, numleafpvsbytes, numsurfaces;
entity_render_t *ent = r_refdef.worldentity;
model_t *model = r_refdef.worldmodel;
qbyte *data;
// compile the light
rtlight->compiled = true;
- rtlight->static_numclusters = 0;
- rtlight->static_numclusterpvsbytes = 0;
- rtlight->static_clusterlist = NULL;
- rtlight->static_clusterpvs = NULL;
+ rtlight->static_numleafs = 0;
+ rtlight->static_numleafpvsbytes = 0;
+ rtlight->static_leaflist = NULL;
+ rtlight->static_leafpvs = NULL;
rtlight->static_numsurfaces = 0;
rtlight->static_surfacelist = NULL;
rtlight->cullmins[0] = rtlight->shadoworigin[0] - rtlight->radius;
{
// this variable directs the DrawShadowVolume and DrawLight code to capture into the mesh chain instead of rendering
r_shadow_compilingrtlight = rtlight;
- R_Shadow_EnlargeClusterSurfaceBuffer(model->brush.num_pvsclusters, model->nummodelsurfaces);
- model->GetLightInfo(ent, rtlight->shadoworigin, rtlight->radius, rtlight->cullmins, rtlight->cullmaxs, r_shadow_buffer_clusterlist, r_shadow_buffer_clusterpvs, &numclusters, r_shadow_buffer_surfacelist, r_shadow_buffer_surfacepvs, &numsurfaces);
- numclusterpvsbytes = (model->brush.num_pvsclusters + 7) >> 3;
- data = Mem_Alloc(r_shadow_mempool, sizeof(int) * numclusters + numclusterpvsbytes + sizeof(int) * numsurfaces);
- rtlight->static_numclusters = numclusters;
- rtlight->static_numclusterpvsbytes = numclusterpvsbytes;
- rtlight->static_clusterlist = (void *)data;data += sizeof(int) * numclusters;
- rtlight->static_clusterpvs = (void *)data;data += numclusterpvsbytes;
+ R_Shadow_EnlargeLeafSurfaceBuffer(model->brush.num_leafs, model->brush.num_surfaces);
+ model->GetLightInfo(ent, rtlight->shadoworigin, rtlight->radius, rtlight->cullmins, rtlight->cullmaxs, r_shadow_buffer_leaflist, r_shadow_buffer_leafpvs, &numleafs, r_shadow_buffer_surfacelist, r_shadow_buffer_surfacepvs, &numsurfaces);
+ numleafpvsbytes = (model->brush.num_leafs + 7) >> 3;
+ data = Mem_Alloc(r_shadow_mempool, sizeof(int) * numleafs + numleafpvsbytes + sizeof(int) * numsurfaces);
+ rtlight->static_numleafs = numleafs;
+ rtlight->static_numleafpvsbytes = numleafpvsbytes;
+ rtlight->static_leaflist = (void *)data;data += sizeof(int) * numleafs;
+ rtlight->static_leafpvs = (void *)data;data += numleafpvsbytes;
rtlight->static_numsurfaces = numsurfaces;
rtlight->static_surfacelist = (void *)data;data += sizeof(int) * numsurfaces;
- if (numclusters)
- memcpy(rtlight->static_clusterlist, r_shadow_buffer_clusterlist, rtlight->static_numclusters * sizeof(*rtlight->static_clusterlist));
- if (numclusterpvsbytes)
- memcpy(rtlight->static_clusterpvs, r_shadow_buffer_clusterpvs, rtlight->static_numclusterpvsbytes);
+ if (numleafs)
+ memcpy(rtlight->static_leaflist, r_shadow_buffer_leaflist, rtlight->static_numleafs * sizeof(*rtlight->static_leaflist));
+ if (numleafpvsbytes)
+ memcpy(rtlight->static_leafpvs, r_shadow_buffer_leafpvs, rtlight->static_numleafpvsbytes);
if (numsurfaces)
memcpy(rtlight->static_surfacelist, r_shadow_buffer_surfacelist, rtlight->static_numsurfaces * sizeof(*rtlight->static_surfacelist));
if (model->DrawShadowVolume && rtlight->shadow)
Mod_ShadowMesh_Free(rtlight->static_meshchain_light);
rtlight->static_meshchain_light = NULL;
// these allocations are grouped
- if (rtlight->static_clusterlist)
- Mem_Free(rtlight->static_clusterlist);
- rtlight->static_numclusters = 0;
- rtlight->static_numclusterpvsbytes = 0;
- rtlight->static_clusterlist = NULL;
- rtlight->static_clusterpvs = NULL;
+ if (rtlight->static_leaflist)
+ Mem_Free(rtlight->static_leaflist);
+ rtlight->static_numleafs = 0;
+ rtlight->static_numleafpvsbytes = 0;
+ rtlight->static_leaflist = NULL;
+ rtlight->static_leafpvs = NULL;
rtlight->static_numsurfaces = 0;
rtlight->static_surfacelist = NULL;
rtlight->compiled = false;
vec3_t relativelightorigin, relativeeyeorigin, lightcolor, lightcolor2;
rtexture_t *cubemaptexture;
matrix4x4_t matrix_modeltolight, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz;
- int numclusters, numsurfaces;
- int *clusterlist, *surfacelist;
- qbyte *clusterpvs;
+ int numleafs, numsurfaces;
+ int *leaflist, *surfacelist;
+ qbyte *leafpvs;
vec3_t cullmins, cullmaxs, relativelightmins, relativelightmaxs;
shadowmesh_t *mesh;
rmeshstate_t m;
cullmaxs[2] = rtlight->shadoworigin[2] + rtlight->radius;
if (rtlight->style >= 0 && d_lightstylevalue[rtlight->style] <= 0)
return;
- numclusters = 0;
- clusterlist = NULL;
- clusterpvs = NULL;
+ numleafs = 0;
+ leaflist = NULL;
+ leafpvs = NULL;
numsurfaces = 0;
surfacelist = NULL;
if (rtlight->compiled && r_shadow_realtime_world_compile.integer)
{
// compiled light, world available and can receive realtime lighting
- // retrieve cluster information
- numclusters = rtlight->static_numclusters;
- clusterlist = rtlight->static_clusterlist;
- clusterpvs = rtlight->static_clusterpvs;
+ // retrieve leaf information
+ numleafs = rtlight->static_numleafs;
+ leaflist = rtlight->static_leaflist;
+ leafpvs = rtlight->static_leafpvs;
numsurfaces = rtlight->static_numsurfaces;
surfacelist = rtlight->static_surfacelist;
VectorCopy(rtlight->cullmins, cullmins);
// if the light box is offscreen, skip it right away
if (R_CullBox(cullmins, cullmaxs))
return;
- // calculate lit surfaces and clusters
- R_Shadow_EnlargeClusterSurfaceBuffer(r_refdef.worldmodel->brush.num_pvsclusters, r_refdef.worldmodel->nummodelsurfaces);
- r_refdef.worldmodel->GetLightInfo(r_refdef.worldentity, rtlight->shadoworigin, rtlight->radius, cullmins, cullmaxs, r_shadow_buffer_clusterlist, r_shadow_buffer_clusterpvs, &numclusters, r_shadow_buffer_surfacelist, r_shadow_buffer_surfacepvs, &numsurfaces);
- clusterlist = r_shadow_buffer_clusterlist;
- clusterpvs = r_shadow_buffer_clusterpvs;
+ // calculate lit surfaces and leafs
+ R_Shadow_EnlargeLeafSurfaceBuffer(r_refdef.worldmodel->brush.num_leafs, r_refdef.worldmodel->brush.num_surfaces);
+ r_refdef.worldmodel->GetLightInfo(r_refdef.worldentity, rtlight->shadoworigin, rtlight->radius, cullmins, cullmaxs, r_shadow_buffer_leaflist, r_shadow_buffer_leafpvs, &numleafs, r_shadow_buffer_surfacelist, r_shadow_buffer_surfacepvs, &numsurfaces);
+ leaflist = r_shadow_buffer_leaflist;
+ leafpvs = r_shadow_buffer_leafpvs;
surfacelist = r_shadow_buffer_surfacelist;
}
- // if the reduced cluster bounds are offscreen, skip it
+ // if the reduced leaf bounds are offscreen, skip it
if (R_CullBox(cullmins, cullmaxs))
return;
- // check if light is illuminating any visible clusters
- if (numclusters)
+ // check if light is illuminating any visible leafs
+ if (numleafs)
{
- for (i = 0;i < numclusters;i++)
- if (CHECKPVSBIT(r_pvsbits, clusterlist[i]))
+ for (i = 0;i < numleafs;i++)
+ if (r_worldleafvisible[leaflist[i]])
break;
- if (i == numclusters)
+ if (i == numleafs)
return;
}
// set up a scissor rectangle for this light
{
if (!BoxesOverlap(ent->mins, ent->maxs, cullmins, cullmaxs))
continue;
- if (r_refdef.worldmodel != NULL && r_refdef.worldmodel->brush.BoxTouchingPVS != NULL && !r_refdef.worldmodel->brush.BoxTouchingPVS(r_refdef.worldmodel, clusterpvs, ent->mins, ent->maxs))
+ if (r_refdef.worldmodel != NULL && r_refdef.worldmodel->brush.BoxTouchingLeafPVS != NULL && !r_refdef.worldmodel->brush.BoxTouchingLeafPVS(r_refdef.worldmodel, leafpvs, ent->mins, ent->maxs))
continue;
}
if (!(ent->flags & RENDER_SHADOW) || !ent->model || !ent->model->DrawShadowVolume)
if (rating >= 0.95)
{
rating /= (1 + 0.0625f * sqrt(DotProduct(temp, temp)));
- if (bestrating < rating && CL_TraceLine(light->origin, r_vieworigin, NULL, NULL, true, NULL, SUPERCONTENTS_SOLID) == 1.0f)
+ if (bestrating < rating && CL_TraceBox(light->origin, vec3_origin, vec3_origin, r_vieworigin, true, NULL, SUPERCONTENTS_SOLID, false).fraction == 1.0f)
{
bestrating = rating;
best = light;
void R_Shadow_SetCursorLocationForView(void)
{
- vec_t dist, push, frac;
- vec3_t dest, endpos, normal;
+ vec_t dist, push;
+ vec3_t dest, endpos;
+ trace_t trace;
VectorMA(r_vieworigin, r_editlights_cursordistance.value, r_viewforward, dest);
- frac = CL_TraceLine(r_vieworigin, dest, endpos, normal, true, NULL, SUPERCONTENTS_SOLID);
- if (frac < 1)
+ trace = CL_TraceBox(r_vieworigin, vec3_origin, vec3_origin, dest, true, NULL, SUPERCONTENTS_SOLID, false);
+ if (trace.fraction < 1)
{
- dist = frac * r_editlights_cursordistance.value;
+ dist = trace.fraction * r_editlights_cursordistance.value;
push = r_editlights_cursorpushback.value;
if (push > dist)
push = dist;
push = -push;
- VectorMA(endpos, push, r_viewforward, endpos);
- VectorMA(endpos, r_editlights_cursorpushoff.value, normal, endpos);
+ VectorMA(trace.endpos, push, r_viewforward, endpos);
+ VectorMA(endpos, r_editlights_cursorpushoff.value, trace.plane.normal, endpos);
}
r_editlights_cursorlocation[0] = floor(endpos[0] / r_editlights_cursorgrid.value + 0.5f) * r_editlights_cursorgrid.value;
r_editlights_cursorlocation[1] = floor(endpos[1] / r_editlights_cursorgrid.value + 0.5f) * r_editlights_cursorgrid.value;