Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion include/RE/A/Actor.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ namespace RE
class BGSPerk;
class CombatController;
class CombatGroup;
class MovementControllerNPC;
class MovementMessageUpdateRequestImmediate;
class TESFaction;
class TESRace;
Expand Down Expand Up @@ -163,6 +164,7 @@ namespace RE
{
kNone = 0,
kHasChargenSkeleton = 1 << 5,
kAnimationDriven = 1 << 19,
};

~Actor() override; // 00
Expand Down Expand Up @@ -388,7 +390,7 @@ namespace RE
AIProcess* currentProcess; // 228
std::uint64_t unk230; // 230
std::uint64_t unk238; // 238
std::uint64_t unk240; // 240
MovementControllerNPC* movementController; // 240
std::uint64_t unk248; // 248
CombatController* combatController; // 250
std::uint64_t unk258; // 258
Expand Down
26 changes: 26 additions & 0 deletions include/RE/B/BGSAnimationPathImplementation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#pragma once

namespace RE
{
class TESObjectREFR;

class AnimationPathInterface
{
public:
SF_RTTI(AnimationPathInterface);

virtual ~AnimationPathInterface(); // 00
};
static_assert(sizeof(AnimationPathInterface) == 0x8);

class BGSAnimationPathImplementation :
public AnimationPathInterface // 00
{
public:
SF_RTTI_VTABLE(BGSAnimationPathImplementation);

// members
TESObjectREFR* reference; // 08
};
static_assert(offsetof(BGSAnimationPathImplementation, reference) == 0x08);
}
62 changes: 62 additions & 0 deletions include/RE/B/BGSModelNode.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#pragma once

#include "RE/B/BSModelNode.h"
#include "RE/B/BSTArray.h"
#include "RE/N/NiTransform.h"

namespace RE
{
class NiAVObject;

class BGSModelNode :
public BSModelNode // 00
{
public:
SF_RTTI_VTABLE(BGSModelNode);

struct Rig
{
struct Buffer
{
// members
void* unk00; // 00
void* unk08; // 08
NiTransform* data; // 10 - one slot per rig bone
};

// members
std::uint32_t refCount; // 00
std::uint32_t unk04; // 04
Buffer* local; // 08
Buffer* world; // 10
Buffer* prevWorld; // 18
void* unk20; // 20
std::uint16_t* parents; // 28
void* unk30; // 30
std::uint16_t* order; // 38
std::byte unk40[0x48]; // 40
bool rebuild; // 88
};
static_assert(offsetof(Rig, rebuild) == 0x88);

struct NodeEntry
{
// members
std::uint16_t rigIndex; // 00
std::uint16_t unk02; // 02
std::uint16_t unk04; // 04
std::uint16_t unk06; // 06
NiAVObject* node; // 08
};
static_assert(sizeof(NodeEntry) == 0x10);

~BGSModelNode() override; // 00

// members
Rig* rig; // 10
BSTArray<NodeEntry> nodes; // 18
std::byte unk28[0x68]; // 28
};
static_assert(offsetof(BGSModelNode, nodes) == 0x18);
static_assert(sizeof(BGSModelNode) == 0x90);
}
132 changes: 80 additions & 52 deletions include/RE/B/BSAnimationGraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,77 +7,105 @@

namespace RE
{
class BGSAnimationPathImplementation;
class BSAnimationGraphEvent;
class BSFadeNode;
struct BSMovementDataChangedEvent;
struct BSSubGraphActivationUpdate;
class BSTransformDeltaEvent;
class BSAnimationUpdateData;
class IPostAnimationChannelUpdateFunctor;
class NiTransform;

class BSAnimationGraph :
public BSIntrusiveRefCounted,
public BSTEventSource<BSAnimationGraphEvent>,
public BSTEventSource<BSMovementDataChangedEvent>,
public BSTEventSource<BSSubGraphActivationUpdate>,
public BSTEventSource<BSTransformDeltaEvent>
public BSTEventSource<BSAnimationGraphEvent>, // 00
public BSTEventSource<BSMovementDataChangedEvent>, // 28
public BSTEventSource<BSSubGraphActivationUpdate>, // 50
public BSTEventSource<BSTransformDeltaEvent>, // 78
public BSIntrusiveRefCounted // A0
{
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
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 GenerateOutputPose(BSAnimationUpdateData& a_updateData, void* a_eventListOut); // 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
};

static_assert(sizeof(BSAnimationGraph) == 0xA8);

class AnimationManager : public BSAnimationGraph
{
public:
virtual ~AnimationManager();

std::byte unkB0[0x3C0 - 0xB0]; // B0
// members
std::byte unkA8[0x218]; // A8
BGSAnimationPathImplementation* animationPath; // 2C0
std::uint64_t unk2C8; // 2C8
IPostAnimationChannelUpdateFunctor* postUpdateFunctor; // 2D0
float sampleQuantum; // 2D8
std::uint32_t unk2DC; // 2DC
std::uint32_t unk2E0; // 2E0
std::uint32_t unk2E4; // 2E4
std::uint32_t prevPoseCount; // 2E8
std::uint32_t unk2EC; // 2EC
NiTransform* prevPoseSnapshot; // 2F0
std::uint32_t currPoseCount; // 2F8
std::uint32_t unk2FC; // 2FC
NiTransform* currPoseSnapshot; // 300
std::byte unk308[0x28]; // 308
BSFadeNode* rootNode; // 330
std::byte unk338[0x4C]; // 338
float lastUpdateDelta; // 384
std::uint32_t unk388; // 388
std::uint32_t updateCount; // 38C
std::byte unk390[0x30]; // 390
};
// FIXME: compiler doesn't recognize vtable pointer as part of the size, but intellisense does.
static_assert(sizeof(AnimationManager) == 0x3C0 - 0x8);
static_assert(offsetof(AnimationManager, animationPath) == 0x2C0);
static_assert(offsetof(AnimationManager, rootNode) == 0x330);
static_assert(sizeof(AnimationManager) == 0x3C0);

class BSAnimationGraphManager :
public BSTEventSink<BSAnimationGraphEvent>,
Expand Down
40 changes: 40 additions & 0 deletions include/RE/B/BSAnimationUpdateData.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma once

#include "RE/N/NiPoint.h"

namespace RE
{
class BGSModelNode;
class IPostAnimationChannelUpdateFunctor;

class BSAnimationUpdateData
{
public:
// members
NiPoint3A location; // 00
NiPoint3A rotation; // 10
NiPoint3A unk20; // 20
NiPoint3A unk30; // 30
float unk40; // 40
float unk44; // 44
IPostAnimationChannelUpdateFunctor* postUpdateFunctor; // 48
BGSModelNode* modelNode; // 50
float unk58; // 58
float unk5C; // 5C
float timeDelta; // 60
std::uint16_t unk64; // 64
std::uint16_t unk66; // 66
std::uint16_t unk68; // 68
bool forceUpdate; // 6A
bool modelCulled; // 6B
bool unk6C; // 6C
bool unk6D; // 6D
bool unk6E; // 6E
bool unk6F; // 6F
float unk70; // 70
};
static_assert(offsetof(BSAnimationUpdateData, modelNode) == 0x50);
static_assert(offsetof(BSAnimationUpdateData, timeDelta) == 0x60);
static_assert(offsetof(BSAnimationUpdateData, modelCulled) == 0x6B);
static_assert(sizeof(BSAnimationUpdateData) == 0x80);
}
22 changes: 22 additions & 0 deletions include/RE/B/BSFadeNode.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include "RE/B/BGSModelNode.h"
#include "RE/N/NiNode.h"
#include "RE/N/NiSmartPointer.h"

namespace RE
{
class BSFadeNode :
public NiNode // 000
{
public:
SF_RTTI_VTABLE(BSFadeNode);

// members
std::byte unk160[0x20]; // 160
NiPointer<BGSModelNode> bgsModelNode; // 180
std::byte unk188[0x38]; // 188
};
static_assert(offsetof(BSFadeNode, bgsModelNode) == 0x180);
static_assert(sizeof(BSFadeNode) == 0x1C0);
}
24 changes: 24 additions & 0 deletions include/RE/B/BSModelNode.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once

#include "RE/B/BSIntrusiveRefCounted.h"

namespace RE
{
class NiNode;
class NiTransform;
class NiUpdateData;

class BSModelNode :
public BSIntrusiveRefCounted // 08
{
public:
SF_RTTI_VTABLE(BSModelNode);

virtual ~BSModelNode(); // 00

// add
virtual void* Refresh(NiNode* a_rootNode, NiUpdateData* a_updateData); // 01
virtual bool Update(void* a_data, NiUpdateData* a_updateData, NiTransform* a_transform); // 02
};
static_assert(sizeof(BSModelNode) == 0x10);
}
14 changes: 10 additions & 4 deletions include/RE/B/BSScriptUtil.h
Original file line number Diff line number Diff line change
Expand Up @@ -773,7 +773,7 @@ namespace RE::BSScript
[[nodiscard]] T UnpackVariable(const Variable& a_var)
{
if (!a_var.is<Array>()) {
assert(false);
assert(a_var.GetType().IsArray());
return T();
}

Expand All @@ -797,10 +797,16 @@ namespace RE::BSScript
{
if (a_var.is<std::nullptr_t>()) {
return T();
} else {
using value_type = typename T::value_type;
return T(detail::UnpackVariable<value_type>(a_var));
}

if constexpr (detail::array<typename T::value_type>) {
if (a_var.GetType().IsArray() && !a_var.is<Array>()) {
return T();
}
}

using value_type = typename T::value_type;
return T(detail::UnpackVariable<value_type>(a_var));
}

namespace detail
Expand Down
Loading
Loading