diff --git a/configure.py b/configure.py index b0b143217..1582bc895 100644 --- a/configure.py +++ b/configure.py @@ -1500,7 +1500,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_nz"), ActorRel(NonMatching, "d_a_obj_Itnak"), ActorRel(NonMatching, "d_a_obj_Vds"), - ActorRel(NonMatching, "d_a_obj_Vteng"), + ActorRel(NonMatching, "d_a_obj_Vteng", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_YLzou"), ActorRel(NonMatching, "d_a_obj_Yboil"), ActorRel(NonMatching, "d_a_obj_adnno"), diff --git a/include/d/d_demo.h b/include/d/d_demo.h index ec6c76577..a59fe3cd0 100644 --- a/include/d/d_demo.h +++ b/include/d/d_demo.h @@ -98,6 +98,6 @@ public: }; class mDoExt_McaMorf; -void dDemo_setDemoData(fopAc_ac_c*, u8, mDoExt_McaMorf*, const char*, int, u16*, u32, s8); +BOOL dDemo_setDemoData(fopAc_ac_c*, u8, mDoExt_McaMorf*, const char*, int, u16*, u32, s8); #endif /* D_DEMO_H */ \ No newline at end of file diff --git a/src/d/actor/d_a_obj_Vteng.cpp b/src/d/actor/d_a_obj_Vteng.cpp index 5f2675905..df3906c43 100644 --- a/src/d/actor/d_a_obj_Vteng.cpp +++ b/src/d/actor/d_a_obj_Vteng.cpp @@ -3,71 +3,189 @@ // Translation Unit: d_a_obj_Vteng.cpp // -#include "d_a_obj_Vteng.h" -#include "dolphin/types.h" +#include "f_op/f_op_actor_mng.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "d/d_bg_w.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_mtx.h" + +class daObjVteng_c : public fopAc_ac_c { +public: + void init_mtx(); + s32 _create(); + bool _execute(); + bool _draw(); + bool _delete(); + bool create_heap(); + bool jokai_demo(); + static BOOL solidHeapCB(fopAc_ac_c *i_this); + +public: + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel * mpModel; + /* 0x29C */ mDoExt_McaMorf* mpMorf; + /* 0x2A0 */ dBgW * mpBgW; + /* 0x2A4 */ Mtx mtx; +}; + +namespace { + static const char l_arcname[] = "Vteng"; +}; /* 00000078-00000120 .text init_mtx__12daObjVteng_cFv */ void daObjVteng_c::init_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(mScale); + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::XYZrotM(shape_angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_stack_c::scaleM(mScale); + MTXCopy(mDoMtx_stack_c::get(), mtx); } /* 00000120-00000144 .text solidHeapCB__12daObjVteng_cFP10fopAc_ac_c */ -void daObjVteng_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +BOOL daObjVteng_c::solidHeapCB(fopAc_ac_c* i_this) { + return ((daObjVteng_c*)i_this)->create_heap(); } /* 00000144-000002C4 .text create_heap__12daObjVteng_cFv */ -void daObjVteng_c::create_heap() { - /* Nonmatching */ +bool daObjVteng_c::create_heap() { + bool ret = true; + + void* pModelData = dComIfG_getObjectRes(l_arcname, 0x08); + J3DAnmTransform * pAnm = (J3DAnmTransform *)dComIfG_getObjectRes(l_arcname, 0x05); + + if (!pModelData || !pAnm) { + JUT_ASSERT(0xb7, 0); + ret = false; + } else { + mpMorf = new mDoExt_McaMorf((J3DModelData*)pModelData, NULL, NULL, pAnm, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0x3B, -1, 0, NULL, 0x00, 0x11020203); + if (!mpMorf) { + ret = false; + } else { + J3DModel * model = mpMorf->getModel(); + mpModel = model; + mpBgW = dBgW_NewSet((cBgD_t*)dComIfG_getObjectRes(l_arcname, 0x0B), cBgW::MOVE_BG_e, &mtx); + if (!mpBgW) + ret = false; + } + } + + return ret; } /* 000002C4-00000324 .text jokai_demo__12daObjVteng_cFv */ -void daObjVteng_c::jokai_demo() { - /* Nonmatching */ +bool daObjVteng_c::jokai_demo() { + bool ret = false; + + if (dDemo_setDemoData(this, 0x60, mpMorf, "Vteng", 0, NULL, 0, 0) == TRUE) + ret = true; + + return ret; } /* 00000324-000003F4 .text _create__12daObjVteng_cFv */ -void daObjVteng_c::_create() { - /* Nonmatching */ +s32 daObjVteng_c::_create() { + fopAcM_SetupActor(this, daObjVteng_c); + + s32 ret = dComIfG_resLoad(&mPhs, l_arcname); + + if (ret == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, (heapCallbackFunc)solidHeapCB, 0x72a0)) { + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + init_mtx(); + if (dComIfG_Bgsp()->Regist(mpBgW, this)) { + ret = cPhs_ERROR_e; + } + } else { + ret = cPhs_ERROR_e; + } + } + + return ret; } /* 000003F4-00000488 .text _delete__12daObjVteng_cFv */ -void daObjVteng_c::_delete() { - /* Nonmatching */ +bool daObjVteng_c::_delete() { + dComIfG_resDelete(&mPhs, l_arcname); + + if (heap != NULL && mpBgW != NULL) { + if (mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + } + + mpBgW = NULL; + } + + return true; } /* 00000488-00000510 .text _execute__12daObjVteng_cFv */ -void daObjVteng_c::_execute() { - /* Nonmatching */ +bool daObjVteng_c::_execute() { + if (mpBgW != NULL && mpBgW->ChkUsed()) + mpBgW->Move(); + if (!jokai_demo()) + mpMorf->play(NULL, 0, 0); + return true; } /* 00000510-00000578 .text _draw__12daObjVteng_cFv */ -void daObjVteng_c::_draw() { - /* Nonmatching */ +bool daObjVteng_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG3, getPositionP(), &mTevStr); + g_env_light.setLightTevColorType(mpModel, &mTevStr); + mpMorf->updateDL(); + fopAcM_SetModel(this, mpModel); + return true; } /* 00000578-00000598 .text daObjVteng_Create__FP10fopAc_ac_c */ -void daObjVteng_Create(fopAc_ac_c*) { - /* Nonmatching */ +s32 daObjVteng_Create(fopAc_ac_c* i_this) { + return ((daObjVteng_c*)i_this)->_create(); } /* 00000598-000005BC .text daObjVteng_Delete__FP12daObjVteng_c */ -void daObjVteng_Delete(daObjVteng_c*) { - /* Nonmatching */ +BOOL daObjVteng_Delete(daObjVteng_c* i_this) { + return i_this->_delete(); } /* 000005BC-000005E0 .text daObjVteng_Execute__FP12daObjVteng_c */ -void daObjVteng_Execute(daObjVteng_c*) { - /* Nonmatching */ +BOOL daObjVteng_Execute(daObjVteng_c* i_this) { + return i_this->_execute(); } /* 000005E0-00000604 .text daObjVteng_Draw__FP12daObjVteng_c */ -void daObjVteng_Draw(daObjVteng_c*) { - /* Nonmatching */ +BOOL daObjVteng_Draw(daObjVteng_c* i_this) { + return i_this->_draw(); } /* 00000604-0000060C .text daObjVteng_IsDelete__FP12daObjVteng_c */ -void daObjVteng_IsDelete(daObjVteng_c*) { - /* Nonmatching */ +BOOL daObjVteng_IsDelete(daObjVteng_c* i_this) { + return TRUE; } +static actor_method_class l_daObjVteng_Method = { + (process_method_func)daObjVteng_Create, + (process_method_func)daObjVteng_Delete, + (process_method_func)daObjVteng_Execute, + (process_method_func)daObjVteng_IsDelete, + (process_method_func)daObjVteng_Draw, +}; + +actor_process_profile_definition g_profile_Obj_Vteng = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 3, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_Obj_Vteng, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daObjVteng_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x005A, + /* Actor SubMtd */ &l_daObjVteng_Method, + /* Status */ fopAcStts_UNK40000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/d/actor/d_a_obj_ganonbed.cpp b/src/d/actor/d_a_obj_ganonbed.cpp index 7ae2be609..e14718d61 100644 --- a/src/d/actor/d_a_obj_ganonbed.cpp +++ b/src/d/actor/d_a_obj_ganonbed.cpp @@ -142,7 +142,6 @@ BOOL daObjGbed_IsDelete(daObjGbed_c* i_this) { return TRUE; } - static actor_method_class l_daObjGbed_Method = { (process_method_func)daObjGbed_Create, (process_method_func)daObjGbed_Delete,