95 lines
1.9 KiB
C
95 lines
1.9 KiB
C
#include "animation.h"
|
|
#include "gpu.h"
|
|
#include "model_format_glb.h"
|
|
|
|
#include <assert.h>
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#define W 800
|
|
#define H 600
|
|
|
|
static void
|
|
key_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
|
|
{
|
|
(void)window;
|
|
(void)scancode;
|
|
(void)mods;
|
|
|
|
if (action != GLFW_PRESS)
|
|
return;
|
|
|
|
switch (key) {
|
|
case GLFW_KEY_Q:
|
|
glfwSetWindowShouldClose(window, GL_TRUE);
|
|
break;
|
|
}
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
// Read model from passed path
|
|
if (argc != 2) {
|
|
fprintf(stderr, "Usage: %s PATH/TO/MODEL\n", argv[0]);
|
|
return 1;
|
|
}
|
|
model_t model = model_format_glb_read(argv[1]);
|
|
|
|
// Set up window
|
|
glfwInit();
|
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
|
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
|
|
GLFWwindow *window = glfwCreateWindow(W, H, "Foo", nullptr, nullptr);
|
|
assert(window);
|
|
|
|
// Register input callbacks
|
|
glfwSetKeyCallback(window, key_callback);
|
|
|
|
// Initialise GPU
|
|
const gpu_config_t gpu_config = {
|
|
.application_name = "Foo",
|
|
.window = window,
|
|
};
|
|
gpu_ctx_t gpu;
|
|
gpu_init(&gpu, &gpu_config, model);
|
|
|
|
// Initialise animation
|
|
animation_state_t anim = animation_init(&model);
|
|
|
|
const vec3_t cam = { 0, 4, -4 };
|
|
const vec3_t tgt = { 0, 0.5, 0 };
|
|
mvp_t mvp = {
|
|
.model = mat4_mul(
|
|
MAT4_TRANSLATE(1, 0, 0),
|
|
(mat4_t) {
|
|
{ 0, 0, -1, 0 },
|
|
{ -1, 0, 0, 0 },
|
|
{ 0, 1, 0, 0 },
|
|
{ 0, 0, 0, 1 },
|
|
}),
|
|
.view = mat4_lookat(cam, tgt, (vec3_t) { 0, 1, 0 }),
|
|
.proj = mat4_perspective((float)W / H, PI / 8, 0.1, 10.0),
|
|
};
|
|
|
|
const mat4_t rot = MAT4_ROTATE_Y(PI / 128);
|
|
animation_start(&anim, &model);
|
|
|
|
while (!glfwWindowShouldClose(window)) {
|
|
glfwPollEvents();
|
|
|
|
mvp.model = mat4_mul(rot, mvp.model);
|
|
animation_update(&anim, &model);
|
|
gpu_render(&gpu, &mvp, anim.bone_matrices);
|
|
}
|
|
|
|
// Clean up
|
|
animation_cleanup(&anim);
|
|
gpu_cleanup(&gpu);
|
|
model_cleanup(&model);
|
|
glfwDestroyWindow(window);
|
|
glfwTerminate();
|
|
|
|
return 0;
|
|
}
|