History

Mesh::forEach and Mesh::map

Seth Alves committed 9 years ago

Commit 488ed081 parent b3603ce3 files · +59 −127Browse files

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

Unified · Split

libraries/script-engine/src/ModelScriptingInterface.cpp+17−118
@@ -53,10 +53,8 @@ QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) { · 52 unmodified lines
53 return writeOBJToString(meshes);53 return writeOBJToString(meshes);
54}54}
55 55
56
57QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) {56QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) {
58 int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h57 // figure out the size of the resulting mesh
59
60 size_t totalVertexCount { 0 };58 size_t totalVertexCount { 0 };
61 size_t totalAttributeCount { 0 };59 size_t totalAttributeCount { 0 };
62 size_t totalIndexCount { 0 };60 size_t totalIndexCount { 0 };
@@ -67,6 +65,7 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 4 unmodified lines
67 totalIndexCount += mesh->getNumIndices();65 totalIndexCount += mesh->getNumIndices();
68 }66 }
69 67
68 // alloc the resulting mesh
70 gpu::Resource::Size combinedVertexSize = totalVertexCount * sizeof(glm::vec3);69 gpu::Resource::Size combinedVertexSize = totalVertexCount * sizeof(glm::vec3);
71 unsigned char* combinedVertexData = new unsigned char[combinedVertexSize];70 unsigned char* combinedVertexData = new unsigned char[combinedVertexSize];
72 unsigned char* combinedVertexDataCursor = combinedVertexData;71 unsigned char* combinedVertexDataCursor = combinedVertexData;
@@ -83,36 +82,22 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 10 unmodified lines
83 82
84 foreach (const MeshProxy* meshProxy, in) {83 foreach (const MeshProxy* meshProxy, in) {
85 MeshPointer mesh = meshProxy->getMeshPointer();84 MeshPointer mesh = meshProxy->getMeshPointer();
85 mesh->forEach(
86 [&](glm::vec3 position){
87 memcpy(combinedVertexDataCursor, &position, sizeof(position));
88 combinedVertexDataCursor += sizeof(position);
89 },
90 [&](glm::vec3 normal){
91 memcpy(combinedNormalDataCursor, &normal, sizeof(normal));
92 combinedNormalDataCursor += sizeof(normal);
93 },
94 [&](uint32_t index){
95 index += indexStartOffset;
96 memcpy(combinedIndexDataCursor, &index, sizeof(index));
97 combinedIndexDataCursor += sizeof(index);
98 });
86 99
87 // vertex data
88 const gpu::BufferView& vertexBufferView = mesh->getVertexBuffer();
89 gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices();100 gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices();
90 for (gpu::BufferView::Index i = 0; i < numVertices; i ++) {
91 glm::vec3 pos = vertexBufferView.get<glm::vec3>(i);
92 memcpy(combinedVertexDataCursor, &pos, sizeof(pos));
93 combinedVertexDataCursor += sizeof(pos);
94 }
95
96 // normal data
97 const gpu::BufferView& normalsBufferView = mesh->getAttributeBuffer(attributeTypeNormal);
98 gpu::BufferView::Index numNormals = (gpu::BufferView::Index)mesh->getNumAttributes();
99 for (gpu::BufferView::Index i = 0; i < numNormals; i ++) {
100 glm::vec3 normal = normalsBufferView.get<glm::vec3>(i);
101 memcpy(combinedNormalDataCursor, &normal, sizeof(normal));
102 combinedNormalDataCursor += sizeof(normal);
103 }
104 // TODO -- other attributes
105
106 // face data
107 const gpu::BufferView& indexBufferView = mesh->getIndexBuffer();
108 gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)mesh->getNumIndices();
109 for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) {
110 uint32_t index = indexBufferView.get<uint32_t>(i);
111 index += indexStartOffset;
112 memcpy(combinedIndexDataCursor, &index, sizeof(index));
113 combinedIndexDataCursor += sizeof(index);
114 }
115
116 indexStartOffset += numVertices;101 indexStartOffset += numVertices;
117 }102 }
118 103
@@ -124,6 +109,7 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 5 unmodified lines
124 gpu::BufferView combinedVertexBufferView(combinedVertexBufferPointer, vertexElement);109 gpu::BufferView combinedVertexBufferView(combinedVertexBufferPointer, vertexElement);
125 result->setVertexBuffer(combinedVertexBufferView);110 result->setVertexBuffer(combinedVertexBufferView);
126 111
112 int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h
127 gpu::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);113 gpu::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
128 gpu::Buffer* combinedNormalsBuffer = new gpu::Buffer(combinedNormalSize, combinedNormalData);114 gpu::Buffer* combinedNormalsBuffer = new gpu::Buffer(combinedNormalSize, combinedNormalData);
129 gpu::BufferPointer combinedNormalsBufferPointer(combinedNormalsBuffer);115 gpu::BufferPointer combinedNormalsBufferPointer(combinedNormalsBuffer);
@@ -136,7 +122,6 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 6 unmodified lines
136 gpu::BufferView combinedIndexesBufferView(combinedIndexesBufferPointer, indexElement);122 gpu::BufferView combinedIndexesBufferView(combinedIndexesBufferPointer, indexElement);
137 result->setIndexBuffer(combinedIndexesBufferView);123 result->setIndexBuffer(combinedIndexesBufferView);
138 124
139
140 std::vector<model::Mesh::Part> parts;125 std::vector<model::Mesh::Part> parts;
141 parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex126 parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex
142 (model::Index)result->getNumIndices(), // numIndices127 (model::Index)result->getNumIndices(), // numIndices
@@ -151,92 +136,6 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { · 8 unmodified lines
151}136}
152 137
153 138
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// }
239
240 139
241QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {140QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {
242 if (!meshProxy) {141 if (!meshProxy) {