diff --git a/libraries/model/src/model/Geometry.cpp b/libraries/model/src/model/Geometry.cpp index 4e5134a7d7..d511ae6cb9 100755 --- a/libraries/model/src/model/Geometry.cpp +++ b/libraries/model/src/model/Geometry.cpp @@ -140,19 +140,11 @@ model::MeshPointer Mesh::map(std::function vertexFunc, std::function indexFunc) { int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h + // vertex data gpu::Resource::Size vertexSize = getNumVertices() * sizeof(glm::vec3); unsigned char* resultVertexData = new unsigned char[vertexSize]; unsigned char* vertexDataCursor = resultVertexData; - gpu::Resource::Size normalSize = getNumAttributes() * sizeof(glm::vec3); - unsigned char* resultNormalData = new unsigned char[normalSize]; - unsigned char* normalDataCursor = resultNormalData; - - gpu::Resource::Size indexSize = getNumIndices() * sizeof(uint32_t); - unsigned char* resultIndexData = new unsigned char[indexSize]; - unsigned char* indexDataCursor = resultIndexData; - - // vertex data const gpu::BufferView& vertexBufferView = getVertexBuffer(); gpu::BufferView::Index numVertices = (gpu::BufferView::Index)getNumVertices(); for (gpu::BufferView::Index i = 0; i < numVertices; i ++) { @@ -162,6 +154,10 @@ model::MeshPointer Mesh::map(std::function vertexFunc, } // normal data + gpu::Resource::Size normalSize = getNumAttributes() * sizeof(glm::vec3); + unsigned char* resultNormalData = new unsigned char[normalSize]; + unsigned char* normalDataCursor = resultNormalData; + const gpu::BufferView& normalsBufferView = getAttributeBuffer(attributeTypeNormal); gpu::BufferView::Index numNormals = (gpu::BufferView::Index)getNumAttributes(); for (gpu::BufferView::Index i = 0; i < numNormals; i ++) { @@ -172,6 +168,10 @@ model::MeshPointer Mesh::map(std::function vertexFunc, // TODO -- other attributes // face data + gpu::Resource::Size indexSize = getNumIndices() * sizeof(uint32_t); + unsigned char* resultIndexData = new unsigned char[indexSize]; + unsigned char* indexDataCursor = resultIndexData; + const gpu::BufferView& indexBufferView = getIndexBuffer(); gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)getNumIndices(); for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) { @@ -215,6 +215,35 @@ model::MeshPointer Mesh::map(std::function vertexFunc, } +void Mesh::forEach(std::function vertexFunc, + std::function normalFunc, + std::function indexFunc) { + int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h + + // vertex data + const gpu::BufferView& vertexBufferView = getVertexBuffer(); + gpu::BufferView::Index numVertices = (gpu::BufferView::Index)getNumVertices(); + for (gpu::BufferView::Index i = 0; i < numVertices; i ++) { + vertexFunc(vertexBufferView.get(i)); + } + + // normal data + const gpu::BufferView& normalsBufferView = getAttributeBuffer(attributeTypeNormal); + gpu::BufferView::Index numNormals = (gpu::BufferView::Index)getNumAttributes(); + for (gpu::BufferView::Index i = 0; i < numNormals; i ++) { + normalFunc(normalsBufferView.get(i)); + } + // TODO -- other attributes + + // face data + const gpu::BufferView& indexBufferView = getIndexBuffer(); + gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)getNumIndices(); + for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) { + indexFunc(indexBufferView.get(i)); + } +} + + Geometry::Geometry() { } diff --git a/libraries/model/src/model/Geometry.h b/libraries/model/src/model/Geometry.h index 9a20861ea7..7ba3e83407 100755 --- a/libraries/model/src/model/Geometry.h +++ b/libraries/model/src/model/Geometry.h @@ -123,6 +123,10 @@ public: std::function normalFunc, std::function indexFunc); + void forEach(std::function vertexFunc, + std::function normalFunc, + std::function indexFunc); + protected: gpu::Stream::FormatPointer _vertexFormat; diff --git a/libraries/script-engine/src/ModelScriptingInterface.cpp b/libraries/script-engine/src/ModelScriptingInterface.cpp index 71b82a2d60..cfcb6da0dc 100644 --- a/libraries/script-engine/src/ModelScriptingInterface.cpp +++ b/libraries/script-engine/src/ModelScriptingInterface.cpp @@ -53,10 +53,8 @@ QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) { return writeOBJToString(meshes); } - QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { - int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h - + // figure out the size of the resulting mesh size_t totalVertexCount { 0 }; size_t totalAttributeCount { 0 }; size_t totalIndexCount { 0 }; @@ -67,6 +65,7 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { totalIndexCount += mesh->getNumIndices(); } + // alloc the resulting mesh gpu::Resource::Size combinedVertexSize = totalVertexCount * sizeof(glm::vec3); unsigned char* combinedVertexData = new unsigned char[combinedVertexSize]; unsigned char* combinedVertexDataCursor = combinedVertexData; @@ -83,36 +82,22 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { foreach (const MeshProxy* meshProxy, in) { MeshPointer mesh = meshProxy->getMeshPointer(); + mesh->forEach( + [&](glm::vec3 position){ + memcpy(combinedVertexDataCursor, &position, sizeof(position)); + combinedVertexDataCursor += sizeof(position); + }, + [&](glm::vec3 normal){ + memcpy(combinedNormalDataCursor, &normal, sizeof(normal)); + combinedNormalDataCursor += sizeof(normal); + }, + [&](uint32_t index){ + index += indexStartOffset; + memcpy(combinedIndexDataCursor, &index, sizeof(index)); + combinedIndexDataCursor += sizeof(index); + }); - // vertex data - const gpu::BufferView& vertexBufferView = mesh->getVertexBuffer(); gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices(); - for (gpu::BufferView::Index i = 0; i < numVertices; i ++) { - glm::vec3 pos = vertexBufferView.get(i); - memcpy(combinedVertexDataCursor, &pos, sizeof(pos)); - combinedVertexDataCursor += sizeof(pos); - } - - // normal data - const gpu::BufferView& normalsBufferView = mesh->getAttributeBuffer(attributeTypeNormal); - gpu::BufferView::Index numNormals = (gpu::BufferView::Index)mesh->getNumAttributes(); - for (gpu::BufferView::Index i = 0; i < numNormals; i ++) { - glm::vec3 normal = normalsBufferView.get(i); - memcpy(combinedNormalDataCursor, &normal, sizeof(normal)); - combinedNormalDataCursor += sizeof(normal); - } - // TODO -- other attributes - - // face data - const gpu::BufferView& indexBufferView = mesh->getIndexBuffer(); - gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)mesh->getNumIndices(); - for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) { - uint32_t index = indexBufferView.get(i); - index += indexStartOffset; - memcpy(combinedIndexDataCursor, &index, sizeof(index)); - combinedIndexDataCursor += sizeof(index); - } - indexStartOffset += numVertices; } @@ -124,6 +109,7 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { gpu::BufferView combinedVertexBufferView(combinedVertexBufferPointer, vertexElement); result->setVertexBuffer(combinedVertexBufferView); + int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h gpu::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ); gpu::Buffer* combinedNormalsBuffer = new gpu::Buffer(combinedNormalSize, combinedNormalData); gpu::BufferPointer combinedNormalsBufferPointer(combinedNormalsBuffer); @@ -136,7 +122,6 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { gpu::BufferView combinedIndexesBufferView(combinedIndexesBufferPointer, indexElement); result->setIndexBuffer(combinedIndexesBufferView); - std::vector parts; parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex (model::Index)result->getNumIndices(), // numIndices @@ -151,92 +136,6 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) { } -// QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) { -// int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h - -// if (!meshProxy) { -// return QScriptValue(false); -// } - -// MeshPointer mesh = meshProxy->getMeshPointer(); - -// gpu::Resource::Size vertexSize = mesh->getNumVertices() * sizeof(glm::vec3); -// unsigned char* resultVertexData = new unsigned char[vertexSize]; -// unsigned char* vertexDataCursor = resultVertexData; - -// gpu::Resource::Size normalSize = mesh->getNumAttributes() * sizeof(glm::vec3); -// unsigned char* resultNormalData = new unsigned char[normalSize]; -// unsigned char* normalDataCursor = resultNormalData; - -// gpu::Resource::Size indexSize = mesh->getNumIndices() * sizeof(uint32_t); -// unsigned char* resultIndexData = new unsigned char[indexSize]; -// unsigned char* indexDataCursor = resultIndexData; - -// // vertex data -// const gpu::BufferView& vertexBufferView = mesh->getVertexBuffer(); -// gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices(); -// for (gpu::BufferView::Index i = 0; i < numVertices; i ++) { -// glm::vec3 pos = vertexBufferView.get(i); -// pos = glm::vec3(transform * glm::vec4(pos, 1.0f)); -// memcpy(vertexDataCursor, &pos, sizeof(pos)); -// vertexDataCursor += sizeof(pos); -// } - -// // normal data -// const gpu::BufferView& normalsBufferView = mesh->getAttributeBuffer(attributeTypeNormal); -// gpu::BufferView::Index numNormals = (gpu::BufferView::Index)mesh->getNumAttributes(); -// for (gpu::BufferView::Index i = 0; i < numNormals; i ++) { -// glm::vec3 normal = normalsBufferView.get(i); -// normal = glm::vec3(transform * glm::vec4(normal, 0.0f)); -// memcpy(normalDataCursor, &normal, sizeof(normal)); -// normalDataCursor += sizeof(normal); -// } -// // TODO -- other attributes - -// // face data -// const gpu::BufferView& indexBufferView = mesh->getIndexBuffer(); -// gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)mesh->getNumIndices(); -// for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) { -// uint32_t index = indexBufferView.get(i); -// memcpy(indexDataCursor, &index, sizeof(index)); -// indexDataCursor += sizeof(index); -// } - -// model::MeshPointer result(new model::Mesh()); - -// gpu::Element vertexElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ); -// gpu::Buffer* resultVertexBuffer = new gpu::Buffer(vertexSize, resultVertexData); -// gpu::BufferPointer resultVertexBufferPointer(resultVertexBuffer); -// gpu::BufferView resultVertexBufferView(resultVertexBufferPointer, vertexElement); -// result->setVertexBuffer(resultVertexBufferView); - -// gpu::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ); -// gpu::Buffer* resultNormalsBuffer = new gpu::Buffer(normalSize, resultNormalData); -// gpu::BufferPointer resultNormalsBufferPointer(resultNormalsBuffer); -// gpu::BufferView resultNormalsBufferView(resultNormalsBufferPointer, normalElement); -// result->addAttribute(attributeTypeNormal, resultNormalsBufferView); - -// gpu::Element indexElement = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::RAW); -// gpu::Buffer* resultIndexesBuffer = new gpu::Buffer(indexSize, resultIndexData); -// gpu::BufferPointer resultIndexesBufferPointer(resultIndexesBuffer); -// gpu::BufferView resultIndexesBufferView(resultIndexesBufferPointer, indexElement); -// result->setIndexBuffer(resultIndexesBufferView); - - -// std::vector parts; -// parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex -// (model::Index)result->getNumIndices(), // numIndices -// (model::Index)0, // baseVertex -// model::Mesh::TRIANGLES)); // topology -// result->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(model::Mesh::Part), -// (gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL)); - - - -// MeshProxy* resultProxy = new MeshProxy(result); -// return meshToScriptValue(_modelScriptEngine, resultProxy); -// } - QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) { if (!meshProxy) {