Misc. J3D improvements (#2570)

This commit is contained in:
Max Roncace
2025-08-08 12:56:18 +03:00
committed by GitHub
parent 57c9d64308
commit 156d2b24c3
10 changed files with 1742 additions and 1093 deletions
+2 -2
View File
@@ -1081,11 +1081,11 @@ config.libs = [
Object(MatchingFor("GZ2E01", "GZ2J01"), "JSystem/J3DGraphBase/J3DTransform.cpp"),
Object(MatchingFor("GZ2E01", "GZ2J01"), "JSystem/J3DGraphBase/J3DTexture.cpp"),
Object(MatchingFor("GZ2E01", "GZ2J01"), "JSystem/J3DGraphBase/J3DPacket.cpp"),
Object(NonMatching, "JSystem/J3DGraphBase/J3DShapeMtx.cpp"),
Object(MatchingFor("GZ2E01"), "JSystem/J3DGraphBase/J3DShapeMtx.cpp"),
Object(NonMatching, "JSystem/J3DGraphBase/J3DShapeDraw.cpp"),
Object(MatchingFor("GZ2E01", "GZ2J01"), "JSystem/J3DGraphBase/J3DShape.cpp"),
Object(MatchingFor("GZ2E01", "GZ2J01"), "JSystem/J3DGraphBase/J3DMaterial.cpp", extra_cflags=['-pragma "nosyminline off"']),
Object(Equivalent, "JSystem/J3DGraphBase/J3DMatBlock.cpp"),
Object(Equivalent, "JSystem/J3DGraphBase/J3DMatBlock.cpp"), # virtual function order
Object(MatchingFor("GZ2E01", "GZ2J01"), "JSystem/J3DGraphBase/J3DTevs.cpp"),
Object(MatchingFor("GZ2E01", "GZ2J01"), "JSystem/J3DGraphBase/J3DDrawBuffer.cpp"),
Object(MatchingFor("GZ2E01", "GZ2J01"), "JSystem/J3DGraphBase/J3DStruct.cpp"),
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -96,7 +96,7 @@ public:
/* 80314BB8 */ void addTexMtxIndexInDL(_GXAttr, u32);
/* 80314CBC */ void addTexMtxIndexInVcd(_GXAttr);
/* 80314DA8 */ void calcNBTScale(Vec const&, f32 (*)[3][3], f32 (*)[3][3]);
/* 80314E28 */ u32 countBumpMtxNum() const;
/* 80314E28 */ u16 countBumpMtxNum() const;
/* 80314EEC */ void loadVtxArray() const;
/* 80314F5C */ bool isSameVcdVatCmd(J3DShape*);
/* 80314F98 */ void makeVtxArrayCmd();
@@ -188,8 +188,8 @@ public:
/* 80314798 */ virtual ~J3DShapeMtx() {}
/* 803147E0 */ virtual u32 getType() const { return 'SMTX'; }
/* 80273E08 */ virtual u32 getUseMtxNum() const { return 1; }
/* 8031459C */ virtual u32 getUseMtxIndex(u16) const { return mUseMtxIndex; }
/* 80273E08 */ virtual u16 getUseMtxNum() const { return 1; }
/* 8031459C */ virtual u16 getUseMtxIndex(u16) const { return mUseMtxIndex; }
/* 80313B94 */ virtual void load() const;
/* 80313BF0 */ virtual void calcNBTScale(Vec const&, f32 (*)[3][3], f32 (*)[3][3]);
+13 -7
View File
@@ -13,9 +13,15 @@ class J3DTexGenBlock;
*/
class J3DTexMtxObj {
public:
Mtx& getMtx(u16 idx) { return mpTexMtx[idx]; }
Mtx44& getEffectMtx(u16 idx) { return mpEffectMtx[idx]; }
u16 getNumTexMtx() { return mTexMtxNum; }
Mtx& getMtx(u16 idx) {
J3D_ASSERT(0x113, idx <= mTexMtxNum, "Error : range over");
return mpTexMtx[idx];
}
Mtx44& getEffectMtx(u16 idx) {
J3D_ASSERT(0x125, idx <= mTexMtxNum, "Error : range over");
return mpEffectMtx[idx];
}
u16 getNumTexMtx() const { return mTexMtxNum; }
void setMtx(u16 idx, Mtx const* mtx) { MTXCopy(*mtx, mpTexMtx[idx]); }
/* 0x00 */ Mtx* mpTexMtx;
@@ -114,8 +120,8 @@ public:
/* 803146B0 */ virtual ~J3DShapeMtxMulti() {}
/* 803147E0 */ virtual u32 getType() const { return 'SMML'; }
/* 80273E08 */ virtual u32 getUseMtxNum() const { return mUseMtxNum; }
/* 8031459C */ virtual u32 getUseMtxIndex(u16 no) const { return mUseMtxIndexTable[no]; }
/* 80273E08 */ virtual u16 getUseMtxNum() const { return mUseMtxNum; }
/* 8031459C */ virtual u16 getUseMtxIndex(u16 no) const { return mUseMtxIndexTable[no]; }
/* 80313E4C */ virtual void load() const;
/* 80313EEC */ virtual void calcNBTScale(Vec const&, f32 (*)[3][3], f32 (*)[3][3]);
@@ -138,8 +144,8 @@ public:
/* 8031461C */ virtual ~J3DShapeMtxMultiConcatView() {}
/* 803147E0 */ virtual u32 getType() const { return 'SMMC'; }
/* 80273E08 */ virtual u32 getUseMtxNum() const { return mUseMtxNum; }
/* 8031459C */ virtual u32 getUseMtxIndex(u16 no) const { return mUseMtxIndexTable[no]; }
/* 80273E08 */ virtual u16 getUseMtxNum() const { return mUseMtxNum; }
/* 8031459C */ virtual u16 getUseMtxIndex(u16 no) const { return mUseMtxIndexTable[no]; }
/* 80313FA4 */ virtual void load() const;
/* 803146AC */ virtual void loadNrmMtx(int, u16) const {}
/* 8031419C */ virtual void loadNrmMtx(int, u16, f32 (*)[4]) const;
+19 -6
View File
@@ -69,6 +69,7 @@ struct J3DTevStage {
setTevStageInfo(j3dDefaultTevStageInfo);
setTevSwapModeInfo(j3dDefaultTevSwapMode);
}
void setTevColorOp(u8 param_1, u8 param_2, u8 param_3, u8 param_4, u8 param_5) {
mTevColorOp = mTevColorOp & ~(0x01 << 2) | param_1 << 2;
if (param_1 <= 1) {
@@ -128,10 +129,16 @@ struct J3DTevStage {
setTexSel(param_0.mTexSel);
setRasSel(param_0.mRasSel);
}
void setStageNo(u32 param_0) {
field_0x0 = 0xC0 + param_0 * 2;
field_0x4 = 0xC1 + param_0 * 2;
}
void setRasSel(u8 ras_sel) { mTevSwapModeInfo = (mTevSwapModeInfo & ~3) | ras_sel; }
void setTexSel(u8 tex_sel) { mTevSwapModeInfo = (mTevSwapModeInfo & ~0xc) | (tex_sel << 2); }
void load(u32 param_1) {
void load(u32 param_1) const {
J3DGDWriteBPCmd(*(u32*)&field_0x0);
J3DGDWriteBPCmd(*(u32*)&field_0x4);
}
@@ -203,7 +210,7 @@ struct J3DIndTevStage {
void setLod(u8 lod) { mInfo = (mInfo & ~0x80000) | (lod << 19); }
void setAlphaSel(u8 alphaSel) { mInfo = (mInfo & ~0x180) | (alphaSel << 7); }
void load(u32 param_1) {
void load(u32 param_1) const {
J3DGDWriteBPCmd(mInfo | (param_1 + 0x10) * 0x1000000);
}
@@ -251,14 +258,20 @@ struct J3DTevSwapModeTable {
J3DTevSwapModeTable(J3DTevSwapModeTableInfo const& info) {
mIdx = calcTevSwapTableID(info.field_0x0, info.field_0x1, info.field_0x2, info.field_0x3);
}
J3DTevSwapModeTable& operator=(const J3DTevSwapModeTable& rhs) {
mIdx = rhs.mIdx;
return *this;
}
u8 calcTevSwapTableID(u8 param_0, u8 param_1, u8 param_2, u8 param_3) {
return 0x40 * param_0 + 0x10 * param_1 + 4 * param_2 + param_3;
}
u8 getR() { return j3dTevSwapTableTable[mIdx * 4]; }
u8 getG() { return j3dTevSwapTableTable[mIdx * 4 + 1]; }
u8 getB() { return j3dTevSwapTableTable[mIdx * 4 + 2]; }
u8 getA() { return j3dTevSwapTableTable[mIdx * 4 + 3]; }
u8 getR() const { return *(&j3dTevSwapTableTable[mIdx * 4] + 0); }
u8 getG() const { return *(&j3dTevSwapTableTable[mIdx * 4] + 1); }
u8 getB() const { return *(&j3dTevSwapTableTable[mIdx * 4] + 2); }
u8 getA() const { return *(&j3dTevSwapTableTable[mIdx * 4] + 3); }
/* 0x0 */ u8 mIdx;
}; // Size: 0x1
@@ -21,6 +21,15 @@ Mtx* J3DMtxBuffer::sNoUseDrawMtxPtr = &J3DMtxBuffer::sNoUseDrawMtx;
/* 80450974-80450978 -00001 0004+00 1/1 0/0 0/0 .sdata sNoUseNrmMtxPtr__12J3DMtxBuffer */
Mtx33* J3DMtxBuffer::sNoUseNrmMtxPtr = &J3DMtxBuffer::sNoUseNrmMtx;
// force .sdata2 order
f32 dummy1() {
return 1.0f;
}
f32 dummy0() {
return 0.0f;
}
/* 80326214-80326258 320B54 0044+00 0/0 1/1 0/0 .text initialize__12J3DMtxBufferFv */
void J3DMtxBuffer::initialize() {
mJointTree = NULL;
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -110,8 +110,8 @@ void J3DShape::calcNBTScale(Vec const& param_0, f32 (*param_1)[3][3], f32 (*para
}
/* 80314E28-80314E98 30F768 0070+00 0/0 1/1 0/0 .text countBumpMtxNum__8J3DShapeCFv */
u32 J3DShape::countBumpMtxNum() const {
u32 num = 0;
u16 J3DShape::countBumpMtxNum() const {
u16 num = 0;
for (u16 i = 0; i < mMtxGroupNum; i++)
num += mShapeMtx[i]->getUseMtxNum();
return num;
+141 -143
View File
@@ -109,7 +109,6 @@ J3DTexGenBlock* J3DDifferedTexMtx::sTexGenBlock;
J3DTexMtxObj* J3DDifferedTexMtx::sTexMtxObj;
/* 8031322C-80313828 30DB6C 05FC+00 7/5 0/0 0/0 .text loadExecute__17J3DDifferedTexMtxFPA4_Cf */
// NONMATCHING regalloc
void J3DDifferedTexMtx::loadExecute(f32 const (*param_0)[4]) {
static Mtx qMtx = {
{0.5f, 0.0f, 0.5f, 0.0f},
@@ -121,194 +120,193 @@ void J3DDifferedTexMtx::loadExecute(f32 const (*param_0)[4]) {
{0.0f, -0.5f, 0.0f, 0.5f},
{0.0f, 0.0f, 1.0f, 0.0f}
};
J3DTexCoord* tex_coord;
J3DTexMtx* tex_mtx;
Mtx* mtx;
Mtx44* eff_mtx;
Mtx tmp2;
Mtx44 tmp1, tmp0;
J3DTexMtxInfo* tex_mtx_info;
J3DTexGenBlock* tex_gen_block = sTexGenBlock;
J3DTexMtxObj* tex_mtx_obj = sTexMtxObj;
Mtx* mtx; // sp_64
Mtx sp_e8;
Mtx44 sp_a8, sp_68;
J3DTexGenBlock* tex_gen_block = sTexGenBlock; // sp_60
JUT_ASSERT_MSG(0xc3, tex_gen_block != NULL, "Error : null pointer");
J3DTexMtxObj* tex_mtx_obj = sTexMtxObj; // sp_5c
JUT_ASSERT_MSG(0xc6, tex_mtx_obj != NULL, "Error : null pointer");
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 < (u16)tex_mtx_num; i++) {
tex_coord = tex_gen_block->getTexCoord(i);
int tex_gen_type = tex_coord->getTexGenType();
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 = tex_gen_block->getTexMtx(i);
u8 tex_gen_src = tex_mtx->getTexMtxInfo().mInfo;
u32 unk;
switch (tex_gen_src & 0x3f) {
tex_mtx_2 = tex_gen_block->getTexMtx(i);
JUT_ASSERT_MSG(0xd7, tex_mtx_2 != NULL, "Error : null pointer");
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& tmp5 = tex_mtx_obj->getMtx(i);
mtx = &tmp5;
mtx = &tex_mtx_obj->getMtx(i);
break;
}
case 1:
case 6:
case 7: {
Mtx& tmp6 = tex_mtx_obj->getMtx(i);
mtx = &tmp6;
mtx = &tex_mtx_obj->getMtx(i);
break;
}
case 2:
case 8:
PSMTXInverse(j3dSys.mViewMtx, tmp2);
PSMTXConcat(tex_mtx_obj->getMtx(i), tmp2, tmp2);
mtx = &tmp2;
case 8: {
MTXInverse(j3dSys.getViewMtx(), sp_e8);
MTXConcat(tex_mtx_obj->getMtx(i), sp_e8, sp_e8);
mtx = &sp_e8;
break;
case 5:
tex_mtx_info = &tex_mtx->getTexMtxInfo();
unk = (tex_gen_src & 0x80) >> 7;
if (unk == 0) {
J3DGetTextureMtxOld(tex_mtx_info->mSRT, tex_mtx_info->mCenter, tmp0);
} else if (unk == 1) {
J3DGetTextureMtxMayaOld(tex_mtx_info->mSRT, tmp0);
}
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);
}
eff_mtx = &tex_mtx_obj->getEffectMtx(i);
J3DMtxProjConcat(tmp0, *eff_mtx, tmp2);
PSMTXInverse(j3dSys.mViewMtx, tmp1);
PSMTXConcat(tmp2, tmp1, tmp2);
tmp2[2][3] = 0.0f;
tmp2[1][3] = 0.0f;
tmp2[0][3] = 0.0f;
mtx = &tmp2;
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:
tex_mtx_info = &tex_mtx->getTexMtxInfo();
unk = (tex_gen_src & 0x80) >> 7;
if (unk == 0) {
J3DGetTextureMtx(tex_mtx_info->mSRT, tex_mtx_info->mCenter, tmp0);
} else if (unk == 1) {
J3DGetTextureMtxMaya(tex_mtx_info->mSRT, tmp0);
}
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);
}
PSMTXConcat(tmp0, qMtx, tmp0);
eff_mtx = &tex_mtx_obj->getEffectMtx(i);
J3DMtxProjConcat(tmp0, *eff_mtx, tmp2);
PSMTXInverse(j3dSys.mViewMtx, tmp1);
PSMTXConcat(tmp2, tmp1, tmp2);
tmp2[2][3] = 0.0f;
tmp2[1][3] = 0.0f;
tmp2[0][3] = 0.0f;
mtx = &tmp2;
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 11:
tex_mtx_info = &tex_mtx->getTexMtxInfo();
unk = (tex_gen_src & 0x80) >> 7;
if (unk == 0) {
J3DGetTextureMtx(tex_mtx_info->mSRT, tex_mtx_info->mCenter, tmp0);
} else if (unk == 1) {
J3DGetTextureMtxMaya(tex_mtx_info->mSRT, tmp0);
}
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);
}
PSMTXConcat(tmp0, qMtx2, tmp0);
eff_mtx = &tex_mtx_obj->getEffectMtx(i);
J3DMtxProjConcat(tmp0, *eff_mtx, tmp2);
PSMTXInverse(j3dSys.mViewMtx, tmp1);
PSMTXConcat(tmp2, tmp1, tmp2);
tmp2[2][3] = 0.0f;
tmp2[1][3] = 0.0f;
tmp2[0][3] = 0.0f;
mtx = &tmp2;
break;
default:
Mtx& tmp7 = tex_mtx_obj->getMtx(i);
mtx = &tmp7;
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 < (u16)tex_mtx_num; i++) {
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) {
tex_mtx = tex_gen_block->getTexMtx(i);
u8 tex_gen_src = tex_mtx->getTexMtxInfo().mInfo;
u32 unk;
switch (tex_gen_src & 0x3f) {
J3DTexMtx* tex_mtx = tex_gen_block->getTexMtx(i); // sp_2c
JUT_ASSERT_MSG(0x145, tex_mtx != NULL, "Error : null pointer");
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:
PSMTXConcat(tex_mtx_obj->getMtx(i), param_0, tmp2);
mtx = &tmp2;
MTXConcat(tex_mtx_obj->getMtx(i), param_0, sp_e8);
mtx = &sp_e8;
break;
case 1:
case 6:
case 7:
PSMTXCopy(param_0, tmp1);
tmp1[2][3] = 0.0f;
tmp1[1][3] = 0.0f;
tmp1[0][3] = 0.0f;
PSMTXConcat(tex_mtx_obj->getMtx(i), tmp1, tmp2);
mtx = &tmp2;
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:
tex_mtx_info = &tex_mtx->getTexMtxInfo();
unk = (tex_gen_src & 0x80) >> 7;
if (unk == 0) {
J3DGetTextureMtxOld(tex_mtx_info->mSRT, tex_mtx_info->mCenter, tmp0);
} else if (unk == 1) {
J3DGetTextureMtxMayaOld(tex_mtx_info->mSRT, tmp0);
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);
}
eff_mtx = &tex_mtx_obj->getEffectMtx(i);
J3DMtxProjConcat(tmp0, *eff_mtx, tmp2);
PSMTXInverse(j3dSys.mViewMtx, tmp1);
PSMTXConcat(tmp2, tmp1, tmp2);
PSMTXConcat(tmp2, param_0, tmp2);
tmp2[2][3] = 0.0f;
tmp2[1][3] = 0.0f;
tmp2[0][3] = 0.0f;
mtx = &tmp2;
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:
tex_mtx_info = &tex_mtx->getTexMtxInfo();
unk = (tex_gen_src & 0x80) >> 7;
if (unk == 0) {
J3DGetTextureMtx(tex_mtx_info->mSRT, tex_mtx_info->mCenter, tmp0);
} else if (unk == 1) {
J3DGetTextureMtxMaya(tex_mtx_info->mSRT, tmp0);
}
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);
}
PSMTXConcat(tmp0, qMtx, tmp0);
eff_mtx = &tex_mtx_obj->getEffectMtx(i);
J3DMtxProjConcat(tmp0, *eff_mtx, tmp2);
PSMTXInverse(j3dSys.mViewMtx, tmp1);
PSMTXConcat(tmp2, tmp1, tmp2);
PSMTXConcat(tmp2, param_0, tmp2);
tmp2[2][3] = 0.0f;
tmp2[1][3] = 0.0f;
tmp2[0][3] = 0.0f;
mtx = &tmp2;
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 11:
tex_mtx_info = &tex_mtx->getTexMtxInfo();
unk = (tex_gen_src & 0x80) >> 7;
if (unk == 0) {
J3DGetTextureMtx(tex_mtx_info->mSRT, tex_mtx_info->mCenter, tmp0);
} else if (unk == 1) {
J3DGetTextureMtxMaya(tex_mtx_info->mSRT, tmp0);
}
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);
}
PSMTXConcat(tmp0, qMtx2, tmp0);
eff_mtx = &tex_mtx_obj->getEffectMtx(i);
J3DMtxProjConcat(tmp0, *eff_mtx, tmp2);
PSMTXInverse(j3dSys.mViewMtx, tmp1);
PSMTXConcat(tmp2, tmp1, tmp2);
PSMTXConcat(tmp2, param_0, tmp2);
tmp2[2][3] = 0.0f;
tmp2[1][3] = 0.0f;
tmp2[0][3] = 0.0f;
mtx = &tmp2;
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;
default:
}
case 0:
case 4:
default: {
mtx = &tex_mtx_obj->getMtx(i);
break;
}
GXLoadTexMtxImm(*mtx, i * 3 + 0x1e,
(GXTexMtxType)tex_mtx->getTexMtxInfo().mProjection);
}
GXLoadTexMtxImm(*mtx, i * 3 + 30,
(GXTexMtxType)tex_mtx_info_1->mProjection);
}
}
}
+12 -7
View File
@@ -4,10 +4,14 @@
//
#include "JSystem/J3DGraphBase/J3DTexture.h"
#include "dolphin/gx.h"
#include "global.h"
/* 8031204C-803121A4 30C98C 0158+00 0/0 1/1 0/0 .text loadGX__10J3DTextureCFUs11_GXTexMapID */
void J3DTexture::loadGX(u16 idx, GXTexMapID texMapID) const {
J3D_ASSERT(0, idx < mNum, "Error : range over.");
ResTIMG* timg = getResTIMG(idx);
GXTexObj texObj;
@@ -37,8 +41,11 @@ void J3DTexture::loadGX(u16 idx, GXTexMapID texMapID) const {
/* 803121A4-8031221C 30CAE4 0078+00 1/1 0/0 0/0 .text entryNum__10J3DTextureFUs */
void J3DTexture::entryNum(u16 num) {
J3D_ASSERT(79, num != 0, "Error : non-zero argument is specified 0.");
mNum = num;
mpRes = new ResTIMG[num]();
J3D_ASSERT(83, mpRes != 0, "Error : allocate memory.");
for (s32 i = 0; i < mNum; i++) {
mpRes[i].paletteOffset = 0;
@@ -51,20 +58,18 @@ void J3DTexture::addResTIMG(u16 newNum, ResTIMG const* newRes) {
if (newNum == 0)
return;
J3D_ASSERT(105, newRes != 0, "Error : null pointer.");
u16 oldNum = mNum;
ResTIMG* oldRes = mpRes;
entryNum(mNum + newNum);
for (u16 i = 0; i < oldNum; i++) {
mpRes[i] = oldRes[i];
mpRes[i].imageOffset = (u32)(&oldRes[i]) + mpRes[i].imageOffset - (u32)(&mpRes[i]);
mpRes[i].paletteOffset = (u32)(&oldRes[i]) + mpRes[i].paletteOffset - (u32)(&mpRes[i]);
setResTIMG(i, oldRes[i]);
}
for (u16 i = oldNum; i < mNum; i++) {
mpRes[i] = newRes[i];
mpRes[i].imageOffset = (u32)(&newRes[i]) + mpRes[i].imageOffset - (u32)(&mpRes[i]);
mpRes[i].paletteOffset = (u32)(&newRes[i]) + mpRes[i].paletteOffset - (u32)(&mpRes[i]);
setResTIMG(i, newRes[i]);
}
}
}