History

new javascript call: Model.newMesh()

Seth Alves committed 9 years ago

Commit 8f7f5ef1 parent 642cf577 files · +173 −3Browse files

Showing the changes to libraries/script-engine/src/ModelScriptingInterface.cpp (1 of 7 files). Show all

Unified · Split

libraries/script-engine/src/ModelScriptingInterface.cpp+58−2
@@ -12,7 +12,9 @@ · 11 unmodified lines
1212 #include <QScriptEngine>
1313 #include <QScriptValueIterator>
1414 #include <QtScript/QScriptValue>
15+#include <model/MeshFace.h>
1516 #include "ScriptEngine.h"
17+#include "ScriptEngineLogging.h"
1618 #include "ModelScriptingInterface.h"
1719 #include "OBJWriter.h"
1820
@@ -20,6 +22,8 @@ ModelScriptingInterface::ModelScriptingInterface(QObject* parent) : QObject(pare · 1 unmodified line
2022 _modelScriptEngine = qobject_cast<ScriptEngine*>(parent);
2123
2224 qScriptRegisterSequenceMetaType<QList<MeshProxy*>>(_modelScriptEngine);
25+ qScriptRegisterMetaType(_modelScriptEngine, meshFaceToScriptValue, meshFaceFromScriptValue);
26+ qScriptRegisterMetaType(_modelScriptEngine, qVectorMeshFaceToScriptValue, qVectorMeshFaceFromScriptValue);
2327 }
2428
2529 QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) {
@@ -118,8 +122,6 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 92 unmodified lines
118122 return meshToScriptValue(_modelScriptEngine, resultProxy);
119123 }
120124
121−
122−
123125 QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {
124126 if (!meshProxy) {
125127 return QScriptValue(false);
@@ -135,3 +137,57 @@ QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshPro · 9 unmodified lines
135137 MeshProxy* resultProxy = new MeshProxy(result);
136138 return meshToScriptValue(_modelScriptEngine, resultProxy);
137139 }
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+}