From 299f68ebfea2f0655c5f8b680895b2e6d9990634 Mon Sep 17 00:00:00 2001 From: MZ Date: Thu, 28 Sep 2023 16:00:31 +1000 Subject: [PATCH 1/2] Vert color deduplication check --- .../Engine/Graphics/Models/ModelData.Tool.cpp | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/Source/Engine/Graphics/Models/ModelData.Tool.cpp b/Source/Engine/Graphics/Models/ModelData.Tool.cpp index 89a227eb7..099e448f2 100644 --- a/Source/Engine/Graphics/Models/ModelData.Tool.cpp +++ b/Source/Engine/Graphics/Models/ModelData.Tool.cpp @@ -154,8 +154,8 @@ bool MeshData::GenerateLightmapUVs() int32 FindVertex(const MeshData& mesh, int32 vertexIndex, int32 startIndex, int32 searchRange, const Array& mapping #if USE_SPARIAL_SORT - , const Assimp::SpatialSort& spatialSort - , std::vector& sparialSortCache + , const Assimp::SpatialSort& spatialSort + , std::vector& sparialSortCache #endif ) { @@ -171,6 +171,8 @@ int32 FindVertex(const MeshData& mesh, int32 vertexIndex, int32 startIndex, int3 const Float3 vNormal = mesh.Normals.HasItems() ? mesh.Normals[vertexIndex] : Float3::Zero; const Float3 vTangent = mesh.Tangents.HasItems() ? mesh.Tangents[vertexIndex] : Float3::Zero; const Float2 vLightmapUV = mesh.LightmapUVs.HasItems() ? mesh.LightmapUVs[vertexIndex] : Float2::Zero; + const Color vColor = mesh.Colors.HasItems() ? mesh.Colors[vertexIndex] : Color::Black; // Assuming Color::Black as a default color + const int32 end = startIndex + searchRange; for (size_t i = 0; i < sparialSortCache.size(); i++) @@ -179,17 +181,18 @@ int32 FindVertex(const MeshData& mesh, int32 vertexIndex, int32 startIndex, int3 if (v < startIndex || v >= end) continue; #else - const Float3 vPosition = mesh.Positions[vertexIndex]; - const Float2 vUV = mesh.UVs.HasItems() ? mesh.UVs[vertexIndex] : Float2::Zero; - const Float3 vNormal = mesh.Normals.HasItems() ? mesh.Normals[vertexIndex] : Float3::Zero; - const Float3 vTangent = mesh.Tangents.HasItems() ? mesh.Tangents[vertexIndex] : Float3::Zero; - const Float2 vLightmapUV = mesh.LightmapUVs.HasItems() ? mesh.LightmapUVs[vertexIndex] : Float2::Zero; - const int32 end = startIndex + searchRange; + const Float3 vPosition = mesh.Positions[vertexIndex]; + const Float2 vUV = mesh.UVs.HasItems() ? mesh.UVs[vertexIndex] : Float2::Zero; + const Float3 vNormal = mesh.Normals.HasItems() ? mesh.Normals[vertexIndex] : Float3::Zero; + const Float3 vTangent = mesh.Tangents.HasItems() ? mesh.Tangents[vertexIndex] : Float3::Zero; + const Float2 vLightmapUV = mesh.LightmapUVs.HasItems() ? mesh.LightmapUVs[vertexIndex] : Float2::Zero; + const Color vColor = mesh.Colors.HasItems() ? mesh.Colors[vertexIndex] : Color::Black; // Assuming Color::Black as a default color + const int32 end = startIndex + searchRange; - for (int32 v = startIndex; v < end; v++) - { - if (!Float3::NearEqual(vPosition, mesh.Positions[v])) - continue; + for (int32 v = startIndex; v < end; v++) + { + if (!Float3::NearEqual(vPosition, mesh.Positions[v])) + continue; #endif if (mapping[v] == INVALID_INDEX) continue; @@ -201,6 +204,8 @@ int32 FindVertex(const MeshData& mesh, int32 vertexIndex, int32 startIndex, int3 continue; if (mesh.LightmapUVs.HasItems() && (vLightmapUV - mesh.LightmapUVs[v]).LengthSquared() > uvEpsSqr) continue; + if (mesh.Colors.HasItems() && vColor != mesh.Colors[v]) + continue; // TODO: check more components? return v; From 2cc6e809585cb349ba77d72894a9401e5c54a660 Mon Sep 17 00:00:00 2001 From: MZ Date: Thu, 28 Sep 2023 16:07:38 +1000 Subject: [PATCH 2/2] Checked my working. --- .../Engine/Graphics/Models/ModelData.Tool.cpp | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Source/Engine/Graphics/Models/ModelData.Tool.cpp b/Source/Engine/Graphics/Models/ModelData.Tool.cpp index 099e448f2..d061d0745 100644 --- a/Source/Engine/Graphics/Models/ModelData.Tool.cpp +++ b/Source/Engine/Graphics/Models/ModelData.Tool.cpp @@ -154,8 +154,8 @@ bool MeshData::GenerateLightmapUVs() int32 FindVertex(const MeshData& mesh, int32 vertexIndex, int32 startIndex, int32 searchRange, const Array& mapping #if USE_SPARIAL_SORT - , const Assimp::SpatialSort& spatialSort - , std::vector& sparialSortCache + , const Assimp::SpatialSort& spatialSort + , std::vector& sparialSortCache #endif ) { @@ -181,18 +181,19 @@ int32 FindVertex(const MeshData& mesh, int32 vertexIndex, int32 startIndex, int3 if (v < startIndex || v >= end) continue; #else - const Float3 vPosition = mesh.Positions[vertexIndex]; - const Float2 vUV = mesh.UVs.HasItems() ? mesh.UVs[vertexIndex] : Float2::Zero; - const Float3 vNormal = mesh.Normals.HasItems() ? mesh.Normals[vertexIndex] : Float3::Zero; - const Float3 vTangent = mesh.Tangents.HasItems() ? mesh.Tangents[vertexIndex] : Float3::Zero; - const Float2 vLightmapUV = mesh.LightmapUVs.HasItems() ? mesh.LightmapUVs[vertexIndex] : Float2::Zero; + const Float3 vPosition = mesh.Positions[vertexIndex]; + const Float2 vUV = mesh.UVs.HasItems() ? mesh.UVs[vertexIndex] : Float2::Zero; + const Float3 vNormal = mesh.Normals.HasItems() ? mesh.Normals[vertexIndex] : Float3::Zero; + const Float3 vTangent = mesh.Tangents.HasItems() ? mesh.Tangents[vertexIndex] : Float3::Zero; + const Float2 vLightmapUV = mesh.LightmapUVs.HasItems() ? mesh.LightmapUVs[vertexIndex] : Float2::Zero; const Color vColor = mesh.Colors.HasItems() ? mesh.Colors[vertexIndex] : Color::Black; // Assuming Color::Black as a default color - const int32 end = startIndex + searchRange; - for (int32 v = startIndex; v < end; v++) - { - if (!Float3::NearEqual(vPosition, mesh.Positions[v])) - continue; + const int32 end = startIndex + searchRange; + + for (int32 v = startIndex; v < end; v++) + { + if (!Float3::NearEqual(vPosition, mesh.Positions[v])) + continue; #endif if (mapping[v] == INVALID_INDEX) continue;