diff options
Diffstat (limited to 'gltfview/src')
| -rw-r--r-- | gltfview/src/game.c | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/gltfview/src/game.c b/gltfview/src/game.c index f822b08..662272c 100644 --- a/gltfview/src/game.c +++ b/gltfview/src/game.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | #include <gfx/error.h> | 3 | #include <gfx/error.h> |
| 4 | #include <gfx/render_backend.h> | 4 | #include <gfx/render_backend.h> |
| 5 | #include <gfx/scene/camera.h> | ||
| 5 | #include <gfx/scene/light.h> | 6 | #include <gfx/scene/light.h> |
| 6 | #include <gfx/scene/material.h> | 7 | #include <gfx/scene/material.h> |
| 7 | #include <gfx/scene/mesh.h> | 8 | #include <gfx/scene/mesh.h> |
| @@ -32,8 +33,10 @@ static const char* FLIGHT_HELMET = | |||
| 32 | "/assets/glTF-Sample-Models/2.0/FlightHelmet/glTF/FlightHelmet.gltf"; | 33 | "/assets/glTF-Sample-Models/2.0/FlightHelmet/glTF/FlightHelmet.gltf"; |
| 33 | static const char* DAMAGED_HELMET = | 34 | static const char* DAMAGED_HELMET = |
| 34 | "/assets/glTF-Sample-Models/2.0/DamagedHelmet/glTF/DamagedHelmet.gltf"; | 35 | "/assets/glTF-Sample-Models/2.0/DamagedHelmet/glTF/DamagedHelmet.gltf"; |
| 36 | static const char* GIRL = | ||
| 37 | "/home/jeanne/Nextcloud/assets/models/girl/girl-with-ground.gltf"; | ||
| 35 | 38 | ||
| 36 | #define DEFAULT_SCENE_FILE DAMAGED_HELMET | 39 | #define DEFAULT_SCENE_FILE GIRL |
| 37 | 40 | ||
| 38 | static const char* CLOUDS1_TEXTURE = "/assets/skybox/clouds1/clouds1_west.bmp"; | 41 | static const char* CLOUDS1_TEXTURE = "/assets/skybox/clouds1/clouds1_west.bmp"; |
| 39 | 42 | ||
| @@ -189,6 +192,26 @@ static bool load_texture_debugger_scene(Game* game) { | |||
| 189 | return true; | 192 | return true; |
| 190 | } | 193 | } |
| 191 | 194 | ||
| 195 | /// Render the bounding boxes of all scene objects. | ||
| 196 | static void render_bounding_boxes(ImmRenderer* imm, const SceneNode* node) { | ||
| 197 | if (gfx_get_node_type(node) == ObjectNode) { | ||
| 198 | // TODO: Look at the scene log. The JointNodes are detached from the | ||
| 199 | // ObjectNodes. This is why the boxes are not being transformed as expected | ||
| 200 | // here. Anima needs to animate boxes? Use OOBB in addition to AABB? | ||
| 201 | const mat4 model = gfx_get_node_global_transform(node); | ||
| 202 | const SceneObject* obj = gfx_get_node_object(node); | ||
| 203 | const aabb3 box = gfx_calc_object_aabb(obj); | ||
| 204 | gfx_imm_set_model_matrix(imm, &model); | ||
| 205 | gfx_imm_draw_aabb(imm, box); | ||
| 206 | } | ||
| 207 | |||
| 208 | // Render children's boxes. | ||
| 209 | for (NodeIter it = gfx_get_node_child(node); it; | ||
| 210 | it = gfx_get_next_child(it)) { | ||
| 211 | render_bounding_boxes(imm, gfx_get_iter_node(it)); | ||
| 212 | } | ||
| 213 | } | ||
| 214 | |||
| 192 | bool game_new(Game* game, int argc, const char** argv) { | 215 | bool game_new(Game* game, int argc, const char** argv) { |
| 193 | // TODO: getopt() to implement proper argument parsing. | 216 | // TODO: getopt() to implement proper argument parsing. |
| 194 | const char* scene_filepath = argc > 1 ? argv[1] : DEFAULT_SCENE_FILE; | 217 | const char* scene_filepath = argc > 1 ? argv[1] : DEFAULT_SCENE_FILE; |
| @@ -239,6 +262,8 @@ void game_end(Game* game) { gfx_destroy(&game->gfx); } | |||
| 239 | void game_update(Game* game, double t, double dt) { | 262 | void game_update(Game* game, double t, double dt) { |
| 240 | // LOGD("Tick"); | 263 | // LOGD("Tick"); |
| 241 | 264 | ||
| 265 | // TODO: Animation should be handled by Gfx instead. Descend through the scene | ||
| 266 | // looking for animas and animate them. gfx_animate(t). | ||
| 242 | Anima* anima = gfx_get_node_anima(game->root_node); | 267 | Anima* anima = gfx_get_node_anima(game->root_node); |
| 243 | gfx_update_animation(anima, t); | 268 | gfx_update_animation(anima, t); |
| 244 | 269 | ||
| @@ -263,8 +288,18 @@ void game_update(Game* game, double t, double dt) { | |||
| 263 | } | 288 | } |
| 264 | 289 | ||
| 265 | void game_render(const Game* game) { | 290 | void game_render(const Game* game) { |
| 266 | gfx_render_scene( | 291 | gfx_render_scene(game->renderer, game->scene, game->camera); |
| 267 | game->renderer, game->render_backend, game->scene, game->camera); | 292 | |
| 293 | ImmRenderer* imm = gfx_get_imm_renderer(game->gfx); | ||
| 294 | assert(imm); | ||
| 295 | gfx_imm_start(imm); | ||
| 296 | gfx_imm_set_camera(imm, gfx_get_camera_camera(game->camera)); | ||
| 297 | gfx_imm_set_colour(imm, vec4_make(0.2, 0.2, 1.0, 0.3)); | ||
| 298 | // DEBUG | ||
| 299 | // const aabb3 box = aabb3_make(vec3_make(0, 0, 0), vec3_make(1, 1, 1)); | ||
| 300 | // gfx_imm_draw_aabb(imm, box); | ||
| 301 | render_bounding_boxes(imm, gfx_get_scene_root(game->scene)); | ||
| 302 | gfx_imm_end(imm); | ||
| 268 | } | 303 | } |
| 269 | 304 | ||
| 270 | void game_set_viewport(Game* game, int width, int height) { | 305 | void game_set_viewport(Game* game, int width, int height) { |
