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
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
25QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) {29QString 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
123QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {125QScriptValue 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
141QScriptValue 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}