From a1e93038af0a739b9af57bd40ffbee6963dc3242 Mon Sep 17 00:00:00 2001 From: Tomasz Kramkowski Date: Thu, 3 May 2018 13:49:44 +0100 Subject: Add a simple camera struct and camera controls --- camera.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 camera.c (limited to 'camera.c') diff --git a/camera.c b/camera.c new file mode 100644 index 0000000..6335d0e --- /dev/null +++ b/camera.c @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2018 Tomasz Kramkowski + * SPDX-License-Identifier: MIT + */ +#include +#include +#include + +#include "camera.h" +#include "math.h" + +#define PITCH_LIMIT (PI * 0.99) + +void camera_clamp(struct camera *cam) +{ + assert(cam != NULL); + + cam->yaw = fmod(cam->yaw, 2 * PI); + if (cam->pitch > PITCH_LIMIT / 2) + cam->pitch = PITCH_LIMIT / 2; + else if (cam->pitch < -PITCH_LIMIT / 2) + cam->pitch = -PITCH_LIMIT / 2; +} +void camera_dir(vec3 out, struct camera *cam) +{ + assert(out != NULL); + assert(cam != NULL); + + out[0] = cosf(cam->pitch) * cosf(cam->yaw); + out[1] = sinf(cam->pitch); + out[2] = cosf(cam->pitch) * sinf(cam->yaw); +} +void camera_lookat(mat4x4 out, struct camera *cam) +{ + vec3 at, dir; + + assert(out != NULL); + assert(cam != NULL); + + camera_dir(dir, cam); + vec3_add(at, cam->pos, dir); + mat4x4_look_at(out, cam->pos, at, (vec3){ 0, 1, 0 }); +} -- cgit v1.2.3-54-g00ecf