UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DynamicAttribute.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "MeshIndexMappings.h"
8
9namespace UE
10{
11namespace Geometry
12{
13
14struct FMeshIndexMappings;
15
16template<typename ParentType>
17class TDynamicAttributeBase;
18
22template<typename ParentType>
24{
25public:
27 {
28 }
29
30 // default do-nothing implementations are provided because many attribute layers will only care about some kinds of elements and won't implement all of these
31
33 {
34 }
36 {
37 }
38
40 {
41 }
42 UE_DEPRECATED(5.6, "Use the version of this method that takes a TSet instead")
43 virtual void StoreAllFinalVertices(const TDynamicAttributeBase<ParentType>* Attribute, const TArray<int>& TriangleIDs)
44 {
45 ensure(false);
46 }
48 {
49 }
50
52 {
53 return false;
54 }
55};
56
58
59
65template<typename ParentType>
67{
68
69public:
71 {
72 }
73
74
75public:
77 FName GetName() const { return Name; }
78
81
82protected:
85
86
87
88
89public:
90
91
93 virtual TDynamicAttributeBase* MakeCopy(ParentType* ParentIn) const = 0;
95 virtual TDynamicAttributeBase* MakeNew(ParentType* ParentIn) const = 0;
101 {
103 Copy->CompactInPlace(CompactMaps);
104 return Copy;
105 }
106
108 virtual void CompactInPlace(const FCompactMaps& CompactMaps) = 0;
109
111 virtual void Reparent(ParentType* NewParent) = 0;
112
119 virtual bool CopyThroughMapping(const TDynamicAttributeBase* Source, const FMeshIndexMappings& Mapping) = 0;
120
125 virtual bool Append(const TDynamicAttributeBase& Source, const FDynamicMesh3::FAppendInfo& AppendInfo) = 0;
126
131
133 virtual bool CopyOut(int RawID, void* Buffer, int BufferSize) const = 0;
134
136 virtual bool CopyIn(int RawID, void* Buffer, int BufferSize) = 0;
137
138 virtual void OnNewVertex(int VertexID, bool bInserted)
139 {
140 }
141
142 virtual void OnRemoveVertex(int VertexID)
143 {
144 }
145
146 virtual void OnNewTriangle(int TriangleID, bool bInserted)
147 {
148 }
149
150 virtual void OnRemoveTriangle(int TriangleID)
151 {
152 }
153
154 virtual void OnReverseTriOrientation(int TriangleID)
155 {
156 }
157
165 {
166 // default impl just doesn't check anything; override with any useful sanity checks
167 return true;
168 }
169
170
172
173
174
177 {
178 }
179
182 {
183 }
184
189
194
199
207
212
221 {
222 Attr.Serialize(Ar);
223 return Ar;
224 }
225
232 {
234 if (!Ar.IsLoading() || Ar.CustomVer(FUE5MainStreamObjectVersion::GUID) >= FUE5MainStreamObjectVersion::DynamicMeshAttributesWeightMapsAndNames)
235 {
238 }
239 }
240
241 virtual SIZE_T GetByteCount() const { return 0; }
242
243protected:
244
250 {
251 Name = Other.Name;
252 }
253};
254
255
257
258
262template<typename ParentType>
264{
265protected:
266 // not managed by the base class; we should be able to register any attributes here that we want to be automatically updated
268
276
281
283 {
284 RegisteredAttributes.Reset();
285 }
286
287public:
289 {
290 }
291
293 {
294 return RegisteredAttributes.Num();
295 }
296
301
302 // These functions are called by the FDynamicMesh3 to update the various
303 // attributes when the parent mesh topology has been modified.
304 virtual void OnNewTriangle(int TriangleID, bool bInserted)
305 {
307 {
308 A->OnNewTriangle(TriangleID, bInserted);
309 }
310 }
311 virtual void OnNewVertex(int VertexID, bool bInserted)
312 {
314 {
315 A->OnNewVertex(VertexID, bInserted);
316 }
317 }
318 virtual void OnRemoveTriangle(int TriangleID)
319 {
321 {
322 A->OnRemoveTriangle(TriangleID);
323 }
324 }
325 virtual void OnRemoveVertex(int VertexID)
326 {
328 {
329 A->OnRemoveVertex(VertexID);
330 }
331 }
332 virtual void OnReverseTriOrientation(int TriangleID)
333 {
335 {
336 A->OnReverseTriOrientation(TriangleID);
337 }
338 }
339
347 {
348 bool bValid = true;
350 {
351 bValid = A->CheckValidity(bAllowNonmanifold, FailMode) && bValid;
352 }
353 return bValid;
354 }
355
356
357 // mesh-specific on* functions; may be split out
358public:
359
361 {
363 {
364 A->OnSplitEdge(SplitInfo);
365 }
366 }
368 {
370 {
371 A->OnFlipEdge(FlipInfo);
372 }
373 }
375 {
377 {
378 A->OnCollapseEdge(CollapseInfo);
379 }
380 }
382 {
384 {
385 A->OnPokeTriangle(PokeInfo);
386 }
387 }
389 {
391 {
392 A->OnMergeEdges(MergeInfo);
393 }
394 }
396 {
397 if (!ensureMsgf(!MergeInfo.EdgeCollapseInfo.IsSet(), TEXT("Vertex merge that resolves as edge collapse "
398 "is expected to have called OnCollapseEdge, not OnMergeVertices.")))
399 {
400 OnCollapseEdge(MergeInfo.EdgeCollapseInfo.GetValue());
401 return;
402 }
403 if (!ensureMsgf(!MergeInfo.MergeEdgesInfo.IsSet(), TEXT("Vertex merge that resolves as edge merge "
404 "is expected to have called OnMergeEdges, not OnMergeVertices.")))
405 {
406 OnMergeEdges(MergeInfo.MergeEdgesInfo.GetValue());
407 return;
408 }
409
411 {
412 A->OnMergeVertices(MergeInfo);
413 }
414 }
422};
423
425
426} // end namespace UE::Geometry
427} // end namespace UE
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition Archive.h:1208
virtual CORE_API void UsingCustomVersion(const struct FGuid &Guid)
Definition Archive.cpp:590
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
CORE_API int32 CustomVer(const struct FGuid &Key) const
Definition Archive.cpp:602
Definition NameTypes.h:617
Definition ArrayView.h:139
Definition Array.h:670
Definition UniquePtr.h:107
Definition CompactMaps.h:20
Definition DynamicAttribute.h:67
virtual TDynamicAttributeBase * MakeCopy(ParentType *ParentIn) const =0
FName GetName() const
Definition DynamicAttribute.h:77
virtual SIZE_T GetByteCount() const
Definition DynamicAttribute.h:241
virtual ~TDynamicAttributeBase()
Definition DynamicAttribute.h:70
virtual void OnMergeVertices(const DynamicMeshInfo::FMergeVerticesInfo &MergeInfo)
Definition DynamicAttribute.h:204
virtual bool CopyOut(int RawID, void *Buffer, int BufferSize) const =0
void SetName(FName NameIn)
Definition DynamicAttribute.h:80
virtual TDynamicAttributeBase * MakeNew(ParentType *ParentIn) const =0
virtual void OnNewTriangle(int TriangleID, bool bInserted)
Definition DynamicAttribute.h:146
virtual void OnSplitVertex(const DynamicMeshInfo::FVertexSplitInfo &SplitInfo, const TArrayView< const int > &TrianglesToUpdate)
Definition DynamicAttribute.h:209
virtual void OnMergeEdges(const DynamicMeshInfo::FMergeEdgesInfo &MergeInfo)
Definition DynamicAttribute.h:196
virtual void OnPokeTriangle(const DynamicMeshInfo::FPokeTriangleInfo &PokeInfo)
Definition DynamicAttribute.h:191
virtual TDynamicAttributeBase * MakeCompactCopy(const FCompactMaps &CompactMaps, ParentType *ParentIn) const
Definition DynamicAttribute.h:100
virtual void AppendDefaulted(const FDynamicMesh3::FAppendInfo &AppendInfo)=0
FName Name
Definition DynamicAttribute.h:84
virtual void OnReverseTriOrientation(int TriangleID)
Definition DynamicAttribute.h:154
virtual void Reparent(ParentType *NewParent)=0
virtual void CopyParentClassData(const TDynamicAttributeBase< ParentType > &Other)
Definition DynamicAttribute.h:249
virtual bool Append(const TDynamicAttributeBase &Source, const FDynamicMesh3::FAppendInfo &AppendInfo)=0
virtual TUniquePtr< TDynamicAttributeChangeBase< ParentType > > NewBlankChange() const =0
virtual void OnSplitEdge(const DynamicMeshInfo::FEdgeSplitInfo &SplitInfo)
Definition DynamicAttribute.h:176
virtual void OnRemoveVertex(int VertexID)
Definition DynamicAttribute.h:142
void Serialize(FArchive &Ar)
Definition DynamicAttribute.h:231
virtual void OnRemoveTriangle(int TriangleID)
Definition DynamicAttribute.h:150
virtual bool CheckValidity(bool bAllowNonmanifold, EValidityCheckFailMode FailMode) const
Definition DynamicAttribute.h:164
virtual void OnFlipEdge(const DynamicMeshInfo::FEdgeFlipInfo &FlipInfo)
Definition DynamicAttribute.h:181
virtual bool CopyIn(int RawID, void *Buffer, int BufferSize)=0
virtual void OnNewVertex(int VertexID, bool bInserted)
Definition DynamicAttribute.h:138
friend FArchive & operator<<(FArchive &Ar, TDynamicAttributeBase< ParentType > &Attr)
Definition DynamicAttribute.h:220
virtual void CompactInPlace(const FCompactMaps &CompactMaps)=0
virtual void OnCollapseEdge(const DynamicMeshInfo::FEdgeCollapseInfo &CollapseInfo)
Definition DynamicAttribute.h:186
virtual bool CopyThroughMapping(const TDynamicAttributeBase *Source, const FMeshIndexMappings &Mapping)=0
Definition DynamicAttribute.h:24
virtual void SaveInitialTriangle(const TDynamicAttributeBase< ParentType > *Attribute, int TriangleID)
Definition DynamicAttribute.h:32
virtual void StoreAllFinalVertices(const TDynamicAttributeBase< ParentType > *Attribute, const TArray< int > &TriangleIDs)
Definition DynamicAttribute.h:43
virtual ~TDynamicAttributeChangeBase()
Definition DynamicAttribute.h:26
virtual void StoreAllFinalTriangles(const TDynamicAttributeBase< ParentType > *Attribute, const TArray< int > &TriangleIDs)
Definition DynamicAttribute.h:39
virtual void SaveInitialVertex(const TDynamicAttributeBase< ParentType > *Attribute, int VertexID)
Definition DynamicAttribute.h:35
virtual void StoreAllFinalVertices(const TDynamicAttributeBase< ParentType > *Attribute, const TSet< int > &TriangleIDs)
Definition DynamicAttribute.h:47
virtual bool Apply(TDynamicAttributeBase< ParentType > *Attribute, bool bRevert) const
Definition DynamicAttribute.h:51
Definition DynamicAttribute.h:264
virtual void OnFlipEdge(const DynamicMeshInfo::FEdgeFlipInfo &FlipInfo)
Definition DynamicAttribute.h:367
TDynamicAttributeBase< ParentType > * GetRegisteredAttribute(int Idx) const
Definition DynamicAttribute.h:297
virtual void OnMergeVertices(const DynamicMeshInfo::FMergeVerticesInfo &MergeInfo)
Definition DynamicAttribute.h:395
virtual void OnPokeTriangle(const DynamicMeshInfo::FPokeTriangleInfo &PokeInfo)
Definition DynamicAttribute.h:381
virtual void OnMergeEdges(const DynamicMeshInfo::FMergeEdgesInfo &MergeInfo)
Definition DynamicAttribute.h:388
virtual void OnNewTriangle(int TriangleID, bool bInserted)
Definition DynamicAttribute.h:304
virtual void OnRemoveVertex(int VertexID)
Definition DynamicAttribute.h:325
virtual void OnNewVertex(int VertexID, bool bInserted)
Definition DynamicAttribute.h:311
virtual void OnSplitVertex(const DynamicMeshInfo::FVertexSplitInfo &SplitInfo, const TArrayView< const int > &TrianglesToUpdate)
Definition DynamicAttribute.h:415
int NumRegisteredAttributes() const
Definition DynamicAttribute.h:292
virtual void OnSplitEdge(const DynamicMeshInfo::FEdgeSplitInfo &SplitInfo)
Definition DynamicAttribute.h:360
virtual void OnReverseTriOrientation(int TriangleID)
Definition DynamicAttribute.h:332
virtual void OnRemoveTriangle(int TriangleID)
Definition DynamicAttribute.h:318
TArray< TDynamicAttributeBase< ParentType > * > RegisteredAttributes
Definition DynamicAttribute.h:267
void UnregisterExternalAttribute(TDynamicAttributeBase< ParentType > *Attribute)
Definition DynamicAttribute.h:277
virtual void OnCollapseEdge(const DynamicMeshInfo::FEdgeCollapseInfo &CollapseInfo)
Definition DynamicAttribute.h:374
void ResetRegisteredAttributes()
Definition DynamicAttribute.h:282
virtual ~TDynamicAttributeSetBase()
Definition DynamicAttribute.h:288
virtual bool CheckValidity(bool bAllowNonmanifold, EValidityCheckFailMode FailMode) const
Definition DynamicAttribute.h:346
void RegisterExternalAttribute(TDynamicAttributeBase< ParentType > *Attribute)
Definition DynamicAttribute.h:272
TDynamicAttributeSetBase< FDynamicMesh3 > FDynamicMeshAttributeSetBase
Definition DynamicAttribute.h:424
EValidityCheckFailMode
Definition GeometryTypes.h:72
TDynamicAttributeChangeBase< FDynamicMesh3 > FDynamicMeshAttributeChangeBase
Definition DynamicAttribute.h:57
TDynamicAttributeBase< FDynamicMesh3 > FDynamicMeshAttributeBase
Definition DynamicAttribute.h:256
Definition AdvancedWidgetsModule.cpp:13
Definition InfoTypes.h:181
Definition InfoTypes.h:171
Definition InfoTypes.h:155
Definition InfoTypes.h:197
Definition InfoTypes.h:216
Definition InfoTypes.h:229
Definition InfoTypes.h:242
Definition NameAsStringProxyArchive.h:12
CORE_API static const FGuid GUID
Definition UE5MainStreamObjectVersion.h:22
Definition DynamicMesh3.h:309
Definition MeshIndexMappings.h:22