summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Studio/Render/StudioRenderer.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2018-04-12 17:58:53 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2018-04-13 11:42:25 +0000
commit785b3314629bdb67867dd9af023b721011a65772 (patch)
tree32a1ca7023487f67b5f26426bbf5faaf978df737 /src/Authoring/Studio/Render/StudioRenderer.cpp
parenta34f4b9776cc2633481683839e8f3323c134be74 (diff)
Fix orbit camera
Orbit camera now keeps horizon level Task-number: QT3DS-1381 Change-Id: I2b999a913d1df82971300db31e0b877b0b70f234 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Teemu Tamminen <teemu.tamminen@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/Authoring/Studio/Render/StudioRenderer.cpp')
-rw-r--r--src/Authoring/Studio/Render/StudioRenderer.cpp54
1 files changed, 30 insertions, 24 deletions
diff --git a/src/Authoring/Studio/Render/StudioRenderer.cpp b/src/Authoring/Studio/Render/StudioRenderer.cpp
index 345d0bac..b48ff449 100644
--- a/src/Authoring/Studio/Render/StudioRenderer.cpp
+++ b/src/Authoring/Studio/Render/StudioRenderer.cpp
@@ -32,6 +32,7 @@
#include "StudioPreferences.h"
#include "HotKeys.h"
#include "StudioUtils.h"
+#include "Qt3DSMath.h"
#include <QDebug>
@@ -468,7 +469,15 @@ struct SRendererImpl : public IStudioRenderer,
// accurately
// or consider requesting a larger depth buffer from the windowing system.
// Setup the camera
- theCameraInfo->m_Direction = theDefinition.m_Direction;
+ QT3DSVec3 normalizedDir = theDefinition.m_Direction;
+ normalizedDir.normalize();
+ if (theDefinition.m_Type == EditCameraTypes::Directional) {
+ theCameraInfo->m_Direction = normalizedDir;
+ } else {
+ theCameraInfo->m_Direction = QT3DSVec3(0, 0, -1);
+ theCameraInfo->m_xRotation = -qt3ds::NVAtan(normalizedDir.x / normalizedDir.z);
+ theCameraInfo->m_yRotation = qt3ds::NVAsin(normalizedDir.y);
+ }
theCameraInfo->m_CameraType = theDefinition.m_Type;
}
@@ -755,30 +764,27 @@ struct SRendererImpl : public IStudioRenderer,
} break;
case STUDIO_TOOLMODE_CAMERA_ROTATE: {
if (m_Translation->m_EditCameraInfo.SupportsRotation()) {
- if (rightClick == false) {
- QT3DSVec3 theXAxis = QT3DSVec3(1, 0, 0);
- QT3DSVec3 theYAxis = QT3DSVec3(0, 1, 0);
- // Rotate about the center; we will just rotation the direction vector.
- QT3DSQuat theXRotation(-1.0f * theSubsetXDistance * g_RotationScaleFactor
- / 20.0f,
- theYAxis);
- QT3DSQuat theYRotation(-1.0f * theSubsetYDistance * g_RotationScaleFactor
- / 20.0f,
- theXAxis);
- m_Translation->m_EditCameraInfo.m_Rotation =
- m_MouseDownCameraInformation.m_Rotation
- * (theXRotation * theYRotation);
- } else {
- QT3DSVec3 theZAxis = QT3DSVec3(0, 0, 1);
- QT3DSQuat theZRotation(
- -1.0f * theYDistance * g_RotationScaleFactor / 20.0f, theZAxis);
- m_Translation->m_EditCameraInfo.m_Rotation =
- m_MouseDownCameraInformation.m_Rotation * theZRotation;
+ if (!rightClick) {
+ m_Translation->m_EditCameraInfo.m_xRotation =
+ m_MouseDownCameraInformation.m_xRotation
+ + (theSubsetXDistance * g_RotationScaleFactor / 20.0f);
+ m_Translation->m_EditCameraInfo.m_yRotation =
+ m_MouseDownCameraInformation.m_yRotation
+ - (theSubsetYDistance * g_RotationScaleFactor / 20.0f);
+ // Avoid rounding errors stemming from extremely large rotation angles
+ if (m_Translation->m_EditCameraInfo.m_xRotation < -qt3ds::NVPi)
+ m_Translation->m_EditCameraInfo.m_xRotation += qt3ds::NVPi * 2.0f;
+ if (m_Translation->m_EditCameraInfo.m_xRotation > qt3ds::NVPi)
+ m_Translation->m_EditCameraInfo.m_xRotation -= qt3ds::NVPi * 2.0f;
+ if (m_Translation->m_EditCameraInfo.m_yRotation < -qt3ds::NVPi)
+ m_Translation->m_EditCameraInfo.m_yRotation += qt3ds::NVPi * 2.0f;
+ if (m_Translation->m_EditCameraInfo.m_yRotation > qt3ds::NVPi)
+ m_Translation->m_EditCameraInfo.m_yRotation -= qt3ds::NVPi * 2.0f;
}
- // Rotations need to be incremental and relative else things don't rotate
- // intuitively.
- m_MouseDownCameraInformation.m_Rotation =
- m_Translation->m_EditCameraInfo.m_Rotation;
+ m_MouseDownCameraInformation.m_xRotation =
+ m_Translation->m_EditCameraInfo.m_xRotation;
+ m_MouseDownCameraInformation.m_yRotation =
+ m_Translation->m_EditCameraInfo.m_yRotation;
RequestRender();
}
} break;