summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/viewer.c57
1 files changed, 36 insertions, 21 deletions
diff --git a/src/plugins/viewer.c b/src/plugins/viewer.c
index 84fcca4..97c718e 100644
--- a/src/plugins/viewer.c
+++ b/src/plugins/viewer.c
@@ -2,11 +2,14 @@
2 2
3#include <gfx/app.h> 3#include <gfx/app.h>
4#include <gfx/asset.h> 4#include <gfx/asset.h>
5#include <gfx/llr/llr.h>
5#include <gfx/renderer.h> 6#include <gfx/renderer.h>
7#include <gfx/renderer/imm_renderer.h>
6#include <gfx/scene.h> 8#include <gfx/scene.h>
7#include <gfx/util/skyquad.h> 9#include <gfx/util/skyquad.h>
8#include <math/camera.h> 10#include <math/camera.h>
9#include <math/spatial3.h> 11#include <math/spatial3.h>
12#include <math/vec2.h>
10 13
11#include <log/log.h> 14#include <log/log.h>
12 15
@@ -34,6 +37,10 @@ static const char* FLIGHT_HELMET =
34static const char* DAMAGED_HELMET = 37static const char* DAMAGED_HELMET =
35 "/home/jeanne/Nextcloud/assets/glTF-Sample-Models/2.0/DamagedHelmet/glTF/" 38 "/home/jeanne/Nextcloud/assets/glTF-Sample-Models/2.0/DamagedHelmet/glTF/"
36 "DamagedHelmet.gltf"; 39 "DamagedHelmet.gltf";
40static const char* CHRONOGRAPH_WATCH =
41 "/home/jeanne/Nextcloud/assets/glTF-Sample-Models/2.0/ChronographWatch/"
42 "glTF/"
43 "ChronographWatch.gltf";
37static const char* GIRL = 44static const char* GIRL =
38 "/home/jeanne/Nextcloud/assets/models/girl/girl-with-ground.gltf"; 45 "/home/jeanne/Nextcloud/assets/models/girl/girl-with-ground.gltf";
39static const char* BOXES = 46static const char* BOXES =
@@ -41,7 +48,7 @@ static const char* BOXES =
41 48
42#define DEFAULT_SCENE_FILE GIRL 49#define DEFAULT_SCENE_FILE GIRL
43 50
44static const bool RenderBoundingBoxes = false; 51static const bool RenderBoundingBoxes = true;
45static const R DefaultCameraSpeed = (R)6.0; 52static const R DefaultCameraSpeed = (R)6.0;
46static const R DefaultMouseSensitivity = (R)(10 * TO_RAD); 53static const R DefaultMouseSensitivity = (R)(10 * TO_RAD);
47static const vec3 DefaultCameraPosition = (vec3){0, 2, 5}; 54static const vec3 DefaultCameraPosition = (vec3){0, 2, 5};
@@ -52,13 +59,13 @@ typedef struct CameraCommand {
52 bool CameraMoveForward : 1; 59 bool CameraMoveForward : 1;
53 bool CameraMoveBackward : 1; 60 bool CameraMoveBackward : 1;
54 bool CameraIsRotating : 1; // When true, subsequent mouse movements cause the 61 bool CameraIsRotating : 1; // When true, subsequent mouse movements cause the
55 // camera to rotate. 62 // camera to rotate.
56} CameraCommand; 63} CameraCommand;
57 64
58typedef struct CameraController { 65typedef struct CameraController {
59 R camera_speed; // Camera movement speed. 66 R camera_speed; // Camera movement speed.
60 R mouse_sensitivity; // Controls the degree with which mouse movements 67 R mouse_sensitivity; // Controls the degree with which mouse movements
61 // rotate the camera. 68 // rotate the camera.
62 vec2 prev_mouse_position; // Mouse position in the previous frame. 69 vec2 prev_mouse_position; // Mouse position in the previous frame.
63} CameraController; 70} CameraController;
64 71
@@ -95,7 +102,7 @@ static SceneNode* load_skyquad(Gfx* gfx, SceneNode* root) {
95 102
96 const Texture* environment_map = load_environment_map(gfx); 103 const Texture* environment_map = load_environment_map(gfx);
97 if (!environment_map) { 104 if (!environment_map) {
98 return 0; 105 return nullptr;
99 } 106 }
100 107
101 return gfx_setup_skyquad(gfxcore, root, environment_map); 108 return gfx_setup_skyquad(gfxcore, root, environment_map);
@@ -114,18 +121,18 @@ static Model* load_model(Game* game, State* state, const char* scene_filepath) {
114 SceneNode* root = gfx_get_scene_root(state->scene); 121 SceneNode* root = gfx_get_scene_root(state->scene);
115 SceneNode* sky_light_node = load_skyquad(game->gfx, root); 122 SceneNode* sky_light_node = load_skyquad(game->gfx, root);
116 if (!sky_light_node) { 123 if (!sky_light_node) {
117 return 0; // test 124 return nullptr;
118 } 125 }
119 126
120 Model* model = gfx_load_model( 127 Model* model = gfx_load_model(
121 game->gfx, &(LoadModelCmd){.origin = AssetFromFile, 128 game->gfx, &(LoadModelCmd){.origin = AssetFromFile,
122 .filepath = mstring_make(scene_filepath)}); 129 .filepath = mstring_make(scene_filepath)});
123 if (!model) { 130 if (!model) {
124 return 0; 131 return nullptr;
125 } 132 }
126 SceneNode* model_node = gfx_make_model_node(model); 133 SceneNode* model_node = gfx_make_model_node(model);
127 if (!model_node) { 134 if (!model_node) {
128 return 0; 135 return nullptr;
129 } 136 }
130 gfx_set_node_parent(model_node, sky_light_node); 137 gfx_set_node_parent(model_node, sky_light_node);
131 138
@@ -146,10 +153,10 @@ bool init(Game* game, State** pp_state) {
146 goto cleanup; 153 goto cleanup;
147 } 154 }
148 155
149 if (!(state->scene = gfx_make_scene())) { 156 if (!((state->scene = gfx_make_scene()))) {
150 goto cleanup; 157 goto cleanup;
151 } 158 }
152 if (!(state->camera = gfx_make_camera())) { 159 if (!((state->camera = gfx_make_camera()))) {
153 goto cleanup; 160 goto cleanup;
154 } 161 }
155 162
@@ -267,8 +274,9 @@ void update(Game* game, State* state, double t, double dt) {
267 274
268/// Render the bounding boxes of all scene objects. 275/// Render the bounding boxes of all scene objects.
269static void render_bounding_boxes_rec( 276static void render_bounding_boxes_rec(
270 ImmRenderer* imm, const Anima* anima, const mat4* parent_model_matrix, 277 LLR* llr, ImmRenderer* imm, const Anima* anima,
271 const SceneNode* node) { 278 const mat4* parent_model_matrix, const SceneNode* node) {
279 assert(llr);
272 assert(imm); 280 assert(imm);
273 assert(node); 281 assert(node);
274 282
@@ -280,16 +288,17 @@ static void render_bounding_boxes_rec(
280 if (node_type == ModelNode) { 288 if (node_type == ModelNode) {
281 const Model* model = gfx_get_node_model(node); 289 const Model* model = gfx_get_node_model(node);
282 const SceneNode* root = gfx_get_model_root(model); 290 const SceneNode* root = gfx_get_model_root(model);
283 render_bounding_boxes_rec(imm, anima, &model_matrix, root); 291 render_bounding_boxes_rec(llr, imm, anima, &model_matrix, root);
284 } else if (node_type == AnimaNode) { 292 } else if (node_type == AnimaNode) {
285 anima = gfx_get_node_anima(node); 293 anima = gfx_get_node_anima(node);
286 } else if (node_type == ObjectNode) { 294 } else if (node_type == ObjectNode) {
287 gfx_imm_set_model_matrix(imm, &model_matrix); 295 gfx_llr_set_model_matrix(llr, &model_matrix);
288 296
289 const SceneObject* obj = gfx_get_node_object(node); 297 const SceneObject* obj = gfx_get_node_object(node);
290 const Skeleton* skeleton = gfx_get_object_skeleton(obj); 298 const Skeleton* skeleton = gfx_get_object_skeleton(obj);
291 299
292 if (skeleton) { // Animated model. 300 if (skeleton) {
301 // Animated model.
293 assert(anima); 302 assert(anima);
294 const size_t num_joints = gfx_get_skeleton_num_joints(skeleton); 303 const size_t num_joints = gfx_get_skeleton_num_joints(skeleton);
295 for (size_t i = 0; i < num_joints; ++i) { 304 for (size_t i = 0; i < num_joints; ++i) {
@@ -298,16 +307,19 @@ static void render_bounding_boxes_rec(
298 gfx_imm_draw_box3(imm, box.vertices); 307 gfx_imm_draw_box3(imm, box.vertices);
299 } 308 }
300 } 309 }
301 } else { // Static model. 310 } else {
311 // Static model.
302 const aabb3 box = gfx_get_object_aabb(obj); 312 const aabb3 box = gfx_get_object_aabb(obj);
303 gfx_imm_draw_aabb3(imm, box); 313 gfx_imm_draw_aabb3(imm, box);
304 } 314 }
315
316 gfx_imm_flush(imm);
305 } 317 }
306 318
307 // Render children's boxes. 319 // Render children's boxes.
308 const SceneNode* child = gfx_get_node_child(node); 320 const SceneNode* child = gfx_get_node_child(node);
309 while (child) { 321 while (child) {
310 render_bounding_boxes_rec(imm, anima, &model_matrix, child); 322 render_bounding_boxes_rec(llr, imm, anima, &model_matrix, child);
311 child = gfx_get_node_sibling(child); 323 child = gfx_get_node_sibling(child);
312 } 324 }
313} 325}
@@ -318,8 +330,10 @@ static void render_bounding_boxes(const Game* game, const State* state) {
318 assert(state); 330 assert(state);
319 331
320 GfxCore* gfxcore = gfx_get_core(game->gfx); 332 GfxCore* gfxcore = gfx_get_core(game->gfx);
333 LLR* llr = gfx_get_llr(game->gfx);
321 ImmRenderer* imm = gfx_get_imm_renderer(game->gfx); 334 ImmRenderer* imm = gfx_get_imm_renderer(game->gfx);
322 assert(gfxcore); 335 assert(gfxcore);
336 assert(llr);
323 assert(imm); 337 assert(imm);
324 338
325 const mat4 id = mat4_id(); 339 const mat4 id = mat4_id();
@@ -330,9 +344,10 @@ static void render_bounding_boxes(const Game* game, const State* state) {
330 gfx_set_polygon_offset(gfxcore, -1.5f, -1.0f); 344 gfx_set_polygon_offset(gfxcore, -1.5f, -1.0f);
331 345
332 gfx_imm_start(imm); 346 gfx_imm_start(imm);
333 gfx_imm_set_camera(imm, gfx_get_camera_camera(state->camera)); 347 gfx_llr_set_camera(llr, gfx_get_camera_camera(state->camera));
334 gfx_imm_set_colour(imm, vec4_make(0.3, 0.3, 0.9, 0.1)); 348 gfx_imm_set_colour(imm, vec4_make(0.3f, 0.3f, 0.9f, 0.1f));
335 render_bounding_boxes_rec(imm, anima, &id, gfx_get_scene_root(state->scene)); 349 render_bounding_boxes_rec(
350 llr, imm, anima, &id, gfx_get_scene_root(state->scene));
336 gfx_imm_end(imm); 351 gfx_imm_end(imm);
337 352
338 gfx_reset_polygon_offset(gfxcore); 353 gfx_reset_polygon_offset(gfxcore);