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);
	}