#include "../gfx/gfx.h" #include "../lib/raymath.h" DefineList(int32, Handle); enum EntityFlags { EntityFlags_None=0, EntityFlags_Visible=1<<0, EntityFlags_Dead=1<<1, EntityFlags_Render=1<<2, }; typedef struct Entity Entity; struct Entity { int32 graphNodeHandle; uint64 flags; RLVector4 color; Mesh *mesh; Texture *tex; // Free list int32 next; }; DefineList(Entity, Entity); typedef struct SceneGraphNode SceneGraphNode; struct SceneGraphNode { Matrix local; Matrix world; RLVector3 translation; Quaternion rotation; RLVector3 scale; int32 entityHandle; int32 parentHandle; // Free list int32 next; // Children int32 nextSibling; int32 firstChild; }; DefineList(SceneGraphNode, SceneGraphNode); typedef struct Scene Scene; struct Scene { int32 sceneRoot; EntityList entities; int32 nextFreeEntity; SceneGraphNodeList graphNodes; int32 nextFreeNode; }; int32 createEntity(Scene *s); Entity *getEntity(Scene *s, int32 id); SceneGraphNode *getSceneGraphNode(Scene *s, int32 id); int32 createSceneGraphNode(Scene *s); Scene createScene(Arena *arena); void initGraphNode(SceneGraphNode *n); void recalcSceneGraphNode(Scene *s, int32 parentHandle); void recalcScene(Scene *s); void removeEntity(Scene *s, int32 entityHandle); void removeSceneGraphNode(Scene *s, int32 graphNodeHandle); void sceneNodeAddNode(Scene *s, int32 recipientNodeHandle, int32 graphNodeHandle); SceneGraphNode *getSceneGraphNodeForEntity(Scene *s, int32 entityHandle);