]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_main.c
dynamically grow maxtempentities
[xonotic/darkplaces.git] / cl_main.c
index 26bac7799dc0fdeae9b421ccc8b1bf0e4ae0cc36..e5f6fef1cd9c2166375966332043f379e6e7968a 100644 (file)
--- a/cl_main.c
+++ b/cl_main.c
@@ -297,6 +297,7 @@ void CL_ExpandEntities(int num)
 
 void CL_ExpandCSQCRenderEntities(int num)
 {
+       int i;
        int oldmaxcsqcrenderentities;
        entity_render_t *oldcsqcrenderentities;
        if (num >= cl.max_csqcrenderentities)
@@ -310,6 +311,9 @@ void CL_ExpandCSQCRenderEntities(int num)
                if (oldcsqcrenderentities)
                {
                        memcpy(cl.csqcrenderentities, oldcsqcrenderentities, oldmaxcsqcrenderentities * sizeof(entity_render_t));
+                       for (i = 0;i < r_refdef.scene.numentities;i++)
+                               if(r_refdef.scene.entities[i] >= oldcsqcrenderentities && r_refdef.scene.entities[i] < (oldcsqcrenderentities + oldmaxcsqcrenderentities))
+                                       r_refdef.scene.entities[i] = cl.csqcrenderentities + (r_refdef.scene.entities[i] - oldcsqcrenderentities);
                        Mem_Free(oldcsqcrenderentities);
                }
        }
@@ -626,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)
@@ -635,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;
@@ -1458,7 +1473,7 @@ void CL_LinkNetworkEntity(entity_t *e)
                trace_t trace;
                matrix4x4_t tempmatrix;
                Matrix4x4_Transform(&e->render.matrix, muzzleflashorigin, v2);
-               trace = CL_TraceLine(origin, v2, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, true, false, NULL, false);
+               trace = CL_TraceLine(origin, v2, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, true, false, NULL, false, false);
                Matrix4x4_Normalize(&tempmatrix, &e->render.matrix);
                Matrix4x4_SetOrigin(&tempmatrix, trace.endpos[0], trace.endpos[1], trace.endpos[2]);
                Matrix4x4_Scale(&tempmatrix, 150, 1);
@@ -1877,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)
@@ -2357,6 +2372,7 @@ CL_Init
 */
 void CL_Init (void)
 {
+
        cls.levelmempool = Mem_AllocPool("client (per-level memory)", 0, NULL);
        cls.permanentmempool = Mem_AllocPool("client (long term memory)", 0, NULL);
 
@@ -2365,7 +2381,8 @@ void CL_Init (void)
        r_refdef.scene.maxentities = MAX_EDICTS + 256 + 512;
        r_refdef.scene.entities = (entity_render_t **)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t *) * r_refdef.scene.maxentities);
 
-       r_refdef.scene.maxtempentities = MAX_TEMPENTITIES; // FIXME: make this grow
+       // max temp entities
+       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 ();