Files
UnrealEngine/Engine/Source/Runtime/Experimental/ChaosVisualDebugger/Private/DataWrappers/ChaosVDParticleDataWrapper.cpp
2025-05-18 13:04:45 +08:00

264 lines
5.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "DataWrappers/ChaosVDParticleDataWrapper.h"
#include "UObject/FortniteMainBranchObjectVersion.h"
#include "UObject/FortniteSeasonBranchObjectVersion.h"
// @note: Tracing an scene with 1000 particles moving, Manually serializing the structs is ~20% faster
// than normal UStruct serialization in unversioned mode. As we do this at runtime when tracing in development builds, this is important.
// One of the downside is that this will be more involved to maintain as any versioning needs to be done by hand.
bool FChaosVDFRigidParticleControlFlags::Serialize(FArchive& Ar)
{
Ar.UsingCustomVersion(FFortniteSeasonBranchObjectVersion::GUID);
if (Ar.CustomVer(FFortniteSeasonBranchObjectVersion::GUID) >= FFortniteSeasonBranchObjectVersion::CVDSerializationFixMissingSerializationProperties)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
}
Ar << bGravityEnabled;
Ar << bCCDEnabled;
Ar << bOneWayInteractionEnabled;
Ar << bInertiaConditioningEnabled;
Ar << GravityGroupIndex;
Ar << bMACDEnabled;
Ar.UsingCustomVersion(FFortniteMainBranchObjectVersion::GUID);
if (Ar.CustomVer(FFortniteMainBranchObjectVersion::GUID) >= FFortniteMainBranchObjectVersion::SolverIterationsDataSupportInChaosVisualDebugger)
{
Ar << PositionSolverIterationCount;
Ar << VelocitySolverIterationCount;
Ar << ProjectionSolverIterationCount;
}
if (Ar.CustomVer(FFortniteMainBranchObjectVersion::GUID) >= FFortniteMainBranchObjectVersion::GyroscopicTorquesSupportInChaosVisualDebugger)
{
Ar << bGyroscopicTorqueEnabled;
}
return !Ar.IsError();
}
bool FChaosVDParticlePositionRotation::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << MX;
Ar << MR;
return !Ar.IsError();
}
bool FChaosVDParticleVelocities::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << MV;
Ar << MW;
return !Ar.IsError();
}
bool FChaosVDParticleBounds::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << MMin;
Ar << MMax;
return !Ar.IsError();
}
bool FChaosVDParticleDynamics::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << MAcceleration;
Ar << MAngularAcceleration;
Ar << MAngularImpulseVelocity;
Ar << MLinearImpulseVelocity;
return !Ar.IsError();
}
bool FChaosVDParticleMassProps::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << MCenterOfMass;
Ar << MRotationOfMass;
Ar << MI;
Ar << MInvI;
Ar << MM;
Ar << MInvM;
return !Ar.IsError();
}
bool FChaosVDParticleDynamicMisc::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << MAngularEtherDrag;
Ar << MMaxLinearSpeedSq;
Ar << MMaxAngularSpeedSq;
Ar << MInitialOverlapDepenetrationVelocity;
Ar << MCollisionGroup;
Ar << MObjectState;
Ar << MSleepType;
Ar << bDisabled;
MControlFlags.Serialize(Ar);
return true;
}
bool FChaosVDParticleCluster::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << ParentParticleID;
Ar << NumChildren;
Ar << ChildToParent;
Ar << ClusterGroupIndex;
Ar << bInternalCluster;
Ar << CollisionImpulse;
Ar << ExternalStrains;
Ar << InternalStrains;
Ar << Strain;
Ar << ConnectivityEdges;
Ar << bIsAnchored;
Ar << bUnbreakable;
Ar << bIsChildToParentLocked;
return !Ar.IsError();
}
bool FChaosVDKinematicTarget::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << Rotation;
Ar << Position;
Ar << Mode;
return !Ar.IsError();
}
bool FChaosVDVSmooth::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << MV;
Ar << MW;
return !Ar.IsError();
}
bool FChaosVDParticleDataWrapper::Serialize(FArchive& Ar)
{
Ar.UsingCustomVersion(FFortniteMainBranchObjectVersion::GUID);
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << Type;
Ar << GeometryHash;
bHasDebugName = DebugNamePtr != nullptr;
Ar << bHasDebugName;
if (bHasDebugName)
{
if (Ar.IsLoading())
{
Ar << DebugName;
}
else
{
// Keep the static analyser happy, we already checked this above
checkSlow(DebugNamePtr != nullptr);
FString& DebugNameRef = *DebugNamePtr;
Ar << DebugNameRef;
}
}
Ar << ParticleIndex;
Ar << SolverID;
Ar << ParticlePositionRotation;
Ar << ParticleVelocities;
// Bounds data was not exported prior to this version
if (Ar.CustomVer(FFortniteMainBranchObjectVersion::GUID) >= FFortniteMainBranchObjectVersion::ParticleInflatedBoundsInChaosVisualDebugger)
{
Ar << ParticleInflatedBounds;
}
Ar << ParticleDynamics;
Ar << ParticleDynamicsMisc;
Ar << ParticleMassProps;
Ar << CollisionDataPerShape;
Ar << ParticleCluster;
Ar.UsingCustomVersion(FFortniteMainBranchObjectVersion::GUID);
if (Ar.CustomVer(FFortniteMainBranchObjectVersion::GUID) >= FFortniteMainBranchObjectVersion::AdditionalGameThreadDataSupportInChaosVisualDebugger)
{
Ar << ParticleContext;
Ar << ParticleKinematicTarget;
Ar << ParticleVWSmooth;
}
return !Ar.IsError();
}