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

190 lines
5.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "DataWrappers/ChaosVDQueryDataWrappers.h"
#include "DataWrappers/ChaosVDDataSerializationMacros.h"
#include "UObject/FortniteMainBranchObjectVersion.h"
bool FChaosVDCollisionResponseParams::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << FlagsPerChannel;
return !Ar.IsError();
}
bool FChaosVDCollisionObjectQueryParams::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << ObjectTypesToQuery;
Ar << IgnoreMask;
return !Ar.IsError();
}
bool FChaosVDCollisionQueryParams::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << TraceTag;
Ar << OwnerTag;
Ar << IgnoredActorsIDs;
Ar << IgnoredComponentsNames;
Ar << IgnoredActorsNames;
EChaosVDCollisionQueryParamsFlags PackedQueryFlags = EChaosVDCollisionQueryParamsFlags::None;
// Note: When the UI is done to show the enums in the same way we show these bitfiedls as read only booleans in CVD, we can remove all
// this macro boilerplate and just serialize the the flags directly
if (Ar.IsLoading())
{
Ar << PackedQueryFlags;
CVD_UNPACK_BITFIELD_DATA(bTraceComplex, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::TraceComplex);
CVD_UNPACK_BITFIELD_DATA(bFindInitialOverlaps, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::FindInitialOverlaps);
CVD_UNPACK_BITFIELD_DATA(bReturnFaceIndex, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::ReturnFaceIndex);
CVD_UNPACK_BITFIELD_DATA(bReturnPhysicalMaterial, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::ReturnPhysicalMaterial);
CVD_UNPACK_BITFIELD_DATA(bIgnoreBlocks, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::IgnoreBlocks);
CVD_UNPACK_BITFIELD_DATA(bIgnoreTouches, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::IgnoreTouches);
CVD_UNPACK_BITFIELD_DATA(bSkipNarrowPhase, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::SkipNarrowPhase);
CVD_UNPACK_BITFIELD_DATA(bTraceIntoSubComponents, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::TraceIntoSubComponents);
CVD_UNPACK_BITFIELD_DATA(bReplaceHitWithSubComponents, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::ReplaceHitWithSubComponents);
}
else
{
CVD_PACK_BITFIELD_DATA(bTraceComplex, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::TraceComplex);
CVD_PACK_BITFIELD_DATA(bFindInitialOverlaps, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::FindInitialOverlaps);
CVD_PACK_BITFIELD_DATA(bReturnFaceIndex, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::ReturnFaceIndex);
CVD_PACK_BITFIELD_DATA(bReturnPhysicalMaterial, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::ReturnPhysicalMaterial);
CVD_PACK_BITFIELD_DATA(bIgnoreBlocks, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::IgnoreBlocks);
CVD_PACK_BITFIELD_DATA(bIgnoreTouches, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::IgnoreTouches);
CVD_PACK_BITFIELD_DATA(bSkipNarrowPhase, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::SkipNarrowPhase);
CVD_PACK_BITFIELD_DATA(bTraceIntoSubComponents, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::TraceIntoSubComponents);
CVD_PACK_BITFIELD_DATA(bReplaceHitWithSubComponents, PackedQueryFlags, EChaosVDCollisionQueryParamsFlags::ReplaceHitWithSubComponents);
Ar << PackedQueryFlags;
}
return !Ar.IsError();
}
bool FChaosVDQueryFastData::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << Dir;
Ar << InvDir;
Ar << CurrentLength;
Ar << InvDir;
EChaosVDQueryFastDataParallelFlags PackedFlags = EChaosVDQueryFastDataParallelFlags::None;
// Note: When the UI is done to show the enums in the same way we show these bitfiedls as read only booleans in CVD, we can remove all
// this macro boilerplate and just serialize the the flags directly
if (Ar.IsLoading())
{
Ar << PackedFlags;
CVD_UNPACK_BITFIELD_DATA(bParallel0, PackedFlags, EChaosVDQueryFastDataParallelFlags::Parallel0);
CVD_UNPACK_BITFIELD_DATA(bParallel1, PackedFlags, EChaosVDQueryFastDataParallelFlags::Parallel1);
CVD_UNPACK_BITFIELD_DATA(bParallel2, PackedFlags, EChaosVDQueryFastDataParallelFlags::Parallel2);
}
else
{
CVD_PACK_BITFIELD_DATA(bParallel0, PackedFlags, EChaosVDQueryFastDataParallelFlags::Parallel0);
CVD_PACK_BITFIELD_DATA(bParallel1, PackedFlags, EChaosVDQueryFastDataParallelFlags::Parallel1);
CVD_PACK_BITFIELD_DATA(bParallel2, PackedFlags, EChaosVDQueryFastDataParallelFlags::Parallel2);
Ar << PackedFlags;
}
return !Ar.IsError();
}
bool FChaosVDQueryHitData::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << Distance;
Ar << FaceIdx;
Ar << Flags;
Ar << WorldPosition;
Ar << WorldNormal;
Ar << FaceNormal;
Ar << bHasValidData;
return !Ar.IsError();
}
bool FChaosVDQueryVisitStep::Serialize(FArchive& Ar)
{
Ar << bHasValidData;
if (!bHasValidData)
{
return !Ar.IsError();
}
Ar << OwningQueryID;
Ar << Type;
Ar << ShapeIndex;
Ar << ParticleIndex;
Ar << ParticleTransform;
Ar << HitType;
Ar << HitData;
Ar << QueryFastData;
Ar.UsingCustomVersion(FFortniteMainBranchObjectVersion::GUID);
if (Ar.CustomVer(FFortniteMainBranchObjectVersion::GUID) >= FFortniteMainBranchObjectVersion::AdditionalGameThreadDataSupportInChaosVisualDebugger)
{
Ar << RejectReason;
}
return !Ar.IsError();
}
bool FChaosVDQueryDataWrapper::Serialize(FArchive& Ar)
{
Ar << ID;
Ar << ParentQueryID;
Ar << WorldSolverID;
Ar << bIsRetryQuery;
Ar << InputGeometryKey;
Ar << GeometryOrientation;
Ar << Type;
Ar << Mode;
Ar << StartLocation;
Ar << EndLocation;
Ar << CollisionChannel;
Ar << CollisionQueryParams;
Ar << CollisionResponseParams;
Ar << CollisionObjectQueryParams;
// Hits and steps are intentionally not serialized as they are recorded as separated events, and reconstructed during trace analysis
return !Ar.IsError();
}