mirror of https://github.com/zeldaret/tp.git
nodeCallBack attempt
This commit is contained in:
parent
f367d21472
commit
42a6a6ebca
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue