From: vortex <vortex@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Sat, 19 Mar 2011 20:23:39 +0000 (+0000)
Subject: dynamically grow maxtempentities
X-Git-Tag: xonotic-v0.6.0~163^2~611
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=0254ae31b9a4800d63f8d89507e5a9b31de455ea;p=xonotic%2Fdarkplaces.git

dynamically grow maxtempentities

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

diff --git a/cl_main.c b/cl_main.c
index cc3315f2..e5f6fef1 100644
--- a/cl_main.c
+++ b/cl_main.c
@@ -630,6 +630,14 @@ static float CL_LerpPoint(void)
 void CL_ClearTempEntities (void)
 {
 	r_refdef.scene.numtempentities = 0;
+	// grow tempentities buffer on request
+	if (r_refdef.scene.expandtempentities)
+	{
+		Con_Printf("CL_NewTempEntity: grow maxtempentities from %i to %i\n", r_refdef.scene.maxtempentities, r_refdef.scene.maxtempentities * 2);
+		r_refdef.scene.maxtempentities *= 2;
+		r_refdef.scene.tempentities = (entity_render_t *)Mem_Realloc(cls.permanentmempool, r_refdef.scene.tempentities, sizeof(entity_render_t) * r_refdef.scene.maxtempentities);
+		r_refdef.scene.expandtempentities = false;
+	}
 }
 
 entity_render_t *CL_NewTempEntity(double shadertime)
@@ -639,7 +647,10 @@ entity_render_t *CL_NewTempEntity(double shadertime)
 	if (r_refdef.scene.numentities >= r_refdef.scene.maxentities)
 		return NULL;
 	if (r_refdef.scene.numtempentities >= r_refdef.scene.maxtempentities)
+	{
+		r_refdef.scene.expandtempentities = true; // will be reallocated next frame since current frame may have pointers set already
 		return NULL;
+	}
 	render = &r_refdef.scene.tempentities[r_refdef.scene.numtempentities++];
 	memset (render, 0, sizeof(*render));
 	r_refdef.scene.entities[r_refdef.scene.numentities++] = render;
@@ -1881,7 +1892,7 @@ void CL_UpdateWorld(void)
 	r_refdef.scene.numlights = 0;
 	r_refdef.view.matrix = identitymatrix;
 	r_refdef.view.quality = 1;
-
+		
 	cl.num_brushmodel_entities = 0;
 
 	if (cls.state == ca_connected && cls.signon == SIGNONS)
@@ -2361,7 +2372,6 @@ CL_Init
 */
 void CL_Init (void)
 {
-	int i;
 
 	cls.levelmempool = Mem_AllocPool("client (per-level memory)", 0, NULL);
 	cls.permanentmempool = Mem_AllocPool("client (long term memory)", 0, NULL);
@@ -2372,12 +2382,7 @@ void CL_Init (void)
 	r_refdef.scene.entities = (entity_render_t **)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t *) * r_refdef.scene.maxentities);
 
 	// max temp entities
-	// FIXME: make this grow
-	i = COM_CheckParm("-maxtempents");
-	if (i)
-		r_refdef.scene.maxtempentities = atof(com_argv[i + 1]);
-	else
-		r_refdef.scene.maxtempentities = MAX_TEMPENTITIES;
+	r_refdef.scene.maxtempentities = MAX_TEMPENTITIES;
 	r_refdef.scene.tempentities = (entity_render_t *)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t) * r_refdef.scene.maxtempentities);
 
 	CL_InitInput ();
diff --git a/client.h b/client.h
index 54c637b2..b9077cc4 100644
--- a/client.h
+++ b/client.h
@@ -1732,6 +1732,7 @@ typedef struct r_refdef_scene_s {
 	entity_render_t *tempentities;
 	int numtempentities;
 	int maxtempentities;
+	qboolean expandtempentities;
 
 	// renderable dynamic lights
 	rtlight_t *lights[MAX_DLIGHTS];