diff options
Diffstat (limited to 'src/scene/node.c')
| -rw-r--r-- | src/scene/node.c | 32 | 
1 files changed, 11 insertions, 21 deletions
| diff --git a/src/scene/node.c b/src/scene/node.c index 7cc315c..7032324 100644 --- a/src/scene/node.c +++ b/src/scene/node.c | |||
| @@ -1,15 +1,15 @@ | |||
| 1 | #include "node_impl.h" | 1 | #include "node_impl.h" | 
| 2 | 2 | ||
| 3 | #include "animation_impl.h" | 3 | #include "animation_impl.h" | 
| 4 | #include "camera_impl.h" | ||
| 5 | #include "memory.h" | 4 | #include "memory.h" | 
| 6 | #include "model_impl.h" | ||
| 7 | #include "object_impl.h" | 5 | #include "object_impl.h" | 
| 8 | #include "render/llr_impl.h" | 6 | #include "render/llr_impl.h" | 
| 9 | #include "scene_graph.h" | 7 | #include "scene_graph.h" | 
| 10 | 8 | ||
| 11 | #include "gfx_assert.h" | 9 | #include "gfx_assert.h" | 
| 12 | 10 | ||
| 11 | #include <gfx/scene/camera.h> | ||
| 12 | |||
| 13 | #include <cstring.h> | 13 | #include <cstring.h> | 
| 14 | #include <log/log.h> | 14 | #include <log/log.h> | 
| 15 | 15 | ||
| @@ -19,7 +19,7 @@ static void scene_node_make(SceneNode* node) { | |||
| 19 | node->transform = mat4_id(); | 19 | node->transform = mat4_id(); | 
| 20 | } | 20 | } | 
| 21 | 21 | ||
| 22 | SceneNode* gfx_make_node() { | 22 | SceneNode* gfx_make_node(void) { | 
| 23 | SceneNode* node = mem_alloc_node(); | 23 | SceneNode* node = mem_alloc_node(); | 
| 24 | scene_node_make(node); | 24 | scene_node_make(node); | 
| 25 | return node; | 25 | return node; | 
| @@ -30,16 +30,14 @@ SceneNode* gfx_make_anima_node(Anima* anima) { | |||
| 30 | SceneNode* node = gfx_make_node(); | 30 | SceneNode* node = gfx_make_node(); | 
| 31 | node->type = AnimaNode; | 31 | node->type = AnimaNode; | 
| 32 | node->anima = mem_get_anima_index(anima); | 32 | node->anima = mem_get_anima_index(anima); | 
| 33 | anima->parent = mem_get_node_index(node); | ||
| 34 | return node; | 33 | return node; | 
| 35 | } | 34 | } | 
| 36 | 35 | ||
| 37 | SceneNode* gfx_make_camera_node(SceneCamera* camera) { | 36 | SceneNode* gfx_make_camera_node(Camera* camera) { | 
| 38 | assert(camera); | 37 | assert(camera); | 
| 39 | SceneNode* node = gfx_make_node(); | 38 | SceneNode* node = gfx_make_node(); | 
| 40 | node->type = CameraNode; | 39 | node->type = CameraNode; | 
| 41 | node->camera = mem_get_camera_index(camera); | 40 | node->camera = mem_get_camera_index(camera); | 
| 42 | camera->parent = mem_get_node_index(node); | ||
| 43 | return node; | 41 | return node; | 
| 44 | } | 42 | } | 
| 45 | 43 | ||
| @@ -48,7 +46,6 @@ SceneNode* gfx_make_light_node(Light* light) { | |||
| 48 | SceneNode* node = gfx_make_node(); | 46 | SceneNode* node = gfx_make_node(); | 
| 49 | node->type = LightNode; | 47 | node->type = LightNode; | 
| 50 | node->light = mem_get_light_index(light); | 48 | node->light = mem_get_light_index(light); | 
| 51 | light->parent = mem_get_node_index(node); | ||
| 52 | return node; | 49 | return node; | 
| 53 | } | 50 | } | 
| 54 | 51 | ||
| @@ -57,7 +54,6 @@ SceneNode* gfx_make_model_node(Model* model) { | |||
| 57 | SceneNode* node = gfx_make_node(); | 54 | SceneNode* node = gfx_make_node(); | 
| 58 | node->type = ModelNode; | 55 | node->type = ModelNode; | 
| 59 | node->model = mem_get_model_index(model); | 56 | node->model = mem_get_model_index(model); | 
| 60 | model->parent = mem_get_node_index(node); | ||
| 61 | return node; | 57 | return node; | 
| 62 | } | 58 | } | 
| 63 | 59 | ||
| @@ -66,7 +62,6 @@ SceneNode* gfx_make_object_node(SceneObject* object) { | |||
| 66 | SceneNode* node = gfx_make_node(); | 62 | SceneNode* node = gfx_make_node(); | 
| 67 | node->type = ObjectNode; | 63 | node->type = ObjectNode; | 
| 68 | node->object = mem_get_object_index(object); | 64 | node->object = mem_get_object_index(object); | 
| 69 | object->parent = mem_get_node_index(node); | ||
| 70 | return node; | 65 | return node; | 
| 71 | } | 66 | } | 
| 72 | 67 | ||
| @@ -74,24 +69,19 @@ SceneNode* gfx_make_object_node(SceneObject* object) { | |||
| 74 | static void free_node_resource(SceneNode* node) { | 69 | static void free_node_resource(SceneNode* node) { | 
| 75 | assert(node); | 70 | assert(node); | 
| 76 | 71 | ||
| 77 | // Set the resource's parent node back to 0 to avoid a recursive call into | ||
| 78 | // gfx_del_node(). | ||
| 79 | switch (node->type) { | 72 | switch (node->type) { | 
| 80 | case AnimaNode: { | 73 | case AnimaNode: { | 
| 81 | Anima* anima = mem_get_anima(node->anima); | 74 | Anima* anima = mem_get_anima(node->anima); | 
| 82 | anima->parent.val = 0; | ||
| 83 | gfx_destroy_anima(&anima); | 75 | gfx_destroy_anima(&anima); | 
| 84 | return; | 76 | return; | 
| 85 | } | 77 | } | 
| 86 | case CameraNode: { | 78 | case CameraNode: { | 
| 87 | SceneCamera* camera = mem_get_camera(node->camera); | 79 | Camera* camera = mem_get_camera(node->camera); | 
| 88 | camera->parent.val = 0; | ||
| 89 | gfx_destroy_camera(&camera); | 80 | gfx_destroy_camera(&camera); | 
| 90 | return; | 81 | return; | 
| 91 | } | 82 | } | 
| 92 | case LightNode: { | 83 | case LightNode: { | 
| 93 | Light* light = mem_get_light(node->light); | 84 | Light* light = mem_get_light(node->light); | 
| 94 | light->parent.val = 0; | ||
| 95 | gfx_destroy_light(&light); | 85 | gfx_destroy_light(&light); | 
| 96 | return; | 86 | return; | 
| 97 | } | 87 | } | 
| @@ -100,13 +90,13 @@ static void free_node_resource(SceneNode* node) { | |||
| 100 | } | 90 | } | 
| 101 | case ObjectNode: { | 91 | case ObjectNode: { | 
| 102 | SceneObject* object = mem_get_object(node->object); | 92 | SceneObject* object = mem_get_object(node->object); | 
| 103 | object->parent.val = 0; | ||
| 104 | gfx_destroy_object(&object); | 93 | gfx_destroy_object(&object); | 
| 105 | return; | 94 | return; | 
| 106 | } | 95 | } | 
| 107 | case LogicalNode: | 96 | case LogicalNode: { | 
| 108 | return; // Logical nodes have no resource. | 97 | return; // Logical nodes have no resource. | 
| 109 | } | 98 | } | 
| 99 | } | ||
| 110 | FAIL("unhandled node type"); | 100 | FAIL("unhandled node type"); | 
| 111 | } | 101 | } | 
| 112 | 102 | ||
| @@ -170,11 +160,11 @@ Anima* gfx_get_node_anima_mut(SceneNode* node) { | |||
| 170 | NODE_GET(node, anima, AnimaNode); | 160 | NODE_GET(node, anima, AnimaNode); | 
| 171 | } | 161 | } | 
| 172 | 162 | ||
| 173 | const SceneCamera* gfx_get_node_camera(const SceneNode* node) { | 163 | const Camera* gfx_get_node_camera(const SceneNode* node) { | 
| 174 | NODE_GET(node, camera, CameraNode); | 164 | NODE_GET(node, camera, CameraNode); | 
| 175 | } | 165 | } | 
| 176 | 166 | ||
| 177 | SceneCamera* gfx_get_node_camera_mut(SceneNode* node) { | 167 | Camera* gfx_get_node_camera_mut(SceneNode* node) { | 
| 178 | NODE_GET(node, camera, CameraNode); | 168 | NODE_GET(node, camera, CameraNode); | 
| 179 | } | 169 | } | 
| 180 | 170 | ||
