diff options
| -rw-r--r-- | src/camera.c | 33 | ||||
| -rw-r--r-- | src/camera.h | 10 | ||||
| -rw-r--r-- | src/input.c | 25 |
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); + } + } } } |
