bool AreSkelMeshVerticesEqual( const FSoftSkinBuildVertex& V1, const FSoftSkinBuildVertex& V2 ) { if(!PointsEqual(V1.Position, V2.Position)) { return false; } bool bUVsEqual = true; for(int32 UVIdx = 0; UVIdx < MAX_TEXCOORDS; ++UVIdx) { if(FMath::Abs(V1.UVs[UVIdx].X - V2.UVs[UVIdx].X) >(1.0f / 1024.0f)) { bUVsEqual = false; }; if(FMath::Abs(V1.UVs[UVIdx].Y - V2.UVs[UVIdx].Y) > (1.0f / 1024.0f)) { bUVsEqual = false; } } if(!bUVsEqual) { return false; } if(!NormalsEqual(V1.TangentX, V2.TangentX)) { return false; } if(!NormalsEqual(V1.TangentY, V2.TangentY)) { return false; } if(!NormalsEqual(V1.TangentZ, V2.TangentZ)) { return false; } bool InfluencesMatch = 1; for(uint32 InfluenceIndex = 0; InfluenceIndex < MAX_TOTAL_INFLUENCES; InfluenceIndex++) { if(V1.InfluenceBones[InfluenceIndex] != V2.InfluenceBones[InfluenceIndex] || V1.InfluenceWeights[InfluenceIndex] != V2.InfluenceWeights[InfluenceIndex]) { InfluencesMatch = 0; break; } } if(!InfluencesMatch) { return false; } return true; }
int32 AddSkinVertex(TArray<FSoftSkinBuildVertex>& Vertices,FSoftSkinBuildVertex& Vertex, bool bKeepOverlappingVertices ) { if (!bKeepOverlappingVertices) { for(uint32 VertexIndex = 0;VertexIndex < (uint32)Vertices.Num();VertexIndex++) { FSoftSkinBuildVertex& OtherVertex = Vertices[VertexIndex]; if(!PointsEqual(OtherVertex.Position,Vertex.Position)) continue; bool bUVsEqual = true; for( int32 UVIdx = 0; UVIdx < MAX_TEXCOORDS; ++UVIdx ) { if(FMath::Abs(Vertex.UVs[UVIdx].X - OtherVertex.UVs[UVIdx].X) > (1.0f / 1024.0f)) { bUVsEqual = false; }; if(FMath::Abs(Vertex.UVs[UVIdx].Y - OtherVertex.UVs[UVIdx].Y) > (1.0f / 1024.0f)) { bUVsEqual = false; } } if( !bUVsEqual ) continue; if(!NormalsEqual( OtherVertex.TangentX, Vertex.TangentX)) continue; if(!NormalsEqual(OtherVertex.TangentY, Vertex.TangentY)) continue; if(!NormalsEqual(OtherVertex.TangentZ, Vertex.TangentZ)) continue; bool InfluencesMatch = 1; for(uint32 InfluenceIndex = 0;InfluenceIndex < MAX_TOTAL_INFLUENCES;InfluenceIndex++) { if( Vertex.InfluenceBones[InfluenceIndex] != OtherVertex.InfluenceBones[InfluenceIndex] || Vertex.InfluenceWeights[InfluenceIndex] != OtherVertex.InfluenceWeights[InfluenceIndex]) { InfluencesMatch = 0; break; } } if(!InfluencesMatch) continue; return VertexIndex; } } return Vertices.Add(Vertex); }