mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-04-22 01:11:42 +00:00
[ecs] Optionally delete entities on hierarchy removal
Useful for deleting an entire sub-hierarchy of entities.
This commit is contained in:
parent
4197d4a800
commit
24d8d864a2
2 changed files with 17 additions and 6 deletions
|
@ -71,7 +71,8 @@ void Hierarchy_Delete (hierarchy_t *hierarchy);
|
|||
|
||||
uint32_t Hierarchy_InsertHierarchy (hierarchy_t *dst, const hierarchy_t *src,
|
||||
uint32_t dstParent, uint32_t srcRoot);
|
||||
void Hierarchy_RemoveHierarchy (hierarchy_t *hierarchy, uint32_t index);
|
||||
void Hierarchy_RemoveHierarchy (hierarchy_t *hierarchy, uint32_t index,
|
||||
int delEntities);
|
||||
|
||||
hierref_t Hierarchy_SetParent (hierarchy_t *dst, uint32_t dstParent,
|
||||
hierarchy_t *src, uint32_t srcIndex);
|
||||
|
|
|
@ -316,13 +316,19 @@ Hierarchy_InsertHierarchy (hierarchy_t *dst, const hierarchy_t *src,
|
|||
}
|
||||
|
||||
static void
|
||||
hierarchy_remove_children (hierarchy_t *hierarchy, uint32_t index)
|
||||
hierarchy_remove_children (hierarchy_t *hierarchy, uint32_t index,
|
||||
int delEntities)
|
||||
{
|
||||
uint32_t childIndex = hierarchy->childIndex[index];
|
||||
uint32_t childCount = hierarchy->childCount[index];
|
||||
|
||||
for (uint32_t i = childCount; i-- > 0; ) {
|
||||
hierarchy_remove_children (hierarchy, childIndex + i);
|
||||
hierarchy_remove_children (hierarchy, childIndex + i, delEntities);
|
||||
}
|
||||
if (delEntities) {
|
||||
for (uint32_t i = 0; i < childCount; i++) {
|
||||
ECS_DelEntity (hierarchy->reg, hierarchy->ent[childIndex + i]);
|
||||
}
|
||||
}
|
||||
hierarchy_close (hierarchy, childIndex, childCount);
|
||||
hierarchy->childCount[index] = 0;
|
||||
|
@ -337,11 +343,15 @@ hierarchy_remove_children (hierarchy_t *hierarchy, uint32_t index)
|
|||
}
|
||||
|
||||
void
|
||||
Hierarchy_RemoveHierarchy (hierarchy_t *hierarchy, uint32_t index)
|
||||
Hierarchy_RemoveHierarchy (hierarchy_t *hierarchy, uint32_t index,
|
||||
int delEntities)
|
||||
{
|
||||
uint32_t parentIndex = hierarchy->parentIndex[index];
|
||||
|
||||
hierarchy_remove_children (hierarchy, index);
|
||||
hierarchy_remove_children (hierarchy, index, delEntities);
|
||||
if (delEntities) {
|
||||
ECS_DelEntity (hierarchy->reg, hierarchy->ent[index]);
|
||||
}
|
||||
hierarchy_close (hierarchy, index, 1);
|
||||
|
||||
hierarchy_UpdateTransformIndices (hierarchy, index, -1);
|
||||
|
@ -442,7 +452,7 @@ Hierarchy_SetParent (hierarchy_t *dst, uint32_t dstParent,
|
|||
}
|
||||
r.hierarchy = dst;
|
||||
r.index = hierarchy_insertHierarchy (dst, src, dstParent, &srcRoot);
|
||||
Hierarchy_RemoveHierarchy (src, srcRoot);
|
||||
Hierarchy_RemoveHierarchy (src, srcRoot, 0);
|
||||
if (!src->num_objects) {
|
||||
Hierarchy_Delete (src);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue