diff --git a/src/Core.cpp b/src/Core.cpp index 3086f66..b78d8bf 100644 --- a/src/Core.cpp +++ b/src/Core.cpp @@ -230,17 +230,33 @@ void Core::doProcess() { if (event.motion.which == SDL_TOUCH_MOUSEID) continue; LOG(LOG_INFO) << "mouse motion: " << event.motion.xrel << "x" << event.motion.yrel << " "; RenderCamera *camera = scene->getCamera(1); - Vec3 camera_pos = camera->getPosition(); - float x = ((float)event.motion.x-(v_width/2)) / camera->getSize(); - float y = ((float)event.motion.y-(v_height/2)) / camera->getSize(); - camera->setPosition(-x, camera_pos.y, y); + if (event.motion.state & SDL_BUTTON_MMASK) { + camera->setYaw(camera->getYaw() - event.motion.xrel); + } else if (event.motion.state & SDL_BUTTON_RMASK) { + Vec3 camera_pos = camera->getPosition(); + float x = (float)event.motion.xrel / (v_width/50); + float y = (float)event.motion.yrel / (v_height/50); + // This is weird. (again) + 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_MOUSEBUTTONDOWN) { + } else if (event.type == SDL_MOUSEWHEEL) { RenderCamera *camera = scene->getCamera(1); - if (event.button.button == SDL_BUTTON_LEFT) { - camera->setMode(0); - } else { - camera->setMode(1); + Vec3 camera_pos = camera->getPosition(); + camera_pos.y -= event.wheel.y; + camera->setPosition(camera_pos.x, camera_pos.y, camera_pos.z); + camera->doRefresh(); + } else if (event.type == SDL_KEYUP) { + if (event.key.keysym.sym == SDLK_SPACE) { + RenderCamera *camera = scene->getCamera(1); + if (camera->getRenderMode() == 0) { + camera->setRenderMode(1); + } else { + camera->setRenderMode(0); + } } } } diff --git a/src/RenderCamera.cpp b/src/RenderCamera.cpp index 48c5c07..89be60f 100644 --- a/src/RenderCamera.cpp +++ b/src/RenderCamera.cpp @@ -70,7 +70,7 @@ void RenderCamera::doRefresh() { } /* ======== Setter functions ======== */ // sets to orthogonal or perspective rendering -void RenderCamera::setMode(int mode) { +void RenderCamera::setRenderMode(int mode) { if (mode == 1) { render_mode = mode; } else { @@ -116,3 +116,6 @@ float RenderCamera::getSize() { Mat4 RenderCamera::getModelview() { return mv_matrix; } +int RenderCamera::getRenderMode() { + return render_mode; +} diff --git a/src/RenderCamera.hpp b/src/RenderCamera.hpp index d812f6c..9e9d604 100644 --- a/src/RenderCamera.hpp +++ b/src/RenderCamera.hpp @@ -26,7 +26,8 @@ class RenderCamera { RenderView* getRenderView(); void updateProjection(int width, int height); void doRefresh(); - void setMode(int mode); + int getRenderMode(); + void setRenderMode(int mode); Vec3 getPosition(); void setPosition(float x, float y, float z); float getPitch();