mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-23 14:14:28 +02:00
Mesh::forEach and Mesh::map
This commit is contained in:
parent
b3603ce8b3
commit
488ed081dd
3 changed files with 59 additions and 127 deletions
|
@ -140,19 +140,11 @@ model::MeshPointer Mesh::map(std::function<glm::vec3(glm::vec3)> vertexFunc,
|
||||||
std::function<uint32_t(uint32_t)> indexFunc) {
|
std::function<uint32_t(uint32_t)> indexFunc) {
|
||||||
int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h
|
int attributeTypeNormal = gpu::Stream::InputSlot::NORMAL; // libraries/gpu/src/gpu/Stream.h
|
||||||
|
|
||||||
|
// vertex data
|
||||||
gpu::Resource::Size vertexSize = getNumVertices() * sizeof(glm::vec3);
|
gpu::Resource::Size vertexSize = getNumVertices() * sizeof(glm::vec3);
|
||||||
unsigned char* resultVertexData = new unsigned char[vertexSize];
|
unsigned char* resultVertexData = new unsigned char[vertexSize];
|
||||||
unsigned char* vertexDataCursor = resultVertexData;
|
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();
|
const gpu::BufferView& vertexBufferView = getVertexBuffer();
|
||||||
gpu::BufferView::Index numVertices = (gpu::BufferView::Index)getNumVertices();
|
gpu::BufferView::Index numVertices = (gpu::BufferView::Index)getNumVertices();
|
||||||
for (gpu::BufferView::Index i = 0; i < numVertices; i ++) {
|
for (gpu::BufferView::Index i = 0; i < numVertices; i ++) {
|
||||||
|
@ -162,6 +154,10 @@ model::MeshPointer Mesh::map(std::function<glm::vec3(glm::vec3)> vertexFunc,
|
||||||
}
|
}
|
||||||
|
|
||||||
// normal data
|
// 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);
|
const gpu::BufferView& normalsBufferView = getAttributeBuffer(attributeTypeNormal);
|
||||||
gpu::BufferView::Index numNormals = (gpu::BufferView::Index)getNumAttributes();
|
gpu::BufferView::Index numNormals = (gpu::BufferView::Index)getNumAttributes();
|
||||||
for (gpu::BufferView::Index i = 0; i < numNormals; i ++) {
|
for (gpu::BufferView::Index i = 0; i < numNormals; i ++) {
|
||||||
|
@ -172,6 +168,10 @@ model::MeshPointer Mesh::map(std::function<glm::vec3(glm::vec3)> vertexFunc,
|
||||||
// TODO -- other attributes
|
// TODO -- other attributes
|
||||||
|
|
||||||
// face data
|
// 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();
|
const gpu::BufferView& indexBufferView = getIndexBuffer();
|
||||||
gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)getNumIndices();
|
gpu::BufferView::Index numIndexes = (gpu::BufferView::Index)getNumIndices();
|
||||||
for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) {
|
for (gpu::BufferView::Index i = 0; i < numIndexes; i ++) {
|
||||||
|
@ -215,6 +215,35 @@ model::MeshPointer Mesh::map(std::function<glm::vec3(glm::vec3)> vertexFunc,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Mesh::forEach(std::function<void(glm::vec3)> vertexFunc,
|
||||||
|
std::function<void(glm::vec3)> normalFunc,
|
||||||
|
std::function<void(uint32_t)> 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<glm::vec3>(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<glm::vec3>(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<uint32_t>(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Geometry::Geometry() {
|
Geometry::Geometry() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -123,6 +123,10 @@ public:
|
||||||
std::function<glm::vec3(glm::vec3)> normalFunc,
|
std::function<glm::vec3(glm::vec3)> normalFunc,
|
||||||
std::function<uint32_t(uint32_t)> indexFunc);
|
std::function<uint32_t(uint32_t)> indexFunc);
|
||||||
|
|
||||||
|
void forEach(std::function<void(glm::vec3)> vertexFunc,
|
||||||
|
std::function<void(glm::vec3)> normalFunc,
|
||||||
|
std::function<void(uint32_t)> indexFunc);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
gpu::Stream::FormatPointer _vertexFormat;
|
gpu::Stream::FormatPointer _vertexFormat;
|
||||||
|
|
|
@ -53,10 +53,8 @@ QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) {
|
||||||
return writeOBJToString(meshes);
|
return writeOBJToString(meshes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) {
|
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 totalVertexCount { 0 };
|
||||||
size_t totalAttributeCount { 0 };
|
size_t totalAttributeCount { 0 };
|
||||||
size_t totalIndexCount { 0 };
|
size_t totalIndexCount { 0 };
|
||||||
|
@ -67,6 +65,7 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) {
|
||||||
totalIndexCount += mesh->getNumIndices();
|
totalIndexCount += mesh->getNumIndices();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// alloc the resulting mesh
|
||||||
gpu::Resource::Size combinedVertexSize = totalVertexCount * sizeof(glm::vec3);
|
gpu::Resource::Size combinedVertexSize = totalVertexCount * sizeof(glm::vec3);
|
||||||
unsigned char* combinedVertexData = new unsigned char[combinedVertexSize];
|
unsigned char* combinedVertexData = new unsigned char[combinedVertexSize];
|
||||||
unsigned char* combinedVertexDataCursor = combinedVertexData;
|
unsigned char* combinedVertexDataCursor = combinedVertexData;
|
||||||
|
@ -83,36 +82,22 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) {
|
||||||
|
|
||||||
foreach (const MeshProxy* meshProxy, in) {
|
foreach (const MeshProxy* meshProxy, in) {
|
||||||
MeshPointer mesh = meshProxy->getMeshPointer();
|
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();
|
gpu::BufferView::Index numVertices = (gpu::BufferView::Index)mesh->getNumVertices();
|
||||||
for (gpu::BufferView::Index i = 0; i < numVertices; i ++) {
|
|
||||||
glm::vec3 pos = vertexBufferView.get<glm::vec3>(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<glm::vec3>(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<uint32_t>(i);
|
|
||||||
index += indexStartOffset;
|
|
||||||
memcpy(combinedIndexDataCursor, &index, sizeof(index));
|
|
||||||
combinedIndexDataCursor += sizeof(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
indexStartOffset += numVertices;
|
indexStartOffset += numVertices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,6 +109,7 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) {
|
||||||
gpu::BufferView combinedVertexBufferView(combinedVertexBufferPointer, vertexElement);
|
gpu::BufferView combinedVertexBufferView(combinedVertexBufferPointer, vertexElement);
|
||||||
result->setVertexBuffer(combinedVertexBufferView);
|
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::Element normalElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
|
||||||
gpu::Buffer* combinedNormalsBuffer = new gpu::Buffer(combinedNormalSize, combinedNormalData);
|
gpu::Buffer* combinedNormalsBuffer = new gpu::Buffer(combinedNormalSize, combinedNormalData);
|
||||||
gpu::BufferPointer combinedNormalsBufferPointer(combinedNormalsBuffer);
|
gpu::BufferPointer combinedNormalsBufferPointer(combinedNormalsBuffer);
|
||||||
|
@ -136,7 +122,6 @@ QScriptValue ModelScriptingInterface::appendMeshes(MeshProxyList in) {
|
||||||
gpu::BufferView combinedIndexesBufferView(combinedIndexesBufferPointer, indexElement);
|
gpu::BufferView combinedIndexesBufferView(combinedIndexesBufferPointer, indexElement);
|
||||||
result->setIndexBuffer(combinedIndexesBufferView);
|
result->setIndexBuffer(combinedIndexesBufferView);
|
||||||
|
|
||||||
|
|
||||||
std::vector<model::Mesh::Part> parts;
|
std::vector<model::Mesh::Part> parts;
|
||||||
parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex
|
parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex
|
||||||
(model::Index)result->getNumIndices(), // numIndices
|
(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<glm::vec3>(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<glm::vec3>(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<uint32_t>(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<model::Mesh::Part> 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) {
|
QScriptValue ModelScriptingInterface::transformMesh(glm::mat4 transform, MeshProxy* meshProxy) {
|
||||||
if (!meshProxy) {
|
if (!meshProxy) {
|
||||||
|
|
Loading…
Reference in a new issue