mirror of https://github.com/zeldaret/tp.git
390 lines
13 KiB
C++
390 lines
13 KiB
C++
//
|
|
// Generated By: dol2asm
|
|
// Translation Unit: J3DMtxBuffer
|
|
//
|
|
|
|
#include "JSystem/J3DGraphAnimator/J3DMtxBuffer.h"
|
|
#include "JSystem/J3DGraphBase/J3DMaterial.h"
|
|
#include "JSystem/JKernel/JKRHeap.h"
|
|
|
|
/* 80326214-80326258 320B54 0044+00 0/0 1/1 0/0 .text initialize__12J3DMtxBufferFv */
|
|
void J3DMtxBuffer::initialize() {
|
|
mJointTree = NULL;
|
|
mpScaleFlagArr = NULL;
|
|
mpEvlpScaleFlagArr = NULL;
|
|
mpAnmMtx = NULL;
|
|
mpWeightEvlpMtx = NULL;
|
|
mpDrawMtxArr[0] = NULL;
|
|
mpDrawMtxArr[1] = NULL;
|
|
mpNrmMtxArr[0] = NULL;
|
|
mpNrmMtxArr[1] = NULL;
|
|
mpBumpMtxArr[0] = NULL;
|
|
mpBumpMtxArr[1] = NULL;
|
|
mFlags = 1;
|
|
mCurrentViewNo = 0;
|
|
mpUserAnmMtx = NULL;
|
|
}
|
|
|
|
/* 80326258-80326364 320B98 010C+00 0/0 1/1 0/0 .text create__12J3DMtxBufferFP12J3DModelDataUl */
|
|
enum {
|
|
J3DMdlDataFlag_ConcatView = 0x10,
|
|
J3DMdlDataFlag_NoAnimation = 0x100,
|
|
};
|
|
|
|
static inline u32 getMdlDataFlag_MtxLoadType(u32 flag) {
|
|
return flag & 0x10;
|
|
}
|
|
|
|
s32 J3DMtxBuffer::create(J3DModelData* p_modelData, u32 flag) {
|
|
s32 ret;
|
|
|
|
mFlags = flag;
|
|
mJointTree = &p_modelData->getJointTree();
|
|
|
|
ret = createAnmMtx(p_modelData);
|
|
if (ret != kJ3DError_Success)
|
|
return ret;
|
|
|
|
ret = createWeightEnvelopeMtx(p_modelData);
|
|
if (ret != kJ3DError_Success)
|
|
return ret;
|
|
|
|
if (p_modelData->checkFlag(J3DMdlDataFlag_NoAnimation)) {
|
|
setNoUseDrawMtx();
|
|
} else {
|
|
switch (getMdlDataFlag_MtxLoadType(p_modelData->getFlag())) {
|
|
case J3DMdlDataFlag_ConcatView:
|
|
ret = setNoUseDrawMtx();
|
|
break;
|
|
case 0:
|
|
default:
|
|
ret = createDoubleDrawMtx(p_modelData, flag);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (ret != kJ3DError_Success)
|
|
return ret;
|
|
|
|
if (p_modelData->getFlag() & J3DMdlDataFlag_ConcatView) {
|
|
p_modelData->setBumpFlag(0);
|
|
} else {
|
|
ret = createBumpMtxArray(p_modelData, flag);
|
|
|
|
if (ret != kJ3DError_Success)
|
|
return ret;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 80326364-803263F0 320CA4 008C+00 1/1 0/0 0/0 .text createAnmMtx__12J3DMtxBufferFP12J3DModelData
|
|
*/
|
|
s32 J3DMtxBuffer::createAnmMtx(J3DModelData* p_modelData) {
|
|
if (p_modelData->getJointNum() != 0) {
|
|
mpScaleFlagArr = new u8[p_modelData->getJointNum()];
|
|
mpAnmMtx = new Mtx[p_modelData->getJointNum()];
|
|
mpUserAnmMtx = mpAnmMtx;
|
|
}
|
|
|
|
if (mpScaleFlagArr == NULL)
|
|
return kJ3DError_Alloc;
|
|
|
|
return mpAnmMtx == NULL ? kJ3DError_Alloc : kJ3DError_Success;
|
|
}
|
|
|
|
/* 803263F0-8032648C 320D30 009C+00 1/1 0/0 0/0 .text
|
|
* createWeightEnvelopeMtx__12J3DMtxBufferFP12J3DModelData */
|
|
s32 J3DMtxBuffer::createWeightEnvelopeMtx(J3DModelData* p_modelData) {
|
|
if (p_modelData->getWEvlpMtxNum() != 0) {
|
|
mpEvlpScaleFlagArr = new u8[p_modelData->getWEvlpMtxNum()];
|
|
mpWeightEvlpMtx = new Mtx[p_modelData->getWEvlpMtxNum()];
|
|
}
|
|
|
|
if (p_modelData->getWEvlpMtxNum() != 0 && mpEvlpScaleFlagArr == NULL)
|
|
return kJ3DError_Alloc;
|
|
if (p_modelData->getWEvlpMtxNum() != 0 && mpWeightEvlpMtx == NULL)
|
|
return kJ3DError_Alloc;
|
|
|
|
return kJ3DError_Success;
|
|
}
|
|
|
|
/* 804371C0-804371F0 063EE0 0030+00 1/0 0/0 0/0 .bss sNoUseDrawMtx__12J3DMtxBuffer */
|
|
Mtx J3DMtxBuffer::sNoUseDrawMtx;
|
|
|
|
/* 804371F0-80437218 063F10 0024+04 1/0 0/0 0/0 .bss sNoUseNrmMtx__12J3DMtxBuffer */
|
|
Mtx33 J3DMtxBuffer::sNoUseNrmMtx;
|
|
|
|
/* 80450970-80450974 -00001 0004+00 1/1 0/0 0/0 .sdata sNoUseDrawMtxPtr__12J3DMtxBuffer */
|
|
Mtx* J3DMtxBuffer::sNoUseDrawMtxPtr = &J3DMtxBuffer::sNoUseDrawMtx;
|
|
|
|
/* 80450974-80450978 -00001 0004+00 1/1 0/0 0/0 .sdata sNoUseNrmMtxPtr__12J3DMtxBuffer */
|
|
Mtx33* J3DMtxBuffer::sNoUseNrmMtxPtr = &J3DMtxBuffer::sNoUseNrmMtx;
|
|
|
|
/* 8032648C-803264B8 320DCC 002C+00 1/1 0/0 0/0 .text setNoUseDrawMtx__12J3DMtxBufferFv
|
|
*/
|
|
s32 J3DMtxBuffer::setNoUseDrawMtx() {
|
|
mpDrawMtxArr[1] = &sNoUseDrawMtxPtr;
|
|
mpDrawMtxArr[0] = &sNoUseDrawMtxPtr;
|
|
mpNrmMtxArr[1] = &sNoUseNrmMtxPtr;
|
|
mpNrmMtxArr[0] = &sNoUseNrmMtxPtr;
|
|
mpBumpMtxArr[1] = NULL;
|
|
mpBumpMtxArr[0] = NULL;
|
|
return kJ3DError_Success;
|
|
}
|
|
|
|
/* 803264B8-80326664 320DF8 01AC+00 1/1 0/0 0/0 .text
|
|
* createDoubleDrawMtx__12J3DMtxBufferFP12J3DModelDataUl */
|
|
s32 J3DMtxBuffer::createDoubleDrawMtx(J3DModelData* p_modelData, u32 num) {
|
|
if (num != 0) {
|
|
for (s32 i = 0; i < 2; i++) {
|
|
mpDrawMtxArr[i] = new Mtx*[num];
|
|
mpNrmMtxArr[i] = new Mtx33*[num];
|
|
mpBumpMtxArr[i] = NULL;
|
|
}
|
|
}
|
|
|
|
if (num != 0) {
|
|
for (u32 i = 0; i < 2; i++) {
|
|
if (mpDrawMtxArr[i] == NULL)
|
|
return kJ3DError_Alloc;
|
|
if (mpNrmMtxArr[i] == NULL)
|
|
return kJ3DError_Alloc;
|
|
}
|
|
}
|
|
|
|
for (s32 i = 0; i < 2; i++) {
|
|
for (u32 j = 0; j < num; j++) {
|
|
if (p_modelData->getDrawMtxNum() != 0) {
|
|
mpDrawMtxArr[i][j] = new (0x20) Mtx[p_modelData->getDrawMtxNum()];
|
|
mpNrmMtxArr[i][j] = new (0x20) Mtx33[p_modelData->getDrawMtxNum()];
|
|
}
|
|
}
|
|
}
|
|
|
|
for (s32 i = 0; i < 2; i++) {
|
|
for (u32 j = 0; j < num; j++) {
|
|
if (p_modelData->getDrawMtxNum() != 0) {
|
|
if (mpDrawMtxArr[i][j] == NULL)
|
|
return kJ3DError_Alloc;
|
|
if (mpNrmMtxArr[i][j] == NULL)
|
|
return kJ3DError_Alloc;
|
|
}
|
|
}
|
|
}
|
|
|
|
return kJ3DError_Success;
|
|
}
|
|
|
|
/* 80326664-803268D4 320FA4 0270+00 1/1 0/0 0/0 .text
|
|
* createBumpMtxArray__12J3DMtxBufferFP12J3DModelDataUl */
|
|
s32 J3DMtxBuffer::createBumpMtxArray(J3DModelData* i_modelData, u32 param_1) {
|
|
if (i_modelData->getModelDataType() == 0) {
|
|
u32 bumpMtxNum = 0;
|
|
u16 materialCount = 0;
|
|
u16 materialNum = i_modelData->getMaterialNum();
|
|
for (u16 j = 0; j < materialNum; j++) {
|
|
J3DMaterial* material = i_modelData->getMaterialNodePointer(j);
|
|
if (material->getNBTScale()->mbHasScale == true) {
|
|
bumpMtxNum += material->getShape()->countBumpMtxNum();
|
|
materialCount++;
|
|
}
|
|
}
|
|
|
|
if ((u16)bumpMtxNum != 0 && param_1 != 0) {
|
|
for (int i = 0; i < 2; i++) {
|
|
mpBumpMtxArr[i] = new Mtx33**[(u16)materialCount];
|
|
if (mpBumpMtxArr[i] == NULL) {
|
|
return kJ3DError_Alloc;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
u32 offset = 0;
|
|
u16 materialNum = i_modelData->getMaterialNum();
|
|
for (u16 j = 0; j < materialNum; j++) {
|
|
J3DMaterial* material = i_modelData->getMaterialNodePointer(j);
|
|
if (material->getNBTScale()->mbHasScale == true) {
|
|
mpBumpMtxArr[i][offset] = new Mtx33*[param_1];
|
|
if (mpBumpMtxArr[i][offset] == NULL) {
|
|
return kJ3DError_Alloc;
|
|
}
|
|
material->getShape()->setBumpMtxOffset(offset);
|
|
offset++;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
u32 offset = 0;
|
|
u16 materialNum = i_modelData->getMaterialNum();
|
|
for (u16 j = 0; j < materialNum; j++) {
|
|
J3DMaterial* material = i_modelData->getMaterialNodePointer(j);
|
|
if (material->getNBTScale()->mbHasScale == true) {
|
|
for (int k = 0; k < param_1; k++) {
|
|
mpBumpMtxArr[i][offset][k] = new (0x20) Mtx33[i_modelData->getDrawMtxNum()];
|
|
if (mpBumpMtxArr[i][offset][k] == NULL) {
|
|
return kJ3DError_Alloc;
|
|
}
|
|
}
|
|
offset++;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (materialCount != 0) {
|
|
i_modelData->setBumpFlag(1);
|
|
}
|
|
}
|
|
|
|
return kJ3DError_Success;
|
|
}
|
|
|
|
/* 80450978-80450980 0003F8 0008+00 1/1 0/0 0/0 .sdata J3DUnit01 */
|
|
static u8 J3DUnit01[8] = {
|
|
0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00,
|
|
};
|
|
|
|
/* 803268D4-80326ACC 321214 01F8+00 0/0 1/1 0/0 .text calcWeightEnvelopeMtx__12J3DMtxBufferFv */
|
|
void J3DMtxBuffer::calcWeightEnvelopeMtx() {
|
|
int max = mJointTree->getWEvlpMtxNum();
|
|
u16* indices = mJointTree->getWEvlpMixIndex();
|
|
f32* weights = mJointTree->getWEvlpMixWeight();
|
|
for (int i = -1; i < max; i++) {
|
|
u8* scaleFlags = mpEvlpScaleFlagArr;
|
|
scaleFlags[i] = 1;
|
|
Mtx* weightAnmMtx = &mpWeightEvlpMtx[i];
|
|
int mixNum = mJointTree->getWEvlpMixMtxNum(i);
|
|
for (int j = 0; j < mixNum; j++) {
|
|
u16 idx = indices[j];
|
|
f32 weight = weights[j];
|
|
Mtx& invMtx = mJointTree->getInvJointMtx(idx);
|
|
Mtx& worldMtx = mpUserAnmMtx[idx];
|
|
// I think it's this but as ASM? maybe?
|
|
MTXConcat(invMtx, worldMtx, *weightAnmMtx);
|
|
scaleFlags[i] &= mpScaleFlagArr[j];
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80326ACC-80326D3C 32140C 0270+00 0/0 1/1 0/0 .text
|
|
* calcDrawMtx__12J3DMtxBufferFUlRC3VecRA3_A4_Cf */
|
|
void J3DMtxBuffer::calcDrawMtx(u32 param_0, Vec const& param_1, Mtx const& param_2) {
|
|
MtxP viewMtx;
|
|
Mtx viewBaseMtx;
|
|
u16 fullWgtNum;
|
|
|
|
switch (param_0) {
|
|
case 0:
|
|
viewMtx = j3dSys.getViewMtx();
|
|
fullWgtNum = mJointTree->getDrawFullWgtMtxNum();
|
|
for (u16 i = 0; i < fullWgtNum; i++) {
|
|
MTXConcat(viewMtx, getAnmMtx(mJointTree->getDrawMtxIndex(i)), *getDrawMtx(i));
|
|
}
|
|
if (mJointTree->getDrawMtxNum() > fullWgtNum) {
|
|
J3DPSMtxArrayConcat(viewMtx, *mpWeightEvlpMtx, *getDrawMtx(fullWgtNum),
|
|
mJointTree->getWEvlpMtxNum());
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
fullWgtNum = mJointTree->getDrawFullWgtMtxNum();
|
|
for (u16 i = 0; i < fullWgtNum; i++) {
|
|
MTXCopy(getAnmMtx(mJointTree->getDrawMtxIndex(i)), *getDrawMtx(i));
|
|
}
|
|
fullWgtNum = mJointTree->getDrawFullWgtMtxNum();
|
|
for (u16 i = 0; i < fullWgtNum; i++) {
|
|
MTXCopy(getWeightAnmMtx(i), *getDrawMtx(mJointTree->getDrawFullWgtMtxNum() + i));
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
J3DCalcViewBaseMtx(j3dSys.getViewMtx(), param_1, param_2, viewBaseMtx);
|
|
fullWgtNum = mJointTree->getDrawFullWgtMtxNum();
|
|
for (u16 i = 0; i < fullWgtNum; i++) {
|
|
MTXConcat(viewBaseMtx, getAnmMtx(mJointTree->getDrawMtxIndex(i)), *getDrawMtx(i));
|
|
}
|
|
if (mJointTree->getDrawMtxNum() > mJointTree->getDrawFullWgtMtxNum()) {
|
|
J3DPSMtxArrayConcat(viewBaseMtx, *mpWeightEvlpMtx,
|
|
*getDrawMtx(mJointTree->getDrawFullWgtMtxNum()),
|
|
mJointTree->getWEvlpMtxNum());
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
extern void J3DPSCalcInverseTranspose(Mtx p1, Mtx33 p2);
|
|
|
|
/* 80326D3C-80326EF0 32167C 01B4+00 0/0 1/1 0/0 .text calcNrmMtx__12J3DMtxBufferFv */
|
|
void J3DMtxBuffer::calcNrmMtx() {
|
|
u16 drawMtxNum = mJointTree->getDrawMtxNum();
|
|
for (u16 i = 0; i < drawMtxNum; i++) {
|
|
if (mJointTree->getDrawMtxFlag(i) == 0) {
|
|
if (getScaleFlag(mJointTree->getDrawMtxIndex(i)) == 1) {
|
|
setNrmMtx(i, getDrawMtx(i));
|
|
} else {
|
|
J3DPSCalcInverseTranspose(*getDrawMtx(i), *getNrmMtx(i));
|
|
}
|
|
} else {
|
|
if (getEnvScaleFlag(mJointTree->getDrawMtxIndex(i)) == 1) {
|
|
setNrmMtx(i, getDrawMtx(i));
|
|
} else {
|
|
J3DPSCalcInverseTranspose(*getDrawMtx(i), *getNrmMtx(i));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80326EF0-80327048 321830 0158+00 0/0 1/1 0/0 .text calcBBoardMtx__12J3DMtxBufferFv */
|
|
void J3DMtxBuffer::calcBBoardMtx() {
|
|
u16 drawMtxNum = mJointTree->getDrawMtxNum();
|
|
for (u16 i = 0; i < drawMtxNum; i++) {
|
|
if (mJointTree->getDrawMtxFlag(i) == 0) {
|
|
u16 index = mJointTree->getDrawMtxIndex(i);
|
|
if (mJointTree->getJointNodePointer(index)->getMtxType() == 1) {
|
|
MtxP drawMtx = *getDrawMtx(i);
|
|
J3DCalcBBoardMtx(drawMtx);
|
|
Mtx33* nrmMtx = getNrmMtx(i);
|
|
(*nrmMtx)[0][0] = 1.0f / drawMtx[0][0];
|
|
(*nrmMtx)[0][1] = 0.0f;
|
|
(*nrmMtx)[0][2] = 0.0f;
|
|
(*nrmMtx)[1][0] = 0.0f;
|
|
(*nrmMtx)[1][1] = 1.0f / drawMtx[1][1];
|
|
(*nrmMtx)[1][2] = 0.0f;
|
|
(*nrmMtx)[2][0] = 0.0f;
|
|
(*nrmMtx)[2][1] = 0.0f;
|
|
(*nrmMtx)[2][2] = 1.0f / drawMtx[2][2];
|
|
} else if (mJointTree->getJointNodePointer(index)->getMtxType() == 2) {
|
|
MtxP drawMtx = *getDrawMtx(i);
|
|
J3DCalcYBBoardMtx(drawMtx);
|
|
Mtx33* nrmMtx = getNrmMtx(i);
|
|
J3DPSCalcInverseTranspose(drawMtx, *nrmMtx);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80327048-80327100 321988 00B8+00 1/1 1/1 0/0 .text
|
|
* J3DCalcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f */
|
|
void J3DCalcViewBaseMtx(Mtx view, Vec const& scale, const Mtx& base, Mtx dst) {
|
|
Mtx m;
|
|
|
|
m[0][0] = base[0][0] * scale.x;
|
|
m[0][1] = base[0][1] * scale.y;
|
|
m[0][2] = base[0][2] * scale.z;
|
|
m[0][3] = base[0][3];
|
|
|
|
m[1][0] = base[1][0] * scale.x;
|
|
m[1][1] = base[1][1] * scale.y;
|
|
m[1][2] = base[1][2] * scale.z;
|
|
m[1][3] = base[1][3];
|
|
|
|
m[2][0] = base[2][0] * scale.x;
|
|
m[2][1] = base[2][1] * scale.y;
|
|
m[2][2] = base[2][2] * scale.z;
|
|
m[2][3] = base[2][3];
|
|
|
|
MTXConcat(view, m, dst);
|
|
}
|