summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/d/a/e/d_a_e_hb_leaf.h59
-rw-r--r--include/d/a/e/d_a_en_base.h (renamed from include/d/a/en/d_a_en_base.h)0
-rw-r--r--include/d/a/obj/d_a_obj_base.h57
-rw-r--r--include/d/a/obj/d_a_obj_lava_F200.h26
-rw-r--r--include/d/a/obj/d_a_obj_mole_soil.h39
-rw-r--r--include/d/a/obj/d_a_obj_ring.h38
-rw-r--r--include/d/a/obj/d_a_obj_smoke.h30
-rw-r--r--include/d/a/obj/d_a_obj_sun_light.h31
-rw-r--r--include/egg/core/eggFrmHeap.h2
-rw-r--r--include/egg/core/eggHeap.h4
-rw-r--r--include/egg/core/eggSystem.h3
-rw-r--r--include/egg/gfx/eggDrawGX.h37
-rw-r--r--include/egg/gfx/eggFog.h28
-rw-r--r--include/egg/gfx/eggFrustum.h24
-rw-r--r--include/egg/gfx/eggGfxEngine.h30
-rw-r--r--include/egg/gfx/eggLight.h53
-rw-r--r--include/egg/gfx/eggScreen.h27
-rw-r--r--include/egg/gfx/eggStateGX.h45
-rw-r--r--include/egg/gfx/eggTexture.h11
-rw-r--r--include/egg/math/eggVector.h1
-rw-r--r--include/egg/prim/eggBinary.h23
-rw-r--r--include/m/m3d/m3d.h59
-rw-r--r--include/m/m3d/m_anmchr.h24
-rw-r--r--include/m/m3d/m_anmchrblend.h28
-rw-r--r--include/m/m3d/m_anmmatclr.h57
-rw-r--r--include/m/m3d/m_anmmdl.h50
-rw-r--r--include/m/m3d/m_anmshp.h24
-rw-r--r--include/m/m3d/m_anmtexpat.h52
-rw-r--r--include/m/m3d/m_anmtexsrt.h56
-rw-r--r--include/m/m3d/m_anmvis.h22
-rw-r--r--include/m/m3d/m_banm.h38
-rw-r--r--include/m/m3d/m_bline.h85
-rw-r--r--include/m/m3d/m_bmdl.h48
-rw-r--r--include/m/m3d/m_calc_ratio.h49
-rw-r--r--include/m/m3d/m_fanm.h58
-rw-r--r--include/m/m3d/m_mdl.h76
-rw-r--r--include/m/m3d/m_proc.h21
-rw-r--r--include/m/m3d/m_scnleaf.h58
-rw-r--r--include/m/m3d/m_smdl.h25
-rw-r--r--include/m/m_allocator.h4
-rw-r--r--include/m/m_mtx.h9
-rw-r--r--include/m/m_video.h17
-rw-r--r--include/nw4r/g3d/g3d_3dsmax.h3
-rw-r--r--include/nw4r/g3d/g3d_anmcamera.h2
-rw-r--r--include/nw4r/g3d/g3d_anmchr.h78
-rw-r--r--include/nw4r/g3d/g3d_anmclr.h69
-rw-r--r--include/nw4r/g3d/g3d_anmobj.h6
-rw-r--r--include/nw4r/g3d/g3d_anmscn.h8
-rw-r--r--include/nw4r/g3d/g3d_anmshp.h99
-rw-r--r--include/nw4r/g3d/g3d_anmtexpat.h74
-rw-r--r--include/nw4r/g3d/g3d_anmtexsrt.h74
-rw-r--r--include/nw4r/g3d/g3d_anmvis.h4
-rw-r--r--include/nw4r/g3d/g3d_basic.h6
-rw-r--r--include/nw4r/g3d/g3d_calcview.h1
-rw-r--r--include/nw4r/g3d/g3d_calcworld.h30
-rw-r--r--include/nw4r/g3d/g3d_camera.h4
-rw-r--r--include/nw4r/g3d/g3d_dcc.h3
-rw-r--r--include/nw4r/g3d/g3d_draw.h2
-rw-r--r--include/nw4r/g3d/g3d_draw1mat1shp.h4
-rw-r--r--include/nw4r/g3d/g3d_fog.h6
-rw-r--r--include/nw4r/g3d/g3d_gpu.h4
-rw-r--r--include/nw4r/g3d/g3d_init.h6
-rw-r--r--include/nw4r/g3d/g3d_light.h3
-rw-r--r--include/nw4r/g3d/g3d_maya.h3
-rw-r--r--include/nw4r/g3d/g3d_obj.h6
-rw-r--r--include/nw4r/g3d/g3d_resanmcamera.h4
-rw-r--r--include/nw4r/g3d/g3d_resanmchr.h17
-rw-r--r--include/nw4r/g3d/g3d_resanmclr.h20
-rw-r--r--include/nw4r/g3d/g3d_resanmfog.h4
-rw-r--r--include/nw4r/g3d/g3d_resanmscn.h6
-rw-r--r--include/nw4r/g3d/g3d_resanmshp.h14
-rw-r--r--include/nw4r/g3d/g3d_resanmtexpat.h19
-rw-r--r--include/nw4r/g3d/g3d_resanmtexsrt.h21
-rw-r--r--include/nw4r/g3d/g3d_resanmvis.h14
-rw-r--r--include/nw4r/g3d/g3d_resdict.h30
-rw-r--r--include/nw4r/g3d/g3d_resfile.h9
-rw-r--r--include/nw4r/g3d/g3d_resmat.h144
-rw-r--r--include/nw4r/g3d/g3d_resmdl.h6
-rw-r--r--include/nw4r/g3d/g3d_resnode.h8
-rw-r--r--include/nw4r/g3d/g3d_resshp.h6
-rw-r--r--include/nw4r/g3d/g3d_restev.h6
-rw-r--r--include/nw4r/g3d/g3d_restex.h2
-rw-r--r--include/nw4r/g3d/g3d_resvtx.h4
-rw-r--r--include/nw4r/g3d/g3d_scnmdl.h17
-rw-r--r--include/nw4r/g3d/g3d_scnmdl1mat1shp.h6
-rw-r--r--include/nw4r/g3d/g3d_scnmdlsmpl.h37
-rw-r--r--include/nw4r/g3d/g3d_scnobj.h67
-rw-r--r--include/nw4r/g3d/g3d_scnproc.h2
-rw-r--r--include/nw4r/g3d/g3d_scnrfl.h2
-rw-r--r--include/nw4r/g3d/g3d_scnroot.h18
-rw-r--r--include/nw4r/g3d/g3d_state.h4
-rw-r--r--include/nw4r/g3d/g3d_xsi.h3
-rw-r--r--include/nw4r/snd/snd_Sound3DActor.h4
-rw-r--r--include/nw4r/snd/snd_Sound3DListener.h2
-rw-r--r--include/nw4r/snd/snd_Sound3DManager.h4
-rw-r--r--include/s/README.txt6
-rw-r--r--include/s/s_StateID.hpp4
-rw-r--r--include/s/s_StateInterfaces.hpp4
-rw-r--r--include/s/s_StateMgr.hpp5
-rw-r--r--include/toBeSorted/arc_managers/current_stage_arc_manager.h14
-rw-r--r--include/toBeSorted/scgame.h2
101 files changed, 2257 insertions, 201 deletions
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 <c/c_math.h>
+#include <d/a/obj/d_a_obj_base.h>
+#include <m/m3d/m_anmmdl.h>
+#include <m/m3d/m_anmtexpat.h>
+
+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/en/d_a_en_base.h b/include/d/a/e/d_a_en_base.h
index a24957ba..a24957ba 100644
--- a/include/d/a/en/d_a_en_base.h
+++ b/include/d/a/e/d_a_en_base.h
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 <d/a/obj/d_a_obj_base.h>
+#include <m/m3d/m_anmmatclr.h>
+#include <m/m3d/m_anmtexsrt.h>
+#include <m/m3d/m_smdl.h>
+
+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 <d/a/obj/d_a_obj_base.h>
+#include <m/m3d/m_smdl.h>
+#include <s/s_State.hpp>
+#include <s/s_StateMgr.hpp>
+
+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 <d/a/obj/d_a_obj_base.h>
+#include <m/m3d/m_smdl.h>
+#include <s/s_State.hpp>
+#include <s/s_StateMgr.hpp>
+
+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 <d/a/obj/d_a_obj_base.h>
+#include <m/m3d/m_anmtexsrt.h>
+#include <m/m3d/m_smdl.h>
+#include <s/s_State.hpp>
+#include <s/s_StateMgr.hpp>
+
+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 <d/a/obj/d_a_obj_base.h>
+#include <m/m3d/m_anmtexsrt.h>
+#include <m/m3d/m_smdl.h>
+#include <s/s_State.hpp>
+#include <s/s_StateMgr.hpp>
+
+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
diff --git a/include/egg/core/eggFrmHeap.h b/include/egg/core/eggFrmHeap.h
index f68e8e4f..10757d7c 100644
--- a/include/egg/core/eggFrmHeap.h
+++ b/include/egg/core/eggFrmHeap.h
@@ -22,7 +22,7 @@ public:
public:
/* 80495fa0 */ FrmHeap(MEMiHeapHead *heapHead);
/* 80496060 */ static FrmHeap *create(void *block, size_t size, u16 attr);
- /* 804962a0 */ void free(u32 flags);
+ /* 804962a0 */ void free(s32 flags);
/* 80496370 */ void recordState(u32 id); // non official for now
/* 80496380 */ void freeState(u32 id); // non official for now
};
diff --git a/include/egg/core/eggHeap.h b/include/egg/core/eggHeap.h
index 548db726..e0730703 100644
--- a/include/egg/core/eggHeap.h
+++ b/include/egg/core/eggHeap.h
@@ -162,9 +162,9 @@ public:
} // namespace EGG
/* 80495a60 */ void *operator new(size_t, void *p);
-/* 80495a70 */ void *operator new(size_t size, EGG::Heap *heap, int align);
+/* 80495a70 */ void *operator new(size_t size, EGG::Heap *heap, int align = 4);
/* 80495a80 */ void *operator new(size_t size, EGG::Allocator *alloc);
/* 80495a90 */ void *operator new[](size_t size, int align);
-/* 80495aa0 */ void *operator new[](size_t size, EGG::Heap *heap, int align);
+/* 80495aa0 */ void *operator new[](size_t size, EGG::Heap *heap, int align = 4);
#endif
diff --git a/include/egg/core/eggSystem.h b/include/egg/core/eggSystem.h
index e124b306..9fe8e9db 100644
--- a/include/egg/core/eggSystem.h
+++ b/include/egg/core/eggSystem.h
@@ -57,6 +57,9 @@ public:
}
};
+template <class TVideo, class TDisplay, class TXfbManager, class TAudioManager, class TSceneManager, class TPerfView>
+class TSystem : ConfigurationData {};
+
} // namespace EGG
#endif
diff --git a/include/egg/gfx/eggDrawGX.h b/include/egg/gfx/eggDrawGX.h
new file mode 100644
index 00000000..91ce5fc8
--- /dev/null
+++ b/include/egg/gfx/eggDrawGX.h
@@ -0,0 +1,37 @@
+#ifndef EGG_DRAWGX_H
+#define EGG_DRAWGX_H
+
+#include <common.h>
+#include <egg/core/eggHeap.h>
+#include <egg/gfx/eggTexture.h>
+#include <egg/math/eggMatrix.h>
+#include <rvl/GX.h>
+
+
+namespace EGG {
+
+class DrawGX {
+public:
+ static void Initialize(Heap *);
+
+ static GXTexMapID GetTexMapDefault();
+ static void LoadTexture(const EGG::ResTIMG *, GXTexMapID);
+
+ // TODO MORE
+
+ /* static ?? s_DL */
+
+ static Matrix34f s_cameraMtx;
+
+ /* static ?? s_flag */
+
+ static GXColor BLACK;
+ static GXColor WHITE;
+ static GXColor GREEN;
+ static GXColor RED;
+ static GXColor BLUE;
+};
+
+} // namespace EGG
+
+#endif
diff --git a/include/egg/gfx/eggFog.h b/include/egg/gfx/eggFog.h
new file mode 100644
index 00000000..d9318066
--- /dev/null
+++ b/include/egg/gfx/eggFog.h
@@ -0,0 +1,28 @@
+#ifndef EGG_FOG_H
+#define EGG_FOG_H
+
+#include <egg/prim/eggBinary.h>
+#include <nw4r/types_nw4r.h>
+
+namespace EGG {
+
+// TODO: Add members
+class FogManager : IBinary<FogManager> {
+public:
+ FogManager(u16);
+ virtual ~FogManager();
+ virtual void SetBinaryInner(Bin &) override;
+ virtual void GetBinaryInner(Bin *) const override;
+ virtual size_t GetBinarySize() override;
+ virtual void SetBinaryInner(const Bin &, const Bin &, f32) override;
+
+ void Calc();
+ void CopyToG3D(nw4r::g3d::ScnRoot *) const;
+
+ /* 0x04 */ u8 mFlag;
+ /* 0x05 */ u8 TODO[0x10 - 0x05];
+};
+
+} // namespace EGG
+
+#endif
diff --git a/include/egg/gfx/eggFrustum.h b/include/egg/gfx/eggFrustum.h
new file mode 100644
index 00000000..770dd328
--- /dev/null
+++ b/include/egg/gfx/eggFrustum.h
@@ -0,0 +1,24 @@
+#ifndef EGG_FRUSTUM_H
+#define EGG_FRUSTUM_H
+
+#include <common.h>
+#include <nw4r/g3d/g3d_camera.h>
+
+namespace EGG {
+
+// TODO: Fill out more
+class Frustum {
+public:
+ enum CanvasMode {};
+ enum ProjectionType {};
+
+ u8 TODO_0x00[0x38];
+ // vt at 0x38
+ virtual ~Frustum();
+ virtual void SetProjectionGX() const;
+ virtual void CopyToG3D(nw4r::g3d::Camera) const;
+};
+
+} // namespace EGG
+
+#endif
diff --git a/include/egg/gfx/eggGfxEngine.h b/include/egg/gfx/eggGfxEngine.h
new file mode 100644
index 00000000..8844587a
--- /dev/null
+++ b/include/egg/gfx/eggGfxEngine.h
@@ -0,0 +1,30 @@
+#ifndef EGG_GFXENGINE_H
+#define EGG_GFXENGINE_H
+
+#include <common.h>
+#include <rvl/GX.h>
+
+namespace EGG {
+
+namespace GfxEngine {
+
+struct Configuration {
+ /* 0x00 */ u16 efbWidth;
+ /* 0x02 */ u16 efbHeight;
+ /* 0x04 */ GXColor clearColor;
+ /* 0x08 */ u32 field_0x08;
+ /* 0x0C */ u16 field_0x0C;
+ /* 0x0E */ u16 field_0x0E;
+ /* 0x10 */ u32 bufferSize;
+ /* 0x14 */ u16 field_0x14;
+ /* 0x16 */ u16 field_0x16;
+ /* 0x18 */ u8 UNK_0x18[4];
+ Configuration();
+ virtual ~Configuration() {}
+};
+
+} // namespace GfxEngine
+
+} // namespace EGG
+
+#endif
diff --git a/include/egg/gfx/eggLight.h b/include/egg/gfx/eggLight.h
new file mode 100644
index 00000000..073705a7
--- /dev/null
+++ b/include/egg/gfx/eggLight.h
@@ -0,0 +1,53 @@
+#ifndef EGG_LIGHT_H
+#define EGG_LIGHT_H
+
+#include <egg/prim/eggBinary.h>
+#include <nw4r/types_nw4r.h>
+
+namespace EGG {
+
+// TODO: Fill out more
+class LightTexture {
+public:
+ static void initialize(u16 textureSize, Heap *pHeap);
+};
+
+// TODO: Fill out more
+class LightTextureManager : public IBinary<LightTextureManager> {
+public:
+ virtual ~LightTextureManager();
+ virtual void SetBinaryInner(Bin &) override;
+ virtual void GetBinaryInner(Bin *) const override;
+ virtual size_t GetBinarySize() override;
+ virtual void SetBinaryInner(const Bin &, const Bin &, f32) override;
+
+ void drawAndCaptureTexture(f32, f32, f32, f32);
+};
+
+// TODO: Fill out more
+class LightManager : public IBinary<LightManager> {
+public:
+ // vt at 0x00
+ LightManager(u32, u32, u8);
+ virtual ~LightManager();
+ virtual void SetBinaryInner(Bin &) override;
+ virtual void GetBinaryInner(Bin *) const override;
+ virtual size_t GetBinarySize() override;
+ virtual void SetBinaryInner(const Bin &, const Bin &, f32) override;
+ virtual void Reset();
+ virtual void Calc(nw4r::g3d::ScnRoot *);
+ virtual void CalcView(const nw4r::math::MTX34 &, u8, nw4r::g3d::ScnRoot *);
+ virtual void DoneDraw();
+
+ LightTextureManager *GetTextureMgr() const {
+ return mTextureMgr;
+ }
+
+ u8 TODO_0x04[0x14 - 0x04];
+ LightTextureManager *mTextureMgr;
+ u8 TODO_0x18[0x28 - 0x18];
+};
+
+} // namespace EGG
+
+#endif
diff --git a/include/egg/gfx/eggScreen.h b/include/egg/gfx/eggScreen.h
new file mode 100644
index 00000000..b1b1c422
--- /dev/null
+++ b/include/egg/gfx/eggScreen.h
@@ -0,0 +1,27 @@
+#ifndef EGG_SCREEN_H
+#define EGG_SCREEN_H
+
+#include <common.h>
+#include <egg/gfx/eggFrustum.h>
+
+namespace EGG {
+
+// TODO: Fill out more
+class Screen : public Frustum {
+public:
+ Screen();
+ Screen(f32, f32, f32, f32, Screen *, CanvasMode);
+
+ virtual ~Screen();
+ virtual void SetProjectionGX() const override;
+ virtual void CopyToG3D(nw4r::g3d::Camera) const override;
+
+ static void Initialize(const u16 *, const u16 *, Screen *);
+ static void SetTVModeDefault();
+
+ u8 TODO_0x3C[0x88 - 0x3C];
+};
+
+} // namespace EGG
+
+#endif
diff --git a/include/egg/gfx/eggStateGX.h b/include/egg/gfx/eggStateGX.h
new file mode 100644
index 00000000..5d2badb6
--- /dev/null
+++ b/include/egg/gfx/eggStateGX.h
@@ -0,0 +1,45 @@
+#ifndef EGG_STATE_GX_H
+#define EGG_STATE_GX_H
+
+#include <common.h>
+#include <rvl/GX.h>
+
+namespace EGG {
+
+class StateGX {
+public:
+ static void initialize(u16, u16, GXColor, GXPixelFmt);
+ static void frameInit();
+ static void textureInit(); // Guess for 804b4810
+
+ static void resetGX();
+ static void resetVtx();
+ static void resetColorChannel();
+ static void resetIndirect();
+ static void resetTexture();
+ static void resetTexGen();
+ static void resetTev();
+ static void resetPE();
+
+ static void resetGXCache();
+
+ static void GXSetPixelFmt(GXPixelFmt pixelFmt, GXZFmt16 zFmt);
+
+ static void invalidateTexAllGX();
+
+ static bool GXSetColorUpdate(bool);
+ static bool GXSetAlphaUpdate(bool);
+ static bool GXSetDither();
+ static void GXCopyTex();
+ static bool GXSetDstAlpha();
+ // Unk func here
+ static void GXSetProjection(Mtx44, int);
+ static void GXSetProjectionv(const f32 *);
+ static void GXSetViewport(f32, f32, f32, f32, f32, f32);
+ static void GZSetScissor(u32, u32, u32, u32);
+ static void GZSetScissorBoxOffset(s32, s32);
+};
+
+} // namespace EGG
+
+#endif
diff --git a/include/egg/gfx/eggTexture.h b/include/egg/gfx/eggTexture.h
new file mode 100644
index 00000000..dcf0e926
--- /dev/null
+++ b/include/egg/gfx/eggTexture.h
@@ -0,0 +1,11 @@
+#ifndef EGG_TEXTURE_H
+#define EGG_TEXTURE_H
+
+namespace EGG {
+
+// TODO: Implement Members
+struct ResTIMG {};
+
+} // namespace EGG
+
+#endif
diff --git a/include/egg/math/eggVector.h b/include/egg/math/eggVector.h
index 9aa50ae8..43d340dd 100644
--- a/include/egg/math/eggVector.h
+++ b/include/egg/math/eggVector.h
@@ -127,6 +127,7 @@ struct Vector3s {
s16 x, y, z;
public:
+ Vector3s() {}
Vector3s(s16 sx, s16 sy, s16 sz) {
x = sx;
y = sy;
diff --git a/include/egg/prim/eggBinary.h b/include/egg/prim/eggBinary.h
new file mode 100644
index 00000000..6f127955
--- /dev/null
+++ b/include/egg/prim/eggBinary.h
@@ -0,0 +1,23 @@
+#ifndef EGG_BINARY_H
+#define EGG_BINARY_H
+
+template <class T>
+class IBinary {
+public:
+ class Bin {};
+ virtual void SetBinaryInner(Bin &) = 0;
+ virtual void GetBinaryInner(Bin *) const = 0;
+ virtual size_t GetBinarySize() = 0;
+ virtual void SetBinaryInner(const Bin &, const Bin &, f32) = 0;
+
+ static const char *GetBinaryType();
+ int GetVersion();
+
+ void GetBinary(void *) const;
+
+ void SetBinary(const void *);
+
+ void SetBinaryBlend(const void *, const void *, f32);
+};
+
+#endif
diff --git a/include/m/m3d/m3d.h b/include/m/m3d/m3d.h
new file mode 100644
index 00000000..d8ba87fc
--- /dev/null
+++ b/include/m/m3d/m3d.h
@@ -0,0 +1,59 @@
+#ifndef M3D_H
+#define M3D_H
+
+#include <egg/core/eggHeap.h>
+#include <egg/gfx/eggFog.h>
+#include <egg/gfx/eggLight.h>
+#include <m/m_allocator.h>
+#include <nw4r/g3d/g3d_scnroot.h>
+
+namespace m3d {
+
+namespace internal {
+
+extern mAllocator_c *l_allocator_p;
+extern nw4r::g3d::ScnRoot *l_scnRoot_p;
+extern u32 l_numLightMgr;
+extern EGG::LightManager **l_lightMgr_pp;
+extern u32 l_numFogMgr;
+extern EGG::FogManager **l_fogMgr_pp;
+extern size_t l_alignment;
+
+} // namespace internal
+
+bool create(EGG::Heap *pHeap, u32 maxNumChildren, u32 maxNumScnObj, u32 numLightObj, u32 numLightSet);
+bool create(EGG::Heap *pHeap, GXPixelFmt pxlFmt, GXColor clearColor, u32 maxNumChildren, u32 maxNumScnObj,
+ u32 numLightObj, u32 numLightSet, u32 numLightMgr, u32 numFogMgr);
+bool createLightMgr(EGG::Heap *, u16, u16, u8, bool, int);
+bool createFogMgr(EGG::Heap *, int, int);
+
+nw4r::g3d::ScnRoot *getScnRoot();
+nw4r::g3d::Camera getCamera(int id);
+nw4r::g3d::Camera getCurrentCamera();
+int getCurrentCameraID();
+
+EGG::LightManager *getLightMgr(int idx);
+EGG::FogManager *getFogMgr(int idx);
+void drawDone(int idx);
+void drawLightMapTexture(int idx);
+
+void calcWorld(int idx);
+void calcMaterial();
+void calcView(int idx);
+
+void drawOpa();
+void drawXlu();
+
+bool pushBack(nw4r::g3d::ScnObj *obj);
+void clear();
+
+void reset();
+
+int getMatID(nw4r::g3d::ResMdl, const char *);
+int getNodeID(nw4r::g3d::ResMdl, const char *);
+
+void resetMaterial();
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_anmchr.h b/include/m/m3d/m_anmchr.h
new file mode 100644
index 00000000..082cf504
--- /dev/null
+++ b/include/m/m3d/m_anmchr.h
@@ -0,0 +1,24 @@
+#ifndef M3D_M_ANMCHR_H
+#define M3D_M_ANMCHR_H
+
+#include <m/m3d/m_bmdl.h>
+#include <m/m3d/m_fanm.h>
+#include <nw4r/g3d/g3d_resanmchr.h>
+
+namespace m3d {
+
+class anmChr_c : public fanm_c {
+public:
+ virtual ~anmChr_c();
+
+ virtual int getType() const override;
+
+ bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmChr, mAllocator_c *, u32 *);
+ void setAnm(bmdl_c &, nw4r::g3d::ResAnmChr, playMode_e);
+ void setAnmAfter(bmdl_c &, nw4r::g3d::ResAnmChr, playMode_e);
+ void setFrmCtrlDefault(nw4r::g3d::ResAnmChr &, m3d::playMode_e);
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_anmchrblend.h b/include/m/m3d/m_anmchrblend.h
new file mode 100644
index 00000000..e8d038d3
--- /dev/null
+++ b/include/m/m3d/m_anmchrblend.h
@@ -0,0 +1,28 @@
+#ifndef M3D_M_ANMCHRBLEND_H
+#define M3D_M_ANMCHRBLEND_H
+
+#include <m/m3d/m_anmchr.h>
+#include <m/m3d/m_banm.h>
+#include <m/m3d/m_bmdl.h>
+#include <nw4r/g3d/g3d_anmchr.h>
+
+namespace m3d {
+
+class anmChrBlend_c : public banm_c {
+public:
+ virtual ~anmChrBlend_c();
+
+ virtual int getType() const override;
+
+ bool create(nw4r::g3d::ResMdl, int, mAllocator_c *, u32 *);
+ void attach(int, nw4r::g3d::AnmObjChrRes *, f32);
+ void attach(int, anmChr_c *, f32);
+ void detach(int);
+ // Not in NSMBW
+ void setWeight(int, f32);
+ f32 getWeight(int) const;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_anmmatclr.h b/include/m/m3d/m_anmmatclr.h
new file mode 100644
index 00000000..1a2db51c
--- /dev/null
+++ b/include/m/m3d/m_anmmatclr.h
@@ -0,0 +1,57 @@
+#ifndef M3D_M_ANMMATCLR_H
+#define M3D_M_ANMMATCLR_H
+
+#include <m/m3d/m_bmdl.h>
+#include <m/m3d/m_fanm.h>
+#include <nw4r/g3d/g3d_anmclr.h>
+
+namespace m3d {
+
+class anmMatClr_c : public banm_c {
+ class child_c : public fanm_c {
+ public:
+ child_c() {}
+ virtual ~child_c();
+ virtual int getType() const override;
+
+ static u32 heapCost(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmClr, bool);
+ bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmClr, mAllocator_c *, u32 *);
+ void setAnm(bmdl_c &, nw4r::g3d::ResAnmClr, playMode_e);
+ void releaseAnm();
+ void setFrmCtrlDefault(nw4r::g3d::ResAnmClr &, playMode_e);
+ };
+
+public:
+ anmMatClr_c() : mpChildren(nullptr) {}
+ virtual ~anmMatClr_c();
+
+ virtual int getType() const override;
+ virtual void remove() override;
+ virtual void play() override;
+
+ bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmClr, mAllocator_c *, u32 *, s32);
+ static u32 heapCost(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmClr, s32, bool);
+
+ void setAnm(bmdl_c &, nw4r::g3d::ResAnmClr, s32, playMode_e);
+
+ void play(s32);
+ f32 getFrame(s32) const;
+ void setFrame(f32, s32);
+ f32 getRate(s32) const;
+ void setRate(f32, s32);
+ bool isStop(s32) const;
+
+ bool checkFrame(f32, s32) const;
+
+ void setPlayMode(playMode_e, s32);
+ f32 getFrameMax(s32) const;
+ void setFrameStart(f32, s32);
+ f32 getFrameStart(s32) const;
+
+private:
+ child_c *mpChildren;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_anmmdl.h b/include/m/m3d/m_anmmdl.h
new file mode 100644
index 00000000..1673b421
--- /dev/null
+++ b/include/m/m3d/m_anmmdl.h
@@ -0,0 +1,50 @@
+#ifndef M3D_M_ANMMDL_H
+#define M3D_M_ANMMDL_H
+
+#include <m/m3d/m_anmchr.h>
+#include <m/m3d/m_mdl.h>
+#include <nw4r/g3d/g3d_resfile.h>
+
+namespace m3d {
+
+// Not in NSMBW, name pulled from City Folk
+class mdlAnmChr {
+public:
+ mdlAnmChr() {}
+ virtual ~mdlAnmChr(); // 0x08
+
+ virtual void play(); // 0x0C
+ virtual void setFrame(f32); // 0x10
+ virtual void setAnm(const char *name, playMode_e mode, f32); // 0x14
+ virtual void setAnm(const char *name, playMode_e mode); // 0x18
+ virtual void setRate(f32); // 0x20
+
+ bool create(void *mdlFile, void *anmFile, const char *mdlName, const char *anmName, mAllocator_c *alloc,
+ u32 bufferOption, int nView, u32 *pSize);
+ // Unknown overload
+ bool create2(void *mdlFile, void *anmFile, const char *mdlName, const char *anmName, mAllocator_c *alloc,
+ u32 bufferOption, int nView, u32 *pSize);
+ bool create(void *resFile, const char *mdlName, const char *anmName, mAllocator_c *alloc, u32 bufferOption,
+ int nView, u32 *pSize);
+ bool create(void *mdlFile, void *anmFile, const char *mdlName, const char *anmName, mdl_c::mdlCallback_c *callback,
+ mAllocator_c *alloc, u32 bufferOption, int nView, u32 *pSize);
+
+ inline bool create(void *resFile, const char *mdlName, const char *anmName, mAllocator_c *alloc, u32 bufferOption) {
+ return create(resFile, mdlName, anmName, alloc, bufferOption, 1, nullptr);
+ }
+
+ inline mdl_c &getModel() {
+ return mMdl;
+ }
+
+private:
+ nw4r::g3d::ResFile mMdlFile;
+ nw4r::g3d::ResFile mAnmFile;
+
+ mdl_c mMdl;
+ anmChr_c mAnm;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_anmshp.h b/include/m/m3d/m_anmshp.h
new file mode 100644
index 00000000..2e550802
--- /dev/null
+++ b/include/m/m3d/m_anmshp.h
@@ -0,0 +1,24 @@
+#ifndef M_M3D_ANMSHP_H
+#define M_M3D_ANMSHP_H
+
+#include <common.h>
+#include <m/m3d/m_bmdl.h>
+#include <m/m3d/m_fanm.h>
+#include <nw4r/g3d/g3d_resanmshp.h>
+
+namespace m3d {
+
+class anmShp_c : public fanm_c {
+public:
+ virtual ~anmShp_c();
+
+ virtual int getType() const override;
+
+ bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmShp, mAllocator_c *, u32 *);
+ void setAnm(m3d::bmdl_c &, nw4r::g3d::ResAnmShp, m3d::playMode_e);
+ void setFrmCtrlDefault(nw4r::g3d::ResAnmShp &, m3d::playMode_e);
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_anmtexpat.h b/include/m/m3d/m_anmtexpat.h
new file mode 100644
index 00000000..1fc5b1d0
--- /dev/null
+++ b/include/m/m3d/m_anmtexpat.h
@@ -0,0 +1,52 @@
+#ifndef M3D_M_ANMTEXPAT_H
+#define M3D_M_ANMTEXPAT_H
+
+#include <m/m3d/m_bmdl.h>
+#include <m/m3d/m_fanm.h>
+#include <nw4r/g3d/g3d_anmtexpat.h>
+
+namespace m3d {
+
+class anmTexPat_c : public banm_c {
+ class child_c : public fanm_c {
+ public:
+ child_c() {}
+ virtual ~child_c();
+ virtual int getType() const override;
+
+ static u32 heapCost(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmTexPat, bool);
+ bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmTexPat, mAllocator_c *, u32 *);
+ void setAnm(m3d::bmdl_c &, nw4r::g3d::ResAnmTexPat, m3d::playMode_e);
+ void releaseAnm();
+ void setFrmCtrlDefault(nw4r::g3d::ResAnmTexPat &, playMode_e);
+ };
+
+public:
+ anmTexPat_c() : mpChildren(nullptr) {}
+ virtual ~anmTexPat_c();
+
+ virtual int getType() const override;
+ virtual void remove() override;
+ virtual void play() override;
+
+ bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmTexPat, mAllocator_c *, u32 *, s32);
+ static u32 heapCost(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmTexPat, s32, bool);
+
+ void setAnm(bmdl_c &, nw4r::g3d::ResAnmTexPat, s32, playMode_e);
+
+ void play(s32);
+ f32 getFrame(s32) const;
+ void setFrame(f32, s32);
+ void setRate(f32, s32);
+ bool isStop(s32) const;
+
+ f32 getFrameMax(s32) const;
+ void setFrameStart(f32, s32);
+
+private:
+ child_c *mpChildren;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_anmtexsrt.h b/include/m/m3d/m_anmtexsrt.h
new file mode 100644
index 00000000..d736a7b1
--- /dev/null
+++ b/include/m/m3d/m_anmtexsrt.h
@@ -0,0 +1,56 @@
+#ifndef M3D_M_ANMTEXSRT_H
+#define M3D_M_ANMTEXSRT_H
+
+#include <m/m3d/m_bmdl.h>
+#include <m/m3d/m_fanm.h>
+#include <nw4r/g3d/g3d_anmtexsrt.h>
+
+namespace m3d {
+
+class anmTexSrt_c : public banm_c {
+ class child_c : public fanm_c {
+ public:
+ child_c() {}
+ virtual ~child_c();
+ virtual int getType() const override;
+
+ static u32 heapCost(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmTexSrt, bool);
+ bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmTexSrt, mAllocator_c *, u32 *);
+ void setAnm(m3d::bmdl_c &, nw4r::g3d::ResAnmTexSrt, m3d::playMode_e);
+ void releaseAnm();
+ void setFrmCtrlDefault(nw4r::g3d::ResAnmTexSrt &, playMode_e);
+ };
+
+public:
+ anmTexSrt_c() : mpChildren(nullptr) {}
+ virtual ~anmTexSrt_c();
+
+ virtual int getType() const override;
+ virtual void remove() override;
+ virtual void play() override;
+
+ bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmTexSrt, mAllocator_c *, u32 *, s32);
+ static u32 heapCost(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmTexSrt, s32, bool);
+
+ void setAnm(bmdl_c &, nw4r::g3d::ResAnmTexSrt, s32, playMode_e);
+
+ void play(s32);
+ f32 getFrame(s32) const;
+ void setFrame(f32, s32);
+ void setRate(f32, s32);
+ bool isStop(s32) const;
+
+ bool checkFrame(f32, s32) const;
+
+ void setPlayMode(playMode_e, s32);
+ f32 getFrameMax(s32) const;
+ void setFrameStart(f32, s32);
+ f32 getFrameStart(s32) const;
+
+private:
+ child_c *mpChildren;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_anmvis.h b/include/m/m3d/m_anmvis.h
new file mode 100644
index 00000000..053c330d
--- /dev/null
+++ b/include/m/m3d/m_anmvis.h
@@ -0,0 +1,22 @@
+#ifndef M3D_M_ANMVIS_H
+#define M3D_M_ANMVIS_H
+
+#include <m/m3d/m_bmdl.h>
+#include <m/m3d/m_fanm.h>
+
+namespace m3d {
+
+class anmVis_c : public fanm_c {
+public:
+ virtual ~anmVis_c();
+
+ virtual int getType() const override;
+
+ bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmVis, mAllocator_c *, u32 *);
+ void setAnm(m3d::bmdl_c &, nw4r::g3d::ResAnmVis, m3d::playMode_e);
+ void setFrmCtrlDefault(nw4r::g3d::ResAnmVis &, m3d::playMode_e);
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_banm.h b/include/m/m3d/m_banm.h
new file mode 100644
index 00000000..35b1b896
--- /dev/null
+++ b/include/m/m3d/m_banm.h
@@ -0,0 +1,38 @@
+#ifndef M3D_M_BANM_H
+#define M3D_M_BANM_H
+
+#include <egg/core/eggFrmHeap.h>
+#include <m/m_allocator.h>
+#include <nw4r/g3d/g3d_anmobj.h>
+
+namespace m3d {
+
+class banm_c {
+public:
+ banm_c() : mpAnmObj(nullptr), mpFrameHeap(nullptr) {}
+ virtual ~banm_c();
+
+ virtual int getType() const = 0;
+ virtual void remove();
+ virtual void play();
+
+ bool createAllocator(mAllocator_c *alloc, u32 *pSize);
+ bool IsBound() const;
+ f32 getFrame() const;
+ void setFrameOnly(f32);
+ f32 getRate() const;
+ void setRate(f32);
+
+ inline nw4r::g3d::AnmObj *getAnimObj() const {
+ return mpAnmObj;
+ }
+
+protected:
+ nw4r::g3d::AnmObj *mpAnmObj;
+ EGG::FrmHeap *mpFrameHeap;
+ mAllocator_c mAllocator;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_bline.h b/include/m/m3d/m_bline.h
new file mode 100644
index 00000000..d47f269c
--- /dev/null
+++ b/include/m/m3d/m_bline.h
@@ -0,0 +1,85 @@
+#ifndef M3D_BLINE_H
+#define M3D_BLINE_H
+
+#include <egg/gfx/eggTexture.h>
+#include <m/m3d/m_proc.h>
+#include <m/m_math.h>
+#include <nw4r/ut/ut_Color.h>
+
+namespace m3d {
+
+// The Actual line
+class bline_c {
+public:
+ bline_c() : mpPathArr(0), mpVtxPosArr(0), mpVtxNrmArr(0), mpVtxTexArr(0), mFlags(0) {}
+ // This is mainly a Guess, When the array is created, it has both a ctor/dtor
+ struct VtxPos {
+ mVec3_c pos1;
+ mVec3_c pos2;
+ };
+ struct Vec3u8 {
+ u8 x, y, z;
+ };
+ // This is mainly a Guess, When the array is created, it has only a ctor
+ struct VtxNrm {
+ union {
+ struct {
+ Vec3u8 nrm1;
+ Vec3u8 nrm2;
+ };
+ EGG::Vector3s nrm_u16; // There is a short by short copy later
+ };
+ };
+ // This is mainly a Guess, When the array is created, it doesnt use the array alloc
+ struct VtxTex {
+ f32 tex;
+ };
+
+ /* 0x00 */ u8 field_0x00[0x8];
+
+ bool create(EGG::Heap *pHeap, u16 numPts, f32 width, f32 repeat, const nw4r::ut::Color &color);
+ void update(mVec3_c *startPos);
+ void remove();
+ void draw();
+
+ // vt at 0x08
+ virtual ~bline_c();
+
+ /* 0x0C */ f32 mWidth; // could be a scale too
+ /* 0x10 */ nw4r::ut::Color mColor;
+ /* 0x14 */ mVec3_c *mpPathArr;
+ /* 0x18 */ VtxPos *mpVtxPosArr;
+ /* 0x1C */ VtxNrm *mpVtxNrmArr;
+ /* 0x20 */ VtxTex *mpVtxTexArr;
+ /* 0x24 */ f32 mTexRepeat; // Higher value causes the texture to repeat more often
+ /* 0x28 */ u16 mPathNum; // Guess
+ /* 0x2A */ u16 mVtxNum; // Guess
+ /* 0x2C */ u16 field_0x2C;
+ /* 0x2E */ u8 mFlags;
+ /* 0x2F u8 _pad; */
+};
+
+class blineMat_c : public proc_c {
+public:
+ virtual ~blineMat_c();
+ virtual void remove() override;
+ virtual void drawOpa() override;
+ virtual void drawXlu() override;
+ virtual void setupGX(bool bTransparent);
+
+ bool create(mAllocator_c *pAllocator, int numLines, u16 numLinePts, f32 width, f32 repeat, nw4r::ut::Color &color,
+ EGG::ResTIMG *pTex, bool);
+ void update();
+ bline_c *getLine(u16 idx);
+
+ /* 0x1C */ mAllocator_c mAllocator;
+ /* 0x34 */ EGG::ResTIMG *mpTex;
+ /* 0x38 */ nw4r::ut::List mLines;
+ /* 0x44 */ bline_c *mpLineArr;
+ /* 0x48 */ short mLineArrNum;
+ /* 0x4A */ bool field_0x4A;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_bmdl.h b/include/m/m3d/m_bmdl.h
new file mode 100644
index 00000000..aa692b29
--- /dev/null
+++ b/include/m/m3d/m_bmdl.h
@@ -0,0 +1,48 @@
+#ifndef M3D_M_BMDL_H
+#define M3D_M_BMDL_H
+
+#include <m/m3d/m_banm.h>
+#include <m/m3d/m_scnleaf.h>
+#include <m/m_math.h>
+#include <nw4r/g3d/g3d_scnmdlsmpl.h>
+
+namespace m3d {
+
+class bmdl_c : public scnLeaf_c {
+public:
+ bmdl_c() : mpCurrentAnm(nullptr) {}
+ virtual ~bmdl_c();
+
+ virtual int getType() const override;
+ virtual void remove() override;
+ virtual void setAnm(banm_c &anm);
+ virtual void play();
+
+ int getMatID(const char *name) const;
+ int getNodeID(const char *name) const;
+ bool getNodeWorldMtx(u32 p1, nw4r::math::MTX34 *out) const;
+ bool getNodeWorldMtxMultVecZero(u32 p1, nw4r::math::VEC3 &out) const;
+ bool getNodeWorldMtxMultVec(u32, nw4r::math::VEC3 &, nw4r::math::VEC3 &) const;
+ nw4r::g3d::ResMdl getResMdl() const;
+ nw4r::g3d::ResMat getResMat(u32 index) const;
+
+ void removeAnm(nw4r::g3d::ScnMdlSimple::AnmObjType);
+ nw4r::g3d::AnmObj *getAnmObj(nw4r::g3d::ScnMdlSimple::AnmObjType) const;
+ void setTevColor(u32, GXTevRegID, GXColor, bool);
+ void setTevColorAll(GXTevRegID, GXColor, bool);
+ void setTevKColor(u32, GXTevKColorID, GXColor, bool);
+ void setTevKColorAll(GXTevKColorID, GXColor, bool);
+ void setBlendModeAll(GXBlendMode, GXBlendFactor, GXBlendFactor, GXLogicOp, bool bMarkDirty);
+ void setCullMode(u32 matId, GXCullMode cullMode, bool bMarkDirty);
+ void setCullModeAll(GXCullMode cullMode, bool bMarkDirty);
+ void setMatVisible(u32 matId, bool bVisble);
+ int setMatTexture(char *name, GXTexObj *texObj, bool copy, void *unk, int, int);
+ bool getBounds(mVec3_c *min, mVec3_c *max);
+
+private:
+ banm_c *mpCurrentAnm;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_calc_ratio.h b/include/m/m3d/m_calc_ratio.h
new file mode 100644
index 00000000..ee850bc9
--- /dev/null
+++ b/include/m/m3d/m_calc_ratio.h
@@ -0,0 +1,49 @@
+#ifndef M3D_M_CALC_RATIO_H
+#define M3D_M_CALC_RATIO_H
+
+#include <egg/core/eggFrmHeap.h>
+#include <m/m_allocator.h>
+
+namespace m3d {
+
+class calcRatio_c {
+public:
+ calcRatio_c();
+ virtual ~calcRatio_c();
+
+ void remove();
+ void reset();
+ void offUpdate();
+ void set(f32);
+ void calc();
+ bool isEnd() const;
+
+ f32 get0x10() const {
+ return mf4;
+ }
+
+ f32 get0x14() const {
+ return mf5;
+ }
+
+ bool is0x18() const {
+ return mb1;
+ }
+
+ bool is0x19() const {
+ return mb2;
+ }
+
+private:
+ /* 0x04 */ f32 mf1;
+ /* 0x08 */ f32 mf2;
+ /* 0x0C */ f32 mf3;
+ /* 0x10 */ f32 mf4;
+ /* 0x14 */ f32 mf5;
+ /* 0x18 */ bool mb1;
+ /* 0x19 */ bool mb2;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_fanm.h b/include/m/m3d/m_fanm.h
new file mode 100644
index 00000000..1dc0d9f2
--- /dev/null
+++ b/include/m/m3d/m_fanm.h
@@ -0,0 +1,58 @@
+#ifndef M3D_M_FANM_H
+#define M3D_M_FANM_H
+
+#include <m/m3d/m_banm.h>
+
+namespace m3d {
+
+enum playMode_e {
+ PLAY_MODE_0,
+ PLAY_MODE_1,
+ PLAY_MODE_2,
+ PLAY_MODE_3,
+ PLAY_MODE_4,
+};
+
+class fanm_c : public banm_c {
+public:
+ fanm_c();
+ virtual ~fanm_c();
+
+ virtual int getType() const = 0;
+ virtual void play();
+
+ void set(f32, playMode_e, f32, f32);
+ void set2(f32, playMode_e, f32, f32, f32);
+ void setFrame(f32);
+ void setFrameOnly(f32);
+ bool isStop() const;
+ bool checkFrame(f32) const;
+ bool unk_802EAE70() const;
+
+ inline void setPlayState(playMode_e state) {
+ mPlayState = state;
+ }
+
+ inline f32 getEndFrame() {
+ return mEndFrame;
+ }
+
+ // Something about this is wrong
+ inline void setStartFrame(f32 f) {
+ mEndFrame = f;
+ }
+
+ inline f32 getStartFrame() {
+ return mStartFrame;
+ }
+
+private:
+ f32 mEndFrame;
+ f32 mStartFrame;
+ f32 mCurrentFrame;
+ u8 mPlayState;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_mdl.h b/include/m/m3d/m_mdl.h
new file mode 100644
index 00000000..82b475e8
--- /dev/null
+++ b/include/m/m3d/m_mdl.h
@@ -0,0 +1,76 @@
+#ifndef M3D_M_MDL_H
+#define M3D_M_MDL_H
+
+#include <m/m3d/m_banm.h>
+#include <m/m3d/m_calc_ratio.h>
+#include <m/m3d/m_smdl.h>
+#include <nw4r/g3d/g3d_anmchr.h>
+#include <nw4r/g3d/g3d_calcworld.h>
+#include <nw4r/g3d/g3d_resmdl.h>
+
+namespace m3d {
+
+class callback_c {
+public:
+ virtual ~callback_c() {}
+ virtual void timingA(u32, nw4r::g3d::ChrAnmResult *, nw4r::g3d::ResMdl) {}
+ virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) {}
+ virtual void timingC(nw4r::math::MTX34 *, nw4r::g3d::ResMdl) {}
+};
+
+class mdl_c : public smdl_c {
+public:
+ class mdlCallback_c : public nw4r::g3d::ICalcWorldCallback {
+ public:
+ mdlCallback_c();
+ virtual ~mdlCallback_c();
+
+ bool create(nw4r::g3d::ResMdl, mAllocator_c *, u32 *);
+
+ virtual void ExecCallbackA(nw4r::g3d::ChrAnmResult *, nw4r::g3d::ResMdl, nw4r::g3d::FuncObjCalcWorld *);
+ virtual void ExecCallbackB(nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl, nw4r::g3d::FuncObjCalcWorld *);
+ virtual void ExecCallbackC(nw4r::math::MTX34 *, nw4r::g3d::ResMdl, nw4r::g3d::FuncObjCalcWorld *);
+
+ void remove();
+ void setBlendFrame(f32);
+ void calcBlend();
+
+ mAllocator_c *getAllocator() {
+ return mpAlloc;
+ }
+
+ void setBaseCallback(callback_c *cb) {
+ mpBaseCallback = cb;
+ }
+
+ private:
+ /* 0x04 */ calcRatio_c mCalcRatio;
+ /* 0x20 */ int mNumNode;
+ /* 0x24 */ nw4r::g3d::ChrAnmResult *mpNodes;
+ /* 0x28 */ callback_c *mpBaseCallback;
+ /* 0x2C */ mAllocator_c *mpAlloc;
+ };
+
+ mdl_c();
+ virtual ~mdl_c();
+
+ bool create(nw4r::g3d::ResMdl, mAllocator_c *, u32, int, u32 *);
+ bool create(nw4r::g3d::ResMdl, mdlCallback_c *cb, mAllocator_c *, u32, int, u32 *);
+
+ virtual void remove();
+
+ void setCallback(callback_c *cb);
+ void play();
+ void setAnm(banm_c &);
+ void setAnm(banm_c &, f32);
+
+private:
+ /** If we allocated the callback ourselves, this is what we need to free */
+ mdlCallback_c *mpOwnedCallback;
+ /** The actual callback to use */
+ mdlCallback_c *mpCallback;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_proc.h b/include/m/m3d/m_proc.h
new file mode 100644
index 00000000..47fc4c84
--- /dev/null
+++ b/include/m/m3d/m_proc.h
@@ -0,0 +1,21 @@
+#ifndef M_M3D_PROC_H
+#define M_M3D_PROC_H
+
+#include <common.h>
+#include <m/m3d/m_scnleaf.h>
+
+namespace m3d {
+
+class proc_c : public scnLeaf_c {
+public:
+ virtual ~proc_c();
+ virtual int getType() const override;
+ bool create(mAllocator_c *, u32 *);
+
+ virtual void drawOpa();
+ virtual void drawXlu();
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_scnleaf.h b/include/m/m3d/m_scnleaf.h
new file mode 100644
index 00000000..18e9db9c
--- /dev/null
+++ b/include/m/m3d/m_scnleaf.h
@@ -0,0 +1,58 @@
+#ifndef M3D_M_SCNLEAF_H
+#define M3D_M_SCNLEAF_H
+
+#include <egg/core/eggDisposer.h>
+#include <m/m_allocator.h>
+#include <nw4r/g3d/g3d_scnobj.h>
+
+namespace m3d {
+
+// NON-OFFICIAL
+enum ScnLeafType_e {
+ SCN_LEAF_MODEL = 0,
+ SCN_LEAF_PROC = 2,
+};
+
+class UnkClass {
+public:
+ UnkClass() {}
+};
+
+class scnLeaf_c : UnkClass, EGG::Disposer {
+public:
+ scnLeaf_c();
+ virtual ~scnLeaf_c();
+ virtual int getType() const = 0;
+ virtual void remove();
+ virtual int entry();
+
+ void setOption(u32 flag, u32 set);
+ void setScale(f32, f32, f32);
+ void setScale(const nw4r::math::VEC3 &);
+ void getScale(nw4r::math::VEC3 *) const;
+
+ void setLocalMtx(const nw4r::math::MTX34 *);
+ void getLocalMtx(nw4r::math::MTX34 *) const;
+ const nw4r::math::MTX34 *getLocalMtx() const;
+ void getWorldMtx(nw4r::math::MTX34 *) const;
+ void getViewMtx(nw4r::math::MTX34 *) const;
+
+ void setCallback(nw4r::g3d::IScnObjCallback *cb);
+ nw4r::g3d::IScnObjCallback *swapCallback(nw4r::g3d::IScnObjCallback *cb);
+
+ void enableCallbackTiming(nw4r::g3d::ScnObj::Timing);
+ void enableCallbackOp(nw4r::g3d::ScnObj::ExecOp);
+
+ void calc(bool);
+ void calcVtx(bool);
+ void calcView(void *, bool);
+
+ void setPriorityDraw(int, int);
+
+protected:
+ nw4r::g3d::ScnLeaf *mpScnLeaf;
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m3d/m_smdl.h b/include/m/m3d/m_smdl.h
new file mode 100644
index 00000000..e55f759a
--- /dev/null
+++ b/include/m/m3d/m_smdl.h
@@ -0,0 +1,25 @@
+#ifndef M3D_M_SMDL_H
+#define M3D_M_SMDL_H
+
+#include <m/m3d/m_bmdl.h>
+#include <m/m3d/m_scnleaf.h>
+#include <nw4r/g3d/g3d_resmdl.h>
+
+class UnkClass2 {};
+
+namespace m3d {
+
+class smdl_c : public bmdl_c, UnkClass2 {
+public:
+ smdl_c();
+ virtual ~smdl_c();
+
+ bool create(nw4r::g3d::ResMdl mdl, mAllocator_c *alloc, u32 bufferOption, int nView, u32 *pSize);
+ bool create(nw4r::g3d::ResMdl mdl, mAllocator_c *alloc, u32 bufferOption) {
+ return create(mdl, alloc, bufferOption, 1, nullptr);
+ }
+};
+
+} // namespace m3d
+
+#endif
diff --git a/include/m/m_allocator.h b/include/m/m_allocator.h
index e4f2a175..4391ad0e 100644
--- a/include/m/m_allocator.h
+++ b/include/m/m_allocator.h
@@ -26,6 +26,8 @@ public:
s32 adjustExpHeap();
bool createNewTempFrmHeap(s32 size, EGG::Heap *newHeap, char *heapName, s32 align, u32 unk);
void adjustFrmHeapRestoreCurrent();
- static void *allocOnHeap(u32 size, mHeapAllocator_c *allocator);
};
+
+void *operator new[](size_t size, mAllocator_c *);
+
#endif
diff --git a/include/m/m_mtx.h b/include/m/m_mtx.h
index ee60b72d..879e62cf 100644
--- a/include/m/m_mtx.h
+++ b/include/m/m_mtx.h
@@ -8,6 +8,8 @@
#include "nw4r/nw4r_types.h"
#include <common.h>
+#pragma push
+#pragma warning off(10402)
class mMtx_c {
public:
mMtx_c(){};
@@ -38,10 +40,15 @@ public:
/* 802f1c40 */ void rot(int, int); // does some werrd operation to rotate the matrix
/* 802f1e60 */ bool quatRelated();
+ operator nw4r::math::MTX34 *() {
+ return &nw4rm;
+ }
+
public:
union {
EGG::Matrix34f mat;
f32 m[3][4];
+ nw4r::math::MTX34 nw4rm;
struct {
f32 xx, xy, xz, xw;
f32 yx, yy, yz, yw;
@@ -53,4 +60,6 @@ public:
static mMtx_c Identity;
};
+#pragma pop
+
#endif
diff --git a/include/m/m_video.h b/include/m/m_video.h
new file mode 100644
index 00000000..5a0e382b
--- /dev/null
+++ b/include/m/m_video.h
@@ -0,0 +1,17 @@
+#ifndef M_VIDEO_H
+#define M_VIDEO_H
+
+#include <egg/core/eggVideo.h>
+
+namespace mVideo {
+
+// 0x80065590
+void create();
+
+extern EGG::Video *m_video;
+
+extern f32 l_fbAspect;
+
+} // namespace mVideo
+
+#endif
diff --git a/include/nw4r/g3d/g3d_3dsmax.h b/include/nw4r/g3d/g3d_3dsmax.h
index 56c56453..220e4d09 100644
--- a/include/nw4r/g3d/g3d_3dsmax.h
+++ b/include/nw4r/g3d/g3d_3dsmax.h
@@ -1,7 +1,8 @@
#ifndef NW4R_G3D_3DSMAX_H
#define NW4R_G3D_3DSMAX_H
#include "common.h"
-#include "g3d_anmtexsrt.h"
+#include "nw4r/g3d/g3d_anmtexsrt.h"
+#include "nw4r/math.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_anmcamera.h b/include/nw4r/g3d/g3d_anmcamera.h
index 972ed03e..7a33f1dd 100644
--- a/include/nw4r/g3d/g3d_anmcamera.h
+++ b/include/nw4r/g3d/g3d_anmcamera.h
@@ -1,7 +1,7 @@
#ifndef NW4R_G3D_ANMCAMERA_H
#define NW4R_G3D_ANMCAMERA_H
#include "common.h"
-#include "math_types.h"
+#include "nw4r/math/math_types.h"
#include <rvl/GX.h>
diff --git a/include/nw4r/g3d/g3d_anmchr.h b/include/nw4r/g3d/g3d_anmchr.h
index 577bd8ff..49cc40c8 100644
--- a/include/nw4r/g3d/g3d_anmchr.h
+++ b/include/nw4r/g3d/g3d_anmchr.h
@@ -1,7 +1,8 @@
#ifndef NW4R_G3D_ANMCHR_H
#define NW4R_G3D_ANMCHR_H
#include "common.h"
-#include "math_types.h"
+#include "nw4r/g3d/g3d_anmobj.h"
+#include "nw4r/math/math_types.h"
namespace nw4r {
namespace g3d {
@@ -12,13 +13,80 @@ struct ChrAnmResult {
math::MTX34 mMtx; // at 0x1C
};
-struct AnmObjChr {};
+class AnmObjChrRes;
-struct AnmObjChrNode {};
+class AnmObjChr : public AnmObj {
+public:
-struct AnmObjChrBlend {};
+ enum BindOption {};
+
+ static const TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ virtual ChrAnmResult *GetResult(ChrAnmResult *, u32); // at 0x38
+ virtual void Attach(int, AnmObjChrRes*); // at 0x3C
+ virtual void Detach(int); // at 0x40
+ virtual void DetachAll(); // at 0x44
+ virtual void SetWeight(int, f32); // at 0x48
+ virtual f32 GetWeight(int) const; // at 0x4C
+ virtual void Bind(ResMdl, u32, BindOption) = 0; // at 0x50
+ virtual void Release(ResMdl, u32, BindOption) = 0; // at 0x54
+
+private:
+ UNKWORD field_0x10;
+ UNKWORD field_0x14;
+
+protected:
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjChr);
+};
+
+class AnmObjChrNode : public AnmObjChr {
+public:
+ static const TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ inline int Size() {
+ return mNodeArraySize;
+ }
+
+ AnmObjChrRes *GetNode(int i) {
+ return mpNodes[i];
+ }
+
+private:
+ int mNodeArraySize;
+ AnmObjChrRes **mpNodes;
+
+protected:
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjChrNode);
+};
+
+class AnmObjChrBlend : public AnmObjChrNode {
+public:
+ static const TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ static AnmObjChrBlend *Construct(MEMAllocator*, u32*, ResMdl, int);
+
+protected:
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjChrBlend);
+};
+
+class AnmObjChrRes : public AnmObjChr, public FrameCtrl {
+public:
+ static const TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ static AnmObjChrRes *Construct(MEMAllocator*, u32*, ResAnmChr, ResMdl, bool);
+
+protected:
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjChrRes);
+};
-struct AnmObjChrRes {};
} // namespace g3d
} // namespace nw4r
diff --git a/include/nw4r/g3d/g3d_anmclr.h b/include/nw4r/g3d/g3d_anmclr.h
index 6a009f19..892abe70 100644
--- a/include/nw4r/g3d/g3d_anmclr.h
+++ b/include/nw4r/g3d/g3d_anmclr.h
@@ -1,6 +1,8 @@
#ifndef NW4R_G3D_ANMCLR_H
#define NW4R_G3D_ANMCLR_H
#include "common.h"
+#include "nw4r/g3d/g3d_anmobj.h"
+#include "nw4r/g3d/g3d_resanmclr.h"
namespace nw4r {
namespace g3d {
@@ -11,6 +13,73 @@ struct ClrAnmResult {
u32 COLORS_0x4[ANM_COUNT];
UNKWORD WORDS_0x30[ANM_COUNT];
};
+
+class AnmObjMatClrRes;
+
+class AnmObjMatClr : public AnmObj {
+public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ virtual ClrAnmResult *GetResult(); // at 0x38
+ virtual void Attach(s32, AnmObjMatClrRes *res); // at 0x3C
+ virtual void Detach(s32); // at 0x40
+
+private:
+ int mChildrenArraySize;
+ u16 *mpChildrenArray;
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjMatClr);
+};
+
+class AnmObjMatClrNode : public AnmObjMatClr {
+public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ inline int Size() {
+ return mNodeArraySize;
+ }
+
+ AnmObjMatClrRes *GetNode(int i) {
+ return mpNodes[i];
+ }
+
+private:
+ int mNodeArraySize;
+ AnmObjMatClrRes **mpNodes;
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjMatClrNode);
+};
+
+class AnmObjMatClrRes : public AnmObjMatClr, public FrameCtrl {
+public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ static AnmObjMatClrRes *Construct(MEMAllocator *, u32 *, ResAnmClr, ResMdl, bool);
+
+private:
+ ResAnmClr mRes;
+ TexSrtAnmResult *mpResultCache;
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjMatClrRes);
+};
+
+class AnmObjMatClrOverride : public AnmObjMatClrNode {
+public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ static AnmObjMatClrOverride *Construct(MEMAllocator *, u32 *, ResMdl, int);
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjMatClrOverride);
+};
+
} // namespace g3d
} // namespace nw4r
diff --git a/include/nw4r/g3d/g3d_anmobj.h b/include/nw4r/g3d/g3d_anmobj.h
index 421223a0..7fb62f1e 100644
--- a/include/nw4r/g3d/g3d_anmobj.h
+++ b/include/nw4r/g3d/g3d_anmobj.h
@@ -1,9 +1,9 @@
#ifndef NW4R_G3D_ANMOBJ_H
#define NW4R_G3D_ANMOBJ_H
#include "common.h"
-#include "g3d_obj.h"
-#include "g3d_rescommon.h"
-#include "g3d_resmdl.h"
+#include "nw4r/g3d/g3d_obj.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/g3d/g3d_resmdl.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_anmscn.h b/include/nw4r/g3d/g3d_anmscn.h
index f32f99f4..050c64eb 100644
--- a/include/nw4r/g3d/g3d_anmscn.h
+++ b/include/nw4r/g3d/g3d_anmscn.h
@@ -1,10 +1,10 @@
#ifndef NW4R_G3D_ANMSCN_H
#define NW4R_G3D_ANMSCN_H
#include "common.h"
-#include "g3d_camera.h"
-#include "g3d_fog.h"
-#include "g3d_light.h"
-#include "g3d_obj.h"
+#include "nw4r/g3d/g3d_camera.h"
+#include "nw4r/g3d/g3d_fog.h"
+#include "nw4r/g3d/g3d_light.h"
+#include "nw4r/g3d/g3d_obj.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_anmshp.h b/include/nw4r/g3d/g3d_anmshp.h
new file mode 100644
index 00000000..e5d798c9
--- /dev/null
+++ b/include/nw4r/g3d/g3d_anmshp.h
@@ -0,0 +1,99 @@
+#ifndef NW4R_G3D_ANMSHP_H
+#define NW4R_G3D_ANMSHP_H
+#include "common.h"
+#include "nw4r/g3d/g3d_anmobj.h"
+#include "nw4r/g3d/g3d_resanmshp.h"
+
+// This header is based on the SS ghidra, the TypeNames in the binary,
+// and an assumed symmetry to AnmObjVis. Everything about it could be wrong.
+
+namespace nw4r {
+namespace g3d {
+
+class AnmObjShpRes;
+
+class AnmObjShp : public AnmObj {
+public:
+ AnmObjShp(MEMAllocator *, u16 *, int);
+ virtual bool IsDerivedFrom(TypeObj other) const // at 0x8
+ {
+ return (other == GetTypeObjStatic()) ? true : AnmObj::IsDerivedFrom(other);
+ }
+ virtual void G3dProc(u32, u32, void *); // at 0xC
+ virtual ~AnmObjShp() {} // at 0x10
+ virtual const TypeObj GetTypeObj() const // at 0x14
+ {
+ return TypeObj(TYPE_NAME);
+ }
+ virtual const char *GetTypeName() const // at 0x18
+ {
+ return GetTypeObj().GetTypeName();
+ }
+ virtual void SetFrame(f32) = 0; // at 0x1C
+ virtual f32 GetFrame() const = 0; // at 0x20
+ virtual void UpdateFrame() = 0; // at 0x24
+ virtual void SetUpdateRate(f32) = 0; // at 0x28
+ virtual f32 GetUpdateRate() const = 0; // at 0x2C
+ virtual bool Bind(ResMdl) = 0; // at 0x30
+ virtual void Release(); // at 0x34
+ virtual bool GetResult(u32) = 0; // at 0x38
+ virtual AnmObjShpRes *Attach(int, AnmObjShpRes *); // at 0x3C
+ virtual AnmObjShpRes *Detach(int); // at 0x40
+
+ static const TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ bool TestDefined(u32 idx) const;
+ bool TestExistence(u32 idx) const;
+ void DetachAll();
+
+protected:
+ static const int MAX_RESOURCES = 4;
+
+ int mNumBinds; // at 0x10
+ u16 *mBinds; // at 0x14
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjShp);
+};
+
+class AnmObjShpRes : public AnmObjShp, public FrameCtrl {
+public:
+ AnmObjShpRes(MEMAllocator *, ResAnmShp, u16 *, int);
+
+ virtual bool IsDerivedFrom(TypeObj other) const // at 0x8
+ {
+ return (other == GetTypeObjStatic()) ? true : AnmObjShp::IsDerivedFrom(other);
+ }
+ virtual ~AnmObjShpRes() {} // at 0x10
+ virtual const TypeObj GetTypeObj() const // at 0x14
+ {
+ return TypeObj(TYPE_NAME);
+ }
+ virtual const char *GetTypeName() const // at 0x18
+ {
+ return GetTypeObj().GetTypeName();
+ }
+ virtual void SetFrame(f32); // at 0x1C
+ virtual f32 GetFrame() const; // at 0x20
+ virtual void UpdateFrame(); // at 0x24
+ virtual void SetUpdateRate(f32); // at 0x28
+ virtual f32 GetUpdateRate() const; // at 0x2C
+ virtual bool Bind(ResMdl); // at 0x30
+ virtual bool GetResult(u32); // at 0x38
+
+ static const TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ static AnmObjShpRes *Construct(MEMAllocator *, u32 *, ResAnmShp, ResMdl, int);
+
+private:
+ ResAnmShp mResAnmShp; // at 0x2C
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjShpRes);
+};
+} // namespace g3d
+} // namespace nw4r
+
+#endif
diff --git a/include/nw4r/g3d/g3d_anmtexpat.h b/include/nw4r/g3d/g3d_anmtexpat.h
index 434a10f7..9506d745 100644
--- a/include/nw4r/g3d/g3d_anmtexpat.h
+++ b/include/nw4r/g3d/g3d_anmtexpat.h
@@ -1,6 +1,8 @@
#ifndef NW4R_G3D_ANMTEXPAT_H
#define NW4R_G3D_ANMTEXPAT_H
-#include "g3d_restex.h"
+#include "nw4r/g3d/g3d_anmobj.h"
+#include "nw4r/g3d/g3d_restex.h"
+#include "nw4r/g3d/g3d_resanmtexpat.h"
namespace nw4r
{
@@ -18,7 +20,75 @@ namespace nw4r
ResTex mTexs[ANM_COUNT]; // at 0x4
ResPltt mPltts[ANM_COUNT]; // at 0x24
};
+
+ class AnmObjTexPatRes;
+
+ class AnmObjTexPat : public AnmObj {
+ public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ virtual TexPatAnmResult *GetResult(); // at 0x38
+ virtual void Attach(s32, AnmObjTexPatRes *res); // at 0x3C
+ virtual void Detach(s32); // at 0x40
+
+ private:
+ int mChildrenArraySize;
+ u16 *mpChildrenArray;
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjTexPat);
+ };
+
+ class AnmObjTexPatNode : public AnmObjTexPat {
+ public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+
+ inline int Size() {
+ return mNodeArraySize;
+ }
+
+ AnmObjTexPatRes *GetNode(int i) {
+ return mpNodes[i];
+ }
+
+ private:
+ int mNodeArraySize;
+ AnmObjTexPatRes **mpNodes;
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjTexPatNode);
+ };
+
+ class AnmObjTexPatRes : public AnmObjTexPat, public FrameCtrl {
+ public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+
+ static AnmObjTexPatRes *Construct(MEMAllocator*, u32*, ResAnmTexPat, ResMdl, bool);
+ private:
+ ResAnmTexPat mRes;
+ TexPatAnmResult *mpResultCache;
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjTexPatRes);
+ };
+
+ class AnmObjTexPatOverride : public AnmObjTexPatNode {
+ public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ static AnmObjTexPatOverride *Construct(MEMAllocator*, u32*, ResMdl, int);
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjTexPatOverride);
+ };
+
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/g3d/g3d_anmtexsrt.h b/include/nw4r/g3d/g3d_anmtexsrt.h
index 55c286aa..21576b6a 100644
--- a/include/nw4r/g3d/g3d_anmtexsrt.h
+++ b/include/nw4r/g3d/g3d_anmtexsrt.h
@@ -1,11 +1,81 @@
#ifndef NW4R_G3D_ANMTEXSRT_H
#define NW4R_G3D_ANMTEXSRT_H
-#include "g3d_restex.h"
+#include "nw4r/g3d/g3d_restex.h"
+#include "nw4r/g3d/g3d_resanmtexsrt.h"
namespace nw4r
{
namespace g3d
{
+
+ class AnmObjTexSrtRes;
+ struct TexSrtAnmResult;
+
+ class AnmObjTexSrt : public AnmObj {
+ public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ virtual TexSrtAnmResult *GetResult(); // at 0x38
+ virtual void Attach(s32, AnmObjTexSrtRes *res); // at 0x3C
+ virtual void Detach(s32); // at 0x40
+
+ private:
+ int mChildrenArraySize;
+ u16 *mpChildrenArray;
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjTexSrt);
+ };
+
+ class AnmObjTexSrtNode : public AnmObjTexSrt {
+ public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+
+ inline int Size() {
+ return mNodeArraySize;
+ }
+
+ AnmObjTexSrtRes *GetNode(int i) {
+ return mpNodes[i];
+ }
+
+ private:
+ int mNodeArraySize;
+ AnmObjTexSrtRes **mpNodes;
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjTexSrtNode);
+ };
+
+ class AnmObjTexSrtRes : public AnmObjTexSrt, public FrameCtrl {
+ public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+
+ static AnmObjTexSrtRes *Construct(MEMAllocator*, u32*, ResAnmTexSrt, ResMdl, bool);
+ private:
+ ResAnmTexSrt mRes;
+ TexSrtAnmResult *mpResultCache;
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjTexSrtRes);
+ };
+
+ class AnmObjTexSrtOverride : public AnmObjTexSrtNode {
+ public:
+ static const G3dObj::TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
+
+ static AnmObjTexSrtOverride *Construct(MEMAllocator*, u32*, ResMdl, int);
+
+ NW4R_G3D_TYPE_OBJ_DECL(AnmObjTexSrtOverride);
+ };
+
struct TexSrtTypedef
{
enum TexMatrixMode
@@ -44,4 +114,4 @@ namespace nw4r
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/g3d/g3d_anmvis.h b/include/nw4r/g3d/g3d_anmvis.h
index 26bffd4d..54d54e34 100644
--- a/include/nw4r/g3d/g3d_anmvis.h
+++ b/include/nw4r/g3d/g3d_anmvis.h
@@ -1,8 +1,8 @@
#ifndef NW4R_G3D_ANMVIS_H
#define NW4R_G3D_ANMVIS_H
#include "common.h"
-#include "g3d_anmobj.h"
-#include "g3d_resanmvis.h"
+#include "nw4r/g3d/g3d_anmobj.h"
+#include "nw4r/g3d/g3d_resanmvis.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_basic.h b/include/nw4r/g3d/g3d_basic.h
index e80b3ed3..672796d9 100644
--- a/include/nw4r/g3d/g3d_basic.h
+++ b/include/nw4r/g3d/g3d_basic.h
@@ -1,7 +1,7 @@
#ifndef NW4R_G3D_BASIC_H
#define NW4R_G3D_BASIC_H
-#include "math_types.h"
-#include "g3d_anmchr.h"
+#include "nw4r/math/math_types.h"
+#include "nw4r/g3d/g3d_anmchr.h"
namespace nw4r
{
@@ -45,4 +45,4 @@ namespace nw4r
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/g3d/g3d_calcview.h b/include/nw4r/g3d/g3d_calcview.h
index 8cb3a7c5..3c9a43cf 100644
--- a/include/nw4r/g3d/g3d_calcview.h
+++ b/include/nw4r/g3d/g3d_calcview.h
@@ -1,6 +1,7 @@
#ifndef NW4R_G3D_CALC_VIEW_H
#define NW4R_G3D_CALC_VIEW_H
#include "common.h"
+#include "nw4r/math.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_calcworld.h b/include/nw4r/g3d/g3d_calcworld.h
index f4968c2f..7c9ef69d 100644
--- a/include/nw4r/g3d/g3d_calcworld.h
+++ b/include/nw4r/g3d/g3d_calcworld.h
@@ -1,9 +1,39 @@
#ifndef NW4R_G3D_CALC_WORLD_H
#define NW4R_G3D_CALC_WORLD_H
#include "common.h"
+#include "nw4r/math.h"
namespace nw4r {
namespace g3d {
+
+struct FuncObjCalcWorld {
+private:
+ u8 UNK_0x00[0x06];
+ /** 0x06 */ u16 mNodeId;
+
+public:
+ u32 GetNodeId() const {
+ return mNodeId;
+ }
+
+ void SetNodeId(u32 n) {
+ mNodeId = n;
+ }
+};
+
+class WorldMtxManip {};
+
+// Name from ketteiban
+class ICalcWorldCallback {
+public:
+ virtual ~ICalcWorldCallback() {}
+
+ virtual void ExecCallbackA(nw4r::g3d::ChrAnmResult *, nw4r::g3d::ResMdl, nw4r::g3d::FuncObjCalcWorld *) {}
+ virtual void ExecCallbackB(nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl, nw4r::g3d::FuncObjCalcWorld *) {}
+ virtual void ExecCallbackC(nw4r::math::MTX34 *, nw4r::g3d::ResMdl, nw4r::g3d::FuncObjCalcWorld *) {}
+};
+
+
void CalcWorld(math::MTX34 *, u32 *, const u8 *, const math::MTX34 *, ResMdl, AnmObjChr *, FuncObjCalcWorld *, u32);
void CalcWorld(math::MTX34 *, u32 *, const u8 *, const math::MTX34 *, ResMdl, AnmObjChr *, FuncObjCalcWorld *);
diff --git a/include/nw4r/g3d/g3d_camera.h b/include/nw4r/g3d/g3d_camera.h
index e5c58271..9ac3ebb2 100644
--- a/include/nw4r/g3d/g3d_camera.h
+++ b/include/nw4r/g3d/g3d_camera.h
@@ -1,8 +1,8 @@
#ifndef NW4R_G3D_CAMERA_H
#define NW4R_G3D_CAMERA_H
#include "common.h"
-#include "g3d_rescommon.h"
-#include "math_types.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/math/math_types.h"
#include <rvl/MTX.h>
diff --git a/include/nw4r/g3d/g3d_dcc.h b/include/nw4r/g3d/g3d_dcc.h
index 56a009d8..0c83c1f0 100644
--- a/include/nw4r/g3d/g3d_dcc.h
+++ b/include/nw4r/g3d/g3d_dcc.h
@@ -1,7 +1,8 @@
#ifndef NW4R_G3D_DCC_H
#define NW4R_G3D_DCC_H
#include "common.h"
-#include "g3d_anmtexsrt.h"
+#include "nw4r/math.h"
+#include "nw4r/g3d/g3d_anmtexsrt.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_draw.h b/include/nw4r/g3d/g3d_draw.h
index 0d0956d7..3501607e 100644
--- a/include/nw4r/g3d/g3d_draw.h
+++ b/include/nw4r/g3d/g3d_draw.h
@@ -1,7 +1,7 @@
#ifndef NW4R_G3D_DRAW_H
#define NW4R_G3D_DRAW_H
#include "common.h"
-#include "g3d_resmdl.h"
+#include "nw4r/g3d/g3d_resmdl.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_draw1mat1shp.h b/include/nw4r/g3d/g3d_draw1mat1shp.h
index b442c9d1..694b8974 100644
--- a/include/nw4r/g3d/g3d_draw1mat1shp.h
+++ b/include/nw4r/g3d/g3d_draw1mat1shp.h
@@ -1,8 +1,8 @@
#ifndef NW4R_G3D_DRAW1_MAT1_SHP_H
#define NW4R_G3D_DRAW1_MAT1_SHP_H
#include "common.h"
-#include "g3d_resmat.h"
-#include "g3d_resshp.h"
+#include "nw4r/g3d/g3d_resmat.h"
+#include "nw4r/g3d/g3d_resshp.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_fog.h b/include/nw4r/g3d/g3d_fog.h
index 0c1932a7..c5e953aa 100644
--- a/include/nw4r/g3d/g3d_fog.h
+++ b/include/nw4r/g3d/g3d_fog.h
@@ -1,9 +1,9 @@
#ifndef NW4R_G3D_FOG_H
#define NW4R_G3D_FOG_H
#include "common.h"
-#include "g3d_rescommon.h"
-#include "math_types.h"
-#include "ut_Color.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/math/math_types.h"
+#include "nw4r/ut/ut_Color.h"
#include <rvl/GX.h>
diff --git a/include/nw4r/g3d/g3d_gpu.h b/include/nw4r/g3d/g3d_gpu.h
index 693af719..2db74bd5 100644
--- a/include/nw4r/g3d/g3d_gpu.h
+++ b/include/nw4r/g3d/g3d_gpu.h
@@ -1,8 +1,8 @@
#ifndef NW4R_G3D_GPU_H
#define NW4R_G3D_GPU_H
#include "common.h"
-#include "g3d_rescommon.h"
-#include "math_types.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/math/math_types.h"
#include <rvl/GX.h>
diff --git a/include/nw4r/g3d/g3d_init.h b/include/nw4r/g3d/g3d_init.h
index d6e9718a..9f52d5f1 100644
--- a/include/nw4r/g3d/g3d_init.h
+++ b/include/nw4r/g3d/g3d_init.h
@@ -5,12 +5,6 @@
namespace nw4r {
namespace g3d {
-inline void InitFastCast() {
- OSInitFastCast();
- OSSetGQR6(7, 5);
- OSSetGQR7(7, 8);
-}
-
void G3dInit(bool);
void G3dReset();
} // namespace g3d
diff --git a/include/nw4r/g3d/g3d_light.h b/include/nw4r/g3d/g3d_light.h
index a989dcf6..051688f6 100644
--- a/include/nw4r/g3d/g3d_light.h
+++ b/include/nw4r/g3d/g3d_light.h
@@ -1,7 +1,8 @@
#ifndef NW4R_G3D_LIGHT_H
#define NW4R_G3D_LIGHT_H
#include "common.h"
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/math.h"
#include <rvl/GX.h>
diff --git a/include/nw4r/g3d/g3d_maya.h b/include/nw4r/g3d/g3d_maya.h
index ab10b53f..4e344bb9 100644
--- a/include/nw4r/g3d/g3d_maya.h
+++ b/include/nw4r/g3d/g3d_maya.h
@@ -1,7 +1,8 @@
#ifndef NW4R_G3D_MAYA_H
#define NW4R_G3D_MAYA_H
#include "common.h"
-#include "g3d_anmtexsrt.h"
+#include "nw4r/g3d/g3d_anmtexsrt.h"
+#include "nw4r/math.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_obj.h b/include/nw4r/g3d/g3d_obj.h
index 6f596a11..68b03706 100644
--- a/include/nw4r/g3d/g3d_obj.h
+++ b/include/nw4r/g3d/g3d_obj.h
@@ -90,6 +90,7 @@ public:
}
void Destroy();
+ void DetachFromParent();
G3dObj(MEMAllocator *pAllocator, G3dObj *pParent) : mAllocator(pAllocator), mParent(pParent) {}
@@ -115,7 +116,10 @@ public:
template <typename T>
static T *DynamicCast(G3dObj *obj) {
- return (obj != NULL && obj->IsDerivedFrom(T::GetTypeObjStatic())) ? static_cast<T *>(obj) : NULL;
+ if (obj != nullptr && obj->IsDerivedFrom(T::GetTypeObjStatic())) {
+ return static_cast<T *>(obj);
+ }
+ return nullptr;
}
private:
diff --git a/include/nw4r/g3d/g3d_resanmcamera.h b/include/nw4r/g3d/g3d_resanmcamera.h
index 0b1eb409..3dc8a33b 100644
--- a/include/nw4r/g3d/g3d_resanmcamera.h
+++ b/include/nw4r/g3d/g3d_resanmcamera.h
@@ -1,8 +1,8 @@
#ifndef NW4R_G3D_RESANMCAMERA_H
#define NW4R_G3D_RESANMCAMERA_H
#include "common.h"
-#include "g3d_anmcamera.h"
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_anmcamera.h"
+#include "nw4r/g3d/g3d_rescommon.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_resanmchr.h b/include/nw4r/g3d/g3d_resanmchr.h
index fd6696f9..76e08a34 100644
--- a/include/nw4r/g3d/g3d_resanmchr.h
+++ b/include/nw4r/g3d/g3d_resanmchr.h
@@ -1,13 +1,18 @@
#ifndef NW4R_G3D_RESANMCHR_H
#define NW4R_G3D_RESANMCHR_H
#include "common.h"
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_rescommon.h"
namespace nw4r {
namespace g3d {
struct ResAnmChrData {
char UNK_0x0[0x8];
u32 mRevision; // at 0x8
+ char UNK_0xC[0x4];
+ s32 mMatDictOffset; // at 0x10
+ char UNK_0x14[0x0C];
+ u16 mNumFrames; // at 0x20
+ AnmPolicy mAnmPolicy; // at 0x24
};
struct ResAnmChr {
@@ -20,6 +25,16 @@ struct ResAnmChr {
inline bool CheckRevision() const {
return mAnmChr.ref().mRevision == REVISION;
}
+
+ AnmPolicy GetAnmPolicy() const
+ {
+ return mAnmChr.ref().mAnmPolicy;
+ }
+
+ int GetNumFrame() const
+ {
+ return mAnmChr.ref().mNumFrames;
+ }
};
} // namespace g3d
} // namespace nw4r
diff --git a/include/nw4r/g3d/g3d_resanmclr.h b/include/nw4r/g3d/g3d_resanmclr.h
index a92ad053..78feba26 100644
--- a/include/nw4r/g3d/g3d_resanmclr.h
+++ b/include/nw4r/g3d/g3d_resanmclr.h
@@ -1,7 +1,8 @@
#ifndef NW4R_G3D_RESANMCLR_H
#define NW4R_G3D_RESANMCLR_H
-#include "g3d_resdict.h"
-#include "g3d_resanm.h"
+#include "nw4r/g3d/g3d_resdict.h"
+#include "nw4r/g3d/g3d_resanm.h"
+#include "nw4r/g3d/g3d_anmclr.h"
namespace nw4r
{
@@ -32,6 +33,9 @@ namespace nw4r
char UNK_0xC[0x4];
s32 mMatDictOffset; // at 0x10
ResAnmClrInfoData mInfo; // at 0x14
+ char UNK_0x1E[0x2];
+ u16 mNumFrames; // at 0x20
+ AnmPolicy mAnmPolicy; // at 0x24
};
struct ResAnmClr
@@ -54,6 +58,16 @@ namespace nw4r
{
return ref().mRevision == REVISION;
}
+
+ AnmPolicy GetAnmPolicy() const
+ {
+ return ref().mAnmPolicy;
+ }
+
+ int GetNumFrame() const
+ {
+ return ref().mNumFrames;
+ }
inline const ResAnmClrMatData * GetMatAnm(u32 i) const
{
@@ -65,4 +79,4 @@ namespace nw4r
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/g3d/g3d_resanmfog.h b/include/nw4r/g3d/g3d_resanmfog.h
index 4cc933cc..77443159 100644
--- a/include/nw4r/g3d/g3d_resanmfog.h
+++ b/include/nw4r/g3d/g3d_resanmfog.h
@@ -1,8 +1,8 @@
#ifndef NW4R_G3D_RESANMFOG_H
#define NW4R_G3D_RESANMFOG_H
#include "common.h"
-#include "g3d_anmfog.h"
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_anmfog.h"
+#include "nw4r/g3d/g3d_rescommon.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_resanmscn.h b/include/nw4r/g3d/g3d_resanmscn.h
index 5983b256..3f7af493 100644
--- a/include/nw4r/g3d/g3d_resanmscn.h
+++ b/include/nw4r/g3d/g3d_resanmscn.h
@@ -1,9 +1,9 @@
#ifndef NW4R_G3D_RESANMSCN_H
#define NW4R_G3D_RESANMSCN_H
#include "common.h"
-#include "g3d_resanmcamera.h"
-#include "g3d_resanmfog.h"
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_resanmcamera.h"
+#include "nw4r/g3d/g3d_resanmfog.h"
+#include "nw4r/g3d/g3d_rescommon.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_resanmshp.h b/include/nw4r/g3d/g3d_resanmshp.h
index 58c3452b..332065da 100644
--- a/include/nw4r/g3d/g3d_resanmshp.h
+++ b/include/nw4r/g3d/g3d_resanmshp.h
@@ -1,13 +1,17 @@
#ifndef NW4R_G3D_RESANMSHP_H
#define NW4R_G3D_RESANMSHP_H
#include "common.h"
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_anmobj.h"
+#include "nw4r/g3d/g3d_rescommon.h"
namespace nw4r {
namespace g3d {
struct ResAnmShpData {
char UNK_0x0[0x8];
u32 mRevision; // at 0x8
+ char UNK_0xC[0x24 - 0xC];
+ u16 mNumFrames; // at 0x24
+ AnmPolicy mAnmPolicy; // at 0x28
};
struct ResAnmShp {
@@ -20,6 +24,14 @@ struct ResAnmShp {
inline bool CheckRevision() const {
return mAnmShp.ref().mRevision == REVISION;
}
+
+ AnmPolicy GetAnmPolicy() const {
+ return mAnmShp.ref().mAnmPolicy;
+ }
+
+ int GetNumFrame() const {
+ return mAnmShp.ref().mNumFrames;
+ }
};
} // namespace g3d
} // namespace nw4r
diff --git a/include/nw4r/g3d/g3d_resanmtexpat.h b/include/nw4r/g3d/g3d_resanmtexpat.h
index e06dfe9c..d7fac863 100644
--- a/include/nw4r/g3d/g3d_resanmtexpat.h
+++ b/include/nw4r/g3d/g3d_resanmtexpat.h
@@ -1,7 +1,8 @@
#ifndef NW4R_G3D_RESANMTEXPAT_H
#define NW4R_G3D_RESANMTEXPAT_H
-#include "g3d_resdict.h"
-#include "g3d_resanm.h"
+#include "nw4r/g3d/g3d_resdict.h"
+#include "nw4r/g3d/g3d_resfile.h"
+#include "nw4r/g3d/g3d_resanm.h"
namespace nw4r
{
@@ -51,6 +52,8 @@ namespace nw4r
char UNK_0x24[0xC];
u16 mTexCount; // at 0x30
u16 mPlttCount; // at 0x32
+ char UNK_0x34[0x4];
+ AnmPolicy mAnmPolicy; // at 0x38
};
struct ResAnmTexPat
@@ -78,6 +81,16 @@ namespace nw4r
{
return static_cast<const ResAnmTexPatMatData *>(mAnmTexPat.ofs_to_obj<ResDic>(ref().mMatDictOffset)[i]);
}
+
+ AnmPolicy GetAnmPolicy() const
+ {
+ return ref().mAnmPolicy;
+ }
+
+ int GetNumFrame() const
+ {
+ return ref().mTexCount;
+ }
void GetAnmResult(TexPatAnmResult *, u32, float) const;
@@ -87,4 +100,4 @@ namespace nw4r
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/g3d/g3d_resanmtexsrt.h b/include/nw4r/g3d/g3d_resanmtexsrt.h
index 563a0e00..e8a4e9f6 100644
--- a/include/nw4r/g3d/g3d_resanmtexsrt.h
+++ b/include/nw4r/g3d/g3d_resanmtexsrt.h
@@ -1,7 +1,8 @@
#ifndef NW4R_G3D_RESANMTEXSRT_H
#define NW4R_G3D_RESANMTEXSRT_H
-#include "g3d_resanm.h"
-#include "g3d_resdict.h"
+#include "nw4r/g3d/g3d_resanm.h"
+#include "nw4r/g3d/g3d_resdict.h"
+#include "nw4r/g3d/g3d_anmtexsrt.h"
namespace nw4r
{
@@ -27,6 +28,10 @@ namespace nw4r
u32 mRevision; // at 0x8
char UNK_0xC[0x4];
s32 mMatDictOffset; // at 0x10
+ char UNK_0x14[0x0C];
+ u16 mNumFrames; // at 0x20
+ UNKWORD UNK_0x24;
+ AnmPolicy mAnmPolicy; // at 0x28
};
struct ResAnmTexSrt
@@ -54,10 +59,20 @@ namespace nw4r
{
return static_cast<const ResAnmTexSrtMatData *>(mAnmTexSrt.ofs_to_obj<ResDic>(ref().mMatDictOffset)[i]);
}
+
+ AnmPolicy GetAnmPolicy() const
+ {
+ return ref().mAnmPolicy;
+ }
+
+ int GetNumFrame() const
+ {
+ return ref().mNumFrames;
+ }
void GetAnmResult(TexSrtAnmResult *, u32, float) const;
};
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/g3d/g3d_resanmvis.h b/include/nw4r/g3d/g3d_resanmvis.h
index 82c28ea1..89bbbd44 100644
--- a/include/nw4r/g3d/g3d_resanmvis.h
+++ b/include/nw4r/g3d/g3d_resanmvis.h
@@ -1,8 +1,8 @@
#ifndef NW4R_G3D_RESANMVIS_H
#define NW4R_G3D_RESANMVIS_H
-#include "g3d_resdict.h"
-#include "g3d_resanm.h"
-#include "g3d_anmobj.h"
+#include "nw4r/g3d/g3d_resdict.h"
+#include "nw4r/g3d/g3d_resanm.h"
+#include "nw4r/g3d/g3d_anmobj.h"
namespace nw4r
{
@@ -10,10 +10,10 @@ namespace nw4r
{
struct ResAnmVisInfoData
{
- char UNK_0x0[0x8];
- u16 mNumFrames; // at 0x1C
+ char UNK_0x0[0xC];
+ u16 mNumFrames; // at 0x20
u16 mNumNodes;
- AnmPolicy mAnmPolicy; // at 0x20
+ AnmPolicy mAnmPolicy; // at 0x24
};
struct ResAnmVisNodeData
@@ -79,4 +79,4 @@ namespace nw4r
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/g3d/g3d_resdict.h b/include/nw4r/g3d/g3d_resdict.h
index 07ecc2e7..9c29db73 100644
--- a/include/nw4r/g3d/g3d_resdict.h
+++ b/include/nw4r/g3d/g3d_resdict.h
@@ -1,31 +1,31 @@
#ifndef NW4R_G3D_RESDICT_H
#define NW4R_G3D_RESDICT_H
#include "common.h"
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_rescommon.h"
#include <string.h>
namespace nw4r {
namespace g3d {
-struct ResDicEntry {
- u16 INT_0x0; // at 0x0
- u16 INT_0x2; // at 0x2
- u16 unk_index; // at 0x4
- u16 unk_index2; // at 0x6
- u32 INT_0x8; // at 0x8
- u32 INT_0xC; // at 0xC
+struct ResDicNodeData {
+ u16 ref; // at 0x0
+ u16 flag; // at 0x2
+ u16 idxLeft; // at 0x4
+ u16 idxRight; // at 0x6
+ u32 ofsString; // at 0x8
+ u32 ofsData; // at 0xC
};
struct ResDicData {
- u32 mSize; // at 0x0
- u32 mNumData; // at 0x4
- ResDicEntry mEntries[]; // 0x8
+ u32 size; // at 0x0
+ u32 numData; // at 0x4
+ ResDicNodeData data[1]; // 0x8
};
struct ResDic {
ResCommon<ResDicData> mDict;
- ResDicEntry *Get(ResName) const;
- ResDicEntry *Get(const char *, u32) const;
+ ResDicNodeData *Get(ResName) const;
+ ResDicNodeData *Get(const char *, u32) const;
void *operator[](const char *) const;
void *operator[](ResName) const;
s32 GetIndex(ResName) const;
@@ -34,7 +34,7 @@ struct ResDic {
inline void *operator[](int i) const {
if (mDict.IsValid()) {
- return (void *)mDict.ofs_to_ptr<void>(mDict.ref().mEntries[i + 1].INT_0xC);
+ return (void *)mDict.ofs_to_ptr<void>(mDict.ref().data[i + 1].ofsData);
}
return NULL;
@@ -42,7 +42,7 @@ struct ResDic {
inline u32 GetNumData() const {
if (mDict.IsValid()) {
- return mDict.ref().mNumData;
+ return mDict.ref().numData;
}
return 0;
diff --git a/include/nw4r/g3d/g3d_resfile.h b/include/nw4r/g3d/g3d_resfile.h
index 597fec6c..9a8c51cd 100644
--- a/include/nw4r/g3d/g3d_resfile.h
+++ b/include/nw4r/g3d/g3d_resfile.h
@@ -1,9 +1,9 @@
#ifndef NW4R_G3D_RESFILE_H
#define NW4R_G3D_RESFILE_H
#include "common.h"
-#include "g3d_rescommon.h"
-#include "g3d_resdict.h"
-#include "ut_binaryFileFormat.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/g3d/g3d_resdict.h"
+#include "nw4r/ut/ut_binaryFileFormat.h"
namespace nw4r {
namespace g3d {
@@ -18,6 +18,9 @@ struct ResFileData {
struct ResFile {
ResCommon<ResFileData> mFile; // at 0x0
+ ResFile(): mFile((void*)nullptr) {}
+ ResFile(void *ptr): mFile(ptr) {}
+
inline ResFileData &ref() const {
return mFile.ref();
}
diff --git a/include/nw4r/g3d/g3d_resmat.h b/include/nw4r/g3d/g3d_resmat.h
index 1c5a6358..7c26d9e9 100644
--- a/include/nw4r/g3d/g3d_resmat.h
+++ b/include/nw4r/g3d/g3d_resmat.h
@@ -1,21 +1,63 @@
#ifndef NW4R_G3D_RESMAT_H
#define NW4R_G3D_RESMAT_H
#include "common.h"
-#include "g3d_rescommon.h"
-#include "math_types.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/math/math_types.h"
#include <rvl/GX.h>
-
namespace nw4r {
namespace g3d {
-struct ResMatTexCoordGenData {};
-struct ResMatTexCoordGen {
- ResCommon<ResMatTexCoordGenData> mTexGen; // at 0x0
+struct ResTevColorDL {
+ union {
+ struct {
+ u8 tevColor[3][20]; // offset 0x0, size 0x3C
+ u8 _0[4]; // offset 0x3C, size 0x4
+ u8 tevKColor[4][10]; // offset 0x40, size 0x28
+ u8 _1[24]; // offset 0x68, size 0x18
+ } dl;
+ u8 data[128];
+ };
+};
+
+struct ResMatTevColor : public ResCommon<ResTevColorDL> {
+ ResMatTevColor(void *vptr) : ResCommon<ResTevColorDL>(vptr) {}
+ void DCStore(bool sync);
+ void CallDisplayList(bool bSync) const;
+ ResMatTevColor CopyTo(void *p) const;
+ void GXGetTevColor(GXTevRegID id, GXColor *color);
+ void GXSetTevColor(GXTevRegID id, GXColor color);
+ void GXSetTevKColor(GXTevKColorID id, GXColor color);
+};
+
+struct ResPixDL {
+ union {
+ struct {
+ unsigned char alphaCompare[5]; // offset 0x0, size 0x5
+ unsigned char zMode[5]; // offset 0x5, size 0x5
+ unsigned char blendMode[10]; // offset 0xA, size 0xA
+ unsigned char setDstAlpha[5]; // offset 0x14, size 0x5
+ unsigned char _[7]; // offset 0x19, size 0x7
+ } dl; // offset 0x0, size 0x20
+ unsigned char data[32]; // offset 0x0, size 0x20
+ };
+};
- inline ResMatTexCoordGen(void *vptr) : mTexGen(vptr) {}
+struct ResMatPix : public ResCommon<ResPixDL> {
+ ResMatPix(void *vptr) : ResCommon(vptr) {}
+ void DCStore(bool sync);
+ void CallDisplayList(bool bSync) const;
+ ResMatPix CopyTo(void *p) const;
+
+ void GXSetBlendMode(GXBlendMode, GXBlendFactor, GXBlendFactor, GXLogicOp);
+};
+
+struct ResTexCoordGenDL {};
+
+struct ResMatTexCoordGen : public ResCommon<ResTexCoordGenDL> {
+ inline ResMatTexCoordGen(void *vptr) : ResCommon(vptr) {}
bool IsValid() const {
- return mTexGen.IsValid();
+ return ResCommon::IsValid();
}
bool GXGetTexCoordGen2(GXTexCoordID, GXTexGenType *, GXTexGenSrc *, u8 *, u32 *);
@@ -23,15 +65,18 @@ struct ResMatTexCoordGen {
void DCStore(bool);
};
-struct ResTexSrtData {};
-
-struct ResTexSrt {
- ResCommon<ResTexSrtData> mTexSrt; // at 0x0
+struct ResTexSrtData {
+ union {
+ struct {
+ unsigned char texCoordGen[8][18]; // offset 0x0, size 0x90
+ unsigned char _[16]; // offset 0x90, size 0x10
+ } dl; // offset 0x0, size 0xA0
+ unsigned char data[160]; // offset 0x0, size 0xA0
+ };
+};
- inline ResTexSrt(void *vptr) : mTexSrt(vptr) {}
- bool IsValid() const {
- return mTexSrt.IsValid();
- }
+struct ResTexSrt : public ResCommon<ResTexSrtData> {
+ inline ResTexSrt(void *vptr) : ResCommon(vptr) {}
void SetMapMode(u32, u32, int, int);
};
@@ -52,32 +97,71 @@ struct ResTexPlttInfo {
};
struct ResMatDLData {
- char UNK_0x0[0xE0];
- ResMatTexCoordGenData texCoordGenData; // at 0xE0
+ ResPixDL dlPix; // offset 0x0, size 0x20
+ ResTevColorDL dlTevColor; // offset 0x20, size 0x80
+ /* ResIndMtxAndScaleDL */ u8 dlIndMtxAndScale[0x40]; // offset 0xA0, size 0x40
+ ResTexCoordGenDL dlTexCoordGen; // offset 0xE0, size 0xA0
+};
+
+struct ResGenModeData {
+ u8 nTexGens; // offset 0x0, size 0x1
+ u8 nChans; // offset 0x1, size 0x1
+ u8 nTevs; // offset 0x2, size 0x1
+ u8 nInds; // offset 0x3, size 0x1
+ GXCullMode cullMode; // offset 0x4, size 0x4
+};
+
+struct ResGenMode : public ResCommon<ResGenModeData> {
+ ResGenMode(void *vptr) : ResCommon(vptr) {}
+ void DCStore(bool sync);
+ ResGenMode CopyTo(void *p) const;
+ GXCullMode GXGetCullMode();
+ u8 GXGetNumIndStages() const;
+ u8 GXGetNumTevStages() const;
+ u8 GXGetNumChans() const;
+ u8 GXGetNumTexGens() const;
+ void GXSetCullMode(GXCullMode);
};
struct ResMatData {
- char UNK_0x0[0x38];
- u32 resMatDLOfs; // at 0x38
- char UNK_0x3C[0x1A4 - 0x3C];
- ResTexSrtData texSrtData; // at 0x1A4
+ u32 size; // offset 0x0, size 0x4
+ s32 toResMdlData; // offset 0x4, size 0x4
+ s32 name; // offset 0x8, size 0x4
+ u32 id; // offset 0xC, size 0x4
+ u32 flag; // offset 0x10, size 0x
+ ResGenModeData genMode; // offset 0x14, size 0x8
+ /* ResMatMiscData */ u8 misc[0xC]; // offset 0x1C, size 0xC
+ s32 toResTevData; // offset 0x28, size 0x4
+ u32 numResTexPlttInfo; // offset 0x2C, size 0x4
+ s32 toResTexPlttInfo; // offset 0x30, size 0x4
+ s32 toResMatFurData; // offset 0x34, size 0x4
+ u32 toResUserData; // offset 0x38, size 0x4
+ u32 toResMatDLData; // offset 0x3C, size 0x4
+ /* ResTexObjData */ u8 texObjData[0x104]; // offset 0x40, size 0x104
+ /* ResTlutObjData */ u8 tlutObjData[0x64]; // offset 0x144, size 0x64
+ ResTexSrtData texSrtData; // offset 0x1A8, size 0x248
+ /* ResChanData */ u8 chan[0x20]; // offset 0x3F0, size 0x28
};
-struct ResMat {
- ResCommon<ResMatData> mMat;
+struct ResMat : public ResCommon<ResMatData> {
+ ResMatTevColor GetResMatTevColor() {
+ return ResMatTevColor(&ofs_to_ptr<ResMatDLData>(ref().toResMatDLData)->dlTevColor);
+ }
- inline ResMat(void *vptr) : mMat(vptr) {}
- bool IsValid() const {
- return mMat.IsValid();
+ ResMatPix GetResMatPix() {
+ return ResMatPix(&ofs_to_ptr<ResMatDLData>(ref().toResMatDLData)->dlPix);
+ }
+
+ ResGenMode GetResGenMode() {
+ return ResGenMode(&ref().genMode);
}
ResTexSrt GetResTexSrt() {
- return ResTexSrt(&mMat.ref().texSrtData);
+ return ResTexSrt(&ref().texSrtData);
}
ResMatTexCoordGen GetResMatTexCoordGen() {
- ResMatDLData *dlData = mMat.ofs_to_ptr<ResMatDLData>(mMat.ref().resMatDLOfs);
- return ResMatTexCoordGen(&dlData->texCoordGenData);
+ return ResMatTexCoordGen(&ofs_to_ptr<ResMatDLData>(ref().toResMatDLData)->dlTexCoordGen);
}
bool Bind(ResFile);
diff --git a/include/nw4r/g3d/g3d_resmdl.h b/include/nw4r/g3d/g3d_resmdl.h
index bf865abf..6a7b4c4f 100644
--- a/include/nw4r/g3d/g3d_resmdl.h
+++ b/include/nw4r/g3d/g3d_resmdl.h
@@ -1,9 +1,9 @@
#ifndef NW4R_G3D_RESMDL_H
#define NW4R_G3D_RESMDL_H
#include "common.h"
-#include "g3d_rescommon.h"
-#include "g3d_resdict.h"
-#include "g3d_resnode.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/g3d/g3d_resdict.h"
+#include "nw4r/g3d/g3d_resnode.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_resnode.h b/include/nw4r/g3d/g3d_resnode.h
index 4e080c9d..67506985 100644
--- a/include/nw4r/g3d/g3d_resnode.h
+++ b/include/nw4r/g3d/g3d_resnode.h
@@ -1,12 +1,14 @@
#ifndef NW4R_G3D_RESNODE_H
#define NW4R_G3D_RESNODE_H
#include "common.h"
-#include "g3d_anmchr.h"
-#include "g3d_rescommon.h"
-#include "math_types.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/math/math_types.h"
namespace nw4r {
namespace g3d {
+
+class ChrAnmResult;
+
struct ResNodeData {
u32 INT_0x0;
s32 INT_0x4;
diff --git a/include/nw4r/g3d/g3d_resshp.h b/include/nw4r/g3d/g3d_resshp.h
index 55cd6f29..eadb88f6 100644
--- a/include/nw4r/g3d/g3d_resshp.h
+++ b/include/nw4r/g3d/g3d_resshp.h
@@ -1,8 +1,8 @@
#ifndef NW4R_G3D_RESSHP_H
#define NW4R_G3D_RESSHP_H
-#include "g3d_rescommon.h"
-#include "g3d_resmdl.h"
-#include "g3d_resvtx.h"
+#include "nw4r/g3d/g3d_rescommon.h"
+#include "nw4r/g3d/g3d_resmdl.h"
+#include "nw4r/g3d/g3d_resvtx.h"
#include <GXAttr.h>#include "common.h"
diff --git a/include/nw4r/g3d/g3d_restev.h b/include/nw4r/g3d/g3d_restev.h
index 14c158ad..9146c1fd 100644
--- a/include/nw4r/g3d/g3d_restev.h
+++ b/include/nw4r/g3d/g3d_restev.h
@@ -2,8 +2,8 @@
#define NW4R_G3D_RESTEV_H
#include <GXTev.h>
#include <GXTexture.h>
-#include "g3d_cpu.h"
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_cpu.h"
+#include "nw4r/g3d/g3d_rescommon.h"
namespace nw4r
{
@@ -58,4 +58,4 @@ namespace nw4r
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/g3d/g3d_restex.h b/include/nw4r/g3d/g3d_restex.h
index 9d85d355..1f9b6596 100644
--- a/include/nw4r/g3d/g3d_restex.h
+++ b/include/nw4r/g3d/g3d_restex.h
@@ -1,7 +1,7 @@
#ifndef NW4R_G3D_RESTEX_H
#define NW4R_G3D_RESTEX_H
#include "common.h"
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_rescommon.h"
#include <rvl/GX.h>
diff --git a/include/nw4r/g3d/g3d_resvtx.h b/include/nw4r/g3d/g3d_resvtx.h
index 717aa0e4..448eaedd 100644
--- a/include/nw4r/g3d/g3d_resvtx.h
+++ b/include/nw4r/g3d/g3d_resvtx.h
@@ -1,7 +1,7 @@
#ifndef NW4R_G3D_RESVTX_H
#define NW4R_G3D_RESVTX_H
#include <GXAttr.h>
-#include "g3d_rescommon.h"
+#include "nw4r/g3d/g3d_rescommon.h"
namespace nw4r
{
@@ -155,4 +155,4 @@ namespace nw4r
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/g3d/g3d_scnmdl.h b/include/nw4r/g3d/g3d_scnmdl.h
index 5f1cb9e9..d453a01e 100644
--- a/include/nw4r/g3d/g3d_scnmdl.h
+++ b/include/nw4r/g3d/g3d_scnmdl.h
@@ -1,9 +1,9 @@
#ifndef NW4R_G3D_SCN_MDL_H
#define NW4R_G3D_SCN_MDL_H
#include "common.h"
-#include "g3d_draw.h"
-#include "g3d_resmat.h"
-#include "g3d_scnmdlsmpl.h"
+#include "nw4r/g3d/g3d_draw.h"
+#include "nw4r/g3d/g3d_resmat.h"
+#include "nw4r/g3d/g3d_scnmdlsmpl.h"
namespace nw4r {
namespace g3d {
@@ -12,13 +12,20 @@ public:
class CopiedMatAccess {
public:
CopiedMatAccess(ScnMdl *, u32);
- ResTexSrt GetResTexSrtEx();
+ ResTexSrt GetResTexSrtEx(bool);
+ ResMatPix GetResMatPix(bool);
+ ResMatTevColor GetResMatTevColor(bool);
+ ResGenMode GetResGenMode(bool);
private:
- char UNK_0x0[0x2C];
+ char UNK_0x0[0x34];
};
public:
+ virtual bool SetAnmObj(AnmObj *p, AnmObjType type) override;
+
+ static ScnMdl *Construct(MEMAllocator *, unsigned long *, nw4r::g3d::ResMdl, u32 bufferOption, int);
+
static const G3dObj::TypeObj GetTypeObjStatic() {
return TypeObj(TYPE_NAME);
}
diff --git a/include/nw4r/g3d/g3d_scnmdl1mat1shp.h b/include/nw4r/g3d/g3d_scnmdl1mat1shp.h
index 5e3d3dc9..ddbf561e 100644
--- a/include/nw4r/g3d/g3d_scnmdl1mat1shp.h
+++ b/include/nw4r/g3d/g3d_scnmdl1mat1shp.h
@@ -1,9 +1,9 @@
#ifndef NW4R_G3D_SCN_MDL1_MAT1_SHP_H
#define NW4R_G3D_SCN_MDL1_MAT1_SHP_H
#include "common.h"
-#include "g3d_resmat.h"
-#include "g3d_resshp.h"
-#include "g3d_scnobj.h"
+#include "nw4r/g3d/g3d_resmat.h"
+#include "nw4r/g3d/g3d_resshp.h"
+#include "nw4r/g3d/g3d_scnobj.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_scnmdlsmpl.h b/include/nw4r/g3d/g3d_scnmdlsmpl.h
index 00ab12a0..342845da 100644
--- a/include/nw4r/g3d/g3d_scnmdlsmpl.h
+++ b/include/nw4r/g3d/g3d_scnmdlsmpl.h
@@ -1,8 +1,10 @@
#ifndef NW4R_G3D_SCN_MDL_SIMPLE_H
#define NW4R_G3D_SCN_MDL_SIMPLE_H
#include "common.h"
-#include "g3d_resmdl.h"
-#include "g3d_scnobj.h"
+#include "nw4r/g3d/g3d_calcworld.h"
+#include "nw4r/g3d/g3d_resmdl.h"
+#include "nw4r/g3d/g3d_scnobj.h"
+#include "nw4r/math/math_types.h"
namespace nw4r {
namespace g3d {
@@ -15,13 +17,31 @@ public:
BYTE_CODE_DRAW_XLU,
};
+ enum AnmObjType {
+ ANMOBJTYPE_CHR = 0,
+ ANMOBJTYPE_VIS = 1,
+ ANMOBJTYPE_MATCLR = 2,
+ ANMOBJTYPE_TEXPAT = 3,
+ ANMOBJTYPE_TEXSRT = 4,
+ ANMOBJTYPE_SHP = 5,
+ ANMOBJTYPE_NOT_SPECIFIED = 6,
+ ANMOBJTYPE_VTX = 5,
+ };
+
public:
ScnMdlSimple(MEMAllocator *, ResMdl, math::MTX34 *, u32 *, math::MTX34 *, math::MTX33 *, math::MTX34 *, int, int);
+ static ScnMdlSimple *Construct(MEMAllocator *, unsigned long *, nw4r::g3d::ResMdl, int);
+
+ bool GetScnMtxPos(math::MTX34 *pOut, ScnObjMtxType tp, u32 nodeID) const;
+
virtual bool IsDerivedFrom(TypeObj other) const // at 0x8
{
return (other == GetTypeObjStatic()) ? true : ScnLeaf::IsDerivedFrom(other);
}
+ static const TypeObj GetTypeObjStatic() {
+ return TypeObj(TYPE_NAME);
+ }
virtual void G3dProc(u32, u32, void *); // at 0xC
virtual ~ScnMdlSimple(); // at 0x10
virtual const TypeObj GetTypeObj() const // at 0x14
@@ -33,7 +53,14 @@ public:
return GetTypeObj().GetTypeName();
}
+ virtual bool SetAnmObj(AnmObj *p, AnmObjType type);
+ virtual bool RemoveAnmObj(AnmObj *p);
+ virtual bool RemoveAnmObj(AnmObjType type);
+ virtual AnmObj *GetAnmObj(AnmObjType type);
+ virtual AnmObj *GetAnmObj(AnmObjType type) const;
+
const u8 *GetByteCode(ByteCodeType) const;
+ void EnableScnMdlCallbackTiming(Timing);
const ResMdl GetResMdl() const {
return mResMdl;
@@ -53,6 +80,10 @@ public:
return mNumViewMtx;
}
+ void SetCalcWorldCallback(ICalcWorldCallback *cb) {
+ mpCalcWorldCallback = cb;
+ }
+
private:
ResMdl mResMdl; // at 0xE8
math::MTX34 *mWldMatrixArray; // at 0xEC
@@ -68,6 +99,8 @@ private:
void *mByteCodeMix; // at 0x10C
void *mByteCodeDrawOpa; // at 0x110
void *mByteCodeDrawXlu; // at 0x114
+ UNKWORD WORD_0x118;
+ ICalcWorldCallback *mpCalcWorldCallback; // at 0x11C
NW4R_G3D_TYPE_OBJ_DECL(ScnMdlSimple);
};
diff --git a/include/nw4r/g3d/g3d_scnobj.h b/include/nw4r/g3d/g3d_scnobj.h
index f10a037e..b40ffbb5 100644
--- a/include/nw4r/g3d/g3d_scnobj.h
+++ b/include/nw4r/g3d/g3d_scnobj.h
@@ -1,9 +1,9 @@
#ifndef NW4R_G3D_SCNOBJ_H
#define NW4R_G3D_SCNOBJ_H
#include "common.h"
-#include "g3d_obj.h"
-#include "math_geometry.h"
-#include "math_types.h"
+#include "nw4r/g3d/g3d_obj.h"
+#include "nw4r/math/math_geometry.h"
+#include "nw4r/math/math_types.h"
namespace nw4r {
namespace g3d {
@@ -23,25 +23,25 @@ public:
enum ForEachResult { FOREACH_RESULT_0, FOREACH_RESULT_1 };
enum ScnObjFlag {
- FLAG_1 = 0x1,
- FLAG_2 = 0x2,
- FLAG_4 = 0x4,
- FLAG_8 = 0x8,
- FLAG_10 = 0x10,
- FLAG_20 = 0x20,
- FLAG_40 = 0x40,
- FLAG_80 = 0x80,
- FLAG_10000000 = 0x10000000,
- FLAG_20000000 = 0x20000000,
- FLAG_40000000 = 0x40000000,
- FLAG_80000000 = 0x80000000,
-
- FLAG_60 = FLAG_40 | FLAG_20
+ SCNOBJFLAG_DISABLE_CALC_WORLD = 1,
+ SCNOBJFLAG_DISABLE_CALC_MAT = 2,
+ SCNOBJFLAG_DISABLE_CALC_VTX = 4,
+ SCNOBJFLAG_DISABLE_CALC_VIEW = 8,
+ SCNOBJFLAG_DISABLE_GATHER_SCNOBJ = 16,
+ SCNOBJFLAG_DISABLE_DRAW_OPA = 32,
+ SCNOBJFLAG_DISABLE_DRAW_XLU = 64,
+ SCNOBJFLAG_DISABLE_UPDATEFRAME = 128,
+ SCNOBJFLAG_IGNORE_ANMCHR_TRANS = 256,
+ SCNOBJFLAG_ENABLE_CULLING = 268435456,
+ SCNOBJFLAG_NOT_GATHER_DRAW_OPA = 536870912,
+ SCNOBJFLAG_NOT_GATHER_DRAW_XLU = 1073741824,
+ SCNOBJFLAG_MTX_LOCAL_IDENTITY = -2147483648,
+ SCNOBJFLAG_DISABLE_DRAW = 96,
};
- enum ScnObjMtxType { MTX_TYPE_0, MTX_TYPE_WORLD, MTX_TYPE_VIEW, MTX_TYPE_MAX };
+ enum ScnObjMtxType { MTX_TYPE_LOCAL, MTX_TYPE_WORLD, MTX_TYPE_VIEW, MTX_TYPE_MAX };
- enum Timing { TIMING_1 = 0x1, TIMING_2 = 0x2, TIMING_4 = 0x4 };
+ enum Timing { TIMING_1 = 0x1, TIMING_2 = 0x2, TIMING_4 = 0x4, TIMING_ALL = 0x7 };
enum ExecOp { EXEC_OP_1 = 0x1, EXEC_OP_2 = 0x2, EXEC_OP_4 = 0x4 };
@@ -88,6 +88,13 @@ public:
void EnableScnObjCallbackExecOp(ExecOp);
bool SetBoundingVolume(ScnObjBoundingVolumeType, const math::AABB *);
bool GetBoundingVolume(ScnObjBoundingVolumeType, math::AABB *) const;
+ void SetCallback(IScnObjCallback *cb) {
+ mCallback = cb;
+ }
+
+ IScnObjCallback *GetScnObjCallback() {
+ return mCallback;
+ }
const math::MTX34 *GetMtxPtr(ScnObjMtxType type) const {
return &mMatrices[type];
@@ -202,6 +209,22 @@ public:
ScaleProperty GetScaleProperty() const;
void DefG3dProcScnLeaf(u32, u32, void *);
+ inline void SetScale(f32 x, f32 y, f32 z) {
+ mScale.x = x;
+ mScale.y = y;
+ mScale.z = z;
+ }
+
+ inline void SetScale(const math::VEC3 &scale) {
+ mScale = scale;
+ }
+
+ inline void GetScale(math::VEC3 *scale) const {
+ if (scale) {
+ *scale = mScale;
+ }
+ }
+
private:
math::VEC3 mScale;
@@ -235,6 +258,10 @@ public:
return TypeObj(TYPE_NAME);
}
+ bool PushBack(ScnObj *obj) {
+ return Insert(Size(), obj);
+ }
+
bool Empty() const {
return mSize == 0;
}
@@ -263,8 +290,6 @@ public:
void ScnGroup_G3DPROC_CALC_VIEW(u32, const math::MTX34 *);
void DefG3dProcScnGroup(u32, u32, void *);
- bool PushBack(ScnObj *);
-
ScnObj **mObjects; // at 0xDC
u32 mCapacity; // at 0xE0
u32 mSize; // at 0xE4
diff --git a/include/nw4r/g3d/g3d_scnproc.h b/include/nw4r/g3d/g3d_scnproc.h
index 45aa86b6..c9d75a1d 100644
--- a/include/nw4r/g3d/g3d_scnproc.h
+++ b/include/nw4r/g3d/g3d_scnproc.h
@@ -1,7 +1,7 @@
#ifndef NW4R_G3D_SCNPROC_H
#define NW4R_G3D_SCNPROC_H
#include "common.h"
-#include "g3d_scnobj.h"
+#include "nw4r/g3d/g3d_scnobj.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/g3d/g3d_scnrfl.h b/include/nw4r/g3d/g3d_scnrfl.h
index cca91279..a5e30e44 100644
--- a/include/nw4r/g3d/g3d_scnrfl.h
+++ b/include/nw4r/g3d/g3d_scnrfl.h
@@ -1,7 +1,7 @@
#ifndef NW4R_G3D_SCNRFL_H
#define NW4R_G3D_SCNRFL_H
#include "common.h"
-#include "g3d_scnleaf.h"
+#include "nw4r/g3d/g3d_scnobj.h"
#include <RFL/RFL_MiddleDatabase.h>
#include <RFL/RFL_Model.h>
diff --git a/include/nw4r/g3d/g3d_scnroot.h b/include/nw4r/g3d/g3d_scnroot.h
index bfd9a9b3..c1e14298 100644
--- a/include/nw4r/g3d/g3d_scnroot.h
+++ b/include/nw4r/g3d/g3d_scnroot.h
@@ -1,9 +1,10 @@
#ifndef NW4R_G3D_SCNROOT_H
#define NW4R_G3D_SCNROOT_H
#include "common.h"
-#include "g3d_camera.h"
-#include "g3d_fog.h"
-#include "g3d_scnobj.h"
+#include "nw4r/g3d/g3d_camera.h"
+#include "nw4r/g3d/g3d_fog.h"
+#include "nw4r/g3d/g3d_light.h"
+#include "nw4r/g3d/g3d_scnobj.h"
namespace nw4r {
namespace g3d {
@@ -14,6 +15,9 @@ public:
void SetCurrentCamera(int);
Fog GetFog(int);
+ static ScnRoot *Construct(MEMAllocator *pHeap, u32 *pSize, u32 maxNumChildren, u32 maxNumScnObj, u32 numLightObj,
+ u32 numLightSet);
+
void UpdateFrame();
void CalcWorld();
void CalcMaterial();
@@ -28,11 +32,17 @@ public:
return mCameraId;
}
+ inline LightSetting *getLightSetting() {
+ return &mLightSetting;
+ }
+
private:
UNKWORD WORD_0xE8;
UNKWORD WORD_0xEC;
UNKWORD WORD_0xF0;
- u8 mCameraId;
+ /* 0x00F4 */ u8 mCameraId;
+ u8 unk1[0x2878 - 0x00F8];
+ /* 0x2878 */ LightSetting mLightSetting;
};
} // namespace g3d
} // namespace nw4r
diff --git a/include/nw4r/g3d/g3d_state.h b/include/nw4r/g3d/g3d_state.h
index 0f16769f..d299b6ec 100644
--- a/include/nw4r/g3d/g3d_state.h
+++ b/include/nw4r/g3d/g3d_state.h
@@ -1,6 +1,7 @@
#ifndef NW4R_G3D_STATE_H
#define NW4R_G3D_STATE_H
#include "common.h"
+#include "nw4r/math.h"
#include <rvl/GX.h>
namespace nw4r {
@@ -12,6 +13,9 @@ void SetViewPosNrmMtxArray(const math::MTX34 *, const math::MTX33 *, const math:
void SetRenderModeObj(const GXRenderModeObj &);
GXRenderModeObj &GetRenderModeObj();
+void LoadLightSet(int idx_lightset, u32 *mask_diff_color /* r1+0xC */, u32 *mask_diff_alpha, u32 *mask_spec_color,
+ u32 *mask_spec_alpha, AmbLightObj *amb);
+
void Invalidate(u32);
} // namespace G3DState
} // namespace g3d
diff --git a/include/nw4r/g3d/g3d_xsi.h b/include/nw4r/g3d/g3d_xsi.h
index fb812e49..a993df96 100644
--- a/include/nw4r/g3d/g3d_xsi.h
+++ b/include/nw4r/g3d/g3d_xsi.h
@@ -1,7 +1,8 @@
#ifndef NW4R_G3D_XSI_H
#define NW4R_G3D_XSI_H
#include "common.h"
-#include "g3d_anmtexsrt.h"
+#include "nw4r/math.h"
+#include "nw4r/g3d/g3d_anmtexsrt.h"
namespace nw4r {
namespace g3d {
diff --git a/include/nw4r/snd/snd_Sound3DActor.h b/include/nw4r/snd/snd_Sound3DActor.h
index 977eab1b..7cc15cc2 100644
--- a/include/nw4r/snd/snd_Sound3DActor.h
+++ b/include/nw4r/snd/snd_Sound3DActor.h
@@ -2,7 +2,7 @@
#define NW4R_SND_SOUND_3D_ACTOR_H
#include "snd_BasicSound.h"
#include "snd_SoundActor.h"
-#include "math_types.h"
+#include "nw4r/math/math_types.h"
namespace nw4r
{
@@ -37,4 +37,4 @@ namespace nw4r
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/nw4r/snd/snd_Sound3DListener.h b/include/nw4r/snd/snd_Sound3DListener.h
index 4e12f717..b770f6d4 100644
--- a/include/nw4r/snd/snd_Sound3DListener.h
+++ b/include/nw4r/snd/snd_Sound3DListener.h
@@ -1,7 +1,7 @@
#ifndef NW4R_SND_SOUND_3D_LISTENER_H
#define NW4R_SND_SOUND_3D_LISTENER_H
#include "common.h"
-#include "math_types.h"
+#include "nw4r/math/math_types.h"
namespace nw4r {
namespace snd {
diff --git a/include/nw4r/snd/snd_Sound3DManager.h b/include/nw4r/snd/snd_Sound3DManager.h
index 432c30df..529a471f 100644
--- a/include/nw4r/snd/snd_Sound3DManager.h
+++ b/include/nw4r/snd/snd_Sound3DManager.h
@@ -4,7 +4,7 @@
#include "snd_SoundArchive.h"
#include "snd_SoundActor.h"
#include "snd_InstancePool.h"
-#include "math_types.h"
+#include "nw4r/math/math_types.h"
namespace nw4r
{
@@ -50,4 +50,4 @@ namespace nw4r
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/include/s/README.txt b/include/s/README.txt
index 00e8279e..53c6cb63 100644
--- a/include/s/README.txt
+++ b/include/s/README.txt
@@ -16,3 +16,9 @@ In order for vtable ordering to match, some classes had to be extracted to a new
S_StateMethod_c's destructors calls back into another destructors. sStateMethodIf_c follows the example of
the other abstract interface classes and provides this dtor.
+
+## operator== / != return BOOL instead of bool
+
+We're observing a lot of word-to-bool casts in code after these
+operators are invoked, and while there are ways to force the conversion,
+this seems the most reasonable.
diff --git a/include/s/s_StateID.hpp b/include/s/s_StateID.hpp
index 422d9143..4c2ee84f 100644
--- a/include/s/s_StateID.hpp
+++ b/include/s/s_StateID.hpp
@@ -27,8 +27,8 @@ public:
virtual bool isNull() const;
virtual bool isEqual(const sStateIDIf_c &other) const;
- virtual bool operator==(const sStateIDIf_c &other) const;
- virtual bool operator!=(const sStateIDIf_c &other) const;
+ virtual BOOL operator==(const sStateIDIf_c &other) const;
+ virtual BOOL operator!=(const sStateIDIf_c &other) const;
virtual bool isSameName(const char *name) const;
virtual const char *name() const;
diff --git a/include/s/s_StateInterfaces.hpp b/include/s/s_StateInterfaces.hpp
index 8e28f44c..92101b2c 100644
--- a/include/s/s_StateInterfaces.hpp
+++ b/include/s/s_StateInterfaces.hpp
@@ -23,8 +23,8 @@ public:
virtual bool isNull() const = 0; ///< Returns whether this is a null state.
virtual bool isEqual(const sStateIDIf_c &other) const = 0; ///< Returns whether both states have the same number.
- virtual bool operator==(const sStateIDIf_c &other) const = 0; ///< Overloaded equality operator, using ::isEqual.
- virtual bool operator!=(const sStateIDIf_c &other) const = 0; ///< Overloaded inequality operator, using ::isEqual.
+ virtual BOOL operator==(const sStateIDIf_c &other) const = 0; ///< Overloaded equality operator, using ::isEqual.
+ virtual BOOL operator!=(const sStateIDIf_c &other) const = 0; ///< Overloaded inequality operator, using ::isEqual.
virtual bool isSameName(const char *name) const = 0; ///< Returns whether this state ID is called @p name.
virtual const char *name() const = 0; ///< Returns the name of this state ID.
diff --git a/include/s/s_StateMgr.hpp b/include/s/s_StateMgr.hpp
index c043eb71..09f5f217 100644
--- a/include/s/s_StateMgr.hpp
+++ b/include/s/s_StateMgr.hpp
@@ -35,6 +35,11 @@ public:
virtual const sStateIDIf_c *getStateID() const { return mMethod.getStateID(); }
virtual const sStateIDIf_c *getOldStateID() const { return mMethod.getOldStateID(); }
+ // SS addition
+ bool isState(const sStateIDIf_c& other) {
+ return *getStateID() == other;
+ }
+
private:
Check mCheck;
Factory<T> mFactory;
diff --git a/include/toBeSorted/arc_managers/current_stage_arc_manager.h b/include/toBeSorted/arc_managers/current_stage_arc_manager.h
index f4f11ce5..26194c8d 100644
--- a/include/toBeSorted/arc_managers/current_stage_arc_manager.h
+++ b/include/toBeSorted/arc_managers/current_stage_arc_manager.h
@@ -6,15 +6,10 @@
#include <sized_string.h>
class CurrentStageArcManager {
+public:
CurrentStageArcManager();
virtual ~CurrentStageArcManager();
- SizedString<32> mStageName;
- SizedString<32> mCurrentLoadingStageArcName;
- SizedString<32> mStageExtraLayerArcName;
-
- dRawArcTable_c mArcTable;
-
static CurrentStageArcManager *sInstance;
static bool create(EGG::Heap *heap);
@@ -36,6 +31,13 @@ class CurrentStageArcManager {
const char *getRoomArcDirectory(int room) const;
static EGG::ExpHeap *getHeap();
+
+private:
+ SizedString<32> mStageName;
+ SizedString<32> mCurrentLoadingStageArcName;
+ SizedString<32> mStageExtraLayerArcName;
+
+ dRawArcTable_c mArcTable;
};
#endif
diff --git a/include/toBeSorted/scgame.h b/include/toBeSorted/scgame.h
index 229c0e7a..32e9538b 100644
--- a/include/toBeSorted/scgame.h
+++ b/include/toBeSorted/scgame.h
@@ -4,7 +4,7 @@
#include <common.h>
struct SpawnInfo {
- /* 0x00 */ char stageName[32];
+ /* 0x00 */ char stageName[32]; // Probably SizedString<32>
/* 0x20 */ s16 transitionFadeFrames;
/* 0x22 */ s8 room;
/* 0x23 */ s8 layer;