big progress
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user