From 6ddf241ea4b407143f54b9f4f66e0a0fa9ce0e5d Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 3 Nov 2023 22:40:18 +0100 Subject: [PATCH] Minor improvements to reference properties --- Source/Engine/Content/Asset.cpp | 32 +++++++++++++++---- Source/Engine/Content/SoftAssetReference.h | 4 +-- .../Scripting/ScriptingObjectReference.h | 8 +++-- Source/Engine/Scripting/SoftObjectReference.h | 8 +++-- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/Source/Engine/Content/Asset.cpp b/Source/Engine/Content/Asset.cpp index 613c7c2c2..afe38f0a7 100644 --- a/Source/Engine/Content/Asset.cpp +++ b/Source/Engine/Content/Asset.cpp @@ -16,11 +16,13 @@ AssetReferenceBase::~AssetReferenceBase() { - if (_asset) + Asset* asset = _asset; + if (asset) { - _asset->OnLoaded.Unbind(this); - _asset->OnUnloaded.Unbind(this); - _asset->RemoveReference(); + _asset = nullptr; + asset->OnLoaded.Unbind(this); + asset->OnUnloaded.Unbind(this); + asset->RemoveReference(); } } @@ -70,8 +72,12 @@ void AssetReferenceBase::OnUnloaded(Asset* asset) WeakAssetReferenceBase::~WeakAssetReferenceBase() { - if (_asset) - _asset->OnUnloaded.Unbind(this); + Asset* asset = _asset; + if (asset) + { + _asset = nullptr; + asset->OnUnloaded.Unbind(this); + } } String WeakAssetReferenceBase::ToString() const @@ -101,6 +107,20 @@ void WeakAssetReferenceBase::OnUnloaded(Asset* asset) _asset = nullptr; } +SoftAssetReferenceBase::~SoftAssetReferenceBase() +{ + Asset* asset = _asset; + if (asset) + { + _asset = nullptr; + asset->OnUnloaded.Unbind(this); + asset->RemoveReference(); + } +#if !BUILD_RELEASE + _id = Guid::Empty; +#endif +} + String SoftAssetReferenceBase::ToString() const { return _asset ? _asset->ToString() : (_id.IsValid() ? _id.ToString() : TEXT("")); diff --git a/Source/Engine/Content/SoftAssetReference.h b/Source/Engine/Content/SoftAssetReference.h index fe1cde8c2..d237b5fd7 100644 --- a/Source/Engine/Content/SoftAssetReference.h +++ b/Source/Engine/Content/SoftAssetReference.h @@ -30,9 +30,7 @@ public: /// /// Finalizes an instance of the class. /// - ~SoftAssetReferenceBase() - { - } + ~SoftAssetReferenceBase(); public: /// diff --git a/Source/Engine/Scripting/ScriptingObjectReference.h b/Source/Engine/Scripting/ScriptingObjectReference.h index 0012c89ba..0945d6fc2 100644 --- a/Source/Engine/Scripting/ScriptingObjectReference.h +++ b/Source/Engine/Scripting/ScriptingObjectReference.h @@ -47,8 +47,12 @@ public: /// ~ScriptingObjectReferenceBase() { - if (_object) - _object->Deleted.Unbind(this); + ScriptingObject* obj = _object; + if (obj) + { + _object = nullptr; + obj->Deleted.Unbind(this); + } } public: diff --git a/Source/Engine/Scripting/SoftObjectReference.h b/Source/Engine/Scripting/SoftObjectReference.h index 3366dbbc7..174cf4188 100644 --- a/Source/Engine/Scripting/SoftObjectReference.h +++ b/Source/Engine/Scripting/SoftObjectReference.h @@ -38,8 +38,12 @@ public: /// ~SoftObjectReferenceBase() { - if (_object) - _object->Deleted.Unbind(this); + ScriptingObject* obj = _object; + if (obj) + { + _object = nullptr; + obj->Deleted.Unbind(this); + } } public: