forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/qds/dev'
Conflicts: src/plugins/qmldesigner/CMakeLists.txt Change-Id: I250c8e5284ddb0f335c440999b8920762419c89b
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
BIN
src/tools/qml2puppet/mockfiles/images/reflectionprobe.png
Normal file
BIN
src/tools/qml2puppet/mockfiles/images/reflectionprobe.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 463 B |
BIN
src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png
Normal file
BIN
src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 887 B |
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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
|
||||
|
||||
27
src/tools/qml2puppet/mockfiles/qt6/LookAtGizmo.qml
Normal file
27
src/tools/qml2puppet/mockfiles/qt6/LookAtGizmo.qml
Normal file
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
62
src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.cpp
Normal file
62
src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.cpp
Normal file
@@ -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
|
||||
42
src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.h
Normal file
42
src/tools/qml2puppet/qml2puppet/editor3d/lookatgeometry.h
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 {};
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <qmlprivategate.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QEvent>
|
||||
#include <QQmlContext>
|
||||
#include <QQmlError>
|
||||
@@ -618,7 +619,8 @@ 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) {
|
||||
@@ -627,8 +629,8 @@ QVariant ObjectNodeInstance::property(const PropertyName &name) const
|
||||
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())};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
// 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>
|
||||
|
||||
#include <private/qquick3dnode_p.h>
|
||||
#include <private/qquick3dviewport_p.h>
|
||||
#include <private/qquickdesignersupport_p.h>
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
QQuickDesignerSupport::polishItems(quickWindow());
|
||||
|
||||
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
|
||||
@@ -0,0 +1,48 @@
|
||||
// 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
|
||||
|
||||
#include "generalhelper.h"
|
||||
#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
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
|
||||
#include <app/app_version.h>
|
||||
#include <qml2puppet/import3d/import3d.h>
|
||||
|
||||
#include <qt5nodeinstanceclientproxy.h>
|
||||
|
||||
#include <QFileInfo>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user