Created a camera system that has changing mvp and setting the uniform

Now to correct whatever is wrong with it.
This commit is contained in:
Warwick 2025-08-18 12:52:44 +01:00
parent 5944fcda92
commit 199eeb4ee1
5 changed files with 128 additions and 2 deletions

View file

@ -88,6 +88,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE
)
target_link_libraries(${PROJECT_NAME} PRIVATE
m
${SDL3_LIBRARIES}
${SDL3_image_LIBRARIES}
${CGLM_LIBRARIES}

View file

@ -1,8 +1,10 @@
#version 330 core
layout (location = 0) in vec3 aPos;
uniform mat4 MVP;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0) * MVP;
}

87
src/camera.c Normal file
View file

@ -0,0 +1,87 @@
#include "camera.h"
#include "SDL3/SDL_keyboard.h"
#include "cglm/mat4.h"
#include "cglm/cam.h"
#include "cglm/vec3.h"
#include <SDL3/SDL_mouse.h>
#include <cglm/util.h>
#include <math.h>
static float mouse_x, mouse_y;
Camera Camera_default = {
.position = {0.0f, 0.0f, 3.0f},
.forward = {0.0f, 0.0f, -1.0f},
.yaw = -1.5707963268f, // -90 deg in radians
.pitch = 0
};
void camera_tick(Camera *camera) {
// Mouse input
SDL_GetRelativeMouseState(&mouse_x, &mouse_y);
camera->yaw += mouse_x * glm_rad(MOUSE_SENSITIVITY);
camera->pitch += mouse_y * glm_rad(MOUSE_SENSITIVITY);
// Restrict pitch
if (camera->pitch > 89.0f)
camera->pitch = 89.0f;
if (camera->pitch < -89.0f)
camera->pitch = -89.0f;
// Camera Direction
camera->forward[0] = cos(camera->yaw) * cos(camera->pitch);
camera->forward[1] = sin(camera->pitch);
camera->forward[2] = sin(camera->yaw) * cos(camera->pitch);
glm_normalize(camera->forward);
vec3 camera_right = GLM_VEC3_ZERO_INIT;
vec3 up = GLM_VEC3_ZERO_INIT;
up[2] = 1.0f;
glm_cross(up, camera->forward, camera_right);
glm_normalize(camera_right);
// Move camera based on wasd;
const bool *keyboardState = SDL_GetKeyboardState(NULL);
if (keyboardState[SDL_SCANCODE_W]) {
vec3 calc_buff;
glm_vec3_scale(camera->forward, MOVEMENT_SPEED, calc_buff);
glm_vec3_add(camera->position, calc_buff, camera->position);
}
if (keyboardState[SDL_SCANCODE_S]) {
vec3 calc_buff;
glm_vec3_scale(camera->forward, MOVEMENT_SPEED, calc_buff);
glm_vec3_sub(camera->position, calc_buff, camera->position);
}
if (keyboardState[SDL_SCANCODE_A]) {
vec3 calc_buff;
glm_vec3_scale(camera_right, MOVEMENT_SPEED, calc_buff);
glm_vec3_add(camera->position, calc_buff, camera->position);
}
if (keyboardState[SDL_SCANCODE_D]) {
vec3 calc_buff;
glm_vec3_scale(camera_right, MOVEMENT_SPEED, calc_buff);
glm_vec3_sub(camera->position, calc_buff, camera->position);
}
}
void calc_camera_mvp(mat4 *mvp_result, Camera *camera) {
// Get position to look and up vector
vec3 camera_target;
glm_vec3_add(camera->position , camera->forward, camera_target);
vec3 up = GLM_VEC3_ZERO_INIT;
up[2] = 1.0f;
mat4 model;
glm_mat4_identity(model);
mat4 view;
glm_lookat(camera->position, camera_target, up, view);
mat4 projection;
float fov = glm_rad(45.0f); // fov y
float aspect = 800.0f / 600.0f;
float near = 0.1f;
float far = 100.0f;
glm_perspective(fov, aspect, near, far, projection);
glm_mat4_mul(model, view, *mvp_result);
glm_mat4_mul(*mvp_result, projection, *mvp_result);
}

21
src/camera.h Normal file
View file

@ -0,0 +1,21 @@
#pragma once
#include <cglm/types.h>
#define MOVEMENT_SPEED 0.02f
#define MOUSE_SENSITIVITY 0.05f
struct Camera_s {
vec3 position;
vec3 forward;
float yaw;
float pitch;
};
typedef struct Camera_s Camera;
extern Camera Camera_default;
void calc_camera_mvp (mat4 *mvp_result, Camera *camera);
void get_camera_position (vec3 *position_result, Camera *camera);
void camera_tick(Camera *camera);

View file

@ -3,9 +3,11 @@
#include <SDL3/SDL_render.h>
#include <SDL3/SDL_video.h>
#include <GL/glew.h>
#include <stdio.h>
#include <stdlib.h>
#include "arena_allocator.h"
#include "camera.h"
#include "cglm/io.h"
// settings
const unsigned int SCR_WIDTH = 800;
@ -142,6 +144,9 @@ int main(int argc, char *argv[]) {
// VBOs) when it's not directly necessary.
glBindVertexArray(0);
// Initialise camera
Camera camera = Camera_default;
while (1) {
// handle input
SDL_PollEvent(&event);
@ -149,6 +154,16 @@ int main(int argc, char *argv[]) {
break;
}
// Handle camera
camera_tick(&camera);
// TODO: make shader file
mat4 mvp;
calc_camera_mvp(&mvp, &camera);
glm_mat4_print(mvp,stdout);
int mvp_uniform_location = glGetUniformLocation(shaderProgram, "MVP");
glUniformMatrix4fv(mvp_uniform_location, 1, GL_FALSE, &mvp[0][0]);
// render
glClearColor(0.1f, 0.3f, 0.4f, 1.f);
glClear(GL_COLOR_BUFFER_BIT);