Files
gpu-renderer/main.c
T

123 lines
2.3 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
typedef enum {
AXIS_X,
AXIS_Y,
AXIS_Z,
} axis_t;
static axis_t rot_axis = AXIS_Y;
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;
case GLFW_KEY_X:
rot_axis = AXIS_X;
break;
case GLFW_KEY_Y:
rot_axis = AXIS_Y;
break;
case GLFW_KEY_Z:
rot_axis = AXIS_Z;
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);
animation_update(anim, &model);
const vec3_t cam = { 0, 4, -4 };
const vec3_t tgt = { 0, 0.5, 0 };
mvp_t mvp = {
.model = (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 / 12, 0.1, 10.0),
};
const mat4_t rotx = MAT4_ROTATE_X(PI / 128);
const mat4_t roty = MAT4_ROTATE_Y(PI / 128);
const mat4_t rotz = MAT4_ROTATE_Z(PI / 128);
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
switch (rot_axis) {
case AXIS_X:
mvp.model = mat4_mul(rotx, mvp.model);
break;
case AXIS_Y:
mvp.model = mat4_mul(roty, mvp.model);
break;
case AXIS_Z:
mvp.model = mat4_mul(rotz, mvp.model);
break;
}
gpu_render(&gpu, &mvp, anim.bone_matrices);
}
// Clean up
animation_cleanup(&anim);
gpu_cleanup(&gpu);
model_cleanup(&model);
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}