From: havoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Mon, 5 Dec 2011 12:21:35 +0000 (+0000)
Subject: fixed a crash with r_shadow_bouncegrid 2 when also using r_shadow_deferred, made... 
X-Git-Tag: xonotic-v0.6.0~102^2~20
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=b6465e5c03e737c1e7b59a8ab285223ce734c769;p=xonotic%2Fdarkplaces.git

fixed a crash with r_shadow_bouncegrid 2 when also using r_shadow_deferred, made the light draw skipping for r_shadow_bouncegrid 2 a bit more elegant

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11599 d7cf8633-e32d-0410-b094-e92efae38249
---

diff --git a/r_shadow.c b/r_shadow.c
index 06b1b1d5..19ae463e 100644
--- a/r_shadow.c
+++ b/r_shadow.c
@@ -3921,6 +3921,18 @@ static void R_Shadow_PrepareLight(rtlight_t *rtlight)
 	qboolean nolight;
 
 	rtlight->draw = false;
+	rtlight->cached_numlightentities               = 0;
+	rtlight->cached_numlightentities_noselfshadow  = 0;
+	rtlight->cached_numshadowentities              = 0;
+	rtlight->cached_numshadowentities_noselfshadow = 0;
+	rtlight->cached_numsurfaces                    = 0;
+	rtlight->cached_lightentities                  = NULL;
+	rtlight->cached_lightentities_noselfshadow     = NULL;
+	rtlight->cached_shadowentities                 = NULL;
+	rtlight->cached_shadowentities_noselfshadow    = NULL;
+	rtlight->cached_shadowtrispvs                  = NULL;
+	rtlight->cached_lighttrispvs                   = NULL;
+	rtlight->cached_surfacelist                    = NULL;
 
 	// skip lights that don't light because of ambientscale+diffusescale+specularscale being 0 (corona only lights)
 	// skip lights that are basically invisible (color 0 0 0)
@@ -3968,6 +3980,10 @@ static void R_Shadow_PrepareLight(rtlight_t *rtlight)
 
 	R_Shadow_ComputeShadowCasterCullingPlanes(rtlight);
 
+	// don't allow lights to be drawn if using r_shadow_bouncegrid 2, except if we're using static bouncegrid where dynamic lights still need to draw
+	if (r_shadow_bouncegrid.integer == 2 && (rtlight->isstatic || !r_shadow_bouncegrid_static.integer))
+		return;
+
 	if (rtlight->compiled && r_shadow_realtime_world_compile.integer)
 	{
 		// compiled light, world available and can receive realtime lighting
@@ -4567,25 +4583,22 @@ void R_Shadow_PrepareLights(int fbo, rtexture_t *depthtexture, rtexture_t *color
 	R_Shadow_EnlargeLeafSurfaceTrisBuffer(r_refdef.scene.worldmodel->brush.num_leafs, r_refdef.scene.worldmodel->num_surfaces, r_refdef.scene.worldmodel->brush.shadowmesh ? r_refdef.scene.worldmodel->brush.shadowmesh->numtriangles : r_refdef.scene.worldmodel->surfmesh.num_triangles, r_refdef.scene.worldmodel->surfmesh.num_triangles);
 
 	flag = r_refdef.scene.rtworld ? LIGHTFLAG_REALTIMEMODE : LIGHTFLAG_NORMALMODE;
-	if (r_shadow_bouncegrid.integer != 2)
+	if (r_shadow_debuglight.integer >= 0)
+	{
+		lightindex = r_shadow_debuglight.integer;
+		light = (dlight_t *) Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex);
+		if (light)
+			R_Shadow_PrepareLight(&light->rtlight);
+	}
+	else
 	{
-		if (r_shadow_debuglight.integer >= 0)
+		range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked
+		for (lightindex = 0;lightindex < range;lightindex++)
 		{
-			lightindex = r_shadow_debuglight.integer;
 			light = (dlight_t *) Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex);
-			if (light)
+			if (light && (light->flags & flag))
 				R_Shadow_PrepareLight(&light->rtlight);
 		}
-		else
-		{
-			range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked
-			for (lightindex = 0;lightindex < range;lightindex++)
-			{
-				light = (dlight_t *) Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex);
-				if (light && (light->flags & flag))
-					R_Shadow_PrepareLight(&light->rtlight);
-			}
-		}
 	}
 	if (r_refdef.scene.rtdlight)
 	{
@@ -4616,26 +4629,23 @@ void R_Shadow_DrawLights(void)
 
 	R_Shadow_RenderMode_Begin();
 
-	if (r_shadow_bouncegrid.integer != 2)
+	flag = r_refdef.scene.rtworld ? LIGHTFLAG_REALTIMEMODE : LIGHTFLAG_NORMALMODE;
+	if (r_shadow_debuglight.integer >= 0)
 	{
-		flag = r_refdef.scene.rtworld ? LIGHTFLAG_REALTIMEMODE : LIGHTFLAG_NORMALMODE;
-		if (r_shadow_debuglight.integer >= 0)
+		lightindex = r_shadow_debuglight.integer;
+		light = (dlight_t *) Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex);
+		if (light)
+			R_Shadow_DrawLight(&light->rtlight);
+	}
+	else
+	{
+		range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked
+		for (lightindex = 0;lightindex < range;lightindex++)
 		{
-			lightindex = r_shadow_debuglight.integer;
 			light = (dlight_t *) Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex);
-			if (light)
+			if (light && (light->flags & flag))
 				R_Shadow_DrawLight(&light->rtlight);
 		}
-		else
-		{
-			range = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray); // checked
-			for (lightindex = 0;lightindex < range;lightindex++)
-			{
-				light = (dlight_t *) Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, lightindex);
-				if (light && (light->flags & flag))
-					R_Shadow_DrawLight(&light->rtlight);
-			}
-		}
 	}
 	if (r_refdef.scene.rtdlight)
 		for (lnum = 0;lnum < r_refdef.scene.numlights;lnum++)