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
151}151}
152 152
153 153
154QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {154// QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {
155 int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h155// 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// }
156 239
157 MeshPointer mesh = meshProxy->getMeshPointer();
158 240
159 gpu::Resource::Size vertexSize = mesh->getNumVertices() * sizeof(glm::vec3);241QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {
160 unsigned char* resultVertexData = new unsigned char[vertexSize];242 if (!meshProxy) {
161 unsigned char* vertexDataCursor = resultVertexData;243 return QScriptValue(false);
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);
189 }244 }
190 // TODO -- other attributes245 MeshPointer mesh = meshProxy->getMeshPointer();
191 246 if (!mesh) {
192 // face data247 return QScriptValue(false);
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);
199 }248 }
200 249
201 model::MeshPointer result(new model::Mesh());250 model::MeshPointer result = mesh->map([&](glm::vec3 position){ return glm::vec3(transform * glm::vec4(position, 1.0f)); },
202 251 [&](glm::vec3 normal){ return glm::vec3(transform * glm::vec4(normal, 0.0f)); },
203 gpu::Element vertexElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);252 [&](uint32_t index){ return index; });
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
232 MeshProxy* resultProxy = new MeshProxy(result);253 MeshProxy* resultProxy = new MeshProxy(result);
233 return meshToScriptValue(_modelScriptEngine, resultProxy);254 return meshToScriptValue(_modelScriptEngine, resultProxy);
234}255}