Showing the changes to libraries/script-engine/src/ModelScriptingInterface.cpp (1 of 7 files). Show all
Unified · Split
| @@ -12,7 +12,9 @@ · 11 unmodified lines | ||
| 12 | 12 | #include <QScriptEngine> |
| 13 | 13 | #include <QScriptValueIterator> |
| 14 | 14 | #include <QtScript/QScriptValue> |
| 15 | +#include <model/MeshFace.h> | |
| 15 | 16 | #include "ScriptEngine.h" |
| 17 | +#include "ScriptEngineLogging.h" | |
| 16 | 18 | #include "ModelScriptingInterface.h" |
| 17 | 19 | #include "OBJWriter.h" |
| 18 | 20 | |
| @@ -20,6 +22,8 @@ ModelScriptingInterface::ModelScriptingInterface(QObject* parent) : QObject(pare · 1 unmodified line | ||
| 20 | 22 | _modelScriptEngine = qobject_cast<ScriptEngine*>(parent); |
| 21 | 23 | |
| 22 | 24 | qScriptRegisterSequenceMetaType<QList<MeshProxy*>>(_modelScriptEngine); |
| 25 | + qScriptRegisterMetaType(_modelScriptEngine, meshFaceToScriptValue, meshFaceFromScriptValue); | |
| 26 | + qScriptRegisterMetaType(_modelScriptEngine, qVectorMeshFaceToScriptValue, qVectorMeshFaceFromScriptValue); | |
| 23 | 27 | } |
| 24 | 28 | |
| 25 | 29 | QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) { |
| @@ -118,8 +122,6 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 92 unmodified lines | ||
| 118 | 122 | return meshToScriptValue(_modelScriptEngine, resultProxy); |
| 119 | 123 | } |
| 120 | 124 | |
| 121 | − | |
| 122 | − | |
| 123 | 125 | QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) { |
| 124 | 126 | if (!meshProxy) { |
| 125 | 127 | return QScriptValue(false); |
| @@ -135,3 +137,57 @@ QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshPro · 9 unmodified lines | ||
| 135 | 137 | MeshProxy* resultProxy = new MeshProxy(result); |
| 136 | 138 | return meshToScriptValue(_modelScriptEngine, resultProxy); |
| 137 | 139 | } |
| 140 | + | |
| 141 | +QScriptValue ModelScriptingInterface::newMesh(const QVector<glm::vec3>& vertices, | |
| 142 | + const QVector<glm::vec3>& normals, | |
| 143 | + const QVector<MeshFace>& faces) { | |
| 144 | + model::MeshPointer mesh(new model::Mesh()); | |
| 145 | + | |
| 146 | + // vertices | |
| 147 | + auto vertexBuffer = std::make_shared<gpu::Buffer>(vertices.size() * sizeof(glm::vec3), (gpu::Byte*)vertices.data()); | |
| 148 | + auto vertexBufferPtr = gpu::BufferPointer(vertexBuffer); | |
| 149 | + gpu::BufferView vertexBufferView(vertexBufferPtr, 0, vertexBufferPtr->getSize(), | |
| 150 | + sizeof(glm::vec3), gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)); | |
| 151 | + mesh->setVertexBuffer(vertexBufferView); | |
| 152 | + | |
| 153 | + if (vertices.size() == normals.size()) { | |
| 154 | + // normals | |
| 155 | + auto normalBuffer = std::make_shared<gpu::Buffer>(normals.size() * sizeof(glm::vec3), (gpu::Byte*)normals.data()); | |
| 156 | + auto normalBufferPtr = gpu::BufferPointer(normalBuffer); | |
| 157 | + gpu::BufferView normalBufferView(normalBufferPtr, 0, normalBufferPtr->getSize(), | |
| 158 | + sizeof(glm::vec3), gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)); | |
| 159 | + mesh->addAttribute(gpu::Stream::NORMAL, normalBufferView); | |
| 160 | + } else { | |
| 161 | + qCDebug(scriptengine) << "ModelScriptingInterface::newMesh normals must be same length as vertices"; | |
| 162 | + } | |
| 163 | + | |
| 164 | + // indices (faces) | |
| 165 | + int VERTICES_PER_TRIANGLE = 3; | |
| 166 | + int indexBufferSize = faces.size() * sizeof(uint32_t) * VERTICES_PER_TRIANGLE; | |
| 167 | + unsigned char* indexData = new unsigned char[indexBufferSize]; | |
| 168 | + unsigned char* indexDataCursor = indexData; | |
| 169 | + foreach(const MeshFace& meshFace, faces) { | |
| 170 | + for (int i = 0; i < VERTICES_PER_TRIANGLE; i++) { | |
| 171 | + memcpy(indexDataCursor, &meshFace.vertexIndices[i], sizeof(uint32_t)); | |
| 172 | + indexDataCursor += sizeof(uint32_t); | |
| 173 | + } | |
| 174 | + } | |
| 175 | + auto indexBuffer = std::make_shared<gpu::Buffer>(indexBufferSize, (gpu::Byte*)indexData); | |
| 176 | + auto indexBufferPtr = gpu::BufferPointer(indexBuffer); | |
| 177 | + gpu::BufferView indexBufferView(indexBufferPtr, gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW)); | |
| 178 | + mesh->setIndexBuffer(indexBufferView); | |
| 179 | + | |
| 180 | + // parts | |
| 181 | + std::vector<model::Mesh::Part> parts; | |
| 182 | + parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex | |
| 183 | + (model::Index)faces.size() * 3, // numIndices | |
| 184 | + (model::Index)0, // baseVertex | |
| 185 | + model::Mesh::TRIANGLES)); // topology | |
| 186 | + mesh->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(model::Mesh::Part), | |
| 187 | + (gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL)); | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + MeshProxy* meshProxy = new MeshProxy(mesh); | |
| 192 | + return meshToScriptValue(_modelScriptEngine, meshProxy); | |
| 193 | +} | |