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 | #include <QScriptEngine> | 12 | #include <QScriptEngine> |
| 13 | #include <QScriptValueIterator> | 13 | #include <QScriptValueIterator> |
| 14 | #include <QtScript/QScriptValue> | 14 | #include <QtScript/QScriptValue> |
| 15 | #include <model/MeshFace.h> | ||
| 15 | #include "ScriptEngine.h" | 16 | #include "ScriptEngine.h" |
| 17 | #include "ScriptEngineLogging.h" | ||
| 16 | #include "ModelScriptingInterface.h" | 18 | #include "ModelScriptingInterface.h" |
| 17 | #include "OBJWriter.h" | 19 | #include "OBJWriter.h" |
| 18 | 20 | ||
| @@ -20,6 +22,8 @@ ModelScriptingInterface::ModelScriptingInterface(QObject* parent) : QObject(pare · 1 unmodified line | |||
| 20 | _modelScriptEngine = qobject_cast<ScriptEngine*>(parent); | 22 | _modelScriptEngine = qobject_cast<ScriptEngine*>(parent); |
| 21 | 23 | ||
| 22 | qScriptRegisterSequenceMetaType<QList<MeshProxy*>>(_modelScriptEngine); | 24 | qScriptRegisterSequenceMetaType<QList<MeshProxy*>>(_modelScriptEngine); |
| 25 | qScriptRegisterMetaType(_modelScriptEngine, meshFaceToScriptValue, meshFaceFromScriptValue); | ||
| 26 | qScriptRegisterMetaType(_modelScriptEngine, qVectorMeshFaceToScriptValue, qVectorMeshFaceFromScriptValue); | ||
| 23 | } | 27 | } |
| 24 | 28 | ||
| 25 | QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) { | 29 | QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) { |
| @@ -118,8 +122,6 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 92 unmodified lines | |||
| 118 | return meshToScriptValue(_modelScriptEngine, resultProxy); | 122 | return meshToScriptValue(_modelScriptEngine, resultProxy); |
| 119 | } | 123 | } |
| 120 | 124 | ||
| 121 | |||
| 122 | |||
| 123 | QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) { | 125 | QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) { |
| 124 | if (!meshProxy) { | 126 | if (!meshProxy) { |
| 125 | return QScriptValue(false); | 127 | return QScriptValue(false); |
| @@ -135,3 +137,57 @@ QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshPro · 9 unmodified lines | |||
| 135 | MeshProxy* resultProxy = new MeshProxy(result); | 137 | MeshProxy* resultProxy = new MeshProxy(result); |
| 136 | return meshToScriptValue(_modelScriptEngine, resultProxy); | 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 | } | ||