diff --git a/src/Core.cpp b/src/Core.cpp index 490c552..3086f66 100644 --- a/src/Core.cpp +++ b/src/Core.cpp @@ -202,13 +202,29 @@ void Core::doProcess() { r_view->setView(v_width, v_height); } } + } else if (event.type == SDL_MULTIGESTURE) { + LOG(LOG_INFO) << "gesture: " << event.mgesture.x << "x" << event.mgesture.y << ", rot:" << event.mgesture.dTheta << ", pinch:" << event.mgesture.dDist << ", fingers:" << event.mgesture.numFingers; + RenderCamera *camera = scene->getCamera(1); + Vec3 camera_pos = camera->getPosition(); + camera_pos.y -= event.mgesture.dDist*256.0f; + camera->setPosition(camera_pos.x, camera_pos.y, camera_pos.z); + float yaw = camera->getYaw(); + camera->setYaw(yaw - (event.mgesture.dTheta*128.0f)); + camera->doRefresh(); } else if (event.type == SDL_FINGERMOTION) { - LOG(LOG_INFO) << "finger: " << event.tfinger.pressure << " " << event.tfinger.x << "x" << event.tfinger.y << " " << event.tfinger.dx << "x" << event.tfinger.dy; + LOG(LOG_INFO) << "finger: " << event.tfinger.fingerId << " " << event.tfinger.x << "x" << event.tfinger.y << " " << event.tfinger.dx << "x" << event.tfinger.dy; + RenderCamera *camera = scene->getCamera(1); Vec3 camera_pos = camera->getPosition(); float x = event.tfinger.dx * v_width/16; float y = event.tfinger.dy * v_height/16; - camera->setPosition(camera_pos.x-x, camera_pos.y, camera_pos.z+y); + + // This is weird. + float yaw = camera->getYaw() * M_PI / 180.0f; + float ax = (-x * cosf(yaw)) + (y * sinf(yaw)); + float ay = (y * cosf(yaw)) - (-x * sinf(yaw)); + + camera->setPosition(camera_pos.x+ax, camera_pos.y, camera_pos.z+ay); camera->doRefresh(); } else if (event.type == SDL_MOUSEMOTION) { if (event.motion.which == SDL_TOUCH_MOUSEID) continue; diff --git a/src/RenderCamera.cpp b/src/RenderCamera.cpp index c7744a4..48c5c07 100644 --- a/src/RenderCamera.cpp +++ b/src/RenderCamera.cpp @@ -104,6 +104,15 @@ RenderView* RenderCamera::getRenderView() { Vec3 RenderCamera::getPosition() { return position; } +float RenderCamera::getYaw() { + return yaw; +} +float RenderCamera::getPitch() { + return pitch; +} float RenderCamera::getSize() { return size; } +Mat4 RenderCamera::getModelview() { + return mv_matrix; +} diff --git a/src/RenderCamera.hpp b/src/RenderCamera.hpp index e5518ae..d812f6c 100644 --- a/src/RenderCamera.hpp +++ b/src/RenderCamera.hpp @@ -29,9 +29,12 @@ class RenderCamera { void setMode(int mode); Vec3 getPosition(); void setPosition(float x, float y, float z); + float getPitch(); void setPitch(float pitch); + float getYaw(); void setYaw(float yaw); float getSize(); + Mat4 getModelview(); private: int render_mode; // 0 = perspective, 1 = orthogonal Vec3 position; // The camera's coordinates in 3D space