UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SerializedMultiPhysicsState.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4#include "Containers/Array.h"
5#include "SolverSerializer.h"
7
8namespace Chaos
9{
11 {
15
17 {
18 Header.DataContext = DataContext;
19 }
20
21 CHAOS_API void ReadElementDataIntoBuffer(FSerializedDataBuffer& TargetBuffer);
22
23 template<typename ElementType>
25 {
26 if (Header.DataContext == ESerializedDataContext::Both)
27 {
28 AppendDataFromElement_Internal(InElement, ESerializedDataContext::Internal);
29 AppendDataFromElement_Internal(InElement, ESerializedDataContext::External);
30 return;
31 }
32
33 AppendDataFromElement_Internal(InElement, Header.DataContext);
34 }
35
36 template<typename ElementType>
37 void ApplyDataToElement(ElementType& InElement)
38 {
39 if (Header.DataContext == ESerializedDataContext::Both)
40 {
41 ApplyDataToElement_Internal(InElement, ESerializedDataContext::Internal);
42 ApplyDataToElement_Internal(InElement, ESerializedDataContext::External);
43 return;
44 }
45
46 ApplyDataToElement_Internal(InElement, Header.DataContext);
47 }
48
49 private:
50 template<typename ElementType>
51 void AppendDataFromElement_Internal(ElementType& InElement, ESerializedDataContext DataContext)
52 {
53 FDataEntryTag DataTag;
54 DataTag.DataOffset = GetSize();
55
56 InElement.SerializeState(MigratedStateAsBytes, DataContext);
57
58 DataTag.DataSize = GetSize() - DataTag.DataOffset;
59
60 Header.DataTagPerElementIndex.Emplace(DataTag);
61 }
62
63 template<typename ElementType>
64 void ApplyDataToElement_Internal(ElementType& InElement, ESerializedDataContext DataContext)
65 {
66 FSerializedDataBufferPtr DataBuffer = MakeUnique<FSerializedDataBuffer>();
67 ReadElementDataIntoBuffer(*DataBuffer);
68 InElement.ApplySerializedState(MoveTemp(DataBuffer), DataContext);
69 }
70
71 public:
72
74
75 int32 GetSize() const
76 {
77 return MigratedStateAsBytes.GetSize();
78 }
79
80 private:
81
82 FSerializedDataBuffer MigratedStateAsBytes;
83
84 struct FDataEntryTag
85 {
86 int32 DataOffset = INDEX_NONE;
88
89 friend FArchive& operator<<(FArchive& Ar, FDataEntryTag& Data)
90 {
91 Ar << Data.DataOffset;
92 Ar << Data.DataSize;
93 return Ar;
94 }
95
96 bool IsValid() const
97 {
98 return DataOffset != INDEX_NONE && DataSize != INDEX_NONE;
99 }
100 };
101 public:
102 struct FHeader
103 {
105 int32 NumBodies = 0;
106 int32 NumConstraints = 0;
107
109
111 {
112 Ar << Data.DataContext;
113 Ar << Data.NumBodies;
114 Ar << Data.NumConstraints;
115 Ar << Data.DataTagPerElementIndex;
116
117 return Ar;
118 }
119
120 bool IsValid() const
121 {
122 const int32 CurrentDataElementsNum = DataTagPerElementIndex.Num();
123 const int32 CurrentBodiesAndConstraintsNum = NumBodies + NumConstraints;
124 const int32 ExpectedDataElementsNum = DataContext == ESerializedDataContext::Both ? CurrentBodiesAndConstraintsNum * 2 : CurrentBodiesAndConstraintsNum;
125 return DataContext != ESerializedDataContext::Invalid && CurrentDataElementsNum == ExpectedDataElementsNum;
126 }
127 };
128
129 void SetNumOfBodies(int32 NumBodies)
130 {
131 Header.NumBodies = NumBodies;
132 }
133
134 void SetNumOfConstraints(int32 NumConstraints)
135 {
136 Header.NumConstraints = NumConstraints;
137 }
138
139 const FHeader& GetHeader() const
140 {
141 return Header;
142 }
143
144 private:
145 FHeader Header;
146 int32 CurrentReadElementIndex = 0;
147 };
148}
149
150
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_INTERNAL
Definition CoreMiscDefines.h:345
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
FArchive & operator<<(FArchive &Ar, FEnvQueryDebugProfileData::FStep &Data)
Definition EnvQueryTypes.cpp:489
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition Archive.h:1208
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition SkeletalMeshComponent.h:307
ESerializedDataContext
Definition SolverSerializer.h:27
Definition SerializedDataBuffer.h:12
Definition SerializedMultiPhysicsState.h:103
TArray< FDataEntryTag > DataTagPerElementIndex
Definition SerializedMultiPhysicsState.h:108
friend FArchive & operator<<(FArchive &Ar, FHeader &Data)
Definition SerializedMultiPhysicsState.h:110
bool IsValid() const
Definition SerializedMultiPhysicsState.h:120
Definition SerializedMultiPhysicsState.h:11
void ApplyDataToElement(ElementType &InElement)
Definition SerializedMultiPhysicsState.h:37
void AppendDataFromElement(ElementType &InElement)
Definition SerializedMultiPhysicsState.h:24
void SetNumOfBodies(int32 NumBodies)
Definition SerializedMultiPhysicsState.h:129
const FHeader & GetHeader() const
Definition SerializedMultiPhysicsState.h:139
void SetNumOfConstraints(int32 NumConstraints)
Definition SerializedMultiPhysicsState.h:134
FSerializedMultiPhysicsState(ESerializedDataContext DataContext)
Definition SerializedMultiPhysicsState.h:16
FSerializedMultiPhysicsState()
Definition SerializedMultiPhysicsState.h:12
int32 GetSize() const
Definition SerializedMultiPhysicsState.h:75