J3DShape / J3DShapeDraw: More OK

This commit is contained in:
Jasper St. Pierre
2022-04-24 01:25:34 -07:00
parent f1f9cc713d
commit 9bee853ab4
16 changed files with 221 additions and 711 deletions
+135 -75
View File
@@ -58,7 +58,7 @@ extern "C" void _savegpr_29();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" extern u8 j3dDefaultViewNo[4 + 4 /* padding */];
extern "C" extern u32 j3dDefaultViewNo;
extern "C" u32 sCurrentPipeline__11J3DShapeMtx;
extern "C" u32 sCurrentScaleFlag__11J3DShapeMtx;
extern "C" extern u8 struct_804515B0[4];
@@ -72,32 +72,38 @@ 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 */] = {
0.0f,
/* padding */
0.0f,
};
/* 80314B48-80314BB8 30F488 0070+00 0/0 1/1 0/0 .text initialize__8J3DShapeFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void J3DShape::initialize() {
nofralloc
#include "asm/JSystem/J3DGraphBase/J3DShape/initialize__8J3DShapeFv.s"
void J3DShape::initialize() {
mMaterial = NULL;
mIndex = -1;
mMtxGroupNum = 0;
mFlags = 0;
mRadius = 0.0f;
mMin.x = 0.0f;
mMin.y = 0.0f;
mMin.z = 0.0f;
mMax.x = 0.0f;
mMax.y = 0.0f;
mMax.z = 0.0f;
mVtxDesc = NULL;
mShapeMtx = NULL;
mShapeDraw = NULL;
mVertexData = NULL;
mDrawMtxData = NULL;
mScaleFlagArray = NULL;
mDrawMtx = NULL;
mNrmMtx = NULL;
mCurrentViewNo = &j3dDefaultViewNo;
mHasNBT = false;
mHasPNMTXIdx = false;
}
#pragma pop
/* 80314BB8-80314CBC 30F4F8 0104+00 0/0 1/1 0/0 .text addTexMtxIndexInDL__8J3DShapeF7_GXAttrUl */
#ifdef NONMATCHING
void J3DShape::addTexMtxIndexInDL(GXAttr attr, u32 param_1) {
void J3DShape::addTexMtxIndexInDL(GXAttr attr, u32 valueBase) {
u32 kSize[] = { 0, 1, 1, 2 };
s32 pnmtxidxOffs = -1;
s32 attrOffs = -1;
u32 stride = 0;
s32 stride = 0;
bool found = false;
for (GXVtxDescList* vtxDesc = mVtxDesc; vtxDesc->attr != GX_VA_NULL; vtxDesc++) {
@@ -115,28 +121,9 @@ void J3DShape::addTexMtxIndexInDL(GXAttr attr, u32 param_1) {
if (pnmtxidxOffs == -1)
return;
for (u16 i = 0; i < mMtxGroupNum; i++)
mShapeDraw[i]->addTexMtxIndexInDL(stride, attrOffs, param_1);
for (u16 i = 0; i < getMtxGroupNum(); i++)
getShapeDraw(i)->addTexMtxIndexInDL(stride, attrOffs, (s32)valueBase);
}
#else
/* ############################################################################################## */
/* 803A1E98-803A1EA8 02E4F8 0010+00 1/1 0/0 0/0 .rodata @697 */
SECTION_RODATA static u8 const lit_697[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
};
COMPILER_STRIP_GATE(0x803A1E98, &lit_697);
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void J3DShape::addTexMtxIndexInDL(_GXAttr param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/J3DGraphBase/J3DShape/addTexMtxIndexInDL__8J3DShapeF7_GXAttrUl.s"
}
#pragma pop
#endif
/* 80314CBC-80314DA8 30F5FC 00EC+00 0/0 1/1 0/0 .text addTexMtxIndexInVcd__8J3DShapeF7_GXAttr */
void J3DShape::addTexMtxIndexInVcd(GXAttr attr) {
@@ -177,15 +164,15 @@ void J3DShape::addTexMtxIndexInVcd(GXAttr attr) {
/* 80314DA8-80314E28 30F6E8 0080+00 0/0 1/1 0/0 .text
* calcNBTScale__8J3DShapeFRC3VecPA3_A3_fPA3_A3_f */
void J3DShape::calcNBTScale(Vec const& param_0, f32 (*param_1)[3][3], f32 (*param_2)[3][3]) {
for (u16 i = 0; i < mMtxGroupNum; i++)
mShapeMtx[i]->calcNBTScale(param_0, param_1, param_2);
for (u16 i = 0; i < getMtxGroupNum(); i++)
getShapeMtx(i)->calcNBTScale(param_0, param_1, param_2);
}
/* 80314E28-80314E98 30F768 0070+00 0/0 1/1 0/0 .text countBumpMtxNum__8J3DShapeCFv */
u32 J3DShape::countBumpMtxNum() const {
u32 num = 0;
for (u16 i = 0; i < mMtxGroupNum; i++)
num += mShapeMtx[i]->getUseMtxNum();
for (u16 i = 0; i < getMtxGroupNum(); i++)
num += getShapeMtx(i)->getUseMtxNum();
return num;
}
@@ -222,14 +209,87 @@ bool J3DShape::isSameVcdVatCmd(J3DShape* other) {
}
/* 80314F98-80315260 30F8D8 02C8+00 1/1 0/0 0/0 .text makeVtxArrayCmd__8J3DShapeFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void J3DShape::makeVtxArrayCmd() {
nofralloc
#include "asm/JSystem/J3DGraphBase/J3DShape/makeVtxArrayCmd__8J3DShapeFv.s"
void J3DShape::makeVtxArrayCmd() {
GXVtxAttrFmtList *vtxAttr = mVertexData->getVtxAttrFmtList();
u8 stride[0x0C];
void* array[0x0C];
for (u32 i = 0; i < 0x0C; i++) {
stride[i] = 0;
array[i] = 0;
}
for (; vtxAttr->mAttrib != GX_VA_NULL; vtxAttr++) {
switch (vtxAttr->mAttrib) {
case GX_VA_POS:
{
if (vtxAttr->mCompType == GX_F32)
stride[vtxAttr->mAttrib - GX_VA_POS] = 0x0C;
else
stride[vtxAttr->mAttrib - GX_VA_POS] = 0x06;
array[vtxAttr->mAttrib - GX_VA_POS] = mVertexData->getVtxPosArray();
mVertexData->setVtxPosFrac(vtxAttr->mCompShift);
mVertexData->setVtxPosType((GXCompType) vtxAttr->mCompType);
}
break;
case GX_VA_NRM:
{
if (vtxAttr->mCompType == GX_F32)
stride[vtxAttr->mAttrib - GX_VA_POS] = 0x0C;
else
stride[vtxAttr->mAttrib - GX_VA_POS] = 0x06;
array[vtxAttr->mAttrib - GX_VA_POS] = mVertexData->getVtxNrmArray();
mVertexData->setVtxNrmFrac(vtxAttr->mCompShift);
mVertexData->setVtxNrmType((GXCompType) vtxAttr->mCompType);
}
break;
case GX_VA_CLR0:
case GX_VA_CLR1:
{
stride[vtxAttr->mAttrib - GX_VA_POS] = 0x04;
array[vtxAttr->mAttrib - GX_VA_POS] = mVertexData->getVtxColorArray(vtxAttr->mAttrib - GX_VA_CLR0);
}
break;
case GX_VA_TEX0:
case GX_VA_TEX1:
case GX_VA_TEX2:
case GX_VA_TEX3:
case GX_VA_TEX4:
case GX_VA_TEX5:
case GX_VA_TEX6:
case GX_VA_TEX7:
{
if (vtxAttr->mCompType == GX_F32)
stride[vtxAttr->mAttrib - GX_VA_POS] = 0x08;
else
stride[vtxAttr->mAttrib - GX_VA_POS] = 0x04;
array[vtxAttr->mAttrib - GX_VA_POS] = mVertexData->getVtxTexCoordArray(vtxAttr->mAttrib - GX_VA_TEX0);
}
break;
default:
break;
}
}
GXVtxDescList* vtxDesc = mVtxDesc;
mHasPNMTXIdx = false;
for (; vtxDesc->attr != GX_VA_NULL; vtxDesc++) {
if (vtxDesc->attr == GX_VA_NBT && vtxDesc->type != GX_NONE) {
mHasNBT = true;
stride[GX_VA_NRM - GX_VA_POS] *= 3;
array[GX_VA_NRM - GX_VA_POS] = mVertexData->getVtxNBTArray();
} else if (vtxDesc->attr == GX_VA_PNMTXIDX && vtxDesc->type != GX_NONE) {
mHasPNMTXIdx = true;
}
}
for (u32 i = 0; i < 0x0C; i++) {
if (array[i] != 0)
GDSetArray((GXAttr)(i + GX_VA_POS), array[i], stride[i]);
else
GDSetArrayRaw((GXAttr)(i + GX_VA_POS), NULL, stride[i]);
}
}
#pragma pop
/* ############################################################################################## */
/* 804515C8-804515CC 000AC8 0004+00 1/1 0/0 0/0 .sbss sInterruptFlag$903 */
@@ -264,14 +324,14 @@ void J3DShape::makeVcdVatCmd() {
void* J3DShape::sOldVcdVatCmd;
/* 80315300-80315398 30FC40 0098+00 2/2 6/6 3/3 .text loadPreDrawSetting__8J3DShapeCFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void J3DShape::loadPreDrawSetting() const {
nofralloc
#include "asm/JSystem/J3DGraphBase/J3DShape/loadPreDrawSetting__8J3DShapeCFv.s"
void J3DShape::loadPreDrawSetting() const {
if (sOldVcdVatCmd != mVcdVatCmd) {
GXCallDisplayList(mVcdVatCmd, kVcdVatDLSize);
sOldVcdVatCmd = mVcdVatCmd;
}
mCurrentMtx.load();
}
#pragma pop
/* ############################################################################################## */
/* 804515D4-804515D8 000AD4 0004+00 3/3 0/0 0/0 .sbss None */
@@ -308,18 +368,18 @@ void J3DShape::drawFast() const {
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();
for (u16 n = getMtxGroupNum(), i = 0; i < n; i++) {
if (getShapeMtx(i) != NULL)
getShapeMtx(i)->load();
if (getShapeDraw(i) != NULL)
getShapeDraw(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();
J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), GX_PNMTX0);
J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), GX_PNMTX0);
for (u16 n = getMtxGroupNum(), i = 0; i < n; i++)
if (getShapeDraw(i) != NULL)
getShapeDraw(i)->draw();
}
}
#else
@@ -348,9 +408,9 @@ void J3DShape::simpleDraw() const {
loadPreDrawSetting();
J3DShapeMtx::setCurrentPipeline(getPipeline());
loadVtxArray();
for (u16 n = mMtxGroupNum, i = 0; i < n; i++) {
if (mShapeDraw[i] != NULL) {
mShapeDraw[i]->draw();
for (u16 n = getMtxGroupNum(), i = 0; i < n; i++) {
if (getShapeDraw(i) != NULL) {
getShapeDraw(i)->draw();
}
}
}
@@ -366,7 +426,7 @@ void J3DShape::simpleDrawCache() const {
mCurrentMtx.load();
loadVtxArray();
for (u16 n = mMtxGroupNum, i = 0; i < n; i++)
if (mShapeDraw[i] != NULL)
mShapeDraw[i]->draw();
for (u16 n = getMtxGroupNum(), i = 0; i < n; i++)
if (getShapeDraw(i) != NULL)
getShapeDraw(i)->draw();
}