summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authoromnisci3nce <omniscient.oce@gmail.com>2024-04-27 13:08:03 +1000
committeromnisci3nce <omniscient.oce@gmail.com>2024-04-27 13:08:03 +1000
commit4cbc38b92edaa331fd0f6a077bbe7d7aebdb9ecf (patch)
tree753d23b07b09e3494e4cce594bd4b0f4710566f8 /examples
parentd6837defc03e431517f6616ec8e49a8eb3643011 (diff)
parentc7c33cd18e057bc826a0d31e1860b0ac396a00b6 (diff)
Merge remote-tracking branch 'origin/cel-67-load-animation-data-from-gltf' into ral
Diffstat (limited to 'examples')
-rw-r--r--examples/example_scene.h31
-rw-r--r--examples/gltf_loading/ex_gltf_loading.c4
-rw-r--r--examples/input/ex_input.c6
-rw-r--r--examples/main_loop/ex_main_loop.c2
-rw-r--r--examples/obj_loading/ex_obj_loading.c4
-rw-r--r--examples/property_animation/ex_property_animation.c103
-rw-r--r--examples/skinned_animation/ex_skinned_animation.c122
7 files changed, 268 insertions, 4 deletions
diff --git a/examples/example_scene.h b/examples/example_scene.h
new file mode 100644
index 0000000..eb0be18
--- /dev/null
+++ b/examples/example_scene.h
@@ -0,0 +1,31 @@
+#pragma once
+#include "render_types.h"
+
+const vec3 pointlight_positions[4] = {
+ { 0.7, 0.2, 2.0 },
+ { 2.3, -3.3, -4.0 },
+ { -4.0, 2.0, -12.0 },
+ { 0.0, 0.0, -3.0 },
+};
+static point_light point_lights[4];
+
+static scene make_default_scene() {
+ directional_light dir_light = { .direction = (vec3){ -0.2, -1.0, -0.3 },
+ .ambient = (vec3){ 0.2, 0.2, 0.2 },
+ .diffuse = (vec3){ 0.5, 0.5, 0.5 },
+ .specular = (vec3){ 1.0, 1.0, 1.0 } };
+
+ for (int i = 0; i < 4; i++) {
+ point_lights[i].position = pointlight_positions[i];
+ point_lights[i].ambient = (vec3){ 0.05, 0.05, 0.05 };
+ point_lights[i].diffuse = (vec3){ 0.8, 0.8, 0.8 };
+ point_lights[i].specular = (vec3){ 1.0, 1.0, 1.0 };
+ point_lights[i].constant = 1.0;
+ point_lights[i].linear = 0.09;
+ point_lights[i].quadratic = 0.032;
+ }
+
+ scene our_scene = { .dir_light = dir_light, .n_point_lights = 4 };
+ memcpy(&our_scene.point_lights, &point_lights, sizeof(point_light[4]));
+ return our_scene;
+} \ No newline at end of file
diff --git a/examples/gltf_loading/ex_gltf_loading.c b/examples/gltf_loading/ex_gltf_loading.c
index 0c47fec..fa74ada 100644
--- a/examples/gltf_loading/ex_gltf_loading.c
+++ b/examples/gltf_loading/ex_gltf_loading.c
@@ -1,8 +1,10 @@
#include <glfw3.h>
+#include "animation.h"
#include "camera.h"
#include "core.h"
#include "loaders.h"
+#include "log.h"
#include "maths.h"
#include "maths_types.h"
#include "render.h"
@@ -52,7 +54,7 @@ int main() {
scene our_scene = { .dir_light = dir_light, .n_point_lights = 4 };
memcpy(&our_scene.point_lights, &point_lights, sizeof(point_light[4]));
- while (!glfwWindowShouldClose(core->renderer.window)) {
+ while (!should_exit(core)) {
currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
diff --git a/examples/input/ex_input.c b/examples/input/ex_input.c
index 3101968..576b364 100644
--- a/examples/input/ex_input.c
+++ b/examples/input/ex_input.c
@@ -30,6 +30,10 @@ int main() {
.first_mouse_update = true,
};
+ // load a texture
+ texture tex = texture_data_load("assets/models/obj/cube/container.jpg", false);
+ texture_data_upload(&tex);
+
printf("Starting look direction: ");
print_vec3(game.camera.front);
@@ -65,7 +69,7 @@ int main() {
mat4 model = mat4_translation(VEC3_ZERO);
- gfx_backend_draw_frame(&core->renderer, &game.camera, model);
+ gfx_backend_draw_frame(&core->renderer, &game.camera, model, &tex);
render_frame_end(&core->renderer);
}
diff --git a/examples/main_loop/ex_main_loop.c b/examples/main_loop/ex_main_loop.c
index 31514bf..8819f7c 100644
--- a/examples/main_loop/ex_main_loop.c
+++ b/examples/main_loop/ex_main_loop.c
@@ -22,7 +22,7 @@ int main() {
x += 0.01;
mat4 model = mat4_translation(vec3(x, 0, 0));
- gfx_backend_draw_frame(&core->renderer, &camera, model);
+ gfx_backend_draw_frame(&core->renderer, &camera, model, NULL);
// insert work here
diff --git a/examples/obj_loading/ex_obj_loading.c b/examples/obj_loading/ex_obj_loading.c
index e225cb2..906816b 100644
--- a/examples/obj_loading/ex_obj_loading.c
+++ b/examples/obj_loading/ex_obj_loading.c
@@ -1,3 +1,4 @@
+#include <assert.h>
#include <glfw3.h>
#include <string.h>
@@ -25,6 +26,7 @@ int main() {
model_handle backpack_handle =
model_load_obj(core, "assets/models/obj/backpack/backpack.obj", true);
model* backpack = &core->models->data[backpack_handle.raw];
+ assert(backpack->meshes->data->is_skinned == false);
// 2. upload vertex data to gpu
model_upload_meshes(&core->renderer, backpack);
// 3. create a camera
@@ -53,7 +55,7 @@ int main() {
memcpy(&our_scene.point_lights, &point_lights, sizeof(point_light[4]));
// --- Enter Main loop
- while (!glfwWindowShouldClose(core->renderer.window)) {
+ while (!should_exit(core)) {
input_update(&core->input);
threadpool_process_results(&core->threadpool, 1);
diff --git a/examples/property_animation/ex_property_animation.c b/examples/property_animation/ex_property_animation.c
new file mode 100644
index 0000000..c548db4
--- /dev/null
+++ b/examples/property_animation/ex_property_animation.c
@@ -0,0 +1,103 @@
+#include <glfw3.h>
+
+#include "../example_scene.h"
+#include "animation.h"
+#include "camera.h"
+#include "core.h"
+#include "input.h"
+#include "keys.h"
+#include "log.h"
+#include "maths.h"
+#include "maths_types.h"
+#include "primitives.h"
+#include "render.h"
+#include "render_backend.h"
+#include "render_types.h"
+
+typedef struct game_state {
+ camera camera;
+ vec3 camera_euler;
+ bool first_mouse_update; // so the camera doesnt lurch when you run the first
+ // process_camera_rotation
+} game_state;
+
+void update_camera_rotation(input_state* input, game_state* game, camera* cam);
+
+int main() {
+ double currentFrame = glfwGetTime();
+ double lastFrame = currentFrame;
+ double deltaTime;
+
+ core* core = core_bringup();
+
+ model_handle animated_cube_handle =
+ model_load_gltf(core, "assets/models/gltf/AnimatedCube/glTF/AnimatedCube.gltf", false);
+ model* cube = &core->models->data[animated_cube_handle.raw];
+ model_upload_meshes(&core->renderer, cube);
+
+ scene our_scene = make_default_scene();
+
+ vec3 cam_pos = vec3_create(5, 5, 5);
+ game_state game = {
+ .camera = camera_create(cam_pos, vec3_negate(cam_pos), VEC3_Y, deg_to_rad(45.0)),
+ .camera_euler = vec3_create(90, 0, 0),
+ .first_mouse_update = true,
+ };
+
+ print_vec3(game.camera.front);
+
+ // Main loop
+ const f32 camera_lateral_speed = 0.2;
+ const f32 camera_zoom_speed = 0.15;
+
+ // animation
+ animation_clip track = cube->animations->data[0];
+ f64 total_time = 0.0;
+
+ while (!should_exit(core)) {
+ input_update(&core->input);
+
+ currentFrame = glfwGetTime();
+ deltaTime = currentFrame - lastFrame;
+ lastFrame = currentFrame;
+ total_time += deltaTime;
+ printf("delta time %f\n", deltaTime);
+ f64 t = fmod(total_time, 1.0);
+ INFO("Total time: %f", t);
+
+ vec3 translation = VEC3_ZERO;
+ if (key_is_pressed(KEYCODE_W) || key_is_pressed(KEYCODE_KEY_UP)) {
+ translation = vec3_mult(game.camera.front, camera_zoom_speed);
+ } else if (key_is_pressed(KEYCODE_S) || key_is_pressed(KEYCODE_KEY_DOWN)) {
+ translation = vec3_mult(game.camera.front, -camera_zoom_speed);
+ } else if (key_is_pressed(KEYCODE_A) || key_is_pressed(KEYCODE_KEY_LEFT)) {
+ vec3 lateral = vec3_normalise(vec3_cross(game.camera.front, game.camera.up));
+ translation = vec3_mult(lateral, -camera_lateral_speed);
+ } else if (key_is_pressed(KEYCODE_D) || key_is_pressed(KEYCODE_KEY_RIGHT)) {
+ vec3 lateral = vec3_normalise(vec3_cross(game.camera.front, game.camera.up));
+ translation = vec3_mult(lateral, camera_lateral_speed);
+ }
+ game.camera.position = vec3_add(game.camera.position, translation);
+
+ // UNUSED: threadpool_process_results(&core->threadpool, 1);
+
+ render_frame_begin(&core->renderer);
+
+ quat rot = animation_sample(track.rotation, t).rotation;
+ // quat rot = quat_ident();
+ transform tf = transform_create(VEC3_ZERO, rot, 1.0);
+ mat4 model_tf = transform_to_mat(&tf);
+ draw_model(&core->renderer, &game.camera, cube, &model_tf, &our_scene);
+
+ // gfx_backend_draw_frame(&core->renderer, &game.camera, model, NULL);
+
+ render_frame_end(&core->renderer);
+ }
+
+ INFO("Shutting down");
+ model_destroy(cube);
+
+ core_shutdown(core);
+
+ return 0;
+}
diff --git a/examples/skinned_animation/ex_skinned_animation.c b/examples/skinned_animation/ex_skinned_animation.c
new file mode 100644
index 0000000..c31e93c
--- /dev/null
+++ b/examples/skinned_animation/ex_skinned_animation.c
@@ -0,0 +1,122 @@
+#include <assert.h>
+#include <glfw3.h>
+
+#include "../example_scene.h"
+#include "animation.h"
+#include "camera.h"
+#include "core.h"
+#include "input.h"
+#include "keys.h"
+#include "log.h"
+#include "maths.h"
+#include "maths_types.h"
+#include "primitives.h"
+#include "render.h"
+#include "render_backend.h"
+#include "render_types.h"
+
+typedef struct game_state {
+ camera camera;
+ vec3 camera_euler;
+ bool first_mouse_update; // so the camera doesnt lurch when you run the first
+ // process_camera_rotation
+} game_state;
+
+void update_camera_rotation(input_state* input, game_state* game, camera* cam);
+
+int main() {
+ double currentFrame = glfwGetTime();
+ double lastFrame = currentFrame;
+ double deltaTime;
+
+ core* core = core_bringup();
+
+ model_handle handle =
+ model_load_gltf(core, "assets/models/gltf/SimpleSkin/glTF/SimpleSkin.gltf", false);
+
+ model* simple_skin = &core->models->data[handle.raw];
+
+ // Okay, right here we've loaded the model. let's assert some facts
+ assert(simple_skin->animations->len == 1);
+ assert(simple_skin->animations->data[0].rotation != NULL);
+ assert(simple_skin->animations->data[0].translation == NULL);
+ assert(simple_skin->animations->data[0].scale == NULL);
+
+ mesh* m = &simple_skin->meshes->data[0];
+ assert(m->is_skinned);
+ assert(m->bones->len == 2); // 1 root and 1 extra joint
+
+ // assert(false);
+
+ model_upload_meshes(&core->renderer, simple_skin);
+
+ scene our_scene = make_default_scene();
+
+ vec3 cam_pos = vec3_create(0, 5, -8);
+ game_state game = {
+ .camera = camera_create(cam_pos, vec3_negate(cam_pos), VEC3_Y, deg_to_rad(45.0)),
+ .camera_euler = vec3_create(90, 0, 0),
+ .first_mouse_update = true,
+ };
+
+ print_vec3(game.camera.front);
+
+ // Main loop
+ const f32 camera_lateral_speed = 0.2;
+ const f32 camera_zoom_speed = 0.10;
+
+ // animation
+ animation_clip track = simple_skin->animations->data[0];
+ f64 total_time = 0.0;
+
+ while (!should_exit(core)) {
+ input_update(&core->input);
+
+ currentFrame = glfwGetTime();
+ deltaTime = currentFrame - lastFrame;
+ lastFrame = currentFrame;
+ total_time += deltaTime;
+ // printf("delta time %f\n", deltaTime);
+ f64 t = fmod(total_time, track.rotation->max);
+ // INFO("Total time: %f", t);
+
+ vec3 translation = VEC3_ZERO;
+ if (key_is_pressed(KEYCODE_W)) {
+ translation = vec3_mult(game.camera.front, camera_zoom_speed);
+ } else if (key_is_pressed(KEYCODE_KEY_UP)) {
+ translation = vec3_mult(game.camera.up, camera_lateral_speed);
+ } else if (key_is_pressed(KEYCODE_KEY_DOWN)) {
+ translation = vec3_mult(game.camera.up, -camera_lateral_speed);
+ } else if (key_is_pressed(KEYCODE_S) || key_is_pressed(KEYCODE_KEY_DOWN)) {
+ translation = vec3_mult(game.camera.front, -camera_zoom_speed);
+ } else if (key_is_pressed(KEYCODE_A) || key_is_pressed(KEYCODE_KEY_LEFT)) {
+ vec3 lateral = vec3_normalise(vec3_cross(game.camera.front, game.camera.up));
+ translation = vec3_mult(lateral, -camera_lateral_speed);
+ } else if (key_is_pressed(KEYCODE_D) || key_is_pressed(KEYCODE_KEY_RIGHT)) {
+ vec3 lateral = vec3_normalise(vec3_cross(game.camera.front, game.camera.up));
+ translation = vec3_mult(lateral, camera_lateral_speed);
+ }
+ game.camera.position = vec3_add(game.camera.position, translation);
+
+ render_frame_begin(&core->renderer);
+
+ // bone rotation
+ quat rot = animation_sample(track.rotation, t).rotation;
+
+ m->bones->data[1].transform_components.rotation = rot;
+
+ // quat rot = quat_ident();
+ transform tf = transform_create(VEC3_ZERO, quat_ident(), 1.0);
+
+ draw_skinned_model(&core->renderer, &game.camera, simple_skin, tf, &our_scene);
+
+ render_frame_end(&core->renderer);
+ }
+
+ INFO("Shutting down");
+ model_destroy(simple_skin);
+
+ core_shutdown(core);
+
+ return 0;
+}