diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-08-16 10:44:43 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-08-19 10:45:11 +0300 |
commit | e7a73a36006252ea9647405f59084d01cf008043 (patch) | |
tree | fb8f8a7e477d496af62f174b3ff6ab3268a56d7f | |
parent | 1e6164bacd1cbfc4a6a8b81ba2b0de1fd4dd783c (diff) |
Hide manipulator widgets when the selected object is behind camera
Task-number: QT3DS-3864
Change-Id: I1c1c7e22eef6905827243b449764cdca0c44932c
Reviewed-by: Jere Tuliniemi <jere.tuliniemi@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Antti Määttä <antti.maatta@qt.io>
6 files changed, 23 insertions, 1 deletions
diff --git a/src/Authoring/Qt3DStudio/Render/StudioRendererTranslation.cpp b/src/Authoring/Qt3DStudio/Render/StudioRendererTranslation.cpp index 30df1406..a857238f 100644 --- a/src/Authoring/Qt3DStudio/Render/StudioRendererTranslation.cpp +++ b/src/Authoring/Qt3DStudio/Render/StudioRendererTranslation.cpp @@ -3127,7 +3127,8 @@ SStudioPickValue STranslation::Pick(CPt inMouseCoords, TranslationSelectMode::En || m_LastRenderedWidget->GetNode().m_Type == GraphObjectTypes::Light || m_LastRenderedWidget->GetNode().m_Type - == GraphObjectTypes::Camera)) { + == GraphObjectTypes::Camera) + && !m_LastRenderedWidget->isNodeBehindCamera()) { Option<QT3DSU32> picked = PickWidget(inMouseCoords, inSelectMode, *m_LastRenderedWidget); if (picked.hasValue()) { diff --git a/src/Authoring/Qt3DStudio/Render/StudioRotationWidget.cpp b/src/Authoring/Qt3DStudio/Render/StudioRotationWidget.cpp index f3e06cd6..544841f9 100644 --- a/src/Authoring/Qt3DStudio/Render/StudioRotationWidget.cpp +++ b/src/Authoring/Qt3DStudio/Render/StudioRotationWidget.cpp @@ -279,6 +279,10 @@ struct SRotationWidget : public SStudioWidgetImpl<StudioWidgetTypes::Rotation> QT3DSVec3 theRingColor(QT3DSVec3(.8f, .8f, .8f)); QT3DSMat44 theMVP = TBase::SetupMVP(inWidgetContext); + + if (isNodeBehindCamera()) + return; + inRenderContext.SetCullingEnabled(false); QT3DSMat44 theCameraMVP = m_WidgetInfo.m_LayerProjection * m_CameraTranslationScale; diff --git a/src/Authoring/Qt3DStudio/Render/StudioScaleWidget.cpp b/src/Authoring/Qt3DStudio/Render/StudioScaleWidget.cpp index 9b5eec1f..52d834e3 100644 --- a/src/Authoring/Qt3DStudio/Render/StudioScaleWidget.cpp +++ b/src/Authoring/Qt3DStudio/Render/StudioScaleWidget.cpp @@ -189,6 +189,10 @@ struct SScaleWidget : public SStudioWidgetImpl<StudioWidgetTypes::Scale> } QT3DSMat44 theMVP = TBase::SetupMVP(inWidgetContext); + + if (isNodeBehindCamera()) + return; + inRenderContext.SetBlendingEnabled(false); inRenderContext.SetDepthTestEnabled(true); inRenderContext.SetDepthWriteEnabled(true); diff --git a/src/Authoring/Qt3DStudio/Render/StudioTranslationWidget.cpp b/src/Authoring/Qt3DStudio/Render/StudioTranslationWidget.cpp index 0897a866..0ef99d41 100644 --- a/src/Authoring/Qt3DStudio/Render/StudioTranslationWidget.cpp +++ b/src/Authoring/Qt3DStudio/Render/StudioTranslationWidget.cpp @@ -109,6 +109,10 @@ struct STranslationWidget : public SStudioWidgetImpl<StudioWidgetTypes::Translat 0.0f, 1.0f, "TranslationWidgetZPlane"); } QT3DSMat44 theMVP = TBase::SetupMVP(inWidgetContext); + + if (isNodeBehindCamera()) + return; + inRenderContext.SetBlendingEnabled(false); inRenderContext.SetDepthTestEnabled(true); inRenderContext.SetDepthWriteEnabled(true); diff --git a/src/Authoring/Qt3DStudio/Render/StudioWidget.h b/src/Authoring/Qt3DStudio/Render/StudioWidget.h index 0d40f195..897c71cf 100644 --- a/src/Authoring/Qt3DStudio/Render/StudioWidget.h +++ b/src/Authoring/Qt3DStudio/Render/StudioWidget.h @@ -128,6 +128,7 @@ namespace widgets { virtual void SetRotationEdges(const QT3DSVec3 &inStartDirection, const QT3DSVec3 &inRotationAxis, QT3DSF32 inAngleRad, QT3DSF32 inEndLineLen) = 0; virtual void ClearRotationEdges() = 0; + virtual bool isNodeBehindCamera() const = 0; static IStudioWidget &CreateTranslationWidget(NVAllocatorCallback &inAlloc); static IStudioWidget &CreateRotationWidget(NVAllocatorCallback &inAlloc); diff --git a/src/Authoring/Qt3DStudio/Render/StudioWidgetImpl.h b/src/Authoring/Qt3DStudio/Render/StudioWidgetImpl.h index b78c1edf..1ade819a 100644 --- a/src/Authoring/Qt3DStudio/Render/StudioWidgetImpl.h +++ b/src/Authoring/Qt3DStudio/Render/StudioWidgetImpl.h @@ -36,6 +36,7 @@ #include "Qt3DSRenderNode.h" #include "Qt3DSRenderShaderCodeGeneratorV2.h" +#include "Qt3DSRenderCamera.h" #include "StudioPreferences.h" namespace qt3ds { @@ -327,6 +328,13 @@ namespace widgets { void ClearRotationEdges() override { m_RotationWedge = Empty(); } + bool isNodeBehindCamera() const override + { + return m_WidgetInfo.m_Camera && m_Node + && m_WidgetInfo.m_Camera->GetDirection().dot( + (m_Node->GetGlobalPos() - m_WidgetInfo.m_Camera->GetGlobalPos())) > 0.f; + } + static inline QT3DSVec3 ToGLSLColor(const QColor &c) { return QT3DSVec3(c.redF(), c.greenF(), c.blueF()); |