From 538cb1cd010a3323ad61239a12a4134ef4dceca6 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 24 Feb 2020 10:28:41 +0800 Subject: *camera --- src/extend/camera.c | 87 +++++++++++++++++++++++++++++++++++++++++++++----- src/extend/camera.h | 17 ++++++++-- src/extend/transform.c | 4 +++ src/extend/transform.h | 2 ++ 4 files changed, 99 insertions(+), 11 deletions(-) (limited to 'src/extend') diff --git a/src/extend/camera.c b/src/extend/camera.c index 377a09e..f349006 100644 --- a/src/extend/camera.c +++ b/src/extend/camera.c @@ -1,16 +1,31 @@ #include "camera.h" -void camera_init(Camera* cam) { +// A unity editor style camera + +void camera_init(Camera* cam, wog_Window* wnd) { cam->is_viewdirty = cam->is_projdirty = TRUE; + + // camera local = world 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->far = 5500; cam->aspect = 600/500.f; - cam->fov = 90; - cam->zoom_speed = 20; + cam->fov = 60; + cam->zoom_speed = 4000; + + cam->look_around = FALSE; + cam->move_around = FALSE; + cam->rotate_sensitivity.x = 5; + cam->rotate_sensitivity.y = 5; + cam->move_sensitivity.x = 150; + cam->move_sensitivity.y = 100; + cam->euler.yaw = cam->euler.pitch = cam->euler.roll = 0; + + cam->wnd = wnd; } void camera_getmatrix(Camera* cam, Mat4* view, Mat4* proj) { @@ -38,18 +53,74 @@ void camera_getprojmatrix(Camera* cam, Mat4* out) { cam->is_projdirty = FALSE; } -static void _onwheelscroll(Camera* cam, int wheel) { +static void _onwheelscroll(Camera* cam, int wheel, float dt) { 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_scale(&forward, cam->zoom_speed * wheel * dt, &forward); vec3_plus(&forward, &cam->transform.localposition, &cam->transform.localposition); cam->is_viewdirty = TRUE; } -void camera_onevent(Camera* cam, wog_Event* e) { +static void _onlookaround(Camera* cam,float dt) { + if(!cam->look_around) return; + static Quat rot; + static Euler angle; + int x, y; + wog_getMouse(cam->wnd, &x, &y); + float dx = cam->mouse_prev.x - x, dy = y - cam->mouse_prev.y; + angle.x = dy * cam->rotate_sensitivity.y * dt; + angle.y = dx * cam->rotate_sensitivity.x * dt; + cam->euler.pitch += angle.x; + cam->euler.yaw += angle.y; + //printf("%f %f\n", cam->euler.pitch, cam->euler.yaw); + quat_fromeuler(&cam->euler, &cam->transform.localrotation); + cam->mouse_prev.x = x; cam->mouse_prev.y = y; + cam->is_viewdirty = TRUE; +} + +static void _onmovearound(Camera* cam, float dt) { + if(!cam->move_around) return ; + int x, y; + wog_getMouse(cam->wnd, &x, &y); + Vec3 dd = { cam->mouse_prev.x - x, y - cam->mouse_prev.y , 0}; + dd.x *= cam->move_sensitivity.x * dt; + dd.y *= cam->move_sensitivity.y * dt; + quat_applytovec3(&cam->transform.localrotation, &dd, &dd); + //printf("%f %f %f\n", dd.x, dd.y, dd.z); + vec3_plus(&cam->transform.localposition, &dd, &cam->transform.localposition); + cam->mouse_prev.x = x; cam->mouse_prev.y = y; + cam->is_viewdirty = TRUE; +} + +void camera_onevent(Camera* cam, wog_Event* e, float dt) { if(e == NULL) return ; if (e->type == WOG_EMOUSEWHEEL) {//zoom in\zoom out - _onwheelscroll(cam, e->wheel); + _onwheelscroll(cam, e->wheel, dt); + } + else if (e->type == WOG_EMOUSEBUTTONDOWN) { + if (!cam->look_around && e->button == WOG_MOUSE_RBUTTON) { + cam->look_around = TRUE; + cam->mouse_prev.x = e->pos.x; + cam->mouse_prev.y = e->pos.y; + } + if (!cam->move_around && e->button == WOG_MOUSE_MIDDLE) { + cam->move_around = TRUE; + cam->mouse_prev.x = e->pos.x; + cam->mouse_prev.y = e->pos.y; + } + } + else if (e->type == WOG_EMOUSEBUTTONUP) { + if (e->button == WOG_MOUSE_RBUTTON) + cam->look_around = FALSE; + if (e->button == WOG_MOUSE_MIDDLE) + cam->move_around = FALSE; } } + +void camera_onupdate(Camera* cam, float dt) { + if (cam->look_around) + _onlookaround(cam, dt); + if (cam->move_around) + _onmovearound(cam, dt); +} \ No newline at end of file diff --git a/src/extend/camera.h b/src/extend/camera.h index 8227dbf..e43efe6 100644 --- a/src/extend/camera.h +++ b/src/extend/camera.h @@ -4,6 +4,7 @@ #include "../math/math.h" #include "transform.h" #include "../extern/wog.h" +#include "../extern/wog.h" #undef near #undef far @@ -16,7 +17,16 @@ typedef struct { Mat4 proj_matrix; bool is_viewdirty, is_projdirty; /*operations*/ - float zoom_speed; + float zoom_speed; + Vec2 rotate_sensitivity; + Vec2 move_sensitivity; + Euler euler; + /*events*/ + bool look_around; + Vec2 mouse_prev; + bool move_around; + /*window*/ + wog_Window* wnd; } Camera; typedef struct CameraConfig { @@ -24,11 +34,12 @@ typedef struct CameraConfig { Vec3 pos; }CameraConfig; -void camera_init(Camera* cam); +void camera_init(Camera* cam, wog_Window* wnd); void camera_setposition(float x, float y, float z); -void camera_onevent(Camera* cam, wog_Event* e); +void camera_onevent(Camera* cam, wog_Event* e, float dt); +void camera_onupdate(Camera* cam, float dt); void camera_getmatrix(Mat4* view, Mat4* proj); diff --git a/src/extend/transform.c b/src/extend/transform.c index 7724614..6979e40 100644 --- a/src/extend/transform.c +++ b/src/extend/transform.c @@ -34,4 +34,8 @@ void transform_getrotation(Transform* trans, Quat* rot) { } } +void transform_localtoworlddir(Transform* trans, Vec3* dir, Vec3* out) { +//RrRs + +} diff --git a/src/extend/transform.h b/src/extend/transform.h index f647819..330c023 100644 --- a/src/extend/transform.h +++ b/src/extend/transform.h @@ -28,3 +28,5 @@ void transform_setdirty(Transform* trans); /*get world to local matrix(no scale)*/ void transform_getinvmatrixnoscale(Transform* transform, Mat4* worldToLocal); + +void transform_localtoworlddir(Transform* trans, Vec3* dir, Vec3* out); -- cgit v1.1-26-g67d0