summaryrefslogtreecommitdiff
path: root/src/m_Do/m_Do_ext.cpp
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2024-12-29 07:53:54 -0800
committerGitHub <noreply@github.com>2024-12-29 17:53:54 +0200
commit0e281cb97535523a3d1a4f668bc84321bc39fb46 (patch)
tree2f8d939c992c30dcad7a904aa1024041cf3c85fa /src/m_Do/m_Do_ext.cpp
parentc429ce21eb7cf4687da596c51fbc47249fbe4c13 (diff)
various matches / cleanup (#2271)
* cleanup various TUs * checkpoint * d_attention doc
Diffstat (limited to 'src/m_Do/m_Do_ext.cpp')
-rw-r--r--src/m_Do/m_Do_ext.cpp741
1 files changed, 634 insertions, 107 deletions
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 <dolphin/gf/GFPixel.h>
#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 */