From 0e281cb97535523a3d1a4f668bc84321bc39fb46 Mon Sep 17 00:00:00 2001 From: TakaRikka <38417346+TakaRikka@users.noreply.github.com> Date: Sun, 29 Dec 2024 07:53:54 -0800 Subject: various matches / cleanup (#2271) * cleanup various TUs * checkpoint * d_attention doc --- src/m_Do/m_Do_ext.cpp | 741 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 634 insertions(+), 107 deletions(-) (limited to 'src/m_Do/m_Do_ext.cpp') diff --git a/src/m_Do/m_Do_ext.cpp b/src/m_Do/m_Do_ext.cpp index 0859c03d6c..228ece62dc 100644 --- a/src/m_Do/m_Do_ext.cpp +++ b/src/m_Do/m_Do_ext.cpp @@ -16,6 +16,7 @@ #include "d/d_com_inf_game.h" #include "dol2asm.h" #include "dolphin/gx/GXDraw.h" +#include #include "global.h" #include "m_Do/m_Do_mtx.h" @@ -209,49 +210,8 @@ void mDoExt_brkAnm::entry(J3DMaterialTable* i_matTable, f32 i_frame) { i_matTable->entryTevRegAnimator(mpAnm); } -/* ############################################################################################## */ -/* 803A3020-803A30C0 000140 0085+1B 1/1 0/0 0/0 .data l_invisibleMat$7041 */ -static u8 l_invisibleMat[133] ALIGN_DECL(32) = { - 0x10, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, - 0x00, 0x04, 0x00, 0x61, 0x28, 0x38, 0x00, 0x00, 0x61, 0xC0, 0x08, 0xFF, 0xFC, 0x61, 0xC1, - 0x08, 0xFF, 0xF0, 0x61, 0xF3, 0x7F, 0x00, 0x00, 0x61, 0x43, 0x00, 0x00, 0x41, 0x61, 0x40, - 0x00, 0x00, 0x17, 0x61, 0xEE, 0x00, 0x00, 0x00, 0x61, 0xEF, 0x00, 0x00, 0x00, 0x61, 0xF0, - 0x00, 0x00, 0x00, 0x61, 0xF1, 0x00, 0x00, 0x00, 0x61, 0xF2, 0x00, 0x00, 0x00, 0x61, 0x41, - 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x10, 0x09, 0x00, 0x00, 0x00, 0x01, 0x61, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -/* 803A30C0-803A3160 0001E0 0084+1C 1/1 0/0 0/0 .data l_matDL */ -static u8 l_matDL[132] ALIGN_DECL(32) = { - 0x08, 0x30, 0x3C, 0xF3, 0xCF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x18, 0x3C, 0xF3, 0xCF, 0x00, - 0x10, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x7F, 0x32, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, - 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x28, 0x38, - 0x00, 0x00, 0x61, 0xC0, 0x28, 0xF6, 0xAF, 0x61, 0xC1, 0x08, 0xFF, 0xE0, 0x61, 0x43, 0x00, - 0x00, 0x41, 0x61, 0x40, 0x00, 0x00, 0x17, 0x61, 0x41, 0x00, 0x00, 0x0C, 0x61, 0xF3, 0x7F, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, - 0x09, 0x00, 0x00, 0x00, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -/* 803A3160-803A31F0 000280 008D+03 1/1 0/0 0/0 .data l_mat1DL */ -static u8 l_mat1DL[141] ALIGN_DECL(32) = { - 0x10, 0x00, 0x00, 0x10, 0x40, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xCF, 0x00, 0x10, - 0x00, 0x00, 0x10, 0x18, 0x3C, 0xF3, 0xCF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x7F, - 0x32, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0C, 0xFF, - 0xFF, 0xFF, 0xFF, 0x61, 0x28, 0x38, 0x00, 0x40, 0x61, 0xC0, 0x28, 0xFA, 0x8F, 0x61, 0xC1, 0x08, - 0xFF, 0xF0, 0x61, 0x43, 0x00, 0x00, 0x41, 0x61, 0x40, 0x00, 0x00, 0x17, 0x61, 0x41, 0x00, 0x00, - 0x0C, 0x61, 0xF3, 0x7F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x10, - 0x00, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x01, 0x61, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - /* 8000D7DC-8000D8E4 00811C 0108+00 0/0 18/18 85/85 .text * init__13mDoExt_bckAnmFP15J3DAnmTransformiifssb */ -// NONMATCHING J3DMtxCalcAnimation inheritance int mDoExt_bckAnm::init(J3DAnmTransform* i_bck, int i_play, int i_attr, f32 i_rate, s16 i_startF, s16 i_endF, bool i_modify) { JUT_ASSERT(614, (i_modify || isCurrentSolidHeap()) && i_bck != 0); @@ -1150,66 +1110,77 @@ int mDoExt_McaMorf::create(J3DModelData* modelData, mDoExt_McaMorfCallBack1_c* c /* 80010074-8001037C 00A9B4 0308+00 1/0 0/0 0/0 .text calc__14mDoExt_McaMorfFv */ // NONMATCHING regalloc void mDoExt_McaMorf::calc() { - if (!mpModel) { + if (mpModel == NULL) { return; } + u16 jntNo = getJoint()->getJntNo(); j3dSys.setCurrentMtxCalc(this); - J3DTransformInfo info1; - J3DTransformInfo* infoPtr; + + Mtx sp68; + J3DTransformInfo sp48; + J3DTransformInfo sp28; + J3DTransformInfo* var_r29; if (mpTransformInfo == NULL) { - infoPtr = &info1; + var_r29 = &sp48; } else { - infoPtr = &mpTransformInfo[jntNo]; + var_r29 = &mpTransformInfo[jntNo]; } - Quaternion quat1; - Quaternion* quatPtr; + + Quaternion sp18; + Quaternion* var_r27; if (mpQuat == NULL) { - quatPtr = &quat1; + var_r27 = &sp18; } else { - quatPtr = &mpQuat[jntNo]; - } - if (!mpAnm) { - *infoPtr = mpModel->getModelData()->getJointNodePointer(jntNo)->getTransformInfo(); - if (mpCallback1) { - mpCallback1->execute(jntNo, infoPtr); - } - JMAEulerToQuat(infoPtr->mRotation.x, infoPtr->mRotation.y, infoPtr->mRotation.z, quatPtr); - J3DMtxCalcCalcTransformMaya::calcTransform(*infoPtr); - } else if (mCurMorf >= 1.0f || !mpTransformInfo || !mpQuat) { - getTransform(jntNo, infoPtr); - if (mpCallback1) { - mpCallback1->execute(jntNo, infoPtr); - } - JMAEulerToQuat(infoPtr->mRotation.x, infoPtr->mRotation.y, infoPtr->mRotation.z, quatPtr); - J3DMtxCalcCalcTransformMaya::calcTransform(*infoPtr); + var_r27 = &mpQuat[jntNo]; + } + + if (mpAnm == NULL) { + *var_r29 = mpModel->getModelData()->getJointNodePointer(jntNo)->getTransformInfo(); + if (mpCallback1 != NULL) { + mpCallback1->execute(jntNo, var_r29); + } + + JMAEulerToQuat(var_r29->mRotation.x, var_r29->mRotation.y, var_r29->mRotation.z, var_r27); + J3DMtxCalcCalcTransformMaya::calcTransform(*var_r29); + } else if (mCurMorf >= 1.0f || mpTransformInfo == NULL || mpQuat == NULL) { + getTransform(jntNo, var_r29); + if (mpCallback1 != NULL) { + mpCallback1->execute(jntNo, var_r29); + } + JMAEulerToQuat(var_r29->mRotation.x, var_r29->mRotation.y, var_r29->mRotation.z, var_r27); + J3DMtxCalcCalcTransformMaya::calcTransform(*var_r29); } else { - f32 f31; + f32 var_f31; if (field_0x52) { - f31 = 1.0f; + var_f31 = 1.0f; } else { - f31 = (mCurMorf - mPrevMorf) / (1.0f - mPrevMorf); - } - f32 f30 = 1.0f - f31; - J3DTransformInfo info2; - Quaternion quat2; - getTransform(jntNo, &info2); - if (mpCallback1) { - mpCallback1->execute(jntNo, &info2); - } - JMAEulerToQuat(info2.mRotation.x, info2.mRotation.y, info2.mRotation.z, &quat2); - JMAQuatLerp(quatPtr, &quat2, f31, quatPtr); - Mtx mtx; - mDoMtx_quat(mtx, quatPtr); - infoPtr->mTranslate.x = infoPtr->mTranslate.x * f30 + info2.mTranslate.x * f31; - infoPtr->mTranslate.y = infoPtr->mTranslate.y * f30 + info2.mTranslate.y * f31; - infoPtr->mTranslate.z = infoPtr->mTranslate.z * f30 + info2.mTranslate.z * f31; - infoPtr->mScale.x = infoPtr->mScale.x * f30 + info2.mScale.x * f31; - infoPtr->mScale.y = infoPtr->mScale.y * f30 + info2.mScale.y * f31; - infoPtr->mScale.z = infoPtr->mScale.z * f30 + info2.mScale.z * f31; - mDoExt_setJ3DData(mtx, infoPtr, jntNo); - } - if (mpCallback2) { + var_f31 = (mCurMorf - mPrevMorf) / (1.0f - mPrevMorf); + } + f32 var_f30 = 1.0f - var_f31; + + Quaternion sp8; + getTransform(jntNo, &sp28); + + if (mpCallback1 != NULL) { + mpCallback1->execute(jntNo, &sp28); + } + + JMAEulerToQuat(sp28.mRotation.x, sp28.mRotation.y, sp28.mRotation.z, &sp8); + JMAQuatLerp(var_r27, &sp8, var_f31, var_r27); + + mDoMtx_quat(sp68, var_r27); + + var_r29->mTranslate.x = var_r29->mTranslate.x * var_f30 + sp28.mTranslate.x * var_f31; + var_r29->mTranslate.y = var_r29->mTranslate.y * var_f30 + sp28.mTranslate.y * var_f31; + var_r29->mTranslate.z = var_r29->mTranslate.z * var_f30 + sp28.mTranslate.z * var_f31; + var_r29->mScale.x = var_r29->mScale.x * var_f30 + sp28.mScale.x * var_f31; + var_r29->mScale.y = var_r29->mScale.y * var_f30 + sp28.mScale.y * var_f31; + var_r29->mScale.z = var_r29->mScale.z * var_f30 + sp28.mScale.z * var_f31; + mDoExt_setJ3DData(sp68, var_r29, jntNo); + } + + if (mpCallback2 != NULL) { mpCallback2->execute(jntNo); } } @@ -1631,11 +1602,72 @@ mDoExt_McaMorf2::~mDoExt_McaMorf2() { /* 80011464-800116B4 00BDA4 0250+00 1/1 0/0 0/0 .text * create__15mDoExt_McaMorf2FP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformP15J3DAnmTransformifiiP10Z2CreatureUlUl */ -void mDoExt_McaMorf2::create(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c* param_1, + int mDoExt_McaMorf2::create(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c* param_1, mDoExt_McaMorfCallBack2_c* param_2, J3DAnmTransform* param_3, J3DAnmTransform* param_4, int param_5, f32 param_6, int param_7, int param_8, Z2Creature* param_9, u32 param_10, u32 param_11) { - // NONMATCHING + mpModel = NULL; + mpTransformInfo = NULL; + mpQuat = NULL; + mpSound = NULL; + + if (param_0 == NULL) { + return 0; + } + + if (param_0->getMaterialNodePointer(0)->getSharedDisplayListObj() != NULL && param_10 == 0) { + if (param_0->isLocked()) { + param_10 = 0x20000; + } else { + param_10 = 0x80000; + } + } + + mpModel = mDoExt_J3DModel__create(param_0, param_10, param_11); + if (mpModel == NULL) { + return 0; + } + + if (param_10 != 0x80000) { + mDoExt_changeMaterial(mpModel); + } + + mpSound = param_9; + + setAnm(param_3, param_4, 0.0f, param_5, 0.0f, param_6, param_7, param_8); + mPrevMorf = -1.0f; + + mpTransformInfo = new J3DTransformInfo[param_0->getJointNum()]; + if (mpTransformInfo == NULL) { + ERROR_EXIT(); + return 0; + } + + mpQuat = new Quaternion[param_0->getJointNum()]; + if (mpQuat == NULL) { + ERROR_EXIT(); + return 0; + } + + J3DTransformInfo* var_r29 = mpTransformInfo; + Quaternion* var_r26 = mpQuat; + J3DModelData* model_data = mpModel->getModelData(); + int sp3C = model_data->getJointNum(); + + for (int i = 0; i < sp3C; i++) { + J3DJoint* sp30 = model_data->getJointNodePointer(i); + J3DTransformInfo* sp2C = &sp30->getTransformInfo(); + + *var_r29 = *sp2C; + JMAEulerToQuat(var_r29->mRotation.x, var_r29->mRotation.y, var_r29->mRotation.z, var_r26); + + var_r29++; + var_r26++; + } + + mpCallback1 = param_1; + mpCallback2 = param_2; + return 1; } /* 800116B4-800116F4 00BFF4 0040+00 1/1 0/0 0/0 .text ERROR_EXIT__15mDoExt_McaMorf2Fv */ @@ -1654,15 +1686,217 @@ void mDoExt_McaMorf2::ERROR_EXIT() { } /* 800116F4-80011D70 00C034 067C+00 1/0 0/0 0/0 .text calc__15mDoExt_McaMorf2Fv */ +// NONMATCHING - float regswap, equivalent void mDoExt_McaMorf2::calc() { - // NONMATCHING + if (mpModel != NULL) { + u16 jnt_no = J3DMtxCalc::getJoint()->getJntNo(); + j3dSys.setCurrentMtxCalc(this); + + J3DTransformInfo spF0[2]; + Mtx spC0; + + J3DTransformInfo spA0; + J3DTransformInfo sp80; + J3DTransformInfo* var_r30; + if (mpTransformInfo == NULL) { + var_r30 = &spA0; + } else { + var_r30 = &mpTransformInfo[jnt_no]; + } + + Quaternion sp60[2]; + Quaternion sp40[2]; + + Quaternion sp30; + Quaternion sp20; + Quaternion* var_r27; + if (mpQuat == NULL) { + var_r27 = &sp30; + } else { + var_r27 = &mpQuat[jnt_no]; + } + + if (mpAnm == NULL) { + *var_r30 = mpModel->getModelData()->getJointNodePointer(jnt_no)->getTransformInfo(); + + if (mpCallback1 != NULL) { + mpCallback1->execute(jnt_no, var_r30); + } + + JMAEulerToQuat(var_r30->mRotation.x, var_r30->mRotation.y, var_r30->mRotation.z, + var_r27); + J3DMtxCalcCalcTransformMaya::calcTransform(*var_r30); + } else if (mCurMorf >= 1.0f || mpTransformInfo == NULL || mpQuat == NULL) { + mpAnm->getTransform(jnt_no, &spF0[0]); + if (field_0x40 == NULL) { + if (mpCallback1 != NULL) { + mpCallback1->execute(jnt_no, &spF0[0]); + } + + JMAEulerToQuat(spF0[0].mRotation.x, spF0[0].mRotation.y, spF0[0].mRotation.z, + var_r27); + J3DMtxCalcCalcTransformMaya::calcTransform(spF0[0]); + *var_r30 = spF0[0]; + } else { + field_0x40->getTransform(jnt_no, &spF0[1]); + + f32 sp1C; + f32 sp18; + sp18 = 1.0f - field_0x44; + sp1C = field_0x44; + + var_r30->mScale.x = spF0[0].mScale.x * sp18 + + spF0[1].mScale.x * sp1C; + var_r30->mScale.y = spF0[0].mScale.y * sp18 + + spF0[1].mScale.y * sp1C; + var_r30->mScale.z = spF0[0].mScale.z * sp18 + + spF0[1].mScale.z * sp1C; + var_r30->mTranslate.x = spF0[0].mTranslate.x * sp18 + + spF0[1].mTranslate.x * sp1C; + var_r30->mTranslate.y = spF0[0].mTranslate.y * sp18 + + spF0[1].mTranslate.y * sp1C; + var_r30->mTranslate.z = spF0[0].mTranslate.z * sp18 + + spF0[1].mTranslate.z * sp1C; + + for (int i = 0; i < 2; i++) { + JMAEulerToQuat(spF0[i].mRotation.x, spF0[i].mRotation.y, spF0[i].mRotation.z, &sp60[i]); + } + + f32 var_f29 = sp1C / (sp18 + sp1C); + + JMAQuatLerp(&sp60[0], &sp60[1], var_f29, var_r27); + mDoMtx_quat(spC0, var_r27); + mDoExt_setJ3DData(spC0, var_r30, jnt_no); + } + } else if (field_0x40 == NULL) { + f32 var_f31 = (mCurMorf - mPrevMorf) / (1.0f - mPrevMorf); + f32 var_f30 = 1.0f - var_f31; + + mpAnm->getTransform(jnt_no, &sp80); + if (mpCallback1 != NULL) { + mpCallback1->execute(jnt_no, &sp80); + } + + JMAEulerToQuat(sp80.mRotation.x, sp80.mRotation.y, sp80.mRotation.z, &sp20); + JMAQuatLerp(var_r27, &sp20, var_f31, var_r27); + mDoMtx_quat(spC0, var_r27); + + var_r30->mTranslate.x = var_r30->mTranslate.x * var_f30 + + sp80.mTranslate.x * var_f31; + var_r30->mTranslate.y = var_r30->mTranslate.y * var_f30 + + sp80.mTranslate.y * var_f31; + var_r30->mTranslate.z = var_r30->mTranslate.z * var_f30 + + sp80.mTranslate.z * var_f31; + var_r30->mScale.x = var_r30->mScale.x * var_f30 + + sp80.mScale.x * var_f31; + var_r30->mScale.y = var_r30->mScale.y * var_f30 + + sp80.mScale.y * var_f31; + var_r30->mScale.z = var_r30->mScale.z * var_f30 + + sp80.mScale.z * var_f31; + + mDoExt_setJ3DData(spC0, var_r30, jnt_no); + } else { + mpAnm->getTransform(jnt_no, &spF0[0]); + field_0x40->getTransform(jnt_no, &spF0[1]); + + f32 sp14, sp10; + sp10 = 1.0f - field_0x44; + sp14 = field_0x44; + + sp80.mScale.x = spF0[0].mScale.x * sp10 + + spF0[1].mScale.x * sp14; + sp80.mScale.y = spF0[0].mScale.y * sp10 + + spF0[1].mScale.y * sp14; + sp80.mScale.z = spF0[0].mScale.z * sp10 + + spF0[1].mScale.z * sp14; + sp80.mTranslate.x = spF0[0].mTranslate.x * sp10 + + spF0[1].mTranslate.x * sp14; + sp80.mTranslate.y = spF0[0].mTranslate.y * sp10 + + spF0[1].mTranslate.y * sp14; + sp80.mTranslate.z = spF0[0].mTranslate.z * sp10 + + spF0[1].mTranslate.z * sp14; + + for (int i = 0; i < 2; i++) { + JMAEulerToQuat(spF0[i].mRotation.x, spF0[i].mRotation.y, spF0[i].mRotation.z, &sp40[i]); + } + + f32 var_f31 = sp14 / (sp10 + sp14); + JMAQuatLerp(&sp40[0], &sp40[1], var_f31, &sp20); + + var_f31 = (mCurMorf - mPrevMorf) / (1.0f - mPrevMorf); + f32 var_f30 = 1.0f - var_f31; + JMAQuatLerp(var_r27, &sp20, var_f31, var_r27); + + var_r30->mTranslate.x = var_r30->mTranslate.x * var_f30 + + sp80.mTranslate.x * var_f31; + var_r30->mTranslate.y = var_r30->mTranslate.y * var_f30 + + sp80.mTranslate.y * var_f31; + var_r30->mTranslate.z = var_r30->mTranslate.z * var_f30 + + sp80.mTranslate.z * var_f31; + var_r30->mScale.x = var_r30->mScale.x * var_f30 + + sp80.mScale.x * var_f31; + var_r30->mScale.y = var_r30->mScale.y * var_f30 + + sp80.mScale.y * var_f31; + var_r30->mScale.z = var_r30->mScale.z * var_f30 + + sp80.mScale.z * var_f31; + + mDoMtx_quat(spC0, var_r27); + mDoExt_setJ3DData(spC0, var_r30, jnt_no); + } + + if (mpCallback2 != NULL) { + mpCallback2->execute(jnt_no); + } + } } /* 80011D70-80011FCC 00C6B0 025C+00 1/1 0/0 2/2 .text * setAnm__15mDoExt_McaMorf2FP15J3DAnmTransformP15J3DAnmTransformfiffff */ void mDoExt_McaMorf2::setAnm(J3DAnmTransform* param_0, J3DAnmTransform* param_1, f32 param_2, - int param_3, f32 param_4, f32 param_5, f32 param_6, f32 param_7) { - // NONMATCHING + int i_attr, f32 i_morf, f32 i_speed, f32 i_start, f32 i_end) { + mpAnm = param_0; + field_0x40 = param_1; + field_0x44 = param_2; + + setStartFrame(i_start); + + if (i_end < 0.0f) { + if (mpAnm == NULL) { + mFrameCtrl.init(0); + } else { + mFrameCtrl.init(mpAnm->getFrameMax()); + } + } else { + mFrameCtrl.init(i_end); + } + + if (i_attr < 0) { + i_attr = param_0->getAttribute(); + } + + setPlayMode(i_attr); + setPlaySpeed(i_speed); + + if (i_speed >= 0.0f) { + setFrame(i_start); + } else { + setFrame(mFrameCtrl.getEnd()); + } + + setLoopFrame(getFrame()); + setMorf(i_morf); + + if (mpSound != NULL) { + if (param_2 < 0.5f) { + mpBas = ((mDoExt_transAnmBas*)param_0)->getBas(); + } else { + mpBas = ((mDoExt_transAnmBas*)param_1)->getBas(); + } + + if (mpBas != NULL) { + mpSound->initAnime(mpBas, getPlaySpeed() >= 0.0f, getLoopFrame(), getFrame()); + } + } } /* 80011FCC-800120A0 00C90C 00D4+00 0/0 0/0 2/2 .text setAnmRate__15mDoExt_McaMorf2Ff */ @@ -1735,26 +1969,187 @@ void mDoExt_McaMorf2::stopZelAnime() { } /* 80012220-800123D0 00CB60 01B0+00 1/0 0/0 0/0 .text draw__19mDoExt_invJntPacketFv */ -// void mDoExt_invJntPacket::draw() { -extern "C" void draw__19mDoExt_invJntPacketFv() { - // NONMATCHING +void mDoExt_invJntPacket::draw() { + J3DShape::resetVcdVatCache(); + + if (field_0x16) { + J3DModelData* sp20 = field_0x10->getModelData(); + J3DJoint* sp1C = sp20->getJointNodePointer(field_0x14); + + for (J3DMaterial* mesh = sp1C->getMesh(); mesh != NULL; mesh = mesh->getNext()) { + mesh->load(); + J3DMatPacket* sp18 = field_0x10->getMatPacket(mesh->getIndex()); + sp18->callDL(); + GFSetZMode(1, GX_LEQUAL, 1); + GFSetBlendModeEtc(GX_BM_NONE, GX_BL_ZERO, GX_BL_ZERO, GX_LO_CLEAR, 0, 0, 1); + + J3DShapePacket* shapePkt = sp18->getShapePacket(); + JUT_ASSERT(0x1393, shapePkt != 0); + shapePkt->getShape()->loadPreDrawSetting(); + + do { + if (!shapePkt->getShape()->checkFlag(1)) { + if (shapePkt->getDisplayListObj() != NULL) { + shapePkt->getDisplayListObj()->callDL(); + } + + shapePkt->drawFast(); + } + + shapePkt = (J3DShapePacket*)shapePkt->getNextPacket(); + } while (shapePkt != NULL); + } + } else { + static u8 l_invisibleMat[] ALIGN_DECL(32) = { + 0x10, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, + 0x00, 0x04, 0x00, 0x61, 0x28, 0x38, 0x00, 0x00, 0x61, 0xC0, 0x08, 0xFF, 0xFC, 0x61, 0xC1, + 0x08, 0xFF, 0xF0, 0x61, 0xF3, 0x7F, 0x00, 0x00, 0x61, 0x43, 0x00, 0x00, 0x41, 0x61, 0x40, + 0x00, 0x00, 0x17, 0x61, 0xEE, 0x00, 0x00, 0x00, 0x61, 0xEF, 0x00, 0x00, 0x00, 0x61, 0xF0, + 0x00, 0x00, 0x00, 0x61, 0xF1, 0x00, 0x00, 0x00, 0x61, 0xF2, 0x00, 0x00, 0x00, 0x61, 0x41, + 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x10, 0x09, 0x00, 0x00, 0x00, 0x01, 0x61, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + GXCallDisplayList(l_invisibleMat, 0x80); + + J3DModelData* sp14 = field_0x10->getModelData(); + J3DJoint* sp10 = sp14->getJointNodePointer(field_0x14); + J3DMaterial* mesh = sp10->getMesh(); + + sp14->getShapeNodePointer(0)->loadPreDrawSetting(); + + for (; mesh != NULL; mesh = mesh->getNext()) { + J3DShape* spC = mesh->getShape(); + if (!spC->checkFlag(1)) { + J3DShapePacket* shapePkt = field_0x10->getShapePacket(spC->getIndex()); + shapePkt->drawFast(); + } + } + } + + J3DShape::resetVcdVatCache(); + GFSetBlendModeEtc(GX_BM_NONE, GX_BL_ZERO, GX_BL_ZERO, GX_LO_CLEAR, 1, 0, 1); } /* 800123D0-800125DC 00CD10 020C+00 2/2 0/0 0/0 .text init__15mDoExt_3Dline_cFUsii */ -void mDoExt_3Dline_c::init(u16 param_0, int param_1, int param_2) { - // NONMATCHING +// NONMATCHING - regalloc, probably some types are wrong +int mDoExt_3Dline_c::init(u16 param_0, int param_1, int param_2) { + field_0x0 = new cXyz[param_0]; + if (field_0x0 == NULL) { + return 0; + } + + if (param_1 != 0) { + field_0x4 = new f32[param_1]; + if (field_0x4 == NULL) { + return 0; + } + } else { + field_0x4 = NULL; + } + + int sp20 = param_0 * 2; + + field_0x8 = new cXyz[sp20]; + if (field_0x8 == NULL) { + return 0; + } + + field_0xc = new cXyz[sp20]; + if (field_0xc == NULL) { + return 0; + } + + field_0x10 = new u8[param_0 * 3]; + if (field_0x10 == NULL) { + return 0; + } + + field_0x14 = new u8[param_0 * 3]; + if (field_0x14 == NULL) { + return 0; + } + + if (param_2 != 0) { + field_0x18 = new f32[sp20]; + if (field_0x18 == NULL) { + return 0; + } + + field_0x1c = new f32[sp20]; + if (field_0x1c == NULL) { + return 0; + } + + f32* var_r28 = field_0x18; + f32* var_r27 = field_0x1c; + for (int i = 0; i < param_0; i++) { + var_r28[0] = 0.0f; + var_r27[0] = 0.0f; + + var_r28[2] = 1.0f; + var_r27[2] = 1.0f; + + var_r28 += 4; + var_r27 += 4; + } + } + + return 1; } /* 800125E0-800126BC 00CF20 00DC+00 0/0 0/0 12/12 .text init__19mDoExt_3DlineMat0_cFUsUsi */ int mDoExt_3DlineMat0_c::init(u16 param_0, u16 param_1, int param_2) { - // NONMATCHING + field_0x10 = param_0; + field_0x12 = param_1; + + field_0x18 = new mDoExt_3Dline_c[param_0]; + if (field_0x18 == NULL) { + return 0; + } + + for (int i = 0; i < param_0; i++) { + if (!field_0x18[i].init(param_1, param_2, 0)) { + return 0; + } + } + + field_0x4 = NULL; + field_0x16 = 0; + return 1; } /* 800126BC-800126C0 00CFFC 0004+00 2/2 0/0 0/0 .text __ct__15mDoExt_3Dline_cFv */ -mDoExt_3Dline_c::mDoExt_3Dline_c() { - /* empty function */ -} +mDoExt_3Dline_c::mDoExt_3Dline_c() {} + +/* 803A30C0-803A3160 0001E0 0084+1C 1/1 0/0 0/0 .data l_matDL */ +static u8 l_matDL[132] ALIGN_DECL(32) = { + 0x08, 0x30, 0x3C, 0xF3, 0xCF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x18, 0x3C, 0xF3, 0xCF, 0x00, + 0x10, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x7F, 0x32, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, + 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x28, 0x38, + 0x00, 0x00, 0x61, 0xC0, 0x28, 0xF6, 0xAF, 0x61, 0xC1, 0x08, 0xFF, 0xE0, 0x61, 0x43, 0x00, + 0x00, 0x41, 0x61, 0x40, 0x00, 0x00, 0x17, 0x61, 0x41, 0x00, 0x00, 0x0C, 0x61, 0xF3, 0x7F, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, + 0x09, 0x00, 0x00, 0x00, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +/* 803A3160-803A31F0 000280 008D+03 1/1 0/0 0/0 .data l_mat1DL */ +static u8 l_mat1DL[141] ALIGN_DECL(32) = { + 0x10, 0x00, 0x00, 0x10, 0x40, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xCF, 0x00, 0x10, + 0x00, 0x00, 0x10, 0x18, 0x3C, 0xF3, 0xCF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x7F, + 0x32, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0C, 0xFF, + 0xFF, 0xFF, 0xFF, 0x61, 0x28, 0x38, 0x00, 0x40, 0x61, 0xC0, 0x28, 0xFA, 0x8F, 0x61, 0xC1, 0x08, + 0xFF, 0xF0, 0x61, 0x43, 0x00, 0x00, 0x41, 0x61, 0x40, 0x00, 0x00, 0x17, 0x61, 0x41, 0x00, 0x00, + 0x0C, 0x61, 0xF3, 0x7F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x10, + 0x00, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x01, 0x61, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; /* 800126C0-80012774 00D000 00B4+00 1/0 0/0 0/0 .text setMaterial__19mDoExt_3DlineMat0_cFv */ void mDoExt_3DlineMat0_c::setMaterial() { @@ -1773,21 +2168,151 @@ void mDoExt_3DlineMat0_c::setMaterial() { } /* 80012774-80012874 00D0B4 0100+00 1/0 0/0 0/0 .text draw__19mDoExt_3DlineMat0_cFv */ +// NONMATCHING - issues with the iterators void mDoExt_3DlineMat0_c::draw() { - // NONMATCHING + GXSetTevColor(GX_TEVREG2, field_0x8); + + if (field_0xc != NULL) { + dKy_Global_amb_set(field_0xc); + } + + mDoExt_3Dline_c* var_r28 = field_0x18; + int var_r26 = (field_0x14 & 0x7FFF) << 1; + + for (int i = 0; i < field_0x10; i++) { + GXSetArray(GX_VA_POS, var_r28[field_0x16].field_0x8, sizeof(cXyz)); + GXSetArray(GX_VA_NRM, var_r28[field_0x16].field_0x10, 3); + + GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, var_r26); + for (u16 j = 0; j < (u16)var_r26;) { + GXPosition1x16(j); + GXNormal1x16(j); + j++; + + GXPosition1x16(j); + GXNormal1x16(j); + j++; + } + GXEnd(); + var_r28++; + } + + field_0x16 ^= 1; } /* 80012874-80012E3C 00D1B4 05C8+00 0/0 0/0 2/2 .text * update__19mDoExt_3DlineMat0_cFifR8_GXColorUsP12dKy_tevstr_c */ -void mDoExt_3DlineMat0_c::update(int param_0, f32 param_1, _GXColor& param_2, u16 param_3, +void mDoExt_3DlineMat0_c::update(int param_0, f32 param_1, GXColor& param_2, u16 param_3, dKy_tevstr_c* param_4) { // NONMATCHING } /* 80012E3C-80013360 00D77C 0524+00 0/0 0/0 9/9 .text * update__19mDoExt_3DlineMat0_cFiR8_GXColorP12dKy_tevstr_c */ -void mDoExt_3DlineMat0_c::update(int param_0, _GXColor& param_1, dKy_tevstr_c* param_2) { - // NONMATCHING +// NONMATCHING +void mDoExt_3DlineMat0_c::update(int param_0, GXColor& param_1, dKy_tevstr_c* param_2) { + field_0x8 = param_1; + field_0xc = param_2; + + if (param_0 < 0) { + field_0x14 = field_0x12; + } else if (param_0 > field_0x12) { + field_0x14 = field_0x12; + } else { + field_0x14 = param_0; + } + + view_class* view_p = dComIfGd_getView(); + mDoExt_3Dline_c* sp30 = field_0x18; + int sp2C = field_0x14 * 2; + int sp28 = field_0x14 * 12; + + cXyz sp134; + cXyz sp128; + cXyz sp11C; + cXyz sp110; + + for (int i = 0; i < field_0x10; i++) { + cXyz* pos_p = sp30->field_0x0; + f32* size_p = sp30->field_0x4; + JUT_ASSERT(0x1545, size_p != 0); + + cXyz* sp20 = &sp30->field_0x8[field_0x16]; + cXyz* sp24 = sp20; + + u8* sp1C = &sp30->field_0x10[field_0x16]; + + u8* var_r30 = sp1C; + u8* var_r29 = var_r30 + 3; + + sp128 = pos_p[1] - pos_p[0]; + sp134 = pos_p[0] - view_p->lookat.eye; + sp128 = sp128.outprod(sp134); + sp128.normalizeZP(); + + var_r30[0] = sp128.x * 64.0f; + var_r30[1] = sp128.y * 64.0f; + var_r30[2] = sp128.z * 64.0f; + var_r29[0] = -sp1C[0]; + var_r29[1] = -sp1C[1]; + var_r29[2] = -sp1C[2]; + + sp128 *= *size_p; + sp20[0] = pos_p[0] + sp128; + sp20[1] = pos_p[0] - sp128; + + pos_p++; + + sp11C = pos_p[0] + sp128; + sp110 = pos_p[0] - sp128; + + for (int sp10 = field_0x14 - 2; sp10 > 0; sp10--) { + sp128 = pos_p[1] - pos_p[0]; + sp134 = pos_p[0] - view_p->lookat.eye; + sp128 = sp128.outprod(sp134); + sp128.normalizeZP(); + + var_r30 += 6; + var_r29 += 6; + + var_r30[0] = sp128.x * 64.0f; + var_r30[1] = sp128.y * 64.0f; + var_r30[2] = sp128.z * 64.0f; + var_r29[0] = -sp1C[0]; + var_r29[1] = -sp1C[1]; + var_r29[2] = -sp1C[2]; + + sp128 *= *size_p; + sp11C += pos_p[0] + sp128; + sp110 += pos_p[0] - sp128; + *sp24 = sp11C * 0.5f; + *sp20 = sp110 * 0.5f; + + pos_p++; + + sp11C = pos_p[0] + sp128; + sp110 = pos_p[0] - sp128; + } + + var_r29 += 3; + + var_r29[0] = var_r30[0]; + var_r29[1] = var_r30[1]; + var_r29[2] = var_r30[2]; + + var_r30 += 3; + var_r29 += 3; + + var_r29[0] = var_r30[0]; + var_r29[1] = var_r30[1]; + var_r29[2] = var_r30[2]; + + *sp24 = sp11C; + *sp20 = sp110; + + DCStoreRangeNoSync(sp20, sp2C); + DCStoreRangeNoSync(sp1C, sp28); + } } /* 80013360-800134F8 00DCA0 0198+00 0/0 0/0 19/19 .text init__19mDoExt_3DlineMat1_cFUsUsP7ResTIMGi @@ -1849,6 +2374,7 @@ void mDoExt_3DlineMatSortPacket::draw() { J3DShape::resetVcdVatCache(); } +#ifdef DEBUG void drawCube(MtxP mtx, cXyz* pos, const GXColor& color) { GXSetArray(GX_VA_POS, pos, sizeof(cXyz)); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); @@ -1940,6 +2466,7 @@ void mDoExt_cylinderPacket::draw() { GXSetCurrentMtx(0); GXDrawCylinder(8); } +#endif /* 80014804-8001494C 00F144 0148+00 3/3 0/0 0/0 .text * mDoExt_initFontCommon__FPP7JUTFontPP7ResFONTP7JKRHeapPCcP10JKRArchiveUcUlUl */ -- cgit v1.2.3