aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gfx/scene.h215
-rw-r--r--include/gfx/scene/camera.h13
-rw-r--r--include/gfx/scene/model.h12
-rw-r--r--include/gfx/scene/node.h137
-rw-r--r--include/gfx/scene/object.h39
-rw-r--r--include/gfx/scene/scene.h19
-rw-r--r--src/asset/asset_cache.c4
-rw-r--r--src/asset/model.c4
-rw-r--r--src/memory.c3
-rw-r--r--src/scene/camera.c4
-rw-r--r--src/scene/model.c2
-rw-r--r--src/scene/model_impl.h2
-rw-r--r--src/scene/node.c2
-rw-r--r--src/scene/node_impl.h2
-rw-r--r--src/scene/object_impl.h2
-rw-r--r--src/scene/scene_impl.h2
-rw-r--r--src/util/skyquad.c5
17 files changed, 224 insertions, 243 deletions
diff --git a/include/gfx/scene.h b/include/gfx/scene.h
index 3098221..740a948 100644
--- a/include/gfx/scene.h
+++ b/include/gfx/scene.h
@@ -1,7 +1,212 @@
1#pragma once 1#pragma once
2 2
3#include <gfx/scene/camera.h> 3#include <gfx/scene.h>
4#include <gfx/scene/model.h> 4#include <gfx/sizes.h>
5#include <gfx/scene/node.h> 5
6#include <gfx/scene/object.h> 6#include <math/aabb3.h>
7#include <gfx/scene/scene.h> 7#include <math/fwd.h>
8#include <math/mat4.h>
9
10typedef struct Anima Anima;
11typedef struct Camera Camera;
12typedef struct Light Light;
13typedef struct Mesh Mesh;
14typedef struct Model Model;
15typedef struct Scene Scene;
16/// A node in the scene graph.
17///
18/// Scene nodes take ownership of the object they are associated with (Camera,
19/// Light, SceneObject, etc), as well as of child nodes.
20typedef struct SceneNode SceneNode;
21typedef struct SceneObject SceneObject;
22typedef struct Skeleton Skeleton;
23
24typedef struct ObjectDesc {
25 size_t num_meshes;
26 Mesh* meshes[GFX_MAX_NUM_MESHES];
27} ObjectDesc;
28
29/// Scene node type.
30typedef enum NodeType {
31 LogicalNode,
32 AnimaNode,
33 CameraNode,
34 LightNode,
35 ModelNode,
36 ObjectNode,
37} NodeType;
38
39// -----------------------------------------------------------------------------
40// Camera.
41// -----------------------------------------------------------------------------
42
43/// Create a new camera.
44Camera* gfx_make_camera(void);
45
46/// Destroy the camera.
47void gfx_destroy_camera(Camera**);
48
49// -----------------------------------------------------------------------------
50// Model.
51// -----------------------------------------------------------------------------
52
53/// Return the model's anima, or null if the model is not animated.
54Anima* gfx_get_model_anima(Model*);
55
56/// Return the model's root node.
57const SceneNode* gfx_get_model_root(const Model*);
58SceneNode* gfx_get_model_root_mut(Model*);
59
60// -----------------------------------------------------------------------------
61// Object.
62// -----------------------------------------------------------------------------
63
64/// Create a new object.
65SceneObject* gfx_make_object(const ObjectDesc*);
66
67/// Destroy the object.
68///
69/// The object is conveniently removed from the scene graph and its parent scene
70/// node is destroyed.
71void gfx_destroy_object(SceneObject**);
72
73/// Set the object's skeleton.
74void gfx_set_object_skeleton(SceneObject*, const Skeleton*);
75
76/// Get the object's skeleton.
77/// Return null if the object has no skeleton.
78const Skeleton* gfx_get_object_skeleton(const SceneObject*);
79
80/// Gets the object's bounding box.
81///
82/// The object's bounding box is the bounding box of its mesh geometries.
83aabb3 gfx_get_object_aabb(const SceneObject*);
84
85// -----------------------------------------------------------------------------
86// Scene.
87// -----------------------------------------------------------------------------
88
89/// Create a new scene.
90Scene* gfx_make_scene(void);
91
92/// Destroy the scene.
93///
94/// This function destroys the scene and all objects that it owns (scene
95/// objects, cameras, lights, etc), but not objects that could be shared with
96/// other scenes (meshes, materials, etc).
97void gfx_destroy_scene(Scene**);
98
99/// Get the scene's root node.
100const SceneNode* gfx_get_scene_root(const Scene*);
101SceneNode* gfx_get_scene_root_mut(Scene*);
102
103// -----------------------------------------------------------------------------
104// Node constructors and destructor.
105// -----------------------------------------------------------------------------
106
107/// Create a new scene node.
108///
109/// This node does not contain any camera, light, object, etc. and exists simply
110/// as a logical and spatial construct.
111SceneNode* gfx_make_node(void);
112
113/// Create an anima node.
114SceneNode* gfx_make_anima_node(Anima*);
115
116/// Create a new camera node.
117SceneNode* gfx_make_camera_node(Camera*);
118
119/// Create a new light node.
120SceneNode* gfx_make_light_node(Light*);
121
122/// Create a new model node.
123SceneNode* gfx_make_model_node(Model*);
124
125/// Create a new object node.
126SceneNode* gfx_make_object_node(SceneObject*);
127
128/// Recursively destroy the scene node and its children.
129///
130/// The scene node and its children are removed from the scene graph.
131///
132/// Node resources -- cameras, lights, objects, etc. -- are also destroyed.
133void gfx_destroy_node(SceneNode**);
134
135// -----------------------------------------------------------------------------
136// Node getters.
137// -----------------------------------------------------------------------------
138
139/// Get the node's type.
140NodeType gfx_get_node_type(const SceneNode*);
141
142/// Get the node's anima.
143///
144/// The node must be of type AnimaNode.
145const Anima* gfx_get_node_anima(const SceneNode*);
146Anima* gfx_get_node_anima_mut(SceneNode*);
147
148/// Get the node's camera.
149///
150/// The node must be of type CameraNode.
151const Camera* gfx_get_node_camera(const SceneNode* node);
152Camera* gfx_get_node_camera_mut(SceneNode* node);
153
154/// Get the node's light.
155///
156/// The node must be of type LightNode.
157const Light* gfx_get_node_light(const SceneNode*);
158Light* gfx_get_node_light_mut(SceneNode*);
159
160/// Get the node's model.
161///
162/// The node must be of type ModelNode.
163const Model* gfx_get_node_model(const SceneNode*);
164Model* gfx_get_node_model_mut(SceneNode*);
165
166/// Get the node's scene object.
167///
168/// The node must be of type ObjectNode.
169const SceneObject* gfx_get_node_object(const SceneNode*);
170SceneObject* gfx_get_node_object_mut(SceneNode*);
171
172/// Get the node's parent.
173const SceneNode* gfx_get_node_parent(const SceneNode*);
174SceneNode* gfx_get_node_parent_mut(SceneNode*);
175
176/// Get the node's first child.
177const SceneNode* gfx_get_node_child(const SceneNode*);
178SceneNode* gfx_get_node_child_mut(SceneNode*);
179
180/// Get the node's immediate sibling.
181const SceneNode* gfx_get_node_sibling(const SceneNode*);
182SceneNode* gfx_get_node_sibling_mut(SceneNode*);
183
184/// Get the node's (local) transform.
185mat4 gfx_get_node_transform(const SceneNode*);
186
187/// Get the node's global transform.
188mat4 gfx_get_node_global_transform(const SceneNode*);
189
190// -----------------------------------------------------------------------------
191// Node setters.
192// -----------------------------------------------------------------------------
193
194/// Set the node's parent.
195///
196/// Pass in null to unwire from the existing parent, if one exists.
197void gfx_set_node_parent(SceneNode*, SceneNode* parent_node);
198
199/// Set the node's (local) transform.
200void gfx_set_node_transform(SceneNode*, const mat4* transform);
201
202/// Set the node's position.
203void gfx_set_node_position(SceneNode*, const vec3* position);
204
205/// Set the node's rotation.
206void gfx_set_node_rotation(SceneNode*, const quat* rotation);
207
208/// Set the node's rotation.
209void gfx_set_node_rotation_mat(SceneNode*, const mat4* rotation);
210
211/// Log the node's hierarchy.
212void gfx_log_node_hierarchy(const SceneNode*);
diff --git a/include/gfx/scene/camera.h b/include/gfx/scene/camera.h
deleted file mode 100644
index 873f780..0000000
--- a/include/gfx/scene/camera.h
+++ /dev/null
@@ -1,13 +0,0 @@
1#pragma once
2
3#include <math/fwd.h>
4
5typedef struct SceneNode SceneNode;
6
7typedef struct Camera Camera;
8
9/// Create a new camera.
10Camera* gfx_make_camera();
11
12/// Destroy the camera.
13void gfx_destroy_camera(Camera**);
diff --git a/include/gfx/scene/model.h b/include/gfx/scene/model.h
deleted file mode 100644
index 42f85d4..0000000
--- a/include/gfx/scene/model.h
+++ /dev/null
@@ -1,12 +0,0 @@
1#pragma once
2
3typedef struct Anima Anima;
4typedef struct Model Model;
5typedef struct SceneNode SceneNode;
6
7/// Return the model's anima, or null if the model is not animated.
8Anima* gfx_get_model_anima(Model*);
9
10/// Return the model's root node.
11const SceneNode* gfx_get_model_root(const Model*);
12SceneNode* gfx_get_model_root_mut(Model*);
diff --git a/include/gfx/scene/node.h b/include/gfx/scene/node.h
deleted file mode 100644
index 215bbda..0000000
--- a/include/gfx/scene/node.h
+++ /dev/null
@@ -1,137 +0,0 @@
1#pragma once
2
3#include <math/fwd.h>
4#include <math/mat4.h>
5
6typedef struct Anima Anima;
7typedef struct Camera Camera;
8typedef struct Light Light;
9typedef struct Model Model;
10typedef struct SceneObject SceneObject;
11
12/// Scene node type.
13typedef enum NodeType {
14 LogicalNode,
15 AnimaNode,
16 CameraNode,
17 LightNode,
18 ModelNode,
19 ObjectNode,
20} NodeType;
21
22/// A node in the scene graph.
23///
24/// Scene nodes take ownership of the object they are associated with (Camera,
25/// Light, SceneObject, etc), as well as of child nodes.
26typedef struct SceneNode SceneNode;
27
28// -----------------------------------------------------------------------------
29// Constructors and destructor.
30// -----------------------------------------------------------------------------
31
32/// Create a new scene node.
33///
34/// This node does not contain any camera, light, object, etc. and exists simply
35/// as a logical and spatial construct.
36SceneNode* gfx_make_node(void);
37
38/// Create an anima node.
39SceneNode* gfx_make_anima_node(Anima*);
40
41/// Create a new camera node.
42SceneNode* gfx_make_camera_node(Camera*);
43
44/// Create a new light node.
45SceneNode* gfx_make_light_node(Light*);
46
47/// Create a new model node.
48SceneNode* gfx_make_model_node(Model*);
49
50/// Create a new object node.
51SceneNode* gfx_make_object_node(SceneObject*);
52
53/// Recursively destroy the scene node and its children.
54///
55/// The scene node and its children are removed from the scene graph.
56///
57/// Node resources -- cameras, lights, objects, etc. -- are also destroyed.
58void gfx_destroy_node(SceneNode**);
59
60// -----------------------------------------------------------------------------
61// Getters.
62// -----------------------------------------------------------------------------
63
64/// Get the node's type.
65NodeType gfx_get_node_type(const SceneNode*);
66
67/// Get the node's anima.
68///
69/// The node must be of type AnimaNode.
70const Anima* gfx_get_node_anima(const SceneNode*);
71Anima* gfx_get_node_anima_mut(SceneNode*);
72
73/// Get the node's camera.
74///
75/// The node must be of type CameraNode.
76const Camera* gfx_get_node_camera(const SceneNode* node);
77Camera* gfx_get_node_camera_mut(SceneNode* node);
78
79/// Get the node's light.
80///
81/// The node must be of type LightNode.
82const Light* gfx_get_node_light(const SceneNode*);
83Light* gfx_get_node_light_mut(SceneNode*);
84
85/// Get the node's model.
86///
87/// The node must be of type ModelNode.
88const Model* gfx_get_node_model(const SceneNode*);
89Model* gfx_get_node_model_mut(SceneNode*);
90
91/// Get the node's scene object.
92///
93/// The node must be of type ObjectNode.
94const SceneObject* gfx_get_node_object(const SceneNode*);
95SceneObject* gfx_get_node_object_mut(SceneNode*);
96
97/// Get the node's parent.
98const SceneNode* gfx_get_node_parent(const SceneNode*);
99SceneNode* gfx_get_node_parent_mut(SceneNode*);
100
101/// Get the node's first child.
102const SceneNode* gfx_get_node_child(const SceneNode*);
103SceneNode* gfx_get_node_child_mut(SceneNode*);
104
105/// Get the node's immediate sibling.
106const SceneNode* gfx_get_node_sibling(const SceneNode*);
107SceneNode* gfx_get_node_sibling_mut(SceneNode*);
108
109/// Get the node's (local) transform.
110mat4 gfx_get_node_transform(const SceneNode*);
111
112/// Get the node's global transform.
113mat4 gfx_get_node_global_transform(const SceneNode*);
114
115// -----------------------------------------------------------------------------
116// Setters.
117// -----------------------------------------------------------------------------
118
119/// Set the node's parent.
120///
121/// Pass in null to unwire from the existing parent, if one exists.
122void gfx_set_node_parent(SceneNode*, SceneNode* parent_node);
123
124/// Set the node's (local) transform.
125void gfx_set_node_transform(SceneNode*, const mat4* transform);
126
127/// Set the node's position.
128void gfx_set_node_position(SceneNode*, const vec3* position);
129
130/// Set the node's rotation.
131void gfx_set_node_rotation(SceneNode*, const quat* rotation);
132
133/// Set the node's rotation.
134void gfx_set_node_rotation_mat(SceneNode*, const mat4* rotation);
135
136/// Log the node's hierarchy.
137void gfx_log_node_hierarchy(const SceneNode*);
diff --git a/include/gfx/scene/object.h b/include/gfx/scene/object.h
deleted file mode 100644
index 7579d29..0000000
--- a/include/gfx/scene/object.h
+++ /dev/null
@@ -1,39 +0,0 @@
1#pragma once
2
3#include <gfx/sizes.h>
4
5#include <math/fwd.h>
6
7#include <math/aabb3.h>
8
9typedef struct Mesh Mesh;
10typedef struct SceneNode SceneNode;
11typedef struct Skeleton Skeleton;
12
13typedef struct SceneObject SceneObject;
14
15typedef struct ObjectDesc {
16 size_t num_meshes;
17 Mesh* meshes[GFX_MAX_NUM_MESHES];
18} ObjectDesc;
19
20/// Create a new object.
21SceneObject* gfx_make_object(const ObjectDesc*);
22
23/// Destroy the object.
24///
25/// The object is conveniently removed from the scene graph and its parent scene
26/// node is destroyed.
27void gfx_destroy_object(SceneObject**);
28
29/// Set the object's skeleton.
30void gfx_set_object_skeleton(SceneObject*, const Skeleton*);
31
32/// Get the object's skeleton.
33/// Return null if the object has no skeleton.
34const Skeleton* gfx_get_object_skeleton(const SceneObject*);
35
36/// Gets the object's bounding box.
37///
38/// The object's bounding box is the bounding box of its mesh geometries.
39aabb3 gfx_get_object_aabb(const SceneObject*);
diff --git a/include/gfx/scene/scene.h b/include/gfx/scene/scene.h
deleted file mode 100644
index 7386349..0000000
--- a/include/gfx/scene/scene.h
+++ /dev/null
@@ -1,19 +0,0 @@
1#pragma once
2
3typedef struct SceneNode SceneNode;
4
5typedef struct Scene Scene;
6
7/// Create a new scene.
8Scene* gfx_make_scene(void);
9
10/// Destroy the scene.
11///
12/// This function destroys the scene and all objects that it owns (scene
13/// objects, cameras, lights, etc), but not objects that could be shared with
14/// other scenes (meshes, materials, etc).
15void gfx_destroy_scene(Scene**);
16
17/// Get the scene's root node.
18const SceneNode* gfx_get_scene_root(const Scene*);
19SceneNode* gfx_get_scene_root_mut(Scene*);
diff --git a/src/asset/asset_cache.c b/src/asset/asset_cache.c
index 2df0242..dfaf7c6 100644
--- a/src/asset/asset_cache.c
+++ b/src/asset/asset_cache.c
@@ -1,6 +1,6 @@
1#include "asset_cache.h" 1#include "asset_cache.h"
2 2
3#include "../animation_impl.h" 3#include "animation_impl.h"
4#include "memory.h" 4#include "memory.h"
5#include "model.h" 5#include "model.h"
6#include "scene/model_impl.h" 6#include "scene/model_impl.h"
@@ -9,7 +9,7 @@
9 9
10#include <gfx/asset.h> 10#include <gfx/asset.h>
11#include <gfx/gfx.h> 11#include <gfx/gfx.h>
12#include <gfx/scene/node.h> 12#include <gfx/scene.h>
13#include <gfx_assert.h> 13#include <gfx_assert.h>
14 14
15#include <cstring.h> 15#include <cstring.h>
diff --git a/src/asset/model.c b/src/asset/model.c
index 60e7ad1..2ee3cd1 100644
--- a/src/asset/model.c
+++ b/src/asset/model.c
@@ -89,9 +89,7 @@
89#include <gfx/core.h> 89#include <gfx/core.h>
90#include <gfx/gfx.h> 90#include <gfx/gfx.h>
91#include <gfx/render/llr.h> 91#include <gfx/render/llr.h>
92#include <gfx/scene/camera.h> 92#include <gfx/scene.h>
93#include <gfx/scene/node.h>
94#include <gfx/scene/object.h>
95#include <gfx/sizes.h> 93#include <gfx/sizes.h>
96#include <gfx/util/shader.h> 94#include <gfx/util/shader.h>
97 95
diff --git a/src/memory.c b/src/memory.c
index a4d6920..de20f78 100644
--- a/src/memory.c
+++ b/src/memory.c
@@ -1,6 +1,6 @@
1#include "memory.h" 1#include "memory.h"
2 2
3#include <gfx/scene/camera.h> 3#include <gfx/scene.h>
4#include <gfx/sizes.h> 4#include <gfx/sizes.h>
5 5
6#include "animation_impl.h" 6#include "animation_impl.h"
@@ -11,7 +11,6 @@
11#include "scene/scene_impl.h" 11#include "scene/scene_impl.h"
12 12
13#include <log/log.h> 13#include <log/log.h>
14#include <math/camera.h>
15#include <mempool.h> 14#include <mempool.h>
16 15
17DEF_MEMPOOL(anima_pool, Anima, GFX_MAX_NUM_ANIMAS) 16DEF_MEMPOOL(anima_pool, Anima, GFX_MAX_NUM_ANIMAS)
diff --git a/src/scene/camera.c b/src/scene/camera.c
index 475101d..eeb5f7e 100644
--- a/src/scene/camera.c
+++ b/src/scene/camera.c
@@ -1,11 +1,11 @@
1#include <gfx/scene/camera.h> 1#include <gfx/scene.h>
2 2
3#include "memory.h" 3#include "memory.h"
4 4
5#include <assert.h> 5#include <assert.h>
6#include <math/camera.h> 6#include <math/camera.h>
7 7
8Camera* gfx_make_camera() { 8Camera* gfx_make_camera(void) {
9 Camera* camera = mem_alloc_camera(); 9 Camera* camera = mem_alloc_camera();
10 *camera = camera_perspective( 10 *camera = camera_perspective(
11 /*fovy=*/90.0 * TO_RAD, /*aspect=*/16.0 / 9.0, 11 /*fovy=*/90.0 * TO_RAD, /*aspect=*/16.0 / 9.0,
diff --git a/src/scene/model.c b/src/scene/model.c
index e280a41..1bd0112 100644
--- a/src/scene/model.c
+++ b/src/scene/model.c
@@ -1,6 +1,6 @@
1#include "model_impl.h" 1#include "model_impl.h"
2 2
3#include <gfx/scene/node.h> 3#include <gfx/scene.h>
4 4
5#include "memory.h" 5#include "memory.h"
6 6
diff --git a/src/scene/model_impl.h b/src/scene/model_impl.h
index 079aede..72cd0ab 100644
--- a/src/scene/model_impl.h
+++ b/src/scene/model_impl.h
@@ -1,6 +1,6 @@
1#pragma once 1#pragma once
2 2
3#include <gfx/scene/model.h> 3#include <gfx/scene.h>
4 4
5#include "memory.h" 5#include "memory.h"
6 6
diff --git a/src/scene/node.c b/src/scene/node.c
index 7032324..0004d27 100644
--- a/src/scene/node.c
+++ b/src/scene/node.c
@@ -8,7 +8,7 @@
8 8
9#include "gfx_assert.h" 9#include "gfx_assert.h"
10 10
11#include <gfx/scene/camera.h> 11#include <gfx/scene.h>
12 12
13#include <cstring.h> 13#include <cstring.h>
14#include <log/log.h> 14#include <log/log.h>
diff --git a/src/scene/node_impl.h b/src/scene/node_impl.h
index aba8c41..9e65588 100644
--- a/src/scene/node_impl.h
+++ b/src/scene/node_impl.h
@@ -1,6 +1,6 @@
1#pragma once 1#pragma once
2 2
3#include <gfx/scene/node.h> 3#include <gfx/scene.h>
4 4
5#include "../types.h" 5#include "../types.h"
6 6
diff --git a/src/scene/object_impl.h b/src/scene/object_impl.h
index 1b14cb5..345d615 100644
--- a/src/scene/object_impl.h
+++ b/src/scene/object_impl.h
@@ -1,6 +1,6 @@
1#pragma once 1#pragma once
2 2
3#include <gfx/scene/object.h> 3#include <gfx/scene.h>
4 4
5#include "../types.h" 5#include "../types.h"
6 6
diff --git a/src/scene/scene_impl.h b/src/scene/scene_impl.h
index 157f891..ad2e892 100644
--- a/src/scene/scene_impl.h
+++ b/src/scene/scene_impl.h
@@ -1,6 +1,6 @@
1#pragma once 1#pragma once
2 2
3#include <gfx/scene/scene.h> 3#include <gfx/scene.h>
4 4
5#include "../types.h" 5#include "../types.h"
6 6
diff --git a/src/util/skyquad.c b/src/util/skyquad.c
index 1a9b4af..f4561f2 100644
--- a/src/util/skyquad.c
+++ b/src/util/skyquad.c
@@ -1,9 +1,8 @@
1#include <gfx/util/skyquad.h> 1#include <gfx/util/skyquad.h>
2 2
3#include <../../include/gfx/render/llr.h>
4#include <gfx/core.h> 3#include <gfx/core.h>
5#include <gfx/scene/node.h> 4#include <gfx/render/llr.h>
6#include <gfx/scene/object.h> 5#include <gfx/scene.h>
7#include <gfx/util/geometry.h> 6#include <gfx/util/geometry.h>
8#include <gfx/util/shader.h> 7#include <gfx/util/shader.h>
9 8