History

Entities.voxelsToMesh, Model.transformMesh, Model.appendMeshes, Model.meshToOBJ appear to work now

Seth Alves committed 9 years ago

Commit b3603ce1 parent 16c3eb69 files · +237 −91Browse files

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

Unified · Split

libraries/script-engine/src/ModelScriptingInterface.cpp+94−73
@@ -151,84 +151,105 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 150 unmodified lines
151151 }
152152
153153
154−QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {
155− int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h
154+// QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {
155+// int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h
156+
157+// if (!meshProxy) {
158+// return QScriptValue(false);
159+// }
160+
161+// MeshPointer mesh = meshProxy->getMeshPointer();
162+
163+// gpu::Resource::Size vertexSize = mesh->getNumVertices() * sizeof(glm::vec3);
164+// unsigned char* resultVertexData = new unsigned char[vertexSize];
165+// unsigned char* vertexDataCursor = resultVertexData;
166+
167+// gpu::Resource::Size normalSize = mesh->getNumAttributes() * sizeof(glm::vec3);
168+// unsigned char* resultNormalData = new unsigned char[normalSize];
169+// unsigned char* normalDataCursor = resultNormalData;
170+
171+// gpu::Resource::Size indexSize = mesh->getNumIndices() * sizeof(uint32_t);
172+// unsigned char* resultIndexData = new unsigned char[indexSize];
173+// unsigned char* indexDataCursor = resultIndexData;
174+
175+// // vertex data
176+// const gpu::BufferView& vertexBufferView = mesh->getVertexBuffer();
177+// gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices();
178+// for (gpu::BufferView::Index i = 0; i < numVertices; i ++) {
179+// glm::vec3 pos = vertexBufferView.get<glm::vec3>(i);
180+// pos = glm::vec3(transform * glm::vec4(pos, 1.0f));
181+// memcpy(vertexDataCursor, &pos, sizeof(pos));
182+// vertexDataCursor += sizeof(pos);
183+// }
184+
185+// // normal data
186+// const gpu::BufferView& normalsBufferView = mesh->getAttributeBuffer(attributeTypeNormal);
187+// gpu::BufferView::Index numNormals = (gpu::BufferView::Index)mesh->getNumAttributes();
188+// for (gpu::BufferView::Index i = 0; i < numNormals; i ++) {
189+// glm::vec3 normal = normalsBufferView.get<glm::vec3>(i);
190+// normal = glm::vec3(transform * glm::vec4(normal, 0.0f));
191+// memcpy(normalDataCursor, &normal, sizeof(normal));
192+// normalDataCursor += sizeof(normal);
193+// }
194+// // TODO -- other attributes
195+
196+// // face data
197+// const gpu::BufferView& indexBufferView = mesh->getIndexBuffer();
198+// gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)mesh->getNumIndices();
199+// for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) {
200+// uint32_t index = indexBufferView.get<uint32_t>(i);
201+// memcpy(indexDataCursor, &index, sizeof(index));
202+// indexDataCursor += sizeof(index);
203+// }
204+
205+// model::MeshPointer result(new model::Mesh());
206+
207+// gpu::Element vertexElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
208+// gpu::Buffer* resultVertexBuffer = new gpu::Buffer(vertexSize, resultVertexData);
209+// gpu::BufferPointer resultVertexBufferPointer(resultVertexBuffer);
210+// gpu::BufferView resultVertexBufferView(resultVertexBufferPointer, vertexElement);
211+// result->setVertexBuffer(resultVertexBufferView);
212+
213+// gpu::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
214+// gpu::Buffer* resultNormalsBuffer = new gpu::Buffer(normalSize, resultNormalData);
215+// gpu::BufferPointer resultNormalsBufferPointer(resultNormalsBuffer);
216+// gpu::BufferView resultNormalsBufferView(resultNormalsBufferPointer, normalElement);
217+// result->addAttribute(attributeTypeNormal, resultNormalsBufferView);
218+
219+// gpu::Element indexElement = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW);
220+// gpu::Buffer* resultIndexesBuffer = new gpu::Buffer(indexSize, resultIndexData);
221+// gpu::BufferPointer resultIndexesBufferPointer(resultIndexesBuffer);
222+// gpu::BufferView resultIndexesBufferView(resultIndexesBufferPointer, indexElement);
223+// result->setIndexBuffer(resultIndexesBufferView);
224+
225+
226+// std::vector<model::Mesh::Part> parts;
227+// parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex
228+// (model::Index)result->getNumIndices(), // numIndices
229+// (model::Index)0, // baseVertex
230+// model::Mesh::TRIANGLES)); // topology
231+// result->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(model::Mesh::Part),
232+// (gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL));
233+
234+
235+
236+// MeshProxy* resultProxy = new MeshProxy(result);
237+// return meshToScriptValue(_modelScriptEngine, resultProxy);
238+// }
156239
157− MeshPointer mesh = meshProxy->getMeshPointer();
158240
159− gpu::Resource::Size vertexSize = mesh->getNumVertices() * sizeof(glm::vec3);
160− unsigned char* resultVertexData = new unsigned char[vertexSize];
161− unsigned char* vertexDataCursor = resultVertexData;
162−
163− gpu::Resource::Size normalSize = mesh->getNumAttributes() * sizeof(glm::vec3);
164− unsigned char* resultNormalData = new unsigned char[normalSize];
165− unsigned char* normalDataCursor = resultNormalData;
166−
167− gpu::Resource::Size indexSize = mesh->getNumIndices() * sizeof(uint32_t);
168− unsigned char* resultIndexData = new unsigned char[indexSize];
169− unsigned char* indexDataCursor = resultIndexData;
170−
171− // vertex data
172− const gpu::BufferView& vertexBufferView = mesh->getVertexBuffer();
173− gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices();
174− for (gpu::BufferView::Index i = 0; i < numVertices; i ++) {
175− glm::vec3 pos = vertexBufferView.get<glm::vec3>(i);
176− pos = glm::vec3(transform * glm::vec4(pos, 0.0f));
177− memcpy(vertexDataCursor, &pos, sizeof(pos));
178− vertexDataCursor += sizeof(pos);
179− }
180−
181− // normal data
182− const gpu::BufferView& normalsBufferView = mesh->getAttributeBuffer(attributeTypeNormal);
183− gpu::BufferView::Index numNormals = (gpu::BufferView::Index)mesh->getNumAttributes();
184− for (gpu::BufferView::Index i = 0; i < numNormals; i ++) {
185− glm::vec3 normal = normalsBufferView.get<glm::vec3>(i);
186− normal = glm::vec3(transform * glm::vec4(normal, 0.0f));
187− memcpy(normalDataCursor, &normal, sizeof(normal));
188− normalDataCursor += sizeof(normal);
241+QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {
242+ if (!meshProxy) {
243+ return QScriptValue(false);
189244 }
190− // TODO -- other attributes
191−
192− // face data
193− const gpu::BufferView& indexBufferView = mesh->getIndexBuffer();
194− gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)mesh->getNumIndices();
195− for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) {
196− uint32_t index = indexBufferView.get<uint32_t>(i);
197− memcpy(indexDataCursor, &index, sizeof(index));
198− indexDataCursor += sizeof(index);
245+ MeshPointer mesh = meshProxy->getMeshPointer();
246+ if (!mesh) {
247+ return QScriptValue(false);
199248 }
200249
201− model::MeshPointer result(new model::Mesh());
202−
203− gpu::Element vertexElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
204− gpu::Buffer* resultVertexBuffer = new gpu::Buffer(vertexSize, resultVertexData);
205− gpu::BufferPointer resultVertexBufferPointer(resultVertexBuffer);
206− gpu::BufferView resultVertexBufferView(resultVertexBufferPointer, vertexElement);
207− result->setVertexBuffer(resultVertexBufferView);
208−
209− gpu::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
210− gpu::Buffer* resultNormalsBuffer = new gpu::Buffer(normalSize, resultNormalData);
211− gpu::BufferPointer resultNormalsBufferPointer(resultNormalsBuffer);
212− gpu::BufferView resultNormalsBufferView(resultNormalsBufferPointer, normalElement);
213− result->addAttribute(attributeTypeNormal, resultNormalsBufferView);
214−
215− gpu::Element indexElement = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW);
216− gpu::Buffer* resultIndexesBuffer = new gpu::Buffer(indexSize, resultIndexData);
217− gpu::BufferPointer resultIndexesBufferPointer(resultIndexesBuffer);
218− gpu::BufferView resultIndexesBufferView(resultIndexesBufferPointer, indexElement);
219− result->setIndexBuffer(resultIndexesBufferView);
220−
221−
222− std::vector<model::Mesh::Part> parts;
223− parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex
224− (model::Index)result->getNumIndices(), // numIndices
225− (model::Index)0, // baseVertex
226− model::Mesh::TRIANGLES)); // topology
227− result->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(model::Mesh::Part),
228− (gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL));
229−
230−
231−
250+ model::MeshPointer result = mesh->map([&](glm::vec3 position){ return glm::vec3(transform * glm::vec4(position, 1.0f)); },
251+ [&](glm::vec3 normal){ return glm::vec3(transform * glm::vec4(normal, 0.0f)); },
252+ [&](uint32_t index){ return index; });
232253 MeshProxy* resultProxy = new MeshProxy(result);
233254 return meshToScriptValue(_modelScriptEngine, resultProxy);
234255 }