diff options
Diffstat (limited to 'src/extend/camera.c')
-rw-r--r-- | src/extend/camera.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/extend/camera.c b/src/extend/camera.c index 6426193..6b4c0d1 100644 --- a/src/extend/camera.c +++ b/src/extend/camera.c @@ -15,6 +15,8 @@ typedef struct Camera { Vec2 rotate_sensitivity; Vec2 move_sensitivity; Euler euler; + bool speedup; + float speedupv; /*events*/ bool look_around; Vec2 mouse_prev; @@ -39,12 +41,14 @@ Camera* camera_create(wog_Window* wnd, CameraConfig* config) { cam->aspect = config->aspect; cam->fov = config->fov; cam->zoom_speed = config->zoom_speed; + cam->speedup = FALSE; + cam->speedupv = 10; cam->look_around = FALSE; cam->move_around = FALSE; cam->rotate_sensitivity = config->rotate_sensitivity; cam->move_sensitivity = config->move_sensitivity; - cam->euler = cam->euler; + cam->euler = config->euler; cam->wnd = wnd; return cam; @@ -84,7 +88,7 @@ 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 * dt, &forward); + vec3_scale(&forward, cam->zoom_speed * wheel * dt * (cam->speedup ? cam->speedupv : 1), &forward); vec3_plus(&forward, &cam->transform.localposition, &cam->transform.localposition); cam->is_viewdirty = TRUE; } @@ -96,8 +100,8 @@ static void _onlookaround(Camera* cam,float dt) { 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; + angle.x = dy * cam->rotate_sensitivity.y * dt * (cam->speedup ? cam->speedupv : 1); + angle.y = dx * cam->rotate_sensitivity.x * dt * (cam->speedup ? cam->speedupv : 1); cam->euler.pitch -= angle.x; cam->euler.yaw += angle.y; //printf("%f %f\n", cam->euler.pitch, cam->euler.yaw); @@ -111,8 +115,8 @@ static void _onmovearound(Camera* cam, float dt) { 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; + dd.x *= cam->move_sensitivity.x * dt * (cam->speedup ? cam->speedupv : 1); + dd.y *= cam->move_sensitivity.y * dt * (cam->speedup ? cam->speedupv : 1); 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); @@ -143,6 +147,14 @@ void camera_onevent(Camera* cam, wog_Event* e, float dt) { if (e->button == WOG_MOUSE_MIDDLE) cam->move_around = FALSE; } + else if (e->type == WOG_EKEYDOWN) { + if (!cam->speedup && e->key == VK_SHIFT) + cam->speedup = TRUE; + } + else if (e->type == WOG_EKEYUP) { + if (e->key == VK_SHIFT) + cam->speedup = FALSE; + } } void camera_onupdate(Camera* cam, float dt) { |