Files
UnrealEngine/Engine/Source/Runtime/ClothingSystemRuntimeInterface/Private/ClothCollisionData.cpp
2025-05-18 13:04:45 +08:00

69 lines
2.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ClothCollisionData.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(ClothCollisionData)
void FClothCollisionData::Reset()
{
Spheres.Reset();
SphereConnections.Reset();
Convexes.Reset();
Boxes.Reset();
}
void FClothCollisionData::Append(const FClothCollisionData& InOther)
{
const int32 NumSpheresBefore = Spheres.Num();
const int32 NumSphereConnectionsBefore = SphereConnections.Num();
Spheres.Append(InOther.Spheres);
SphereConnections.Append(InOther.SphereConnections);
const int32 NumSphereConnectionsAfter = SphereConnections.Num();
if(NumSpheresBefore > 0)
{
// Each connection that was added needs to have its sphere indices increased to match the new spheres that were added
for(int32 NewConnectionIndex = NumSphereConnectionsBefore; NewConnectionIndex < NumSphereConnectionsAfter; ++NewConnectionIndex)
{
FClothCollisionPrim_SphereConnection& Connection = SphereConnections[NewConnectionIndex];
Connection.SphereIndices[0] += NumSpheresBefore;
Connection.SphereIndices[1] += NumSpheresBefore;
}
}
Convexes.Append(InOther.Convexes);
Boxes.Append(InOther.Boxes);
}
void FClothCollisionData::AppendTransformed(const FClothCollisionData& InOther, const TArray<FTransform>& BoneTransforms)
{
const int32 NumSpheresBefore = Spheres.Num();
const int32 NumConvexesBefore = Convexes.Num();
const int32 NumBoxesBefore = Boxes.Num();
Append(InOther);
for (int32 Index = NumSpheresBefore; Index < Spheres.Num(); ++Index)
{
const FTransform& Transform = BoneTransforms[Spheres[Index].BoneIndex];
Spheres[Index].LocalPosition = Transform.TransformPosition(Spheres[Index].LocalPosition);
}
for (int32 Index = NumConvexesBefore; Index < Convexes.Num(); ++Index)
{
const FTransform& Transform = BoneTransforms[Convexes[Index].BoneIndex];
for (FVector& SurfacePoint : Convexes[Index].SurfacePoints)
{
SurfacePoint = Transform.TransformPosition(SurfacePoint);
}
}
for (int32 Index = NumBoxesBefore; Index < Boxes.Num(); ++Index)
{
const FTransform& Transform = BoneTransforms[Boxes[Index].BoneIndex];
Boxes[Index].LocalPosition = Transform.TransformPosition(Boxes[Index].LocalPosition);
Boxes[Index].LocalRotation = Transform.TransformRotation(Boxes[Index].LocalRotation);
}
}