summaryrefslogtreecommitdiff
path: root/src/extend/camera.c
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-02-26 22:52:19 +0800
committerchai <chaifix@163.com>2020-02-26 22:52:19 +0800
commit372d77e436d21312ef1a0df622964751716963a3 (patch)
tree1a71865fea6fb9f2f532422c4b83959fff17ea76 /src/extend/camera.c
parent27687536844ed3b045bba1abd1aae8bb3692f6cb (diff)
*misc
Diffstat (limited to 'src/extend/camera.c')
-rw-r--r--src/extend/camera.c24
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) {