#pragma once #include "RE/B/BSPointerHandle.h" #include "RE/B/BSSpinLock.h" #include "RE/B/BSTArray.h" #include "RE/B/BSTEvent.h" #include "RE/B/BSTSingleton.h" #include "RE/B/BSTSmartPointer.h" namespace RE { class AnimationDataCleanupEvent; class AnimationDataSetupEvent; class BGSSynchronizedAnimationInstance; class __declspec(novtable) BGSSynchronizedAnimationManager : public BSTEventSink, // 00 public BSTEventSink, // 08 public BSTSingletonSDM // 10 { public: static constexpr auto RTTI{ RTTI::BGSSynchronizedAnimationManager }; static constexpr auto VTABLE{ VTABLE::BGSSynchronizedAnimationManager }; virtual ~BGSSynchronizedAnimationManager(); // 00 // override virtual BSEventNotifyControl ProcessEvent(const AnimationDataSetupEvent&, BSTEventSource*) override; // 01 virtual BSEventNotifyControl ProcessEvent(const AnimationDataCleanupEvent&, BSTEventSource*) override; // 02 [[nodiscard]] static BGSSynchronizedAnimationManager* GetSingleton() { static REL::Relocation singleton{ ID::BGSSynchronizedAnimationManager::Singleton }; return *singleton; } [[nodiscard]] bool IsReferenceInSynchronizedScene(ObjectRefHandle a_ref) { using func_t = decltype(&BGSSynchronizedAnimationManager::IsReferenceInSynchronizedScene); static REL::Relocation func{ ID::BGSSynchronizedAnimationManager::IsReferenceInSynchronizedScene }; return func(this, a_ref); } // members BSTArray> currentSynchAnims; // 18 BSReadWriteLock synchAnimsLock; // 30 std::int32_t atomicSyncLock; // 38 BSSpinLock internalsLock; // 3C }; static_assert(sizeof(BGSSynchronizedAnimationManager) == 0x48); }