From 276eae53c65044e33f8ec0fc8e1d746208cb825c Mon Sep 17 00:00:00 2001 From: Alison Watson Date: Mon, 25 Nov 2019 22:38:21 -0500 Subject: [PATCH] dynamically allocate visedicts --- source/cl_main.c | 22 ++++++++++++++-------- source/cl_tent.c | 2 +- source/client.h | 7 ++++--- source/gl_refrag.c | 2 +- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/source/cl_main.c b/source/cl_main.c index 925e6d0..b5301dd 100644 --- a/source/cl_main.c +++ b/source/cl_main.c @@ -48,9 +48,10 @@ cvar_t m_side = {"m_side", "0.8", CVAR_ARCHIVE}; cvar_t cl_maxpitch = {"cl_maxpitch", "90", CVAR_ARCHIVE}; //johnfitz -- variable pitch clamping cvar_t cl_minpitch = {"cl_minpitch", "-90", CVAR_ARCHIVE}; //johnfitz -- variable pitch clamping -cvar_t cl_maxdlights = {"cl_maxdlights", "128", CVAR_ARCHIVE}; -cvar_t cl_maxtempents = {"cl_maxtempents", "256", CVAR_ARCHIVE}; -cvar_t cl_maxbeams = {"cl_maxbeams", "32", CVAR_ARCHIVE}; +cvar_t cl_maxdlights = {"cl_maxdlights", "128", CVAR_ARCHIVE}; +cvar_t cl_maxtempents = {"cl_maxtempents", "256", CVAR_ARCHIVE}; +cvar_t cl_maxbeams = {"cl_maxbeams", "32", CVAR_ARCHIVE}; +cvar_t cl_maxvisedicts = {"cl_maxvisedicts", "4096", CVAR_ARCHIVE}; client_static_t cls; client_state_t cl; @@ -64,8 +65,9 @@ int32_t cl_max_edicts; //johnfitz -- only changes when new map loads dlight_t *cl_dlights; int32_t cl_max_dlights; //johnfitz -- only changes when new map loads -int32_t cl_numvisedicts; -entity_t *cl_visedicts[MAX_VISEDICTS]; +entity_t **cl_visedicts; +int32_t cl_numvisedicts; +int32_t max_visedicts; extern cvar_t r_lerpmodels, r_lerpmove; //johnfitz @@ -90,7 +92,7 @@ void CL_ClearState(void) //johnfitz -- cl_entities is now dynamically allocated cl_max_edicts = CLAMP(MIN_EDICTS, (int32_t)max_edicts.value, MAX_EDICTS); - cl_entities = Hunk_AllocName(cl_max_edicts * sizeof(entity_t), "cl_entities"); + cl_entities = Hunk_AllocName(cl_max_edicts * sizeof(*cl_entities), "cl_entities"); //johnfitz cl_max_dlights = CLAMP(MIN_DLIGHTS, (int32_t)cl_maxdlights.value, MAX_DLIGHTS); @@ -101,6 +103,9 @@ void CL_ClearState(void) max_beams = CLAMP(0, (int32_t)cl_maxbeams.value, 32000); cl_beams = Hunk_AllocName(max_beams * sizeof(*cl_beams), "cl_beams"); + + max_visedicts = CLAMP(0, (int32_t)cl_maxvisedicts.value, 32000); + cl_visedicts = Hunk_AllocName(max_visedicts * sizeof(*cl_visedicts), "cl_visedicts"); } /* @@ -589,7 +594,7 @@ void CL_RelinkEntities(void) if(i == cl.viewentity && !chase_active.value) continue; - if(cl_numvisedicts < MAX_VISEDICTS) + if(cl_numvisedicts < max_visedicts) { cl_visedicts[cl_numvisedicts] = ent; cl_numvisedicts++; @@ -641,7 +646,7 @@ int32_t CL_ReadFromServer(void) //visedicts if(cl_numvisedicts > 256 && dev_peakstats.visedicts <= 256) - Con_DWarning("%" PRIi32 " visedicts exceeds standard limit of 256 (max = %" PRIi32 ").\n", cl_numvisedicts, MAX_VISEDICTS); + Con_DWarning("%" PRIi32 " visedicts exceeds standard limit of 256 (max = %" PRIi32 ").\n", cl_numvisedicts, max_visedicts); dev_stats.visedicts = cl_numvisedicts; dev_peakstats.visedicts = q_max(cl_numvisedicts, dev_peakstats.visedicts); @@ -821,6 +826,7 @@ void CL_Init(void) Cvar_RegisterVariable(&cl_maxdlights); Cvar_RegisterVariable(&cl_maxtempents); Cvar_RegisterVariable(&cl_maxbeams); + Cvar_RegisterVariable(&cl_maxvisedicts); Cmd_AddCommand("entities", CL_PrintEntities_f); Cmd_AddCommand("disconnect", CL_Disconnect_f); diff --git a/source/cl_tent.c b/source/cl_tent.c index 2f4d372..f53c670 100644 --- a/source/cl_tent.c +++ b/source/cl_tent.c @@ -272,7 +272,7 @@ entity_t *CL_NewTempEntity(void) { entity_t *ent; - if(cl_numvisedicts == MAX_VISEDICTS) + if(cl_numvisedicts == max_visedicts) return NULL; if(num_temp_entities == max_temp_entities) return NULL; diff --git a/source/client.h b/source/client.h index 9acae4e..098bba4 100644 --- a/source/client.h +++ b/source/client.h @@ -267,15 +267,16 @@ extern cvar_t m_side; #define MAX_STATIC_ENTITIES 4096 //ericw -- was 512 //johnfitz -- was 128 -#define MAX_VISEDICTS 4096 // larger, now we support BSP2 extern client_state_t cl; // FIXME, allocate dynamically extern entity_t cl_static_entities[MAX_STATIC_ENTITIES]; extern lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES]; -extern entity_t *cl_visedicts[MAX_VISEDICTS]; -extern int32_t cl_numvisedicts; + +extern entity_t **cl_visedicts; +extern int32_t cl_numvisedicts; +extern int32_t max_visedicts; extern beam_t *cl_beams; extern int32_t max_beams; diff --git a/source/gl_refrag.c b/source/gl_refrag.c index 1ac9ab5..135ad0c 100644 --- a/source/gl_refrag.c +++ b/source/gl_refrag.c @@ -208,7 +208,7 @@ void R_StoreEfrags(efrag_t **ppefrag) { pent = pefrag->entity; - if((pent->visframe != r_framecount) && (cl_numvisedicts < MAX_VISEDICTS)) + if((pent->visframe != r_framecount) && (cl_numvisedicts < max_visedicts)) { cl_visedicts[cl_numvisedicts++] = pent; pent->visframe = r_framecount;