From 601c000b10a0d77fef4b1a6c586f748a506efcd7 Mon Sep 17 00:00:00 2001 From: Michel Mastriani Date: Sun, 27 Sep 2020 11:59:09 -0300 Subject: [PATCH] Pitch-Yaw mouse move feature --- Source/Fractorium/Fractorium.h | 2 ++ Source/Fractorium/FractoriumParams.cpp | 20 ++++++++++++ Source/Fractorium/GLEmberController.h | 4 ++- Source/Fractorium/GLWidget.cpp | 42 ++++++++++++++++++++++---- 4 files changed, 61 insertions(+), 7 deletions(-) mode change 100644 => 100755 Source/Fractorium/GLWidget.cpp diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h index aade5af..b195aed 100644 --- a/Source/Fractorium/Fractorium.h +++ b/Source/Fractorium/Fractorium.h @@ -114,6 +114,8 @@ public: bool ApplyAll(); void SetRotation(double rot, bool stealth); void SetScale(double scale); + void SetPitch(double pitch); + void SetYaw(double yaw); void SetCoordinateStatus(int rasX, int rasY, float worldX, float worldY); void CenterScrollbars(); diff --git a/Source/Fractorium/FractoriumParams.cpp b/Source/Fractorium/FractoriumParams.cpp index 09efe66..64a8edf 100644 --- a/Source/Fractorium/FractoriumParams.cpp +++ b/Source/Fractorium/FractoriumParams.cpp @@ -928,6 +928,26 @@ void Fractorium::SetScale(double scale) m_ScaleSpin->setValue(scale); } +/// +/// Set the pitch. +/// This updates the spinner +/// +/// The pitch value +void Fractorium::SetPitch(double pitch) +{ + m_PitchSpin->setValue(pitch); +} + +/// +/// Set the yaw. +/// This updates the spinner +/// +/// The yaw value +void Fractorium::SetYaw(double yaw) +{ + m_YawSpin->setValue(yaw); +} + template class FractoriumEmberController; #ifdef DO_DOUBLE diff --git a/Source/Fractorium/GLEmberController.h b/Source/Fractorium/GLEmberController.h index 4ca9e6f..e5710ee 100644 --- a/Source/Fractorium/GLEmberController.h +++ b/Source/Fractorium/GLEmberController.h @@ -19,7 +19,7 @@ enum class eHoverType : et { HoverNone, HoverXAxis, HoverYAxis, HoverTranslation /// /// Dragging an affine transform or panning, rotating or scaling the image. /// -enum class eDragState : et { DragNone, DragSelect, DragPanning, DragDragging, DragRotateScale }; +enum class eDragState : et { DragNone, DragSelect, DragPanning, DragDragging, DragRotateScale, DragPitchYaw }; /// /// Dragging with no keys pressed, shift, control or alt. @@ -137,6 +137,8 @@ private: T m_CenterDownY; T m_RotationDown; T m_ScaleDown; + T m_PitchDown; + T m_YawDown; v4T m_BoundsDown; v3T m_MouseWorldPos; diff --git a/Source/Fractorium/GLWidget.cpp b/Source/Fractorium/GLWidget.cpp old mode 100644 new mode 100755 index 4dda77d..d618abe --- a/Source/Fractorium/GLWidget.cpp +++ b/Source/Fractorium/GLWidget.cpp @@ -891,7 +891,7 @@ void GLEmberController::MousePress(QMouseEvent* e) m_DragState = eDragState::DragNone; } } - else if (e->button() == Qt::MiddleButton || (e->button() == Qt::RightButton && e->modifiers() & Qt::ShiftModifier))//Middle button or right button with shift key, do whole image translation. + else if (e->button() == Qt::MiddleButton || (e->button() == Qt::RightButton && e->modifiers() & Qt::ShiftModifier && !(e->modifiers() & Qt::AltModifier)))//Middle button or right button with shift key, do whole image translation. { m_CenterDownX = ember->m_CenterX;//Capture where the center of the image is because this value will change when panning. m_CenterDownY = ember->m_CenterY; @@ -901,11 +901,21 @@ void GLEmberController::MousePress(QMouseEvent* e) { if (m_Fractorium->DrawImage()) { - m_CenterDownX = ember->m_CenterX;//Capture these because they will change when rotating and scaling. - m_CenterDownY = ember->m_CenterY; - m_RotationDown = ember->m_Rotate; - m_ScaleDown = ember->m_PixelsPerUnit; - m_DragState = eDragState::DragRotateScale; + m_CenterDownX = ember->m_CenterX;//Capture these because they will change when rotating and scaling. + m_CenterDownY = ember->m_CenterY; + + if(GetAlt() && GetShift()) + { + m_PitchDown = ember->m_CamPitch * RAD_2_DEG_T; + m_YawDown = ember->m_CamYaw * RAD_2_DEG_T; + m_DragState = eDragState::DragPitchYaw; + } + else + { + m_RotationDown = ember->m_Rotate; + m_ScaleDown = ember->m_PixelsPerUnit; + m_DragState = eDragState::DragRotateScale; + } } } } @@ -1054,6 +1064,26 @@ void GLEmberController::MouseMove(QMouseEvent* e) m_Fractorium->SetRotation(ember->m_Rotate, true); m_Fractorium->SetScale(std::max(T(10), m_ScaleDown + scale));//Will restart the rendering process. } + else if (m_DragState == eDragState::DragPitchYaw)//Pitching and yawing the whole image. + { + T pitch; + T yaw; + auto rotate = ember->m_Rotate; + + if((rotate <= 45 && rotate >= -45) || (rotate >= 135) || (rotate <= -135)) + { + pitch = m_PitchDown + (m_MouseWorldPos.y - m_MouseDownWorldPos.y) * 100; + yaw = m_YawDown + (m_MouseWorldPos.x - m_MouseDownWorldPos.x) * 100; + } + else + { + pitch = m_PitchDown + (m_MouseWorldPos.x - m_MouseDownWorldPos.x) * 100; + yaw = m_YawDown + (m_MouseWorldPos.y - m_MouseDownWorldPos.y) * 100; + } + + m_Fractorium->SetPitch(pitch); + m_Fractorium->SetYaw(yaw); + } else { //If the user doesn't already have a key down, and they aren't dragging, clear the keys to be safe.