Skip to content
This repository was archived by the owner on Sep 16, 2025. It is now read-only.

Commit 6573535

Browse files
DewehThirdEyeSqueegee
authored andcommitted
fix BSAnimationGraphManager
add: `BSTSmallArray` stub add `AnimationManager` add `BSAnimationGraph`
1 parent 0e11018 commit 6573535

3 files changed

Lines changed: 135 additions & 3 deletions

File tree

include/RE/B/BSAnimationGraph.h

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
#pragma once
2+
3+
#include "RE/B/BSIntrusiveRefCounted.h"
4+
#include "RE/B/BSTEvent.h"
5+
#include "RE/B/BSTSmartPointer.h"
6+
#include "RE/B/BSLock.h"
7+
8+
namespace RE
9+
{
10+
class BSAnimationGraphEvent;
11+
struct BSMovementDataChangedEvent;
12+
struct BSSubGraphActivationUpdate;
13+
class BSTransformDeltaEvent;
14+
class BSAnimationUpdateData;
15+
16+
class BSAnimationGraph :
17+
public BSIntrusiveRefCounted,
18+
public BSTEventSource<BSAnimationGraphEvent>,
19+
public BSTEventSource<BSMovementDataChangedEvent>,
20+
public BSTEventSource<BSSubGraphActivationUpdate>,
21+
public BSTEventSource<BSTransformDeltaEvent>
22+
{
23+
public:
24+
virtual ~BSAnimationGraph();
25+
26+
virtual void Unk_01(); // 01
27+
virtual void Unk_02(); // 02
28+
virtual void Unk_03(); // 03
29+
virtual void Update(BSAnimationUpdateData& a_updateData); // 04
30+
virtual void Unk_05(); // 05
31+
virtual void Unk_06(); // 06
32+
virtual void Unk_07(); // 07
33+
virtual void Unk_08(); // 08
34+
virtual void Unk_09(); // 09
35+
virtual void Unk_0A(); // 0A
36+
virtual void Unk_0B(); // 0B
37+
virtual void Unk_0C(); // 0C
38+
virtual void Unk_0D(); // 0D
39+
virtual void Unk_0E(); // 0E
40+
virtual void Unk_0F(); // 0F
41+
virtual void Unk_10(); // 10
42+
virtual void Unk_11(); // 11
43+
virtual void Unk_12(); // 12
44+
virtual void Unk_13(); // 13
45+
virtual void Unk_14(); // 14
46+
virtual void Unk_15(); // 15
47+
virtual void Unk_16(); // 16
48+
virtual void Unk_17(); // 17
49+
virtual void Unk_18(); // 18
50+
virtual void Unk_19(); // 19
51+
virtual void Unk_1A(); // 1A
52+
virtual void Unk_1B(); // 1B
53+
virtual void Unk_1C(); // 1C
54+
virtual void Unk_1D(); // 1D
55+
virtual void Unk_1E(); // 1E
56+
virtual void Unk_1F(); // 1F
57+
virtual void Unk_20(); // 20
58+
virtual void Unk_21(); // 21
59+
virtual void Unk_22(); // 22
60+
virtual void Unk_23(); // 23
61+
virtual void Unk_24(); // 24
62+
virtual void Unk_25(); // 25
63+
virtual void Unk_26(); // 26
64+
virtual void Unk_27(); // 27
65+
virtual void Unk_28(); // 28
66+
virtual void Unk_29(); // 29
67+
virtual void Unk_2A(); // 2A
68+
virtual void Unk_2B(); // 2B
69+
virtual void Unk_2C(); // 2C
70+
};
71+
72+
class AnimationManager : public BSAnimationGraph
73+
{
74+
public:
75+
virtual ~AnimationManager();
76+
77+
std::byte unkB0[0x3C0 - 0xB0]; // B0
78+
};
79+
// FIXME: compiler doesn't recognize vtable pointer as part of the size, but intellisense does.
80+
static_assert(sizeof(AnimationManager) == 0x3C0 - 0x8);
81+
82+
class BSAnimationGraphManager :
83+
public BSTEventSink<BSAnimationGraphEvent>,
84+
public BSIntrusiveRefCounted
85+
{
86+
public:
87+
// TODO: Properly implement BSTSmallArray
88+
template <typename T, std::uint32_t N>
89+
class SmallArray
90+
{
91+
public:
92+
inline std::uint32_t size() { return _size; }
93+
inline void* data() { return _local ? _stack : _heap; }
94+
95+
inline T& operator[](std::uint32_t a_idx)
96+
{
97+
return static_cast<T*>(data())[a_idx];
98+
}
99+
100+
std::uint32_t _size;
101+
std::uint32_t _unk;
102+
std::uint32_t _capacity: 31;
103+
std::uint32_t _local: 1;
104+
union
105+
{
106+
void* _heap;
107+
std::byte _stack[sizeof(T) * N];
108+
};
109+
};
110+
111+
virtual ~BSAnimationGraphManager();
112+
113+
std::uint32_t unk0C; // 0C
114+
std::uint32_t unk10; // 10
115+
std::uint32_t unk14; // 14
116+
std::uint32_t unk18; // 18
117+
std::uint32_t unk1C; // 1C
118+
std::uint32_t unk20; // 20
119+
std::uint32_t unk24; // 24
120+
std::uint32_t unk28; // 28
121+
std::uint32_t unk2C; // 2C
122+
SmallArray<BSTSmartPointer<BSAnimationGraph>, 1> graphs; // 30
123+
std::uint32_t unk50[0x8]; // 50
124+
BSSpinLock updateLock; // 68
125+
BSSpinLock dependentManagerLock; // 70
126+
std::uint32_t activeGraph; // 78
127+
std::uint32_t generateDepth; // 7C
128+
};
129+
static_assert(sizeof(BSAnimationGraphManager) == 0x80);
130+
}

include/RE/I/IAnimationGraphManagerHolder.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
2+
#include "RE/B/BSTSmartPointer.h"
23

34
#include "RE/B/BSFixedString.h"
45
#include "RE/B/BSTSmartPointer.h"
@@ -17,11 +18,11 @@ namespace RE
1718
// add
1819
virtual bool NotifyAnimationGraphImpl(const BSFixedString& a_eventName); // 01
1920
virtual void Unk_02(); // 02
20-
virtual void Unk_03(); // 03
21+
virtual bool GetAnimationGraphManagerImpl(BSTSmartPointer<BSAnimationGraphManager>& a_animGraphMgr); // 03
2122
virtual void Unk_04(); // 04
2223
virtual void Unk_05(); // 05
2324
virtual void Unk_06(); // 06
24-
virtual void Unk_07(); // 07
25+
virtual bool UnkFlag(); // 07 - [Actor/Player: checks that flag 128 is not set on *(this + 0x448)] [Ref: Always False]
2526
virtual void Unk_08(); // 08
2627
virtual void Unk_09(); // 09
2728
virtual void Unk_0A(); // 0A
@@ -31,7 +32,7 @@ namespace RE
3132
virtual std::uint32_t GetGraphVariableCacheSize() const { return 0; } // 0E
3233
virtual void Unk_0F(); // 0F
3334
virtual void Unk_10(); // 10
34-
virtual void Unk_11(); // 11
35+
virtual bool ShouldUpdateAnimation(); // 11
3536
virtual bool GetGraphVariableImplFloat(const BSFixedString& a_variable, float& a_out) const; // 12
3637
virtual bool GetGraphVariableImplInt(const BSFixedString& a_variable, std::int32_t& a_out) const; // 13
3738
virtual bool GetGraphVariableImplBool(const BSFixedString& a_variable, bool& a_out) const; // 14

include/RE/Starfield.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@
182182
#include "RE/B/BGSWeatherSettingsForm.h"
183183
#include "RE/B/BGSWwiseEventForm.h"
184184
#include "RE/B/BGSWwiseKeywordMapping.h"
185+
#include "RE/B/BSAnimationGraph.h"
185186
#include "RE/B/BSBlendable.h"
186187
#include "RE/B/BSColorCurve.h"
187188
#include "RE/B/BSContainer.h"

0 commit comments

Comments
 (0)