summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2019-08-16 10:44:43 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2019-08-19 10:45:11 +0300
commite7a73a36006252ea9647405f59084d01cf008043 (patch)
treefb8f8a7e477d496af62f174b3ff6ab3268a56d7f
parent1e6164bacd1cbfc4a6a8b81ba2b0de1fd4dd783c (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>
-rw-r--r--src/Authoring/Qt3DStudio/Render/StudioRendererTranslation.cpp3
-rw-r--r--src/Authoring/Qt3DStudio/Render/StudioRotationWidget.cpp4
-rw-r--r--src/Authoring/Qt3DStudio/Render/StudioScaleWidget.cpp4
-rw-r--r--src/Authoring/Qt3DStudio/Render/StudioTranslationWidget.cpp4
-rw-r--r--src/Authoring/Qt3DStudio/Render/StudioWidget.h1
-rw-r--r--src/Authoring/Qt3DStudio/Render/StudioWidgetImpl.h8
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());