UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ExternalDirtyActorsTracker.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#if WITH_EDITOR
7#include "TickableEditorObject.h"
8#include "UObject/Package.h"
10#include "Editor.h"
11
12class ULevel;
13
17template <typename StoreType>
19{
20public:
22 using MapType = TMap<TWeakObjectPtr<AActor>, typename StoreType::Type>;
23
24 TExternalDirtyActorsTracker(const ULevel* InLevel, typename StoreType::OwnerType* InOwner)
25 : Level(InLevel)
26 , Owner(InOwner)
27 {
28 UPackage::PackageDirtyStateChangedEvent.AddRaw(this, &TExternalDirtyActorsTracker::OnPackageDirtyStateChanged);
29 FCoreUObjectDelegates::OnObjectsReplaced.AddRaw(this, &TExternalDirtyActorsTracker::OnObjectsReplaced);
30 FEditorDelegates::OnEditorActorReplaced.AddRaw(this, &TExternalDirtyActorsTracker::OnEditorActorReplaced);
31 }
32
34 {
36 FCoreUObjectDelegates::OnObjectsReplaced.RemoveAll(this);
37 FEditorDelegates::OnEditorActorReplaced.RemoveAll(this);
38 }
39
40 const MapType& GetDirtyActors() const { return DirtyActors; }
41
43 virtual bool OnAddDirtyActor(const TWeakObjectPtr<AActor> InActor) { return true; }
44 virtual void OnRemoveInvalidDirtyActor(const TWeakObjectPtr<AActor> InActor, typename StoreType::Type& InValue) {}
45 virtual void OnRemoveNonDirtyActor(const TWeakObjectPtr<AActor> InActor, typename StoreType::Type& InValue) {}
46
47protected:
49 {
50 if (AActor* Actor = AActor::FindActorInPackage(InPackage))
51 {
53 {
54 if (OuterLevel == Level)
55 {
56 if (InPackage->IsDirty())
57 {
59 {
60 DirtyActors.Add(Actor, StoreType::Store(Owner, Actor));
61 }
62 }
63 else
64 {
65 typename StoreType::Type Value;
66 if (DirtyActors.RemoveAndCopyValue(Actor, Value))
67 {
68 if (IsValid(Actor))
69 {
71 }
72 else
73 {
75 }
76 }
77 }
78 }
79 }
80 }
81 }
82
83 void OnObjectsReplaced(const TMap<UObject*, UObject*>& OldToNewObjectMap)
84 {
86 {
88 {
90 {
92 }
93 }
94 }
95 }
96
98 {
99 for (auto& [WeakActor, Value] : DirtyActors)
100 {
101 if (WeakActor.IsValid() && WeakActor.Get() == InOldActor)
102 {
103 WeakActor = InNewActor;
104 }
105 }
106 }
107
108 //~ Begin FTickableEditorObject interface
109 virtual TStatId GetStatId() const override
110 {
111 return TStatId();
112 }
113
114 virtual void Tick(float DeltaTime) override
115 {
116 for (typename MapType::TIterator DirtyActorIt(DirtyActors); DirtyActorIt; ++DirtyActorIt)
117 {
118 if (DirtyActorIt.Key().IsValid())
119 {
120 if (!DirtyActorIt.Key().Get()->GetPackage()->IsDirty())
121 {
123 DirtyActorIt.RemoveCurrent();
124 }
125 }
126 else if (!DirtyActorIt.Key().IsValid(true))
127 {
129 DirtyActorIt.RemoveCurrent();
130 }
131 }
132 }
133 //~ End FTickableEditorObject interface
134
135 const ULevel* Level;
136 typename StoreType::OwnerType* Owner;
137 MapType DirtyActors;
138};
139#endif
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition Actor.h:257
static ENGINE_API AActor * FindActorInPackage(UPackage *InPackage, bool bEvenIfPendingKill=true)
Definition Actor.cpp:1746
Definition UnrealString.h.inl:34
Definition Level.h:423
COREUOBJECT_API UObject * GetTypedOuter(UClass *Target) const
Definition UObjectBaseUtility.cpp:308
Definition Package.h:216
static COREUOBJECT_API FOnPackageDirtyStateChanged PackageDirtyStateChangedEvent
Definition Package.h:295
bool IsDirty() const
Definition Package.h:658
ECompressionLevel Level
Definition OodleDataCompression.cpp:70
Definition LightweightStats.h:416
Definition WeakObjectPtrTemplates.h:25