diff options
| author | Jcw87 <Jcw87@users.noreply.github.com> | 2023-10-10 13:40:37 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-10 23:40:37 +0300 |
| commit | 3fa422caac37ca8777c57d8451cdf889a1d850d2 (patch) | |
| tree | 4bf9fe0501b03a7743cff28970def131e6ebf0e2 /src | |
| parent | a64921a5196c1bff0f2a2d1a697db0fa1b882f6e (diff) | |
m_Do_ext (#1958)
Diffstat (limited to 'src')
| -rw-r--r-- | src/m_Do/m_Do_ext.cpp | 453 |
1 files changed, 416 insertions, 37 deletions
diff --git a/src/m_Do/m_Do_ext.cpp b/src/m_Do/m_Do_ext.cpp index 34d993ad19..0293f3eb2b 100644 --- a/src/m_Do/m_Do_ext.cpp +++ b/src/m_Do/m_Do_ext.cpp @@ -54,14 +54,35 @@ struct J3DMtxCalcNoAnm__template0 { /* 80015084 */ void func_80015084(void* _this); }; -struct J3DMtxCalcAnmBase { +struct J3DMtxCalcAnimationAdaptorBase { + J3DMtxCalcAnimationAdaptorBase() {} + void change() {} +}; + +template <typename A0> +struct J3DMtxCalcAnimationAdaptorDefault : public J3DMtxCalcAnimationAdaptorBase { + J3DMtxCalcAnimationAdaptorDefault(J3DAnmTransform* param_0) {} +}; + +struct J3DMtxCalcAnmBase /* : public J3DMtxCalc */ { + J3DMtxCalcAnmBase(J3DAnmTransform* param_0) { mAnmTransform = param_0; } /* 8000D8EC */ ~J3DMtxCalcAnmBase(); - /* 80014FB8 */ void getAnmTransform(); + /* 80014FB8 */ J3DAnmTransform* getAnmTransform(); /* 80014FC0 */ void setAnmTransform(J3DAnmTransform*); + + J3DAnmTransform* mAnmTransform; }; template <typename A0, typename B0> -struct J3DMtxCalcAnimation {}; +struct J3DMtxCalcAnimation : public J3DMtxCalcAnmBase { + J3DMtxCalcAnimation(J3DAnmTransform* param_0) : J3DMtxCalcAnmBase(param_0), field_0x8(param_0) {} + ~J3DMtxCalcAnimation() {} + void setAnmTransform(J3DAnmTransform*) {} + void init(const Vec&, const Mtx&) {} + void calc() {} + + A0 field_0x8; +}; /* J3DMtxCalcAnimation<J3DMtxCalcAnimationAdaptorDefault<J3DMtxCalcCalcTransformMaya>, * J3DMtxCalcJ3DSysInitMaya> */ struct J3DMtxCalcAnimation__template0 { @@ -440,14 +461,62 @@ SECTION_SDATA2 static f32 lit_3847 = 1.0f; /* 8000D0AC-8000D320 0079EC 0274+00 5/5 0/0 0/0 .text * mDoExt_setJ3DData__FPA4_fPC16J3DTransformInfoUs */ +// matches with literals +#ifdef NONMATCHING +static void mDoExt_setJ3DData(Mtx mtx, const J3DTransformInfo* transformInfo, u16 param_2) { + bool local_28; + if (cM3d_IsZero(transformInfo->mScale.x - 1.0f) && cM3d_IsZero(transformInfo->mScale.y - 1.0f) && cM3d_IsZero(transformInfo->mScale.z - 1.0f)) { + j3dSys.getModel()->setScaleFlag(param_2, 1); + local_28 = true; + } else { + j3dSys.getModel()->setScaleFlag(param_2, 0); + local_28 = false; + } + mtx[0][3] = transformInfo->mTranslate.x; + mtx[1][3] = transformInfo->mTranslate.y; + mtx[2][3] = transformInfo->mTranslate.z; + + if (!local_28) { + mtx[0][0] *= transformInfo->mScale.x; + mtx[0][1] *= transformInfo->mScale.y; + mtx[0][2] *= transformInfo->mScale.z; + mtx[1][0] *= transformInfo->mScale.x; + mtx[1][1] *= transformInfo->mScale.y; + mtx[1][2] *= transformInfo->mScale.z; + mtx[2][0] *= transformInfo->mScale.x; + mtx[2][1] *= transformInfo->mScale.y; + mtx[2][2] *= transformInfo->mScale.z; + } + if (j3dSys.getModel()->getModelData()->getJointNodePointer(param_2)->getScaleCompensate() == 1) { + f32 x = 1.0f / J3DSys::mParentS.x; + f32 y = 1.0f / J3DSys::mParentS.y; + f32 z = 1.0f / J3DSys::mParentS.z; + mtx[0][0] *= x; + mtx[0][1] *= x; + mtx[0][2] *= x; + mtx[1][0] *= y; + mtx[1][1] *= y; + mtx[1][2] *= y; + mtx[2][0] *= z; + mtx[2][1] *= z; + mtx[2][2] *= z; + } + mDoMtx_concat(J3DSys::mCurrentMtx, mtx, J3DSys::mCurrentMtx); + j3dSys.getModel()->setAnmMtx(param_2, J3DSys::mCurrentMtx); + J3DSys::mParentS.x = transformInfo->mScale.x; + J3DSys::mParentS.y = transformInfo->mScale.y; + J3DSys::mParentS.z = transformInfo->mScale.z; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -static asm void mDoExt_setJ3DData(f32 (*param_0)[4], J3DTransformInfo const* param_1, u16 param_2) { +static asm void mDoExt_setJ3DData(Mtx mtx, const J3DTransformInfo* transformInfo, u16 param_2) { nofralloc #include "asm/m_Do/m_Do_ext/mDoExt_setJ3DData__FPA4_fPC16J3DTransformInfoUs.s" } #pragma pop +#endif /* ############################################################################################## */ /* 80451B1C-80451B20 00011C 0004+00 22/22 0/0 0/0 .sdata2 @3876 */ @@ -1370,6 +1439,27 @@ SECTION_DATA extern void* __vt__10J3DMtxCalc[11 + 1 /* padding */] = { /* 8000D7DC-8000D8E4 00811C 0108+00 0/0 18/18 85/85 .text * init__13mDoExt_bckAnmFP15J3DAnmTransformiifssb */ +// J3DMtxCalcAnimation inheritance +#ifdef NOTIMPLEMENTED +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); + mAnm = i_bck; + if (!i_modify) { + mpMtxCalc = new J3DMtxCalcAnimation<J3DMtxCalcAnimationAdaptorDefault<J3DMtxCalcCalcTransformMaya>, J3DMtxCalcJ3DSysInitMaya>(mAnm); + if (!mpMtxCalc) { + return 0; + } + } else { + mpMtxCalc->setAnmTransform(mAnm); + } + if (i_play) { + i_attr = i_attr < 0 ? mAnm->getAttribute() : i_attr; + return initPlay(mAnm->getFrameMax(), i_attr, i_rate, i_startF, i_endF); + } + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1379,6 +1469,7 @@ asm int mDoExt_bckAnm::init(J3DAnmTransform* i_bck, int i_play, int i_attr, f32 #include "asm/m_Do/m_Do_ext/init__13mDoExt_bckAnmFP15J3DAnmTransformiifssb.s" } #pragma pop +#endif /* 8000D8E4-8000D8EC -00001 0008+00 0/0 0/0 0/0 .text * setAnmTransform__114J3DMtxCalcAnimation<64J3DMtxCalcAnimationAdaptorDefault<27J3DMtxCalcCalcTransformMaya>,24J3DMtxCalcJ3DSysInitMaya>FP15J3DAnmTransform @@ -2034,16 +2125,7 @@ extern "C" asm void __dt__9J3DPacketFv() { /* 8000E6C8-8000E7C0 009008 00F8+00 1/1 0/0 0/0 .text entryJoint__21mDoExt_invisibleModelFP4cXyz */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void mDoExt_invisibleModel::entryJoint(cXyz* param_0) { - nofralloc -#include "asm/m_Do/m_Do_ext/entryJoint__21mDoExt_invisibleModelFP4cXyz.s" -} -#pragma pop - -/* void mDoExt_invisibleModel::entryJoint(cXyz* param_0) { +void mDoExt_invisibleModel::entryJoint(cXyz* param_0) { J3DModelData* modelData = mModel->getModelData(); mDoExt_invJntPacket* packet = mpPackets; @@ -2061,32 +2143,39 @@ asm void mDoExt_invisibleModel::entryJoint(cXyz* param_0) { packet++; } } -} */ +} /* 8000E7C0-8000E834 009100 0074+00 0/0 0/0 17/17 .text entryDL__21mDoExt_invisibleModelFP4cXyz */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void mDoExt_invisibleModel::entryDL(cXyz* param_0) { - nofralloc -#include "asm/m_Do/m_Do_ext/entryDL__21mDoExt_invisibleModelFP4cXyz.s" +void mDoExt_invisibleModel::entryDL(cXyz* param_0) { + J3DDrawBuffer* buffer0 = j3dSys.getDrawBuffer(0); + J3DDrawBuffer* buffer1 = j3dSys.getDrawBuffer(1); + dComIfGd_setListZxlu(); + mDoExt_modelEntryDL(mModel); + entryJoint(param_0); + j3dSys.setDrawBuffer(buffer0, 0); + j3dSys.setDrawBuffer(buffer1, 1); } -#pragma pop /* 8000E834-8000EA80 009174 024C+00 0/0 0/0 7/7 .text * mDoExt_setupShareTexture__FP12J3DModelDataP12J3DModelData */ #ifdef NONMATCHING void mDoExt_setupShareTexture(J3DModelData* i_modelData, J3DModelData* i_shareModelData) { + JUT_ASSERT(1547, i_modelData != 0 && i_shareModelData != 0); J3DTexture* texture = i_modelData->getTexture(); + JUT_ASSERT(1549, texture != 0); JUTNameTab* textureName = i_modelData->getTextureName(); + JUT_ASSERT(1551, textureName != 0); J3DTexture* shareTexture = i_shareModelData->getTexture(); + JUT_ASSERT(1553, shareTexture != 0); JUTNameTab* shareTextureName = i_shareModelData->getTextureName(); + JUT_ASSERT(1555, shareTextureName != 0) bool bvar = false; for (u16 i = 0; i < texture->getNum(); i++) { if (texture->getResTIMG(i)->imageOffset == 0) { for (u16 j = 0; j < shareTexture->getNum(); j++) { if (!strcmp(textureName->getName(i), shareTextureName->getName(j))) { + JUT_ASSERT(1564, shareTexture->getResTIMG(j)->imageOffset != 0); texture->setResTIMG(i, *shareTexture->getResTIMG(j)); bvar = true; } @@ -2100,6 +2189,7 @@ void mDoExt_setupShareTexture(J3DModelData* i_modelData, J3DModelData* i_shareMo for (u16 i = 0; i < i_modelData->getMaterialNum(); i++) { J3DMaterial* mat = i_modelData->getMaterialNodePointer(i); J3DTevBlock* tevBlock = mat->getTevBlock(); + JUT_ASSERT(1577, tevBlock != 0); J3DDisplayListObj* dlObj = mat->getSharedDisplayListObj(); BOOL ret = OSDisableInterrupts(); @@ -2463,6 +2553,47 @@ int mDoExt_resIDToIndex(JKRArchive* p_archive, u16 id) { /* 8000F26C-8000F4B0 009BAC 0244+00 1/0 0/0 0/0 .text calc__25mDoExt_MtxCalcAnmBlendTblFv */ +// matches with literals +#ifdef NONMATCHING +void mDoExt_MtxCalcAnmBlendTbl::calc() { + u16 jntNo = getJoint()->getJntNo(); + j3dSys.setCurrentMtxCalc(this); + if (mNum == 1) { + J3DTransformInfo info1; + mAnmRatio->getAnmTransform()->getTransform(jntNo, &info1); + J3DMtxCalcCalcTransformMaya::calcTransform(info1); + return; + } + J3DTransformInfo info2; + Quaternion quat1; + Quaternion quat2; + Quaternion quat3; + mAnmRatio->getAnmTransform()->getTransform(jntNo, &info2); + JMAEulerToQuat(info2.mRotation.x, info2.mRotation.y, info2.mRotation.z, &quat1); + quat3 = quat1; + for (int i = 1; i < mNum; i++) { + J3DAnmTransform* transform = mAnmRatio[i].getAnmTransform(); + if (transform) { + J3DTransformInfo info3; + transform->getTransform(jntNo, &info3); + f32 ratio = mAnmRatio[i].getRatio(); + f32 f30 = 1.0f - ratio; + JMAEulerToQuat(info3.mRotation.x, info3.mRotation.y, info3.mRotation.z, &quat2); + JMAQuatLerp(&quat1, &quat2, ratio, &quat3); + quat1 = quat3; + info2.mTranslate.x = info2.mTranslate.x * f30 + info3.mTranslate.x * ratio; + info2.mTranslate.y = info2.mTranslate.y * f30 + info3.mTranslate.y * ratio; + info2.mTranslate.z = info2.mTranslate.z * f30 + info3.mTranslate.z * ratio; + info2.mScale.x = info2.mScale.x * f30 + info3.mScale.x * ratio; + info2.mScale.y = info2.mScale.y * f30 + info3.mScale.y * ratio; + info2.mScale.z = info2.mScale.z * f30 + info3.mScale.z * ratio; + } + } + Mtx mtx; + MTXQuat(mtx, &quat3); + mDoExt_setJ3DData(mtx, &info2, jntNo); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2471,8 +2602,68 @@ asm void mDoExt_MtxCalcAnmBlendTbl::calc() { #include "asm/m_Do/m_Do_ext/calc__25mDoExt_MtxCalcAnmBlendTblFv.s" } #pragma pop +#endif /* 8000F4B0-8000F848 009DF0 0398+00 1/0 0/0 0/0 .text calc__28mDoExt_MtxCalcAnmBlendTblOldFv */ +// matches with literals +#ifdef NONMATCHING +void mDoExt_MtxCalcAnmBlendTblOld::calc() { + u16 jntNo = getJoint()->getJntNo(); + j3dSys.setCurrentMtxCalc(this); + J3DModelData* modelData = j3dSys.getModel()->getModelData(); + J3DTransformInfo info1; + Quaternion quat1; + Quaternion quat2; + Quaternion quat3; + mAnmRatio->getAnmTransform()->getTransform(jntNo, &info1); + JMAEulerToQuat(info1.mRotation.x, info1.mRotation.y, info1.mRotation.z, &quat1); + quat3 = quat1; + for (int i = 1; i < mNum; i++) { + if (mAnmRatio[i].getAnmTransform()) { + J3DAnmTransform* transform = mAnmRatio[i].getAnmTransform(); + J3DTransformInfo info2; + transform->getTransform(jntNo, &info2); + f32 ratio = mAnmRatio[i].getRatio(); + f32 f30 = 1.0f - ratio; + JMAEulerToQuat(info2.mRotation.x, info2.mRotation.y, info2.mRotation.z, &quat2); + JMAQuatLerp(&quat1, &quat2, ratio, &quat3); + quat1 = quat3; + info1.mTranslate.x = info1.mTranslate.x * f30 + info2.mTranslate.x * ratio; + info1.mTranslate.y = info1.mTranslate.y * f30 + info2.mTranslate.y * ratio; + info1.mTranslate.z = info1.mTranslate.z * f30 + info2.mTranslate.z * ratio; + info1.mScale.x = info1.mScale.x * f30 + info2.mScale.x * ratio; + info1.mScale.y = info1.mScale.y * f30 + info2.mScale.y * ratio; + info1.mScale.z = info1.mScale.z * f30 + info2.mScale.z * ratio; + } + } + + J3DTransformInfo* oldTransInfo = mOldFrame->getOldFrameTransInfo(jntNo); + Quaternion* oldQuat = mOldFrame->getOldFrameQuaternion(jntNo); + if (mOldFrame->getOldFrameFlg()) { + if (mOldFrame->getOldFrameRate() > 0.0f && mOldFrame->getOldFrameStartJoint() <= jntNo && mOldFrame->getOldFrameEndJoint() > jntNo) { + f32 oldFrameRate = mOldFrame->getOldFrameRate(); + f32 f31 = 1.0f - oldFrameRate; + JMAQuatLerp(oldQuat, &quat1, f31, &quat3); + info1.mTranslate.x = info1.mTranslate.x * f31 + oldTransInfo->mTranslate.x * oldFrameRate; + info1.mTranslate.y = info1.mTranslate.y * f31 + oldTransInfo->mTranslate.y * oldFrameRate; + info1.mTranslate.z = info1.mTranslate.z * f31 + oldTransInfo->mTranslate.z * oldFrameRate; + info1.mScale.x = info1.mScale.x * f31 + oldTransInfo->mScale.x * oldFrameRate; + info1.mScale.y = info1.mScale.y * f31 + oldTransInfo->mScale.y * oldFrameRate; + info1.mScale.z = info1.mScale.z * f31 + oldTransInfo->mScale.z * oldFrameRate; + } + } else if (jntNo == modelData->getJointNum() - 1) { + mOldFrame->onOldFrameFlg(); + } + Mtx mtx; + mDoMtx_quat(mtx, &quat3); + mDoExt_setJ3DData(mtx, &info1, jntNo); + *oldQuat = quat3; + *oldTransInfo = info1; + if (jntNo == modelData->getJointNum() - 1) { + mOldFrame->decOldFrameMorfCounter(); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2481,6 +2672,7 @@ asm void mDoExt_MtxCalcAnmBlendTblOld::calc() { #include "asm/m_Do/m_Do_ext/calc__28mDoExt_MtxCalcAnmBlendTblOldFv.s" } #pragma pop +#endif /* 8000F848-8000F8CC 00A188 0084+00 0/0 26/26 8/8 .text * initOldFrameMorf__22mDoExt_MtxCalcOldFrameFfUsUs */ @@ -2614,17 +2806,15 @@ asm void mDoExt_morf_c::frameUpdate() { /* 8000FC4C-8000FD10 00A58C 00C4+00 0/0 0/0 34/34 .text * __ct__14mDoExt_McaMorfFP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformifiiiPvUlUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm mDoExt_McaMorf::mDoExt_McaMorf(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c* param_1, - mDoExt_McaMorfCallBack2_c* param_2, J3DAnmTransform* param_3, +mDoExt_McaMorf::mDoExt_McaMorf(J3DModelData* modelData, mDoExt_McaMorfCallBack1_c* callback1, + mDoExt_McaMorfCallBack2_c* callback2, J3DAnmTransform* anmTransform, int param_4, f32 param_5, int param_6, int param_7, int param_8, void* param_9, u32 param_10, u32 param_11) { - nofralloc -#include "asm/m_Do/m_Do_ext/func_8000FC4C.s" + field_0x50 = false; + field_0x51 = false; + field_0x52 = false; + create(modelData, callback1, callback2, anmTransform, param_4, param_5, param_6, param_7, param_8, param_9, param_10, param_11); } -#pragma pop /* 8000FD10-8000FD94 00A650 0084+00 1/0 0/0 0/0 .text __dt__14mDoExt_McaMorfFv */ #pragma push @@ -2644,10 +2834,89 @@ SECTION_SDATA2 static f32 lit_5939 = -1.0f; /* 8000FD94-80010074 00A6D4 02E0+00 1/1 0/0 0/0 .text * create__14mDoExt_McaMorfFP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformifiiiPvUlUl */ +// matches with literals +#ifdef NONMATCHING +int mDoExt_McaMorf::create(J3DModelData* modelData, mDoExt_McaMorfCallBack1_c* callback1, + mDoExt_McaMorfCallBack2_c* callback2, J3DAnmTransform* anmTransform, + int param_4, f32 param_5, int param_6, int param_7, int param_8, + void* param_9, u32 param_10, u32 param_11) { + mpModel = NULL; + mpSound = NULL; + mpTransformInfo = NULL; + mpQuat = NULL; + if (!modelData) { + return 0; + } + if (modelData->getMaterialNodePointer(0)->getSharedDisplayListObj() && param_10 == 0) { + if (param_10 = modelData->isLocked()) { + param_10 = 0x20000; + } else { + param_10 = 0x80000; + } + } + mpModel = mDoExt_J3DModel__create(modelData, param_10, param_11); + if (!mpModel) { + return 0; + } + if (param_10 != 0x80000) { + mDoExt_changeMaterial(mpModel); + } + if (param_9 == NULL && anmTransform) { + param_9 = ((mDoExt_transAnmBas*)anmTransform)->getBas(); + if (param_9) { + param_8 = 1; + } + } + if (param_8) { + mpSound = new mDoExt_zelAnime(); + if (!mpSound) { + goto cleanup; + } + } + setAnm(anmTransform, param_4, 0.0f, param_5, param_6, param_7, param_9); + mPrevMorf = -1.0f; + mpTransformInfo = new J3DTransformInfo[modelData->getJointNum()]; + if (!mpTransformInfo) { + goto cleanup; + } + mpQuat = new Quaternion[modelData->getJointNum()]; + if (!mpQuat) { + goto cleanup; + } + J3DTransformInfo* info = mpTransformInfo; + Quaternion* quat = mpQuat; + J3DModelData* r23 = mpModel->getModelData(); + u16 jointNum = r23->getJointNum(); + for (int i = 0; i < jointNum; i++) { + *info = r23->getJointNodePointer(i)->getTransformInfo(); + JMAEulerToQuat(info->mRotation.x, info->mRotation.y, info->mRotation.z, quat); + info++; + quat++; + } + mpCallback1 = callback1; + mpCallback2 = callback2; + return 1; + cleanup: + if (mpSound) { + mpSound->stopAnime(); + mpSound = NULL; + } + if (mpTransformInfo) { + mpTransformInfo = NULL; + } + if (mpQuat) { + mpQuat = NULL; + } + if (mpModel) { + mpModel = NULL; + } + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void mDoExt_McaMorf::create(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c* param_1, +asm int mDoExt_McaMorf::create(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c* param_1, mDoExt_McaMorfCallBack2_c* param_2, J3DAnmTransform* param_3, int param_4, f32 param_5, int param_6, int param_7, int param_8, void* param_9, u32 param_10, u32 param_11) { @@ -2655,8 +2924,76 @@ asm void mDoExt_McaMorf::create(J3DModelData* param_0, mDoExt_McaMorfCallBack1_c #include "asm/m_Do/m_Do_ext/func_8000FD94.s" } #pragma pop +#endif /* 80010074-8001037C 00A9B4 0308+00 1/0 0/0 0/0 .text calc__14mDoExt_McaMorfFv */ +// matches with literals +#ifdef NONMATCHING +void mDoExt_McaMorf::calc() { + if (!mpModel) { + return; + } + u16 jntNo = getJoint()->getJntNo(); + j3dSys.setCurrentMtxCalc(this); + J3DTransformInfo info1; + J3DTransformInfo* infoPtr; + if (mpTransformInfo == NULL) { + infoPtr = &info1; + } else { + infoPtr = &mpTransformInfo[jntNo]; + } + Quaternion quat1; + Quaternion* quatPtr; + if (mpQuat == NULL) { + quatPtr = &quat1; + } 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); + } else { + f32 f31; + if (field_0x52) { + 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) { + mpCallback2->execute(jntNo); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2665,9 +3002,50 @@ asm void mDoExt_McaMorf::calc() { #include "asm/m_Do/m_Do_ext/calc__14mDoExt_McaMorfFv.s" } #pragma pop +#endif /* 8001037C-800105C8 00ACBC 024C+00 1/1 1/1 29/29 .text * setAnm__14mDoExt_McaMorfFP15J3DAnmTransformiffffPv */ +// matches with literals +#ifdef NONMATCHING +void mDoExt_McaMorf::setAnm(J3DAnmTransform* param_0, int param_1, f32 param_2, f32 param_3, + f32 param_4, f32 param_5, void* param_6) { + mpAnm = param_0; + setStartFrame(param_4); + if (param_5 < 0.0f) { + if (!mpAnm) { + mFrameCtrl.init(0); + } else { + mFrameCtrl.init(mpAnm->getFrameMax()); + } + } else { + mFrameCtrl.init(param_5); + } + if (param_0 && param_1 < 0) { + param_1 = param_0->getAttribute(); + } + setPlayMode(param_1); + setPlaySpeed(param_3); + if (param_3 >= 0.0f) { + setFrame(param_4); + } else { + setFrame(getEndFrame()); + } + setLoopFrame(getFrame()); + setMorf(param_2); + if (mpSound) { + if (param_6 == NULL && param_0) { + param_6 = ((mDoExt_transAnmBas*)param_0)->getBas(); + } + mpSound->field_0x48 = param_6; + if (mpSound->field_0x48) { + mpSound->initAnime(param_6, getPlaySpeed() >= 0.0f, getLoopFrame(), 0.0f); + } else { + mpSound->stopAnime(); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2677,6 +3055,7 @@ asm void mDoExt_McaMorf::setAnm(J3DAnmTransform* param_0, int param_1, f32 param #include "asm/m_Do/m_Do_ext/setAnm__14mDoExt_McaMorfFP15J3DAnmTransformiffffPv.s" } #pragma pop +#endif /* 800105C8-80010680 00AF08 00B8+00 0/0 1/1 37/37 .text play__14mDoExt_McaMorfFP3VecUlSc */ @@ -3675,13 +4054,13 @@ void J3DMtxCalc::setAnmTransform(J3DAnmTransform* param_0) { /* 80014E94-80014E9C 00F7D4 0008+00 11/0 2/0 0/0 .text getAnmTransform__10J3DMtxCalcFUc */ -bool J3DMtxCalc::getAnmTransform(u8 param_0) { - return false; +J3DAnmTransform* J3DMtxCalc::getAnmTransform(u8 param_0) { + return NULL; } /* 80014E9C-80014EA4 00F7DC 0008+00 9/0 2/0 0/0 .text getAnmTransform__10J3DMtxCalcFv */ -bool J3DMtxCalc::getAnmTransform() { - return false; +J3DAnmTransform* J3DMtxCalc::getAnmTransform() { + return NULL; } /* 80014EA4-80014EA8 00F7E4 0004+00 11/0 2/0 0/0 .text setWeight__10J3DMtxCalcFUcf */ @@ -3726,7 +4105,7 @@ extern "C" asm void __dt__25mDoExt_MtxCalcAnmBlendTblFv() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void J3DMtxCalcAnmBase::getAnmTransform() { +asm J3DAnmTransform* J3DMtxCalcAnmBase::getAnmTransform() { nofralloc #include "asm/m_Do/m_Do_ext/getAnmTransform__17J3DMtxCalcAnmBaseFv.s" } @@ -3773,7 +4152,7 @@ void J3DMtxCalcNoAnm<J3DMtxCalcCalcTransformMaya, J3DMtxCalcJ3DSysInitMaya>::ini /* 80015084-800150AC 00F9C4 0028+00 2/0 0/0 0/0 .text * calc__73J3DMtxCalcNoAnm<27J3DMtxCalcCalcTransformMaya,24J3DMtxCalcJ3DSysInitMaya>Fv */ void J3DMtxCalcNoAnm<J3DMtxCalcCalcTransformMaya, J3DMtxCalcJ3DSysInitMaya>::calc() { - calcTransform(getJoint()->getTransformInfo()); + J3DMtxCalcCalcTransformMaya::calcTransform(getJoint()->getTransformInfo()); } /* 800150AC-8001513C 00F9EC 0090+00 1/0 0/0 0/0 .text |
