Storing mesh members using smart pointers

This commit is contained in:
Vladyslav Baranovskyi
2024-12-18 22:58:24 +02:00
parent 6c31d97271
commit 2e36d8b20e

View File

@@ -100,9 +100,14 @@ namespace OpenVulkano::Scene
mesh.mPrimitiveTypes = aiPrimitiveType_TRIANGLE;
mesh.mNumUVComponents[0] = 2;
mesh.mVertices = new aiVector3D[geometry->vertexCount];
mesh.mNormals = new aiVector3D[geometry->vertexCount];
mesh.mTextureCoords[0] = new aiVector3D[geometry->vertexCount];
std::unique_ptr<aiVector3D[]> vertices = std::make_unique<aiVector3D[]>(geometry->vertexCount);
mesh.mVertices = vertices.get();
std::unique_ptr<aiVector3D[]> normals = std::make_unique<aiVector3D[]>(geometry->vertexCount);
mesh.mNormals = normals.get();
std::unique_ptr<aiVector3D[]> texCoords = std::make_unique<aiVector3D[]>(geometry->vertexCount);
mesh.mTextureCoords[0] = texCoords.get();
float scaling = 100; // fbx units are centimeters...
for (uint32_t i = 0; i < geometry->vertexCount; ++i)
@@ -114,22 +119,27 @@ namespace OpenVulkano::Scene
}
mesh.mNumFaces = geometry->indexCount / 3;
mesh.mFaces = new aiFace[mesh.mNumFaces];
std::unique_ptr<aiFace[]> faces = std::make_unique<aiFace[]>(mesh.mNumFaces);
mesh.mFaces = faces.get();
std::unique_ptr<unsigned int[]> indices = std::make_unique<unsigned int[]>(geometry->indexCount);
size_t lastUsedIndex = 0;
for (uint32_t i = 0; i < mesh.mNumFaces; ++i)
{
aiFace& face = mesh.mFaces[i];
face.mNumIndices = 3;
face.mIndices = new unsigned int[face.mNumIndices];
face.mIndices = &indices[lastUsedIndex];
face.mIndices[0] = geometry->GetIndex(i * 3 + 0);
face.mIndices[1] = geometry->GetIndex(i * 3 + 1);
face.mIndices[2] = geometry->GetIndex(i * 3 + 2);
lastUsedIndex += face.mNumIndices;
}
aiMesh* meshes[1];
aiMesh* meshes[1] = { &mesh };
scene.mMeshes = meshes;
scene.mMeshes[0] = &mesh;
scene.mNumMeshes = 1;
unsigned int meshIndices[1];
@@ -138,9 +148,8 @@ namespace OpenVulkano::Scene
scene.mRootNode->mNumMeshes = 1;
aiMaterial material;
aiMaterial* materials[1];
aiMaterial* materials[1] = { &material };
scene.mMaterials = materials;
scene.mMaterials[0] = &material;
scene.mNumMaterials = 1;
aiString externalPath(texturePath);
@@ -149,8 +158,18 @@ namespace OpenVulkano::Scene
Assimp::Exporter exporter;
aiReturn result = exporter.Export(&scene, "fbx", fbxPath);
scene.mRootNode = nullptr;
mesh.mVertices = nullptr;
mesh.mNormals = nullptr;
mesh.mTextureCoords[0] = nullptr;
for (uint32_t i = 0; i < mesh.mNumFaces; ++i)
{
aiFace& face = mesh.mFaces[i];
face.mIndices = nullptr;
}
mesh.mFaces = nullptr;
rootNode.mMeshes = nullptr;
scene.mRootNode = nullptr;
scene.mMeshes = nullptr;
scene.mMaterials = nullptr;