mirror of
https://github.com/zeldaret/tp
synced 2026-06-02 02:00:30 -04:00
J3DShape / J3DShapeDraw: More OK
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user