J3DShape: OK progress

This commit is contained in:
Jasper St. Pierre 2022-04-23 18:58:35 -07:00
parent d954f9348c
commit 2358fd042d
9 changed files with 68 additions and 105 deletions

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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 {

View File

@ -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 */

View File

@ -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 */

View File

@ -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,

View File

@ -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 */

View File

@ -3,7 +3,6 @@
// Translation Unit: GDGeometry
//
#include "dolphin/gd/GDGeometry.h"
#include "dol2asm.h"
#include "dolphin/types.h"