[scene] Use scene resources for the main hierarchy block

This will reduce the memory churn when creating hierarchies as
transforms switch between being root and child.
This commit is contained in:
Bill Currie 2022-03-02 10:46:29 +09:00
parent b210f01837
commit ab91d73635
4 changed files with 16 additions and 15 deletions

View File

@ -61,9 +61,10 @@ typedef struct hierarchy_s {
vec4fset_t localScale;
vec4fset_t worldRotation;
vec4fset_t worldScale;
struct scene_s *scene;
} hierarchy_t;
hierarchy_t *Hierarchy_New (size_t grow, int createRoot);
hierarchy_t *Hierarchy_New (struct scene_s *scene, int createRoot);
hierarchy_t *Hierarchy_Copy (hierarchy_t *src);
void Hierarchy_Delete (hierarchy_t *hierarchy);

View File

@ -3,11 +3,13 @@
#include "QF/progs.h"
#include "QF/scene/entity.h"
#include "QF/scene/hierarchy.h"
#include "QF/scene/scene.h"
#include "QF/scene/transform.h"
typedef struct scene_resources_s {
PR_RESMAP (entity_t) entities;
PR_RESMAP (hierarchy_t) hierarchies;
PR_RESMAP (transform_t) transforms;
} scene_resources_t;

View File

@ -397,13 +397,13 @@ Hierarchy_RemoveHierarchy (hierarchy_t *hierarchy, uint32_t index)
}
hierarchy_t *
Hierarchy_New (size_t grow, int createRoot)
Hierarchy_New (scene_t *scene, int createRoot)
{
if (!grow) {
grow = 16;
}
hierarchy_t *hierarchy = malloc (sizeof (hierarchy_t));
scene_resources_t *res = scene->resources;
hierarchy_t *hierarchy = PR_RESNEW_NC (res->hierarchies);
hierarchy->scene = scene;
size_t grow = 16;
DARRAY_INIT (&hierarchy->transform, grow);
DARRAY_INIT (&hierarchy->entity, grow);
DARRAY_INIT (&hierarchy->childCount, grow);
@ -432,12 +432,9 @@ Hierarchy_New (size_t grow, int createRoot)
void
Hierarchy_Delete (hierarchy_t *hierarchy)
{
if (hierarchy->transform.size) {
scene_resources_t *res = hierarchy->transform.a[0]->scene->resources;
for (size_t i = 0; i < hierarchy->transform.size; i++) {
PR_RESFREE (res->transforms, hierarchy->transform.a[i]);
}
scene_resources_t *res = hierarchy->scene->resources;
for (size_t i = 0; i < hierarchy->transform.size; i++) {
PR_RESFREE (res->transforms, hierarchy->transform.a[i]);
}
DARRAY_CLEAR (&hierarchy->transform);
DARRAY_CLEAR (&hierarchy->entity);
@ -455,5 +452,5 @@ Hierarchy_Delete (hierarchy_t *hierarchy)
DARRAY_CLEAR (&hierarchy->localScale);
DARRAY_CLEAR (&hierarchy->worldRotation);
DARRAY_CLEAR (&hierarchy->worldScale);
free (hierarchy);
PR_RESFREE (res->hierarchies, hierarchy);
}

View File

@ -56,7 +56,7 @@ Transform_New (scene_t *scene, transform_t *parent)
transform->index = Hierarchy_InsertHierarchy (parent->hierarchy, 0,
parent->index, 0);
} else {
transform->hierarchy = Hierarchy_New (16, 1);//FIXME should be config
transform->hierarchy = Hierarchy_New (scene, 1);
transform->index = 0;
scene_add_root (scene, transform);
}
@ -74,6 +74,7 @@ Transform_Delete (transform_t *transform)
Transform_SetParent (transform, 0);
}
scene_del_root (transform->scene, transform);
// Takes care of freeing the transforms
Hierarchy_Delete (transform->hierarchy);
}
@ -107,7 +108,7 @@ Transform_SetParent (transform_t *transform, transform_t *parent)
hierarchy_t *hierarchy = transform->hierarchy;
uint32_t index = transform->index;
hierarchy_t *new_hierarchy = Hierarchy_New (16, 0);
hierarchy_t *new_hierarchy = Hierarchy_New (transform->scene, 0);
Hierarchy_InsertHierarchy (new_hierarchy, hierarchy, null_transform,
index);
Hierarchy_RemoveHierarchy (hierarchy, index);