mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-23 02:41:30 +00:00
[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:
parent
b210f01837
commit
ab91d73635
4 changed files with 16 additions and 15 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue