diff options
Diffstat (limited to 'game')
| -rw-r--r-- | game/src/plugins/viewer.c | 46 | 
1 files changed, 32 insertions, 14 deletions
| diff --git a/game/src/plugins/viewer.c b/game/src/plugins/viewer.c index 40213e4..dd7f451 100644 --- a/game/src/plugins/viewer.c +++ b/game/src/plugins/viewer.c | |||
| @@ -3,7 +3,6 @@ | |||
| 3 | #include <gfx/asset.h> | 3 | #include <gfx/asset.h> | 
| 4 | #include <gfx/renderer.h> | 4 | #include <gfx/renderer.h> | 
| 5 | #include <gfx/scene.h> | 5 | #include <gfx/scene.h> | 
| 6 | #include <gfx/scene/scene.h> | ||
| 7 | #include <gfx/util/skyquad.h> | 6 | #include <gfx/util/skyquad.h> | 
| 8 | #include <math/camera.h> | 7 | #include <math/camera.h> | 
| 9 | #include <math/spatial3.h> | 8 | #include <math/spatial3.h> | 
| @@ -26,6 +25,7 @@ static const char* GIRL = | |||
| 26 | 25 | ||
| 27 | struct State { | 26 | struct State { | 
| 28 | Scene* scene; | 27 | Scene* scene; | 
| 28 | Model* model; | ||
| 29 | SceneCamera* camera; | 29 | SceneCamera* camera; | 
| 30 | }; | 30 | }; | 
| 31 | 31 | ||
| @@ -65,8 +65,8 @@ static SceneNode* load_skyquad(Gfx* gfx, SceneNode* root) { | |||
| 65 | } | 65 | } | 
| 66 | 66 | ||
| 67 | /// Load the 3D scene. | 67 | /// Load the 3D scene. | 
| 68 | static SceneNode* load_scene( | 68 | /// Return the loaded model. | 
| 69 | Game* game, State* state, const char* scene_filepath) { | 69 | static Model* load_scene(Game* game, State* state, const char* scene_filepath) { | 
| 70 | assert(game); | 70 | assert(game); | 
| 71 | assert(game->gfx); | 71 | assert(game->gfx); | 
| 72 | assert(state); | 72 | assert(state); | 
| @@ -81,17 +81,22 @@ static SceneNode* load_scene( | |||
| 81 | return 0; // test | 81 | return 0; // test | 
| 82 | } | 82 | } | 
| 83 | 83 | ||
| 84 | SceneNode* scene_node = gfx_load_scene( | 84 | Model* model = gfx_load_model( | 
| 85 | game->gfx, sky_light_node, | 85 | game->gfx, | 
| 86 | &(LoadSceneCmd){ | 86 | &(LoadModelCmd){ | 
| 87 | .origin = AssetFromFile, .filepath = mstring_make(scene_filepath)}); | 87 | .origin = AssetFromFile, .filepath = mstring_make(scene_filepath)}); | 
| 88 | if (!scene_node) { | 88 | if (!model) { | 
| 89 | return 0; | 89 | return 0; | 
| 90 | } | 90 | } | 
| 91 | SceneNode* model_node = gfx_make_model_node(model); | ||
| 92 | if (!model_node) { | ||
| 93 | return 0; | ||
| 94 | } | ||
| 95 | gfx_set_node_parent(model_node, sky_light_node); | ||
| 91 | 96 | ||
| 92 | gfx_log_node_hierarchy(root); | 97 | gfx_log_node_hierarchy(root); | 
| 93 | 98 | ||
| 94 | return scene_node; | 99 | return model; | 
| 95 | } | 100 | } | 
| 96 | 101 | ||
| 97 | bool init(Game* game, State** pp_state) { | 102 | bool init(Game* game, State** pp_state) { | 
| @@ -115,13 +120,13 @@ bool init(Game* game, State** pp_state) { | |||
| 115 | // Usage: <scene file> | 120 | // Usage: <scene file> | 
| 116 | const char* scene_filepath = argc > 1 ? argv[1] : DEFAULT_SCENE_FILE; | 121 | const char* scene_filepath = argc > 1 ? argv[1] : DEFAULT_SCENE_FILE; | 
| 117 | 122 | ||
| 118 | SceneNode* node = load_scene(game, state, scene_filepath); | 123 | state->model = load_scene(game, state, scene_filepath); | 
| 119 | if (!node) { | 124 | if (!state->model) { | 
| 120 | goto cleanup; | 125 | goto cleanup; | 
| 121 | } | 126 | } | 
| 122 | 127 | ||
| 123 | if (gfx_get_node_type(node) == AnimaNode) { | 128 | Anima* anima = gfx_get_model_anima(state->model); | 
| 124 | Anima* anima = gfx_get_node_anima(node); | 129 | if (anima) { | 
| 125 | gfx_play_animation( | 130 | gfx_play_animation( | 
| 126 | anima, &(AnimationPlaySettings){.name = "Walk", .loop = true}); | 131 | anima, &(AnimationPlaySettings){.name = "Walk", .loop = true}); | 
| 127 | } | 132 | } | 
| @@ -156,7 +161,13 @@ void update(Game* game, State* state, double t, double dt) { | |||
| 156 | assert(state->scene); | 161 | assert(state->scene); | 
| 157 | assert(state->camera); | 162 | assert(state->camera); | 
| 158 | 163 | ||
| 159 | gfx_animate_scene(state->scene, (R)t); | 164 | // TODO: Move this to some sort of update_scene(). Note that models do not | 
| 165 | // need to be animated if they are not visible to the camera. The camera | ||
| 166 | // update also should happen first. | ||
| 167 | Anima* anima = gfx_get_model_anima(state->model); | ||
| 168 | if (anima) { | ||
| 169 | gfx_update_animation(anima, (R)t); | ||
| 170 | } | ||
| 160 | 171 | ||
| 161 | const vec3 orbit_point = vec3_make(0, 2, 0); | 172 | const vec3 orbit_point = vec3_make(0, 2, 0); | 
| 162 | Camera* camera = gfx_get_camera_camera(state->camera); | 173 | Camera* camera = gfx_get_camera_camera(state->camera); | 
| @@ -171,7 +182,14 @@ void update(Game* game, State* state, double t, double dt) { | |||
| 171 | static void render_bounding_boxes_rec(ImmRenderer* imm, const SceneNode* node) { | 182 | static void render_bounding_boxes_rec(ImmRenderer* imm, const SceneNode* node) { | 
| 172 | assert(imm); | 183 | assert(imm); | 
| 173 | assert(node); | 184 | assert(node); | 
| 174 | if (gfx_get_node_type(node) == ObjectNode) { | 185 | |
| 186 | const NodeType node_type = gfx_get_node_type(node); | ||
| 187 | |||
| 188 | if (node_type == ModelNode) { | ||
| 189 | const Model* model = gfx_get_node_model(node); | ||
| 190 | const SceneNode* root = gfx_get_model_root(model); | ||
| 191 | render_bounding_boxes_rec(imm, root); | ||
| 192 | } else if (node_type == ObjectNode) { | ||
| 175 | // TODO: Look at the scene log. The JointNodes are detached from the | 193 | // TODO: Look at the scene log. The JointNodes are detached from the | 
| 176 | // ObjectNodes. This is why the boxes are not being transformed as expected | 194 | // ObjectNodes. This is why the boxes are not being transformed as expected | 
| 177 | // here. Anima needs to animate boxes? Use OOBB in addition to AABB? | 195 | // here. Anima needs to animate boxes? Use OOBB in addition to AABB? | 
