Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qssgscenedesc.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5
7
9
10bool QSSGSceneDesc::PropertyCall::set(QQuick3DObject &, const char *, const void *) { return false; }
11bool QSSGSceneDesc::PropertyCall::get(const QQuick3DObject &, const void *[]) const { return false; }
12
13static inline quint16 getNextNodeId(QSSGSceneDesc::Scene &scene)
14{
15 /* root node uses the default value 0 */
16 return ++scene.nodeId;
17}
18
19void QSSGSceneDesc::addNode(QSSGSceneDesc::Node &parent, QSSGSceneDesc::Node &node)
20{
21 Q_ASSERT(parent.scene);
22 node.scene = parent.scene;
23 node.id = getNextNodeId(*parent.scene);
24
25 if (QSSGRenderGraphObject::isResource(node.runtimeType) || node.nodeType == Node::Type::Mesh || node.nodeType == Node::Type::Skeleton)
26 node.scene->resources.push_back(&node);
27 else // Here goes nothing: kick all the resources out of the tree...
28 parent.children.push_back(&node);
29}
30
31void QSSGSceneDesc::addNode(QSSGSceneDesc::Scene &scene, QSSGSceneDesc::Node &node)
32{
33 if (scene.root) {
34 addNode(*scene.root, node);
35 } else {
36 Q_ASSERT(node.id == 0);
37 node.scene = &scene;
38 scene.root = &node;
39 }
40}
41
42void QSSGSceneDesc::Scene::reset()
43{
44 id.clear();
45 nodeId = 0;
46 root = nullptr;
47 resources.clear();
48 meshStorage.clear();
49 materialVariants.clear();
50}
51
52void QSSGSceneDesc::Scene::cleanup()
53{
54 id.clear();
55 nodeId = 0;
56
57 // An import that failed before building anything leaves no root, and
58 // releasing such a scene has to be allowed
59 if (root) {
60 root->cleanupChildren();
61 delete root;
62 root = nullptr;
63 }
64
65 qDeleteAll(resources);
66 resources.clear();
67
68 for (auto *anim : std::as_const(animations)) {
69 for (auto *ch : std::as_const(anim->channels)) {
70 qDeleteAll(ch->keys);
71 ch->keys.clear();
72 delete ch;
73 }
74 delete anim;
75 }
76 animations.clear();
77}
78
79QMetaType QSSGSceneDesc::listViewMetaType()
80{
81 return QMetaType::fromType<QSSGSceneDesc::ListView *>();
82}
83
84void QSSGSceneDesc::destructValue(QVariant &value)
85{
86 if (!value.isValid())
87 return;
88
89 if (value.metaType() == QMetaType::fromType<QSSGSceneDesc::NodeList *>())
90 delete value.value<NodeList *>();
91 else if (value.metaType() == QMetaType::fromType<QSSGSceneDesc::ListView *>())
92 delete value.value<ListView *>();
93 // Non-pointer types are destructed by ~QVariant
94 else if ((value.metaType().flags() & QMetaType::TypeFlag::IsPointer)
95 // Mesh node will be deleted when cleaning up resources.
96 && (value.metaType() != QMetaType::fromType<QSSGSceneDesc::Mesh *>())
97 // Referencing nodes will not be deleted here.
98 // They should be deleted in the node hierarchy or resources.
99 && (value.metaType().id() != qMetaTypeId<QSSGSceneDesc::Node *>())) {
100 qWarning() << value.metaType().name() << " was not destroyed correctly.";
101 }
102}
103
105{
106 for (auto *prop : std::as_const(node.properties))
107 delete prop;
108 // Not necessary to clear the list as long as we only call this from the destructor
109}
110
111QSSGSceneDesc::Node::~Node() { destructNode(*this); }
112
113void QSSGSceneDesc::Node::cleanupChildren()
114{
115 auto firstIt = children.begin();
116 auto lastIt = children.end();
117 for (auto it = firstIt; it != lastIt; ++it) {
118 Node *node = *it;
119 node->cleanupChildren();
120 delete node;
121 }
122}
123
124QSSGSceneDesc::Property *QSSGSceneDesc::setProperty(Node &node, const char *name, QVariant &&value)
125{
126 Q_ASSERT(node.scene);
127 QSSGSceneDesc::Property *prop = new QSSGSceneDesc::Property;
128 prop->name = name;
129 prop->call = nullptr;
130 prop->value = value;
131 node.properties.push_back(prop);
132 return prop;
133}
134
135QSSGSceneDesc::Model::Model() : Node(Node::Type::Model, Node::RuntimeType::Model) {}
136
137QSSGSceneDesc::Camera::Camera(RuntimeType rt) : Node(Node::Type::Camera, rt) {}
138
139QSSGSceneDesc::Light::Light(RuntimeType rt) : Node(Node::Type::Light, rt) {}
140
141QSSGSceneDesc::Skin::Skin() : Node(Node::Type::Skin, Node::RuntimeType::Skin) {}
142
143QSSGSceneDesc::Skeleton::Skeleton() : Node(Node::Type::Skeleton, Node::RuntimeType::Skeleton) {}
144
145QSSGSceneDesc::Joint::Joint() : Node(Node::Type::Joint, Node::RuntimeType::Joint) {}
146
147QSSGSceneDesc::MorphTarget::MorphTarget() : Node(Node::Type::MorphTarget, Node::RuntimeType::MorphTarget) {}
148QSSGSceneDesc::Instancing::Instancing() : Node(Node::Type::Instancing, Node::RuntimeType::ModelInstance) {}
149
150QSSGSceneDesc::Material::Material(RuntimeType rt) : Node(Node::Type::Material, rt) {}
151
152QSSGSceneDesc::Texture::Texture(RuntimeType rt, const QByteArray &name)
153 : Node(name, Node::Type::Texture, rt)
154{
155}
156
157QSSGSceneDesc::TextureData::TextureData(const QByteArray &textureData, QSize size, const QByteArray &format, quint8 flags, QByteArray name)
158 : Node(name, Node::Type::Texture, RuntimeType::TextureData)
159 , data(textureData)
160 , sz(size)
161 , fmt(format)
162 , flgs(flags)
163{}
164
165QSSGSceneDesc::Mesh::Mesh(QByteArray name, qsizetype index)
166 : Node(name, Node::Type::Mesh, RuntimeType::Node)
167 , idx(index)
168{}
169
170QT_END_NAMESPACE
Q_QUICK3DASSETUTILS_EXPORT void addNode(Node &parent, Node &node)
Q_QUICK3DASSETUTILS_EXPORT void addNode(Scene &scene, Node &node)
Q_QUICK3DASSETUTILS_EXPORT void destructNode(QSSGSceneDesc::Node &node)
Q_QUICK3DASSETUTILS_EXPORT void destructValue(QVariant &value)
Combined button and popup list for selecting options.
static quint16 getNextNodeId(QSSGSceneDesc::Scene &scene)