Enderal SE
https://mod.pub/enderal-se/38-enderal-se
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
359 lines
10 KiB
359 lines
10 KiB
#pragma once
|
|
|
|
#include "skse64/NiRTTI.h"
|
|
#include "skse64/NiTypes.h"
|
|
#include "skse64_common/Utilities.h"
|
|
#include "skse64/GameTypes.h"
|
|
|
|
// NiRefObject/NiObject and important children
|
|
// generally other children should go in other files
|
|
// especially if they can be grouped
|
|
|
|
class NiCloningProcess;
|
|
class NiStream;
|
|
class NiObjectGroup;
|
|
class NiExtraData;
|
|
class NiTimeController;
|
|
class NiNode;
|
|
class NiGeometry;
|
|
class BSGeometry;
|
|
class NiRenderedTexture;
|
|
class NiSwitchNode;
|
|
class NiTriBasedGeom;
|
|
class NiTriShape;
|
|
class NiTriStrips;
|
|
class BSSegmentedTriShape;
|
|
class NiRenderTargetGroup;
|
|
class NiProperty;
|
|
class NiSourceTexture;
|
|
class BSTriShape;
|
|
class TESObjectCELL;
|
|
class TESModelTri;
|
|
class BSFaceGenMorphData;
|
|
class TESObjectREFR;
|
|
|
|
extern RelocPtr<float> g_worldToCamMatrix;
|
|
extern RelocPtr<NiRect<float>> g_viewPort;
|
|
|
|
typedef bool (* _WorldPtToScreenPt3_Internal)(float * worldToCamMatrix, NiRect<float> * port, NiPoint3 * p_in, float * x_out, float * y_out, float * z_out, float zeroTolerance);
|
|
extern RelocAddr<_WorldPtToScreenPt3_Internal> WorldPtToScreenPt3_Internal;
|
|
|
|
typedef void * (*_NiAllocate)(size_t size);
|
|
extern RelocAddr<_NiAllocate> NiAllocate;
|
|
|
|
typedef void(*_NiFree)(void * ptr);
|
|
extern RelocAddr<_NiFree> NiFree;
|
|
|
|
// 10
|
|
class NiRefObject
|
|
{
|
|
public:
|
|
NiRefObject();
|
|
virtual ~NiRefObject();
|
|
|
|
virtual void DeleteThis(void); // calls virtual dtor
|
|
|
|
void IncRef(void);
|
|
void DecRef(void);
|
|
bool Release(void);
|
|
|
|
// void ** _vtbl; // 00
|
|
volatile SInt32 m_uiRefCount; // 08
|
|
UInt32 pad0C; // 0C
|
|
};
|
|
|
|
// ### not all of this is verified, I'm just assuming that little has changed from other
|
|
// ### games using previous versions of NetImmerse that have released .pdb files for reference
|
|
|
|
// 10
|
|
class NiObject : public NiRefObject
|
|
{
|
|
public:
|
|
// standard NetImmerse
|
|
virtual NiRTTI* GetRTTI(void);
|
|
|
|
// then a bunch of attempts to avoid dynamic_cast?
|
|
// unverified, do not use
|
|
virtual NiNode * GetAsNiNode(void);
|
|
virtual NiSwitchNode * GetAsNiSwitchNode(void);
|
|
virtual void * Unk_05(void);
|
|
virtual UInt32 Unk_06(void);
|
|
virtual BSGeometry * GetAsBSGeometry(void);
|
|
virtual void * Unk_08(void);
|
|
virtual BSTriShape * GetAsBSTriShape(void);
|
|
virtual void * Unk_0A(void);
|
|
virtual void * Unk_0B(void);
|
|
virtual void * Unk_0C(void);
|
|
virtual NiGeometry * GetAsNiGeometry(void);
|
|
virtual NiTriBasedGeom * GetAsNiTriBasedGeom(void);
|
|
virtual NiTriShape * GetAsNiTriShape(void);
|
|
virtual void * Unk_10(void);
|
|
virtual void * Unk_11(void);
|
|
virtual void * Unk_12(void);
|
|
|
|
// SE: these 4 were added
|
|
virtual UInt32 Unk_13(void);
|
|
virtual UInt32 Unk_14(void);
|
|
virtual UInt32 Unk_15(void);
|
|
virtual UInt32 Unk_16(void);
|
|
|
|
// then back to NetImmerse
|
|
virtual NiObject * CreateClone(NiCloningProcess cloner);
|
|
|
|
virtual void LoadBinary(NiStream * stream);
|
|
virtual void LinkObject(NiStream * stream);
|
|
virtual bool RegisterStreamables(NiStream * stream);
|
|
virtual void SaveBinary(NiStream * stream);
|
|
virtual bool IsEqual(NiObject * object);
|
|
|
|
// viewer appears to be disabled sadly
|
|
// why did you do that? it was really useful for figuring out class data
|
|
// and it's not like it totally bloated up the executa... er never mind
|
|
|
|
virtual void ProcessClone(NiCloningProcess * cloner);
|
|
virtual void PostLinkObject(NiStream * stream);
|
|
virtual bool StreamCanSkip(void);
|
|
virtual const /*NiRTTI*/void * GetStreamableRTTI(void) const;
|
|
virtual UInt32 GetBlockAllocationSize(void) const;
|
|
virtual NiObjectGroup * GetGroup(void) const;
|
|
virtual void SetGroup(NiObjectGroup * group);
|
|
|
|
// begin bethesda extensions? possibly just stuff we can't match up
|
|
virtual UInt32 Unk_20(void); // SE: function 24
|
|
|
|
|
|
MEMBER_FN_PREFIX(NiObject);
|
|
DEFINE_MEMBER_FN(DeepCopy, NiStream *, 0x00C7AEB0, NiObject ** result);
|
|
};
|
|
STATIC_ASSERT(sizeof(NiObject) == 0x10);
|
|
|
|
// 30
|
|
class NiObjectNET : public NiObject
|
|
{
|
|
public:
|
|
const char * m_name; // 10
|
|
|
|
NiTimeController * m_controller; // 18 next pointer at +0x30
|
|
|
|
NiExtraData ** m_extraData; // 20 extra data
|
|
UInt16 m_extraDataLen; // 28 max valid entry
|
|
UInt16 m_extraDataCapacity; // 2A array len
|
|
UInt32 pad2C;
|
|
|
|
// UNTESTED
|
|
void AddExtraData(NiExtraData * extraData);
|
|
bool RemoveExtraData(NiExtraData * extraData);
|
|
SInt32 GetIndexOf(NiExtraData * extraData);
|
|
NiExtraData * GetExtraData(BSFixedString name);
|
|
};
|
|
STATIC_ASSERT(sizeof(NiObjectNET) == 0x30);
|
|
|
|
// 110
|
|
class NiAVObject : public NiObjectNET
|
|
{
|
|
public:
|
|
enum
|
|
{
|
|
kFlag_SelectiveUpdate = 0x00000002,
|
|
kFlag_UpdatePropertyControllers = 0x00000004,
|
|
|
|
kFlag_SelectiveUpdateRigid = 0x00000010,
|
|
|
|
kFlag_OverrideSelectiveTransforms = 0x00000080,
|
|
};
|
|
|
|
struct ControllerUpdateContext
|
|
{
|
|
enum
|
|
{
|
|
kDirty = 1 << 0,
|
|
};
|
|
|
|
float delta;
|
|
UInt32 flags;
|
|
};
|
|
|
|
virtual void UpdateControllers(ControllerUpdateContext * ctx); // calls controller vtbl+0x8C
|
|
virtual void UpdateNodeBound(ControllerUpdateContext * ctx);
|
|
|
|
// SE: one of these 4 functions was deleted. Until figuring out which one, assuming it was Unk_26
|
|
virtual void ApplyTransform(NiMatrix33 * mtx, NiPoint3 * translate, bool postTransform);
|
|
virtual void SetPropertyState(NiProperty * prop);
|
|
virtual void Unk_25(UInt32 arg0); // SE: function 29
|
|
//virtual void Unk_26(UInt32 arg0);
|
|
|
|
|
|
virtual NiAVObject * GetObjectByName(const char ** name); // BSFixedString? alternatively BSFixedString is a typedef of a netimmerse type
|
|
virtual void SetSelectiveUpdateFlags(bool * selectiveUpdate, bool selectiveUpdateTransforms, bool * rigid);
|
|
virtual void UpdateDownwardPass(ControllerUpdateContext * ctx, void *unk1); // SE: changed unk to void*
|
|
virtual void UpdateSelectedDownwardPass(ControllerUpdateContext * ctx, void *unk1); // SE: changed unk to void*
|
|
virtual void UpdateRigidDownwardPass(ControllerUpdateContext * ctx, void *unk1); // SE: changed unk to void*
|
|
virtual void UpdateWorldBound(void);
|
|
virtual void UpdateWorldData(ControllerUpdateContext * ctx); // SE: function 30 (vtable+0x180)
|
|
virtual void UpdateNoControllers(ControllerUpdateContext * ctx);
|
|
virtual void UpdateDownwardPassTempParent(NiNode * parent, ControllerUpdateContext * ctx);
|
|
virtual void Unk_30(void); // calls virtual function on parent - SE: function 33
|
|
|
|
// SE: one of these functions was deleted. Doesn't matter which, they are unks, assuming Unk_32.
|
|
virtual void Unk_31(UInt32 arg0); // SE: function 34
|
|
//virtual void Unk_32(UInt32 arg0);
|
|
|
|
NiNode * m_parent; // 30
|
|
UInt32 unk038; // 38 - New in SE, init'd to FFFFFFFF
|
|
UInt32 pad03C; // 3C
|
|
NiAVObject * unk040; // 40
|
|
NiTransform m_localTransform; // 48
|
|
NiTransform m_worldTransform; // 7C
|
|
NiTransform m_oldWorldTransform; // B0 - SE: this one is new
|
|
float unkE4; // E4
|
|
float unkE8; // E8
|
|
float unkEC; // EC
|
|
float unkF0; // F0
|
|
UInt32 m_flags; // F4 - bitfield
|
|
TESObjectREFR* m_owner; // F8
|
|
float unk100; // 100 - New in SE? init's to 1.0
|
|
UInt32 unk104; // 104 - New in SE? init'd to 0
|
|
UInt8 unk108; // 108
|
|
UInt8 unk109; // 109 - bitfield
|
|
UInt8 pad10A[6]; // 10A
|
|
|
|
MEMBER_FN_PREFIX(NiAVObject);
|
|
// A5B2FC7D42E72BA4F6A679BAC0BAE17C12A4AFE1+E3
|
|
DEFINE_MEMBER_FN(UpdateNode, void, 0x00C7EDA0, ControllerUpdateContext * ctx);
|
|
};
|
|
STATIC_ASSERT(offsetof(NiAVObject, m_localTransform) == 0x48);
|
|
STATIC_ASSERT(offsetof(NiAVObject, m_worldTransform) == 0x7C);
|
|
STATIC_ASSERT(sizeof(NiAVObject) == 0x110);
|
|
|
|
|
|
MAKE_NI_POINTER(NiAVObject);
|
|
|
|
// SE: TODO this class needs update, if it still exists
|
|
// Bethesda class, unknown name
|
|
class BSRenderTargetGroup : public NiObject
|
|
{
|
|
public:
|
|
virtual ~BSRenderTargetGroup();
|
|
|
|
NiRenderTargetGroup * unk08[6]; // 08
|
|
UInt32 unk20; // 20
|
|
UInt32 unk24; // 24
|
|
UInt32 unk28; // 28
|
|
UInt32 unk2C; // 2C inited to FFFFFFFF
|
|
NiRenderedTexture * renderedTexture[4]; // 30
|
|
};
|
|
|
|
// 20
|
|
class BSFaceGenModel : public NiRefObject
|
|
{
|
|
public:
|
|
struct Data10
|
|
{
|
|
UInt32 unk00; // 00
|
|
UInt32 pad04; // 04
|
|
NiAVObject * unk08; // 08
|
|
NiAVObject * unk10; // 10
|
|
void * unk18; // 18
|
|
BSFaceGenMorphData * unk20; // 20
|
|
};
|
|
|
|
Data10 * unk10; // 10
|
|
UInt32 unk18; // 18
|
|
UInt32 pad1C; // 1C
|
|
|
|
MEMBER_FN_PREFIX(BSFaceGenModel);
|
|
DEFINE_MEMBER_FN(ctor, void, 0x003EC1A0);
|
|
DEFINE_MEMBER_FN(CopyFrom, void, 0x003EC240, BSFaceGenModel * other);
|
|
DEFINE_MEMBER_FN(SetModelData, bool, 0x003EC9C0, const char * meshPath, void * unk1, UInt8 unk2);
|
|
DEFINE_MEMBER_FN(ApplyMorph, UInt8, 0x003EC820, BSFixedString * morphName, TESModelTri * triModel, NiAVObject ** headNode, float relative, UInt8 unk1);
|
|
DEFINE_MEMBER_FN(ApplyRaceMorph, UInt8, 0x003EC6D0, BSFixedString* morphName, TESModelTri* triModel, NiAVObject** headNode, float relative, UInt8 unk1);
|
|
};
|
|
|
|
// 18
|
|
class BSFaceGenMorphData : public NiRefObject
|
|
{
|
|
public:
|
|
void * unk10; // 10
|
|
|
|
|
|
MEMBER_FN_PREFIX(BSFaceGenMorphData);
|
|
DEFINE_MEMBER_FN(ApplyMorph, UInt8, 0x003EF6C0, const char ** morphName, NiAVObject * faceTrishape, float relative, UInt8 unk2);
|
|
};
|
|
|
|
// 20
|
|
class BSFaceGenModelMap : public NiRefObject
|
|
{
|
|
public:
|
|
struct Entry
|
|
{
|
|
BSFaceGenModel * unk00; // 00
|
|
UInt64 unk08; // 08
|
|
};
|
|
|
|
Entry unk10; // 10
|
|
};
|
|
|
|
// A0
|
|
class LoadedAreaBound : public NiRefObject
|
|
{
|
|
public:
|
|
virtual ~LoadedAreaBound();
|
|
|
|
UInt64 unk10[6]; // 10
|
|
UInt64 unk40; // 40
|
|
TESObjectCELL * cell; // 48
|
|
UInt32 unk50;
|
|
UInt32 unk54;
|
|
UInt32 unk58;
|
|
UInt32 unk5C;
|
|
void* unk60; // 60 - inited 0xDEADBEEF
|
|
UInt64 unk68;
|
|
UInt64 unk70;
|
|
NiPoint3 boundsMax; // 78
|
|
NiPoint3 boundsMin; // 84
|
|
float unk90; // 90 - init'd from constructor arg (xmm1)
|
|
float unk94; // 94 - init'd from constructor arg (xmm2)
|
|
float unk98; // 98 - init'd from constructor arg (xmm3)
|
|
float unk9C; // 9C - init'd from constructor last arg (stack)
|
|
};
|
|
STATIC_ASSERT(sizeof(LoadedAreaBound) == 0xA0);
|
|
STATIC_ASSERT(offsetof(LoadedAreaBound, boundsMax) == 0x78);
|
|
|
|
// 68
|
|
class BSFaceGenMorphDataHead : public BSFaceGenMorphData
|
|
{
|
|
public:
|
|
|
|
UInt8 unk18[0x50 - 0x18]; // 18 - 18-4A -> init'd to FF
|
|
|
|
UInt64 unk50;
|
|
UInt64 unk58;
|
|
UInt32 unk60;
|
|
};
|
|
STATIC_ASSERT(sizeof(BSFaceGenMorphDataHead) == 0x68);
|
|
|
|
// 20
|
|
class BSFaceGenMorphDataHair : public BSFaceGenMorphData
|
|
{
|
|
public:
|
|
UInt32 unk18;
|
|
UInt32 pad;
|
|
};
|
|
STATIC_ASSERT(sizeof(BSFaceGenMorphDataHair) == 0x20);
|
|
|
|
// 188
|
|
class NiCamera : public NiAVObject
|
|
{
|
|
public:
|
|
float m_aafWorldToCam[4][4]; // 110
|
|
NiFrustum m_frustum; // 150
|
|
float m_fMinNearPlaneDist; // 16C
|
|
float m_fMaxFarNearRatio; // 170
|
|
NiRect<float> m_kPort; // 174
|
|
float m_fLODAdjust; // 184
|
|
|
|
bool WorldPtToScreenPt3(NiPoint3 * p_in, float * x_out, float * y_out, float * z_out, float zeroTolerance = 1e-5);
|
|
};
|
|
STATIC_ASSERT(offsetof(NiCamera, m_frustum) == 0x150);
|
|
STATIC_ASSERT(offsetof(NiCamera, m_fMinNearPlaneDist) == 0x16C);
|
|
STATIC_ASSERT(offsetof(NiCamera, m_fLODAdjust) == 0x184);
|
|
|