big progress

This commit is contained in:
2025-11-23 15:30:05 +01:00
parent c300276c7d
commit ff41c8ace4
6 changed files with 372 additions and 188 deletions

View File

@@ -1,29 +1,39 @@
#include "string.h"
#include "scene.h"
Entity *getEntity(Scene *s, uint32 id) {
return &s->entities.data[id - 1];
}
SceneGraphNode *getSceneGraphNodeForEntity(Scene *s, uint32 entityHandle) {
return &s->graphNodes.data[s->entities.data[entityHandle - 1].graphNodeHandle - 1];
Entity *getEntity(Scene *s, uint32 entityHandle) {
if (entityHandle) {
return &s->entities.data[entityHandle - 1];
}
return NULL;
}
SceneGraphNode *getSceneGraphNode(Scene *s, uint32 sceneGraphNodeHandle) {
return &s->graphNodes.data[sceneGraphNodeHandle - 1];
if (sceneGraphNodeHandle) {
return &s->graphNodes.data[sceneGraphNodeHandle - 1];
}
return NULL;
}
uint32 createSceneGraphNode(Arena *arena, Scene *s) {
SceneGraphNode *getSceneGraphNodeForEntity(Scene *s, uint32 entityHandle) {
Entity *e = getEntity(s, entityHandle);
if (e) {
return getSceneGraphNode(s, e->graphNodeHandle);
}
return NULL;
}
uint32 createSceneGraphNode(Scene *s) {
AppendList(&s->graphNodes, (SceneGraphNode){0});
SceneGraphNode *node = &s->graphNodes.data[s->graphNodes.length - 1];
node->children = PushList(arena, HandleList, 1000);
node->children = PushList(s->arena, HandleList, 1000);
initGraphNode(node);
return (uint32)s->graphNodes.length;
}
uint32 createEntity(Arena *arena, Scene *s) {
uint32 createEntity(Scene *s) {
AppendList(&s->entities, (Entity){0});
uint32 graphNodeId = createSceneGraphNode(arena, s);
uint32 graphNodeId = createSceneGraphNode(s);
s->entities.data[s->entities.length - 1].graphNodeHandle = graphNodeId;
getSceneGraphNode(s, graphNodeId)->entityHandle = (uint32)s->entities.length;
uint32 handle = (uint32)s->entities.length;
@@ -44,10 +54,12 @@ void recalcGraphNode(SceneGraphNode *n) {
}
Scene createScene(Arena *arena) {
Scene result = {};
result.entities = PushList(arena, EntityList, 100000);
result.graphNodes = PushList(arena, SceneGraphNodeList, 100000);
result.sceneRoot = createSceneGraphNode(arena, &result);
Scene result = {
.arena = arena,
.entities = PushList(arena, EntityList, 100000),
.graphNodes = PushList(arena, SceneGraphNodeList, 100000),
};
result.sceneRoot = createSceneGraphNode(&result);
return result;
}
@@ -74,14 +86,15 @@ void removeEntity(Scene *s, uint32 entityHandle) {
Entity *entity = getEntity(s, entityHandle);
entity->flags |= EntityFlags_Dead;
SceneGraphNode *graphNode = getSceneGraphNode(s, entity->graphNodeHandle);
if (graphNode->parentHandle) {
if (graphNode != NULL && graphNode->parentHandle) {
SceneGraphNode *parentNode = getSceneGraphNode(s, graphNode->parentHandle);
for (int i = 0; i < parentNode->children.length; i++) {
if (parentNode->children.data[i] == entity->graphNodeHandle) {
memcpy(&parentNode->children.data[i], &parentNode->children.data[i + 1], parentNode->children.length - i);
parentNode->children.length -= 1;
graphNode->parentHandle = 0;
break;
if (parentNode != NULL) {
for (EachIn(parentNode->children, i)) {
if (parentNode->children.data[i] == entity->graphNodeHandle) {
ListRemove(&parentNode->children, i);
graphNode->parentHandle = 0;
break;
}
}
}
}

View File

@@ -37,12 +37,13 @@ struct Scene {
uint32 sceneRoot;
EntityList entities;
SceneGraphNodeList graphNodes;
Arena *arena;
};
uint32 createEntity(Arena *arena, Scene *s);
uint32 createEntity(Scene *s);
Entity *getEntity(Scene *s, uint32 id);
SceneGraphNode *getSceneGraphNode(Scene *s, uint32 id);
uint32 createSceneGraphNode(Arena *arena, Scene *s);
uint32 createSceneGraphNode(Scene *s);
Scene createScene(Arena *arena);
void initGraphNode(SceneGraphNode *n);
void recalcGraphNode(SceneGraphNode *n);