mirror of https://github.com/zeldaret/tp.git
J3DShape: more OK
This commit is contained in:
parent
2358fd042d
commit
fb8b3251d6
|
|
@ -123,6 +123,7 @@ public:
|
|||
|
||||
J3DShape* getShape() const { return mpShape; }
|
||||
J3DModel* getModel() const { return mpModel; }
|
||||
Mtx* getBaseMtxPtr() const { return mpBaseMtxPtr; }
|
||||
|
||||
public:
|
||||
/* 0x28 */ J3DShape* mpShape;
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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" {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue