13 #include <QtCore/QObject>
14 #include <QtCore/QVector>
15 #include <QtCore/QVariant>
16 #include <QtCore/QUuid>
19 #include <unordered_map>
21 #include <DependencyManager.h>
22 #include <SpatiallyNestable.h>
24 #include "graphics/Material.h"
25 #include "graphics/TextureMap.h"
31 using ModelPointer = std::shared_ptr<Model>;
36 namespace scriptable {
37 using Mesh = graphics::Mesh;
38 using MeshPointer = std::shared_ptr<scriptable::Mesh>;
39 using WeakMeshPointer = std::weak_ptr<scriptable::Mesh>;
41 class ScriptableModelBase;
42 using ScriptableModelBasePointer = QPointer<ScriptableModelBase>;
45 using ModelProviderPointer = std::shared_ptr<scriptable::ModelProvider>;
46 using WeakModelProviderPointer = std::weak_ptr<scriptable::ModelProvider>;
48 class ScriptableMaterial {
50 ScriptableMaterial() {}
51 ScriptableMaterial(
const graphics::MaterialPointer& material);
52 ScriptableMaterial(
const ScriptableMaterial& material) { *
this = material; }
53 ScriptableMaterial& operator=(
const ScriptableMaterial& material);
57 float opacity { 0.0f };
58 float roughness { 0.0f };
59 float metallic { 0.0f };
60 float scattering { 0.0f };
62 glm::vec3 emissive { 0.0f };
63 glm::vec3 albedo { 0.0f };
64 QString emissiveMap {
"" };
65 QString albedoMap {
"" };
66 QString opacityMap {
"" };
67 QString opacityMapMode {
"" };
68 float opacityCutoff { 0.0f };
69 QString metallicMap {
"" };
70 QString specularMap {
"" };
71 QString roughnessMap {
"" };
72 QString glossMap {
"" };
73 QString normalMap {
"" };
74 QString bumpMap {
"" };
75 QString occlusionMap {
"" };
76 QString lightMap {
"" };
77 QString scatteringMap {
"" };
78 std::array<glm::mat4, graphics::Material::NUM_TEXCOORD_TRANSFORMS> texCoordTransforms;
79 QString cullFaceMode {
"" };
80 bool defaultFallthrough {
false };
81 std::unordered_map<uint, bool> propertyFallthroughs;
83 QString procedural {
"" };
85 glm::vec3 shade { 0.0f };
86 QString shadeMap {
"" };
87 float shadingShift { 0.0f };
88 QString shadingShiftMap {
"" };
89 float shadingToony { 0.0f };
90 glm::vec3 matcap { 0.0f };
91 QString matcapMap {
"" };
92 glm::vec3 parametricRim { 0.0f };
93 float parametricRimFresnelPower { 0.0f };
94 float parametricRimLift { 0.0f };
95 QString rimMap {
"" };
96 float rimLightingMix { 0.0f };
97 QString outlineWidthMode {
"" };
98 float outlineWidth { 0.0f };
99 glm::vec3 outline { 0.0f };
100 QString uvAnimationMaskMap {
"" };
101 float uvAnimationScrollXSpeed { 0.0f };
102 float uvAnimationScrollYSpeed { 0.0f };
103 float uvAnimationRotationSpeed { 0.0f };
105 graphics::MaterialKey key { 0 };
115 class ScriptableMaterialLayer {
117 ScriptableMaterialLayer() {}
118 ScriptableMaterialLayer(
const graphics::MaterialLayer& materialLayer) : material(materialLayer.material), priority(materialLayer.priority) {}
119 ScriptableMaterialLayer(
const ScriptableMaterialLayer& materialLayer) { *
this = materialLayer; }
120 ScriptableMaterialLayer& operator=(
const ScriptableMaterialLayer& materialLayer);
122 ScriptableMaterial material;
125 typedef QHash<QString, QVector<scriptable::ScriptableMaterialLayer>> MultiMaterialMap;
127 class ScriptableMeshBase :
public QObject {
130 WeakModelProviderPointer provider;
131 ScriptableModelBasePointer model;
132 WeakMeshPointer weakMesh;
133 MeshPointer strongMesh;
134 ScriptableMeshBase(WeakModelProviderPointer provider, ScriptableModelBasePointer model, WeakMeshPointer weakMesh, QObject* parent);
135 ScriptableMeshBase(WeakMeshPointer weakMesh = WeakMeshPointer(), QObject* parent =
nullptr);
136 ScriptableMeshBase(
const ScriptableMeshBase& other, QObject* parent =
nullptr) : QObject(parent) { *
this = other; }
137 ScriptableMeshBase& operator=(
const ScriptableMeshBase& view);
138 virtual ~ScriptableMeshBase();
146 Q_INVOKABLE
const scriptable::MeshPointer getMeshPointer()
const {
return weakMesh.lock(); }
154 Q_INVOKABLE
const scriptable::ModelProviderPointer getModelProviderPointer()
const {
return provider.lock(); }
162 Q_INVOKABLE
const scriptable::ScriptableModelBasePointer getModelBasePointer()
const {
return model; }
166 class ScriptableModelBase :
public QObject {
169 WeakModelProviderPointer provider;
171 QVector<scriptable::ScriptableMeshBase> meshes;
172 MultiMaterialMap materialLayers;
173 QVector<QString> materialNames;
175 ScriptableModelBase(QObject* parent =
nullptr) : QObject(parent) {}
176 ScriptableModelBase(
const ScriptableModelBase& other) : QObject(other.parent()) { *
this = other; }
177 ScriptableModelBase& operator=(
const ScriptableModelBase& other);
178 virtual ~ScriptableModelBase();
180 void append(
const ScriptableMeshBase& mesh);
181 void append(scriptable::WeakMeshPointer mesh);
182 void appendMaterial(
const graphics::MaterialLayer& materialLayer,
int shapeID, std::string materialName);
183 void appendMaterials(
const std::unordered_map<std::string, graphics::MultiMaterial>& materialsToAppend);
184 void appendMaterialNames(
const std::vector<std::string>& names);
191 class ModelProvider {
193 NestableType modelProviderType;
194 virtual scriptable::ScriptableModelBase getScriptableModel() = 0;
195 virtual bool canReplaceModelMeshPart(
int meshIndex,
int partIndex) {
return false; }
196 virtual bool replaceScriptableModelMeshPart(scriptable::ScriptableModelBasePointer model,
int meshIndex,
int partIndex) {
return false; }
200 class ModelProviderFactory :
public QObject,
public Dependency {
203 virtual scriptable::ModelProviderPointer lookupModelProvider(
const QUuid& uuid) = 0;
205 void modelAddedToScene(
const QUuid& objectID, NestableType nestableType,
const ModelPointer& sender);
206 void modelRemovedFromScene(
const QUuid& objectID, NestableType nestableType,
const ModelPointer& sender);
209 class ScriptableModel;
210 using ScriptableModelPointer = QPointer<ScriptableModel>;
211 class ScriptableMesh;
212 using ScriptableMeshPointer = QPointer<ScriptableMesh>;
213 class ScriptableMeshPart;
214 using ScriptableMeshPartPointer = QPointer<ScriptableMeshPart>;
A generic 3D model displaying geometry loaded from a URL.
Definition: Model.h:84