[client] Clean up world entity parsing a bit

Now the entities are parsed only once and the resulting data reused.
This commit is contained in:
Bill Currie 2022-05-05 15:22:02 +09:00
parent 9ee0eada1f
commit 4a4e16399a
3 changed files with 47 additions and 68 deletions

View File

@ -66,7 +66,6 @@ void CL_ParseBaseline (struct msg_s *msg, struct entity_state_s *baseline,
void CL_ParseStatic (struct msg_s *msg, int version);
void CL_MapCfg (const char *mapname);
void CL_World_NewMap (const char *mapname, const char *skyname);
void CL_LoadLights (struct model_s *model, const char *entity_data,
struct lightingdata_s *ldata);
void CL_LoadLights (struct plitem_s *entities, struct scene_s *scene);
#endif//__client_world_h

View File

@ -9,9 +9,9 @@
#include "QF/model.h"
#include "QF/plist.h"
#include "QF/progs.h" //for ED_ConvertToPlist
#include "QF/script.h"
#include "QF/set.h"
#include "QF/scene/light.h"
#include "QF/scene/scene.h"
#include "QF/simd/vec4f.h"
#include "client/world.h"
@ -238,35 +238,17 @@ locate_lights (model_t *model, lightingdata_t *ldata)
}
void
CL_LoadLights (model_t *model, const char *entity_data, lightingdata_t *ldata)
CL_LoadLights (plitem_t *entities, scene_t *scene)
{
plitem_t *entities = 0;
lightingdata_t *ldata = scene->lights;
model_t *model = scene->worldmodel;
if (!entity_data) {
Light_ClearLights (ldata);
ldata->sun_pvs = set_new_size (model->brush.visleafs);
if (!entities) {
return;
}
Light_ClearLights (ldata);
ldata->sun_pvs = set_new_size (model->brush.visleafs);
script_t *script = Script_New ();
Script_Start (script, "ent data", entity_data);
if (Script_GetToken (script, 1)) {
if (!strcmp (script->token->str, "(")) {
// new style (plist) entity data
entities = PL_GetPropertyList (entity_data, 0);
} else {
// old style entity data
Script_UngetToken (script);
// FIXME ED_ConvertToPlist aborts if an error is encountered.
entities = ED_ConvertToPlist (script, 0, 0);
}
}
Script_Delete (script);
if (entities) {
plitem_t *targets = PL_NewDictionary (0);
// find all the targets so spotlights can be aimed
@ -308,8 +290,7 @@ CL_LoadLights (model_t *model, const char *entity_data, lightingdata_t *ldata)
PL_RemoveObjectForKey (targets, PL_KeyAtIndex (targets, i));
}
PL_Free (targets);
PL_Free (entities);
}
if (ldata->lights.size) {
locate_lights (model, ldata);
for (size_t i = 0; i < ldata->lights.size; i++) {

View File

@ -212,12 +212,6 @@ CL_World_NewMap (const char *mapname, const char *skyname)
cl_static_entities.size = 0;
const char *entity_data = worldmodel->brush.entities;
CL_LoadLights (worldmodel, entity_data, cl_world.scene->lights);
cl_world.scene->models = cl_world.models.a;
cl_world.scene->num_models = cl_world.models.size;
SCR_NewScene (cl_world.scene);
if (cl_world.models.a[1] && cl_world.models.a[1]->brush.entities) {
if (cl_world.edicts) {
PL_Free (cl_world.edicts);
@ -229,5 +223,10 @@ CL_World_NewMap (const char *mapname, const char *skyname)
Fog_ParseWorldspawn (cl_world.worldspawn);
}
}
CL_LoadLights (cl_world.edicts, cl_world.scene);
cl_world.scene->models = cl_world.models.a;
cl_world.scene->num_models = cl_world.models.size;
SCR_NewScene (cl_world.scene);
map_cfg (mapname, 1);
}