Files
UnrealEngine/Engine/Source/Programs/HeadlessChaos/Private/Character/TestCharacterGroundConstraint.cpp
2025-05-18 13:04:45 +08:00

137 lines
5.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "HeadlessChaos.h"
#include "HeadlessChaosTestUtility.h"
#include "Chaos/Character/CharacterGroundConstraint.h"
namespace ChaosTest
{
using namespace Chaos;
// Only function is a == operator so test that
TEST(CharacterGroundConstraintTests, TestSettingsAndData)
{
FCharacterGroundConstraintSettings Settings;
FCharacterGroundConstraintSettings SettingsCopy = Settings;
EXPECT_EQ(Settings, SettingsCopy);
Settings.RadialForceLimit = 2000.0f;
EXPECT_FALSE(Settings == SettingsCopy);
FCharacterGroundConstraintDynamicData Data;
FCharacterGroundConstraintDynamicData DataCopy = Data;
EXPECT_EQ(Data, DataCopy);
Data.GroundDistance = 11.0f;
EXPECT_FALSE(Data == DataCopy);
}
TEST(CharacterGroundConstraintTests, TestConstraintInitialization)
{
FCharacterGroundConstraint Constraint;
// Not set proxy so constraint should be invalid
EXPECT_FALSE(Constraint.IsValid());
// Type should be set
EXPECT_EQ(Constraint.GetType(), EConstraintType::CharacterGroundConstraintType);
EXPECT_TRUE(Constraint.IsType(EConstraintType::CharacterGroundConstraintType));
// Force and torque should be initialized to zero
EXPECT_VECTOR_FLOAT_EQ(Constraint.GetSolverAppliedForce(), FVector(0));
EXPECT_VECTOR_FLOAT_EQ(Constraint.GetSolverAppliedTorque(), FVector(0));
}
TEST(CharacterGroundConstraintTests, TestConstraintDirtyFlags)
{
FCharacterGroundConstraint Constraint;
EXPECT_FALSE(Constraint.IsDirty());
Constraint.SetGroundDistance(10.0);
EXPECT_EQ(Constraint.GetGroundDistance(), 10.0);
EXPECT_TRUE(Constraint.IsDirty());
EXPECT_TRUE(Constraint.IsDirty(EChaosPropertyFlags::CharacterGroundConstraintDynamicData));
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::CharacterGroundConstraintSettings));
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::CharacterParticleProxy));
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::GroundParticleProxy));
Constraint.ClearDirtyFlags();
EXPECT_FALSE(Constraint.IsDirty());
Constraint.SetTargetHeight(20.0);
EXPECT_EQ(Constraint.GetTargetHeight(), 20.0);
EXPECT_TRUE(Constraint.IsDirty());
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::CharacterGroundConstraintDynamicData));
EXPECT_TRUE(Constraint.IsDirty(EChaosPropertyFlags::CharacterGroundConstraintSettings));
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::CharacterParticleProxy));
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::GroundParticleProxy));
Constraint.ClearDirtyFlags();
Constraint.SetMaxCharacterGroundMassRatio(1.5);
EXPECT_EQ(Constraint.GetMaxCharacterGroundMassRatio(), 1.5);
EXPECT_TRUE(Constraint.IsDirty());
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::CharacterGroundConstraintDynamicData));
EXPECT_TRUE(Constraint.IsDirty(EChaosPropertyFlags::CharacterGroundConstraintSettings));
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::CharacterParticleProxy));
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::GroundParticleProxy));
Constraint.ClearDirtyFlags();
FSingleParticlePhysicsProxy* CharacterProxy = FSingleParticlePhysicsProxy::Create(FGeometryParticle::CreateParticle());
FSingleParticlePhysicsProxy* GroundProxy = FSingleParticlePhysicsProxy::Create(FGeometryParticle::CreateParticle());
Constraint.Init(CharacterProxy);
EXPECT_EQ(Constraint.GetCharacterParticleProxy(), CharacterProxy);
EXPECT_TRUE(Constraint.IsDirty(EChaosPropertyFlags::CharacterGroundConstraintDynamicData));
EXPECT_TRUE(Constraint.IsDirty(EChaosPropertyFlags::CharacterGroundConstraintSettings));
EXPECT_TRUE(Constraint.IsDirty(EChaosPropertyFlags::CharacterParticleProxy));
EXPECT_FALSE(Constraint.IsDirty(EChaosPropertyFlags::GroundParticleProxy));
Constraint.SetGroundParticleProxy(GroundProxy);
EXPECT_EQ(Constraint.GetGroundParticleProxy(), GroundProxy);
EXPECT_TRUE(Constraint.IsDirty(EChaosPropertyFlags::GroundParticleProxy));
Constraint.ClearDirtyFlags();
FDirtyProxiesBucketInfo BucketInfo;
BucketInfo.Num[(uint32)EPhysicsProxyType::CharacterGroundConstraintType] = 1;
FDirtyPropertiesManager Manager;
Manager.PrepareBuckets(BucketInfo);
FDirtyChaosProperties RemoteData;
EXPECT_FALSE(RemoteData.HasCharacterGroundConstraintSettings());
Constraint.SetTargetHeight(15.0);
Constraint.SetMaxCharacterGroundMassRatio(1.2);
Constraint.SyncRemoteData(Manager, 0, RemoteData);
ASSERT_TRUE(RemoteData.HasCharacterGroundConstraintSettings());
EXPECT_FALSE(RemoteData.HasCharacterGroundConstraintDynamicData());
const FCharacterGroundConstraintSettings& Settings = RemoteData.GetCharacterGroundConstraintSettings(Manager, 0);
EXPECT_EQ(Settings.TargetHeight, 15.0);
EXPECT_EQ(Settings.MaxCharacterGroundMassRatio, 1.2);
Constraint.ClearDirtyFlags();
RemoteData.Clear(Manager, 0);
EXPECT_FALSE(RemoteData.HasCharacterGroundConstraintDynamicData());
EXPECT_FALSE(RemoteData.HasCharacterGroundConstraintSettings());
Constraint.SetGroundDistance(34.5);
Constraint.SyncRemoteData(Manager, 0, RemoteData);
ASSERT_TRUE(RemoteData.HasCharacterGroundConstraintDynamicData());
EXPECT_FALSE(RemoteData.HasCharacterGroundConstraintSettings());
const FCharacterGroundConstraintDynamicData& Data = RemoteData.GetCharacterGroundConstraintDynamicData(Manager, 0);
EXPECT_EQ(Data.GroundDistance, 34.5);
}
} // namespace ChaosTest