From 1180e1f4860d62bccd64bfa2a29eaeebd2c4b019 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 12 Sep 2024 22:36:34 +0200 Subject: m3d (#13) * Initial M3d Pass * `m_bmdl` and `m_bline` left --------- Co-authored-by: elijah-thomas774 Co-authored-by: Elijah Thomas <42302100+elijah-thomas774@users.noreply.github.com> --- include/d/a/e/d_a_e_hb_leaf.h | 59 +++++++++++++++++++++++++++++++++++++ include/d/a/e/d_a_en_base.h | 10 +++++++ include/d/a/en/d_a_en_base.h | 10 ------- include/d/a/obj/d_a_obj_base.h | 57 +++++++++++++++++++++++++++-------- include/d/a/obj/d_a_obj_lava_F200.h | 26 ++++++++++++++++ include/d/a/obj/d_a_obj_mole_soil.h | 39 ++++++++++++++++++++++++ include/d/a/obj/d_a_obj_ring.h | 38 ++++++++++++++++++++++++ include/d/a/obj/d_a_obj_smoke.h | 30 +++++++++++++++++++ include/d/a/obj/d_a_obj_sun_light.h | 31 +++++++++++++++++++ 9 files changed, 278 insertions(+), 22 deletions(-) create mode 100644 include/d/a/e/d_a_e_hb_leaf.h create mode 100644 include/d/a/e/d_a_en_base.h delete mode 100644 include/d/a/en/d_a_en_base.h create mode 100644 include/d/a/obj/d_a_obj_lava_F200.h create mode 100644 include/d/a/obj/d_a_obj_mole_soil.h create mode 100644 include/d/a/obj/d_a_obj_ring.h create mode 100644 include/d/a/obj/d_a_obj_smoke.h create mode 100644 include/d/a/obj/d_a_obj_sun_light.h (limited to 'include/d') diff --git a/include/d/a/e/d_a_e_hb_leaf.h b/include/d/a/e/d_a_e_hb_leaf.h new file mode 100644 index 00000000..5ac98cd0 --- /dev/null +++ b/include/d/a/e/d_a_e_hb_leaf.h @@ -0,0 +1,59 @@ +#ifndef D_A_E_HB_LEAF_H +#define D_A_E_HB_LEAF_H + +#include +#include +#include +#include + +extern "C" bool fn_800B9D80(f32, f32, f32 *, int, const mVec3_c &, u32); + +class dAcEhb_leaf_c : public dAcObjBase_c { +public: + dAcEhb_leaf_c() : someFloat(unkFloat0), field_0x3CC(0), field_0x3DE(0) {} + virtual ~dAcEhb_leaf_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + virtual int doDelete() override; + + void setAnm(const char *anm, f32 pos); + +private: + const static f32 unkFloat0; + const static f32 unkFloat1; + + m3d::mdlAnmChr mModel; // 0x330 + m3d::anmTexPat_c mAnm; // 0x398 + + f32 someFloat; // 0x3C4 + UNKWORD field_0x3C8; // 0x3C8 + u8 field_0x3CC; // 0x3CC + mVec3_c mStartingPos; // 0x3D0 + u16 someRot; // 0x3DC + u8 field_0x3DE; // 0x3DE + u8 mType; // 0x3DF + + bool isNearZero() { + return fabsf(someFloat) <= FLT_EPSILON; + } + + bool isHidden() { + return mType != 0 && isNearZero() ? true : false; + } + + void doCheck() { + fn_800B9D80(10.0f, 0.2f, &someFloat, roomid, mStartingPos, 0); + } + + int getParam1() { + return params & 7; + } + + int getParam2() { + return params >> 7 & 3; + } +}; + +#endif diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h new file mode 100644 index 00000000..a24957ba --- /dev/null +++ b/include/d/a/e/d_a_en_base.h @@ -0,0 +1,10 @@ +#ifndef D_A_EN_BASE_H +#define D_A_EN_BASE_H + +#include "d/a/obj/d_a_obj_base.h" + +// Ghidra: ActorEnemyBase +// size: +// non-official name +class dAcEnBase_c : public dAcObjBase_c {}; +#endif diff --git a/include/d/a/en/d_a_en_base.h b/include/d/a/en/d_a_en_base.h deleted file mode 100644 index a24957ba..00000000 --- a/include/d/a/en/d_a_en_base.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef D_A_EN_BASE_H -#define D_A_EN_BASE_H - -#include "d/a/obj/d_a_obj_base.h" - -// Ghidra: ActorEnemyBase -// size: -// non-official name -class dAcEnBase_c : public dAcObjBase_c {}; -#endif diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index d4a30b6a..02a1b24e 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -4,7 +4,25 @@ #include "d/a/d_a_base.h" #include "m/m_mtx.h" #include "m/types_m.h" +#include "nw4r/g3d/g3d_resfile.h" +// Size: 0xA8 +struct ActorCarryStruct { + /* 0x00 */ fLiNdBa_c actorLink; + /* 0x0C */ fLiNdBa_c *carriedActor; + /* 0x10 */ u32 carryFlags; + /* 0x14 */ int carryType; + /* 0x18 */ u16 field_0x18; + /* 0x1A */ u16 field_0x1A; + /* 0x1C */ mVec3_c field_0x1C; + /* 0x28 */ mMtx_c carryTransMtx; + /* 0x58 */ mMtx_c field_0x58; + /* 0x88 */ s32 isCarried; + /* 0x8C */ u8 field_0x8C[0x10]; // mQuat_c + /* 0x9C */ void *dtor; // ??? + /* 0xA0 */ u32 field_0xA0; + /* 0xA4 */ u32 field_0xA4; +}; // Ghidra: ActorObjectBase // size: 0x330 @@ -26,23 +44,29 @@ public: f32 forwardSpeed; f32 forwardAccel; f32 forwardMaxSpeed; - // TODO: add the rest - u8 unk1[0x15C - 0x150]; + mVec3_c velocity; /* 0x15C */ mMtx_c worldMatrix; - nw4r::math::AABB boundingBox; - u8 unk_0x1A4[0x330 - 0x1A4]; + u8 unk_0x1A4[0x1E8 - 0x1A4]; + + /* 0x1E8 */ mVec3_c posIncrements; + + u8 unk_0x1F4[0x210 - 0x1F4]; + + /* 0x210 */ ActorCarryStruct mActorCarryInfo; + + u8 unk_0x1EC[0x330 - 0x2B8]; public: // could be their own thing? - /* 8002de40 */ static void *getOarcFile(char *oarcName, char *fileName); - /* 8002de60 */ static void *getOarcSubEntry(char *oarcName, char *fileName); - /* 8002de80 */ static void *getOarcResFile(char *oarcName); - /* 8002de90 */ static void *getOarcModelFile(char *oarcName); - /* 8002dea0 */ static void *getOarcZev(char *oarcName); - /* 8002deb0 */ static void *getOarcDZB(char *dzbName); - /* 8002ded0 */ static void *getOarcPLC(char *plcName); + /* 8002de40 */ static void *getOarcFile(const char *oarcName, const char *fileName); + /* 8002de60 */ static void *getOarcSubEntry(const char *oarcName, const char *fileName); + /* 8002de80 */ static void *getOarcResFile(const char *oarcName); + /* 8002de90 */ static void *getOarcModelFile(const char *oarcName); + /* 8002dea0 */ static void *getOarcZev(const char *oarcName); + /* 8002deb0 */ static void *getOarcDZB(const char *dzbName); + /* 8002ded0 */ static void *getOarcPLC(const char *plcName); public: /* 8002def0 */ dAcObjBase_c(); @@ -74,7 +98,7 @@ public: /* 8002eb30 */ void fn_8002EB30(void *); /* 8002eb90 */ void putInODesert(f32 depth, mVec3_c *position); // Disabling makes Items and Link Disappear - /* 8002ec70 */ void drawModelType1(); + /* 8002ec70 */ void drawModelType1(m3d::smdl_c *smdl); // Disabling make Lava and other objects Disappear /* 8002ecd0 */ void drawModel2(); /* 8002ed20 */ void fn_8002ed20(); @@ -93,6 +117,15 @@ public: mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2); /* 8002f260 */ static dAcBase_c *createActorUnkGroup3(char *name, u32 roomId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2, u16 id, u8 viewclipId); + +protected: + inline void setBoundingBox(mVec3_c min, mVec3_c max) { + boundingBox.min = min; + boundingBox.max = max; + } }; +// Actors' createHeap functions often have patterns that can be matched with this macro +#define TRY_CREATE(thing) do { bool result = (thing); if (!result) return result; } while (0); + #endif diff --git a/include/d/a/obj/d_a_obj_lava_F200.h b/include/d/a/obj/d_a_obj_lava_F200.h new file mode 100644 index 00000000..8024801e --- /dev/null +++ b/include/d/a/obj/d_a_obj_lava_F200.h @@ -0,0 +1,26 @@ +#ifndef D_A_OBJ_LAVA_F200_H +#define D_A_OBJ_LAVA_F200_H + +#include +#include +#include +#include + +class dAcOlavaF200_c : public dAcObjBase_c { +public: + dAcOlavaF200_c() {} + virtual ~dAcOlavaF200_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + virtual int doDelete() override; + +private: + nw4r::g3d::ResFile mBrres; + m3d::smdl_c mModels[2]; + m3d::anmTexSrt_c mTexAnms[2]; + m3d::anmMatClr_c mClrAnms[2]; +}; + +#endif diff --git a/include/d/a/obj/d_a_obj_mole_soil.h b/include/d/a/obj/d_a_obj_mole_soil.h new file mode 100644 index 00000000..34342bf8 --- /dev/null +++ b/include/d/a/obj/d_a_obj_mole_soil.h @@ -0,0 +1,39 @@ +#ifndef D_A_OBJ_MOLE_SOIL_H +#define D_A_OBJ_MOLE_SOIL_H + +#include +#include +#include +#include + +class dAcOmoleSoil_c : public dAcObjBase_c { +public: + dAcOmoleSoil_c() : mStateMgr(*this, sStateID::null) {} + virtual ~dAcOmoleSoil_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + virtual int doDelete() override; + + STATE_FUNC_DECLARE(dAcOmoleSoil_c, Wait); + STATE_FUNC_DECLARE(dAcOmoleSoil_c, Appear); + STATE_FUNC_DECLARE(dAcOmoleSoil_c, DisAppear); + +private: + const static f32 sHalfScale; + const static f32 sFullScale; + + u8 getNextState() { + return mDesiredNextState; + } + + nw4r::g3d::ResFile mBrres; + m3d::smdl_c mModel; + STATE_MGR_DECLARE(dAcOmoleSoil_c); + f32 mScale; + u8 mDesiredNextState; + bool field_0x391; +}; + +#endif diff --git a/include/d/a/obj/d_a_obj_ring.h b/include/d/a/obj/d_a_obj_ring.h new file mode 100644 index 00000000..5b5b69e7 --- /dev/null +++ b/include/d/a/obj/d_a_obj_ring.h @@ -0,0 +1,38 @@ +#ifndef D_A_OBJ_RING_H +#define D_A_OBJ_RING_H + +#include +#include +#include +#include + +class dAcOring_c : public dAcObjBase_c { +public: + dAcOring_c() : mStateMgr(*this, sStateID::null) {} + virtual ~dAcOring_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + virtual int doDelete() override; + + STATE_FUNC_DECLARE(dAcOring_c, Move); + + u8 getArgFromParams() { + u32 p = (params & 3); + return p != 3 ? p : 0; + } + +private: + + static u32 ROT_PER_TICK; + + m3d::smdl_c mModel; + STATE_MGR_DECLARE(dAcOring_c); + u8 field_0x388; + f32 field_0x38C; + + +}; + +#endif diff --git a/include/d/a/obj/d_a_obj_smoke.h b/include/d/a/obj/d_a_obj_smoke.h new file mode 100644 index 00000000..dd1f404b --- /dev/null +++ b/include/d/a/obj/d_a_obj_smoke.h @@ -0,0 +1,30 @@ +#ifndef D_A_OBJ_SMOKE_H +#define D_A_OBJ_SMOKE_H + +#include +#include +#include +#include +#include + +class dAcOsmoke_c : public dAcObjBase_c { +public: + dAcOsmoke_c() : mStateMgr(*this, sStateID::null) {} + virtual ~dAcOsmoke_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + virtual int doDelete() override; + + STATE_FUNC_DECLARE(dAcOsmoke_c, Wait); + +private: + nw4r::g3d::ResFile mBrres; + m3d::smdl_c mModel; + m3d::anmTexSrt_c mTexAnm; + STATE_MGR_DECLARE(dAcOsmoke_c); + u8 mType; +}; + +#endif diff --git a/include/d/a/obj/d_a_obj_sun_light.h b/include/d/a/obj/d_a_obj_sun_light.h new file mode 100644 index 00000000..b3badc71 --- /dev/null +++ b/include/d/a/obj/d_a_obj_sun_light.h @@ -0,0 +1,31 @@ +#ifndef D_A_OBJ_SUN_LIGHT_H +#define D_A_OBJ_SUN_LIGHT_H + +#include +#include +#include +#include +#include + +class dAcOsunLight_c : public dAcObjBase_c { +public: + dAcOsunLight_c() : mStateMgr(*this, sStateID::null) {} + virtual ~dAcOsunLight_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + virtual int doDelete() override; + + bool isDay(); + + STATE_FUNC_DECLARE(dAcOsunLight_c, Wait); + +private: + nw4r::g3d::ResFile mBrres; + m3d::smdl_c mModel; + STATE_MGR_DECLARE(dAcOsunLight_c); + m3d::anmTexSrt_c mTexAnm; +}; + +#endif -- cgit v1.2.3