diff --git a/asm/JSystem/J3DGraphBase/J3DShape/isSameVcdVatCmd__8J3DShapeFP8J3DShape.s b/asm/JSystem/J3DGraphBase/J3DShape/isSameVcdVatCmd__8J3DShapeFP8J3DShape.s deleted file mode 100644 index 992dac6d8ca..00000000000 --- a/asm/JSystem/J3DGraphBase/J3DShape/isSameVcdVatCmd__8J3DShapeFP8J3DShape.s +++ /dev/null @@ -1,18 +0,0 @@ -lbl_80314F5C: -/* 80314F5C 80 84 00 2C */ lwz r4, 0x2c(r4) -/* 80314F60 80 63 00 2C */ lwz r3, 0x2c(r3) -/* 80314F64 38 00 00 C0 */ li r0, 0xc0 -/* 80314F68 7C 09 03 A6 */ mtctr r0 -lbl_80314F6C: -/* 80314F6C 88 A4 00 00 */ lbz r5, 0(r4) -/* 80314F70 88 03 00 00 */ lbz r0, 0(r3) -/* 80314F74 7C 05 00 40 */ cmplw r5, r0 -/* 80314F78 41 82 00 0C */ beq lbl_80314F84 -/* 80314F7C 38 60 00 00 */ li r3, 0 -/* 80314F80 4E 80 00 20 */ blr -lbl_80314F84: -/* 80314F84 38 63 00 01 */ addi r3, r3, 1 -/* 80314F88 38 84 00 01 */ addi r4, r4, 1 -/* 80314F8C 42 00 FF E0 */ bdnz lbl_80314F6C -/* 80314F90 38 60 00 01 */ li r3, 1 -/* 80314F94 4E 80 00 20 */ blr diff --git a/asm/JSystem/J3DGraphBase/J3DShape/makeVcdVatCmd__8J3DShapeFv.s b/asm/JSystem/J3DGraphBase/J3DShape/makeVcdVatCmd__8J3DShapeFv.s deleted file mode 100644 index 8ebb48d9e8a..00000000000 --- a/asm/JSystem/J3DGraphBase/J3DShape/makeVcdVatCmd__8J3DShapeFv.s +++ /dev/null @@ -1,42 +0,0 @@ -lbl_80315260: -/* 80315260 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 80315264 7C 08 02 A6 */ mflr r0 -/* 80315268 90 01 00 24 */ stw r0, 0x24(r1) -/* 8031526C 93 E1 00 1C */ stw r31, 0x1c(r1) -/* 80315270 7C 7F 1B 78 */ mr r31, r3 -/* 80315274 88 0D 90 4C */ lbz r0, data_804515CC(r13) -/* 80315278 7C 00 07 75 */ extsb. r0, r0 -/* 8031527C 40 82 00 14 */ bne lbl_80315290 -/* 80315280 48 02 84 75 */ bl OSDisableInterrupts -/* 80315284 90 6D 90 48 */ stw r3, sInterruptFlag(r13) -/* 80315288 38 00 00 01 */ li r0, 1 -/* 8031528C 98 0D 90 4C */ stb r0, data_804515CC(r13) -lbl_80315290: -/* 80315290 48 02 BA 35 */ bl OSDisableScheduler -/* 80315294 38 61 00 08 */ addi r3, r1, 8 -/* 80315298 80 9F 00 2C */ lwz r4, 0x2c(r31) -/* 8031529C 38 A0 00 C0 */ li r5, 0xc0 -/* 803152A0 48 04 BC F9 */ bl GDInitGDLObj -/* 803152A4 38 01 00 08 */ addi r0, r1, 8 -/* 803152A8 90 0D 94 00 */ stw r0, __GDCurrentDL(r13) -/* 803152AC 80 7F 00 30 */ lwz r3, 0x30(r31) -/* 803152B0 48 04 BE 55 */ bl GDSetVtxDescv -/* 803152B4 7F E3 FB 78 */ mr r3, r31 -/* 803152B8 4B FF FC E1 */ bl makeVtxArrayCmd__8J3DShapeFv -/* 803152BC 80 7F 00 4C */ lwz r3, 0x4c(r31) -/* 803152C0 80 83 00 14 */ lwz r4, 0x14(r3) -/* 803152C4 38 60 00 00 */ li r3, 0 -/* 803152C8 88 BF 00 34 */ lbz r5, 0x34(r31) -/* 803152CC 4B FF 88 39 */ bl J3DGDSetVtxAttrFmtv__F9_GXVtxFmtPC17_GXVtxAttrFmtListb -/* 803152D0 48 04 BD 0D */ bl GDPadCurr32 -/* 803152D4 48 04 BC DD */ bl GDFlushCurrToMem -/* 803152D8 38 00 00 00 */ li r0, 0 -/* 803152DC 90 0D 94 00 */ stw r0, __GDCurrentDL(r13) -/* 803152E0 48 02 BA 25 */ bl OSEnableScheduler -/* 803152E4 80 6D 90 48 */ lwz r3, sInterruptFlag(r13) -/* 803152E8 48 02 84 35 */ bl OSRestoreInterrupts -/* 803152EC 83 E1 00 1C */ lwz r31, 0x1c(r1) -/* 803152F0 80 01 00 24 */ lwz r0, 0x24(r1) -/* 803152F4 7C 08 03 A6 */ mtlr r0 -/* 803152F8 38 21 00 20 */ addi r1, r1, 0x20 -/* 803152FC 4E 80 00 20 */ blr diff --git a/include/JSystem/J3DGraphBase/J3DShape.h b/include/JSystem/J3DGraphBase/J3DShape.h index b0576077c03..b37f0748493 100644 --- a/include/JSystem/J3DGraphBase/J3DShape.h +++ b/include/JSystem/J3DGraphBase/J3DShape.h @@ -56,7 +56,7 @@ public: void setDrawMtxDataPointer(J3DDrawMtxData* pMtxData) { mDrawMtxData = pMtxData; } void setVertexDataPointer(J3DVertexData* pVtxData) { mVertexData = pVtxData; } void* getVcdVatCmd() const { return mVcdVatCmd; } - void setVcdVatCmd(void* pVatCmd) { mVcdVatCmd = pVatCmd; } + void setVcdVatCmd(void* pVatCmd) { mVcdVatCmd = (u8*)pVatCmd; } void show() { offFlag(J3DShpFlag_Visible); } void hide() { onFlag(J3DShpFlag_Visible); } void setCurrentViewNoPtr(u32* pViewNoPtr) { mCurrentViewNo = pViewNoPtr; } @@ -81,7 +81,7 @@ private: /* 0x10 */ f32 mRadius; /* 0x14 */ Vec mMin; /* 0x20 */ Vec mMax; - /* 0x2C */ void* mVcdVatCmd; + /* 0x2C */ u8* mVcdVatCmd; /* 0x30 */ GXVtxDescList* mVtxDesc; /* 0x34 */ bool mHasNBT; /* 0x38 */ J3DShapeMtx** mShapeMtx; diff --git a/include/JSystem/J3DGraphBase/J3DVertex.h b/include/JSystem/J3DGraphBase/J3DVertex.h index 87e50c9276f..360e4a0cea4 100644 --- a/include/JSystem/J3DGraphBase/J3DVertex.h +++ b/include/JSystem/J3DGraphBase/J3DVertex.h @@ -30,22 +30,24 @@ public: u32 getVtxNum() const { return mVtxNum; } + GXVtxAttrFmtList* getVtxAttrFmtList() { return mVtxAttrFmtList; } + private: /* 0x00 */ u32 mVtxNum; /* 0x04 */ u32 mNrmNum; /* 0x08 */ u32 mColNum; /* 0x0C */ u32 field_0xc; /* 0x10 */ u32 field_0x10; - /* 0x14 */ void* mVtxAttrFmtList; + /* 0x14 */ GXVtxAttrFmtList* mVtxAttrFmtList; /* 0x18 */ void* mVtxPosArray; /* 0x1C */ void* mVtxNrmArray; /* 0x20 */ void* mVtxNBTArray; - /* 0x24 */ _GXColor* mVtxColorArray[2]; + /* 0x24 */ GXColor* mVtxColorArray[2]; /* 0x2C */ void* mVtxTexCoordArray[8]; /* 0x4C */ u8 mVtxPosFrac; - /* 0x50 */ _GXCompType mVtxPosType; + /* 0x50 */ GXCompType mVtxPosType; /* 0x54 */ u8 mVtxNrmFrac; - /* 0x58 */ _GXCompType mVtxNrmType; + /* 0x58 */ GXCompType mVtxNrmType; }; class J3DVertexBuffer { @@ -64,7 +66,7 @@ public: void setCurrentVtxNrm(void* pVtxNrm) { mCurrentVtxNrm = pVtxNrm; } - void setCurrentVtxCol(_GXColor* pVtxCol) { mCurrentVtxCol = pVtxCol; } + void setCurrentVtxCol(GXColor* pVtxCol) { mCurrentVtxCol = pVtxCol; } void frameInit() { setCurrentVtxPos(mVtxPosArray[0]); @@ -76,12 +78,12 @@ private: /* 0x00 */ J3DVertexData* mVtxData; /* 0x04 */ void* mVtxPosArray[2]; /* 0x0C */ void* mVtxNrmArray[2]; - /* 0x14 */ _GXColor* mVtxColArray[2]; + /* 0x14 */ GXColor* mVtxColArray[2]; /* 0x1C */ void* mTransformedVtxPosArray[2]; /* 0x24 */ void* mTransformedVtxNrmArray[2]; /* 0x2C */ void* mCurrentVtxPos; /* 0x30 */ void* mCurrentVtxNrm; - /* 0x34 */ _GXColor* mCurrentVtxCol; + /* 0x34 */ GXColor* mCurrentVtxCol; }; // Size: 0x38 struct VertexNormal { diff --git a/include/dolphin/gd/GDBase.h b/include/dolphin/gd/GDBase.h index ef685d35199..121f2f6ce94 100644 --- a/include/dolphin/gd/GDBase.h +++ b/include/dolphin/gd/GDBase.h @@ -10,8 +10,6 @@ struct GDLObj { /* 0xC */ u8* end; }; // Size: 0x10 -extern "C" void GDInitGDLObj(GDLObj*, u8*, u32); - extern GDLObj* __GDCurrentDL; inline void GDSetCurrent(GDLObj* obj) { @@ -22,4 +20,12 @@ inline u32 GDGetGDLObjOffset(GDLObj* obj) { return (u32)(obj->ptr - obj->start); } +extern "C" { + +void GDInitGDLObj(GDLObj*, u8*, u32); +void GDFlushCurrToMem(); +void GDPadCurr32(); + +} + #endif /* GDBASE_H */ diff --git a/include/dolphin/gd/GDGeometry.h b/include/dolphin/gd/GDGeometry.h index 3737290c3d6..e3f59751a23 100644 --- a/include/dolphin/gd/GDGeometry.h +++ b/include/dolphin/gd/GDGeometry.h @@ -2,5 +2,14 @@ #define GDGEOMETRY_H #include "dolphin/types.h" +#include "dolphin/gx/GX.h" + +extern "C" { + +void GDSetVtxDescv(GXVtxDescList*); +void GDSetArray(GXAttr attr, const void* data, u8 stride); +void GDSetArrayRaw(GXAttr attr, u32 data, u8 stride); + +} #endif /* GDGEOMETRY_H */ diff --git a/include/dolphin/gx/GX.h b/include/dolphin/gx/GX.h index 82d40d0ce23..76866d250c0 100644 --- a/include/dolphin/gx/GX.h +++ b/include/dolphin/gx/GX.h @@ -85,6 +85,13 @@ typedef struct _GXTexRegion { /* 0x00 */ u8 dummy[0x10]; } GXTexRegion; // Size: 0x10 +typedef struct _GXVtxAttrFmtList { + /* 0x00 */ u32 mAttrib; // GXAttr + /* 0x04 */ u32 mCompCnt; // GXCompCnt + /* 0x08 */ u32 mCompType; // GXCompType + /* 0x0C */ u8 mCompShift; +} GXVtxAttrFmtList; // Size: 0x10 + typedef enum _GXPrimitive { /* 0x80 */ GX_QUADS = 0x80, /* 0x90 */ GX_TRIANGLES = 0x90, diff --git a/libs/JSystem/J3DGraphBase/J3DShape.cpp b/libs/JSystem/J3DGraphBase/J3DShape.cpp index a4a725e972d..00de7f5cc72 100644 --- a/libs/JSystem/J3DGraphBase/J3DShape.cpp +++ b/libs/JSystem/J3DGraphBase/J3DShape.cpp @@ -5,15 +5,13 @@ #include "JSystem/J3DGraphBase/J3DShape.h" #include "JSystem/J3DGraphBase/J3DSys.h" +#include "JSystem/J3DGraphBase/J3DVertex.h" #include "dol2asm.h" +#include "dolphin/gd/GDBase.h" +#include "dolphin/gd/GDGeometry.h" +#include "dolphin/os/OS.h" #include "dolphin/types.h" -// -// Types: -// - -struct _GXVtxAttrFmtList {}; - // // Forward References: // @@ -42,6 +40,8 @@ extern "C" u8 sOldVcdVatCmd__8J3DShape[4]; // External References: // +void J3DGDSetVtxAttrFmtv(_GXVtxFmt, GXVtxAttrFmtList const*, bool); + extern "C" void* __nwa__FUl(); extern "C" void J3DGDSetVtxAttrFmtv__F9_GXVtxFmtPC17_GXVtxAttrFmtListb(); extern "C" void J3DFifoLoadPosMtxImm__FPA4_fUl(); @@ -49,16 +49,6 @@ extern "C" void J3DFifoLoadNrmMtxImm__FPA4_fUl(); extern "C" void resetMtxLoadCache__11J3DShapeMtxFv(); extern "C" void addTexMtxIndexInDL__12J3DShapeDrawFUlUlUl(); extern "C" void draw__12J3DShapeDrawCFv(); -extern "C" void OSDisableInterrupts(); -extern "C" void OSRestoreInterrupts(); -extern "C" void OSDisableScheduler(); -extern "C" void OSEnableScheduler(); -extern "C" void GDInitGDLObj(); -extern "C" void GDFlushCurrToMem(); -extern "C" void GDPadCurr32(); -extern "C" void GDSetVtxDescv(); -extern "C" void GDSetArray(); -extern "C" void GDSetArrayRaw(); extern "C" void _savegpr_27(); extern "C" void _savegpr_28(); extern "C" void _savegpr_29(); @@ -70,7 +60,6 @@ extern "C" u32 sCurrentPipeline__11J3DShapeMtx; extern "C" u32 sCurrentScaleFlag__11J3DShapeMtx; extern "C" extern u8 struct_804515B0[4]; extern "C" u32 sTexMtxLoadType__11J3DShapeMtx; -extern "C" extern u8 __GDCurrentDL[4]; // // Declarations: @@ -165,14 +154,14 @@ void J3DShape::loadVtxArray() const { } /* 80314F5C-80314F98 30F89C 003C+00 0/0 1/1 0/0 .text isSameVcdVatCmd__8J3DShapeFP8J3DShape */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm bool J3DShape::isSameVcdVatCmd(J3DShape* param_0) { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DShape/isSameVcdVatCmd__8J3DShapeFP8J3DShape.s" +bool J3DShape::isSameVcdVatCmd(J3DShape* other) { + u8 *a = other->mVcdVatCmd; + u8 *b = mVcdVatCmd; + for (u32 i = 0; i < 0xC0; i++) + if (a[i] != b[i]) + return false; + return true; } -#pragma pop /* 80314F98-80315260 30F8D8 02C8+00 1/1 0/0 0/0 .text makeVtxArrayCmd__8J3DShapeFv */ #pragma push @@ -186,20 +175,31 @@ asm void J3DShape::makeVtxArrayCmd() { /* ############################################################################################## */ /* 804515C8-804515CC 000AC8 0004+00 1/1 0/0 0/0 .sbss sInterruptFlag$903 */ -static u8 sInterruptFlag[4]; +static s32 sInterruptFlag; /* 804515CC-804515D0 000ACC 0004+00 1/1 0/0 0/0 .sbss None */ -static u8 data_804515CC[4]; +static s8 sInitInterruptFlag; /* 80315260-80315300 30FBA0 00A0+00 1/1 2/2 0/0 .text makeVcdVatCmd__8J3DShapeFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DShape::makeVcdVatCmd() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DShape/makeVcdVatCmd__8J3DShapeFv.s" +void J3DShape::makeVcdVatCmd() { + if (!sInitInterruptFlag) { + sInterruptFlag = OSDisableInterrupts(); + sInitInterruptFlag = true; + } + OSDisableScheduler(); + + GDLObj gdl_obj; + GDInitGDLObj(&gdl_obj, mVcdVatCmd, 0xC0); + GDSetCurrent(&gdl_obj); + GDSetVtxDescv(mVtxDesc); + makeVtxArrayCmd(); + J3DGDSetVtxAttrFmtv(GX_VTXFMT0, mVertexData->getVtxAttrFmtList(), mHasNBT); + GDPadCurr32(); + GDFlushCurrToMem(); + GDSetCurrent(NULL); + OSEnableScheduler(); + OSRestoreInterrupts(sInterruptFlag); } -#pragma pop /* ############################################################################################## */ /* 804515D0-804515D4 000AD0 0004+00 5/5 25/25 9/9 .sbss sOldVcdVatCmd__8J3DShape */ diff --git a/libs/dolphin/gd/GDGeometry.cpp b/libs/dolphin/gd/GDGeometry.cpp index 3473b167eef..b86e1627804 100644 --- a/libs/dolphin/gd/GDGeometry.cpp +++ b/libs/dolphin/gd/GDGeometry.cpp @@ -3,7 +3,6 @@ // Translation Unit: GDGeometry // -#include "dolphin/gd/GDGeometry.h" #include "dol2asm.h" #include "dolphin/types.h"