From 4e40d0643968886b2c8cdacfed655400fd8ffb49 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 23 Sep 2023 18:33:12 -0700 Subject: [PATCH] J3DShapeMtx progress --- include/JSystem/J3DGraphBase/J3DShape.h | 30 +-- include/JSystem/J3DGraphBase/J3DShapeMtx.h | 81 ++++-- include/JSystem/J3DGraphBase/J3DSys.h | 80 +++--- src/JSystem/J3DGraphBase/J3DShape.cpp | 4 +- src/JSystem/J3DGraphBase/J3DShapeMtx.cpp | 294 +++++++++++++++------ src/JSystem/J3DGraphBase/J3DSys.cpp | 2 +- 6 files changed, 343 insertions(+), 148 deletions(-) diff --git a/include/JSystem/J3DGraphBase/J3DShape.h b/include/JSystem/J3DGraphBase/J3DShape.h index a1fdf2479..a4a95716d 100644 --- a/include/JSystem/J3DGraphBase/J3DShape.h +++ b/include/JSystem/J3DGraphBase/J3DShape.h @@ -72,22 +72,22 @@ public: kVcdVatDLSize = 0xC0, }; - /* 80314B48 */ void initialize(); - /* 80314BB8 */ void addTexMtxIndexInDL(_GXAttr, u32); - /* 80314CBC */ void addTexMtxIndexInVcd(_GXAttr); - /* 80314DA8 */ void calcNBTScale(Vec const&, f32 (*)[3][3], f32 (*)[3][3]); - /* 80314E28 */ u32 countBumpMtxNum() const; - /* 80314EEC */ void loadVtxArray() const; - /* 80314F5C */ bool isSameVcdVatCmd(J3DShape*); - /* 80314F98 */ void makeVtxArrayCmd(); - /* 80315260 */ void makeVcdVatCmd(); - /* 80315300 */ void loadPreDrawSetting() const; - /* 80315398 */ void setArrayAndBindPipeline() const; + void initialize(); + void addTexMtxIndexInDL(_GXAttr, u32); + void addTexMtxIndexInVcd(_GXAttr); + void calcNBTScale(Vec const&, Mtx33*, Mtx33*); + u32 countBumpMtxNum() const; + void loadVtxArray() const; + bool isSameVcdVatCmd(J3DShape*); + void makeVtxArrayCmd(); + void makeVcdVatCmd(); + void loadPreDrawSetting() const; + void setArrayAndBindPipeline() const; - /* 803155E0 */ virtual void draw() const; - /* 8031544C */ virtual void drawFast() const; - /* 80315628 */ virtual void simpleDraw() const; - /* 803156AC */ virtual void simpleDrawCache() const; + virtual void draw() const; + virtual void drawFast() const; + virtual void simpleDraw() const; + virtual void simpleDrawCache() const; void onFlag(u32 flag) { mFlags |= flag; } void offFlag(u32 flag) { mFlags &= ~flag; } diff --git a/include/JSystem/J3DGraphBase/J3DShapeMtx.h b/include/JSystem/J3DGraphBase/J3DShapeMtx.h index 8c2a29f8a..5435ed7df 100644 --- a/include/JSystem/J3DGraphBase/J3DShapeMtx.h +++ b/include/JSystem/J3DGraphBase/J3DShapeMtx.h @@ -27,13 +27,10 @@ public: static J3DTexMtxObj* sTexMtxObj; }; -extern u8 struct_804515B0; -extern u8 struct_804515B1; -extern u8 struct_804515B2; -extern u8 struct_804515B3; - class J3DShapeMtx { public: + typedef void (J3DShapeMtx::*MtxLoadIndx)(int mtxNo, u16 index) const; + J3DShapeMtx(u16 useMtxIndex) : mUseMtxIndex(useMtxIndex) {} void resetMtxLoadCache(); @@ -49,25 +46,58 @@ public: virtual void load() const; virtual void calcNBTScale(Vec const&, f32 (*)[3][3], f32 (*)[3][3]); - static u8 sMtxLoadPipeline[48]; - static u16 sMtxLoadCache[10 + 2 /* padding */]; + static MtxLoadIndx sMtxLoadPipeline[4]; static u32 sCurrentPipeline; - // static J3DScaleFlag sCurrentScaleFlag; static u8* sCurrentScaleFlag; static u8 sNBTFlag; - static u32 sTexMtxLoadType; static void setCurrentPipeline(u32 pipeline) { sCurrentPipeline = pipeline; } - static void setLODFlag(u8 flag) { struct_804515B1 = flag; } - static u8 getLODFlag() { return struct_804515B1; } static void resetMtxLoadCache(); -private: +protected: /* 0x04 */ u16 mUseMtxIndex; }; +class J3DShapeMtxImm : public J3DShapeMtx { +public: + typedef void (J3DShapeMtxImm::*MtxLoadImm)(int mtxNo, u16 index) const; + + J3DShapeMtxImm(u16 useMtxIndex) : J3DShapeMtx(useMtxIndex) {} + + virtual ~J3DShapeMtxImm(); + virtual u32 getType() const; + virtual void load() const; + virtual void loadNrmMtx(int, u16) const; + + void loadMtxImm_PNGP(int, u16) const; + void loadMtxImm_PCPU(int, u16) const; + void loadMtxImm_NCPU(int, u16) const; + void loadMtxImm_PNCPU(int, u16) const; + void loadMtxImm_PNGP_LOD(int, u16) const; + + static MtxLoadImm sMtxLoadPipeline[4]; +}; + +class J3DShapeMtxMultiImm : public J3DShapeMtxImm { +public: + J3DShapeMtxMultiImm(u16 useMtxIndex) : J3DShapeMtxImm(useMtxIndex) {} + + virtual ~J3DShapeMtxMultiImm(); + virtual u32 getType() const; + virtual u32 getUseMtxNum() const; + virtual u32 getUseMtxIndex(u16) const; + virtual void load() const; + virtual void loadNrmMtx(int, u16) const; + +private: + /* 0x6 */ u16 mUseMtxNum; + /* 0x8 */ u16* mUseMtxIndexTable; +}; + class J3DShapeMtxConcatView : public J3DShapeMtx { public: + typedef void (J3DShapeMtxConcatView::*MtxLoadConcatView)(int mtxNo, u16 index) const; + J3DShapeMtxConcatView(u16 useMtxIndex) : J3DShapeMtx(useMtxIndex) {} virtual ~J3DShapeMtxConcatView(); @@ -82,9 +112,26 @@ public: void loadMtxConcatView_PNCPU(int, u16) const; void loadMtxConcatView_PNGP_LOD(int, u16) const; - static u8 sMtxLoadPipeline[48]; - static u8 sMtxLoadLODPipeline[48]; - static u8 sMtxPtrTbl[8]; + static MtxLoadConcatView sMtxLoadPipeline[4]; + static Mtx * sMtxPtrTbl[2]; +}; + +class J3DShapeMtxBBoardImm : public J3DShapeMtxImm { +public: + J3DShapeMtxBBoardImm(u16 useMtxIndex) : J3DShapeMtxImm(useMtxIndex) {} + + virtual ~J3DShapeMtxBBoardImm(); + virtual u32 getType() const; + virtual void load() const; +}; + +class J3DShapeMtxYBBoardImm : public J3DShapeMtxImm { +public: + J3DShapeMtxYBBoardImm(u16 useMtxIndex) : J3DShapeMtxImm(useMtxIndex) {} + + virtual ~J3DShapeMtxYBBoardImm(); + virtual u32 getType() const; + virtual void load() const; }; class J3DShapeMtxYBBoardConcatView : public J3DShapeMtxConcatView { @@ -115,7 +162,7 @@ public: virtual u32 getUseMtxNum() const; virtual u32 getUseMtxIndex(u16) const; virtual void load() const; - virtual void calcNBTScale(Vec const&, f32 (*)[3][3], f32 (*)[3][3]); + virtual void calcNBTScale(Vec const&, Mtx33*, Mtx33*); private: /* 0x6 */ u16 mUseMtxNum; @@ -141,4 +188,4 @@ private: /* 0x8 */ u16* mUseMtxIndexTable; }; -#endif /* J3DSHAPEMTX_H */ \ No newline at end of file +#endif /* J3DSHAPEMTX_H */ diff --git a/include/JSystem/J3DGraphBase/J3DSys.h b/include/JSystem/J3DGraphBase/J3DSys.h index 471bd69a4..7fd030089 100644 --- a/include/JSystem/J3DGraphBase/J3DSys.h +++ b/include/JSystem/J3DGraphBase/J3DSys.h @@ -30,45 +30,7 @@ enum J3DSysFlag { }; struct J3DSys { - /* 0x000 */ Mtx mViewMtx; - /* 0x030 */ J3DMtxCalc* mCurrentMtxCalc; - /* 0x034 */ u32 mFlags; - /* 0x038 */ J3DModel* mModel; - /* 0x03C */ J3DMatPacket* mMatPacket; - /* 0x040 */ J3DShapePacket* mShapePacket; - /* 0x044 */ J3DShape* mShape; - /* 0x048 */ J3DDrawBuffer* mDrawBuffer[2]; - /* 0x050 */ u32 mDrawMode; - /* 0x054 */ u32 mMaterialMode; - /* 0x058 */ J3DTexture* mTexture; - /* 0x05C */ u8 field_0x5c[0x04]; - /* 0x060 */ u32 mTexCacheRegionNum; - /* 0x064 */ GXTexRegion mTexCacheRegion[8]; - /* 0x0E4 */ u8 field_0xe4[0x20]; - /* 0x104 */ void* field_0x104; - /* 0x108 */ Mtx* mModelDrawMtx; - /* 0x10C */ Mtx33* mModelNrmMtx; - /* 0x110 */ void* mVtxPos; - /* 0x114 */ void* mVtxNrm; - /* 0x118 */ _GXColor* mVtxCol; - /* 0x11C */ Vec* mNBTScale; - /* 0x120 */ void* field_0x120; - /* 0x124 */ void* field_0x124; - - J3DSys(); - void loadPosMtxIndx(int, u16) const; - void loadNrmMtxIndx(int, u16) const; - void setTexCacheRegion(_GXTexCacheSize); - void drawInit(); - void reinitGX(); - void reinitGenMode(); - void reinitLighting(); - void reinitTransform(); - void reinitTexture(); - void reinitTevStages(); - void reinitIndStages(); - void reinitPixelProc(); - +public: enum DrawMode { /* 0x3 */ OPA_TEX_EDGE = 3, /* 0x4 */ XLU, @@ -130,11 +92,51 @@ struct J3DSys { void setViewMtx(Mtx m) { MTXCopy(m, mViewMtx); } J3DModel* getModel() { return mModel; } + Vec& getNBTScale() { return *mNBTScale; } static Mtx mCurrentMtx; static Vec mCurrentS; static Vec mParentS; static u16 sTexCoordScaleTable[32]; + + /* 0x000 */ Mtx mViewMtx; + /* 0x030 */ J3DMtxCalc* mCurrentMtxCalc; + /* 0x034 */ u32 mFlags; + /* 0x038 */ J3DModel* mModel; + /* 0x03C */ J3DMatPacket* mMatPacket; + /* 0x040 */ J3DShapePacket* mShapePacket; + /* 0x044 */ J3DShape* mShape; + /* 0x048 */ J3DDrawBuffer* mDrawBuffer[2]; + /* 0x050 */ u32 mDrawMode; + /* 0x054 */ u32 mMaterialMode; + /* 0x058 */ J3DTexture* mTexture; + /* 0x05C */ u8 field_0x5c[0x04]; + /* 0x060 */ u32 mTexCacheRegionNum; + /* 0x064 */ GXTexRegion mTexCacheRegion[8]; + /* 0x0E4 */ u8 field_0xe4[0x20]; + /* 0x104 */ void* field_0x104; + /* 0x108 */ Mtx* mModelDrawMtx; + /* 0x10C */ Mtx33* mModelNrmMtx; + /* 0x110 */ void* mVtxPos; + /* 0x114 */ void* mVtxNrm; + /* 0x118 */ _GXColor* mVtxCol; + /* 0x11C */ void* field_0x11c; + /* 0x120 */ void* field_0x120; + /* 0x124 */ Vec* mNBTScale; + + J3DSys(); + void loadPosMtxIndx(int, u16) const; + void loadNrmMtxIndx(int, u16) const; + void setTexCacheRegion(_GXTexCacheSize); + void drawInit(); + void reinitGX(); + void reinitGenMode(); + void reinitLighting(); + void reinitTransform(); + void reinitTexture(); + void reinitTevStages(); + void reinitIndStages(); + void reinitPixelProc(); }; extern u32 j3dDefaultViewNo; diff --git a/src/JSystem/J3DGraphBase/J3DShape.cpp b/src/JSystem/J3DGraphBase/J3DShape.cpp index 966890774..76ed4ab02 100644 --- a/src/JSystem/J3DGraphBase/J3DShape.cpp +++ b/src/JSystem/J3DGraphBase/J3DShape.cpp @@ -44,9 +44,9 @@ void J3DShape::initialize() { } /* 802DD1FC-802DD27C .text calcNBTScale__8J3DShapeFRC3VecPA3_A3_fPA3_A3_f */ -void J3DShape::calcNBTScale(Vec const& param_0, Mtx33* param_1, Mtx33* param_2) { +void J3DShape::calcNBTScale(Vec const& scale, Mtx33* pSrc, Mtx33* pDst) { for (u16 i = 0; i < getMtxGroupNum(); i++) - getShapeMtx(i)->calcNBTScale(param_0, param_1, param_2); + getShapeMtx(i)->calcNBTScale(scale, pSrc, pDst); } /* 802DD27C-802DD2F0 .text countBumpMtxNum__8J3DShapeCFv */ diff --git a/src/JSystem/J3DGraphBase/J3DShapeMtx.cpp b/src/JSystem/J3DGraphBase/J3DShapeMtx.cpp index 4db60deeb..ade45064f 100644 --- a/src/JSystem/J3DGraphBase/J3DShapeMtx.cpp +++ b/src/JSystem/J3DGraphBase/J3DShapeMtx.cpp @@ -4,136 +4,282 @@ // #include "JSystem/J3DGraphBase/J3DShapeMtx.h" -#include "dolphin/types.h" +#include "JSystem/J3DGraphBase/J3DGD.h" +#include "JSystem/J3DGraphBase/J3DPacket.h" +#include "JSystem/J3DGraphAnimator/J3DModel.h" +#include "JSystem/J3DGraphBase/J3DShapeDraw.h" +#include "JSystem/J3DGraphBase/J3DSys.h" + +extern void J3DFifoLoadNrmMtxImm(Mtx, u32); +extern void J3DFifoLoadNrmMtxImm3x3(Mtx33, u32); +extern void J3DFifoLoadPosMtxImm(Mtx, u32); +extern void J3DPSMtx33Copy(Mtx33, Mtx33); +extern void J3DScaleNrmMtx(Mtx, Vec const &); +extern void J3DScaleNrmMtx33(Mtx33, Vec const &); +extern void J3DCalcBBoardMtx(Mtx); + +u32 J3DShapeMtx::sCurrentPipeline; /* 802DB9D8-802DBA1C .text loadMtxIndx_PNGP__11J3DShapeMtxCFiUs */ -void J3DShapeMtx::loadMtxIndx_PNGP(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtx::loadMtxIndx_PNGP(int mtxNo, u16 index) const { + J3DFifoLoadIndx(GX_CMD_LOAD_INDX_A, index, 0xB000 | ((u16)(mtxNo * 0x0C))); + J3DFifoLoadIndx(GX_CMD_LOAD_INDX_B, index, 0x8000 | ((u16)((mtxNo * 0x09) + 0x400))); } /* 802DBA1C-802DBA7C .text loadMtxIndx_PCPU__11J3DShapeMtxCFiUs */ -void J3DShapeMtx::loadMtxIndx_PCPU(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtx::loadMtxIndx_PCPU(int mtxNo, u16 index) const { + J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); + j3dSys.loadNrmMtxIndx(mtxNo, index); } /* 802DBA7C-802DBAC8 .text loadMtxIndx_NCPU__11J3DShapeMtxCFiUs */ -void J3DShapeMtx::loadMtxIndx_NCPU(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtx::loadMtxIndx_NCPU(int mtxNo, u16 index) const { + j3dSys.loadPosMtxIndx(mtxNo, index); + J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); } /* 802DBAC8-802DBB20 .text loadMtxIndx_PNCPU__11J3DShapeMtxCFiUs */ -void J3DShapeMtx::loadMtxIndx_PNCPU(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtx::loadMtxIndx_PNCPU(int mtxNo, u16 index) const { + J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); + J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); } /* 802DBB20-802DBB94 .text loadMtxImm_PNGP__14J3DShapeMtxImmCFiUs */ -void J3DShapeMtxImm::loadMtxImm_PNGP(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtxImm::loadMtxImm_PNGP(int mtxNo, u16 index) const { + J3DFifoLoadPosMtxImm(j3dSys.getModelDrawMtx(index), mtxNo * 3); + loadNrmMtx(mtxNo, index); } /* 802DBB94-802DBC00 .text loadMtxImm_PCPU__14J3DShapeMtxImmCFiUs */ -void J3DShapeMtxImm::loadMtxImm_PCPU(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtxImm::loadMtxImm_PCPU(int mtxNo, u16 index) const { + J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); + loadNrmMtx(mtxNo, index); } /* 802DBC00-802DBC60 .text loadMtxImm_NCPU__14J3DShapeMtxImmCFiUs */ -void J3DShapeMtxImm::loadMtxImm_NCPU(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtxImm::loadMtxImm_NCPU(int mtxNo, u16 index) const { + J3DFifoLoadPosMtxImm(j3dSys.getModelDrawMtx(index), mtxNo * 3); + J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); } /* 802DBC60-802DBCB8 .text loadMtxImm_PNCPU__14J3DShapeMtxImmCFiUs */ -void J3DShapeMtxImm::loadMtxImm_PNCPU(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtxImm::loadMtxImm_PNCPU(int mtxNo, u16 index) const { + J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); + J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); } /* 802DBCB8-802DBD44 .text loadMtxConcatView_PNGP__21J3DShapeMtxConcatViewCFiUs */ -void J3DShapeMtxConcatView::loadMtxConcatView_PNGP(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtxConcatView::loadMtxConcatView_PNGP(int mtxNo, u16 index) const { + Mtx mtx; + MTXConcat(*j3dSys.getShapePacket()->getBaseMtxPtr(), j3dSys.getModelDrawMtx(index), mtx); + J3DFifoLoadPosMtxImm(mtx, mtxNo * 3); + loadNrmMtx(mtxNo, index, mtx); } /* 802DBD44-802DBDD4 .text loadMtxConcatView_PCPU__21J3DShapeMtxConcatViewCFiUs */ -void J3DShapeMtxConcatView::loadMtxConcatView_PCPU(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtxConcatView::loadMtxConcatView_PCPU(int mtxNo, u16 index) const { + Mtx mtx; + MTXConcat(*j3dSys.getShapePacket()->getBaseMtxPtr(), j3dSys.getModelDrawMtx(index), mtx); + J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); + loadNrmMtx(mtxNo, index, mtx); } /* 802DBDD4-802DBE4C .text loadMtxConcatView_NCPU__21J3DShapeMtxConcatViewCFiUs */ -void J3DShapeMtxConcatView::loadMtxConcatView_NCPU(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtxConcatView::loadMtxConcatView_NCPU(int mtxNo, u16 index) const { + Mtx mtx; + MTXConcat(*j3dSys.getShapePacket()->getBaseMtxPtr(), j3dSys.getModelDrawMtx(index), mtx); + J3DFifoLoadPosMtxImm(mtx, mtxNo * 3); + J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); } /* 802DBE4C-802DBEA4 .text loadMtxConcatView_PNCPU__21J3DShapeMtxConcatViewCFiUs */ -void J3DShapeMtxConcatView::loadMtxConcatView_PNCPU(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtxConcatView::loadMtxConcatView_PNCPU(int mtxNo, u16 index) const { + J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); + J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), mtxNo * 3); } +J3DShapeMtx::MtxLoadIndx J3DShapeMtx::sMtxLoadPipeline[] = { + &J3DShapeMtx::loadMtxIndx_PNGP, + &J3DShapeMtx::loadMtxIndx_PCPU, + &J3DShapeMtx::loadMtxIndx_NCPU, + &J3DShapeMtx::loadMtxIndx_PNCPU, +}; + /* 802DBEA4-802DBF00 .text load__11J3DShapeMtxCFv */ void J3DShapeMtx::load() const { - /* Nonmatching */ + MtxLoadIndx f = sMtxLoadPipeline[sCurrentPipeline]; + (this->*f)(0, mUseMtxIndex); } /* 802DBF00-802DBF60 .text calcNBTScale__11J3DShapeMtxFRC3VecPA3_A3_fPA3_A3_f */ -void J3DShapeMtx::calcNBTScale(const Vec&, float(*)[3][3], float(*)[3][3]) { - /* Nonmatching */ +void J3DShapeMtx::calcNBTScale(const Vec& scale, Mtx33* pSrc, Mtx33* pDst) { + J3DPSMtx33Copy(pSrc[mUseMtxIndex], pDst[mUseMtxIndex]); + J3DScaleNrmMtx33(pDst[mUseMtxIndex], scale); } +J3DShapeMtxImm::MtxLoadImm J3DShapeMtxImm::sMtxLoadPipeline[] = { + &J3DShapeMtxImm::loadMtxImm_PNGP, + &J3DShapeMtxImm::loadMtxImm_PCPU, + &J3DShapeMtxImm::loadMtxImm_NCPU, + &J3DShapeMtxImm::loadMtxImm_PNCPU, +}; + /* 802DBF60-802DBFBC .text load__14J3DShapeMtxImmCFv */ void J3DShapeMtxImm::load() const { - /* Nonmatching */ + MtxLoadImm f = sMtxLoadPipeline[sCurrentPipeline]; + (this->*f)(0, mUseMtxIndex); } +J3DShapeMtxConcatView::MtxLoadConcatView J3DShapeMtxConcatView::sMtxLoadPipeline[] = { + &J3DShapeMtxConcatView::loadMtxConcatView_PNGP, + &J3DShapeMtxConcatView::loadMtxConcatView_PCPU, + &J3DShapeMtxConcatView::loadMtxConcatView_NCPU, + &J3DShapeMtxConcatView::loadMtxConcatView_PNCPU, +}; + +Mtx * J3DShapeMtxConcatView::sMtxPtrTbl[2]; + /* 802DBFBC-802DC08C .text load__21J3DShapeMtxConcatViewCFv */ void J3DShapeMtxConcatView::load() const { - /* Nonmatching */ + sMtxPtrTbl[0] = j3dSys.getModel()->mpNodeMtx; + sMtxPtrTbl[1] = j3dSys.getModel()->mpWeightEnvMtx; + + MtxLoadConcatView f = sMtxLoadPipeline[sCurrentPipeline]; + j3dSys.setModelDrawMtx(sMtxPtrTbl[j3dSys.getModel()->getModelData()->getDrawMtxFlag(mUseMtxIndex)]); + (this->*f)(0, j3dSys.getModel()->getModelData()->getDrawMtxIndex(mUseMtxIndex)); } /* 802DC08C-802DC184 .text loadNrmMtx__14J3DShapeMtxImmCFiUs */ -void J3DShapeMtxImm::loadNrmMtx(int, unsigned short) const { - /* Nonmatching */ +void J3DShapeMtxImm::loadNrmMtx(int mtxNo, u16 index) const { + if (J3DShapeMtx::sCurrentScaleFlag[index] == 1) { + if (J3DShapeMtx::sNBTFlag == 0) { + J3DFifoLoadNrmMtxImm(j3dSys.getModelDrawMtx(index), 0); + } else { + Mtx33 mtx; + J3DPSMtx33CopyFrom34(j3dSys.getModelDrawMtx(index), mtx); + J3DScaleNrmMtx33(mtx, j3dSys.getNBTScale()); + J3DFifoLoadNrmMtxImm3x3(mtx, 0); + } + } else { + Mtx33 mtx; + J3DPSCalcInverseTranspose(j3dSys.getModelDrawMtx(index), mtx); + + if (J3DShapeMtx::sNBTFlag == 0) { + J3DFifoLoadNrmMtxImm(j3dSys.getModelDrawMtx(index), 0); + } else { + J3DScaleNrmMtx33(mtx, j3dSys.getNBTScale()); + J3DFifoLoadNrmMtxImm3x3(mtx, 0); + } + } } /* 802DC184-802DC254 .text loadNrmMtx__21J3DShapeMtxConcatViewCFiUsPA4_f */ -void J3DShapeMtxConcatView::loadNrmMtx(int, unsigned short, float(*)[4]) const { - /* Nonmatching */ +void J3DShapeMtxConcatView::loadNrmMtx(int mtxNo, u16 index, Mtx mtx) const { } /* 802DC254-802DC2F4 .text load__16J3DShapeMtxMultiCFv */ void J3DShapeMtxMulti::load() const { - /* Nonmatching */ + MtxLoadIndx f = sMtxLoadPipeline[sCurrentPipeline]; + + for (s32 i = 0; i < mUseMtxNum; i++) { + if (mUseMtxIndexTable[i] != 0xFFFF) { + (this->*f)(i, mUseMtxIndexTable[i]); + } + } } /* 802DC2F4-802DC388 .text calcNBTScale__16J3DShapeMtxMultiFRC3VecPA3_A3_fPA3_A3_f */ -void J3DShapeMtxMulti::calcNBTScale(const Vec&, float(*)[3][3], float(*)[3][3]) { +void J3DShapeMtxMulti::calcNBTScale(const Vec&, Mtx33*, Mtx33*) { /* Nonmatching */ } /* 802DC388-802DC428 .text load__19J3DShapeMtxMultiImmCFv */ void J3DShapeMtxMultiImm::load() const { - /* Nonmatching */ + MtxLoadImm f = sMtxLoadPipeline[sCurrentPipeline]; + + for (s32 i = 0; i < mUseMtxNum; i++) { + if (mUseMtxIndexTable[i] != 0xFFFF) { + (this->*f)(i, mUseMtxIndexTable[i]); + } + } } /* 802DC428-802DC524 .text load__26J3DShapeMtxMultiConcatViewCFv */ void J3DShapeMtxMultiConcatView::load() const { - /* Nonmatching */ + sMtxPtrTbl[0] = j3dSys.getModel()->mpNodeMtx; + sMtxPtrTbl[1] = j3dSys.getModel()->mpWeightEnvMtx; + + MtxLoadConcatView f = sMtxLoadPipeline[sCurrentPipeline]; + + for (s32 i = 0; i < mUseMtxNum; i++) { + u16 useMtxIndex = mUseMtxIndexTable[i]; + if (useMtxIndex != 0xFFFF) { + u16 drawMtxIndex = j3dSys.getModel()->getModelData()->getDrawMtxIndex(useMtxIndex); + j3dSys.setModelDrawMtx(sMtxPtrTbl[j3dSys.getModel()->getModelData()->getDrawMtxFlag(useMtxIndex)]); + (this->*f)(i, drawMtxIndex); + } + } } /* 802DC524-802DC620 .text loadNrmMtx__19J3DShapeMtxMultiImmCFiUs */ -void J3DShapeMtxMultiImm::loadNrmMtx(int, unsigned short) const { +void J3DShapeMtxMultiImm::loadNrmMtx(int mtxNo, u16 index) const { /* Nonmatching */ } /* 802DC620-802DC6F4 .text loadNrmMtx__26J3DShapeMtxMultiConcatViewCFiUsPA4_f */ -void J3DShapeMtxMultiConcatView::loadNrmMtx(int, unsigned short, float(*)[4]) const { +void J3DShapeMtxMultiConcatView::loadNrmMtx(int, u16, Mtx) const { /* Nonmatching */ } /* 802DC6F4-802DC7B8 .text load__20J3DShapeMtxBBoardImmCFv */ void J3DShapeMtxBBoardImm::load() const { - /* Nonmatching */ + Mtx mtx; + MTXCopy(j3dSys.getModelDrawMtx(mUseMtxIndex), mtx); + J3DCalcBBoardMtx(mtx); + J3DFifoLoadPosMtxImm(mtx, 0); + + mtx[0][0] = 1.0f / mtx[0][0]; + mtx[1][1] = 1.0f / mtx[1][1]; + mtx[2][2] = 1.0f / mtx[2][2]; + mtx[0][3] = 0.0f; + mtx[1][3] = 0.0f; + mtx[2][3] = 0.0f; + + if (sNBTFlag == 0) { + J3DFifoLoadNrmMtxImm(mtx, 0); + } else { + J3DScaleNrmMtx(mtx, j3dSys.getNBTScale()); + J3DFifoLoadNrmMtxImm(mtx, 0); + } } /* 802DC7B8-802DC8C0 .text load__27J3DShapeMtxBBoardConcatViewCFv */ void J3DShapeMtxBBoardConcatView::load() const { - /* Nonmatching */ + u16 drawMtxIndex = j3dSys.getModel()->getModelData()->getDrawMtxIndex(mUseMtxIndex); + + Mtx mtx; + if (j3dSys.getModel()->getModelData()->getDrawMtxFlag(mUseMtxIndex) == 0) { + MTXConcat(j3dSys.getViewMtx(), j3dSys.getModel()->mpNodeMtx[drawMtxIndex], mtx); + } else { + MTXConcat(j3dSys.getViewMtx(), j3dSys.getModel()->mpWeightEnvMtx[drawMtxIndex], mtx); + } + + J3DCalcBBoardMtx(mtx); + J3DFifoLoadPosMtxImm(mtx, 0); + + mtx[0][0] = 1.0f / mtx[0][0]; + mtx[1][1] = 1.0f / mtx[1][1]; + mtx[2][2] = 1.0f / mtx[2][2]; + mtx[0][3] = 0.0f; + mtx[1][3] = 0.0f; + mtx[2][3] = 0.0f; + + if (sNBTFlag == 0) { + J3DFifoLoadNrmMtxImm(mtx, 0); + } else { + J3DScaleNrmMtx(mtx, j3dSys.getNBTScale()); + J3DFifoLoadNrmMtxImm(mtx, 0); + } } /* 802DC8C0-802DC9B8 .text load__21J3DShapeMtxYBBoardImmCFv */ @@ -167,13 +313,13 @@ J3DShapeMtxYBBoardConcatView::~J3DShapeMtxYBBoardConcatView() { } /* 802DCBF4-802DCC00 .text getType__21J3DShapeMtxYBBoardImmCFv */ -void J3DShapeMtxYBBoardImm::getType() const { - /* Nonmatching */ +u32 J3DShapeMtxYBBoardImm::getType() const { + return 'SMYB'; } /* 802DCC00-802DCC08 .text getUseMtxIndex__11J3DShapeMtxCFUs */ -void J3DShapeMtx::getUseMtxIndex(unsigned short) const { - /* Nonmatching */ +u32 J3DShapeMtx::getUseMtxIndex(u16 i) const { + return mUseMtxIndex; } /* 802DCC08-802DCC74 .text __dt__21J3DShapeMtxYBBoardImmFv */ @@ -187,8 +333,8 @@ J3DShapeMtxBBoardConcatView::~J3DShapeMtxBBoardConcatView() { } /* 802DCCF0-802DCCFC .text getType__20J3DShapeMtxBBoardImmCFv */ -void J3DShapeMtxBBoardImm::getType() const { - /* Nonmatching */ +u32 J3DShapeMtxBBoardImm::getType() const { + return 'SMBB'; } /* 802DCCFC-802DCD68 .text __dt__20J3DShapeMtxBBoardImmFv */ @@ -202,22 +348,22 @@ J3DShapeMtxMultiConcatView::~J3DShapeMtxMultiConcatView() { } /* 802DCDE4-802DCDF0 .text getType__26J3DShapeMtxMultiConcatViewCFv */ -void J3DShapeMtxMultiConcatView::getType() const { - /* Nonmatching */ +u32 J3DShapeMtxMultiConcatView::getType() const { + return 'SMMI'; } /* 802DCDF0-802DCDF8 .text getUseMtxNum__26J3DShapeMtxMultiConcatViewCFv */ -void J3DShapeMtxMultiConcatView::getUseMtxNum() const { - /* Nonmatching */ +u32 J3DShapeMtxMultiConcatView::getUseMtxNum() const { + return mUseMtxNum; } /* 802DCDF8-802DCE08 .text getUseMtxIndex__26J3DShapeMtxMultiConcatViewCFUs */ -void J3DShapeMtxMultiConcatView::getUseMtxIndex(unsigned short) const { - /* Nonmatching */ +u32 J3DShapeMtxMultiConcatView::getUseMtxIndex(u16 i) const { + return mUseMtxIndexTable[i]; } /* 802DCE08-802DCE0C .text loadNrmMtx__26J3DShapeMtxMultiConcatViewCFiUs */ -void J3DShapeMtxMultiConcatView::loadNrmMtx(int, unsigned short) const { +void J3DShapeMtxMultiConcatView::loadNrmMtx(int mtxNo, u16 index) const { /* Nonmatching */ } @@ -227,18 +373,18 @@ J3DShapeMtxMultiImm::~J3DShapeMtxMultiImm() { } /* 802DCE78-802DCE84 .text getType__19J3DShapeMtxMultiImmCFv */ -void J3DShapeMtxMultiImm::getType() const { - /* Nonmatching */ +u32 J3DShapeMtxMultiImm::getType() const { + return 'SMMI'; } /* 802DCE84-802DCE8C .text getUseMtxNum__19J3DShapeMtxMultiImmCFv */ -void J3DShapeMtxMultiImm::getUseMtxNum() const { - /* Nonmatching */ +u32 J3DShapeMtxMultiImm::getUseMtxNum() const { + return mUseMtxNum; } /* 802DCE8C-802DCE9C .text getUseMtxIndex__19J3DShapeMtxMultiImmCFUs */ -void J3DShapeMtxMultiImm::getUseMtxIndex(unsigned short) const { - /* Nonmatching */ +u32 J3DShapeMtxMultiImm::getUseMtxIndex(u16 i) const { + return mUseMtxIndexTable[i]; } /* 802DCE9C-802DCEF8 .text __dt__16J3DShapeMtxMultiFv */ @@ -247,18 +393,18 @@ J3DShapeMtxMulti::~J3DShapeMtxMulti() { } /* 802DCEF8-802DCF04 .text getType__16J3DShapeMtxMultiCFv */ -void J3DShapeMtxMulti::getType() const { - /* Nonmatching */ +u32 J3DShapeMtxMulti::getType() const { + return 'SMML'; } /* 802DCF04-802DCF0C .text getUseMtxNum__16J3DShapeMtxMultiCFv */ -void J3DShapeMtxMulti::getUseMtxNum() const { - /* Nonmatching */ +u32 J3DShapeMtxMulti::getUseMtxNum() const { + return mUseMtxNum; } /* 802DCF0C-802DCF1C .text getUseMtxIndex__16J3DShapeMtxMultiCFUs */ -void J3DShapeMtxMulti::getUseMtxIndex(unsigned short) const { - /* Nonmatching */ +u32 J3DShapeMtxMulti::getUseMtxIndex(u16 i) const { + return mUseMtxIndexTable[i]; } /* 802DCF1C-802DCF88 .text __dt__21J3DShapeMtxConcatViewFv */ @@ -267,12 +413,12 @@ J3DShapeMtxConcatView::~J3DShapeMtxConcatView() { } /* 802DCF88-802DCF94 .text getType__21J3DShapeMtxConcatViewCFv */ -void J3DShapeMtxConcatView::getType() const { - /* Nonmatching */ +u32 J3DShapeMtxConcatView::getType() const { + return 'SMCV'; } /* 802DCF94-802DCF98 .text loadNrmMtx__21J3DShapeMtxConcatViewCFiUs */ -void J3DShapeMtxConcatView::loadNrmMtx(int, unsigned short) const { +void J3DShapeMtxConcatView::loadNrmMtx(int mtxNo, u16 index) const { /* Nonmatching */ } @@ -282,8 +428,8 @@ J3DShapeMtxImm::~J3DShapeMtxImm() { } /* 802DCFF4-802DD000 .text getType__14J3DShapeMtxImmCFv */ -void J3DShapeMtxImm::getType() const { - /* Nonmatching */ +u32 J3DShapeMtxImm::getType() const { + return 'SMIM'; } /* 802DD000-802DD048 .text __dt__11J3DShapeMtxFv */ @@ -292,6 +438,6 @@ J3DShapeMtx::~J3DShapeMtx() { } /* 802DD048-802DD054 .text getType__11J3DShapeMtxCFv */ -void J3DShapeMtx::getType() const { - /* Nonmatching */ +u32 J3DShapeMtx::getType() const { + return 'SMTX'; } diff --git a/src/JSystem/J3DGraphBase/J3DSys.cpp b/src/JSystem/J3DGraphBase/J3DSys.cpp index c1e76c230..8f2f571fe 100644 --- a/src/JSystem/J3DGraphBase/J3DSys.cpp +++ b/src/JSystem/J3DGraphBase/J3DSys.cpp @@ -44,7 +44,7 @@ J3DSys::J3DSys() { mVtxPos = NULL; mVtxNrm = NULL; mVtxCol = NULL; - mNBTScale = NULL; + field_0x11c = NULL; field_0x104 = NULL; field_0x120 = NULL;