diff options
Diffstat (limited to 'src/extras/defaults/qorbitcameracontroller.cpp')
-rw-r--r-- | src/extras/defaults/qorbitcameracontroller.cpp | 114 |
1 files changed, 104 insertions, 10 deletions
diff --git a/src/extras/defaults/qorbitcameracontroller.cpp b/src/extras/defaults/qorbitcameracontroller.cpp index 92b59e46c..390a986f3 100644 --- a/src/extras/defaults/qorbitcameracontroller.cpp +++ b/src/extras/defaults/qorbitcameracontroller.cpp @@ -12,6 +12,12 @@ namespace Qt3DExtras { QOrbitCameraControllerPrivate::QOrbitCameraControllerPrivate() : m_zoomInLimit(2.0f) + , m_upVector(0.0f, 1.0f, 0.0f) + , m_inverseXTranslate(false) + , m_inverseYTranslate(false) + , m_inversePan(false) + , m_inverseTilt(false) + , m_zoomTranslateViewCenter(true) {} /*! @@ -80,7 +86,7 @@ QOrbitCameraController::~QOrbitCameraController() } /*! - \property QOrbitCameraController::zoomInLimit + \property Qt3DExtras::QOrbitCameraController::zoomInLimit Holds the current zoom-in limit. The zoom-in limit determines how close to the view center the camera can be zoomed. @@ -100,6 +106,95 @@ void QOrbitCameraController::setZoomInLimit(float zoomInLimit) } } +QVector3D QOrbitCameraController::upVector() const { + Q_D(const QOrbitCameraController); + return d->m_upVector; +} + +void QOrbitCameraController::setUpVector(const QVector3D& upVector) +{ + Q_D(QOrbitCameraController); + if (d->m_upVector != upVector) { + d->m_upVector = upVector; + emit upVectorChanged(d->m_upVector); + } +} + +bool QOrbitCameraController::inverseXTranslate() const +{ + Q_D(const QOrbitCameraController); + return d->m_inverseXTranslate; +} + +void QOrbitCameraController::setInverseXTranslate(bool isInverse) +{ + Q_D(QOrbitCameraController); + if (d->m_inverseXTranslate != isInverse) { + d->m_inverseXTranslate = isInverse; + emit inverseXTranslateChanged(d->m_inverseXTranslate); + } +} + +bool QOrbitCameraController::inverseYTranslate() const +{ + Q_D(const QOrbitCameraController); + return d->m_inverseYTranslate; +} + +void QOrbitCameraController::setInverseYTranslate(bool isInverse) +{ + Q_D(QOrbitCameraController); + if (d->m_inverseYTranslate != isInverse) { + d->m_inverseYTranslate = isInverse; + emit inverseYTranslateChanged(d->m_inverseYTranslate); + } +} + +bool QOrbitCameraController::inversePan() const +{ + Q_D(const QOrbitCameraController); + return d->m_inversePan; +} + +void QOrbitCameraController::setInversePan(bool isInverse) +{ + Q_D(QOrbitCameraController); + if (d->m_inversePan != isInverse) { + d->m_inversePan = isInverse; + emit inversePanChanged(d->m_inversePan); + } +} + +bool QOrbitCameraController::inverseTilt() const +{ + Q_D(const QOrbitCameraController); + return d->m_inverseTilt; +} + +void QOrbitCameraController::setInverseTilt(bool isInverse) +{ + Q_D(QOrbitCameraController); + if (d->m_inverseTilt != isInverse) { + d->m_inverseTilt = isInverse; + emit inverseTiltChanged(d->m_inverseTilt); + } +} + +bool QOrbitCameraController::zoomTranslateViewCenter() const +{ + Q_D(const QOrbitCameraController); + return d->m_zoomTranslateViewCenter; +} + +void QOrbitCameraController::setZoomTranslateViewCenter(bool isTranslate) +{ + Q_D(QOrbitCameraController); + if (d->m_zoomTranslateViewCenter != isTranslate) { + d->m_zoomTranslateViewCenter = isTranslate; + emit zoomTranslateViewCenterChanged(d->m_zoomTranslateViewCenter); + } +} + inline float clampInputs(float input1, float input2) { float axisValue = input1 + input2; @@ -120,8 +215,6 @@ void QOrbitCameraController::moveCamera(const QAbstractCameraController::InputSt if (theCamera == nullptr) return; - const QVector3D upVector(0.0f, 1.0f, 0.0f); - // Mouse input if (state.leftMouseButtonActive) { if (state.rightMouseButtonActive) { @@ -133,22 +226,22 @@ void QOrbitCameraController::moveCamera(const QAbstractCameraController::InputSt } } else { // Translate - theCamera->translate(QVector3D(clampInputs(state.rxAxisValue, state.txAxisValue) * linearSpeed(), - clampInputs(state.ryAxisValue, state.tyAxisValue) * linearSpeed(), - 0) * dt); + theCamera->translate(QVector3D((d->m_inverseXTranslate ? -1.0f : 1.0f) * clampInputs(state.rxAxisValue, state.txAxisValue) * linearSpeed(), + (d->m_inverseYTranslate ? -1.0f : 1.0f) * clampInputs(state.ryAxisValue, state.tyAxisValue) * linearSpeed(), + 0) * dt); } return; } else if (state.rightMouseButtonActive) { // Orbit - theCamera->panAboutViewCenter((state.rxAxisValue * lookSpeed()) * dt, upVector); - theCamera->tiltAboutViewCenter((state.ryAxisValue * lookSpeed()) * dt); + theCamera->panAboutViewCenter((d->m_inversePan ? -1.0f : 1.0f) * (state.rxAxisValue * lookSpeed()) * dt, d->m_upVector); + theCamera->tiltAboutViewCenter((d->m_inverseTilt ? -1.0f : 1.0f) * (state.ryAxisValue * lookSpeed()) * dt); } // Keyboard Input if (state.altKeyActive) { // Orbit - theCamera->panAboutViewCenter((state.txAxisValue * lookSpeed()) * dt, upVector); + theCamera->panAboutViewCenter((state.txAxisValue * lookSpeed()) * dt, d->m_upVector); theCamera->tiltAboutViewCenter((state.tyAxisValue * lookSpeed()) * dt); } else if (state.shiftKeyActive) { if (zoomDistance(camera()->position(), theCamera->viewCenter()) > d->m_zoomInLimit * d->m_zoomInLimit) { @@ -161,7 +254,8 @@ void QOrbitCameraController::moveCamera(const QAbstractCameraController::InputSt // Translate theCamera->translate(QVector3D(clampInputs(state.leftMouseButtonActive ? state.rxAxisValue : 0, state.txAxisValue) * linearSpeed(), clampInputs(state.leftMouseButtonActive ? state.ryAxisValue : 0, state.tyAxisValue) * linearSpeed(), - state.tzAxisValue * linearSpeed()) * dt); + state.tzAxisValue * linearSpeed()) * dt, + d->m_zoomTranslateViewCenter ? theCamera->TranslateViewCenter : theCamera->DontTranslateViewCenter); } } |