From e18254ec29f844c5e1b82282c820735df31d29ee Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Sun, 24 Dec 2023 23:45:43 +0100 Subject: [PATCH] adding vertex deduplication flag to mesh import --- src/Editor/Asset/MeshLoader.cpp | 4 +- src/Engine/Graphics/Meshlet.cpp | 139 +------------------------------- 2 files changed, 3 insertions(+), 140 deletions(-) diff --git a/src/Editor/Asset/MeshLoader.cpp b/src/Editor/Asset/MeshLoader.cpp index 92dad4b..0069cc8 100644 --- a/src/Editor/Asset/MeshLoader.cpp +++ b/src/Editor/Asset/MeshLoader.cpp @@ -329,7 +329,7 @@ void MeshLoader::import(MeshImportArgs args, PMeshAsset meshAsset) meshAsset->setStatus(Asset::Status::Loading); Assimp::Importer importer; importer.ReadFile(args.filePath.string().c_str(), (uint32)( - aiProcess_ImproveCacheLocality | + aiProcess_JoinIdenticalVertices | aiProcess_FlipUVs | aiProcess_Triangulate | aiProcess_SortByPType | @@ -337,7 +337,7 @@ void MeshLoader::import(MeshImportArgs args, PMeshAsset meshAsset) aiProcess_GenSmoothNormals | aiProcess_GenUVCoords | aiProcess_FindDegenerates)); - const aiScene *scene = importer.ApplyPostProcessing(aiProcess_CalcTangentSpace); + const aiScene *scene = importer.ApplyPostProcessing(aiProcess_CalcTangentSpace | aiProcess_ImproveCacheLocality); Array globalMaterials(scene->mNumMaterials); loadTextures(scene, args.filePath.parent_path(), args.importPath); diff --git a/src/Engine/Graphics/Meshlet.cpp b/src/Engine/Graphics/Meshlet.cpp index 6ff5420..a46cefb 100644 --- a/src/Engine/Graphics/Meshlet.cpp +++ b/src/Engine/Graphics/Meshlet.cpp @@ -5,143 +5,6 @@ using namespace Seele; -// Tipsy algorithm by Sanders 2007 -struct Triangle -{ - bool emitted = false; - StaticArray indices; -}; - -Map> buildAdjacency(const Array& indices) -{ - Map> result; - for (uint32 i = 0; i < indices.size(); i += 3) - { - result[indices[i + 0]].add(Triangle{ - .emitted = false, - .indices = { - indices[i + 0], - indices[i + 1], - indices[i + 2], - } - }); - result[indices[i + 1]].add(Triangle{ - .emitted = false, - .indices = { - indices[i + 0], - indices[i + 1], - indices[i + 2], - } - }); - result[indices[i + 2]].add(Triangle{ - .emitted = false, - .indices = { - indices[i + 0], - indices[i + 1], - indices[i + 2], - } - }); - } - return result; -} - -Map getTriangleCounts(Map>& adjacency) -{ - Map result; - for (const auto& [index, list] : adjacency) - { - result[index] = list.size(); - } - return result; -} - -int32 skipDeadEnd(Map& L, Array& D, const Array& indices, uint32& i, uint32 vertexCount) -{ - while (!D.empty()) - { - uint32 d = D.back(); - D.pop(); - if (L[d] > 0) - { - return d; - } - } - while (i < vertexCount) - { - i++; - if (L[i] > 0) - { - return i; - } - } - return -1; -} - -uint32 getNextVertex(const Array& indices, uint32& i, uint32 cacheSize, Set N, const Array& C, uint32 s, Map& L, Array& D, uint32 vertexCount) -{ - int32 n = -1; - int32 p = -1; - int32 m = 0; - for (uint32 v : N) - { - if (L[v] > 0) - { - p = 0; - if (s - C[v] + 2 * L[v] <= cacheSize) - { - p = s - C[v]; - } - if (p > m) - { - m = p; - n = v; - } - } - } - if (n == -1) - { - n = skipDeadEnd(L, D, indices, i, vertexCount); - } - return n; -} - -Array tipsify(const Array& positions, const Array& indices, uint32 cacheSize) -{ - auto A = buildAdjacency(indices); - auto L = getTriangleCounts(A); - auto C = Array(positions.size(), 0); - auto D = Array(); - Array output; - int32 f = 0; - uint32 s = cacheSize + 1, i = 1; - while (f >= 0) - { - auto N = Set(); - for (Triangle t : A[f]) - { - if (!t.emitted) - { - for (uint32 v : t.indices) - { - output.add(v); - D.add(v); - N.insert(v); - L[v] = L[v] - 1; - if (s - C[v] > cacheSize) - { - C[v] = s; - s = s + 1; - } - } - t.emitted = true; - } - } - f = getNextVertex(indices, i, cacheSize, std::move(N), C, s, L, D, positions.size()); - } - return output; -} - - void Meshlet::build(const Array& positions, const Array& indices, Array& meshlets) { Meshlet current = { @@ -180,7 +43,7 @@ void Meshlet::build(const Array& positions, const Array& indices int f2 = findIndex(indices[faceIndex * 3 + 1]); int f3 = findIndex(indices[faceIndex * 3 + 2]); - if (f1 == -1 || f2 == -1 || f1 == -1) + if (f1 == -1 || f2 == -1 || f3 == -1) { completeMeshlet(); f1 = findIndex(indices[faceIndex * 3 + 0]);