aboutsummaryrefslogtreecommitdiff
path: root/src/scene/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/scene/node.c')
-rw-r--r--src/scene/node.c32
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
22SceneNode* gfx_make_node() { 22SceneNode* 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
37SceneNode* gfx_make_camera_node(SceneCamera* camera) { 36SceneNode* 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) {
74static void free_node_resource(SceneNode* node) { 69static 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
173const SceneCamera* gfx_get_node_camera(const SceneNode* node) { 163const Camera* gfx_get_node_camera(const SceneNode* node) {
174 NODE_GET(node, camera, CameraNode); 164 NODE_GET(node, camera, CameraNode);
175} 165}
176 166
177SceneCamera* gfx_get_node_camera_mut(SceneNode* node) { 167Camera* gfx_get_node_camera_mut(SceneNode* node) {
178 NODE_GET(node, camera, CameraNode); 168 NODE_GET(node, camera, CameraNode);
179} 169}
180 170