From fb8b3251d6eeea44510e0bae251e63b122f56b36 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 23 Apr 2022 20:06:43 -0700 Subject: [PATCH] J3DShape: more OK --- include/JSystem/J3DGraphBase/J3DPacket.h | 1 + include/JSystem/J3DGraphBase/J3DShape.h | 33 +++++++-- include/JSystem/J3DGraphBase/J3DShapeMtx.h | 1 + include/dolphin/gx/GX.h | 3 +- libs/JSystem/J3DGraphBase/J3DShape.cpp | 78 +++++++++++++++++----- 5 files changed, 92 insertions(+), 24 deletions(-) diff --git a/include/JSystem/J3DGraphBase/J3DPacket.h b/include/JSystem/J3DGraphBase/J3DPacket.h index 3ed3fe28049..14ed0fb5f43 100644 --- a/include/JSystem/J3DGraphBase/J3DPacket.h +++ b/include/JSystem/J3DGraphBase/J3DPacket.h @@ -123,6 +123,7 @@ public: J3DShape* getShape() const { return mpShape; } J3DModel* getModel() const { return mpModel; } + Mtx* getBaseMtxPtr() const { return mpBaseMtxPtr; } public: /* 0x28 */ J3DShape* mpShape; diff --git a/include/JSystem/J3DGraphBase/J3DShape.h b/include/JSystem/J3DGraphBase/J3DShape.h index b37f0748493..e2d0cccae9f 100644 --- a/include/JSystem/J3DGraphBase/J3DShape.h +++ b/include/JSystem/J3DGraphBase/J3DShape.h @@ -13,10 +13,30 @@ public: u32 mMtxIdxRegB; }; +static inline void J3DFifoWriteCPCmd(u8 cmd, u32 param) { + GFX_FIFO(u8) = GX_CMD_LOAD_CP_REG; + GFX_FIFO(u8) = cmd; + GFX_FIFO(u32) = param; +} + +static inline void J3DFifoWriteXFCmd(u16 cmd, u16 len) { + GFX_FIFO(u8) = GX_CMD_LOAD_XF_REG; + GFX_FIFO(u16) = (len - 1); + GFX_FIFO(u16) = cmd; +} + class J3DCurrentMtx : public J3DCurrentMtxInfo { public: u32 getMtxIdxRegA() const { return mMtxIdxRegA; } u32 getMtxIdxRegB() const { return mMtxIdxRegB; } + + inline void load() const { + J3DFifoWriteCPCmd(0x30, getMtxIdxRegA()); // CP_MATINDEX_A + J3DFifoWriteCPCmd(0x40, getMtxIdxRegB()); // CP_MATINDEX_B + J3DFifoWriteXFCmd(0x1018, 2); + GFX_FIFO(u32) = getMtxIdxRegA(); + GFX_FIFO(u32) = getMtxIdxRegB(); + } }; class J3DMaterial; @@ -24,11 +44,12 @@ class J3DVertexData; class J3DDrawMtxData; enum J3DShpFlag { - J3DShpFlag_Visible = 0x0001, - J3DShpFlag_SkinPosCpu = 0x0004, - J3DShpFlag_SkinNrmCpu = 0x0008, - J3DShpFlag_Hidden = 0x0010, - J3DShpFlag_EnableLod = 0x0100, + J3DShpFlag_Visible = 0x0001, + J3DShpFlag_SkinPosCpu = 0x0004, + J3DShpFlag_SkinNrmCpu = 0x0008, + J3DShpFlag_Hidden = 0x0010, + J3DShpFlag_EnableLod = 0x0100, + J3DShpFlag_NoMtx = 0x0200, }; class J3DShape { @@ -52,7 +73,7 @@ public: void onFlag(u32 flag) { mFlags |= flag; } void offFlag(u32 flag) { mFlags &= ~flag; } - bool checkFlag(u32 flag) { return !!(mFlags & flag); } + bool checkFlag(u32 flag) const { return !!(mFlags & flag); } void setDrawMtxDataPointer(J3DDrawMtxData* pMtxData) { mDrawMtxData = pMtxData; } void setVertexDataPointer(J3DVertexData* pVtxData) { mVertexData = pVtxData; } void* getVcdVatCmd() const { return mVcdVatCmd; } diff --git a/include/JSystem/J3DGraphBase/J3DShapeMtx.h b/include/JSystem/J3DGraphBase/J3DShapeMtx.h index ced0ec979bd..4b0249ac4cf 100644 --- a/include/JSystem/J3DGraphBase/J3DShapeMtx.h +++ b/include/JSystem/J3DGraphBase/J3DShapeMtx.h @@ -41,6 +41,7 @@ public: static void setCurrentPipeline(u32 pipeline) { sCurrentPipeline = pipeline; } static void setLODFlag(u8 flag) { struct_804515B0[1] = flag; } + static void resetMtxLoadCache(); private: /* 0x04 */ u16 mUseMtxIndex; diff --git a/include/dolphin/gx/GX.h b/include/dolphin/gx/GX.h index 76866d250c0..a6d8bf4df85 100644 --- a/include/dolphin/gx/GX.h +++ b/include/dolphin/gx/GX.h @@ -861,7 +861,8 @@ typedef enum _GXCommand GX_CMD_LOAD_INDX_C = 0x30, GX_CMD_LOAD_INDX_D = 0x38, - GX_CMD_LOAD_CP_CMD = 0x08, + GX_CMD_LOAD_CP_REG = 0x08, + GX_CMD_LOAD_XF_REG = 0x10, } GXCommand; extern "C" { diff --git a/libs/JSystem/J3DGraphBase/J3DShape.cpp b/libs/JSystem/J3DGraphBase/J3DShape.cpp index 00de7f5cc72..858f8e214e7 100644 --- a/libs/JSystem/J3DGraphBase/J3DShape.cpp +++ b/libs/JSystem/J3DGraphBase/J3DShape.cpp @@ -4,6 +4,7 @@ // #include "JSystem/J3DGraphBase/J3DShape.h" +#include "JSystem/J3DGraphBase/J3DPacket.h" #include "JSystem/J3DGraphBase/J3DSys.h" #include "JSystem/J3DGraphBase/J3DVertex.h" #include "dol2asm.h" @@ -41,6 +42,8 @@ extern "C" u8 sOldVcdVatCmd__8J3DShape[4]; // void J3DGDSetVtxAttrFmtv(_GXVtxFmt, GXVtxAttrFmtList const*, bool); +void J3DFifoLoadPosMtxImm(Mtx, u32); +void J3DFifoLoadNrmMtxImm(Mtx, u32); extern "C" void* __nwa__FUl(); extern "C" void J3DGDSetVtxAttrFmtv__F9_GXVtxFmtPC17_GXVtxAttrFmtListb(); @@ -65,6 +68,10 @@ extern "C" u32 sTexMtxLoadType__11J3DShapeMtx; // Declarations: // +enum { + kVcdVatDLSize = 0xC0, +}; + /* ############################################################################################## */ /* 804563A0-804563A8 0049A0 0004+04 1/1 0/0 0/0 .sdata2 @687 */ SECTION_SDATA2 static f32 lit_687[1 + 1 /* padding */] = { @@ -133,7 +140,7 @@ asm void J3DShape::countBumpMtxNum() const { /* 80314E98-80314EB0 30F7D8 0018+00 1/1 0/0 0/0 .text J3DLoadCPCmd__FUcUl */ void J3DLoadCPCmd(u8 cmd, u32 param) { - GFX_FIFO(u8) = GX_CMD_LOAD_CP_CMD; + GFX_FIFO(u8) = GX_CMD_LOAD_CP_REG; GFX_FIFO(u8) = cmd; GFX_FIFO(u32) = param; } @@ -157,7 +164,7 @@ void J3DShape::loadVtxArray() const { bool J3DShape::isSameVcdVatCmd(J3DShape* other) { u8 *a = other->mVcdVatCmd; u8 *b = mVcdVatCmd; - for (u32 i = 0; i < 0xC0; i++) + for (u32 i = 0; i < kVcdVatDLSize; i++) if (a[i] != b[i]) return false; return true; @@ -189,7 +196,7 @@ void J3DShape::makeVcdVatCmd() { OSDisableScheduler(); GDLObj gdl_obj; - GDInitGDLObj(&gdl_obj, mVcdVatCmd, 0xC0); + GDInitGDLObj(&gdl_obj, mVcdVatCmd, kVcdVatDLSize); GDSetCurrent(&gdl_obj); GDSetVtxDescv(mVtxDesc); makeVtxArrayCmd(); @@ -234,6 +241,38 @@ void J3DShape::setArrayAndBindPipeline() const { } /* 8031544C-803155E0 30FD8C 0194+00 1/0 0/0 0/0 .text drawFast__8J3DShapeCFv */ +#ifdef NONMATCHING +void J3DShape::drawFast() const { + if (sOldVcdVatCmd != mVcdVatCmd) { + GXCallDisplayList(mVcdVatCmd, kVcdVatDLSize); + sOldVcdVatCmd = mVcdVatCmd; + } + + if (data_804515D4[0] != 0 && !mHasPNMTXIdx) + mCurrentMtx.load(); + + setArrayAndBindPipeline(); + if (!checkFlag(J3DShpFlag_NoMtx)) { + // LOD flag shenanigans + if (J3DShapeMtx::getLODFlag() != 0) + J3DShapeMtx::resetMtxLoadCache(); + + for (u16 n = mMtxGroupNum, i = 0; i < n; i++) { + if (mShapeMtx[i] != NULL) + mShapeMtx[i]->load(); + if (mShapeDraw[i] != NULL) + mShapeDraw[i]->draw(); + } + } else { + J3DFifoLoadPosMtxImm(*j3dSys.mShapePacket->getBaseMtxPtr(), GX_PNMTX0); + J3DFifoLoadNrmMtxImm(*j3dSys.mShapePacket->getBaseMtxPtr(), GX_PNMTX0); + for (u16 n = mMtxGroupNum, i = 0; i < n; i++) + if (mShapeDraw[i] != NULL) + mShapeDraw[i]->draw(); + } +} +#else + #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -243,15 +282,14 @@ asm void J3DShape::drawFast() const { } #pragma pop +#endif + /* 803155E0-80315628 30FF20 0048+00 1/0 0/0 0/0 .text draw__8J3DShapeCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DShape::draw() const { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DShape/draw__8J3DShapeCFv.s" +void J3DShape::draw() const { + sOldVcdVatCmd = NULL; + loadPreDrawSetting(); + drawFast(); } -#pragma pop /* 80315628-803156AC 30FF68 0084+00 1/0 0/0 0/0 .text simpleDraw__8J3DShapeCFv */ void J3DShape::simpleDraw() const { @@ -267,11 +305,17 @@ void J3DShape::simpleDraw() const { } /* 803156AC-803157A0 30FFEC 00F4+00 1/0 0/0 0/0 .text simpleDrawCache__8J3DShapeCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DShape::simpleDrawCache() const { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DShape/simpleDrawCache__8J3DShapeCFv.s" +void J3DShape::simpleDrawCache() const { + if (sOldVcdVatCmd != mVcdVatCmd) { + GXCallDisplayList(mVcdVatCmd, kVcdVatDLSize); + sOldVcdVatCmd = mVcdVatCmd; + } + + if (data_804515D4[0] != 0 && !mHasPNMTXIdx) + mCurrentMtx.load(); + + loadVtxArray(); + for (u16 n = mMtxGroupNum, i = 0; i < n; i++) + if (mShapeDraw[i] != NULL) + mShapeDraw[i]->draw(); } -#pragma pop