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);
|
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);
|
typedef void (*J3DCalcCallBack)(J3DModel*, u32 timing);
|
||||||
|
|
||||||
class J3DModel {
|
class J3DModel {
|
||||||
|
@ -77,18 +90,19 @@ public:
|
||||||
Mtx33* getNrmMtxPtr() const { return mMtxBuffer->getNrmMtxPtr(); }
|
Mtx33* getNrmMtxPtr() const { return mMtxBuffer->getNrmMtxPtr(); }
|
||||||
Mtx* getDrawMtxPtr() const { return mMtxBuffer->getDrawMtxPtr(); }
|
Mtx* getDrawMtxPtr() const { return mMtxBuffer->getDrawMtxPtr(); }
|
||||||
void setBaseScale(const Vec& scale) { mBaseScale = scale; }
|
void setBaseScale(const Vec& scale) { mBaseScale = scale; }
|
||||||
void setUserArea(u32 area) { mUserArea = area; }
|
void setUserArea(UserArea* area) { mUserArea = area; }
|
||||||
u32 getUserArea() const { return mUserArea; }
|
UserArea* getUserArea() const { return mUserArea; }
|
||||||
Vec* getBaseScale() { return &mBaseScale; }
|
Vec* getBaseScale() { return &mBaseScale; }
|
||||||
|
|
||||||
// is there a better way to handle inlines with same name as non-inlines?
|
// is there a better way to handle inlines with same name as non-inlines?
|
||||||
MtxP i_getAnmMtx(int p1) { return mMtxBuffer->getAnmMtx(p1); }
|
MtxP i_getAnmMtx(int p1) { return mMtxBuffer->getAnmMtx(p1); }
|
||||||
|
void setAnmMtx(int p1, Mtx mtx) { return mMtxBuffer->setAnmMtx(p1, mtx); }
|
||||||
|
|
||||||
/* 0x04 */ J3DModelData* mModelData;
|
/* 0x04 */ J3DModelData* mModelData;
|
||||||
/* 0x08 */ u32 mFlags;
|
/* 0x08 */ u32 mFlags;
|
||||||
/* 0x0C */ u32 mDiffFlag;
|
/* 0x0C */ u32 mDiffFlag;
|
||||||
/* 0x10 */ J3DCalcCallBack mCalcCallBack;
|
/* 0x10 */ J3DCalcCallBack mCalcCallBack;
|
||||||
/* 0x14 */ u32 mUserArea;
|
/* 0x14 */ UserArea* mUserArea;
|
||||||
/* 0x18 */ Vec mBaseScale;
|
/* 0x18 */ Vec mBaseScale;
|
||||||
/* 0x24 */ Mtx mBaseTransformMtx;
|
/* 0x24 */ Mtx mBaseTransformMtx;
|
||||||
/* 0x54 */ Mtx mInternalView;
|
/* 0x54 */ Mtx mInternalView;
|
||||||
|
|
|
@ -25,6 +25,7 @@ public:
|
||||||
/* 80326EF0 */ void calcBBoardMtx();
|
/* 80326EF0 */ void calcBBoardMtx();
|
||||||
|
|
||||||
MtxP getAnmMtx(int idx) const { return mpAnmMtx[idx]; }
|
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; }
|
void setScaleFlag(int idx, u8 flag) { mpScaleFlagArr[idx] = flag; }
|
||||||
u32* getCurrentViewNoPtr() { return &mCurrentViewNo; }
|
u32* getCurrentViewNoPtr() { return &mCurrentViewNo; }
|
||||||
|
|
|
@ -15,8 +15,9 @@ void mDoMtx_ZXYrotM(Mtx, s16, s16, s16);
|
||||||
void mDoMtx_ZrotS(Mtx, s16);
|
void mDoMtx_ZrotS(Mtx, s16);
|
||||||
void mDoMtx_YrotS(Mtx, s16);
|
void mDoMtx_YrotS(Mtx, s16);
|
||||||
void mDoMtx_XrotS(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_YrotM(Mtx, s16);
|
||||||
|
void mDoMtx_ZrotM(Mtx, s16);
|
||||||
void mDoMtx_MtxToRot(CMtxP, csXyz*);
|
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_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]);
|
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);
|
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 {
|
class mDoMtx_stack_c {
|
||||||
public:
|
public:
|
||||||
/* 8000CCC8 */ static bool push();
|
/* 8000CCC8 */ static bool push();
|
||||||
|
|
|
@ -438,25 +438,47 @@ SECTION_DEAD static char const* const stringBase_8066EFB0 = "Do";
|
||||||
#pragma pop
|
#pragma pop
|
||||||
|
|
||||||
/* 80667DA8-80667E68 000148 00C0+00 16/16 0/0 0/0 .text anm_init__FP8do_classifUcf */
|
/* 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) {
|
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))) {
|
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->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;
|
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 */
|
/* 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 push
|
||||||
#pragma optimization_level 0
|
#pragma optimization_level 0
|
||||||
#pragma optimizewithasm off
|
#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"
|
#include "asm/rel/d/a/d_a_do/d_a_do/nodeCallBack__FP8J3DJointi.s"
|
||||||
}
|
}
|
||||||
#pragma pop
|
#pragma pop
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ############################################################################################## */
|
/* ############################################################################################## */
|
||||||
/* 8066EE04-8066EE08 00001C 0004+00 0/8 0/0 0/0 .rodata @3772 */
|
/* 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 push
|
||||||
#pragma optimization_level 0
|
#pragma optimization_level 0
|
||||||
#pragma optimizewithasm off
|
#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
|
nofralloc
|
||||||
#include "asm/rel/d/a/e/d_a_e_wb/d_a_e_wb/cMtx_XrotM__FPA4_fs.s"
|
#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;
|
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++) {
|
for (u16 i = 0; i < npc_tr->field_0x5b8->getModelData()->getJointNum(); i++) {
|
||||||
npc_tr->field_0x5b8->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack);
|
npc_tr->field_0x5b8->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack);
|
||||||
|
|
|
@ -2036,7 +2036,7 @@ void daNpcT_c::setMtx() {
|
||||||
mDoMtx_stack_c::scaleM(mScale);
|
mDoMtx_stack_c::scaleM(mScale);
|
||||||
|
|
||||||
model->i_setBaseTRMtx(mDoMtx_stack_c::get());
|
model->i_setBaseTRMtx(mDoMtx_stack_c::get());
|
||||||
model->setUserArea((u32)this);
|
model->setUserArea((UserArea*)this);
|
||||||
|
|
||||||
mMcaMorfAnm[0]->onMorfNone();
|
mMcaMorfAnm[0]->onMorfNone();
|
||||||
if (cM3d_IsZero(field_0xdfc) != 0) {
|
if (cM3d_IsZero(field_0xdfc) != 0) {
|
||||||
|
@ -3786,7 +3786,7 @@ void daBaseNpc_c::setMtx(int param_0) {
|
||||||
model->i_setBaseTRMtx(mDoMtx_stack_c::get());
|
model->i_setBaseTRMtx(mDoMtx_stack_c::get());
|
||||||
|
|
||||||
if (param_0) {
|
if (param_0) {
|
||||||
model->setUserArea((u32)this);
|
model->setUserArea((UserArea*)this);
|
||||||
} else {
|
} else {
|
||||||
model->setUserArea(0);
|
model->setUserArea(0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue