aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2024-04-29 16:15:43 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2024-04-29 13:33:13 +0000
commit7a9a30d68ccd6be88a006443acf363e4b596c922 (patch)
treec389eb6415fa0cd36b809759ed6c3d4e126b8102
parentc9c3303ad889b011460cb0d5a7a0cb5ccc290789 (diff)
QmlDesigner: Add reflection probe icon gizmo
Fixes: QDS-11964 Change-Id: I35fce676c282988e7faa1376da90e4cd53f353ae Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io> Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
-rw-r--r--src/tools/qml2puppet/editor3d_qt6.qrc3
-rw-r--r--src/tools/qml2puppet/mockfiles/images/reflectionprobe.pngbin0 -> 463 bytes
-rw-r--r--src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.pngbin0 -> 887 bytes
-rw-r--r--src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml18
-rw-r--r--src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml102
-rw-r--r--src/tools/qml2puppet/mockfiles/qt6/ReflectionProbeGizmo.qml9
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp28
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h2
8 files changed, 148 insertions, 14 deletions
diff --git a/src/tools/qml2puppet/editor3d_qt6.qrc b/src/tools/qml2puppet/editor3d_qt6.qrc
index d76b1941b9..c437bad9ad 100644
--- a/src/tools/qml2puppet/editor3d_qt6.qrc
+++ b/src/tools/qml2puppet/editor3d_qt6.qrc
@@ -19,6 +19,8 @@
<file>mockfiles/images/spot@2x.png</file>
<file>mockfiles/images/preview_landscape.hdr</file>
<file>mockfiles/images/preview_studio.hdr</file>
+ <file>mockfiles/images/reflectionprobe.png</file>
+ <file>mockfiles/images/reflectionprobe@2x.png</file>
<file>mockfiles/qt6/AdjustableArrow.qml</file>
<file>mockfiles/qt6/Arrow.qml</file>
<file>mockfiles/qt6/AutoScaleHelper.qml</file>
@@ -50,6 +52,7 @@
<file>mockfiles/qt6/PlanarMoveHandle.qml</file>
<file>mockfiles/qt6/PlanarScaleHandle.qml</file>
<file>mockfiles/qt6/ReflectionProbeBox.qml</file>
+ <file>mockfiles/qt6/ReflectionProbeGizmo.qml</file>
<file>mockfiles/qt6/RotateGizmo.qml</file>
<file>mockfiles/qt6/RotateRing.qml</file>
<file>mockfiles/qt6/ScaleGizmo.qml</file>
diff --git a/src/tools/qml2puppet/mockfiles/images/reflectionprobe.png b/src/tools/qml2puppet/mockfiles/images/reflectionprobe.png
new file mode 100644
index 0000000000..4f31a98f65
--- /dev/null
+++ b/src/tools/qml2puppet/mockfiles/images/reflectionprobe.png
Binary files differ
diff --git a/src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png b/src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png
new file mode 100644
index 0000000000..2aa3124a41
--- /dev/null
+++ b/src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png
Binary files differ
diff --git a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml
index e3448ff77c..381f3b11d1 100644
--- a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml
+++ b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml
@@ -523,6 +523,12 @@ Item {
overlayViews[i].addParticleEmitterGizmo(scene, obj);
}
+ function addReflectionProbeGizmo(scene, obj)
+ {
+ for (var i = 0; i < 4; ++i)
+ overlayViews[i].addReflectionProbeGizmo(scene, obj);
+ }
+
function releaseLightGizmo(obj)
{
for (var i = 0; i < 4; ++i)
@@ -547,6 +553,12 @@ Item {
overlayViews[i].releaseParticleEmitterGizmo(obj);
}
+ function releaseReflectionProbeGizmo(obj)
+ {
+ for (var i = 0; i < 4; ++i)
+ overlayViews[i].releaseReflectionProbeGizmo(obj);
+ }
+
function updateLightGizmoScene(scene, obj)
{
for (var i = 0; i < 4; ++i)
@@ -571,6 +583,12 @@ Item {
overlayViews[i].updateParticleEmitterGizmoScene(scene, obj);
}
+ function updateReflectionProbeGizmoScene(scene, obj)
+ {
+ for (var i = 0; i < 4; ++i)
+ overlayViews[i].updateReflectionProbeGizmoScene(scene, obj);
+ }
+
function resolveSplitPoint(x, y)
{
if (!splitView || activeSplit === 0)
diff --git a/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml b/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml
index 13a37f4f72..71f2250b7c 100644
--- a/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml
+++ b/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml
@@ -21,6 +21,7 @@ View3D {
property var cameraGizmos: []
property var particleSystemIconGizmos: []
property var particleEmitterGizmos: []
+ property var reflectionProbeGizmos: []
signal commitObjectProperty(var objects, var propNames)
signal changeObjectProperty(var objects, var propNames)
@@ -288,66 +289,141 @@ View3D {
}
}
+ function addReflectionProbeGizmo(scene, obj)
+ {
+ // Insert into first available gizmo if we don't already have gizmo for this object
+ var slotFound = -1;
+ for (var i = 0; i < reflectionProbeGizmos.length; ++i) {
+ if (!reflectionProbeGizmos[i].targetNode) {
+ slotFound = i;
+ } else if (reflectionProbeGizmos[i].targetNode === obj) {
+ reflectionProbeGizmos[i].scene = scene;
+ return;
+ }
+ }
+
+ if (slotFound !== -1) {
+ reflectionProbeGizmos[slotFound].scene = scene;
+ reflectionProbeGizmos[slotFound].targetNode = obj;
+ reflectionProbeGizmos[slotFound].locked = _generalHelper.isLocked(obj);
+ reflectionProbeGizmos[slotFound].hidden = _generalHelper.isHidden(obj);
+ return;
+ }
+
+ // No free gizmos available, create a new one
+ var gizmoComponent = Qt.createComponent("ReflectionProbeGizmo.qml");
+ if (gizmoComponent.status === Component.Ready) {
+ var gizmo = gizmoComponent.createObject(overlayView,
+ {"view3D": overlayView,
+ "targetNode": obj,
+ "selectedNodes": viewRoot.selectedNodes,
+ "scene": scene,
+ "activeScene": viewRoot.activeScene,
+ "locked": _generalHelper.isLocked(obj),
+ "hidden": _generalHelper.isHidden(obj),
+ "globalShow": viewRoot.showIconGizmo});
+ reflectionProbeGizmos[reflectionProbeGizmos.length] = gizmo;
+ gizmo.clicked.connect(viewRoot.handleObjectClicked);
+ gizmo.selectedNodes = Qt.binding(function() {return viewRoot.selectedNodes;});
+ gizmo.activeScene = Qt.binding(function() {return viewRoot.activeScene;});
+ gizmo.globalShow = Qt.binding(function() {return viewRoot.showIconGizmo;});
+ }
+ }
+
+ function releaseReflectionProbeGizmo(obj)
+ {
+ for (var i = 0; i < reflectionProbeGizmos.length; ++i) {
+ if (reflectionProbeGizmos[i].targetNode === obj) {
+ reflectionProbeGizmos[i].scene = null;
+ reflectionProbeGizmos[i].targetNode = null;
+ return;
+ }
+ }
+ }
+
+ function updateReflectionProbeGizmoScene(scene, obj)
+ {
+ for (var i = 0; i < reflectionProbeGizmos.length; ++i) {
+ if (reflectionProbeGizmos[i].targetNode === obj) {
+ reflectionProbeGizmos[i].scene = scene;
+ return;
+ }
+ }
+ }
+
function gizmoAt(x, y)
{
- for (var i = 0; i < lightIconGizmos.length; ++i) {
+ let i = 0;
+ for (; i < lightIconGizmos.length; ++i) {
if (lightIconGizmos[i].visible && lightIconGizmos[i].hasPoint(x, y))
return lightIconGizmos[i].targetNode;
}
- for (var i = 0; i < cameraGizmos.length; ++i) {
+ for (i = 0; i < cameraGizmos.length; ++i) {
if (cameraGizmos[i].visible && cameraGizmos[i].hasPoint(x, y))
return cameraGizmos[i].targetNode;
}
- for (var i = 0; i < particleSystemIconGizmos.length; ++i) {
+ for (i = 0; i < particleSystemIconGizmos.length; ++i) {
if (particleSystemIconGizmos[i].visible && particleSystemIconGizmos[i].hasPoint(x, y))
return particleSystemIconGizmos[i].targetNode;
}
+ for (i = 0; i < reflectionProbeGizmos.length; ++i) {
+ if (reflectionProbeGizmos[i].visible && reflectionProbeGizmos[i].hasPoint(x, y))
+ return reflectionProbeGizmos[i].targetNode;
+ }
return null;
}
function handleLockedStateChange(node)
{
- for (var i = 0; i < lightIconGizmos.length; ++i) {
+ let i = 0;
+ for (; i < lightIconGizmos.length; ++i) {
if (lightIconGizmos[i].targetNode === node) {
lightIconGizmos[i].locked = _generalHelper.isLocked(node);
return;
}
}
- for (var i = 0; i < cameraGizmos.length; ++i) {
+ for (i = 0; i < cameraGizmos.length; ++i) {
if (cameraGizmos[i].targetNode === node) {
cameraGizmos[i].locked = _generalHelper.isLocked(node);
return;
}
}
- for (var i = 0; i < particleSystemIconGizmos.length; ++i) {
+ for (i = 0; i < particleSystemIconGizmos.length; ++i) {
if (particleSystemIconGizmos[i].targetNode === node) {
particleSystemIconGizmos[i].locked = _generalHelper.isLocked(node);
return;
}
}
+ for (i = 0; i < reflectionProbeGizmos.length; ++i) {
+ if (reflectionProbeGizmos[i].targetNode === node) {
+ reflectionProbeGizmos[i].locked = _generalHelper.isLocked(node);
+ return;
+ }
+ }
}
function handleHiddenStateChange(node)
{
- for (var i = 0; i < lightIconGizmos.length; ++i) {
+ let i = 0;
+ for (; i < lightIconGizmos.length; ++i) {
if (lightIconGizmos[i].targetNode === node) {
lightIconGizmos[i].hidden = _generalHelper.isHidden(node);
return;
}
}
- for (var i = 0; i < cameraGizmos.length; ++i) {
+ for (i = 0; i < cameraGizmos.length; ++i) {
if (cameraGizmos[i].targetNode === node) {
cameraGizmos[i].hidden = _generalHelper.isHidden(node);
return;
}
}
- for (var i = 0; i < particleSystemIconGizmos.length; ++i) {
+ for (i = 0; i < particleSystemIconGizmos.length; ++i) {
if (particleSystemIconGizmos[i].targetNode === node) {
particleSystemIconGizmos[i].hidden = _generalHelper.isHidden(node);
return;
}
}
- for (var i = 0; i < particleEmitterGizmos.length; ++i) {
+ for (i = 0; i < particleEmitterGizmos.length; ++i) {
if (particleEmitterGizmos[i].targetNode === node) {
particleEmitterGizmos[i].hidden = _generalHelper.isHidden(node);
return;
@@ -356,6 +432,12 @@ View3D {
return;
}
}
+ for (i = 0; i < reflectionProbeGizmos.length; ++i) {
+ if (reflectionProbeGizmos[i].targetNode === node) {
+ reflectionProbeGizmos[i].hidden = _generalHelper.isHidden(node);
+ return;
+ }
+ }
}
SceneEnvironment {
diff --git a/src/tools/qml2puppet/mockfiles/qt6/ReflectionProbeGizmo.qml b/src/tools/qml2puppet/mockfiles/qt6/ReflectionProbeGizmo.qml
new file mode 100644
index 0000000000..2183e68679
--- /dev/null
+++ b/src/tools/qml2puppet/mockfiles/qt6/ReflectionProbeGizmo.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+import QtQuick
+import QtQuick3D
+
+IconGizmo {
+ iconSource: "qrc:///qtquickplugin/mockfiles/images/reflectionprobe.png"
+}
diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
index 6cd39a5a85..705efce2cf 100644
--- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
+++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
@@ -74,6 +74,7 @@
#include <QtQuick3D/private/qquick3dscenerootnode_p.h>
#include <QtQuick3D/private/qquick3drepeater_p.h>
#include <QtQuick3D/private/qquick3dloader_p.h>
+#include <QtQuick3D/private/qquick3dreflectionprobe_p.h>
#include <QtQuick3D/private/qquick3dsceneenvironment_p.h>
#if defined(QUICK3D_ASSET_UTILS_MODULE)
#include <private/qquick3druntimeloader_p.h>
@@ -979,6 +980,9 @@ void Qt5InformationNodeInstanceServer::handleNode3DDestroyed([[maybe_unused]] QO
QMetaObject::invokeMethod(m_editView3DData.rootItem, "releaseParticleEmitterGizmo",
Q_ARG(QVariant, objectToVariant(obj)));
#endif
+ } else if (qobject_cast<QQuick3DReflectionProbe *>(obj)) {
+ QMetaObject::invokeMethod(m_editView3DData.rootItem, "releaseReflectionProbeGizmo",
+ Q_ARG(QVariant, objectToVariant(obj)));
}
removeNode3D(obj);
#endif
@@ -1112,6 +1116,10 @@ void Qt5InformationNodeInstanceServer::resolveSceneRoots()
Q_ARG(QVariant, objectToVariant(newRoot)),
Q_ARG(QVariant, objectToVariant(node)));
#endif
+ } else if (qobject_cast<QQuick3DReflectionProbe *>(node)) {
+ QMetaObject::invokeMethod(m_editView3DData.rootItem, "updateReflectionProbeGizmoScene",
+ Q_ARG(QVariant, objectToVariant(newRoot)),
+ Q_ARG(QVariant, objectToVariant(node)));
}
}
++it;
@@ -1599,7 +1607,7 @@ QList<ServerNodeInstance> Qt5InformationNodeInstanceServer::createInstances(
if (m_editView3DSetupDone) {
add3DViewPorts(createdInstances);
add3DScenes(createdInstances);
- createCameraAndLightGizmos(createdInstances);
+ createGizmos(createdInstances);
}
render3DEditView();
@@ -1652,13 +1660,14 @@ void Qt5InformationNodeInstanceServer::handleDynamicAddObjectTimeout()
m_dynamicObjectConstructors.clear();
}
-void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos(
+void Qt5InformationNodeInstanceServer::createGizmos(
const QList<ServerNodeInstance> &instanceList) const
{
QHash<QObject *, QObjectList> cameras;
QHash<QObject *, QObjectList> lights;
QHash<QObject *, QObjectList> particleSystems;
QHash<QObject *, QObjectList> particleEmitters;
+ QHash<QObject *, QObjectList> reflectionProbes;
for (const ServerNodeInstance &instance : instanceList) {
if (instance.isSubclassOf("QQuick3DCamera")) {
@@ -1671,6 +1680,8 @@ void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos(
|| instance.isSubclassOf("QQuick3DParticleAttractor"))
&& !instance.isSubclassOf("QQuick3DParticleTrailEmitter")) {
particleEmitters[find3DSceneRoot(instance)] << instance.internalObject();
+ } else if (instance.isSubclassOf("QQuick3DReflectionProbe")) {
+ reflectionProbes[find3DSceneRoot(instance)] << instance.internalObject();
}
}
@@ -1715,6 +1726,17 @@ void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos(
}
++emitterIt;
}
+
+ auto refProbeIt = reflectionProbes.constBegin();
+ while (refProbeIt != reflectionProbes.constEnd()) {
+ const auto refProbeObjs = refProbeIt.value();
+ for (auto &obj : refProbeObjs) {
+ QMetaObject::invokeMethod(m_editView3DData.rootItem, "addReflectionProbeGizmo",
+ Q_ARG(QVariant, objectToVariant(refProbeIt.key())),
+ Q_ARG(QVariant, objectToVariant(obj)));
+ }
+ ++refProbeIt;
+ }
}
void Qt5InformationNodeInstanceServer::add3DViewPorts(const QList<ServerNodeInstance> &instanceList)
@@ -1977,7 +1999,7 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(
updateActiveSceneToEditView3D();
- createCameraAndLightGizmos(instanceList);
+ createGizmos(instanceList);
// Queue two renders to make sure icon gizmos update properly
render3DEditView(2);
diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
index 4f7fcd7177..321751cf23 100644
--- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
+++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h
@@ -92,7 +92,7 @@ private:
void create3DPreviewView();
void setup3DEditView(const QList<ServerNodeInstance> &instanceList,
const CreateSceneCommand &command);
- void createCameraAndLightGizmos(const QList<ServerNodeInstance> &instanceList) const;
+ void createGizmos(const QList<ServerNodeInstance> &instanceList) const;
void add3DViewPorts(const QList<ServerNodeInstance> &instanceList);
void add3DScenes(const QList<ServerNodeInstance> &instanceList);
QObject *findView3DForInstance(const ServerNodeInstance &instance) const;