Fix crash when loading cloth that has different paint data size than mesh

#3264
This commit is contained in:
Wojtek Figat
2025-03-07 21:23:54 +01:00
parent bc6f4f50cb
commit ca153e70ab

View File

@@ -641,6 +641,14 @@ void Cloth::CalculateInvMasses(Array<float>& invMasses)
int32 indicesCount; int32 indicesCount;
if (mesh.Actor->GetMeshData(mesh, MeshBufferType::Index, indicesData, indicesCount)) if (mesh.Actor->GetMeshData(mesh, MeshBufferType::Index, indicesData, indicesCount))
return; return;
if (_paint.Count() != verticesCount)
{
// Fix incorrect paint data
int32 countBefore = _paint.Count();
_paint.Resize(verticesCount);
for (int32 i = countBefore; i < verticesCount; i++)
_paint.Get()[i] = 0.0f;
}
const int32 verticesStride = verticesData.Length() / verticesCount; const int32 verticesStride = verticesData.Length() / verticesCount;
const bool indices16bit = indicesData.Length() / indicesCount == sizeof(uint16); const bool indices16bit = indicesData.Length() / indicesCount == sizeof(uint16);
const int32 trianglesCount = indicesCount / 3; const int32 trianglesCount = indicesCount / 3;
@@ -692,12 +700,12 @@ void Cloth::CalculateInvMasses(Array<float>& invMasses)
float massSum = 0; float massSum = 0;
for (int32 i = 0; i < verticesCount; i++) for (int32 i = 0; i < verticesCount; i++)
{ {
float& mass = invMasses[i]; float& mass = invMasses.Get()[i];
#if USE_CLOTH_SANITY_CHECKS #if USE_CLOTH_SANITY_CHECKS
// Sanity check // Sanity check
ASSERT(!isnan(mass) && !isinf(mass) && mass >= 0.0f); ASSERT(!isnan(mass) && !isinf(mass) && mass >= 0.0f);
#endif #endif
const float maxDistance = _paint[i]; const float maxDistance = _paint.Get()[i];
if (maxDistance < 0.01f) if (maxDistance < 0.01f)
{ {
// Fixed // Fixed
@@ -717,7 +725,7 @@ void Cloth::CalculateInvMasses(Array<float>& invMasses)
const float massScale = (float)(verticesCount - fixedCount) / massSum; const float massScale = (float)(verticesCount - fixedCount) / massSum;
for (int32 i = 0; i < verticesCount; i++) for (int32 i = 0; i < verticesCount; i++)
{ {
float& mass = invMasses[i]; float& mass = invMasses.Get()[i];
if (mass > 0.0f) if (mass > 0.0f)
{ {
mass *= massScale; mass *= massScale;
@@ -772,6 +780,8 @@ bool Cloth::OnPreUpdate()
int32 verticesCount; int32 verticesCount;
if (mesh.Actor->GetMeshData(mesh, MeshBufferType::Vertex0, verticesData, verticesCount)) if (mesh.Actor->GetMeshData(mesh, MeshBufferType::Vertex0, verticesData, verticesCount))
return false; return false;
if (verticesCount != _paint.Count())
return false;
PROFILE_CPU_NAMED("Skinned Pose"); PROFILE_CPU_NAMED("Skinned Pose");
auto vbStride = (uint32)verticesData.Length() / verticesCount; auto vbStride = (uint32)verticesData.Length() / verticesCount;
ASSERT(vbStride == sizeof(VB0SkinnedElementType)); ASSERT(vbStride == sizeof(VB0SkinnedElementType));