diff --git a/include/JSystem/J3DGraphAnimator/J3DModel.h b/include/JSystem/J3DGraphAnimator/J3DModel.h index a6537a1bf2b..99c75eec7df 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModel.h +++ b/include/JSystem/J3DGraphAnimator/J3DModel.h @@ -24,6 +24,19 @@ struct J3DUnkCalc2 { virtual void calc(J3DModelData* mpModelData); }; +struct UserArea { + u8 field_0x00[0x60e]; + s16 field_0x60e; + s16 field_0x610; + s16 field_0x612; + u8 field_0x614[0x14]; + s16 field_0x628; + s16 field_0x62a; + u8 field_0x62c[0x12]; + s16 field_0x63e; + s16 field_0x640; +}; + typedef void (*J3DCalcCallBack)(J3DModel*, u32 timing); class J3DModel { @@ -77,18 +90,19 @@ public: Mtx33* getNrmMtxPtr() const { return mMtxBuffer->getNrmMtxPtr(); } Mtx* getDrawMtxPtr() const { return mMtxBuffer->getDrawMtxPtr(); } void setBaseScale(const Vec& scale) { mBaseScale = scale; } - void setUserArea(u32 area) { mUserArea = area; } - u32 getUserArea() const { return mUserArea; } + void setUserArea(UserArea* area) { mUserArea = area; } + UserArea* getUserArea() const { return mUserArea; } Vec* getBaseScale() { return &mBaseScale; } // is there a better way to handle inlines with same name as non-inlines? MtxP i_getAnmMtx(int p1) { return mMtxBuffer->getAnmMtx(p1); } + void setAnmMtx(int p1, Mtx mtx) { return mMtxBuffer->setAnmMtx(p1, mtx); } /* 0x04 */ J3DModelData* mModelData; /* 0x08 */ u32 mFlags; /* 0x0C */ u32 mDiffFlag; /* 0x10 */ J3DCalcCallBack mCalcCallBack; - /* 0x14 */ u32 mUserArea; + /* 0x14 */ UserArea* mUserArea; /* 0x18 */ Vec mBaseScale; /* 0x24 */ Mtx mBaseTransformMtx; /* 0x54 */ Mtx mInternalView; diff --git a/include/JSystem/J3DGraphAnimator/J3DMtxBuffer.h b/include/JSystem/J3DGraphAnimator/J3DMtxBuffer.h index ee497312894..0af381eaec8 100644 --- a/include/JSystem/J3DGraphAnimator/J3DMtxBuffer.h +++ b/include/JSystem/J3DGraphAnimator/J3DMtxBuffer.h @@ -25,6 +25,7 @@ public: /* 80326EF0 */ void calcBBoardMtx(); MtxP getAnmMtx(int idx) const { return mpAnmMtx[idx]; } + void setAnmMtx(int idx, Mtx mtx) { PSMTXCopy(mtx,mpAnmMtx[idx]); } void setScaleFlag(int idx, u8 flag) { mpScaleFlagArr[idx] = flag; } u32* getCurrentViewNoPtr() { return &mCurrentViewNo; } diff --git a/include/m_Do/m_Do_mtx.h b/include/m_Do/m_Do_mtx.h index 9d344948f80..0fef06569cb 100644 --- a/include/m_Do/m_Do_mtx.h +++ b/include/m_Do/m_Do_mtx.h @@ -15,8 +15,9 @@ void mDoMtx_ZXYrotM(Mtx, s16, s16, s16); void mDoMtx_ZrotS(Mtx, s16); void mDoMtx_YrotS(Mtx, s16); void mDoMtx_XrotS(Mtx, s16); -void mDoMtx_XrotM(Mtx mtx, s16 x); +void mDoMtx_XrotM(Mtx, s16); void mDoMtx_YrotM(Mtx, s16); +void mDoMtx_ZrotM(Mtx, s16); void mDoMtx_MtxToRot(CMtxP, csXyz*); void mDoMtx_lookAt(f32 (*param_0)[4], Vec const* param_1, Vec const* param_2, s16 param_3); void mDoMtx_concatProjView(f32 const (*param_0)[4], f32 const (*param_1)[4], f32 (*param_2)[4]); @@ -37,6 +38,19 @@ inline void mDoMtx_trans(Mtx m, f32 x, f32 y, f32 z) { PSMTXTrans(m,x,y,z); } +inline void cMtx_XrotM(Mtx mtx, s16 x) { + mDoMtx_XrotM(mtx, x); +} + +inline void cMtx_YrotM(Mtx mtx, s16 y) { + mDoMtx_YrotM(mtx, y); +} + +inline void cMtx_ZrotM(Mtx mtx, s16 z) { + mDoMtx_ZrotM(mtx, z); +} + + class mDoMtx_stack_c { public: /* 8000CCC8 */ static bool push(); diff --git a/rel/d/a/d_a_do/d_a_do.cpp b/rel/d/a/d_a_do/d_a_do.cpp index d89b62d7a75..efc3bf7725d 100644 --- a/rel/d/a/d_a_do/d_a_do.cpp +++ b/rel/d/a/d_a_do/d_a_do.cpp @@ -438,25 +438,47 @@ SECTION_DEAD static char const* const stringBase_8066EFB0 = "Do"; #pragma pop /* 80667DA8-80667E68 000148 00C0+00 16/16 0/0 0/0 .text anm_init__FP8do_classifUcf */ -#ifndef NONMATCHING static void anm_init(do_class* i_dogP, int param_1, f32 param_2, u8 param_3, f32 param_4) { if (!(i_dogP->field_0x608 > FLOAT_LABEL(lit_3662))) { i_dogP->mpMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("Do",param_1),param_3,param_2,param_4,FLOAT_LABEL(lit_3682),FLOAT_LABEL(lit_3683),0); i_dogP->field_0x5e4 = param_1; } } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void anm_init(do_class* i_dogP, int param_1, f32 param_2, u8 param_3, f32 param_4) { - nofralloc -#include "asm/rel/d/a/d_a_do/d_a_do/anm_init__FP8do_classifUcf.s" -} -#pragma pop -#endif /* 80667E68-80667FE4 000208 017C+00 1/1 0/0 0/0 .text nodeCallBack__FP8J3DJointi */ +#ifdef NONMATCHING +// regalloc on user_area +static int nodeCallBack(J3DJoint* i_jntP, int param_1) { + if (param_1 == 0) { + int joint_num = i_jntP->getJntNo(); + J3DModel* model = j3dSys.getModel(); + UserArea* user_area = model->getUserArea(); + + if (user_area) { + PSMTXCopy(model->i_getAnmMtx(joint_num),*calc_mtx); + + if (joint_num == 9 || joint_num == 10) { + + + cMtx_YrotM(*calc_mtx,user_area->field_0x610 + user_area->field_0x628); + cMtx_XrotM(*calc_mtx,user_area->field_0x612 + user_area->field_0x62a); + cMtx_ZrotM(*calc_mtx,user_area->field_0x60e); + } else if (joint_num == 22) { + + cMtx_YrotM(*calc_mtx,user_area->field_0x640 << 1); + cMtx_ZrotM(*calc_mtx,user_area->field_0x63e << 1); + } else { + cMtx_YrotM(*calc_mtx,user_area->field_0x640); + cMtx_ZrotM(*calc_mtx,user_area->field_0x63e); + } + + model->setAnmMtx(joint_num,*calc_mtx); + PSMTXCopy(*calc_mtx,j3dSys.mCurrentMtx); + } + } + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -465,6 +487,7 @@ static asm void nodeCallBack(J3DJoint* param_0, int param_1) { #include "asm/rel/d/a/d_a_do/d_a_do/nodeCallBack__FP8J3DJointi.s" } #pragma pop +#endif /* ############################################################################################## */ /* 8066EE04-8066EE08 00001C 0004+00 0/8 0/0 0/0 .rodata @3772 */ diff --git a/rel/d/a/e/d_a_e_wb/d_a_e_wb.cpp b/rel/d/a/e/d_a_e_wb/d_a_e_wb.cpp index 555b3033c13..dbf7123ec60 100644 --- a/rel/d/a/e/d_a_e_wb/d_a_e_wb.cpp +++ b/rel/d/a/e/d_a_e_wb/d_a_e_wb.cpp @@ -4813,7 +4813,8 @@ extern "C" asm void abs__4cXyzCFv() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -static asm void cMtx_XrotM(f32 (*param_0)[4], s16 param_1) { +// static asm void cMtx_XrotM(f32 (*param_0)[4], s16 param_1) { +extern "C" asm void cMtx_XrotM__FPA4_fs() { nofralloc #include "asm/rel/d/a/e/d_a_e_wb/d_a_e_wb/cMtx_XrotM__FPA4_fs.s" } diff --git a/rel/d/a/npc/d_a_npc_tr/d_a_npc_tr.cpp b/rel/d/a/npc/d_a_npc_tr/d_a_npc_tr.cpp index 958b1ff6265..8a5703bca86 100644 --- a/rel/d/a/npc/d_a_npc_tr/d_a_npc_tr.cpp +++ b/rel/d/a/npc/d_a_npc_tr/d_a_npc_tr.cpp @@ -560,7 +560,7 @@ static int useHeapInit(fopAc_ac_c* actor) { return 0; } - npc_tr->field_0x5b8->setUserArea((u32)actor); + npc_tr->field_0x5b8->setUserArea((UserArea*)actor); for (u16 i = 0; i < npc_tr->field_0x5b8->getModelData()->getJointNum(); i++) { npc_tr->field_0x5b8->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack); diff --git a/src/d/a/d_a_npc.cpp b/src/d/a/d_a_npc.cpp index 723d4d7c9ed..256bd5e961f 100644 --- a/src/d/a/d_a_npc.cpp +++ b/src/d/a/d_a_npc.cpp @@ -2036,7 +2036,7 @@ void daNpcT_c::setMtx() { mDoMtx_stack_c::scaleM(mScale); model->i_setBaseTRMtx(mDoMtx_stack_c::get()); - model->setUserArea((u32)this); + model->setUserArea((UserArea*)this); mMcaMorfAnm[0]->onMorfNone(); if (cM3d_IsZero(field_0xdfc) != 0) { @@ -3786,7 +3786,7 @@ void daBaseNpc_c::setMtx(int param_0) { model->i_setBaseTRMtx(mDoMtx_stack_c::get()); if (param_0) { - model->setUserArea((u32)this); + model->setUserArea((UserArea*)this); } else { model->setUserArea(0); }