forked from qt-creator/qt-creator
QmlDesigner: Move assignMaterialTo3dModel() to a utils class
In order to avoid dependency of AbstractView on QmlObjectNode. Moreover, it seems not in the right place anymore since it is not really part of an abstract code. Change-Id: I7a64122e6ab0a2e314c593f0f47dadaa07d772e2 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
@@ -825,6 +825,7 @@ extend_qtc_plugin(QmlDesigner
|
|||||||
materialbrowserwidget.cpp materialbrowserwidget.h
|
materialbrowserwidget.cpp materialbrowserwidget.h
|
||||||
materialbrowsermodel.cpp materialbrowsermodel.h
|
materialbrowsermodel.cpp materialbrowsermodel.h
|
||||||
materialbrowsertexturesmodel.cpp materialbrowsertexturesmodel.h
|
materialbrowsertexturesmodel.cpp materialbrowsertexturesmodel.h
|
||||||
|
materialutils.cpp materialutils.h
|
||||||
)
|
)
|
||||||
|
|
||||||
extend_qtc_plugin(QmlDesigner
|
extend_qtc_plugin(QmlDesigner
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include "edit3dcanvas.h"
|
#include "edit3dcanvas.h"
|
||||||
#include "edit3dviewconfig.h"
|
#include "edit3dviewconfig.h"
|
||||||
#include "edit3dwidget.h"
|
#include "edit3dwidget.h"
|
||||||
|
#include "materialutils.h"
|
||||||
#include "metainfo.h"
|
#include "metainfo.h"
|
||||||
#include "nodehints.h"
|
#include "nodehints.h"
|
||||||
#include "nodeinstanceview.h"
|
#include "nodeinstanceview.h"
|
||||||
@@ -324,7 +325,7 @@ void Edit3DView::nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos
|
|||||||
createdNode = QmlVisualNode::createQml3DNode(
|
createdNode = QmlVisualNode::createQml3DNode(
|
||||||
this, m_droppedEntry, edit3DWidget()->canvas()->activeScene(), pos3d).modelNode();
|
this, m_droppedEntry, edit3DWidget()->canvas()->activeScene(), pos3d).modelNode();
|
||||||
if (createdNode.metaInfo().isQtQuick3DModel())
|
if (createdNode.metaInfo().isQtQuick3DModel())
|
||||||
assignMaterialTo3dModel(createdNode);
|
MaterialUtils::assignMaterialTo3dModel(this, createdNode);
|
||||||
});
|
});
|
||||||
if (createdNode.isValid())
|
if (createdNode.isValid())
|
||||||
setSelectedModelNode(createdNode);
|
setSelectedModelNode(createdNode);
|
||||||
@@ -332,7 +333,7 @@ void Edit3DView::nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos
|
|||||||
bool isModel = modelNode.metaInfo().isQtQuick3DModel();
|
bool isModel = modelNode.metaInfo().isQtQuick3DModel();
|
||||||
if (m_droppedModelNode.isValid() && isModel) {
|
if (m_droppedModelNode.isValid() && isModel) {
|
||||||
executeInTransaction(__FUNCTION__, [&] {
|
executeInTransaction(__FUNCTION__, [&] {
|
||||||
assignMaterialTo3dModel(modelNode, m_droppedModelNode);
|
MaterialUtils::assignMaterialTo3dModel(this, modelNode, m_droppedModelNode);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else if (m_nodeAtPosReqType == NodeAtPosReqType::BundleMaterialDrop) {
|
} else if (m_nodeAtPosReqType == NodeAtPosReqType::BundleMaterialDrop) {
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
#include "edit3dcanvas.h"
|
#include "edit3dcanvas.h"
|
||||||
#include "edit3dview.h"
|
#include "edit3dview.h"
|
||||||
#include "edit3dvisibilitytogglesmenu.h"
|
#include "edit3dvisibilitytogglesmenu.h"
|
||||||
|
#include "materialutils.h"
|
||||||
#include "metainfo.h"
|
#include "metainfo.h"
|
||||||
#include "modelnodeoperations.h"
|
#include "modelnodeoperations.h"
|
||||||
#include "nodeabstractproperty.h"
|
#include "nodeabstractproperty.h"
|
||||||
@@ -387,7 +388,7 @@ void Edit3DWidget::onCreateAction()
|
|||||||
|
|
||||||
// if added node is a Model, assign it a material
|
// if added node is a Model, assign it a material
|
||||||
if (modelNode.metaInfo().isQtQuick3DModel())
|
if (modelNode.metaInfo().isQtQuick3DModel())
|
||||||
m_view->assignMaterialTo3dModel(modelNode);
|
MaterialUtils::assignMaterialTo3dModel(m_view, modelNode);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
#include "formeditorview.h"
|
#include "formeditorview.h"
|
||||||
#include "assetslibrarywidget.h"
|
#include "assetslibrarywidget.h"
|
||||||
#include "assetslibrarymodel.h"
|
#include "assetslibrarymodel.h"
|
||||||
|
#include "materialutils.h"
|
||||||
#include <metainfo.h>
|
#include <metainfo.h>
|
||||||
#include <modelnodeoperations.h>
|
#include <modelnodeoperations.h>
|
||||||
#include <nodehints.h>
|
#include <nodehints.h>
|
||||||
@@ -441,7 +442,7 @@ void DragTool::handleView3dDrop()
|
|||||||
const QList<ModelNode> models = dragNode.modelNode().subModelNodesOfType(
|
const QList<ModelNode> models = dragNode.modelNode().subModelNodesOfType(
|
||||||
model->qtQuick3DModelMetaInfo());
|
model->qtQuick3DModelMetaInfo());
|
||||||
QTC_ASSERT(models.size() == 1, return);
|
QTC_ASSERT(models.size() == 1, return);
|
||||||
view()->assignMaterialTo3dModel(models.at(0));
|
MaterialUtils::assignMaterialTo3dModel(view(), models.at(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,71 @@
|
|||||||
|
// 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 "materialutils.h"
|
||||||
|
|
||||||
|
#include "abstractview.h"
|
||||||
|
#include "nodelistproperty.h"
|
||||||
|
#include "nodemetainfo.h"
|
||||||
|
#include "qmlobjectnode.h"
|
||||||
|
#include "variantproperty.h"
|
||||||
|
|
||||||
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
|
namespace QmlDesigner {
|
||||||
|
|
||||||
|
// Assigns given material to a 3D model.
|
||||||
|
// The assigned material is also inserted into material library if not already there.
|
||||||
|
// If given material is not valid, first existing material from material library is used,
|
||||||
|
// or if material library is empty, a new material is created.
|
||||||
|
// This function should be called only from inside a transaction, as it potentially does many
|
||||||
|
// changes to model.
|
||||||
|
void MaterialUtils::assignMaterialTo3dModel(AbstractView *view, const ModelNode &modelNode,
|
||||||
|
const ModelNode &materialNode)
|
||||||
|
{
|
||||||
|
QTC_ASSERT(modelNode.isValid() && modelNode.metaInfo().isQtQuick3DModel(), return);
|
||||||
|
|
||||||
|
ModelNode matLib = view->materialLibraryNode();
|
||||||
|
|
||||||
|
if (!matLib.isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
ModelNode newMaterialNode;
|
||||||
|
|
||||||
|
if (materialNode.isValid() && materialNode.metaInfo().isQtQuick3DMaterial()) {
|
||||||
|
newMaterialNode = materialNode;
|
||||||
|
} else {
|
||||||
|
const QList<ModelNode> materials = matLib.directSubModelNodes();
|
||||||
|
if (materials.size() > 0) {
|
||||||
|
for (const ModelNode &mat : materials) {
|
||||||
|
if (mat.metaInfo().isQtQuick3DMaterial()) {
|
||||||
|
newMaterialNode = mat;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no valid material, create a new default material
|
||||||
|
if (!newMaterialNode.isValid()) {
|
||||||
|
NodeMetaInfo metaInfo = view->model()->qtQuick3DPrincipledMaterialMetaInfo();
|
||||||
|
newMaterialNode = view->createModelNode("QtQuick3D.PrincipledMaterial",
|
||||||
|
metaInfo.majorVersion(),
|
||||||
|
metaInfo.minorVersion());
|
||||||
|
newMaterialNode.validId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QTC_ASSERT(newMaterialNode.isValid(), return);
|
||||||
|
|
||||||
|
VariantProperty matNameProp = newMaterialNode.variantProperty("objectName");
|
||||||
|
if (matNameProp.value().isNull())
|
||||||
|
matNameProp.setValue("New Material");
|
||||||
|
|
||||||
|
if (!newMaterialNode.hasParentProperty()
|
||||||
|
|| newMaterialNode.parentProperty() != matLib.defaultNodeListProperty()) {
|
||||||
|
matLib.defaultNodeListProperty().reparentHere(newMaterialNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
QmlObjectNode(modelNode).setBindingProperty("materials", newMaterialNode.id());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace QmlDesigner
|
@@ -0,0 +1,20 @@
|
|||||||
|
// Copyright (C) 2023 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "modelnode.h"
|
||||||
|
|
||||||
|
namespace QmlDesigner {
|
||||||
|
|
||||||
|
class AbstractView;
|
||||||
|
|
||||||
|
class MaterialUtils
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MaterialUtils();
|
||||||
|
|
||||||
|
static void assignMaterialTo3dModel(AbstractView *view, const ModelNode &modelNode,
|
||||||
|
const ModelNode &materialNode = {});
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace QmlDesigner
|
@@ -17,6 +17,7 @@
|
|||||||
#include <nodeproperty.h>
|
#include <nodeproperty.h>
|
||||||
#include <variantproperty.h>
|
#include <variantproperty.h>
|
||||||
#include <metainfo.h>
|
#include <metainfo.h>
|
||||||
|
#include <materialutils.h>
|
||||||
#include <abstractview.h>
|
#include <abstractview.h>
|
||||||
#include <invalididexception.h>
|
#include <invalididexception.h>
|
||||||
#include <rewritingexception.h>
|
#include <rewritingexception.h>
|
||||||
@@ -710,7 +711,7 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in
|
|||||||
newQmlObjectNode.destroy();
|
newQmlObjectNode.destroy();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_view->assignMaterialTo3dModel(targetNode, newModelNode);
|
MaterialUtils::assignMaterialTo3dModel(m_view, targetNode, newModelNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
ChooseFromPropertyListDialog *dialog = ChooseFromPropertyListDialog::createIfNeeded(
|
ChooseFromPropertyListDialog *dialog = ChooseFromPropertyListDialog::createIfNeeded(
|
||||||
@@ -751,9 +752,9 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in
|
|||||||
const QList<ModelNode> models = newModelNode.subModelNodesOfType(
|
const QList<ModelNode> models = newModelNode.subModelNodesOfType(
|
||||||
m_view->model()->qtQuick3DModelMetaInfo());
|
m_view->model()->qtQuick3DModelMetaInfo());
|
||||||
QTC_ASSERT(models.size() == 1, return);
|
QTC_ASSERT(models.size() == 1, return);
|
||||||
m_view->assignMaterialTo3dModel(models.at(0));
|
MaterialUtils::assignMaterialTo3dModel(m_view, models.at(0));
|
||||||
} else if (newModelNode.metaInfo().isQtQuick3DModel()) {
|
} else if (newModelNode.metaInfo().isQtQuick3DModel()) {
|
||||||
m_view->assignMaterialTo3dModel(newModelNode);
|
MaterialUtils::assignMaterialTo3dModel(m_view, newModelNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!validContainer) {
|
if (!validContainer) {
|
||||||
@@ -836,7 +837,7 @@ void NavigatorTreeModel::handleMaterialDrop(const QMimeData *mimeData, const QMo
|
|||||||
ModelNode matNode = m_view->modelNodeForInternalId(internalId);
|
ModelNode matNode = m_view->modelNodeForInternalId(internalId);
|
||||||
|
|
||||||
m_view->executeInTransaction(__FUNCTION__, [&] {
|
m_view->executeInTransaction(__FUNCTION__, [&] {
|
||||||
m_view->assignMaterialTo3dModel(targetNode, matNode);
|
MaterialUtils::assignMaterialTo3dModel(m_view, targetNode, matNode);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -231,7 +231,6 @@ public:
|
|||||||
ModelNode materialLibraryNode();
|
ModelNode materialLibraryNode();
|
||||||
bool isPartOfMaterialLibrary(const ModelNode &node);
|
bool isPartOfMaterialLibrary(const ModelNode &node);
|
||||||
ModelNode active3DSceneNode();
|
ModelNode active3DSceneNode();
|
||||||
void assignMaterialTo3dModel(const ModelNode &modelNode, const ModelNode &materialNode = {});
|
|
||||||
ModelNode getTextureDefaultInstance(const QString &source);
|
ModelNode getTextureDefaultInstance(const QString &source);
|
||||||
|
|
||||||
const NodeInstanceView *nodeInstanceView() const;
|
const NodeInstanceView *nodeInstanceView() const;
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
#include "model_p.h"
|
#include "model_p.h"
|
||||||
#include "internalnode_p.h"
|
#include "internalnode_p.h"
|
||||||
#include "nodeinstanceview.h"
|
#include "nodeinstanceview.h"
|
||||||
#include "qmlobjectnode.h"
|
|
||||||
#include <qmlstate.h>
|
#include <qmlstate.h>
|
||||||
#include <qmltimeline.h>
|
#include <qmltimeline.h>
|
||||||
#include <nodemetainfo.h>
|
#include <nodemetainfo.h>
|
||||||
@@ -879,60 +878,6 @@ ModelNode AbstractView::active3DSceneNode()
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assigns given material to a 3D model.
|
|
||||||
// The assigned material is also inserted into material library if not already there.
|
|
||||||
// If given material is not valid, first existing material from material library is used,
|
|
||||||
// or if material library is empty, a new material is created.
|
|
||||||
// This function should be called only from inside a transaction, as it potentially does many
|
|
||||||
// changes to model.
|
|
||||||
void AbstractView::assignMaterialTo3dModel(const ModelNode &modelNode, const ModelNode &materialNode)
|
|
||||||
{
|
|
||||||
QTC_ASSERT(modelNode.isValid() && modelNode.metaInfo().isQtQuick3DModel(), return );
|
|
||||||
|
|
||||||
ModelNode matLib = materialLibraryNode();
|
|
||||||
|
|
||||||
if (!matLib.isValid())
|
|
||||||
return;
|
|
||||||
|
|
||||||
ModelNode newMaterialNode;
|
|
||||||
|
|
||||||
if (materialNode.isValid() && materialNode.metaInfo().isQtQuick3DMaterial()) {
|
|
||||||
newMaterialNode = materialNode;
|
|
||||||
} else {
|
|
||||||
const QList<ModelNode> materials = matLib.directSubModelNodes();
|
|
||||||
if (materials.size() > 0) {
|
|
||||||
for (const ModelNode &mat : materials) {
|
|
||||||
if (mat.metaInfo().isQtQuick3DMaterial()) {
|
|
||||||
newMaterialNode = mat;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if no valid material, create a new default material
|
|
||||||
if (!newMaterialNode.isValid()) {
|
|
||||||
NodeMetaInfo metaInfo = model()->qtQuick3DPrincipledMaterialMetaInfo();
|
|
||||||
newMaterialNode = createModelNode("QtQuick3D.PrincipledMaterial",
|
|
||||||
metaInfo.majorVersion(),
|
|
||||||
metaInfo.minorVersion());
|
|
||||||
newMaterialNode.validId();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QTC_ASSERT(newMaterialNode.isValid(), return);
|
|
||||||
|
|
||||||
VariantProperty matNameProp = newMaterialNode.variantProperty("objectName");
|
|
||||||
if (matNameProp.value().isNull())
|
|
||||||
matNameProp.setValue("New Material");
|
|
||||||
|
|
||||||
if (!newMaterialNode.hasParentProperty()
|
|
||||||
|| newMaterialNode.parentProperty() != matLib.defaultNodeListProperty()) {
|
|
||||||
matLib.defaultNodeListProperty().reparentHere(newMaterialNode);
|
|
||||||
}
|
|
||||||
|
|
||||||
QmlObjectNode(modelNode).setBindingProperty("materials", newMaterialNode.id());
|
|
||||||
}
|
|
||||||
|
|
||||||
ModelNode AbstractView::getTextureDefaultInstance(const QString &source)
|
ModelNode AbstractView::getTextureDefaultInstance(const QString &source)
|
||||||
{
|
{
|
||||||
ModelNode matLib = materialLibraryNode();
|
ModelNode matLib = materialLibraryNode();
|
||||||
|
Reference in New Issue
Block a user