// Copyright Epic Games, Inc. All Rights Reserved. #include "Elements/SMInstance/SMInstanceElementDetailsInterface.h" #include "Elements/SMInstance/SMInstanceElementDetailsProxyObject.h" #include "Elements/SMInstance/SMInstanceElementData.h" #include "Elements/SMInstance/SMInstanceManager.h" #include "Components/InstancedStaticMeshComponent.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(SMInstanceElementDetailsInterface) class FSMInstanceTypedElementDetailsObject : public ITypedElementDetailsObject { public: explicit FSMInstanceTypedElementDetailsObject(const FSMInstanceElementId& InSMInstanceElementId, const ISMInstanceManager* InInstanceManager) { USMInstanceProxyEditingObject* InstanceProxyObjectPtr = nullptr; if (UClass* ProxyObjectClass = InInstanceManager->GetSMInstanceEditingProxyClass()) { InstanceProxyObjectPtr = NewObject((UObject*)GetTransientPackage(), ProxyObjectClass); } else { InstanceProxyObjectPtr = NewObject(); } InstanceProxyObjectPtr->Initialize(InSMInstanceElementId); InstanceProxyObject = InstanceProxyObjectPtr; } ~FSMInstanceTypedElementDetailsObject() { if (USMInstanceProxyEditingObject* InstanceProxyObjectPtr = InstanceProxyObject.Get()) { InstanceProxyObjectPtr->Shutdown(); } } virtual UObject* GetObject() override { return InstanceProxyObject.Get(); } virtual void AddReferencedObjects(FReferenceCollector& Collector) override { if (USMInstanceProxyEditingObject* InstanceProxyObjectPtr = InstanceProxyObject.Get()) { Collector.AddReferencedObject(InstanceProxyObject); InstanceProxyObject = InstanceProxyObjectPtr; } } private: TWeakObjectPtr InstanceProxyObject; }; TUniquePtr USMInstanceElementDetailsInterface::GetDetailsObject(const FTypedElementHandle& InElementHandle) { if (const FSMInstanceElementData* SMInstanceElement = InElementHandle.GetData()) { FSMInstanceManager InstanceManager = SMInstanceElementDataUtil::GetSMInstanceFromHandleChecked(InElementHandle); return MakeUnique(SMInstanceElement->InstanceElementId, InstanceManager.GetInstanceManager()); } return nullptr; }