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.