12 #include "ScriptableMesh.h"
13 #include <Scriptable.h>
17 namespace scriptable {
63 class ScriptableMeshPart :
public QObject,
Scriptable {
65 Q_PROPERTY(
bool valid READ isValid)
66 Q_PROPERTY(glm::uint32 partIndex MEMBER partIndex CONSTANT)
67 Q_PROPERTY(glm::uint32 firstVertexIndex READ getFirstVertexIndex WRITE setFirstVertexIndex)
68 Q_PROPERTY(glm::uint32 baseVertexIndex READ getBaseVertexIndex WRITE setBaseVertexIndex)
69 Q_PROPERTY(glm::uint32 lastVertexIndex READ getLastVertexIndex WRITE setLastVertexIndex)
70 Q_PROPERTY(
int numVerticesPerFace READ getTopologyLength)
72 Q_PROPERTY(graphics::Mesh::Topology topology READ getTopology)
74 Q_PROPERTY(glm::uint32 numFaces READ getNumFaces)
75 Q_PROPERTY(glm::uint32 numAttributes READ getNumAttributes)
76 Q_PROPERTY(glm::uint32 numVertices READ getNumVertices)
77 Q_PROPERTY(glm::uint32 numIndices READ getNumIndices WRITE setNumIndices)
79 Q_PROPERTY(QVariantMap extents READ getPartExtents)
80 Q_PROPERTY(QVector<QString> attributeNames READ getAttributeNames)
81 Q_PROPERTY(QVariantMap bufferFormats READ getBufferFormats)
84 ScriptableMeshPart(scriptable::ScriptableMeshPointer parentMesh,
int partIndex);
85 ScriptableMeshPart& operator=(
const ScriptableMeshPart& view) { parentMesh=view.parentMesh;
return *
this; };
86 ScriptableMeshPart(
const ScriptableMeshPart& other) : QObject(other.parent()),
Scriptable(), parentMesh(other.parentMesh), partIndex(other.partIndex) {}
87 bool isValid()
const {
auto mesh = getMeshPointer();
return mesh && partIndex < mesh->getNumParts(); }
96 QVector<glm::uint32> getIndices()
const;
105 bool setIndices(
const QVector<glm::uint32>& indices);
115 QVector<glm::uint32> findNearbyPartVertexIndices(
const glm::vec3& origin,
float epsilon = 1e-6)
const;
124 QVariantList queryVertexAttributes(QVariant selector)
const;
127 QVariantMap getVertexAttributes(glm::uint32 vertexIndex)
const;
130 bool setVertexAttributes(glm::uint32 vertexIndex,
const QVariantMap& attributeValues);
141 QVariant getVertexProperty(glm::uint32 vertexIndex,
const QString& attributeName)
const;
153 bool setVertexProperty(glm::uint32 vertexIndex,
const QString& attributeName,
const QVariant& attributeValues);
161 QVector<glm::uint32> getFace(glm::uint32 faceIndex)
const;
169 QVariantMap scaleToFit(
float unitScale);
177 QVariantMap translate(
const glm::vec3& translation);
186 QVariantMap scale(
const glm::vec3& scale,
const glm::vec3& origin = glm::vec3(NAN));
196 QVariantMap rotateDegrees(
const glm::vec3& eulerAngles,
const glm::vec3& origin = glm::vec3(NAN));
206 QVariantMap rotate(
const glm::quat& rotation,
const glm::vec3& origin = glm::vec3(NAN));
214 QVariantMap transform(
const glm::mat4& transform);
217 glm::uint32 addAttribute(
const QString& attributeName,
const QVariant& defaultValue = QVariant());
228 glm::uint32 fillAttribute(
const QString& attributeName,
const QVariant& value);
237 bool removeAttribute(
const QString& attributeName);
246 bool dedupeVertices(
float epsilon = 1e-6);
253 scriptable::ScriptableMeshPointer getParentMesh()
const {
return parentMesh; }
264 bool replaceMeshPartData(scriptable::ScriptableMeshPartPointer source,
const QVector<QString>& attributeNames = QVector<QString>());
271 scriptable::ScriptableMeshPartPointer cloneMeshPart();
290 glm::uint32 updateVertexAttributes(
const ScriptValue& callback);
298 glm::uint32 forEachVertex(
const ScriptValue& callback);
310 bool isValidIndex(glm::uint32 vertexIndex,
const QString& attributeName = QString())
const;
313 scriptable::ScriptableMeshPointer parentMesh;
314 glm::uint32 partIndex;
317 const graphics::Mesh::Part& getMeshPart()
const;
318 scriptable::MeshPointer getMeshPointer()
const {
return parentMesh ? parentMesh->getMeshPointer() :
nullptr; }
319 QVariantMap getBufferFormats() {
return isValid() ? parentMesh->getBufferFormats() : QVariantMap(); }
320 glm::uint32 getNumAttributes()
const {
return isValid() ? parentMesh->getNumAttributes() : 0; }
322 bool setTopology(graphics::Mesh::Topology topology);
323 graphics::Mesh::Topology getTopology()
const {
return isValid() ? getMeshPart()._topology : graphics::Mesh::Topology(); }
324 glm::uint32 getTopologyLength()
const;
325 glm::uint32 getNumIndices()
const {
return isValid() ? getMeshPart()._numIndices : 0; }
326 bool setNumIndices(glm::uint32 numIndices) {
return setLastVertexIndex(getFirstVertexIndex() + numIndices); }
327 glm::uint32 getNumVertices()
const {
return isValid() ? parentMesh->getNumVertices() : 0; }
329 bool setFirstVertexIndex(glm::uint32 vertexIndex);
330 glm::uint32 getFirstVertexIndex()
const {
return isValid() ? getMeshPart()._startIndex : 0; }
331 bool setLastVertexIndex(glm::uint32 vertexIndex);
332 glm::uint32 getLastVertexIndex()
const {
return isValid() ? getFirstVertexIndex() + getNumIndices() - 1 : 0; }
333 bool setBaseVertexIndex(glm::uint32 vertexIndex);
334 glm::uint32 getBaseVertexIndex()
const {
return isValid() ? getMeshPart()._baseVertex : 0; }
336 glm::uint32 getNumFaces()
const {
return getNumIndices() / getTopologyLength(); }
337 QVector<QString> getAttributeNames()
const {
return isValid() ? parentMesh->getAttributeNames() : QVector<QString>(); }
338 QVariantMap getPartExtents()
const;
342 Q_DECLARE_METATYPE(scriptable::ScriptableMeshPartPointer)
343 Q_DECLARE_METATYPE(QVector<scriptable::ScriptableMeshPartPointer>)
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40
[ScriptInterface] Provides an engine-independent interface for QScriptable
Definition: Scriptable.h:29