1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
// 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 "createtexture.h"
#include "abstractview.h"
#include "modelnodeoperations.h"
#include "nodelistproperty.h"
#include "nodemetainfo.h"
#include "qmlobjectnode.h"
#include "variantproperty.h"
#include <coreplugin/messagebox.h>
#include <QTimer>
namespace QmlDesigner {
CreateTexture::CreateTexture(AbstractView *view, bool importFile)
: m_view{view}
, m_importFile{importFile}
{}
void CreateTexture::execute(const QString &filePath, AddTextureMode mode, int sceneId)
{
if (m_importFile && !addFileToProject(filePath))
return;
ModelNode texture = createTextureFromImage(filePath, mode);
if (!texture.isValid())
return;
if (mode == AddTextureMode::LightProbe && sceneId != -1)
assignTextureAsLightProbe(texture, sceneId);
QTimer::singleShot(0, m_view, [this, texture]() {
if (m_view->model())
m_view->emitCustomNotification("selected_texture_changed", {texture});
});
}
bool CreateTexture::addFileToProject(const QString &filePath)
{
AddFilesResult result = ModelNodeOperations::addImageToProject({filePath}, "images", false);
if (result.status() == AddFilesResult::Failed) {
Core::AsynchronousMessageBox::warning(QObject::tr("Failed to Add Texture"),
QObject::tr("Could not add %1 to project.").arg(filePath));
return false;
}
return true;
}
ModelNode CreateTexture::createTextureFromImage(const QString &assetPath, AddTextureMode mode)
{
if (mode != AddTextureMode::Texture && mode != AddTextureMode::LightProbe)
return {};
ModelNode matLib = m_view->materialLibraryNode();
if (!matLib.isValid())
return {};
NodeMetaInfo metaInfo = m_view->model()->qtQuick3DTextureMetaInfo();
QString sourceVal = QLatin1String("images/%1").arg(assetPath.split('/').last());
ModelNode newTexNode = m_view->getTextureDefaultInstance(sourceVal);
if (!newTexNode.isValid()) {
newTexNode = m_view->createModelNode("QtQuick3D.Texture",
metaInfo.majorVersion(),
metaInfo.minorVersion());
newTexNode.validId();
VariantProperty sourceProp = newTexNode.variantProperty("source");
sourceProp.setValue(sourceVal);
matLib.defaultNodeListProperty().reparentHere(newTexNode);
}
return newTexNode;
}
void CreateTexture::assignTextureAsLightProbe(const ModelNode &texture, int sceneId)
{
ModelNode sceneEnvNode = resolveSceneEnv(sceneId);
QmlObjectNode sceneEnv = sceneEnvNode;
if (sceneEnv.isValid()) {
sceneEnv.setBindingProperty("lightProbe", texture.id());
sceneEnv.setVariantProperty("backgroundMode",
QVariant::fromValue(Enumeration("SceneEnvironment",
"SkyBox")));
}
}
ModelNode CreateTexture::resolveSceneEnv(int sceneId)
{
ModelNode activeSceneEnv;
if (sceneId != -1) {
ModelNode activeScene = m_view->active3DSceneNode();
if (activeScene.isValid()) {
QmlObjectNode view3D;
if (activeScene.metaInfo().isQtQuick3DView3D()) {
view3D = activeScene;
} else {
ModelNode sceneParent = activeScene.parentProperty().parentModelNode();
if (sceneParent.metaInfo().isQtQuick3DView3D())
view3D = sceneParent;
}
if (view3D.isValid())
activeSceneEnv = m_view->modelNodeForId(view3D.expression("environment"));
}
}
return activeSceneEnv;
}
} // namespace QmlDesigner
|