From b656c9415a8e7e3b5b7d8bf1f3c8a5444f830c79 Mon Sep 17 00:00:00 2001 From: chai Date: Sat, 22 Feb 2020 23:33:06 +0800 Subject: *misc --- src/extend/camera.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'src/extend/camera.c') diff --git a/src/extend/camera.c b/src/extend/camera.c index e69de29..377a09e 100644 --- a/src/extend/camera.c +++ b/src/extend/camera.c @@ -0,0 +1,55 @@ +#include "camera.h" + +void camera_init(Camera* cam) { + cam->is_viewdirty = cam->is_projdirty = TRUE; + cam->transform.parent = NULL ; + cam->transform.localposition = vec3_make(0, 0, 800); + cam->transform.localscale = vec3_make(1, 1, 1); + cam->transform.localrotation = quat_make(0, 0, 0); + cam->near = 1; + cam->far = 1500; + cam->aspect = 600/500.f; + cam->fov = 90; + cam->zoom_speed = 20; +} + +void camera_getmatrix(Camera* cam, Mat4* view, Mat4* proj) { + camera_getviewmatrix(cam, view); + camera_getprojmatrix(cam, proj); +} + +void camera_getviewmatrix(Camera* cam, Mat4* out) { + if (!cam->is_viewdirty) { + if (out)*out = cam->view_matrix; + return; + } + transform_getinvmatrixnoscale(&cam->transform, &cam->view_matrix); + if(out) *out = cam->view_matrix; + cam->is_viewdirty = FALSE; +} + +void camera_getprojmatrix(Camera* cam, Mat4* out) { + if (!cam->is_projdirty) { + if (out)*out = cam->proj_matrix; + return; + } + mat4_setperspective(cam->fov, cam->aspect, cam->near, cam->far, &cam->proj_matrix); + if(out) *out = cam->proj_matrix; + cam->is_projdirty = FALSE; +} + +static void _onwheelscroll(Camera* cam, int wheel) { + Quat rot; transform_getrotation(&cam->transform, &rot); + Vec3 forward = {0,0,-1}; + quat_applytovec3(&rot, &forward, &forward); + vec3_scale(&forward, cam->zoom_speed * wheel, &forward); + vec3_plus(&forward, &cam->transform.localposition, &cam->transform.localposition); + cam->is_viewdirty = TRUE; +} + +void camera_onevent(Camera* cam, wog_Event* e) { + if(e == NULL) return ; + if (e->type == WOG_EMOUSEWHEEL) {//zoom in\zoom out + _onwheelscroll(cam, e->wheel); + } +} -- cgit v1.1-26-g67d0