aboutsummaryrefslogtreecommitdiffstats
path: root/src/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/icons/qtcreatoricons.svg32
-rw-r--r--src/tools/qml2puppet/CMakeLists.txt36
-rw-r--r--src/tools/qml2puppet/editor3d_qt6.qrc4
-rw-r--r--src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp82
-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/EditCameraController.qml33
-rw-r--r--src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml109
-rw-r--r--src/tools/qml2puppet/mockfiles/qt6/IconGizmo.qml4
-rw-r--r--src/tools/qml2puppet/mockfiles/qt6/LookAtGizmo.qml27
-rw-r--r--src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml118
-rw-r--r--src/tools/qml2puppet/mockfiles/qt6/ReflectionProbeGizmo.qml9
-rw-r--r--src/tools/qml2puppet/mockfiles/qt6/SceneView3D.qml10
-rw-r--r--src/tools/qml2puppet/qml2puppet/appmetadata.cpp51
-rw-r--r--src/tools/qml2puppet/qml2puppet/appmetadata.h55
-rw-r--r--src/tools/qml2puppet/qml2puppet/configcrashpad.h1
-rw-r--r--src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp156
-rw-r--r--src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h18
-rw-r--r--src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.cpp62
-rw-r--r--src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.h42
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp5
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.h1
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserverdispatcher.cpp3
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/objectnodeinstance.cpp18
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.cpp209
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.h50
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp51
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h2
-rw-r--r--src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp4
-rw-r--r--src/tools/qml2puppet/qml2puppet/qml2puppetmain.cpp31
-rw-r--r--src/tools/qml2puppet/qml2puppet/qmlbase.h25
-rw-r--r--src/tools/qml2puppet/qml2puppet/qmlpuppet.cpp1
-rw-r--r--src/tools/qml2puppet/qml2puppet/runner/qmlruntime.cpp48
-rw-r--r--src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp4
-rw-r--r--src/tools/sdktool/addkitoperation.cpp2
35 files changed, 1010 insertions, 293 deletions
diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg
index 7d78434c75..9c62d2a0ef 100644
--- a/src/tools/icons/qtcreatoricons.svg
+++ b/src/tools/icons/qtcreatoricons.svg
@@ -3772,7 +3772,7 @@
height="100%" />
<path
id="path6795"
- d="m 16,423.5 v 11 M 26,418 16,423.5 6,418 m 0,11.5 10,5.5 10,-5.5 v -11 L 16,413 6,418.5 Z"
+ d="m 16,422.5 v 12 M 27,418 16,422.5 5,418 m 0,12.5 11,4.5 11,-4.5 v -13 L 16,413 5,417.5 Z"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linejoin:round"
sodipodi:nodetypes="cccccccccccc" />
</g>
@@ -3787,15 +3787,29 @@
width="100%"
height="100%" />
<path
- id="path4530"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linejoin:round"
- d="M 49.5,422 H 56 Z M 38,424 h 5.5 z m 11.5,2 H 56 Z"
- sodipodi:nodetypes="ccccccccc" />
+ id="path6795-3"
+ style="display:inline;fill:none;stroke:#000000;stroke-width:2;stroke-linejoin:round;stroke-linecap:round"
+ d="m 48,422.5 v 4 m 0,4 v 4 M 59,418 c 0,0 -1.6471,0.674 -3.6667,1.5 M 51.6667,421 C 49.6472,421.826 48,422.5 48,422.5 c 0,0 -1.6471,-0.674 -3.6667,-1.5 m -3.6666,-1.5 C 38.6472,418.674 37,418 37,418 m 7.3333,15.5 C 46.3528,434.326 48,435 48,435 m 11,-17.5 c 0,0 -1.6471,-0.674 -3.6667,-1.5 m -3.6666,-1.5 C 49.6472,413.674 48,413 48,413 c 0,0 -1.6471,0.674 -3.6667,1.5 M 40.6667,416 C 38.6472,416.826 37,417.5 37,417.5 v 4.333 m 0,4.334 v 4.333 c 0,0 1.6471,0.674 3.6667,1.5" />
<path
- style="fill:#000000;fill-opacity:1"
- d="m 50,420 h -3.5 c -1.5,0 -4,0.5 -4,4 0,3.5 2.5,4 4,4 H 50 c 1.5,0 2,-1 2,-1.5 v -5 C 52,421 51.5,420 50,420 Z"
- id="path4682"
- sodipodi:nodetypes="cczccccc" />
+ style="fill:#000000;stroke:#000000;stroke-width:2;stroke-linejoin:round"
+ d="M 59,421.75 V 430.5 l -8,3.25 V 425 Z"
+ id="path32048"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <g
+ id="src/plugins/extensionmanager/images/download">
+ <rect
+ y="408"
+ x="65"
+ height="16"
+ width="16"
+ id="use15-0-0"
+ style="display:inline;fill:#ffffff" />
+ <path
+ id="path7"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round"
+ d="m 67,422 h 12 m -6,-3.5 V 410 m -3,5.5 3,3 3.03461,-3"
+ sodipodi:nodetypes="ccccccc" />
</g>
<g
id="src/libs/utils/images/eyeoverlay">
diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt
index b9f1a1544c..a4e3e44174 100644
--- a/src/tools/qml2puppet/CMakeLists.txt
+++ b/src/tools/qml2puppet/CMakeLists.txt
@@ -26,10 +26,7 @@ if (NOT QT_CREATOR_API_DEFINED)
COMPONENTS Concurrent Core Gui Network PrintSupport Qml Quick Sql Widgets Xml
REQUIRED
)
-endif()
-
-if (NOT TARGET QmlPuppetCommunication)
- include(../../libs/qmlpuppetcommunication/QmlPuppetCommunication.cmake)
+ set(IS_STAND_ALONE_PUPPET_BUILD ON)
endif()
add_qtc_executable(qml2puppet
@@ -44,31 +41,20 @@ add_qtc_executable(qml2puppet
SOURCES
qml2puppet/qml2puppetmain.cpp
qml2puppet/qmlbase.h
- qml2puppet/appmetadata.cpp qml2puppet/appmetadata.h
- qml2puppet/qmlpuppet.h qml2puppet/qmlpuppet.cpp qml2puppet/configcrashpad.h
+ qml2puppet/qmlpuppet.h qml2puppet/qmlpuppet.cpp
+ qml2puppet/configcrashpad.h
qmlpuppet.qrc
PROPERTIES
OUTPUT_NAME qml2puppet-${IDE_VERSION}
)
-if (TARGET qml2puppet)
- execute_process(
- COMMAND git describe --tags --always --dirty=+
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
- RESULT_VARIABLE GIT_SHA_RESULT
- OUTPUT_VARIABLE GIT_SHA
- ERROR_VARIABLE GIT_SHA_ERROR
- OUTPUT_STRIP_TRAILING_WHITESPACE
- )
-
- #if we are not a git repository use the .tag file
- if(NOT GIT_SHA)
- file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/../../../.tag GIT_SHA LIMIT_COUNT 1)
- endif()
-
- set(IDE_REVISION_STR ${GIT_SHA})
-
- configure_file(../../app/app_version.h.cmakein app/app_version.h ESCAPE_QUOTES)
+if (IS_STAND_ALONE_PUPPET_BUILD)
+ include(../../libs/qmlpuppetcommunication/QmlPuppetCommunication.cmake)
+ configure_file(../../app/app_version.h.cmakein app/app_version.h ESCAPE_QUOTES)
+else()
+ extend_qtc_executable(qml2puppet
+ DEPENDS app_version
+ )
endif()
extend_qtc_executable(qml2puppet
@@ -107,6 +93,7 @@ extend_qtc_executable(qml2puppet
linegeometry.cpp linegeometry.h
icongizmoimageprovider.cpp icongizmoimageprovider.h
boxgeometry.cpp boxgeometry.h
+ lookatgeometry.cpp lookatgeometry.h
)
find_package(Qt6 COMPONENTS Quick3DAssetImport QUIET)
@@ -159,6 +146,7 @@ extend_qtc_executable(qml2puppet
qmltransitionnodeinstance.cpp qmltransitionnodeinstance.h
qt3dpresentationnodeinstance.cpp qt3dpresentationnodeinstance.h
qt5bakelightsnodeinstanceserver.cpp qt5bakelightsnodeinstanceserver.h
+ qt5import3dnodeinstanceserver.cpp qt5import3dnodeinstanceserver.h
qt5informationnodeinstanceserver.cpp qt5informationnodeinstanceserver.h
qt5nodeinstanceclientproxy.cpp qt5nodeinstanceclientproxy.h
qt5nodeinstanceserver.cpp qt5nodeinstanceserver.h
diff --git a/src/tools/qml2puppet/editor3d_qt6.qrc b/src/tools/qml2puppet/editor3d_qt6.qrc
index d76b1941b9..85df241f16 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>
@@ -35,6 +37,7 @@
<file>mockfiles/qt6/LightIconGizmo.qml</file>
<file>mockfiles/qt6/LightModel.qml</file>
<file>mockfiles/qt6/Line3D.qml</file>
+ <file>mockfiles/qt6/LookAtGizmo.qml</file>
<file>mockfiles/qt6/MaterialNodeView.qml</file>
<file>mockfiles/qt6/ModelNode2DImageView.qml</file>
<file>mockfiles/qt6/ModelNode3DImageView.qml</file>
@@ -50,6 +53,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/instances/nodeinstanceclientproxy.cpp b/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp
index a7ab2bf873..de07782d1c 100644
--- a/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp
+++ b/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp
@@ -131,17 +131,17 @@ void NodeInstanceClientProxy::initializeCapturedStream(const QString &fileName)
bool compareCommands(const QVariant &command, const QVariant &controlCommand)
{
- static const int informationChangedCommandType = QMetaType::type("InformationChangedCommand");
- static const int valuesChangedCommandType = QMetaType::type("ValuesChangedCommand");
- static const int valuesModifiedCommandType = QMetaType::type("ValuesModifiedCommand");
- static const int pixmapChangedCommandType = QMetaType::type("PixmapChangedCommand");
- static const int childrenChangedCommandType = QMetaType::type("ChildrenChangedCommand");
- static const int statePreviewImageChangedCommandType = QMetaType::type("StatePreviewImageChangedCommand");
- static const int componentCompletedCommandType = QMetaType::type("ComponentCompletedCommand");
- static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand");
- static const int tokenCommandType = QMetaType::type("TokenCommand");
- static const int debugOutputCommandType = QMetaType::type("DebugOutputCommand");
- static const int changeSelectionCommandType = QMetaType::type("ChangeSelectionCommand");
+ static const int informationChangedCommandType = QMetaType::fromName("InformationChangedCommand").id();
+ static const int valuesChangedCommandType = QMetaType::fromName("ValuesChangedCommand").id();
+ static const int valuesModifiedCommandType = QMetaType::fromName("ValuesModifiedCommand").id();
+ static const int pixmapChangedCommandType = QMetaType::fromName("PixmapChangedCommand").id();
+ static const int childrenChangedCommandType = QMetaType::fromName("ChildrenChangedCommand").id();
+ static const int statePreviewImageChangedCommandType = QMetaType::fromName("StatePreviewImageChangedCommand").id();
+ static const int componentCompletedCommandType = QMetaType::fromName("ComponentCompletedCommand").id();
+ static const int synchronizeCommandType = QMetaType::fromName("SynchronizeCommand").id();
+ static const int tokenCommandType = QMetaType::fromName("TokenCommand").id();
+ static const int debugOutputCommandType = QMetaType::fromName("DebugOutputCommand").id();
+ static const int changeSelectionCommandType = QMetaType::fromName("ChangeSelectionCommand").id();
if (command.typeId() == controlCommand.typeId()) {
if (command.typeId() == informationChangedCommandType)
@@ -186,8 +186,8 @@ void NodeInstanceClientProxy::writeCommand(const QVariant &command)
}
} else if (m_outputIoDevice) {
#ifdef NANOTRACE_DESIGNSTUDIO_ENABLED
- if (command.typeId() != QMetaType::type("PuppetAliveCommand")) {
- if (command.typeId() == QMetaType::type("SyncNanotraceCommand")) {
+ if (command.typeId() != QMetaType::fromName("PuppetAliveCommand").id()) {
+ if (command.typeId() == QMetaType::fromName("SyncNanotraceCommand").id()) {
SyncNanotraceCommand cmd = command.value<SyncNanotraceCommand>();
NANOTRACE_INSTANT_ARGS("Sync", "writeCommand",
{"name", cmd.name().toStdString()},
@@ -541,34 +541,34 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
{
NANOTRACE_SCOPE_ARGS("Update", "dispatchCommand", {"name", command.typeName()});
- static const int createInstancesCommandType = QMetaType::type("CreateInstancesCommand");
- static const int update3dViewStateCommand = QMetaType::type("Update3dViewStateCommand");
- static const int changeFileUrlCommandType = QMetaType::type("ChangeFileUrlCommand");
- static const int createSceneCommandType = QMetaType::type("CreateSceneCommand");
- static const int clearSceneCommandType = QMetaType::type("ClearSceneCommand");
- static const int removeInstancesCommandType = QMetaType::type("RemoveInstancesCommand");
- static const int removePropertiesCommandType = QMetaType::type("RemovePropertiesCommand");
- static const int changeBindingsCommandType = QMetaType::type("ChangeBindingsCommand");
- static const int changeValuesCommandType = QMetaType::type("ChangeValuesCommand");
- static const int changeAuxiliaryCommandType = QMetaType::type("ChangeAuxiliaryCommand");
- static const int reparentInstancesCommandType = QMetaType::type("ReparentInstancesCommand");
- static const int changeIdsCommandType = QMetaType::type("ChangeIdsCommand");
- static const int changeStateCommandType = QMetaType::type("ChangeStateCommand");
- static const int completeComponentCommandType = QMetaType::type("CompleteComponentCommand");
- static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand");
- static const int changeNodeSourceCommandType = QMetaType::type("ChangeNodeSourceCommand");
- static const int removeSharedMemoryCommandType = QMetaType::type("RemoveSharedMemoryCommand");
- static const int tokenCommandType = QMetaType::type("TokenCommand");
- static const int endPuppetCommandType = QMetaType::type("EndPuppetCommand");
- static const int changeSelectionCommandType = QMetaType::type("ChangeSelectionCommand");
- static const int inputEventCommandType = QMetaType::type("InputEventCommand");
- static const int view3DActionCommandType = QMetaType::type("View3DActionCommand");
- static const int requestModelNodePreviewImageCommandType = QMetaType::type("RequestModelNodePreviewImageCommand");
- static const int changeLanguageCommand = QMetaType::type("ChangeLanguageCommand");
- static const int changePreviewImageSizeCommand = QMetaType::type(
- "ChangePreviewImageSizeCommand");
- static const int startNanotraceCommandType = QMetaType::type("StartNanotraceCommand");
- static const int endNanotraceCommandType = QMetaType::type("EndNanotraceCommand");
+ static const int createInstancesCommandType = QMetaType::fromName("CreateInstancesCommand").id();
+ static const int update3dViewStateCommand = QMetaType::fromName("Update3dViewStateCommand").id();
+ static const int changeFileUrlCommandType = QMetaType::fromName("ChangeFileUrlCommand").id();
+ static const int createSceneCommandType = QMetaType::fromName("CreateSceneCommand").id();
+ static const int clearSceneCommandType = QMetaType::fromName("ClearSceneCommand").id();
+ static const int removeInstancesCommandType = QMetaType::fromName("RemoveInstancesCommand").id();
+ static const int removePropertiesCommandType = QMetaType::fromName("RemovePropertiesCommand").id();
+ static const int changeBindingsCommandType = QMetaType::fromName("ChangeBindingsCommand").id();
+ static const int changeValuesCommandType = QMetaType::fromName("ChangeValuesCommand").id();
+ static const int changeAuxiliaryCommandType = QMetaType::fromName("ChangeAuxiliaryCommand").id();
+ static const int reparentInstancesCommandType = QMetaType::fromName("ReparentInstancesCommand").id();
+ static const int changeIdsCommandType = QMetaType::fromName("ChangeIdsCommand").id();
+ static const int changeStateCommandType = QMetaType::fromName("ChangeStateCommand").id();
+ static const int completeComponentCommandType = QMetaType::fromName("CompleteComponentCommand").id();
+ static const int synchronizeCommandType = QMetaType::fromName("SynchronizeCommand").id();
+ static const int changeNodeSourceCommandType = QMetaType::fromName("ChangeNodeSourceCommand").id();
+ static const int removeSharedMemoryCommandType = QMetaType::fromName("RemoveSharedMemoryCommand").id();
+ static const int tokenCommandType = QMetaType::fromName("TokenCommand").id();
+ static const int endPuppetCommandType = QMetaType::fromName("EndPuppetCommand").id();
+ static const int changeSelectionCommandType = QMetaType::fromName("ChangeSelectionCommand").id();
+ static const int inputEventCommandType = QMetaType::fromName("InputEventCommand").id();
+ static const int view3DActionCommandType = QMetaType::fromName("View3DActionCommand").id();
+ static const int requestModelNodePreviewImageCommandType = QMetaType::fromName("RequestModelNodePreviewImageCommand").id();
+ static const int changeLanguageCommand = QMetaType::fromName("ChangeLanguageCommand").id();
+ static const int changePreviewImageSizeCommand = QMetaType::fromName(
+ "ChangePreviewImageSizeCommand").id();
+ static const int startNanotraceCommandType = QMetaType::fromName("StartNanotraceCommand").id();
+ static const int endNanotraceCommandType = QMetaType::fromName("EndNanotraceCommand").id();
const int commandType = command.typeId();
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/EditCameraController.qml b/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml
index 255d93e529..36d67c534d 100644
--- a/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml
+++ b/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml
@@ -26,9 +26,10 @@ Item {
readonly property vector3d _defaultCameraPosition: Qt.vector3d(0, 600, 600)
readonly property vector3d _defaultCameraRotation: Qt.vector3d(-45, 0, 0)
readonly property real _defaultCameraLookAtDistance: _defaultCameraPosition.length()
- readonly property real _keyPanAmount: _generalHelper.cameraSpeed
+ readonly property real _keyPanAmount: 1.0
property bool ignoreToolState: false
property bool flyMode: viewRoot.flyMode
+ property bool showCrosshairs: false
z: 10
anchors.fill: parent
@@ -112,7 +113,7 @@ Item {
if (resolvedResult) {
var newLookAtAndZoom = _generalHelper.approachNode(camera, _defaultCameraLookAtDistance,
- resolvedResult, view3D);
+ resolvedResult, view3d);
_lookAtPoint = newLookAtAndZoom.toVector3d();
_zoomFactor = newLookAtAndZoom.w;
storeCameraState(0);
@@ -173,11 +174,15 @@ Item {
function rotateCamera(angles)
{
+ if (flyMode)
+ showCrosshairs = true;
cameraCtrl._lookAtPoint = _generalHelper.rotateCamera(camera, angles, _lookAtPoint);
}
function moveCamera(moveVec)
{
+ if (flyMode)
+ showCrosshairs = true;
cameraCtrl._lookAtPoint = _generalHelper.moveCamera(camera, _lookAtPoint, moveVec);
}
@@ -243,12 +248,19 @@ Item {
cameraCtrl._dragging = false;
cameraCtrl.storeCameraState(0);
}
- _generalHelper.stopAllCameraMoves()
+ showCrosshairs = false;
+ _generalHelper.stopAllCameraMoves();
+ _generalHelper.setCameraSpeedModifier(1.0);
+ }
+
+ on_LookAtPointChanged: {
+ viewRoot.overlayViews[splitId].lookAtGizmo.position = _lookAtPoint;
}
Connections {
target: _generalHelper
enabled: viewRoot.activeSplit === cameraCtrl.splitId
+
function onRequestCameraMove(camera, moveVec) {
if (camera === cameraCtrl.camera) {
cameraCtrl.moveCamera(moveVec);
@@ -260,7 +272,7 @@ Item {
Image {
anchors.centerIn: parent
source: "qrc:///qtquickplugin/mockfiles/images/crosshair.png"
- visible: cameraCtrl.flyMode && viewRoot.activeSplit === cameraCtrl.splitId
+ visible: cameraCtrl.showCrosshairs && viewRoot.activeSplit === cameraCtrl.splitId
opacity: 0.7
}
@@ -317,7 +329,7 @@ Item {
onWheel: (wheel) => {
if (cameraCtrl.flyMode && cameraCtrl.splitId !== viewRoot.activeSplit)
return;
- viewRoot.activeSplit = cameraCtrl.splitId
+ viewRoot.activeSplit = cameraCtrl.splitId;
if (cameraCtrl.camera) {
// Empirically determined divisor for nice zoom
cameraCtrl.zoomRelative(wheel.angleDelta.y / -40);
@@ -326,7 +338,17 @@ Item {
}
}
+ function setCameraSpeed(event) {
+ if (event.modifiers === Qt.AltModifier)
+ _generalHelper.setCameraSpeedModifier(0.5);
+ else if (event.modifiers === Qt.ShiftModifier)
+ _generalHelper.setCameraSpeedModifier(2.0);
+ else
+ _generalHelper.setCameraSpeedModifier(1.0);
+ }
+
Keys.onPressed: (event) => {
+ setCameraSpeed(event)
event.accepted = true;
if (cameraCtrl.flyMode && event.key === Qt.Key_Space)
approachObject();
@@ -335,6 +357,7 @@ Item {
}
Keys.onReleased: (event) => {
+ setCameraSpeed(event)
event.accepted = true;
_generalHelper.stopCameraMove(cameraCtrl.getMoveVectorForKey(event.key));
}
diff --git a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml
index 23fc1c6a78..751d21c0e8 100644
--- a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml
+++ b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml
@@ -25,6 +25,7 @@ Item {
property bool showEditLight: false
property bool showGrid: true
+ property bool showLookAt: true
property bool showSelectionBox: true
property bool showIconGizmo: true
property bool showCameraFrustum: false
@@ -35,9 +36,10 @@ Item {
property color backgroundGradientColorStart: "#222222"
property color backgroundGradientColorEnd: "#999999"
property color gridColor: "#cccccc"
- property bool syncEnvBackground: false
+ property bool syncEnvBackground: true
property bool splitView: false
property bool flyMode: false
+ property bool showCameraSpeed: false
enum SelectionMode { Item, Group }
enum TransformMode { Move, Rotate, Scale }
@@ -65,6 +67,7 @@ Item {
onShowEditLightChanged: _generalHelper.storeToolState(sceneId, "showEditLight", showEditLight)
onGlobalOrientationChanged: _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation)
onShowGridChanged: _generalHelper.storeToolState(sceneId, "showGrid", showGrid);
+ onShowLookAtChanged: _generalHelper.storeToolState(sceneId, "showLookAt", showLookAt);
onSyncEnvBackgroundChanged: _generalHelper.storeToolState(sceneId, "syncEnvBackground", syncEnvBackground);
onShowSelectionBoxChanged: _generalHelper.storeToolState(sceneId, "showSelectionBox", showSelectionBox);
onShowIconGizmoChanged: _generalHelper.storeToolState(sceneId, "showIconGizmo", showIconGizmo);
@@ -165,7 +168,7 @@ Item {
break;
}
}
- showEditLight = !hasSceneLight;
+ showEditLight = !hasSceneLight && !_generalHelper.sceneHasLightProbe(sceneId);
// Don't inherit camera angles from the previous scene
for (let i = 0; i < 4; ++i)
@@ -264,16 +267,22 @@ Item {
for (var i = 0; i < 4; ++i) {
if (syncEnvBackground) {
- let bgMode = _generalHelper.sceneEnvironmentBgMode(sceneId);
- if ((!_generalHelper.sceneEnvironmentLightProbe(sceneId) && bgMode === SceneEnvironment.SkyBox)
- || (!_generalHelper.sceneEnvironmentSkyBoxCubeMap(sceneId) && bgMode === SceneEnvironment.SkyBoxCubeMap)) {
- editViews[i].sceneEnv.backgroundMode = SceneEnvironment.Color;
- } else {
- editViews[i].sceneEnv.backgroundMode = bgMode;
+ if (_generalHelper.hasSceneEnvironmentData(sceneId)) {
+ let bgMode = _generalHelper.sceneEnvironmentBgMode(sceneId);
+ if ((!_generalHelper.sceneEnvironmentLightProbe(sceneId) && bgMode === SceneEnvironment.SkyBox)
+ || (!_generalHelper.sceneEnvironmentSkyBoxCubeMap(sceneId) && bgMode === SceneEnvironment.SkyBoxCubeMap)) {
+ editViews[i].sceneEnv.backgroundMode = SceneEnvironment.Color;
+ } else {
+ editViews[i].sceneEnv.backgroundMode = bgMode;
+ }
+ editViews[i].sceneEnv.lightProbe = _generalHelper.sceneEnvironmentLightProbe(sceneId);
+ editViews[i].sceneEnv.skyBoxCubeMap = _generalHelper.sceneEnvironmentSkyBoxCubeMap(sceneId);
+ editViews[i].sceneEnv.clearColor = _generalHelper.sceneEnvironmentColor(sceneId);
+ } else if (activeScene) {
+ _generalHelper.updateSceneEnvToLast(editViews[i].sceneEnv,
+ editViews[i].defaultLightProbe,
+ editViews[i].defaultCubeMap);
}
- editViews[i].sceneEnv.lightProbe = _generalHelper.sceneEnvironmentLightProbe(sceneId);
- editViews[i].sceneEnv.skyBoxCubeMap = _generalHelper.sceneEnvironmentSkyBoxCubeMap(sceneId);
- editViews[i].sceneEnv.clearColor = _generalHelper.sceneEnvironmentColor(sceneId);
} else {
editViews[i].sceneEnv.backgroundMode = SceneEnvironment.Transparent;
editViews[i].sceneEnv.lightProbe = null;
@@ -297,11 +306,16 @@ Item {
else if (resetToDefault)
showGrid = true;
+ if ("showLookAt" in toolStates)
+ showLookAt = toolStates.showLookAt;
+ else if (resetToDefault)
+ showLookAt = true;
+
if ("syncEnvBackground" in toolStates) {
syncEnvBackground = toolStates.syncEnvBackground;
updateEnvBackground();
} else if (resetToDefault) {
- syncEnvBackground = false;
+ syncEnvBackground = true;
updateEnvBackground();
}
@@ -353,10 +367,13 @@ Item {
cameraControls[i].restoreDefaultState();
}
- if ("flyMode" in toolStates)
+ if ("flyMode" in toolStates) {
flyMode = toolStates.flyMode;
- else if (resetToDefault)
+ viewRoot.showCameraSpeed = false;
+ } else if (resetToDefault) {
flyMode = false;
+ viewRoot.showCameraSpeed = false;
+ }
if ("splitView" in toolStates)
splitView = toolStates.splitView;
@@ -383,6 +400,7 @@ Item {
{
_generalHelper.storeToolState(sceneId, "showEditLight", showEditLight)
_generalHelper.storeToolState(sceneId, "showGrid", showGrid)
+ _generalHelper.storeToolState(sceneId, "showLookAt", showLookAt)
_generalHelper.storeToolState(sceneId, "syncEnvBackground", syncEnvBackground)
_generalHelper.storeToolState(sceneId, "showSelectionBox", showSelectionBox)
_generalHelper.storeToolState(sceneId, "showIconGizmo", showIconGizmo)
@@ -519,6 +537,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)
@@ -543,6 +567,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)
@@ -567,6 +597,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)
@@ -638,7 +674,6 @@ Item {
{
for (var i = 0; i < 4; ++i)
overlayViews[i].handleHiddenStateChange(node);
-
}
function onUpdateDragTooltip()
@@ -651,6 +686,18 @@ Item {
{
updateEnvBackground();
}
+
+ function onCameraSpeedChanged() {
+ _generalHelper.requestTimerEvent("hideSpeed", 1000);
+ viewRoot.showCameraSpeed = true
+ }
+
+ function onRequestedTimerEvent(timerId) {
+ if (timerId === "hideSpeed") {
+ viewRoot.showCameraSpeed = false;
+ _generalHelper.requestRender();
+ }
+ }
}
// Shared nodes of the overlay, set as importScene on all overlay views.
@@ -1058,6 +1105,38 @@ Item {
color: "white"
visible: viewRoot.fps > 0
}
+
+ Rectangle {
+ id: cameraSpeedLabel
+ width: 120
+ height: 65
+ anchors.centerIn: parent
+ opacity: 0.6
+ radius: 10
+ color: "white"
+ visible: flyMode && viewRoot.showCameraSpeed
+ enabled: false
+
+ Column {
+ anchors.fill: parent
+ anchors.margins: 8
+ spacing: 2
+ Text {
+ width: parent.width
+ horizontalAlignment: Text.AlignHCenter
+ text: "Camera Speed"
+ font.pixelSize: 16
+ }
+ Text {
+ width: parent.width
+ height: 20
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ font.pixelSize: 20
+ text: _generalHelper.cameraSpeed.toLocaleString(Qt.locale(), 'f', 1)
+ }
+ }
+ }
}
Keys.onPressed: (event) => {
diff --git a/src/tools/qml2puppet/mockfiles/qt6/IconGizmo.qml b/src/tools/qml2puppet/mockfiles/qt6/IconGizmo.qml
index acde896aeb..50c4aab1e7 100644
--- a/src/tools/qml2puppet/mockfiles/qt6/IconGizmo.qml
+++ b/src/tools/qml2puppet/mockfiles/qt6/IconGizmo.qml
@@ -29,7 +29,7 @@ Item {
property alias iconSource: iconImage.source
- signal clicked(Node node, bool multi)
+ signal clicked(Node node, int button, bool multi)
function hasPoint(x, y)
{
@@ -83,7 +83,7 @@ Item {
}
onClicked: (mouse)=> {
- iconGizmo.clicked(iconGizmo.targetNode,
+ iconGizmo.clicked(iconGizmo.targetNode, mouse.button,
mouse.modifiers & Qt.ControlModifier);
}
hoverEnabled: iconGizmo.highlightOnHover && !iconGizmo.selected
diff --git a/src/tools/qml2puppet/mockfiles/qt6/LookAtGizmo.qml b/src/tools/qml2puppet/mockfiles/qt6/LookAtGizmo.qml
new file mode 100644
index 0000000000..71527d9fb3
--- /dev/null
+++ b/src/tools/qml2puppet/mockfiles/qt6/LookAtGizmo.qml
@@ -0,0 +1,27 @@
+// 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
+import LookAtGeometry
+
+Node {
+ id: root
+
+ property alias crossScale: lookAtGeometry.crossScale
+ property alias color: lookAtMat.baseColor
+
+ Model {
+ readonly property bool _edit3dLocked: true // Make this non-pickable
+ geometry: LookAtGeometry {
+ id: lookAtGeometry
+ }
+ materials: [
+ PrincipledMaterial {
+ id: lookAtMat
+ lighting: DefaultMaterial.NoLighting
+ cullMode: Material.NoCulling
+ }
+ ]
+ }
+}
diff --git a/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml b/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml
index 13a37f4f72..464e0b6b79 100644
--- a/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml
+++ b/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml
@@ -12,6 +12,7 @@ View3D {
property alias rotateGizmo: rotateGizmo
property alias scaleGizmo: scaleGizmo
property alias lightGizmo: lightGizmo
+ property alias lookAtGizmo: lookAtGizmo
property var viewRoot: null
property View3D editView: null
@@ -21,6 +22,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 +290,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 +433,12 @@ View3D {
return;
}
}
+ for (i = 0; i < reflectionProbeGizmos.length; ++i) {
+ if (reflectionProbeGizmos[i].targetNode === node) {
+ reflectionProbeGizmos[i].hidden = _generalHelper.isHidden(node);
+ return;
+ }
+ }
}
SceneEnvironment {
@@ -402,6 +485,12 @@ View3D {
position: pivotLine.startPos
}
+ AutoScaleHelper {
+ id: lookAtAutoScale
+ view3D: overlayView
+ position: lookAtGizmo.scenePosition
+ }
+
MoveGizmo {
id: moveGizmo
scale: autoScale.getScale(Qt.vector3d(5, 5, 5))
@@ -537,5 +626,14 @@ View3D {
]
}
}
+
+ LookAtGizmo {
+ id: lookAtGizmo
+ color: "#ddd600"
+ scale: lookAtAutoScale.getScale(Qt.vector3d(10, 10, 10))
+ visible: overlayView.viewRoot.showLookAt
+ && overlayView.isActive
+ && !overlayView.viewRoot.cameraControls[viewRoot.activeSplit].showCrosshairs
+ }
}
}
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/mockfiles/qt6/SceneView3D.qml b/src/tools/qml2puppet/mockfiles/qt6/SceneView3D.qml
index 1de1cebd14..82c735467e 100644
--- a/src/tools/qml2puppet/mockfiles/qt6/SceneView3D.qml
+++ b/src/tools/qml2puppet/mockfiles/qt6/SceneView3D.qml
@@ -15,6 +15,8 @@ View3D {
property alias perspectiveCamera: scenePerspectiveCamera
property alias orthoCamera: sceneOrthoCamera
property alias sceneEnv: sceneEnv
+ property alias defaultLightProbe: defaultLightProbe
+ property alias defaultCubeMap: defaultCubeMap
property vector3d cameraLookAt
property var selectionBoxes: []
property Node selectedNode
@@ -61,6 +63,14 @@ View3D {
id: sceneEnv
antialiasingMode: SceneEnvironment.MSAA
antialiasingQuality: SceneEnvironment.High
+
+ Texture {
+ id: defaultLightProbe
+ }
+
+ CubeMapTexture {
+ id: defaultCubeMap
+ }
}
Node {
diff --git a/src/tools/qml2puppet/qml2puppet/appmetadata.cpp b/src/tools/qml2puppet/qml2puppet/appmetadata.cpp
deleted file mode 100644
index 1896e4db92..0000000000
--- a/src/tools/qml2puppet/qml2puppet/appmetadata.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2022 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
-
-#include "appmetadata.h"
-
-#include <app/app_version.h>
-
-namespace QDSMeta::AppInfo {
-
-void printAppInfo()
-{
- qInfo() << Qt::endl
- << "<< QDS Meta Info >>" << Qt::endl
- << "App Info" << Qt::endl
- << " - Name :" << Core::Constants::IDE_ID << Qt::endl
- << " - Version :" << Core::Constants::IDE_VERSION_DISPLAY << Qt::endl
- << " - Author :" << Core::Constants::IDE_AUTHOR << Qt::endl
- << " - Year :" << Core::Constants::IDE_YEAR << Qt::endl
- << " - App :" << QCoreApplication::applicationName() << Qt::endl
- << "Build Info " << Qt::endl
- << " - Date :" << __DATE__ << Qt::endl
- << " - Commit :" << QStringLiteral(QDS_STRINGIFY(IDE_REVISION_STR)) << Qt::endl
- << " - Qt Version :" << QT_VERSION_STR << Qt::endl
- << "Compiler Info " << Qt::endl
-#if defined(__GNUC__)
- << " - GCC :" << __GNUC__ << Qt::endl
- << " - GCC Minor :" << __GNUC_MINOR__ << Qt::endl
- << " - GCC Patch :" << __GNUC_PATCHLEVEL__ << Qt::endl
-#endif
-#if defined(_MSC_VER)
- << " - MSC Short :" << _MSC_VER << Qt::endl
- << " - MSC Full :" << _MSC_FULL_VER << Qt::endl
-#endif
-#if defined(__clang__)
- << " - clang maj :" << __clang_major__ << Qt::endl
- << " - clang min :" << __clang_minor__ << Qt::endl
- << " - clang patch :" << __clang_patchlevel__ << Qt::endl
-#endif
- << "<< End Of QDS Meta Info >>" << Qt::endl;
- exit(0);
-}
-
-void registerAppInfo(const QString &appName)
-{
- QCoreApplication::setOrganizationName(Core::Constants::IDE_AUTHOR);
- QCoreApplication::setOrganizationDomain("qt-project.org");
- QCoreApplication::setApplicationName(appName);
- QCoreApplication::setApplicationVersion(Core::Constants::IDE_VERSION_LONG);
-}
-
-} // namespace QDSMeta::AppInfo
diff --git a/src/tools/qml2puppet/qml2puppet/appmetadata.h b/src/tools/qml2puppet/qml2puppet/appmetadata.h
deleted file mode 100644
index 18eb650461..0000000000
--- a/src/tools/qml2puppet/qml2puppet/appmetadata.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2022 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
-#pragma once
-
-#include <QCommandLineParser>
-#include <QLoggingCategory>
-
-// Common functions can be used in all QDS apps
-namespace QDSMeta {
-
-namespace Logging {
-inline Q_LOGGING_CATEGORY(deprecated, "qt.tools.qds.deprecated");
-inline Q_LOGGING_CATEGORY(verbose1, "qt.tools.qds.verbose1");
-inline Q_LOGGING_CATEGORY(verbose2, "qt.tools.qds.verbose2");
-
-inline void registerMessageHandler()
-{
- qInstallMessageHandler(
- [](QtMsgType type, const QMessageLogContext &context, const QString &msg) {
- auto tPrinter = [&](const QString &msgPrefix) {
- fprintf(stderr,
- "%s: %s (%s:%u, %s)\n",
- msgPrefix.toLocal8Bit().constData(),
- msg.toLocal8Bit().constData(),
- context.file,
- context.line,
- context.function);
- };
-
- if (type == QtDebugMsg)
- tPrinter("Debug");
- else if (type == QtInfoMsg)
- tPrinter("Info");
- else if (type == QtWarningMsg)
- tPrinter("Warning");
- else if (type == QtCriticalMsg)
- tPrinter("Critical");
- else if (type == QtFatalMsg) {
- tPrinter("Fatal");
- abort();
- }
- });
-}
-} // namespace Logging
-
-namespace AppInfo {
-
-#define STRINGIFY_INTERNAL(x) #x
-#define QDS_STRINGIFY(x) STRINGIFY_INTERNAL(x)
-
-void printAppInfo();
-void registerAppInfo(const QString &appName);
-
-} // namespace AppInfo
-} // namespace QDSMeta
diff --git a/src/tools/qml2puppet/qml2puppet/configcrashpad.h b/src/tools/qml2puppet/qml2puppet/configcrashpad.h
index 70cbfc5f4a..b802b80957 100644
--- a/src/tools/qml2puppet/qml2puppet/configcrashpad.h
+++ b/src/tools/qml2puppet/qml2puppet/configcrashpad.h
@@ -5,6 +5,7 @@
#include <QtGlobal>
#if defined(ENABLE_CRASHPAD) && defined(Q_OS_WIN)
+#include <QDir>
#define NOMINMAX
#include "client/crash_report_database.h"
#include "client/crashpad_client.h"
diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp
index dadd817633..3baf91c146 100644
--- a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp
+++ b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp
@@ -6,6 +6,8 @@
#include "selectionboxgeometry.h"
+#include <enumeration.h>
+
#include <QGuiApplication>
#include <QtQuick3D/qquick3dobject.h>
#include <QtQuick3D/private/qquick3dorthographiccamera_p.h>
@@ -42,9 +44,17 @@
namespace QmlDesigner {
namespace Internal {
-const QString _globalStateId = QStringLiteral("@GTS"); // global tool state
+const QString _globalStateId = QStringLiteral("@GTS"); // global tool state (within document)
+const QString _projectStateId = QStringLiteral("@PTS"); // project wide tool state
const QString _lastSceneIdKey = QStringLiteral("lastSceneId");
const QString _rootSizeKey = QStringLiteral("rootSize");
+const QString _lastSceneEnvKey = QStringLiteral("lastSceneEnv");
+
+const QString _lightProbeProp = QStringLiteral("lightProbe");
+const QString _sourceProp = QStringLiteral("source");
+const QString _cubeProp = QStringLiteral("skyBoxCubeMap");
+const QString _bgProp = QStringLiteral("backgroundMode");
+const QString _colorProp = QStringLiteral("clearColor");
static const float floatMin = std::numeric_limits<float>::lowest();
static const float floatMax = std::numeric_limits<float>::max();
@@ -163,16 +173,17 @@ QVector3D GeneralHelper::moveCamera(QQuick3DCamera *camera, const QVector3D &sta
if (moveVector.length() < 0.001f)
return startLookAt;
+ QVector3D speedVector = moveVector * m_cameraSpeed * m_cameraSpeedModifier;
+
QMatrix4x4 m = camera->sceneTransform(); // Works because edit camera is at scene root
const float *dataPtr(m.data());
const QVector3D xAxis = QVector3D(dataPtr[0], dataPtr[1], dataPtr[2]).normalized();
const QVector3D yAxis = QVector3D(dataPtr[4], dataPtr[5], dataPtr[6]).normalized();
const QVector3D zAxis = QVector3D(dataPtr[8], dataPtr[9], dataPtr[10]).normalized();
- const QVector3D xDelta = xAxis * moveVector.x();
- const QVector3D yDelta = yAxis * moveVector.y();
- const QVector3D zDelta = zAxis * moveVector.z();
- // Delta multiplier for nice default speed in default scene
- const QVector3D delta = (yDelta - xDelta - zDelta) * .5f;
+ const QVector3D xDelta = xAxis * speedVector.x();
+ const QVector3D yDelta = yAxis * speedVector.y();
+ const QVector3D zDelta = zAxis * speedVector.z();
+ const QVector3D delta = (yDelta - xDelta - zDelta);
camera->setPosition(camera->position() + delta);
@@ -451,17 +462,19 @@ QVector4D GeneralHelper::approachNode(
// a selection box for bound calculations to work. This is used to focus the view for
// various preview image generations, where doing things asynchronously is not good
// and recalculating bounds for every frame is not a problem.
-void GeneralHelper::calculateNodeBoundsAndFocusCamera(
- QQuick3DCamera *camera, QQuick3DNode *node, QQuick3DViewport *viewPort,
- float defaultLookAtDistance, bool closeUp)
+void GeneralHelper::calculateBoundsAndFocusCamera(QQuick3DCamera *camera, QQuick3DNode *node,
+ QQuick3DViewport *viewPort,
+ float defaultLookAtDistance,
+ bool closeUp, QVector3D &lookAt,
+ QVector3D &extents)
{
QVector3D minBounds;
QVector3D maxBounds;
getBounds(viewPort, node, minBounds, maxBounds);
- QVector3D extents = maxBounds - minBounds;
- QVector3D lookAt = minBounds + (extents / 2.f);
+ extents = maxBounds - minBounds;
+ lookAt = minBounds + (extents / 2.f);
float maxExtent = qSqrt(qreal(extents.x()) * qreal(extents.x())
+ qreal(extents.y()) * qreal(extents.y())
+ qreal(extents.z()) * qreal(extents.z()));
@@ -494,10 +507,20 @@ void GeneralHelper::calculateNodeBoundsAndFocusCamera(
perspectiveCamera->setClipNear(minDist * 0.99);
perspectiveCamera->setClipFar(maxDist * 1.01);
}
-
}
}
+void GeneralHelper::calculateNodeBoundsAndFocusCamera(QQuick3DCamera *camera, QQuick3DNode *node,
+ QQuick3DViewport *viewPort,
+ float defaultLookAtDistance,
+ bool closeUp)
+{
+ QVector3D extents;
+ QVector3D lookAt;
+ calculateBoundsAndFocusCamera(camera, node, viewPort, defaultLookAtDistance, closeUp,
+ lookAt, extents);
+}
+
// Aligns any cameras found in nodes list to a camera.
// Only position and rotation are copied, rest of the camera properties stay the same.
void GeneralHelper::alignCameras(QQuick3DCamera *camera, const QVariant &nodes)
@@ -738,6 +761,11 @@ void GeneralHelper::setSceneEnvironmentData(const QString &sceneId,
}
}
+bool GeneralHelper::hasSceneEnvironmentData(const QString &sceneId) const
+{
+ return m_sceneEnvironmentData.contains(sceneId);
+}
+
QQuick3DSceneEnvironment::QQuick3DEnvironmentBackgroundTypes GeneralHelper::sceneEnvironmentBgMode(
const QString &sceneId) const
{
@@ -759,6 +787,69 @@ QQuick3DCubeMapTexture *GeneralHelper::sceneEnvironmentSkyBoxCubeMap(const QStri
return m_sceneEnvironmentData[sceneId].skyBoxCubeMap.data();
}
+void GeneralHelper::updateSceneEnvToLast(QQuick3DSceneEnvironment *env, QQuick3DTexture *lightProbe,
+ QQuick3DCubeMapTexture *cubeMap)
+{
+ if (!env)
+ return;
+
+ if (m_lastSceneEnvData.contains(_bgProp)) {
+ Enumeration enumeration = m_lastSceneEnvData[_bgProp].value<Enumeration>();
+ QMetaEnum me = QMetaEnum::fromType<QQuick3DSceneEnvironment::QQuick3DEnvironmentBackgroundTypes>();
+ int intValue = me.keyToValue(enumeration.toName());
+ env->setBackgroundMode(QQuick3DSceneEnvironment::QQuick3DEnvironmentBackgroundTypes(intValue));
+ } else {
+ env->setBackgroundMode(QQuick3DSceneEnvironment::Transparent);
+ }
+
+ if (m_lastSceneEnvData.contains(_colorProp))
+ env->setClearColor(m_lastSceneEnvData[_colorProp].value<QColor>());
+ else
+ env->setClearColor(Qt::transparent);
+
+ if (lightProbe) {
+ if (m_lastSceneEnvData.contains(_lightProbeProp)) {
+ QVariantMap props = m_lastSceneEnvData[_lightProbeProp].toMap();
+ if (props.contains(_sourceProp))
+ lightProbe->setSource(props[_sourceProp].toUrl());
+ else
+ lightProbe->setSource({});
+ env->setLightProbe(lightProbe);
+ } else {
+ env->setLightProbe(nullptr);
+ }
+ }
+
+ if (cubeMap) {
+ if (m_lastSceneEnvData.contains(_cubeProp)) {
+ QVariantMap props = m_lastSceneEnvData[_cubeProp].toMap();
+ if (props.contains(_sourceProp))
+ cubeMap->setSource(props[_sourceProp].toUrl());
+ else
+ cubeMap->setSource({});
+ env->setSkyBoxCubeMap(cubeMap);
+ } else {
+ env->setSkyBoxCubeMap(nullptr);
+ }
+ }
+}
+
+bool GeneralHelper::sceneHasLightProbe(const QString &sceneId)
+{
+ // From editor perspective, a scene is considered to have a light probe if scene itself
+ // has a light probe or scene has no env data and last scene had a light probe
+ if (m_sceneEnvironmentData.contains(sceneId)) {
+ return bool(m_sceneEnvironmentData[sceneId].lightProbe);
+ } else {
+ if (m_lastSceneEnvData.contains(_lightProbeProp)) {
+ QVariantMap props = m_lastSceneEnvData[_sourceProp].toMap();
+ if (props.contains(_sourceProp))
+ return !props[_sourceProp].toUrl().isEmpty();
+ }
+ }
+ return false;
+}
+
void GeneralHelper::clearSceneEnvironmentData()
{
for (const SceneEnvData &data : std::as_const(m_sceneEnvironmentData)) {
@@ -772,6 +863,12 @@ void GeneralHelper::clearSceneEnvironmentData()
emit sceneEnvDataChanged();
}
+void GeneralHelper::setLastSceneEnvironmentData(const QVariantMap &data)
+{
+ m_lastSceneEnvData = data;
+ storeToolState(_projectStateId, _lastSceneEnvKey, m_lastSceneEnvData);
+}
+
void GeneralHelper::initToolStates(const QString &sceneId, const QVariantMap &toolStates)
{
m_toolStates[sceneId] = toolStates;
@@ -796,11 +893,21 @@ QString GeneralHelper::globalStateId() const
return _globalStateId;
}
+QString GeneralHelper::projectStateId() const
+{
+ return _projectStateId;
+}
+
QString GeneralHelper::lastSceneIdKey() const
{
return _lastSceneIdKey;
}
+QString GeneralHelper::lastSceneEnvKey() const
+{
+ return _lastSceneEnvKey;
+}
+
QString GeneralHelper::rootSizeKey() const
{
return _rootSizeKey;
@@ -1187,6 +1294,11 @@ void GeneralHelper::setCameraSpeed(double speed)
}
}
+void GeneralHelper::setCameraSpeedModifier(double modifier)
+{
+ m_cameraSpeedModifier = modifier;
+}
+
QString GeneralHelper::formatVectorDragTooltip(const QVector3D &vec, const QString &suffix) const
{
return QObject::tr("x:%L1 y:%L2 z:%L3%L4")
@@ -1414,6 +1526,26 @@ bool GeneralHelper::compareQuaternions(const QQuaternion &q1, const QQuaternion
&& qFuzzyCompare(q1.z(), q2.z()) && qFuzzyCompare(q1.scalar(), q2.scalar());
}
+void GeneralHelper::requestTimerEvent(const QString &timerId, qint64 delay)
+{
+ if (m_eventTimers.contains(timerId)) {
+ m_eventTimers[timerId]->start(delay);
+ } else {
+ auto timer = new QTimer;
+ timer->setInterval(delay);
+ timer->setSingleShot(true);
+ connect(timer, &QTimer::timeout, this, [this, timerId]() {
+ if (m_eventTimers.contains(timerId)) {
+ QTimer *timer = m_eventTimers.take(timerId);
+ timer->deleteLater();
+ }
+ emit requestedTimerEvent(timerId);
+ });
+ m_eventTimers[timerId] = timer;
+ timer->start(delay);
+ }
+}
+
}
}
diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h
index 62a95d86a6..f1b57f4122 100644
--- a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h
+++ b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h
@@ -72,6 +72,9 @@ public:
bool closeUp = false);
Q_INVOKABLE QVector4D approachNode(QQuick3DCamera *camera, float defaultLookAtDistance,
QObject *node, QQuick3DViewport *viewPort);
+ void calculateBoundsAndFocusCamera(QQuick3DCamera *camera, QQuick3DNode *node,
+ QQuick3DViewport *viewPort, float defaultLookAtDistance,
+ bool closeUp, QVector3D &lookAt, QVector3D &extents);
Q_INVOKABLE void calculateNodeBoundsAndFocusCamera(QQuick3DCamera *camera, QQuick3DNode *node,
QQuick3DViewport *viewPort,
float defaultLookAtDistance, bool closeUp);
@@ -96,7 +99,9 @@ public:
Q_INVOKABLE void enableItemUpdate(QQuickItem *item, bool enable);
Q_INVOKABLE QVariantMap getToolStates(const QString &sceneId);
QString globalStateId() const;
+ QString projectStateId() const;
QString lastSceneIdKey() const;
+ QString lastSceneEnvKey() const;
QString rootSizeKey() const;
Q_INVOKABLE void setMultiSelectionTargets(QQuick3DNode *multiSelectRootNode,
@@ -109,12 +114,18 @@ public:
Q_INVOKABLE void rotateMultiSelection(bool commit);
void setSceneEnvironmentData(const QString &sceneId, QQuick3DSceneEnvironment *env);
+ Q_INVOKABLE bool hasSceneEnvironmentData(const QString &sceneId) const;
Q_INVOKABLE QQuick3DSceneEnvironment::QQuick3DEnvironmentBackgroundTypes sceneEnvironmentBgMode(
const QString &sceneId) const;
Q_INVOKABLE QColor sceneEnvironmentColor(const QString &sceneId) const;
Q_INVOKABLE QQuick3DTexture *sceneEnvironmentLightProbe(const QString &sceneId) const;
Q_INVOKABLE QQuick3DCubeMapTexture *sceneEnvironmentSkyBoxCubeMap(const QString &sceneId) const;
+ Q_INVOKABLE void updateSceneEnvToLast(QQuick3DSceneEnvironment *env, QQuick3DTexture *lightProbe,
+ QQuick3DCubeMapTexture *cubeMap);
+ Q_INVOKABLE bool sceneHasLightProbe(const QString &sceneId);
+
void clearSceneEnvironmentData();
+ void setLastSceneEnvironmentData(const QVariantMap &data);
bool isMacOS() const;
@@ -139,6 +150,7 @@ public:
void setSnapRotationInterval(double interval) { m_snapRotationInterval = interval; }
void setSnapScaleInterval(double interval) { m_snapScaleInterval = interval / 100.; }
void setCameraSpeed(double speed);
+ Q_INVOKABLE void setCameraSpeedModifier(double modifier);
Q_INVOKABLE QString snapPositionDragTooltip(const QVector3D &pos) const;
Q_INVOKABLE QString snapRotationDragTooltip(double angle) const;
@@ -154,6 +166,8 @@ public:
Q_INVOKABLE bool compareVectors(const QVector3D &v1, const QVector3D &v2) const;
Q_INVOKABLE bool compareQuaternions(const QQuaternion &q1, const QQuaternion &q2) const;
+ Q_INVOKABLE void requestTimerEvent(const QString &timerId, qint64 delay);
+
signals:
void overlayUpdateNeeded();
void toolStateChanged(const QString &sceneId, const QString &tool, const QVariant &toolState);
@@ -167,6 +181,7 @@ signals:
void requestCameraMove(QQuick3DCamera *camera, const QVector3D &moveVector);
void requestRender();
void cameraSpeedChanged();
+ void requestedTimerEvent(const QString &timerId);
private:
void handlePendingToolStateUpdate();
@@ -198,6 +213,7 @@ private:
QPointer<QQuick3DCubeMapTexture> skyBoxCubeMap;
};
QHash<QString, SceneEnvData> m_sceneEnvironmentData;
+ QVariantMap m_lastSceneEnvData;
struct MultiSelData {
QVector3D startScenePos;
@@ -221,8 +237,10 @@ private:
double m_snapRotationInterval = 5.;
double m_snapScaleInterval = .1;
double m_cameraSpeed = 10.;
+ double m_cameraSpeedModifier = 1.;
QVariant m_bgColor;
+ QHash<QString, QTimer *> m_eventTimers;
};
}
diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.cpp b/src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.cpp
new file mode 100644
index 0000000000..b569f6ea5a
--- /dev/null
+++ b/src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.cpp
@@ -0,0 +1,62 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#ifdef QUICK3D_MODULE
+
+#include "lookatgeometry.h"
+
+namespace QmlDesigner::Internal {
+
+LookAtGeometry::LookAtGeometry()
+ : GeometryBase()
+ , m_crossScale(1.f, 1.f, 1.f)
+{
+}
+
+LookAtGeometry::~LookAtGeometry()
+{
+}
+
+QVector3D LookAtGeometry::crossScale() const
+{
+ return m_crossScale;
+}
+
+void LookAtGeometry::setCrossScale(const QVector3D &scale)
+{
+ if (scale != m_crossScale) {
+ m_crossScale = scale;
+ emit crossScaleChanged();
+ updateGeometry();
+ }
+}
+
+void LookAtGeometry::doUpdateGeometry()
+{
+ GeometryBase::doUpdateGeometry();
+
+ QByteArray vertexData;
+ vertexData.resize(6 * 3 * 4); // 6 vertices of 3 floats each 4 bytes
+ float *dataPtr = reinterpret_cast<float *>(vertexData.data());
+
+ auto addVertex = [&dataPtr](float x, float y, float z) {
+ dataPtr[0] = x;
+ dataPtr[1] = y;
+ dataPtr[2] = z;
+ dataPtr += 3;
+ };
+
+ addVertex(m_crossScale.x(), 0.f, 0.f);
+ addVertex(-m_crossScale.x(), 0.f, 0.f);
+ addVertex(0.f, m_crossScale.y(), 0.f);
+ addVertex(0.f, -m_crossScale.y(), 0.f);
+ addVertex(0.f, 0.f, m_crossScale.z());
+ addVertex(0.f, 0.f, -m_crossScale.z());
+
+ setVertexData(vertexData);
+ setBounds(-m_crossScale, m_crossScale);
+}
+
+} // namespace QmlDesigner::Internal
+
+#endif // QUICK3D_MODULE
diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.h b/src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.h
new file mode 100644
index 0000000000..e881c2750e
--- /dev/null
+++ b/src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.h
@@ -0,0 +1,42 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#pragma once
+
+#ifdef QUICK3D_MODULE
+
+#include "geometrybase.h"
+
+#include <QtGui/QVector3D>
+
+namespace QmlDesigner::Internal {
+
+class LookAtGeometry : public GeometryBase
+{
+ Q_OBJECT
+ Q_PROPERTY(QVector3D crossScale READ crossScale WRITE setCrossScale NOTIFY crossScaleChanged)
+
+public:
+ LookAtGeometry();
+ ~LookAtGeometry() override;
+
+ QVector3D crossScale() const;
+
+public slots:
+ void setCrossScale(const QVector3D &pos);
+
+signals:
+ void crossScaleChanged();
+
+protected:
+ void doUpdateGeometry() override;
+
+private:
+ QVector3D m_crossScale;
+};
+
+} // namespace QmlDesigner::Internal
+
+QML_DECLARE_TYPE(QmlDesigner::Internal::LookAtGeometry)
+
+#endif // QUICK3D_MODULE
diff --git a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp
index f3227e386c..0f7133b1ff 100644
--- a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp
+++ b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp
@@ -1187,8 +1187,9 @@ InformationChangedCommand NodeInstanceServer::createAllInformationChangedCommand
static bool supportedVariantType(int type)
{
- return type < int(QVariant::UserType) && type != QMetaType::QObjectStar
- && type != QMetaType::QModelIndex && type != QMetaType::VoidStar;
+ return (type < int(QVariant::UserType) && type != QMetaType::QObjectStar
+ && type != QMetaType::QModelIndex && type != QMetaType::VoidStar)
+ || type == QMetaType::fromType<Enumeration>().id();
}
ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const
diff --git a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.h
index 65542dedc2..09c87b3af9 100644
--- a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.h
+++ b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.h
@@ -258,6 +258,7 @@ protected:
void setRenderTimerInterval(int timerInterval);
int renderTimerInterval() const;
void setSlowRenderTimerInterval(int timerInterval);
+ TimerMode timerMode() const { return m_timerMode; }
virtual void initializeView() = 0;
virtual void initializeAuxiliaryViews();
diff --git a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserverdispatcher.cpp b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserverdispatcher.cpp
index 9815d21ac4..9e3cdac151 100644
--- a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserverdispatcher.cpp
+++ b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserverdispatcher.cpp
@@ -6,6 +6,7 @@
#include "qt5bakelightsnodeinstanceserver.h"
#include "qt5captureimagenodeinstanceserver.h"
#include "qt5capturepreviewnodeinstanceserver.h"
+#include "qt5import3dnodeinstanceserver.h"
#include "qt5informationnodeinstanceserver.h"
#include "qt5rendernodeinstanceserver.h"
@@ -173,6 +174,8 @@ std::unique_ptr<NodeInstanceServer> createNodeInstanceServer(
return std::make_unique<Qt5PreviewNodeInstanceServer>(nodeInstanceClient);
else if (serverName == "bakelightsmode")
return std::make_unique<Qt5BakeLightsNodeInstanceServer>(nodeInstanceClient);
+ else if (serverName == "import3dmode")
+ return std::make_unique<Qt5Import3dNodeInstanceServer>(nodeInstanceClient);
return {};
}
diff --git a/src/tools/qml2puppet/qml2puppet/instances/objectnodeinstance.cpp b/src/tools/qml2puppet/qml2puppet/instances/objectnodeinstance.cpp
index a1c727f215..2a673bb2e9 100644
--- a/src/tools/qml2puppet/qml2puppet/instances/objectnodeinstance.cpp
+++ b/src/tools/qml2puppet/qml2puppet/instances/objectnodeinstance.cpp
@@ -7,6 +7,7 @@
#include <qmlprivategate.h>
#include <QDebug>
+#include <QDir>
#include <QEvent>
#include <QQmlContext>
#include <QQmlError>
@@ -372,7 +373,7 @@ void ObjectNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParentIn
QVariant ObjectNodeInstance::convertSpecialCharacter(const QVariant& value) const
{
QVariant specialCharacterConvertedValue = value;
- if (value.typeId() == QVariant::String) {
+ if (value.typeId() == QMetaType::QString) {
QString string = value.toString();
string.replace(QLatin1String("\\n"), QLatin1String("\n"));
string.replace(QLatin1String("\\t"), QLatin1String("\t"));
@@ -470,7 +471,7 @@ void ObjectNodeInstance::setPropertyVariant(const PropertyName &name, const QVar
QVariant oldValue = property.read();
- if (oldValue.typeId() == QVariant::Url) {
+ if (oldValue.typeId() == QMetaType::QUrl) {
QUrl url = oldValue.toUrl();
QString path = url.toLocalFile();
if (QFileInfo::exists(path) && nodeInstanceServer() && !path.isEmpty())
@@ -487,7 +488,7 @@ void ObjectNodeInstance::setPropertyVariant(const PropertyName &name, const QVar
qDebug() << "ObjectNodeInstance.setPropertyVariant: Cannot be written: " << object() << name << adjustedValue;
QVariant newValue = property.read();
- if (newValue.typeId() == QVariant::Url) {
+ if (newValue.typeId() == QMetaType::QUrl) {
QUrl url = newValue.toUrl();
QString path = url.toLocalFile();
if (QFileInfo::exists(path) && nodeInstanceServer() && !path.isEmpty())
@@ -577,7 +578,7 @@ void ObjectNodeInstance::refreshProperty(const PropertyName &name)
else
property.write(resetValue(name));
- if (oldValue.typeId() == QVariant::Url) {
+ if (oldValue.typeId() == QMetaType::QUrl) {
QByteArray key = oldValue.toUrl().toEncoded(QUrl::UrlFormattingOption(0x100));
QString pixmapKey = QString::fromUtf8(key.constData(), key.size());
QPixmapCache::remove(pixmapKey);
@@ -618,17 +619,18 @@ QVariant ObjectNodeInstance::property(const PropertyName &name) const
QQmlProperty property(object(), QString::fromUtf8(name), context());
if (property.property().isEnumType()) {
QVariant value = property.read();
- return property.property().enumerator().valueToKey(value.toInt());
+ QMetaEnum me = property.property().enumerator();
+ return QVariant::fromValue<Enumeration>(Enumeration(me.scope(), me.valueToKey(value.toInt())));
}
- if (property.propertyType() == QVariant::Url) {
+ if (property.propertyType() == QMetaType::QUrl) {
QUrl url = property.read().toUrl();
if (url.isEmpty())
return QVariant();
if (url.scheme() == "file") {
- int basePathLength = nodeInstanceServer()->fileUrl().toLocalFile().lastIndexOf('/');
- return QUrl(url.toLocalFile().mid(basePathLength + 1));
+ QFileInfo fi{nodeInstanceServer()->fileUrl().toLocalFile()};
+ return QUrl{fi.absoluteDir().relativeFilePath(url.toLocalFile())};
}
}
diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.cpp
new file mode 100644
index 0000000000..c70bba2846
--- /dev/null
+++ b/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.cpp
@@ -0,0 +1,209 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0
+
+#include "qt5import3dnodeinstanceserver.h"
+
+#include "createscenecommand.h"
+#include "view3dactioncommand.h"
+
+#include "imagecontainer.h"
+#include "nodeinstanceclientinterface.h"
+#include "puppettocreatorcommand.h"
+
+#include <QFileInfo>
+#include <QLocale>
+#include <QQmlComponent>
+#include <QQmlEngine>
+
+#include <QQmlProperty>
+
+#ifdef QUICK3D_MODULE
+#include <private/qquick3dnode_p.h>
+#include <private/qquick3dviewport_p.h>
+#include <private/qquickdesignersupport_p.h>
+#endif
+
+namespace QmlDesigner {
+
+Qt5Import3dNodeInstanceServer::Qt5Import3dNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) :
+ Qt5NodeInstanceServer(nodeInstanceClient)
+{
+ setSlowRenderTimerInterval(100000000);
+ setRenderTimerInterval(20);
+
+#ifdef QUICK3D_MODULE
+ m_generalHelper = new Internal::GeneralHelper();
+ QObject::connect(m_generalHelper, &Internal::GeneralHelper::requestRender, this, [this]() {
+ startRenderTimer();
+ });
+#endif
+}
+
+Qt5Import3dNodeInstanceServer::~Qt5Import3dNodeInstanceServer()
+{
+ cleanup();
+}
+
+void Qt5Import3dNodeInstanceServer::createScene(const CreateSceneCommand &command)
+{
+ initializeView();
+ registerFonts(command.resourceUrl);
+ setTranslationLanguage(command.language);
+ setupScene(command);
+ startRenderTimer();
+}
+
+void Qt5Import3dNodeInstanceServer::view3DAction([[maybe_unused]] const View3DActionCommand &command)
+{
+#ifdef QUICK3D_MODULE
+ switch (command.type()) {
+ case View3DActionType::Import3dUpdatePreviewImage: {
+ QObject *obj = rootItem();
+ if (obj) {
+ QSize size = command.value().toSize();
+ QQmlProperty wProp(obj, "width", context());
+ QQmlProperty hProp(obj, "height", context());
+ wProp.write(size.width());
+ hProp.write(size.height());
+ resizeCanvasToRootItem();
+
+ startRenderTimer();
+ }
+ break;
+ }
+ case View3DActionType::Import3dRotatePreviewModel: {
+ QObject *obj = rootItem();
+ QQmlProperty sceneNodeProp(obj, "sceneNode", context());
+ auto sceneNode = sceneNodeProp.read().value<QQuick3DNode *>();
+ if (sceneNode) {
+ QPointF delta = command.value().toPointF();
+ m_generalHelper->orbitCamera(m_view3D->camera(), m_view3D->camera()->eulerRotation(),
+ m_lookAt, {}, {float(delta.x()), float(delta.y()), 0.f});
+ m_keepRendering = true;
+ startRenderTimer();
+ }
+ break;
+ }
+ default:
+ break;
+ }
+#endif
+}
+
+void Qt5Import3dNodeInstanceServer::startRenderTimer()
+{
+ if (m_keepRendering && timerMode() == TimerMode::NormalTimer)
+ return;
+
+ NodeInstanceServer::startRenderTimer();
+}
+
+void Qt5Import3dNodeInstanceServer::cleanup()
+{
+#ifdef QUICK3D_MODULE
+ delete m_previewNode;
+ delete m_generalHelper;
+#endif
+}
+
+void Qt5Import3dNodeInstanceServer::finish()
+{
+ cleanup();
+}
+
+void Qt5Import3dNodeInstanceServer::collectItemChangesAndSendChangeCommands()
+{
+ static bool inFunction = false;
+
+ if (!rootNodeInstance().holdsGraphical())
+ return;
+
+ if (!inFunction) {
+ inFunction = true;
+#ifdef QUICK3D_MODULE
+ QQuickDesignerSupport::polishItems(quickWindow());
+#endif
+ render();
+
+ inFunction = false;
+ }
+}
+
+void Qt5Import3dNodeInstanceServer::render()
+{
+#ifdef QUICK3D_MODULE
+ ++m_renderCount;
+
+ if (m_renderCount == 1) {
+ QObject *obj = rootItem();
+ QQmlProperty viewProp(obj, "view3d", context());
+ QObject *viewObj = viewProp.read().value<QObject *>();
+ m_view3D = qobject_cast<QQuick3DViewport *>(viewObj);
+ if (m_view3D) {
+ QQmlProperty sceneModelNameProp(obj, "sceneModelName", context());
+ QQmlProperty sceneNodeProp(obj, "sceneNode", context());
+ auto sceneNode = sceneNodeProp.read().value<QQuick3DNode *>();
+ if (sceneNode) {
+ QString sceneModelName = sceneModelNameProp.read().toString();
+ QFileInfo fi(fileUrl().toLocalFile());
+ QString compPath = fi.absolutePath() + '/' + sceneModelName + ".qml";
+ QQmlComponent comp(engine(), compPath, QQmlComponent::PreferSynchronous);
+ m_previewNode = qobject_cast<QQuick3DNode *>(comp.create(context()));
+ if (m_previewNode) {
+ engine()->setObjectOwnership(m_previewNode, QJSEngine::CppOwnership);
+ m_previewNode->setParentItem(sceneNode);
+ m_previewNode->setParent(sceneNode);
+ }
+ }
+ }
+ }
+
+ // Render scene once to ensure geometries are intialized so bounds calculations work correctly
+ if (m_renderCount == 2 && m_view3D) {
+ QVector3D extents;
+ m_generalHelper->calculateBoundsAndFocusCamera(m_view3D->camera(), m_previewNode,
+ m_view3D, 1050, false, m_lookAt, extents);
+ auto getExtentStr = [&extents](int idx) -> QString {
+ int prec = 0;
+ float val = extents[idx];
+ while (val < 100.f) {
+ ++prec;
+ val *= 10.f;
+ }
+ // Strip unnecessary zeroes after decimal separator
+ if (prec > 0) {
+ QString checkStr = QString::number(extents[idx], 'f', prec);
+ while (prec > 0 && (checkStr.last(1) == "0" || checkStr.last(1) == ".")) {
+ --prec;
+ checkStr.chop(1);
+ }
+ }
+ QString retval = QLocale().toString(extents[idx], 'f', prec);
+ return retval;
+ };
+ QQmlProperty extentsProp(rootItem(), "extents", context());
+ extentsProp.write(tr("Dimensions: %1 x %2 x %3").arg(getExtentStr(0))
+ .arg(getExtentStr(1))
+ .arg(getExtentStr(2)));
+ }
+
+ rootNodeInstance().updateDirtyNodeRecursive();
+ QImage renderImage = grabWindow();
+
+ if (m_renderCount >= 2) {
+ ImageContainer imgContainer(0, renderImage, m_renderCount);
+ nodeInstanceClient()->handlePuppetToCreatorCommand(
+ {PuppetToCreatorCommand::Import3DPreviewImage,
+ QVariant::fromValue(imgContainer)});
+
+ if (!m_keepRendering)
+ slowDownRenderTimer();
+
+ m_keepRendering = false;
+ }
+#else
+ slowDownRenderTimer();
+#endif
+}
+
+} // namespace QmlDesigner
diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.h
new file mode 100644
index 0000000000..cfffa904bd
--- /dev/null
+++ b/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.h
@@ -0,0 +1,50 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0
+
+#pragma once
+
+#ifdef QUICK3D_MODULE
+#include "generalhelper.h"
+#endif
+#include "qt5nodeinstanceserver.h"
+
+QT_BEGIN_NAMESPACE
+class QQuick3DNode;
+QT_END_NAMESPACE
+
+namespace QmlDesigner {
+
+class Qt5Import3dNodeInstanceServer : public Qt5NodeInstanceServer
+{
+ Q_OBJECT
+public:
+ explicit Qt5Import3dNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient);
+
+public:
+ virtual ~Qt5Import3dNodeInstanceServer();
+
+ void createScene(const CreateSceneCommand &command) override;
+ void view3DAction(const View3DActionCommand &command) override;
+
+ void render();
+
+protected:
+ void collectItemChangesAndSendChangeCommands() override;
+ void startRenderTimer() override;
+
+private:
+ void finish();
+ void cleanup();
+
+ int m_renderCount = 0;
+ bool m_keepRendering = false;
+
+#ifdef QUICK3D_MODULE
+ QQuick3DViewport *m_view3D = nullptr;
+ Internal::GeneralHelper *m_generalHelper = nullptr;
+ QQuick3DNode *m_previewNode = nullptr;
+ QVector3D m_lookAt;
+#endif
+};
+
+} // namespace QmlDesigner
diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
index 6cd39a5a85..9549f59d3f 100644
--- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
+++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
@@ -41,14 +41,15 @@
#include "changeauxiliarycommand.h"
#include "../editor3d/boxgeometry.h"
-#include "../editor3d/generalhelper.h"
-#include "../editor3d/mousearea3d.h"
#include "../editor3d/camerageometry.h"
-#include "../editor3d/lightgeometry.h"
+#include "../editor3d/generalhelper.h"
#include "../editor3d/gridgeometry.h"
-#include "../editor3d/selectionboxgeometry.h"
-#include "../editor3d/linegeometry.h"
#include "../editor3d/icongizmoimageprovider.h"
+#include "../editor3d/lightgeometry.h"
+#include "../editor3d/linegeometry.h"
+#include "../editor3d/lookatgeometry.h"
+#include "../editor3d/mousearea3d.h"
+#include "../editor3d/selectionboxgeometry.h"
#include <private/qquickdesignersupport_p.h>
#include <qmlprivategate.h>
@@ -74,6 +75,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>
@@ -525,6 +527,7 @@ void Qt5InformationNodeInstanceServer::createEditView3D()
qmlRegisterType<QmlDesigner::Internal::SelectionBoxGeometry>("SelectionBoxGeometry", 1, 0, "SelectionBoxGeometry");
qmlRegisterType<QmlDesigner::Internal::LineGeometry>("LineGeometry", 1, 0, "LineGeometry");
qmlRegisterType<QmlDesigner::Internal::BoxGeometry>("BoxGeometry", 1, 0, "BoxGeometry");
+ qmlRegisterType<QmlDesigner::Internal::LookAtGeometry>("LookAtGeometry", 1, 0, "LookAtGeometry");
auto helper = new QmlDesigner::Internal::GeneralHelper();
QObject::connect(helper, &QmlDesigner::Internal::GeneralHelper::toolStateChanged,
@@ -979,6 +982,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 +1118,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 +1609,7 @@ QList<ServerNodeInstance> Qt5InformationNodeInstanceServer::createInstances(
if (m_editView3DSetupDone) {
add3DViewPorts(createdInstances);
add3DScenes(createdInstances);
- createCameraAndLightGizmos(createdInstances);
+ createGizmos(createdInstances);
}
render3DEditView();
@@ -1652,13 +1662,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 +1682,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 +1728,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)
@@ -1941,6 +1965,8 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(
if (toolStates[helper->globalStateId()].contains(helper->lastSceneIdKey()))
lastSceneId = toolStates[helper->globalStateId()][helper->lastSceneIdKey()].toString();
}
+ if (toolStates.contains(helper->projectStateId()))
+ helper->setLastSceneEnvironmentData(toolStates[helper->projectStateId()][helper->lastSceneEnvKey()].toMap());
}
// Find a scene to show
@@ -1977,7 +2003,7 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(
updateActiveSceneToEditView3D();
- createCameraAndLightGizmos(instanceList);
+ createGizmos(instanceList);
// Queue two renders to make sure icon gizmos update properly
render3DEditView(2);
@@ -2509,6 +2535,9 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
case View3DActionType::ShowGrid:
updatedToolState.insert("showGrid", command.isEnabled());
break;
+ case View3DActionType::ShowLookAt:
+ updatedToolState.insert("showLookAt", command.isEnabled());
+ break;
case View3DActionType::ShowSelectionBox:
updatedToolState.insert("showSelectionBox", command.isEnabled());
break;
@@ -2585,6 +2614,12 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
case View3DActionType::MaterialOverride:
updatedToolState.insert("matOverride", command.value().toList());
break;
+ case View3DActionType::SetLastSceneEnvData: {
+ auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
+ if (helper)
+ helper->setLastSceneEnvironmentData(command.value().toMap());
+ break;
+ }
default:
break;
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;
diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp
index f4d01d28db..c11899e0ec 100644
--- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp
+++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp
@@ -10,6 +10,7 @@
#include "qt5captureimagenodeinstanceserver.h"
#include "qt5capturepreviewnodeinstanceserver.h"
#include "qt5informationnodeinstanceserver.h"
+#include "qt5import3dnodeinstanceserver.h"
#include "qt5previewnodeinstanceserver.h"
#include "qt5rendernodeinstanceserver.h"
#include "qt5testnodeinstanceserver.h"
@@ -70,6 +71,9 @@ Qt5NodeInstanceClientProxy::Qt5NodeInstanceClientProxy(QObject *parent) :
} else if (QCoreApplication::arguments().at(2) == QLatin1String("bakelightsmode")) {
setNodeInstanceServer(std::make_unique<Qt5BakeLightsNodeInstanceServer>(this));
initializeSocket();
+ } else if (QCoreApplication::arguments().at(2) == QLatin1String("import3dmode")) {
+ setNodeInstanceServer(std::make_unique<Qt5Import3dNodeInstanceServer>(this));
+ initializeSocket();
}
}
diff --git a/src/tools/qml2puppet/qml2puppet/qml2puppetmain.cpp b/src/tools/qml2puppet/qml2puppet/qml2puppetmain.cpp
index 5896df39e1..937bb36d8e 100644
--- a/src/tools/qml2puppet/qml2puppet/qml2puppetmain.cpp
+++ b/src/tools/qml2puppet/qml2puppet/qml2puppetmain.cpp
@@ -7,6 +7,34 @@
#include "runner/qmlruntime.h"
#endif
+#include <QLoggingCategory>
+
+inline Q_LOGGING_CATEGORY(deprecated, "qt.tools.qds.deprecated");
+inline Q_LOGGING_CATEGORY(verbose1, "qt.tools.qds.verbose1");
+inline Q_LOGGING_CATEGORY(verbose2, "qt.tools.qds.verbose2");
+
+void registerMessageHandler(
+ QtMsgType type, [[maybe_unused]] const QMessageLogContext &context, const QString &msg)
+{
+ auto tPrinter = [&](const QString &msgPrefix) {
+ fprintf(
+ stderr, "%s: %s\n", msgPrefix.toLocal8Bit().constData(), msg.toLocal8Bit().constData());
+ };
+
+ if (type == QtDebugMsg)
+ tPrinter("Debug");
+ else if (type == QtInfoMsg)
+ tPrinter("Info");
+ else if (type == QtWarningMsg)
+ tPrinter("Warning");
+ else if (type == QtCriticalMsg)
+ tPrinter("Critical");
+ else if (type == QtFatalMsg) {
+ tPrinter("Fatal");
+ abort();
+ }
+}
+
auto getQmlRunner(int &argc, char **argv)
{
#ifdef ENABLE_INTERNAL_QML_RUNTIME
@@ -24,7 +52,6 @@ auto getQmlRunner(int &argc, char **argv)
int main(int argc, char *argv[])
{
- QDSMeta::Logging::registerMessageHandler();
- QDSMeta::AppInfo::registerAppInfo("Qml2Puppet");
+ qInstallMessageHandler(registerMessageHandler);
return getQmlRunner(argc, argv)->run();
}
diff --git a/src/tools/qml2puppet/qml2puppet/qmlbase.h b/src/tools/qml2puppet/qml2puppet/qmlbase.h
index ae8995f489..45be0cae71 100644
--- a/src/tools/qml2puppet/qml2puppet/qmlbase.h
+++ b/src/tools/qml2puppet/qml2puppet/qmlbase.h
@@ -3,27 +3,12 @@
#pragma once
-#include <QDir>
-#include <QQmlApplicationEngine>
-#include <QQmlComponent>
-#include <QQmlContext>
-
-#include <QFileInfo>
-#include <QFileOpenEvent>
-#include <QLibraryInfo>
-#include <QSurfaceFormat>
-
+#include <QApplication>
#include <QCommandLineParser>
+#include <QQmlApplicationEngine>
-#include <QStandardPaths>
-#include <QTranslator>
-
-#include <QSharedPointer>
-
-#include "appmetadata.h"
#include <iostream>
-#include <QApplication>
class QmlBase : public QObject
{
Q_OBJECT
@@ -44,7 +29,6 @@ public:
#ifdef ENABLE_INTERNAL_QML_RUNTIME
m_argParser.addOption({"qml-runtime", "Run QML Runtime"});
#endif
- m_argParser.addOption({"appinfo", "Print build information"});
m_argParser.addOption({"test", "Run test mode"});
}
@@ -92,7 +76,6 @@ private:
void initParser()
{
QCommandLineOption optHelp = m_argParser.addHelpOption();
- QCommandLineOption optVers = m_argParser.addVersionOption();
if (!m_argParser.parse(m_coreApp->arguments())) {
std::cout << "Error: " << m_argParser.errorText().toStdString() << std::endl;
@@ -103,12 +86,8 @@ private:
std::cout << std::endl;
m_argParser.showHelp(1);
- } else if (m_argParser.isSet(optVers)) {
- m_argParser.showVersion();
} else if (m_argParser.isSet(optHelp)) {
m_argParser.showHelp(0);
- } else if (m_argParser.isSet("appinfo")) {
- QDSMeta::AppInfo::printAppInfo();
} else if (m_argParser.isSet("test")) {
exit(startTestMode());
}
diff --git a/src/tools/qml2puppet/qml2puppet/qmlpuppet.cpp b/src/tools/qml2puppet/qml2puppet/qmlpuppet.cpp
index 86dce8cb90..332def504e 100644
--- a/src/tools/qml2puppet/qml2puppet/qmlpuppet.cpp
+++ b/src/tools/qml2puppet/qml2puppet/qmlpuppet.cpp
@@ -10,7 +10,6 @@
#include <app/app_version.h>
#include <qml2puppet/import3d/import3d.h>
-
#include <qt5nodeinstanceclientproxy.h>
#include <QFileInfo>
diff --git a/src/tools/qml2puppet/qml2puppet/runner/qmlruntime.cpp b/src/tools/qml2puppet/qml2puppet/runner/qmlruntime.cpp
index 4435d0e9f4..2876339a90 100644
--- a/src/tools/qml2puppet/qml2puppet/runner/qmlruntime.cpp
+++ b/src/tools/qml2puppet/qml2puppet/runner/qmlruntime.cpp
@@ -13,6 +13,10 @@
#include <QDirIterator>
#include <QFontDatabase>
#include <QIcon>
+#include <QLibraryInfo>
+#include <QStandardPaths>
+#include <QSurfaceFormat>
+#include <QTranslator>
#define FILE_OPEN_EVENT_WAIT_TIME 3000 // ms
#define QSL QStringLiteral
@@ -242,12 +246,12 @@ void QmlRuntime::initQmlRunner()
if (translator.load(translationFile)) {
m_coreApp->installTranslator(&translator);
if (m_verboseMode)
- qInfo() << "qml: Loaded translation file %s\n",
- qPrintable(QDir::toNativeSeparators(translationFile));
+ qInfo() << "qml: Loaded translation file "
+ << qPrintable(QDir::toNativeSeparators(translationFile));
} else {
if (!m_quietMode)
- qInfo() << "qml: Could not load the translation file %s\n",
- qPrintable(QDir::toNativeSeparators(translationFile));
+ qInfo() << "qml: Could not load the translation file "
+ << qPrintable(QDir::toNativeSeparators(translationFile));
}
}
#else
@@ -278,7 +282,7 @@ void QmlRuntime::initQmlRunner()
for (const QString &path : std::as_const(files)) {
QUrl url = QUrl::fromUserInput(path, QDir::currentPath(), QUrl::AssumeLocalFile);
if (m_verboseMode)
- qInfo() << "qml: loading %s\n", qPrintable(url.toString());
+ qInfo() << "qml: loading " << qPrintable(url.toString());
m_qmlEngine->load(url);
}
@@ -318,8 +322,8 @@ void QmlRuntime::loadConf(const QString &override, bool quiet) // Terminates app
else
fi.setFile(override);
if (!fi.exists()) {
- qCritical() << "qml: Couldn't find required configuration file: %s\n",
- qPrintable(QDir::toNativeSeparators(fi.absoluteFilePath()));
+ qCritical() << "qml: Couldn't find required configuration file:"
+ << qPrintable(QDir::toNativeSeparators(fi.absoluteFilePath()));
exit(1);
}
settingsUrl = QQmlImports::urlFromLocalFileOrQrcOrUrl(fi.absoluteFilePath());
@@ -327,13 +331,14 @@ void QmlRuntime::loadConf(const QString &override, bool quiet) // Terminates app
}
if (!quiet) {
- qInfo() << "qml: %s\n", QLibraryInfo::build();
+ qInfo() << "qml:" << QLibraryInfo::build();
if (builtIn) {
- qInfo() << "qml: Using built-in configuration: %s\n",
- qPrintable(override.isEmpty() ? defaultFileName : override);
+ qInfo() << "qml: Using built-in configuration:"
+ << qPrintable(override.isEmpty() ? defaultFileName : override);
} else {
- qInfo() << "qml: Using configuration: %s\n",
- qPrintable(settingsUrl.isLocalFile()
+ qInfo() << "qml: Using configuration:"
+ << qPrintable(
+ settingsUrl.isLocalFile()
? QDir::toNativeSeparators(settingsUrl.toLocalFile())
: settingsUrl.toString());
}
@@ -345,18 +350,19 @@ void QmlRuntime::loadConf(const QString &override, bool quiet) // Terminates app
m_conf.reset(qobject_cast<Config *>(c2.create()));
if (!m_conf) {
- qCritical() << "qml: Error loading configuration file: %s\n", qPrintable(c2.errorString());
+ qCritical() << "qml: Error loading configuration file:" << qPrintable(c2.errorString());
exit(1);
}
}
void QmlRuntime::listConfFiles()
{
+ qDebug() << "qml: Built-in configurations:";
const QDir confResourceDir(m_confResourcePath);
- qInfo() << "%s\n", qPrintable(QCoreApplication::translate("main", "Built-in configurations:"));
+ qInfo() << qPrintable(QCoreApplication::translate("main", "Built-in configurations:"));
for (const QFileInfo &fi : confResourceDir.entryInfoList(QDir::Files))
- qInfo() << " %s\n", qPrintable(fi.baseName());
- qInfo() << "%s\n", qPrintable(QCoreApplication::translate("main", "Other configurations:"));
+ qInfo() << qPrintable(fi.baseName());
+ qInfo() << qPrintable(QCoreApplication::translate("main", "Other configurations:"));
bool foundOther = false;
const QStringList otherLocations = QStandardPaths::standardLocations(
QStandardPaths::AppConfigLocation);
@@ -365,16 +371,16 @@ void QmlRuntime::listConfFiles()
for (const QFileInfo &fi : confDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) {
foundOther = true;
if (m_verboseMode)
- qInfo() << " %s\n", qPrintable(fi.absoluteFilePath());
+ qInfo() << qPrintable(fi.absoluteFilePath());
else
- qInfo() << " %s\n", qPrintable(fi.baseName());
+ qInfo() << qPrintable(fi.baseName());
}
}
if (!foundOther)
- qInfo() << " %s\n", qPrintable(QCoreApplication::translate("main", "none"));
+ qInfo() << qPrintable(QCoreApplication::translate("main", "none"));
if (m_verboseMode) {
- qInfo() << "%s\n", qPrintable(QCoreApplication::translate("main", "Checked in:"));
+ qInfo() << qPrintable(QCoreApplication::translate("main", "Checked in:"));
for (const auto &confDirPath : otherLocations)
- qInfo() << " %s\n", qPrintable(confDirPath);
+ qInfo() << qPrintable(confDirPath);
}
}
diff --git a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp
index 096ac36244..6897a23973 100644
--- a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp
+++ b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp
@@ -604,7 +604,7 @@ static QString qmlDesignerRCPath()
QVariant fixResourcePaths(const QVariant &value)
{
- if (value.typeId() == QVariant::Url) {
+ if (value.typeId() == QMetaType::QUrl) {
const QUrl url = value.toUrl();
if (url.scheme() == QLatin1String("qrc")) {
const QString path = QLatin1String("qrc:") + url.path();
@@ -625,7 +625,7 @@ QVariant fixResourcePaths(const QVariant &value)
}
}
}
- if (value.typeId() == QVariant::String) {
+ if (value.typeId() == QMetaType::QString) {
const QString str = value.toString();
if (str.contains(QLatin1String("qrc:"))) {
if (!qmlDesignerRCPath().isEmpty()) {
diff --git a/src/tools/sdktool/addkitoperation.cpp b/src/tools/sdktool/addkitoperation.cpp
index 037cf3c5e5..0028c5e63c 100644
--- a/src/tools/sdktool/addkitoperation.cpp
+++ b/src/tools/sdktool/addkitoperation.cpp
@@ -190,7 +190,7 @@ bool AddKitOperation::setArguments(const QStringList &args)
++i; // skip next;
const QString tmp = current.mid(2);
- const QString tmp2 = tmp.mid(0, tmp.count() - 9 /* toolchain */);
+ const QString tmp2 = tmp.mid(0, tmp.size() - 9 /* toolchain */);
const QString lang = tmp2.isEmpty() ? QString("Cxx") : tmp2;
if (next.isEmpty()) {