diff options
Diffstat (limited to 'src/tools')
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 Binary files differnew file mode 100644 index 0000000000..4f31a98f65 --- /dev/null +++ b/src/tools/qml2puppet/mockfiles/images/reflectionprobe.png diff --git a/src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png b/src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png Binary files differnew file mode 100644 index 0000000000..2aa3124a41 --- /dev/null +++ b/src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png 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()) { |