ECS improvements!
This commit is contained in:
@@ -7,29 +7,36 @@
|
||||
#include "util/memory.h"
|
||||
#include "assert/assert.h"
|
||||
|
||||
scenetree_t SCENE_TREE;
|
||||
scenetreenode_t SCENE_TREE_DATA[ECS_ENTITY_COUNT_MAX] = { 0 };
|
||||
ecscomponent_t SCENE_TREE_COMPONENT = ecsComponentInit(
|
||||
SCENE_TREE_DATA,
|
||||
sceneTreeInit
|
||||
);
|
||||
|
||||
void sceneTreeInit(void) {
|
||||
memoryZero(&SCENE_TREE, sizeof(scenetree_t));
|
||||
|
||||
// Default all items to have no parent
|
||||
for (ecsid_t i = 0; i < ECS_ENTITY_COUNT_MAX; i++) {
|
||||
SCENE_TREE.items[i].parent = -1;
|
||||
SCENE_TREE_DATA[i].parent = -1;
|
||||
}
|
||||
}
|
||||
|
||||
ecsid_t sceneTreeParentGet(const ecsid_t child) {
|
||||
assertTrue(child >= 0 && child < ECS_ENTITY_COUNT_MAX, "Invalid child ID");
|
||||
return SCENE_TREE.items[child].parent;
|
||||
return SCENE_TREE_DATA[child].parent;
|
||||
}
|
||||
|
||||
uint8_t sceneTreeChildGetAll(const ecsid_t id, ecsid_t *children) {
|
||||
assertTrue(id >= 0 && id < ECS_ENTITY_COUNT_MAX, "Invalid parent ID");
|
||||
|
||||
if(children == NULL) return SCENE_TREE_DATA[id].childCount;
|
||||
|
||||
const scenetreenode_t *node = &SCENE_TREE.items[id];
|
||||
if(children == NULL) return node->childCount;
|
||||
|
||||
return node->childCount;
|
||||
memoryCopy(
|
||||
children,
|
||||
SCENE_TREE_DATA[id].children,
|
||||
sizeof(ecsid_t) * SCENE_TREE_DATA[id].childCount
|
||||
);
|
||||
|
||||
return SCENE_TREE_DATA[id].childCount;
|
||||
}
|
||||
|
||||
void sceneTreeChildAdd(const ecsid_t parent, const ecsid_t child) {
|
||||
@@ -45,7 +52,7 @@ void sceneTreeChildAdd(const ecsid_t parent, const ecsid_t child) {
|
||||
"Child cannot be a deep child of itself."
|
||||
);
|
||||
|
||||
scenetreenode_t *parentNode = &SCENE_TREE.items[parent];
|
||||
scenetreenode_t *parentNode = &SCENE_TREE_DATA[parent];
|
||||
assertTrue(parentNode->childCount < SCENE_ITEM_CHILD_MAX, "Parent full.");
|
||||
|
||||
// Add child to parent's children array
|
||||
@@ -53,7 +60,7 @@ void sceneTreeChildAdd(const ecsid_t parent, const ecsid_t child) {
|
||||
parentNode->childCount++;
|
||||
|
||||
// Set child's parent
|
||||
SCENE_TREE.items[child].parent = parent;
|
||||
SCENE_TREE_DATA[child].parent = parent;
|
||||
}
|
||||
|
||||
void sceneTreeChildRemove(
|
||||
@@ -64,8 +71,8 @@ void sceneTreeChildRemove(
|
||||
assertTrue(child >= 0 && child < ECS_ENTITY_COUNT_MAX, "Invalid child ID");
|
||||
assertTrue(parent != child, "Child cannot be a child of itself.");
|
||||
|
||||
scenetreenode_t *childNode = &SCENE_TREE.items[child];
|
||||
scenetreenode_t *parentNode = &SCENE_TREE.items[parent];
|
||||
scenetreenode_t *childNode = &SCENE_TREE_DATA[child];
|
||||
scenetreenode_t *parentNode = &SCENE_TREE_DATA[parent];
|
||||
assertTrue(childNode->parent == parent, "Child does not belong to parent");
|
||||
assertTrue(parentNode->childCount > 0, "Parent has no children");
|
||||
|
||||
@@ -88,10 +95,10 @@ void sceneTreeChildRemove(
|
||||
void sceneTreeChildRemoveAll(const ecsid_t parent) {
|
||||
assertTrue(parent >= 0 && parent < ECS_ENTITY_COUNT_MAX, "Invalid parent ID");
|
||||
|
||||
scenetreenode_t *parentNode = &SCENE_TREE.items[parent];
|
||||
scenetreenode_t *parentNode = &SCENE_TREE_DATA[parent];
|
||||
for(uint8_t i = 0; i < parentNode->childCount; i++) {
|
||||
ecsid_t child = parentNode->children[i];
|
||||
SCENE_TREE.items[child].parent = -1;
|
||||
SCENE_TREE_DATA[child].parent = -1;
|
||||
}
|
||||
|
||||
// Reset child count
|
||||
@@ -106,11 +113,11 @@ bool_t sceneTreeChildInTree(
|
||||
assertTrue(child >= 0 && child < ECS_ENTITY_COUNT_MAX, "Invalid child ID");
|
||||
assertTrue(parent != child, "Child cannot be a child of itself.");
|
||||
|
||||
scenetreenode_t *childNode = &SCENE_TREE.items[child];
|
||||
scenetreenode_t *childNode = &SCENE_TREE_DATA[child];
|
||||
while(childNode) {
|
||||
if(childNode->parent == parent) return true;
|
||||
if(childNode->parent == -1) break; // No parent means we've reached the root
|
||||
childNode = &SCENE_TREE.items[childNode->parent];
|
||||
childNode = &SCENE_TREE_DATA[childNode->parent];
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "ecs/ecsentity.h"
|
||||
#include "ecs/ecscomponent.h"
|
||||
|
||||
#define SCENE_ITEM_CHILD_MAX 16
|
||||
|
||||
@@ -16,11 +16,8 @@ typedef struct {
|
||||
ecsid_t parent;
|
||||
} scenetreenode_t;
|
||||
|
||||
typedef struct scene_s {
|
||||
scenetreenode_t items[ECS_ENTITY_COUNT_MAX];
|
||||
} scenetree_t;
|
||||
|
||||
extern scenetree_t SCENE_TREE;
|
||||
extern scenetreenode_t SCENE_TREE_DATA[ECS_ENTITY_COUNT_MAX];
|
||||
extern ecscomponent_t SCENE_TREE_COMPONENT;
|
||||
|
||||
/**
|
||||
* Initialize the scene tree.
|
||||
|
||||
Reference in New Issue
Block a user