summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2022-05-27 14:14:22 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2022-05-30 14:16:53 +0000
commit80ea026fd8e8dcdb5bda48f66e48a2fdf787b6be (patch)
tree53743f18a6e4fdc02b6b322579f36e48b9afdceb
parent46049bac323badde4d619df459d77f0e26cd16d8 (diff)
downloadqt-creator-80ea026fd8e8dcdb5bda48f66e48a2fdf787b6be.tar.gz
QmlDesigner: Refactor library icon generation for imported 3D assets
Previously, icon generation was done at import time, but that was wasteful, as we now have image cache backed icon generation available for component library icons. Added the few remaining missing bits to support icon generation for image cache and disabled the old icon generation implementation for Qt6. A few issues in fit algorithm for preview image generation were also uncovered and fixed to make icons render scene in comparable size to the old version. Qt5 imports still generate using old way since component library 3D previews generation doesn't work on Qt5. Fixes: QDS-6205 Change-Id: I5418fa19d86e81adcd184be023f1dfbc813d0bf5 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Samuel Ghinet <samuel.ghinet@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r--share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc1
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt5/MaterialNodeView.qml2
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNode3DImageView.qml19
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNodeView.qml6
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt5/NodeNodeView.qml4
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconRenderer3D.qml88
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml2
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode3DImageView.qml19
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml4
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt6/NodeNodeView.qml4
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp31
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h2
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.cpp11
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.h1
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp30
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryiconimageprovider.cpp4
-rw-r--r--src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp13
-rw-r--r--src/plugins/qmldesigner/designercore/include/imagecacheauxiliarydata.h11
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp7
19 files changed, 132 insertions, 127 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc b/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc
index e8d66548c3..0545942334 100644
--- a/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc
+++ b/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc
@@ -32,7 +32,6 @@
<file>mockfiles/qt6/FadeHandle.qml</file>
<file>mockfiles/qt6/HelperGrid.qml</file>
<file>mockfiles/qt6/IconGizmo.qml</file>
- <file>mockfiles/qt6/IconRenderer3D.qml</file>
<file>mockfiles/qt6/LightGizmo.qml</file>
<file>mockfiles/qt6/LightIconGizmo.qml</file>
<file>mockfiles/qt6/LightModel.qml</file>
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/MaterialNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/MaterialNodeView.qml
index 06320524bf..c36d8c227c 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/MaterialNodeView.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/MaterialNodeView.qml
@@ -32,7 +32,7 @@ View3D {
property Material previewMaterial
- function fitToViewPort()
+ function fitToViewPort(closeUp)
{
// No need to zoom this view, this is here just to avoid runtime warnings
}
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNode3DImageView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNode3DImageView.qml
index de3e3ee431..a6d5c6b1db 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNode3DImageView.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNode3DImageView.qml
@@ -41,6 +41,8 @@ Item {
property var modelViewComponent
property var nodeViewComponent
+ property bool closeUp: false
+
function destroyView()
{
previewObject = null;
@@ -96,7 +98,15 @@ Item {
function fitToViewPort()
{
- view.fitToViewPort();
+ view.fitToViewPort(closeUp);
+ }
+
+ // Enables/disables icon mode. When in icon mode, camera is zoomed bit closer to reduce margins
+ // and the background is removed, in order to generate a preview suitable for library icons.
+ function setIconMode(enable)
+ {
+ closeUp = enable;
+ backgroundRect.visible = !enable;
}
View3D {
@@ -108,10 +118,15 @@ Item {
id: contentItem
anchors.fill: parent
- Rectangle {
+ Item {
id: viewRect
anchors.fill: parent
+ }
+ Rectangle {
+ id: backgroundRect
+ anchors.fill: parent
+ z: -1
gradient: Gradient {
GradientStop { position: 1.0; color: "#222222" }
GradientStop { position: 0.0; color: "#999999" }
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNodeView.qml
index e61a9a8fb2..5c8b9e1cd7 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNodeView.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNodeView.qml
@@ -34,11 +34,11 @@ View3D {
property Model sourceModel
- function fitToViewPort()
+ function fitToViewPort(closeUp)
{
// The magic number is the distance from camera default pos to origin
- _generalHelper.calculateNodeBoundsAndFocusCamera(theCamera, importScene, root,
- 1040);
+ _generalHelper.calculateNodeBoundsAndFocusCamera(theCamera, sourceModel, root,
+ 1040, closeUp);
}
SceneEnvironment {
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/NodeNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/NodeNodeView.qml
index 91008abb25..e8931719d7 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/NodeNodeView.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/NodeNodeView.qml
@@ -32,11 +32,11 @@ View3D {
environment: sceneEnv
camera: theCamera
- function fitToViewPort()
+ function fitToViewPort(closeUp)
{
// The magic number is the distance from camera default pos to origin
_generalHelper.calculateNodeBoundsAndFocusCamera(theCamera, importScene, root,
- 1040);
+ 1040, closeUp);
}
SceneEnvironment {
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconRenderer3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconRenderer3D.qml
deleted file mode 100644
index 623bf21cde..0000000000
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconRenderer3D.qml
+++ /dev/null
@@ -1,88 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt Creator.
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-****************************************************************************/
-
-import QtQuick 6.0
-import QtQuick3D 6.0
-
-Item {
- id: viewRoot
- width: 1024
- height: 1024
- visible: true
-
- property alias view3D: view3D
- property alias camPos: viewCamera.position
-
- function setSceneToBox()
- {
- selectionBox.targetNode = view3D.importScene;
- }
-
- function fitAndHideBox()
- {
- cameraControl.focusObject(selectionBox.model, viewCamera.eulerRotation, true, true);
- if (cameraControl._zoomFactor < 0.1)
- view3D.importScene.scale = view3D.importScene.scale.times(10);
- if (cameraControl._zoomFactor > 10)
- view3D.importScene.scale = view3D.importScene.scale.times(0.1);
-
- selectionBox.visible = false;
- }
-
- View3D {
- id: view3D
- camera: viewCamera
- environment: sceneEnv
-
- SceneEnvironment {
- id: sceneEnv
- antialiasingMode: SceneEnvironment.MSAA
- antialiasingQuality: SceneEnvironment.VeryHigh
- }
-
- PerspectiveCamera {
- id: viewCamera
- position: Qt.vector3d(-200, 200, 200)
- eulerRotation: Qt.vector3d(-45, -45, 0)
- }
-
- DirectionalLight {
- rotation: viewCamera.rotation
- }
-
- SelectionBox {
- id: selectionBox
- view3D: view3D
- geometryName: "SB"
- }
-
- EditCameraController {
- id: cameraControl
- camera: view3D.camera
- view3d: view3D
- ignoreToolState: true
- }
- }
-}
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml
index aae5891e08..ed5cfea56f 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml
@@ -32,7 +32,7 @@ View3D {
property Material previewMaterial
- function fitToViewPort()
+ function fitToViewPort(closeUp)
{
// No need to zoom this view, this is here just to avoid runtime warnings
}
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode3DImageView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode3DImageView.qml
index 4bd07e57d1..5caac0047c 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode3DImageView.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode3DImageView.qml
@@ -41,6 +41,8 @@ Item {
property var modelViewComponent
property var nodeViewComponent
+ property bool closeUp: false
+
function destroyView()
{
previewObject = null;
@@ -96,17 +98,30 @@ Item {
function fitToViewPort()
{
- view.fitToViewPort();
+ view.fitToViewPort(closeUp);
+ }
+
+ // Enables/disables icon mode. When in icon mode, camera is zoomed bit closer to reduce margins
+ // and the background is removed, in order to generate a preview suitable for library icons.
+ function setIconMode(enable)
+ {
+ closeUp = enable;
+ backgroundRect.visible = !enable;
}
Item {
id: contentItem
anchors.fill: parent
- Rectangle {
+ Item {
id: viewRect
anchors.fill: parent
+ }
+ Rectangle {
+ id: backgroundRect
+ anchors.fill: parent
+ z: -1
gradient: Gradient {
GradientStop { position: 1.0; color: "#222222" }
GradientStop { position: 0.0; color: "#999999" }
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml
index 19b3c4c35d..1762e3c9a4 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml
@@ -34,11 +34,11 @@ View3D {
property Model sourceModel
- function fitToViewPort()
+ function fitToViewPort(closeUp)
{
// The magic number is the distance from camera default pos to origin
_generalHelper.calculateNodeBoundsAndFocusCamera(theCamera, sourceModel, root,
- 1040);
+ 1040, closeUp);
}
SceneEnvironment {
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/NodeNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/NodeNodeView.qml
index a48eb66519..7bbfbf281a 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/NodeNodeView.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/NodeNodeView.qml
@@ -32,11 +32,11 @@ View3D {
environment: sceneEnv
camera: theCamera
- function fitToViewPort()
+ function fitToViewPort(closeUp)
{
// The magic number is the distance from camera default pos to origin
_generalHelper.calculateNodeBoundsAndFocusCamera(theCamera, importScene, root,
- 1040);
+ 1040, closeUp);
}
SceneEnvironment {
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
index 3b774c3f4a..7e843012be 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
@@ -308,7 +308,7 @@ QVector4D GeneralHelper::focusNodesToCamera(QQuick3DCamera *camera, float defaul
// and recalculating bounds for every frame is not a problem.
void GeneralHelper::calculateNodeBoundsAndFocusCamera(
QQuick3DCamera *camera, QQuick3DNode *node, QQuick3DViewport *viewPort,
- float defaultLookAtDistance)
+ float defaultLookAtDistance, bool closeUp)
{
QVector3D minBounds;
QVector3D maxBounds;
@@ -317,7 +317,9 @@ void GeneralHelper::calculateNodeBoundsAndFocusCamera(
QVector3D extents = maxBounds - minBounds;
QVector3D lookAt = minBounds + (extents / 2.f);
- float maxExtent = qMax(extents.x(), qMax(extents.y(), extents.z()));
+ float maxExtent = qSqrt(qreal(extents.x()) * qreal(extents.x())
+ + qreal(extents.y()) * qreal(extents.y())
+ + qreal(extents.z()) * qreal(extents.z()));
// Reset camera position to default zoom
QMatrix4x4 m = camera->sceneTransform();
@@ -328,9 +330,27 @@ void GeneralHelper::calculateNodeBoundsAndFocusCamera(
camera->setPosition(lookAt + newLookVector);
- float newZoomFactor = maxExtent / 725.f; // Divisor taken from focusNodesToCamera function
+ // CloseUp divisor is used for icon generation, where we can allow some extreme models to go
+ // slightly out of bounds for better results generally. The other divisor is used for other
+ // previews, where the image is larger to begin with and we would also like some margin
+ // between preview edge and the rendered model, so we can be more conservative with the zoom.
+ // The divisor values are empirically selected to provide nice result.
+ float divisor = closeUp ? 1250.f : 1050.f;
+ float newZoomFactor = maxExtent / divisor;
zoomCamera(viewPort, camera, 0, defaultLookAtDistance, lookAt, newZoomFactor, false);
+
+ if (auto perspectiveCamera = qobject_cast<QQuick3DPerspectiveCamera *>(camera)) {
+ // Fix camera near/far clips in case we are dealing with extreme zooms
+ const float cameraDist = qAbs((camera->position() - lookAt).length());
+ const float minDist = cameraDist - (maxExtent / 2.f);
+ const float maxDist = cameraDist + (maxExtent / 2.f);
+ if (minDist < perspectiveCamera->clipNear() || maxDist > perspectiveCamera->clipFar()) {
+ perspectiveCamera->setClipNear(minDist * 0.99);
+ perspectiveCamera->setClipFar(maxDist * 1.01);
+ }
+
+ }
}
// Aligns any cameras found in nodes list to a camera.
@@ -823,12 +843,13 @@ bool GeneralHelper::getBounds(QQuick3DViewport *view3D, QQuick3DNode *node, QVec
if (auto childNode = qobject_cast<QQuick3DNode *>(child)) {
QVector3D newMinBounds = minBounds;
QVector3D newMaxBounds = maxBounds;
- hasModel = getBounds(view3D, childNode, newMinBounds, newMaxBounds, true);
+ bool childHasModel = getBounds(view3D, childNode, newMinBounds, newMaxBounds, true);
// Ignore any subtrees that do not have Model in them as we don't need those
// for visual bounds calculations
- if (hasModel) {
+ if (childHasModel) {
minBoundsVec << newMinBounds;
maxBoundsVec << newMaxBounds;
+ hasModel = true;
}
}
}
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
index 562848c772..98974cfda9 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
@@ -77,7 +77,7 @@ public:
bool closeUp = false);
Q_INVOKABLE void calculateNodeBoundsAndFocusCamera(QQuick3DCamera *camera, QQuick3DNode *node,
QQuick3DViewport *viewPort,
- float defaultLookAtDistance);
+ float defaultLookAtDistance, bool closeUp);
Q_INVOKABLE void alignCameras(QQuick3DCamera *camera, const QVariant &nodes);
Q_INVOKABLE QVector3D alignView(QQuick3DCamera *camera, const QVariant &nodes,
const QVector3D &lookAtPoint);
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.cpp
index 589f57cb5f..cae64ad04c 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.cpp
@@ -57,6 +57,9 @@ void Quick3DRenderableNodeInstance::initialize(const ObjectNodeInstance::Pointer
// In case this is the scene root, we need to create a dummy View3D for the scene
// in preview puppets
if (instanceId() == 0 && (!nodeInstanceServer()->isInformationServer())) {
+ nodeInstanceServer()->quickWindow()->setDefaultAlphaBuffer(true);
+ nodeInstanceServer()->quickWindow()->setColor(Qt::transparent);
+
auto helper = new QmlDesigner::Internal::GeneralHelper();
engine()->rootContext()->setContextProperty("_generalHelper", helper);
@@ -199,6 +202,14 @@ QQuickItem *Quick3DRenderableNodeInstance::contentItem() const
return m_dummyRootView;
}
+void Quick3DRenderableNodeInstance::setPropertyVariant(const PropertyName &name,
+ const QVariant &value)
+{
+ if (m_dummyRootView && name == "isLibraryIcon")
+ QMetaObject::invokeMethod(m_dummyRootView, "setIconMode", Q_ARG(QVariant, value));
+ ObjectNodeInstance::setPropertyVariant(name, value);
+}
+
Qt5NodeInstanceServer *Quick3DRenderableNodeInstance::qt5NodeInstanceServer() const
{
return qobject_cast<Qt5NodeInstanceServer *>(nodeInstanceServer());
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.h
index ae03cb1b90..208144cb52 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3drenderablenodeinstance.h
@@ -52,6 +52,7 @@ public:
QList<ServerNodeInstance> stateInstances() const override;
QQuickItem *contentItem() const override;
+ void setPropertyVariant(const PropertyName &name, const QVariant &value) override;
protected:
explicit Quick3DRenderableNodeInstance(QObject *node);
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
index 7e22efe016..e3aae0cb7d 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
@@ -401,7 +401,6 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd)
qmlInfo.append(outDir.relativeFilePath(qmlIt.filePath()));
qmlInfo.append('\n');
- // Generate item library icon for qml file based on root component
QFile qmlFile(qmlIt.filePath());
if (qmlFile.open(QIODevice::ReadOnly)) {
QString iconFileName = outDir.path() + '/'
@@ -410,6 +409,8 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd)
QString iconFileName2x = iconFileName + "@2x";
QByteArray content = qmlFile.readAll();
int braceIdx = content.indexOf('{');
+ QString impVersionStr;
+ int impVersionMajor = -1;
if (braceIdx != -1) {
int nlIdx = content.lastIndexOf('\n', braceIdx);
QByteArray rootItem = content.mid(nlIdx, braceIdx - nlIdx).trimmed();
@@ -423,8 +424,9 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd)
out << "canBeDroppedInView3D: true" << Qt::endl;
file.close();
- // Add quick3D import unless it is already added
- if (m_requiredImports.first().url() != "QtQuick3D") {
+ // Assume that all assets import the same QtQuick3D version,
+ // since they are being imported with same kit
+ if (impVersionMajor == -1) {
QByteArray import3dStr{"import QtQuick3D"};
int importIdx = content.indexOf(import3dStr);
if (importIdx != -1 && importIdx < braceIdx) {
@@ -433,15 +435,25 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd)
QByteArray versionStr = content.mid(importIdx, nlIdx - importIdx).trimmed();
// There could be 'as abc' after version, so just take first part
QList<QByteArray> parts = versionStr.split(' ');
- QString impVersion;
- if (parts.size() >= 1)
- impVersion = QString::fromUtf8(parts[0]);
- m_requiredImports.prepend(Import::createLibraryImport(
- "QtQuick3D", impVersion));
+ if (parts.size() >= 1) {
+ impVersionStr = QString::fromUtf8(parts[0]);
+ if (impVersionStr.isEmpty())
+ impVersionMajor = 6;
+ else
+ impVersionMajor = impVersionStr.left(1).toInt();
+ }
}
}
+
+ // Add quick3D import unless it is already added
+ if (impVersionMajor > 0
+ && m_requiredImports.first().url() != "QtQuick3D") {
+ m_requiredImports.prepend(Import::createLibraryImport(
+ "QtQuick3D", impVersionStr));
+ }
}
- if (startIconProcess(24, iconFileName, qmlIt.filePath())) {
+ if (impVersionMajor > 0 && impVersionMajor < 6
+ && startIconProcess(24, iconFileName, qmlIt.filePath())) {
// Since icon is generated by external process, the file won't be
// ready for asset gathering below, so assume its generation succeeds
// and add it now.
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryiconimageprovider.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryiconimageprovider.cpp
index e7dbbee085..5144a5220f 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryiconimageprovider.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryiconimageprovider.cpp
@@ -92,7 +92,9 @@ QQuickImageResponse *ItemLibraryIconImageProvider::requestImageResponse(const QS
}
},
Qt::QueuedConnection);
- });
+ },
+ "libIcon",
+ ImageCache::LibraryIconAuxiliaryData{true});
return response.release();
}
diff --git a/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp b/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp
index 530724315a..7890086bd5 100644
--- a/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp
+++ b/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp
@@ -74,7 +74,7 @@ ImageCacheCollector::~ImageCacheCollector() = default;
void ImageCacheCollector::start(Utils::SmallStringView name,
Utils::SmallStringView state,
- const ImageCache::AuxiliaryData &,
+ const ImageCache::AuxiliaryData &auxiliaryData,
CaptureCallback captureCallback,
AbortCallback abortCallback)
{
@@ -96,13 +96,22 @@ void ImageCacheCollector::start(Utils::SmallStringView name,
model->setRewriterView(&rewriterView);
+ bool is3DRoot = !rewriterView.inErrorState()
+ && (rewriterView.rootModelNode().isSubclassOf("Quick3D.Node")
+ || rewriterView.rootModelNode().isSubclassOf("Quick3D.Material"));
+
if (rewriterView.inErrorState() || (!rewriterView.rootModelNode().metaInfo().isGraphicalItem()
- && !rewriterView.rootModelNode().isSubclassOf("Quick3D.Node") )) {
+ && !is3DRoot)) {
if (abortCallback)
abortCallback(ImageCache::AbortReason::Failed);
return;
}
+ if (is3DRoot) {
+ if (auto libIcon = Utils::get_if<ImageCache::LibraryIconAuxiliaryData>(&auxiliaryData))
+ rewriterView.rootModelNode().setAuxiliaryData("isLibraryIcon@NodeInstance", libIcon->enable);
+ }
+
ModelNode stateNode = rewriterView.modelNodeForId(QString{state});
if (stateNode.isValid())
diff --git a/src/plugins/qmldesigner/designercore/include/imagecacheauxiliarydata.h b/src/plugins/qmldesigner/designercore/include/imagecacheauxiliarydata.h
index ae87681626..61660271fc 100644
--- a/src/plugins/qmldesigner/designercore/include/imagecacheauxiliarydata.h
+++ b/src/plugins/qmldesigner/designercore/include/imagecacheauxiliarydata.h
@@ -54,7 +54,16 @@ public:
QString text;
};
-using AuxiliaryData = Utils::variant<Utils::monostate, FontCollectorSizeAuxiliaryData, FontCollectorSizesAuxiliaryData>;
+class LibraryIconAuxiliaryData
+{
+public:
+ bool enable;
+};
+
+using AuxiliaryData = Utils::variant<Utils::monostate,
+ LibraryIconAuxiliaryData,
+ FontCollectorSizeAuxiliaryData,
+ FontCollectorSizesAuxiliaryData>;
enum class AbortReason : char { Abort, Failed };
diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp
index 9ff3289e45..342e0a65fb 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp
@@ -445,10 +445,9 @@ void SubComponentManager::parseQuick3DAssetsItem(const QString &importUrl, const
QString iconPath = qmlIt.fileInfo().absolutePath() + '/'
+ Constants::QUICK_3D_ASSET_ICON_DIR + '/' + name
+ Constants::QUICK_3D_ASSET_LIBRARY_ICON_SUFFIX;
- if (!QFileInfo::exists(iconPath))
- iconPath = defaultIconPath;
- itemLibraryEntry.setLibraryEntryIconPath(iconPath);
- itemLibraryEntry.setTypeIcon(QIcon(iconPath));
+ if (QFileInfo::exists(iconPath))
+ itemLibraryEntry.setLibraryEntryIconPath(iconPath);
+ itemLibraryEntry.setTypeIcon(QIcon(defaultIconPath));
// load hints file if exists
QFile hintsFile(qmlIt.fileInfo().absolutePath() + '/' + name + ".hints");