summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/camera.c33
-rw-r--r--src/camera.h10
-rw-r--r--src/input.c25
3 files changed, 57 insertions, 11 deletions
diff --git a/src/camera.c b/src/camera.c
index e409b06..18cfb33 100644
--- a/src/camera.c
+++ b/src/camera.c
@@ -2,6 +2,7 @@
#include "cglm/cam.h"
#include "cglm/io.h"
#include "cglm/mat4.h"
+#include "cglm/util.h"
#include "cglm/vec3.h"
#include <stdio.h>
#include <stdlib.h>
@@ -39,6 +40,34 @@ void camera_update(struct camera* camera, struct shader* shader) {
// glm_mat4_print(camera->perspective, stderr);
}
-void camera_move(struct camera *camera, float *move) {
- glm_vec3_add(camera->position, move, camera->position);
+void camera_move(struct camera *camera, enum DIRECTION move) {
+ vec3 unit_direction = { 0 };
+ glm_normalize_to(camera->direction, unit_direction);
+ if (move == FORWARD) {
+ // Do nothing, we move in unit_direction direction
+ } else if (move == BACKWARD) {
+ // Go in the reverse direction
+ vec3 neg = { -1.0f, -1.0f, -1.0f };
+ glm_vec3_mul(neg, unit_direction, unit_direction);
+ } else if (move == LEFT) {
+ // Right hand rule - this will be on the left (negative)
+ glm_vec3_crossn(camera->up, unit_direction, unit_direction);
+ } else if (move == RIGHT) {
+ // Right hand rule - this will be on the righ (positive)
+ glm_vec3_crossn(unit_direction, camera->up, unit_direction);
+ }
+ float scale = 0.3f;
+ glm_vec3_scale(unit_direction, scale, unit_direction);
+ glm_vec3_add(camera->position, unit_direction, camera->position);
+}
+
+void camera_rotate(struct camera* camera, vec2 offset) {
+ vec3 axis = { 0 };
+ float rot_angle = glm_rad(1);
+ glm_vec3_crossn(camera->direction, camera->up, axis);
+ // Up and down rotation (pitch)
+ glm_vec3_rotate(camera->direction, -rot_angle * offset[1], axis);
+ // Left and right rotation (yaw)
+ glm_vec3_rotate(camera->direction, -rot_angle * offset[0], camera->up);
+
}
diff --git a/src/camera.h b/src/camera.h
index 199f0b4..c00450c 100644
--- a/src/camera.h
+++ b/src/camera.h
@@ -2,6 +2,13 @@
#include "cglm/types.h"
#include "shader.h"
+
+enum DIRECTION {
+ FORWARD,
+ BACKWARD,
+ LEFT,
+ RIGHT
+};
struct camera {
vec3 position;
vec3 direction;
@@ -14,4 +21,5 @@ struct camera {
void camera_init(struct camera** camera);
void camera_update(struct camera* camera, struct shader* shader);
void camera_set_position(struct camera* camera, vec3 pos);
-void camera_move(struct camera* camera, vec3 move);
+void camera_move(struct camera* camera, enum DIRECTION move);
+void camera_rotate(struct camera* camera, vec2 offset);
diff --git a/src/input.c b/src/input.c
index 54ae199..be240be 100644
--- a/src/input.c
+++ b/src/input.c
@@ -3,6 +3,8 @@
#include "cglm/types.h"
#include "pthread.h"
#include <SDL2/SDL_events.h>
+#include <SDL2/SDL_mouse.h>
+#include <SDL2/SDL_stdinc.h>
pthread_t input_init(struct engine* engine) {
pthread_t thread;
@@ -14,6 +16,7 @@ void input_join(pthread_t thread, struct engine* engine) {
}
void input_handle(struct engine *engine) {
SDL_Event event;
+ SDL_SetRelativeMouseMode(SDL_TRUE);
while (engine->game_loop) {
// Quit game
// TODO: Locks?
@@ -23,27 +26,33 @@ void input_handle(struct engine *engine) {
}
if (event.type == SDL_KEYDOWN) {
SDL_KeyboardEvent key = event.key;
- vec3 ahead = { 0.0f, 0.0f, -1.0f };
- vec3 behind = { 0.0f, 0.0f, 1.0f };
- vec3 left = { -1.0f, 0.0f, 0.0f };
- vec3 right = { 1.0f, 0.0f, 0.0f };
switch (key.keysym.sym) {
case SDLK_w:
- camera_move(engine->camera, ahead);
+ camera_move(engine->camera, FORWARD);
break;
case SDLK_a:
- camera_move(engine->camera, left);
+ camera_move(engine->camera, LEFT);
break;
case SDLK_s:
- camera_move(engine->camera, behind);
+ camera_move(engine->camera, BACKWARD);
break;
case SDLK_d:
- camera_move(engine->camera, right);
+ camera_move(engine->camera, RIGHT);
break;
case SDLK_ESCAPE:
engine->game_loop = 0;
break;
}
}
+ if (event.type == SDL_MOUSEMOTION) {
+ int x;
+ int y;
+ SDL_GetRelativeMouseState(&x, &y);
+ if (x != 0 || y != 0) {
+ fprintf(stderr, "X: %d, Y %d\n", x, y);
+ vec2 offset = { x, y };
+ camera_rotate(engine->camera, offset);
+ }
+ }
}
}