mirror of https://github.com/zeldaret/tp.git
554 lines
20 KiB
C++
554 lines
20 KiB
C++
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
|
|
|
#include "JSystem/J3DGraphBase/J3DShapeMtx.h"
|
|
#include "JSystem/J3DGraphAnimator/J3DModel.h"
|
|
#include "JSystem/J3DGraphBase/J3DFifo.h"
|
|
#include "JSystem/J3DGraphBase/J3DMatBlock.h"
|
|
#include "JSystem/J3DGraphBase/J3DSys.h"
|
|
#include "JSystem/J3DGraphBase/J3DTexture.h"
|
|
|
|
u16 J3DShapeMtx::sMtxLoadCache[10];
|
|
|
|
void J3DShapeMtx::resetMtxLoadCache() {
|
|
sMtxLoadCache[0] =
|
|
sMtxLoadCache[1] =
|
|
sMtxLoadCache[2] =
|
|
sMtxLoadCache[3] =
|
|
sMtxLoadCache[4] =
|
|
sMtxLoadCache[5] =
|
|
sMtxLoadCache[6] =
|
|
sMtxLoadCache[7] =
|
|
sMtxLoadCache[8] =
|
|
sMtxLoadCache[9] = 0xFFFF;
|
|
}
|
|
|
|
void J3DShapeMtx::loadMtxIndx_PNGP(int slot, u16 indx) const {
|
|
// J3DFifoLoadPosMtxIndx(indx, slot * 3); // matches debug, but not retail
|
|
J3DFifoLoadIndx(GX_LOAD_INDX_A, indx, 0xB000 | ((u16)(slot * 0x0C)));
|
|
J3DFifoLoadNrmMtxIndx3x3(indx, slot * 3);
|
|
}
|
|
|
|
void J3DShapeMtx::loadMtxIndx_PCPU(int slot, u16 indx) const {
|
|
J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3);
|
|
j3dSys.loadNrmMtxIndx(slot, indx);
|
|
}
|
|
|
|
void J3DShapeMtx::loadMtxIndx_NCPU(int slot, u16 indx) const {
|
|
j3dSys.loadPosMtxIndx(slot, indx);
|
|
J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3);
|
|
}
|
|
|
|
void J3DShapeMtx::loadMtxIndx_PNCPU(int slot, u16 indx) const {
|
|
J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3);
|
|
J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3);
|
|
}
|
|
|
|
J3DShapeMtx_LoadFunc J3DShapeMtx::sMtxLoadPipeline[4] = {
|
|
&J3DShapeMtx::loadMtxIndx_PNGP,
|
|
&J3DShapeMtx::loadMtxIndx_PCPU,
|
|
&J3DShapeMtx::loadMtxIndx_NCPU,
|
|
&J3DShapeMtx::loadMtxIndx_PNCPU,
|
|
};
|
|
|
|
J3DShapeMtxConcatView_LoadFunc J3DShapeMtxConcatView::sMtxLoadPipeline[4] = {
|
|
&J3DShapeMtxConcatView::loadMtxConcatView_PNGP,
|
|
&J3DShapeMtxConcatView::loadMtxConcatView_PCPU,
|
|
&J3DShapeMtxConcatView::loadMtxConcatView_NCPU,
|
|
&J3DShapeMtxConcatView::loadMtxConcatView_PNCPU,
|
|
};
|
|
|
|
J3DShapeMtxConcatView_LoadFunc J3DShapeMtxConcatView::sMtxLoadLODPipeline[4] = {
|
|
&J3DShapeMtxConcatView::loadMtxConcatView_PNGP_LOD,
|
|
&J3DShapeMtxConcatView::loadMtxConcatView_PCPU,
|
|
&J3DShapeMtxConcatView::loadMtxConcatView_NCPU,
|
|
&J3DShapeMtxConcatView::loadMtxConcatView_PNCPU,
|
|
};
|
|
|
|
u32 J3DShapeMtx::sCurrentPipeline;
|
|
|
|
u8* J3DShapeMtx::sCurrentScaleFlag;
|
|
|
|
bool J3DShapeMtx::sNBTFlag;
|
|
|
|
bool J3DShapeMtx::sLODFlag;
|
|
|
|
u32 J3DShapeMtx::sTexMtxLoadType;
|
|
|
|
MtxP J3DShapeMtxConcatView::sMtxPtrTbl[2];
|
|
|
|
J3DTexGenBlock* J3DDifferedTexMtx::sTexGenBlock;
|
|
|
|
J3DTexMtxObj* J3DDifferedTexMtx::sTexMtxObj;
|
|
|
|
void J3DDifferedTexMtx::loadExecute(f32 const (*param_0)[4]) {
|
|
static Mtx qMtx = {
|
|
{0.5f, 0.0f, 0.5f, 0.0f},
|
|
{0.0f, -0.5f, 0.5f, 0.0f},
|
|
{0.0f, 0.0f, 1.0f, 0.0f},
|
|
};
|
|
|
|
static Mtx qMtx2 = {
|
|
{0.5f, 0.0f, 0.0f, 0.5f},
|
|
{0.0f, -0.5f, 0.0f, 0.5f},
|
|
{0.0f, 0.0f, 1.0f, 0.0f}
|
|
};
|
|
|
|
Mtx* mtx; // sp_64
|
|
Mtx sp_e8;
|
|
Mtx44 sp_a8, sp_68;
|
|
|
|
J3DTexGenBlock* tex_gen_block = sTexGenBlock; // sp_60
|
|
J3D_ASSERT_NULLPTR(195, tex_gen_block != NULL);
|
|
|
|
J3DTexMtxObj* tex_mtx_obj = sTexMtxObj; // sp_5c
|
|
J3D_ASSERT_NULLPTR(198, tex_mtx_obj != NULL);
|
|
|
|
J3DTexMtxInfo* tex_mtx_info_1; // sp_58
|
|
int tex_gen_type; // sp_54
|
|
J3DTexMtx* tex_mtx_2; // sp_50
|
|
|
|
u16 tex_mtx_num = tex_mtx_obj->getNumTexMtx();
|
|
|
|
if (j3dSys.checkFlag(J3DSysFlag_PostTexMtx)) {
|
|
for (u16 i = 0; i < tex_mtx_num; i++) {
|
|
tex_gen_type = tex_gen_block->getTexCoord(i)->getTexGenType();
|
|
if (tex_gen_type == 1 || tex_gen_type == 0) {
|
|
tex_mtx_2 = tex_gen_block->getTexMtx(i);
|
|
J3D_ASSERT_NULLPTR(215, tex_mtx_2 != NULL);
|
|
tex_mtx_info_1 = &tex_mtx_2->getTexMtxInfo();
|
|
|
|
u32 sp_4c = tex_mtx_info_1->mInfo & 0x3f;
|
|
switch (sp_4c) {
|
|
case 3:
|
|
case 9: {
|
|
mtx = &tex_mtx_obj->getMtx(i);
|
|
break;
|
|
}
|
|
case 1:
|
|
case 6:
|
|
case 7: {
|
|
mtx = &tex_mtx_obj->getMtx(i);
|
|
break;
|
|
}
|
|
case 2:
|
|
case 8: {
|
|
MTXInverse(j3dSys.getViewMtx(), sp_e8);
|
|
MTXConcat(tex_mtx_obj->getMtx(i), sp_e8, sp_e8);
|
|
mtx = &sp_e8;
|
|
break;
|
|
}
|
|
case 5: {
|
|
J3DTexMtxInfo* tex_mtx_info_2 = &tex_mtx_2->getTexMtxInfo(); // sp_48
|
|
u32 sp_44 = (u32)(tex_mtx_info_2->mInfo & 0x80) >> 7;
|
|
if (sp_44 == 0) {
|
|
J3DGetTextureMtxOld(tex_mtx_info_2->mSRT, tex_mtx_info_2->mCenter, sp_68);
|
|
} else if (sp_44 == 1) {
|
|
J3DGetTextureMtxMayaOld(tex_mtx_info_2->mSRT, sp_68);
|
|
}
|
|
J3DMtxProjConcat(sp_68, tex_mtx_obj->getEffectMtx(i), sp_e8);
|
|
MTXInverse(j3dSys.getViewMtx(), sp_a8);
|
|
MTXConcat(sp_e8, sp_a8, sp_e8);
|
|
sp_e8[0][3] = sp_e8[1][3] = sp_e8[2][3] = 0.0f;
|
|
mtx = &sp_e8;
|
|
break;
|
|
}
|
|
case 11: {
|
|
J3DTexMtxInfo* tex_mtx_info_2 = &tex_mtx_2->getTexMtxInfo(); // sp_40
|
|
u32 sp_3c = (u32)(tex_mtx_info_2->mInfo & 0x80) >> 7;
|
|
if (sp_3c == 0) {
|
|
J3DGetTextureMtx(tex_mtx_info_2->mSRT, tex_mtx_info_2->mCenter, sp_68);
|
|
} else if (sp_3c == 1) {
|
|
J3DGetTextureMtxMaya(tex_mtx_info_2->mSRT, sp_68);
|
|
}
|
|
|
|
MTXConcat(sp_68, qMtx, sp_68);
|
|
J3DMtxProjConcat(sp_68, tex_mtx_obj->getEffectMtx(i), sp_e8);
|
|
MTXInverse(j3dSys.getViewMtx(), sp_a8);
|
|
MTXConcat(sp_e8, sp_a8, sp_e8);
|
|
sp_e8[0][3] = sp_e8[1][3] = sp_e8[2][3] = 0.0f;
|
|
mtx = &sp_e8;
|
|
break;
|
|
}
|
|
case 10: {
|
|
J3DTexMtxInfo* tex_mtx_info_2 = &tex_mtx_2->getTexMtxInfo(); // sp_38
|
|
u32 sp_34 = (u32)(tex_mtx_info_2->mInfo & 0x80) >> 7;
|
|
if (sp_34 == 0) {
|
|
J3DGetTextureMtx(tex_mtx_info_2->mSRT, tex_mtx_info_2->mCenter, sp_68);
|
|
} else if (sp_34 == 1) {
|
|
J3DGetTextureMtxMaya(tex_mtx_info_2->mSRT, sp_68);
|
|
}
|
|
|
|
MTXConcat(sp_68, qMtx2, sp_68);
|
|
J3DMtxProjConcat(sp_68, tex_mtx_obj->getEffectMtx(i), sp_e8);
|
|
MTXInverse(j3dSys.getViewMtx(), sp_a8);
|
|
MTXConcat(sp_e8, sp_a8, sp_e8);
|
|
sp_e8[0][3] = sp_e8[1][3] = sp_e8[2][3] = 0.0f;
|
|
mtx = &sp_e8;
|
|
break;
|
|
}
|
|
case 0:
|
|
case 4:
|
|
default: {
|
|
mtx = &tex_mtx_obj->getMtx(i);
|
|
}
|
|
}
|
|
GXLoadTexMtxImm(*mtx, i * 3 + 0x40, GX_MTX3x4);
|
|
}
|
|
}
|
|
} else {
|
|
for (u16 i = 0; i < tex_mtx_num; i++) {
|
|
int tex_gen_type = tex_gen_block->getTexCoord(i)->getTexGenType();
|
|
if (tex_gen_type == 1 || tex_gen_type == 0) {
|
|
J3DTexMtx* tex_mtx = tex_gen_block->getTexMtx(i); // sp_2c
|
|
J3D_ASSERT_NULLPTR(325, tex_mtx != NULL);
|
|
tex_mtx_info_1 = &tex_mtx->getTexMtxInfo();
|
|
|
|
u32 tex_gen_src = tex_mtx_info_1->mInfo & 0x3f; // sp_28
|
|
switch (tex_gen_src) {
|
|
case 3:
|
|
case 9:
|
|
MTXConcat(tex_mtx_obj->getMtx(i), param_0, sp_e8);
|
|
mtx = &sp_e8;
|
|
break;
|
|
case 1:
|
|
case 6:
|
|
case 7:
|
|
MTXCopy(param_0, sp_a8);
|
|
sp_a8[0][3] = sp_a8[1][3] = sp_a8[2][3] = 0.0f;
|
|
MTXConcat(tex_mtx_obj->getMtx(i), sp_a8, sp_e8);
|
|
mtx = &sp_e8;
|
|
break;
|
|
case 2:
|
|
case 8:
|
|
mtx = &tex_mtx_obj->getMtx(i);
|
|
break;
|
|
case 5: {
|
|
J3DTexMtxInfo* tex_mtx_info_2 = &tex_mtx->getTexMtxInfo(); // sp_24
|
|
u32 sp_24 = (u32)(tex_mtx_info_2->mInfo & 0x80) >> 7;
|
|
if (sp_24 == 0) {
|
|
J3DGetTextureMtxOld(tex_mtx_info_2->mSRT, tex_mtx_info_2->mCenter, sp_68);
|
|
} else if (sp_24 == 1) {
|
|
J3DGetTextureMtxMayaOld(tex_mtx_info_2->mSRT, sp_68);
|
|
}
|
|
|
|
J3DMtxProjConcat(sp_68, tex_mtx_obj->getEffectMtx(i), sp_e8);
|
|
MTXInverse(j3dSys.getViewMtx(), sp_a8);
|
|
MTXConcat(sp_e8, sp_a8, sp_e8);
|
|
MTXConcat(sp_e8, param_0, sp_e8);
|
|
sp_e8[0][3] = sp_e8[1][3] = sp_e8[2][3] = 0.0f;
|
|
mtx = &sp_e8;
|
|
break;
|
|
}
|
|
case 11: {
|
|
J3DTexMtxInfo* tex_mtx_info_2 = &tex_mtx->getTexMtxInfo(); // sp_1c
|
|
u32 sp_18 = (u32)(tex_mtx_info_2->mInfo & 0x80) >> 7;
|
|
if (sp_18 == 0) {
|
|
J3DGetTextureMtx(tex_mtx_info_2->mSRT, tex_mtx_info_2->mCenter, sp_68);
|
|
} else if (sp_18 == 1) {
|
|
J3DGetTextureMtxMaya(tex_mtx_info_2->mSRT, sp_68);
|
|
}
|
|
|
|
MTXConcat(sp_68, qMtx, sp_68);
|
|
J3DMtxProjConcat(sp_68, tex_mtx_obj->getEffectMtx(i), sp_e8);
|
|
MTXInverse(j3dSys.getViewMtx(), sp_a8);
|
|
MTXConcat(sp_e8, sp_a8, sp_e8);
|
|
MTXConcat(sp_e8, param_0, sp_e8);
|
|
sp_e8[0][3] = sp_e8[1][3] = sp_e8[2][3] = 0.0f;
|
|
mtx = &sp_e8;
|
|
break;
|
|
}
|
|
case 10: {
|
|
J3DTexMtxInfo* tex_mtx_info_2 = &tex_mtx->getTexMtxInfo(); // sp_14
|
|
u32 sp_10 = (u32)(tex_mtx_info_2->mInfo & 0x80) >> 7;
|
|
if (sp_10 == 0) {
|
|
J3DGetTextureMtx(tex_mtx_info_2->mSRT, tex_mtx_info_2->mCenter, sp_68);
|
|
} else if (sp_10 == 1) {
|
|
J3DGetTextureMtxMaya(tex_mtx_info_2->mSRT, sp_68);
|
|
}
|
|
|
|
MTXConcat(sp_68, qMtx2, sp_68);
|
|
J3DMtxProjConcat(sp_68, tex_mtx_obj->getEffectMtx(i), sp_e8);
|
|
MTXInverse(j3dSys.getViewMtx(), sp_a8);
|
|
MTXConcat(sp_e8, sp_a8, sp_e8);
|
|
MTXConcat(sp_e8, param_0, sp_e8);
|
|
sp_e8[2][3] = 0.0f;
|
|
sp_e8[1][3] = 0.0f;
|
|
sp_e8[0][3] = 0.0f;
|
|
mtx = &sp_e8;
|
|
break;
|
|
}
|
|
case 0:
|
|
case 4:
|
|
default: {
|
|
mtx = &tex_mtx_obj->getMtx(i);
|
|
break;
|
|
}
|
|
}
|
|
GXLoadTexMtxImm(*mtx, i * 3 + 30, (GXTexMtxType)tex_mtx_info_1->mProjection);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void J3DShapeMtxConcatView::loadMtxConcatView_PNGP(int slot, u16 drw) const {
|
|
Mtx m;
|
|
MTXConcat(*j3dSys.getShapePacket()->getBaseMtxPtr(), j3dSys.getModelDrawMtx(drw), m);
|
|
J3DDifferedTexMtx::load(m);
|
|
J3DFifoLoadPosMtxImm(m, slot * 3);
|
|
loadNrmMtx(slot, drw, m);
|
|
}
|
|
|
|
void J3DShapeMtxConcatView::loadMtxConcatView_PCPU(int slot, u16 drw) const {
|
|
Mtx m;
|
|
MTXConcat(*j3dSys.getShapePacket()->getBaseMtxPtr(), j3dSys.getModelDrawMtx(drw), m);
|
|
J3DDifferedTexMtx::load(m);
|
|
J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3);
|
|
loadNrmMtx(slot, drw, m);
|
|
}
|
|
|
|
void J3DShapeMtxConcatView::loadMtxConcatView_NCPU(int slot, u16 drw) const {
|
|
Mtx m;
|
|
MTXConcat(*j3dSys.getShapePacket()->getBaseMtxPtr(), j3dSys.getModelDrawMtx(drw), m);
|
|
J3DDifferedTexMtx::load(m);
|
|
J3DFifoLoadPosMtxImm(m, slot * 3);
|
|
J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3);
|
|
|
|
if (J3DShapeMtx::sTexMtxLoadType == 0x2000)
|
|
J3DFifoLoadNrmMtxToTexMtx(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3 + GX_TEXMTX0);
|
|
}
|
|
|
|
void J3DShapeMtxConcatView::loadMtxConcatView_PNCPU(int slot, u16 drw) const {
|
|
if (J3DDifferedTexMtx::sTexGenBlock != NULL) {
|
|
Mtx m;
|
|
MTXConcat(*j3dSys.getShapePacket()->getBaseMtxPtr(), j3dSys.getModelDrawMtx(drw), m);
|
|
J3DDifferedTexMtx::loadExecute(m);
|
|
}
|
|
|
|
J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3);
|
|
J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3);
|
|
|
|
if (J3DShapeMtx::sTexMtxLoadType == 0x2000)
|
|
J3DFifoLoadNrmMtxToTexMtx(*j3dSys.getShapePacket()->getBaseMtxPtr(), slot * 3 + GX_TEXMTX0);
|
|
}
|
|
|
|
void J3DShapeMtxConcatView::loadMtxConcatView_PNGP_LOD(int slot, u16 drw) const {
|
|
Mtx m;
|
|
MTXConcat(*j3dSys.getShapePacket()->getBaseMtxPtr(), j3dSys.getModelDrawMtx(drw), m);
|
|
MTXConcat(m, j3dSys.getModel()->getModelData()->getInvJointMtx(drw), m);
|
|
J3DDifferedTexMtx::load(m);
|
|
J3DFifoLoadPosMtxImm(m, slot * 3);
|
|
loadNrmMtx(slot, drw, m);
|
|
}
|
|
|
|
void J3DShapeMtx::load() const {
|
|
J3DShapeMtx_LoadFunc func = sMtxLoadPipeline[sCurrentPipeline];
|
|
(this->*func)(0, mUseMtxIndex);
|
|
}
|
|
|
|
void J3DShapeMtx::calcNBTScale(Vec const& param_0, Mtx33* param_1, Mtx33* param_2) {
|
|
J3DPSMtx33Copy(param_1[mUseMtxIndex], param_2[mUseMtxIndex]);
|
|
J3DScaleNrmMtx33(param_2[mUseMtxIndex], param_0);
|
|
}
|
|
|
|
void J3DShapeMtxConcatView::load() const {
|
|
sMtxPtrTbl[0] = j3dSys.getModel()->getMtxBuffer()->getUserAnmMtx(0);
|
|
sMtxPtrTbl[1] = j3dSys.getModel()->getWeightAnmMtx(0);
|
|
J3DShapeMtxConcatView_LoadFunc func = sMtxLoadPipeline[sCurrentPipeline];
|
|
|
|
j3dSys.setModelDrawMtx((Mtx*)sMtxPtrTbl[j3dSys.getModel()->getModelData()->getDrawMtxFlag(mUseMtxIndex)]);
|
|
|
|
u16 draw_mtx_index = j3dSys.getModel()->getModelData()->getDrawMtxIndex(mUseMtxIndex);
|
|
(this->*func)(0, draw_mtx_index);
|
|
}
|
|
|
|
void J3DShapeMtxConcatView::loadNrmMtx(int param_0, u16 param_1, MtxP param_2) const {
|
|
if (sCurrentScaleFlag[param_1] == 1) {
|
|
if (sTexMtxLoadType == 0x2000) {
|
|
J3DFifoLoadNrmMtxToTexMtx(param_2, 0x1e);
|
|
}
|
|
|
|
if (!sNBTFlag) {
|
|
J3DFifoLoadNrmMtxImm(param_2, 0);
|
|
} else {
|
|
Mtx33 mtx;
|
|
Vec* scale = j3dSys.getNBTScale();
|
|
J3DPSMtx33CopyFrom34(param_2, mtx);
|
|
J3DScaleNrmMtx33(mtx, *scale);
|
|
J3DFifoLoadNrmMtxImm3x3(mtx, 0);
|
|
}
|
|
} else {
|
|
Mtx33 mtx;
|
|
J3DPSCalcInverseTranspose(param_2, mtx);
|
|
if (sTexMtxLoadType == 0x2000) {
|
|
J3DFifoLoadNrmMtxToTexMtx3x3(mtx, 0x1e);
|
|
}
|
|
|
|
if (!sNBTFlag) {
|
|
J3DFifoLoadNrmMtxImm3x3(mtx, 0);
|
|
} else {
|
|
Vec* scale = j3dSys.getNBTScale();
|
|
J3DScaleNrmMtx33(mtx, *scale);
|
|
J3DFifoLoadNrmMtxImm3x3(mtx, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
void J3DShapeMtxMulti::load() const {
|
|
J3DShapeMtx_LoadFunc func = sMtxLoadPipeline[sCurrentPipeline];
|
|
|
|
int use_mtx_num = mUseMtxNum;
|
|
for (int i = 0; i < use_mtx_num; i++) {
|
|
if (mUseMtxIndexTable[i] != 0xffff) {
|
|
(this->*func)(i, mUseMtxIndexTable[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
void J3DShapeMtxMulti::calcNBTScale(Vec const& param_0, Mtx33* param_1, Mtx33* param_2) {
|
|
int use_mtx_num = mUseMtxNum;
|
|
for (int i = 0; i < use_mtx_num; i++) {
|
|
if (mUseMtxIndexTable[i] != 0xffff) {
|
|
J3DPSMtx33Copy(param_1[mUseMtxIndexTable[i]], param_2[mUseMtxIndexTable[i]]);
|
|
J3DScaleNrmMtx33(param_2[mUseMtxIndexTable[i]], param_0);
|
|
}
|
|
}
|
|
}
|
|
|
|
void J3DShapeMtxMultiConcatView::load() const {
|
|
sMtxPtrTbl[0] = j3dSys.getModel()->getMtxBuffer()->getUserAnmMtx(0);
|
|
sMtxPtrTbl[1] = j3dSys.getModel()->getWeightAnmMtx(0);
|
|
|
|
if (!sLODFlag) {
|
|
J3DShapeMtxConcatView_LoadFunc func = sMtxLoadPipeline[sCurrentPipeline];
|
|
int use_mtx_num = mUseMtxNum;
|
|
for (int i = 0; i < use_mtx_num; i++) {
|
|
if (mUseMtxIndexTable[i] != 0xffff) {
|
|
u16 draw_mtx_index = j3dSys.getModel()->getModelData()->getDrawMtxIndex(mUseMtxIndexTable[i]);
|
|
j3dSys.setModelDrawMtx((Mtx*)sMtxPtrTbl[j3dSys.getModel()->getModelData()->getDrawMtxFlag(mUseMtxIndexTable[i])]);
|
|
(this->*func)(i, draw_mtx_index);
|
|
}
|
|
}
|
|
} else {
|
|
u16* important_mtx_indices = j3dSys.getModel()->getModelData()->getWEvlpImportantMtxIndex();
|
|
j3dSys.setModelDrawMtx((Mtx*)sMtxPtrTbl[0]);
|
|
|
|
int use_mtx_num = mUseMtxNum;
|
|
for (int i = 0; i < use_mtx_num; i++) {
|
|
u32 current_pipeline = sCurrentPipeline;
|
|
J3DShapeMtxConcatView_LoadFunc func = sMtxLoadLODPipeline[current_pipeline];
|
|
|
|
if (mUseMtxIndexTable[i] != 0xffff) {
|
|
u16 important_mtx_index = important_mtx_indices[mUseMtxIndexTable[i]];
|
|
if (important_mtx_index != sMtxLoadCache[i]) {
|
|
if (j3dSys.getModel()->getModelData()->getDrawMtxFlag(mUseMtxIndexTable[i]) == 0) {
|
|
func = sMtxLoadPipeline[sCurrentPipeline];
|
|
}
|
|
|
|
(this->*func)(i, important_mtx_index);
|
|
sMtxLoadCache[i] = important_mtx_index;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void J3DShapeMtxMultiConcatView::loadNrmMtx(int param_0, u16 param_1, MtxP param_2) const {
|
|
Mtx33 mtx1, mtx2;
|
|
if (sCurrentScaleFlag[param_1] == 1) {
|
|
if (sTexMtxLoadType == 0x2000) {
|
|
J3DFifoLoadNrmMtxToTexMtx(param_2, param_0 * 3 + 0x1e);
|
|
}
|
|
if (!sNBTFlag) {
|
|
J3DFifoLoadNrmMtxImm(param_2, param_0 * 3);
|
|
} else {
|
|
Vec* nbt_scale = j3dSys.getNBTScale();
|
|
J3DPSMtx33CopyFrom34(param_2, mtx1);
|
|
J3DScaleNrmMtx33(mtx1, *nbt_scale);
|
|
J3DFifoLoadNrmMtxImm3x3(mtx1, 0);
|
|
}
|
|
} else {
|
|
J3DPSCalcInverseTranspose(param_2, mtx2);
|
|
if (sTexMtxLoadType == 0x2000) {
|
|
J3DFifoLoadNrmMtxToTexMtx3x3(mtx2, param_0 * 3 + 0x1e);
|
|
}
|
|
if (!sNBTFlag) {
|
|
J3DFifoLoadNrmMtxImm3x3(mtx2, param_0 * 3);
|
|
} else {
|
|
Vec* nbt_scale = j3dSys.getNBTScale();
|
|
J3DScaleNrmMtx33(mtx2, *nbt_scale);
|
|
J3DFifoLoadNrmMtxImm3x3(mtx2, param_0 * 3);
|
|
}
|
|
}
|
|
}
|
|
|
|
void J3DShapeMtxBBoardConcatView::load() const {
|
|
Mtx mtx;
|
|
u16 draw_mtx_index = j3dSys.getModel()->getModelData()->getDrawMtxIndex(mUseMtxIndex);
|
|
|
|
if (j3dSys.getModel()->getModelData()->getDrawMtxFlag(mUseMtxIndex) == 0) {
|
|
MTXConcat(j3dSys.getViewMtx(), j3dSys.getModel()->getMtxBuffer()->getUserAnmMtx(draw_mtx_index), mtx);
|
|
} else {
|
|
MTXConcat(j3dSys.getViewMtx(), j3dSys.getModel()->getWeightAnmMtx(draw_mtx_index), mtx);
|
|
}
|
|
|
|
J3DCalcBBoardMtx(mtx);
|
|
J3DFifoLoadPosMtxImm(mtx, 0);
|
|
|
|
mtx[0][0] = 1.0f / mtx[0][0];
|
|
mtx[1][1] = 1.0f / mtx[1][1];
|
|
mtx[2][2] = 1.0f / mtx[2][2];
|
|
mtx[0][3] = 0.0f;
|
|
mtx[1][3] = 0.0f;
|
|
mtx[2][3] = 0.0f;
|
|
|
|
|
|
if (!sNBTFlag) {
|
|
J3DFifoLoadNrmMtxImm(mtx, 0);
|
|
} else {
|
|
Vec* nbt_scale = j3dSys.getNBTScale();
|
|
J3DScaleNrmMtx(mtx, *nbt_scale);
|
|
J3DFifoLoadNrmMtxImm(mtx, 0);
|
|
}
|
|
}
|
|
|
|
void J3DShapeMtxYBBoardConcatView::load() const {
|
|
Mtx mtx1;
|
|
Mtx33 mtx2;
|
|
u16 draw_mtx_index = j3dSys.getModel()->getModelData()->getDrawMtxIndex(mUseMtxIndex);
|
|
|
|
if (j3dSys.getModel()->getModelData()->getDrawMtxFlag(mUseMtxIndex) == 0) {
|
|
MTXConcat(j3dSys.getViewMtx(), j3dSys.getModel()->getMtxBuffer()->getUserAnmMtx(draw_mtx_index), mtx1);
|
|
} else {
|
|
MTXConcat(j3dSys.getViewMtx(), j3dSys.getModel()->getWeightAnmMtx(draw_mtx_index), mtx1);
|
|
}
|
|
|
|
J3DCalcYBBoardMtx(mtx1);
|
|
J3DFifoLoadPosMtxImm(mtx1, 0);
|
|
|
|
if (sCurrentScaleFlag[mUseMtxIndex] == 1) {
|
|
if (!sNBTFlag) {
|
|
J3DFifoLoadNrmMtxImm(mtx1, 0);
|
|
} else {
|
|
Vec* nbt_scale = j3dSys.getNBTScale();
|
|
J3DScaleNrmMtx(mtx1, *nbt_scale);
|
|
J3DFifoLoadNrmMtxImm(mtx1, 0);
|
|
}
|
|
} else {
|
|
J3DPSCalcInverseTranspose(mtx1, mtx2);
|
|
if (!sNBTFlag) {
|
|
J3DFifoLoadNrmMtxImm3x3(mtx2, 0);
|
|
} else {
|
|
Vec* nbt_scale = j3dSys.getNBTScale();
|
|
J3DScaleNrmMtx33(mtx2, *nbt_scale);
|
|
J3DFifoLoadNrmMtxImm3x3(mtx2, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void dummy() {
|
|
static u8 mtxCache[20] = {
|
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
};
|
|
}
|