UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DynamicMeshChangeTracker.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
7#include "CoreTypes.h"
14#include "GeometryTypes.h"
15#include "HAL/PlatformCrt.h"
16#include "IndexTypes.h"
17#include "Misc/Optional.h"
18#include "Templates/UniquePtr.h"
20
21
22//
23// Implementation of mesh change tracking for FDynamicMesh3.
24//
25// The top-level class is FDynamicMeshChangeTracker, found at the bottom of this file.
26// You create an instance of this and then call BeginChange(), then call SaveVertex()/SaveTriangle()
27// before you make modifications to a vertex/triangle, and then call EndChange() at the end.
28// This function emits a FDynamicMeshChange instance, and you can call Apply() to apply/revert it.
29// So this is the object you would store in a higher-level undo/redo record, for example.
30//
31// Attribute overlays make everything more complicated of course. Handling of these
32// follows a similar structure - the MeshChangeTracker creates a FDynamicMeshAttributeSetChangeTracker,
33// which in turn creates a TDynamicMeshAttributeChange for each UV and Normal overlay
34// (grouped together in a FDynamicMeshAttributeChangeSet). However you don't have to explicitly
35// do anything to get Attribute support, if the initial Mesh had attributes, then
36// this all happens automatically, and the attribute changes get attached to the FDynamicMeshChange.
37//
38// @todo Currently the attribute support is hardcoded for UV (2-float) and Normal (3-float) overlays.
39// Perhaps it would be possible to make this more flexible to avoid hardcoding these?
40// Very little of the code depends on the element size or type.
41//
42//
43
44namespace UE
45{
46namespace Geometry
47{
48
49
55template<typename RealType, int ElementSize>
95
104
107
129
130
140{
141public:
143
145 GEOMETRYCORE_API void SaveInitialVertex(const FDynamicMesh3* Mesh, int VertexID);
147 GEOMETRYCORE_API void SaveInitialTriangle(const FDynamicMesh3* Mesh, int TriangleID);
148
150 GEOMETRYCORE_API void StoreFinalVertex(const FDynamicMesh3* Mesh, int VertexID);
152 GEOMETRYCORE_API void StoreFinalTriangle(const FDynamicMesh3* Mesh, int TriangleID);
153
159
162
165
167 GEOMETRYCORE_API bool HasSavedVertex(int VertexID);
168
171
174
177
178protected:
179
185
193
196
199
201
206
207};
208
209
210
211
212
213
214
221{
222public:
224
229
231 GEOMETRYCORE_API void SaveInitialTriangle(int TriangleID);
232
234 GEOMETRYCORE_API void StoreAllFinalTriangles(const TArray<int>& TriangleIDs);
235
237 GEOMETRYCORE_API void SaveInitialVertex(int VertexID);
238
240 UE_DEPRECATED(5.6, "Use the version of this method that takes a TSet instead")
241 void StoreAllFinalVertices(const TArray<int>& VertexIDs)
242 {
243 ensure(false);
244 }
245 GEOMETRYCORE_API void StoreAllFinalVertices(const TSet<int>& VertexIDs);
246
247
248protected:
250
252
262
263 template<typename AttribOverlayType, typename AttribChangeType>
265 {
266 if (ElementID < State.MaxElementID && State.ChangedElements[ElementID] == false && State.StartElements[ElementID] == true)
267 {
268 ChangeIn.SaveInitialElement(Overlay, ElementID);
269 State.ChangedElements[ElementID] = true;
270 }
271 }
272
273};
274
275
276
277
278
279
280
281
282
296{
297public:
300
305
307 GEOMETRYCORE_API void SaveTriangle(int32 TriangleID, bool bSaveVertices);
308
310 inline void SaveEdge(int32 EdgeID, bool bVertices);
311
313 template<typename EnumerableType>
314 void SaveTriangles(EnumerableType TriangleIDs, bool bSaveVertices);
315
317 template<typename EnumerableType>
319
321 inline void SaveVertexOneRingTriangles(int32 VertexID, bool bSaveVertices);
322
324 template<typename EnumerableType>
326
329
330protected:
331
332 //
333 // Currently EndChange() only stores vertices that are part of modified triangles.
334 // So calling SaveVertex() independently, on triangles that are not saved, will be lost.
335 // (This needs to be fixed)
336 //
337
339 GEOMETRYCORE_API void SaveVertex(int32 VertexID);
340
342 template<typename EnumerableType>
343 void SaveVertices(EnumerableType VertexIDs);
344
345
346protected:
347 const FDynamicMesh3* Mesh = nullptr;
348
351
354
356 TBitArray<> StartTriangles; // bit is 1 if triangle ID was in initial mesh on BeginChange()
357 TBitArray<> ChangedTriangles; // bit is set to 1 if triangle was in StartTriangles and then had SaveTriangle() called for it
358
360 TBitArray<> StartVertices; // bit is 1 if vertex ID was in initial mesh on BeginChange()
361 TBitArray<> ChangedVertices; // bit is set to 1 if vertex was in StartVertices and then had SaveVertex() called for it
362};
363
364
365
367{
368 const FDynamicMesh3::FEdge Edge = Mesh->GetEdge(EdgeID);
369 SaveTriangle(Edge.Tri[0], bVertices);
370 if (Edge.Tri[1] != FDynamicMesh3::InvalidID)
371 {
372 SaveTriangle(Edge.Tri[1], bVertices);
373 }
374}
375
376template<typename EnumerableType>
378{
379 for (int32 VertexID : VertexIDs)
380 {
381 SaveVertex(VertexID);
382 }
383}
384
385template<typename EnumerableType>
387{
388 for (int32 TriangleID : TriangleIDs)
389 {
390 SaveTriangle(TriangleID, bSaveVertices);
391 }
392}
393
394
395template<typename EnumerableType>
397{
398 for (int32 TriangleID : TriangleIDs)
399 {
400 SaveTriangle(TriangleID, bSaveVertices);
401
403 for (int32 j = 0; j < 3; ++j)
404 {
406 {
408 }
409 }
410 }
411}
412
413
415{
416 Mesh->EnumerateVertexTriangles(VertexID, [this, bSaveVertices](int32 TriangleID)
417 {
418 SaveTriangle(TriangleID, bSaveVertices);
419 });
420}
421
422template<typename EnumerableType>
424{
425 for (int32 VertexID : VertexIDs)
426 {
428 }
429}
430
431
432
433} // end namespace UE::Geometry
434} // end namespace UE
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition Array.h:670
Definition UniquePtr.h:107
Definition DynamicMesh3.h:108
GEOMETRYCORE_API FIndex3i GetTriNeighbourTris(int TriangleID) const
Definition DynamicMesh3.cpp:750
FEdge GetEdge(int EdgeID) const
Definition DynamicMesh3.h:848
GEOMETRYCORE_API void EnumerateVertexTriangles(int32 VertexID, TFunctionRef< void(int32)> ApplyFunc) const
Definition DynamicMesh3.cpp:769
static constexpr int InvalidID
Definition DynamicMesh3.h:158
Definition DynamicMeshChangeTracker.h:112
TArray< FDynamicMeshTriGroupChange > PolygroupChanges
Definition DynamicMeshChangeTracker.h:121
TArray< FDynamicMeshNormalChange > NormalChanges
Definition DynamicMeshChangeTracker.h:118
TOptional< FDynamicMeshTriGroupChange > MaterialIDAttribChange
Definition DynamicMeshChangeTracker.h:120
UE_NONCOPYABLE(FDynamicMeshAttributeChangeSet)
GEOMETRYCORE_API bool Apply(FDynamicMeshAttributeSet *Attributes, bool bRevert) const
Definition DynamicMeshChangeTracker.cpp:653
TArray< FDynamicMeshUVChange > UVChanges
Definition DynamicMeshChangeTracker.h:117
TArray< TUniquePtr< FDynamicMeshAttributeChangeBase > > RegisteredAttributeChanges
Definition DynamicMeshChangeTracker.h:124
TOptional< FDynamicMeshColorChange > ColorChange
Definition DynamicMeshChangeTracker.h:119
TArray< TUniquePtr< FDynamicMeshAttributeChangeBase > > WeightChanges
Definition DynamicMeshChangeTracker.h:123
Definition DynamicMeshChangeTracker.h:221
GEOMETRYCORE_API TUniquePtr< FDynamicMeshAttributeChangeSet > EndChange()
Definition DynamicMeshChangeTracker.cpp:440
GEOMETRYCORE_API void BeginChange()
Definition DynamicMeshChangeTracker.cpp:357
TArray< FElementState > NormalStates
Definition DynamicMeshChangeTracker.h:260
GEOMETRYCORE_API void StoreAllFinalTriangles(const TArray< int > &TriangleIDs)
Definition DynamicMeshChangeTracker.cpp:534
FElementState ColorState
Definition DynamicMeshChangeTracker.h:261
GEOMETRYCORE_API void SaveInitialVertex(int VertexID)
Definition DynamicMeshChangeTracker.cpp:518
const FDynamicMeshAttributeSet * Attribs
Definition DynamicMeshChangeTracker.h:249
FDynamicMeshAttributeChangeSet * Change
Definition DynamicMeshChangeTracker.h:251
void StoreAllFinalVertices(const TArray< int > &VertexIDs)
Definition DynamicMeshChangeTracker.h:241
GEOMETRYCORE_API void SaveInitialTriangle(int TriangleID)
Definition DynamicMeshChangeTracker.cpp:448
void SaveElement(int ElementID, FElementState &State, const AttribOverlayType *Overlay, AttribChangeType &ChangeIn)
Definition DynamicMeshChangeTracker.h:264
TArray< FElementState > UVStates
Definition DynamicMeshChangeTracker.h:259
Definition DynamicMeshAttributeSet.h:84
Definition DynamicMeshChangeTracker.h:296
FDynamicMeshChange * Change
Definition DynamicMeshChangeTracker.h:353
TBitArray StartVertices
Definition DynamicMeshChangeTracker.h:360
TBitArray StartTriangles
Definition DynamicMeshChangeTracker.h:356
GEOMETRYCORE_API ~FDynamicMeshChangeTracker()
Definition DynamicMeshChangeTracker.cpp:726
const FDynamicMesh3 * Mesh
Definition DynamicMeshChangeTracker.h:347
GEOMETRYCORE_API void SaveVertex(int32 VertexID)
Definition DynamicMeshChangeTracker.cpp:774
void SaveVertices(EnumerableType VertexIDs)
Definition DynamicMeshChangeTracker.h:377
int32 MaxTriangleID
Definition DynamicMeshChangeTracker.h:355
void SaveTrianglesAndNeighbourTris(EnumerableType TriangleIDs, bool bSaveVertices)
Definition DynamicMeshChangeTracker.h:396
void SaveTriangles(EnumerableType TriangleIDs, bool bSaveVertices)
Definition DynamicMeshChangeTracker.h:386
void SaveVertexOneRingTriangles(int32 VertexID, bool bSaveVertices)
Definition DynamicMeshChangeTracker.h:414
int32 MaxVertexID
Definition DynamicMeshChangeTracker.h:359
TBitArray ChangedTriangles
Definition DynamicMeshChangeTracker.h:357
GEOMETRYCORE_API void BeginChange()
Definition DynamicMeshChangeTracker.cpp:736
TBitArray ChangedVertices
Definition DynamicMeshChangeTracker.h:361
void SaveEdge(int32 EdgeID, bool bVertices)
Definition DynamicMeshChangeTracker.h:366
FDynamicMeshAttributeSetChangeTracker * AttribChangeTracker
Definition DynamicMeshChangeTracker.h:350
GEOMETRYCORE_API TUniquePtr< FDynamicMeshChange > EndChange()
Definition DynamicMeshChangeTracker.cpp:822
GEOMETRYCORE_API void VerifySaveState()
Definition DynamicMeshChangeTracker.cpp:863
GEOMETRYCORE_API void SaveTriangle(int32 TriangleID, bool bSaveVertices)
Definition DynamicMeshChangeTracker.cpp:794
Definition DynamicMeshChangeTracker.h:140
GEOMETRYCORE_API void ApplyReplaceChange(FDynamicMesh3 *Mesh, const TArray< FChangeTriangle > &RemoveTris, const TArray< FChangeVertex > &InsertVerts, const TArray< FChangeTriangle > &InsertTris) const
Definition DynamicMeshChangeTracker.cpp:242
GEOMETRYCORE_API void GetSavedTriangleList(TArray< int > &TrianglesOut, bool bInitial) const
Definition DynamicMeshChangeTracker.cpp:870
GEOMETRYCORE_API void SaveInitialTriangle(const FDynamicMesh3 *Mesh, int TriangleID)
Definition DynamicMeshChangeTracker.cpp:188
TArray< FChangeVertex > OldVertices
Definition DynamicMeshChangeTracker.h:194
GEOMETRYCORE_API bool Apply(FDynamicMesh3 *Mesh, bool bRevert) const
Definition DynamicMeshChangeTracker.cpp:218
TArray< FChangeTriangle > OldTriangles
Definition DynamicMeshChangeTracker.h:195
GEOMETRYCORE_API void VerifySaveState() const
Definition DynamicMeshChangeTracker.cpp:323
GEOMETRYCORE_API ~FDynamicMeshChange()
Definition DynamicMeshChangeTracker.cpp:175
TArray< FChangeVertex > NewVertices
Definition DynamicMeshChangeTracker.h:197
GEOMETRYCORE_API void GetAffectedVertices(TArray< int > &VerticesOut, bool bRevert) const
Definition DynamicMeshChangeTracker.cpp:881
GEOMETRYCORE_API bool HasSavedVertex(int VertexID)
Definition DynamicMeshChangeTracker.cpp:312
TUniquePtr< FDynamicMeshAttributeChangeSet > AttributeChanges
Definition DynamicMeshChangeTracker.h:200
TArray< FChangeTriangle > NewTriangles
Definition DynamicMeshChangeTracker.h:198
GEOMETRYCORE_API void StoreFinalTriangle(const FDynamicMesh3 *Mesh, int TriangleID)
Definition DynamicMeshChangeTracker.cpp:207
GEOMETRYCORE_API void StoreFinalVertex(const FDynamicMesh3 *Mesh, int VertexID)
Definition DynamicMeshChangeTracker.cpp:199
GEOMETRYCORE_API void SaveInitialVertex(const FDynamicMesh3 *Mesh, int VertexID)
Definition DynamicMeshChangeTracker.cpp:180
GEOMETRYCORE_API void CheckValidity(EValidityCheckFailMode FailMode=EValidityCheckFailMode::Check) const
Definition DynamicMeshChangeTracker.cpp:901
void AttachAttributeChanges(TUniquePtr< FDynamicMeshAttributeChangeSet > AttribChanges)
Definition DynamicMeshChangeTracker.h:155
Definition DynamicMeshTriangleAttribute.h:19
Definition DynamicMeshChangeTracker.h:57
GEOMETRYCORE_API void StoreFinalElement(const TDynamicMeshOverlay< RealType, ElementSize > *Overlay, int ElementID)
Definition DynamicMeshChangeTracker.cpp:41
TArray< RealType > NewElementData
Definition DynamicMeshChangeTracker.h:86
TArray< FChangeTriangle > NewTriangles
Definition DynamicMeshChangeTracker.h:87
GEOMETRYCORE_API bool Apply(TDynamicMeshOverlay< RealType, ElementSize > *Overlay, bool bRevert) const
Definition DynamicMeshChangeTracker.cpp:66
GEOMETRYCORE_API void SaveInitialTriangle(const TDynamicMeshOverlay< RealType, ElementSize > *Overlay, int TriangleID)
Definition DynamicMeshChangeTracker.cpp:32
GEOMETRYCORE_API void SaveInitialElement(const TDynamicMeshOverlay< RealType, ElementSize > *Overlay, int ElementID)
Definition DynamicMeshChangeTracker.cpp:16
TArray< RealType > OldElementData
Definition DynamicMeshChangeTracker.h:82
TArray< FChangeElement > OldElements
Definition DynamicMeshChangeTracker.h:81
TArray< FChangeTriangle > OldTriangles
Definition DynamicMeshChangeTracker.h:83
TArray< FChangeElement > NewElements
Definition DynamicMeshChangeTracker.h:85
GEOMETRYCORE_API void StoreFinalTriangle(const TDynamicMeshOverlay< RealType, ElementSize > *Overlay, int TriangleID)
Definition DynamicMeshChangeTracker.cpp:57
GEOMETRYCORE_API void ApplyReplaceChange(TDynamicMeshOverlay< RealType, ElementSize > *Overlay, const TArray< FChangeTriangle > &RemoveTris, const TArray< FChangeElement > &InsertElements, const TArray< RealType > &InsertElementData, const TArray< FChangeTriangle > &InsertTris) const
Definition DynamicMeshChangeTracker.cpp:82
Definition DynamicMeshOverlay.h:68
TDynamicMeshAttributeChange< float, 2 > FDynamicMeshUVChange
Definition DynamicMeshChangeTracker.h:97
TDynamicMeshAttributeChange< float, 1 > FDynamicMeshWeightChange
Definition DynamicMeshChangeTracker.h:106
TDynamicMeshAttributeChange< float, 4 > FDynamicMeshColorChange
Definition DynamicMeshChangeTracker.h:101
FDynamicMeshTriangleAttributeChange< int32, 1 > FDynamicMeshTriGroupChange
Definition DynamicMeshChangeTracker.h:103
TDynamicMeshAttributeChange< float, 3 > FDynamicMeshNormalChange
Definition DynamicMeshChangeTracker.h:99
EValidityCheckFailMode
Definition GeometryTypes.h:72
Definition AdvancedWidgetsModule.cpp:13
Definition Optional.h:131
Definition DynamicMesh3.h:129
int MaxElementID
Definition DynamicMeshChangeTracker.h:255
TBitArray ChangedElements
Definition DynamicMeshChangeTracker.h:257
TBitArray StartElements
Definition DynamicMeshChangeTracker.h:256
Definition DynamicMeshChangeTracker.h:187
FIndex3i Edges
Definition DynamicMeshChangeTracker.h:190
int TriangleID
Definition DynamicMeshChangeTracker.h:188
FIndex3i Vertices
Definition DynamicMeshChangeTracker.h:189
int GroupID
Definition DynamicMeshChangeTracker.h:191
Definition DynamicMeshChangeTracker.h:181
FVertexInfo Info
Definition DynamicMeshChangeTracker.h:183
int VertexID
Definition DynamicMeshChangeTracker.h:182
Definition IndexTypes.h:158
Definition InfoTypes.h:17
Definition DynamicMeshChangeTracker.h:69
int ParentVertexID
Definition DynamicMeshChangeTracker.h:72
int ElementID
Definition DynamicMeshChangeTracker.h:70
int DataIndex
Definition DynamicMeshChangeTracker.h:71
Definition DynamicMeshChangeTracker.h:76
FIndex3i Elements
Definition DynamicMeshChangeTracker.h:78
int TriangleID
Definition DynamicMeshChangeTracker.h:77