mirror of https://github.com/zeldaret/tp.git
373 lines
12 KiB
C++
373 lines
12 KiB
C++
//
|
|
// Generated By: dol2asm
|
|
// Translation Unit: J3DShape
|
|
//
|
|
|
|
#include "JSystem/J3DGraphBase/J3DShape.h"
|
|
#include "JSystem/J3DGraphBase/J3DPacket.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"
|
|
|
|
//
|
|
// Forward References:
|
|
//
|
|
|
|
extern "C" void initialize__8J3DShapeFv();
|
|
extern "C" void addTexMtxIndexInDL__8J3DShapeF7_GXAttrUl();
|
|
extern "C" void addTexMtxIndexInVcd__8J3DShapeF7_GXAttr();
|
|
extern "C" void calcNBTScale__8J3DShapeFRC3VecPA3_A3_fPA3_A3_f();
|
|
extern "C" void countBumpMtxNum__8J3DShapeCFv();
|
|
extern "C" static void J3DLoadCPCmd__FUcUl();
|
|
extern "C" static void J3DLoadArrayBasePtr__F7_GXAttrPv();
|
|
extern "C" void loadVtxArray__8J3DShapeCFv();
|
|
extern "C" void isSameVcdVatCmd__8J3DShapeFP8J3DShape();
|
|
extern "C" void makeVtxArrayCmd__8J3DShapeFv();
|
|
extern "C" void makeVcdVatCmd__8J3DShapeFv();
|
|
extern "C" void loadPreDrawSetting__8J3DShapeCFv();
|
|
extern "C" void setArrayAndBindPipeline__8J3DShapeCFv();
|
|
extern "C" void drawFast__8J3DShapeCFv();
|
|
extern "C" void draw__8J3DShapeCFv();
|
|
extern "C" void simpleDraw__8J3DShapeCFv();
|
|
extern "C" void simpleDrawCache__8J3DShapeCFv();
|
|
extern "C" extern void* __vt__8J3DShape[6];
|
|
extern "C" u8 sOldVcdVatCmd__8J3DShape[4];
|
|
|
|
//
|
|
// External References:
|
|
//
|
|
|
|
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();
|
|
extern "C" void J3DFifoLoadPosMtxImm__FPA4_fUl();
|
|
extern "C" void J3DFifoLoadNrmMtxImm__FPA4_fUl();
|
|
extern "C" void resetMtxLoadCache__11J3DShapeMtxFv();
|
|
extern "C" void addTexMtxIndexInDL__12J3DShapeDrawFUlUlUl();
|
|
extern "C" void draw__12J3DShapeDrawCFv();
|
|
extern "C" void _savegpr_27();
|
|
extern "C" void _savegpr_28();
|
|
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" u32 sCurrentPipeline__11J3DShapeMtx;
|
|
extern "C" u32 sCurrentScaleFlag__11J3DShapeMtx;
|
|
extern "C" extern u8 struct_804515B0[4];
|
|
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 */] = {
|
|
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"
|
|
}
|
|
#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) {
|
|
u32 kSize[] = { 0, 1, 1, 2 };
|
|
|
|
s32 pnmtxidxOffs = -1;
|
|
s32 attrOffs = -1;
|
|
u32 stride = 0;
|
|
bool found = false;
|
|
|
|
for (GXVtxDescList* vtxDesc = mVtxDesc; vtxDesc->attr != GX_VA_NULL; vtxDesc++) {
|
|
if (vtxDesc->attr == GX_VA_PNMTXIDX)
|
|
pnmtxidxOffs = stride;
|
|
|
|
if (attr < vtxDesc->attr && !found) {
|
|
attrOffs = stride;
|
|
found = true;
|
|
}
|
|
|
|
stride = stride + kSize[vtxDesc->type];
|
|
}
|
|
|
|
if (pnmtxidxOffs == -1)
|
|
return;
|
|
|
|
for (u16 i = 0; i < mMtxGroupNum; i++)
|
|
mShapeDraw[i]->addTexMtxIndexInDL(stride, attrOffs, param_1);
|
|
}
|
|
#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) {
|
|
s32 attrIdx = -1;
|
|
GXVtxDescList* vtxDesc = mVtxDesc;
|
|
s32 attrCount = 0;
|
|
|
|
for (; vtxDesc->attr != GX_VA_NULL; attrCount++, vtxDesc++) {
|
|
if (vtxDesc->attr == GX_VA_PNMTXIDX)
|
|
attrIdx = 0;
|
|
}
|
|
|
|
if (attrIdx == -1)
|
|
return;
|
|
|
|
GXVtxDescList* newVtxDesc = new GXVtxDescList[attrCount + 2];
|
|
bool inserted = false;
|
|
|
|
vtxDesc = mVtxDesc;
|
|
GXVtxDescList* dst = newVtxDesc;
|
|
for (; vtxDesc->attr != GX_VA_NULL; dst++, vtxDesc++) {
|
|
if ((attr < vtxDesc->attr) && !inserted) {
|
|
dst->attr = attr;
|
|
dst->type = GX_DIRECT;
|
|
inserted = true;
|
|
dst++;
|
|
}
|
|
|
|
*dst = *vtxDesc;
|
|
}
|
|
|
|
dst->attr = GX_VA_NULL;
|
|
dst->type = GX_NONE;
|
|
mVtxDesc = newVtxDesc;
|
|
makeVcdVatCmd();
|
|
}
|
|
|
|
/* 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);
|
|
}
|
|
|
|
/* 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();
|
|
return num;
|
|
}
|
|
|
|
/* 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_REG;
|
|
GFX_FIFO(u8) = cmd;
|
|
GFX_FIFO(u32) = param;
|
|
}
|
|
|
|
/* 80314EB0-80314EEC 30F7F0 003C+00 1/1 0/0 0/0 .text J3DLoadArrayBasePtr__F7_GXAttrPv */
|
|
static void J3DLoadArrayBasePtr(_GXAttr attr, void* data) {
|
|
u32 idx = (attr == GX_VA_NBT) ? 1 : (attr - GX_VA_POS);
|
|
J3DLoadCPCmd(0xA0 + idx, ((u32)data & 0x7FFFFFFF));
|
|
}
|
|
|
|
/* 80314EEC-80314F5C 30F82C 0070+00 3/3 0/0 0/0 .text loadVtxArray__8J3DShapeCFv */
|
|
void J3DShape::loadVtxArray() const {
|
|
J3DLoadArrayBasePtr(GX_VA_POS, j3dSys.getVtxPos());
|
|
if (!mHasNBT) {
|
|
J3DLoadArrayBasePtr(GX_VA_NRM, j3dSys.getVtxNrm());
|
|
}
|
|
J3DLoadArrayBasePtr(GX_VA_CLR0, j3dSys.getVtxCol());
|
|
}
|
|
|
|
/* 80314F5C-80314F98 30F89C 003C+00 0/0 1/1 0/0 .text isSameVcdVatCmd__8J3DShapeFP8J3DShape */
|
|
bool J3DShape::isSameVcdVatCmd(J3DShape* other) {
|
|
u8 *a = other->mVcdVatCmd;
|
|
u8 *b = mVcdVatCmd;
|
|
for (u32 i = 0; i < kVcdVatDLSize; i++)
|
|
if (a[i] != b[i])
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
/* 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"
|
|
}
|
|
#pragma pop
|
|
|
|
/* ############################################################################################## */
|
|
/* 804515C8-804515CC 000AC8 0004+00 1/1 0/0 0/0 .sbss sInterruptFlag$903 */
|
|
static s32 sInterruptFlag;
|
|
|
|
/* 804515CC-804515D0 000ACC 0004+00 1/1 0/0 0/0 .sbss None */
|
|
static s8 sInitInterruptFlag;
|
|
|
|
/* 80315260-80315300 30FBA0 00A0+00 1/1 2/2 0/0 .text makeVcdVatCmd__8J3DShapeFv */
|
|
void J3DShape::makeVcdVatCmd() {
|
|
if (!sInitInterruptFlag) {
|
|
sInterruptFlag = OSDisableInterrupts();
|
|
sInitInterruptFlag = true;
|
|
}
|
|
OSDisableScheduler();
|
|
|
|
GDLObj gdl_obj;
|
|
GDInitGDLObj(&gdl_obj, mVcdVatCmd, kVcdVatDLSize);
|
|
GDSetCurrent(&gdl_obj);
|
|
GDSetVtxDescv(mVtxDesc);
|
|
makeVtxArrayCmd();
|
|
J3DGDSetVtxAttrFmtv(GX_VTXFMT0, mVertexData->getVtxAttrFmtList(), mHasNBT);
|
|
GDPadCurr32();
|
|
GDFlushCurrToMem();
|
|
GDSetCurrent(NULL);
|
|
OSEnableScheduler();
|
|
OSRestoreInterrupts(sInterruptFlag);
|
|
}
|
|
|
|
/* ############################################################################################## */
|
|
/* 804515D0-804515D4 000AD0 0004+00 5/5 25/25 9/9 .sbss sOldVcdVatCmd__8J3DShape */
|
|
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"
|
|
}
|
|
#pragma pop
|
|
|
|
/* ############################################################################################## */
|
|
/* 804515D4-804515D8 000AD4 0004+00 3/3 0/0 0/0 .sbss None */
|
|
static u8 data_804515D4[4];
|
|
|
|
/* 80315398-8031544C 30FCD8 00B4+00 1/1 0/0 0/0 .text setArrayAndBindPipeline__8J3DShapeCFv */
|
|
void J3DShape::setArrayAndBindPipeline() const {
|
|
J3DShapeMtx::setCurrentPipeline(getPipeline());
|
|
loadVtxArray();
|
|
j3dSys.setModelDrawMtx(mDrawMtx[*mCurrentViewNo]);
|
|
j3dSys.setModelNrmMtx(mNrmMtx[*mCurrentViewNo]);
|
|
J3DShapeMtx::sCurrentScaleFlag = mScaleFlagArray;
|
|
// The below struct_804515B0 is actually a continuation of sCurrentScaleFlag, I believe?
|
|
// Also, there seems to be an extra entry in the array that's only there in DEBUG builds.
|
|
struct_804515B0[0] = mHasNBT;
|
|
data_804515D4[0] = mHasPNMTXIdx;
|
|
J3DShapeMtx::sTexMtxLoadType = getTexMtxLoadType();
|
|
}
|
|
|
|
/* 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
|
|
asm void J3DShape::drawFast() const {
|
|
nofralloc
|
|
#include "asm/JSystem/J3DGraphBase/J3DShape/drawFast__8J3DShapeCFv.s"
|
|
}
|
|
#pragma pop
|
|
|
|
#endif
|
|
|
|
/* 803155E0-80315628 30FF20 0048+00 1/0 0/0 0/0 .text draw__8J3DShapeCFv */
|
|
void J3DShape::draw() const {
|
|
sOldVcdVatCmd = NULL;
|
|
loadPreDrawSetting();
|
|
drawFast();
|
|
}
|
|
|
|
/* 80315628-803156AC 30FF68 0084+00 1/0 0/0 0/0 .text simpleDraw__8J3DShapeCFv */
|
|
void J3DShape::simpleDraw() const {
|
|
resetVcdVatCache();
|
|
loadPreDrawSetting();
|
|
J3DShapeMtx::setCurrentPipeline(getPipeline());
|
|
loadVtxArray();
|
|
for (u16 n = mMtxGroupNum, i = 0; i < n; i++) {
|
|
if (mShapeDraw[i] != NULL) {
|
|
mShapeDraw[i]->draw();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 803156AC-803157A0 30FFEC 00F4+00 1/0 0/0 0/0 .text simpleDrawCache__8J3DShapeCFv */
|
|
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();
|
|
}
|