From 4b449aea8c2d26b7b83608ade52c8b95f1df8853 Mon Sep 17 00:00:00 2001 From: DeweySalt <76853940+Deweh@users.noreply.github.com> Date: Thu, 1 Aug 2024 23:17:30 -0400 Subject: [PATCH 1/2] fix `BSAnimationGraphManager` add: `BSTSmallArray` stub add `AnimationManager` add `BSAnimationGraph` --- include/RE/B/BSAnimationGraph.h | 130 ++++++++++++++++++++ include/RE/I/IAnimationGraphManagerHolder.h | 7 +- include/RE/Starfield.h | 1 + 3 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 include/RE/B/BSAnimationGraph.h diff --git a/include/RE/B/BSAnimationGraph.h b/include/RE/B/BSAnimationGraph.h new file mode 100644 index 00000000..c96f94da --- /dev/null +++ b/include/RE/B/BSAnimationGraph.h @@ -0,0 +1,130 @@ +#pragma once + +#include "RE/B/BSIntrusiveRefCounted.h" +#include "RE/B/BSTEvent.h" +#include "RE/B/BSTSmartPointer.h" +#include "RE/B/BSLock.h" + +namespace RE +{ + class BSAnimationGraphEvent; + struct BSMovementDataChangedEvent; + struct BSSubGraphActivationUpdate; + class BSTransformDeltaEvent; + class BSAnimationUpdateData; + + class BSAnimationGraph : + public BSIntrusiveRefCounted, + public BSTEventSource, + public BSTEventSource, + public BSTEventSource, + public BSTEventSource + { + public: + virtual ~BSAnimationGraph(); + + virtual void Unk_01(); // 01 + virtual void Unk_02(); // 02 + virtual void Unk_03(); // 03 + virtual void Update(BSAnimationUpdateData& a_updateData); // 04 + virtual void Unk_05(); // 05 + virtual void Unk_06(); // 06 + virtual void Unk_07(); // 07 + virtual void Unk_08(); // 08 + virtual void Unk_09(); // 09 + virtual void Unk_0A(); // 0A + virtual void Unk_0B(); // 0B + virtual void Unk_0C(); // 0C + virtual void Unk_0D(); // 0D + virtual void Unk_0E(); // 0E + virtual void Unk_0F(); // 0F + virtual void Unk_10(); // 10 + virtual void Unk_11(); // 11 + virtual void Unk_12(); // 12 + virtual void Unk_13(); // 13 + virtual void Unk_14(); // 14 + virtual void Unk_15(); // 15 + virtual void Unk_16(); // 16 + virtual void Unk_17(); // 17 + virtual void Unk_18(); // 18 + virtual void Unk_19(); // 19 + virtual void Unk_1A(); // 1A + virtual void Unk_1B(); // 1B + virtual void Unk_1C(); // 1C + virtual void Unk_1D(); // 1D + virtual void Unk_1E(); // 1E + virtual void Unk_1F(); // 1F + virtual void Unk_20(); // 20 + virtual void Unk_21(); // 21 + virtual void Unk_22(); // 22 + virtual void Unk_23(); // 23 + virtual void Unk_24(); // 24 + virtual void Unk_25(); // 25 + virtual void Unk_26(); // 26 + virtual void Unk_27(); // 27 + virtual void Unk_28(); // 28 + virtual void Unk_29(); // 29 + virtual void Unk_2A(); // 2A + virtual void Unk_2B(); // 2B + virtual void Unk_2C(); // 2C + }; + + class AnimationManager : public BSAnimationGraph + { + public: + virtual ~AnimationManager(); + + std::byte unkB0[0x3C0 - 0xB0]; // B0 + }; + // FIXME: compiler doesn't recognize vtable pointer as part of the size, but intellisense does. + static_assert(sizeof(AnimationManager) == 0x3C0 - 0x8); + + class BSAnimationGraphManager : + public BSTEventSink, + public BSIntrusiveRefCounted + { + public: + // TODO: Properly implement BSTSmallArray + template + class SmallArray + { + public: + inline std::uint32_t size() { return _size; } + inline void* data() { return _local ? _stack : _heap; } + + inline T& operator[](std::uint32_t a_idx) + { + return static_cast(data())[a_idx]; + } + + std::uint32_t _size; + std::uint32_t _unk; + std::uint32_t _capacity: 31; + std::uint32_t _local: 1; + union + { + void* _heap; + std::byte _stack[sizeof(T) * N]; + }; + }; + + virtual ~BSAnimationGraphManager(); + + std::uint32_t unk0C; // 0C + std::uint32_t unk10; // 10 + std::uint32_t unk14; // 14 + std::uint32_t unk18; // 18 + std::uint32_t unk1C; // 1C + std::uint32_t unk20; // 20 + std::uint32_t unk24; // 24 + std::uint32_t unk28; // 28 + std::uint32_t unk2C; // 2C + SmallArray, 1> graphs; // 30 + std::uint32_t unk50[0x8]; // 50 + BSSpinLock updateLock; // 68 + BSSpinLock dependentManagerLock; // 70 + std::uint32_t activeGraph; // 78 + std::uint32_t generateDepth; // 7C + }; + static_assert(sizeof(BSAnimationGraphManager) == 0x80); +} diff --git a/include/RE/I/IAnimationGraphManagerHolder.h b/include/RE/I/IAnimationGraphManagerHolder.h index 596228e6..48d506d2 100644 --- a/include/RE/I/IAnimationGraphManagerHolder.h +++ b/include/RE/I/IAnimationGraphManagerHolder.h @@ -1,4 +1,5 @@ #pragma once +#include "RE/B/BSTSmartPointer.h" #include "RE/B/BSFixedString.h" #include "RE/B/BSTSmartPointer.h" @@ -17,11 +18,11 @@ namespace RE // add virtual bool NotifyAnimationGraphImpl(const BSFixedString& a_eventName); // 01 virtual void Unk_02(); // 02 - virtual void Unk_03(); // 03 + virtual bool GetAnimationGraphManagerImpl(BSTSmartPointer& a_animGraphMgr); // 03 virtual void Unk_04(); // 04 virtual void Unk_05(); // 05 virtual void Unk_06(); // 06 - virtual void Unk_07(); // 07 + virtual bool UnkFlag(); // 07 - [Actor/Player: checks that flag 128 is not set on *(this + 0x448)] [Ref: Always False] virtual void Unk_08(); // 08 virtual void Unk_09(); // 09 virtual void Unk_0A(); // 0A @@ -31,7 +32,7 @@ namespace RE virtual std::uint32_t GetGraphVariableCacheSize() const { return 0; } // 0E virtual void Unk_0F(); // 0F virtual void Unk_10(); // 10 - virtual void Unk_11(); // 11 + virtual bool ShouldUpdateAnimation(); // 11 virtual bool GetGraphVariableImplFloat(const BSFixedString& a_variable, float& a_out) const; // 12 virtual bool GetGraphVariableImplInt(const BSFixedString& a_variable, std::int32_t& a_out) const; // 13 virtual bool GetGraphVariableImplBool(const BSFixedString& a_variable, bool& a_out) const; // 14 diff --git a/include/RE/Starfield.h b/include/RE/Starfield.h index c9b79be5..56aba107 100644 --- a/include/RE/Starfield.h +++ b/include/RE/Starfield.h @@ -182,6 +182,7 @@ #include "RE/B/BGSWeatherSettingsForm.h" #include "RE/B/BGSWwiseEventForm.h" #include "RE/B/BGSWwiseKeywordMapping.h" +#include "RE/B/BSAnimationGraph.h" #include "RE/B/BSBlendable.h" #include "RE/B/BSColorCurve.h" #include "RE/B/BSContainer.h" From 4fd4c37054af3126bd3d1f4d3c3135a28f3e3e51 Mon Sep 17 00:00:00 2001 From: DeweySalt <76853940+Deweh@users.noreply.github.com> Date: Sat, 8 Feb 2025 14:59:14 -0500 Subject: [PATCH 2/2] reduce vcpkg baseline update to once-per-month --- .github/workflows/update_vcpkg_baselines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_vcpkg_baselines.yml b/.github/workflows/update_vcpkg_baselines.yml index 0bdf5b31..48a30cdd 100644 --- a/.github/workflows/update_vcpkg_baselines.yml +++ b/.github/workflows/update_vcpkg_baselines.yml @@ -2,7 +2,7 @@ name: Update vcpkg baselines on: schedule: - - cron: 0 */6 * * * + - cron: 0 0 1 * * repository_dispatch: types: [update-baselines-event] workflow_dispatch: