diff options
| author | TakaRikka <38417346+TakaRikka@users.noreply.github.com> | 2022-02-19 05:22:47 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-19 14:22:47 +0100 |
| commit | 9ba9d7c06cde1db164e3282550855880148dc940 (patch) | |
| tree | 4f548b05d3ca3296f5337e5ab13944ff24fd2907 /src/d/d_simple_model.cpp | |
| parent | d85ab6d159201ae41110a7b80f3fcbdca0b8efeb (diff) | |
d_model / d_simple_model / d_stage + cleanup (#181)
* d_model / d_simple_model / cleanup
* d_stage work
* set up saveHIO / remove asm
* d_a_itembase
Diffstat (limited to 'src/d/d_simple_model.cpp')
| -rw-r--r-- | src/d/d_simple_model.cpp | 381 |
1 files changed, 164 insertions, 217 deletions
diff --git a/src/d/d_simple_model.cpp b/src/d/d_simple_model.cpp index 46f79ed3fe..9ad7bf70ef 100644 --- a/src/d/d_simple_model.cpp +++ b/src/d/d_simple_model.cpp @@ -4,100 +4,16 @@ // #include "d/d_simple_model.h" +#include "d/com/d_com_inf_game.h" #include "dol2asm.h" #include "dolphin/types.h" - -// -// Types: -// - -struct modelList_c {}; - -struct J3DModelData {}; - -struct diff_model_c { - /* 80048D60 */ diff_model_c(); - /* 800490EC */ void create(J3DModelData*, int, u8); - /* 800491F4 */ void getModelData(); - /* 80049210 */ void remove(int); - /* 80049270 */ void draw(); - /* 80049368 */ void init(); - /* 80049388 */ void isSame(J3DModelData*, int); - /* 800493FC */ void getRoomNo(); - /* 80049408 */ void insert(modelList_c*); -}; - -struct dStage_roomControl_c { - static u8 mStatus[65792]; -}; - -struct J3DModel {}; - -struct dSmplMdl_draw_c { - /* 80048CB4 */ dSmplMdl_draw_c(); - /* 80048D80 */ ~dSmplMdl_draw_c(); - /* 80048E0C */ void draw(); - /* 80048EBC */ void entry(J3DModel*, int); - /* 80048F70 */ void addModel(J3DModelData*, int, u8); - /* 80049058 */ void removeModel(J3DModelData*, int); -}; - -struct dKy_tevstr_c {}; - -struct dScnKy_env_light_c { - /* 801A4DA0 */ void setLightTevColorType_MAJI(J3DModelData*, dKy_tevstr_c*); -}; - -struct JKRSolidHeap {}; - -// -// Forward References: -// - -extern "C" static void dSmplMdl_modelUpdateDL__FP8J3DModel(); -extern "C" void __ct__15dSmplMdl_draw_cFv(); -extern "C" void __ct__12diff_model_cFv(); -extern "C" void __dt__15dSmplMdl_draw_cFv(); -extern "C" void draw__15dSmplMdl_draw_cFv(); -extern "C" void entry__15dSmplMdl_draw_cFP8J3DModeli(); -extern "C" void addModel__15dSmplMdl_draw_cFP12J3DModelDataiUc(); -extern "C" void removeModel__15dSmplMdl_draw_cFP12J3DModelDatai(); -extern "C" void create__12diff_model_cFP12J3DModelDataiUc(); -extern "C" void getModelData__12diff_model_cFv(); -extern "C" void remove__12diff_model_cFi(); -extern "C" void draw__12diff_model_cFv(); -extern "C" void init__12diff_model_cFv(); -extern "C" void isSame__12diff_model_cFP12J3DModelDatai(); -extern "C" void getRoomNo__12diff_model_cFv(); -extern "C" void insert__12diff_model_cFP11modelList_c(); +#include "m_Do/m_Do_mtx.h" // // External References: // -extern "C" void mDoExt_modelUpdateDL__FP8J3DModel(); -extern "C" void mDoExt_createSolidHeapFromGameToCurrent__FUlUl(); -extern "C" void mDoExt_adjustSolidHeapToSystem__FP12JKRSolidHeap(); -extern "C" void mDoExt_destroySolidHeap__FP12JKRSolidHeap(); -extern "C" void mDoExt_restoreCurrentHeap__Fv(); -extern "C" void mDoExt_J3DModel__create__FP12J3DModelDataUlUl(); -extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); -extern "C" void __dl__FPv(); -extern "C" void PSMTXCopy(); -extern "C" void __construct_array(); -extern "C" void _savegpr_25(); -extern "C" void _savegpr_26(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_25(); -extern "C" void _restgpr_26(); -extern "C" void _restgpr_28(); -extern "C" void _restgpr_29(); -extern "C" extern u8 g_mDoMtx_identity[48 + 24 /* padding */]; -extern "C" u8 mStatus__20dStage_roomControl_c[65792]; -extern "C" extern u8 g_dComIfG_gameInfo[122384]; -extern "C" extern u8 g_env_light[4880]; -extern "C" extern u8 j3dSys[284]; +extern "C" extern dScnKy_env_light_c g_env_light; // // Declarations: @@ -105,181 +21,212 @@ extern "C" extern u8 j3dSys[284]; /* 80048C54-80048CB4 043594 0060+00 1/1 0/0 0/0 .text dSmplMdl_modelUpdateDL__FP8J3DModel */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void dSmplMdl_modelUpdateDL(J3DModel* param_0) { - nofralloc -#include "asm/d/d_simple_model/dSmplMdl_modelUpdateDL__FP8J3DModel.s" +static void dSmplMdl_modelUpdateDL(J3DModel* i_model) { + i_model->calc(); + i_model->entry(); + i_model->viewCalc(); } -#pragma pop - -/* ############################################################################################## */ -/* 803A82F8-803A8308 005418 000C+04 2/2 0/0 0/0 .data __vt__15dSmplMdl_draw_c */ -SECTION_DATA extern void* __vt__15dSmplMdl_draw_c[3 + 1 /* padding */] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__15dSmplMdl_draw_cFv, - /* padding */ - NULL, -}; /* 80048CB4-80048D60 0435F4 00AC+00 0/0 1/1 0/0 .text __ct__15dSmplMdl_draw_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm dSmplMdl_draw_c::dSmplMdl_draw_c() { - nofralloc -#include "asm/d/d_simple_model/__ct__15dSmplMdl_draw_cFv.s" +dSmplMdl_draw_c::dSmplMdl_draw_c() { + for (int i = 0; i < 8; i++) { + mModel[i].init(); + } + + for (int i = 0; i < 500; i++) { + mList[i].init(); + } + + mListCount = 0; } -#pragma pop /* 80048D60-80048D80 0436A0 0020+00 1/1 0/0 0/0 .text __ct__12diff_model_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm diff_model_c::diff_model_c() { - nofralloc -#include "asm/d/d_simple_model/__ct__12diff_model_cFv.s" +diff_model_c::diff_model_c() { + mpHeap = NULL; + mpModel = NULL; + mCreateNum = 0; + mpList = NULL; + mRoomNo = 63; } -#pragma pop /* 80048D80-80048E0C 0436C0 008C+00 1/0 0/0 0/0 .text __dt__15dSmplMdl_draw_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm dSmplMdl_draw_c::~dSmplMdl_draw_c() { - nofralloc -#include "asm/d/d_simple_model/__dt__15dSmplMdl_draw_cFv.s" +dSmplMdl_draw_c::~dSmplMdl_draw_c() { + for (int i = 0; i < 8; i++) { + if (mModel[i].getModel() != NULL) { + mModel[i].remove(1); + } + } } -#pragma pop /* 80048E0C-80048EBC 04374C 00B0+00 0/0 1/1 0/0 .text draw__15dSmplMdl_draw_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dSmplMdl_draw_c::draw() { - nofralloc -#include "asm/d/d_simple_model/draw__15dSmplMdl_draw_cFv.s" +void dSmplMdl_draw_c::draw() { + for (int i = 0; i < 8; i++) { + if (mModel[i].getModel() != NULL) { + mModel[i].draw(); + } + } + mListCount = 0; + + for (int i = 0; i < 500; i++) { + mList[i].init(); + } + + for (int i = 0; i < 8; i++) { + mModel[i].insert(NULL); + } } -#pragma pop /* 80048EBC-80048F70 0437FC 00B4+00 0/0 1/1 0/0 .text entry__15dSmplMdl_draw_cFP8J3DModeli */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dSmplMdl_draw_c::entry(J3DModel* param_0, int param_1) { - nofralloc -#include "asm/d/d_simple_model/entry__15dSmplMdl_draw_cFP8J3DModeli.s" +void dSmplMdl_draw_c::entry(J3DModel* i_model, int roomNo) { + if (i_model != NULL && mListCount < 500) { + mList[mListCount].set(i_model); + for (int i = 0; i < 8; i++) { + if (mModel[i].isSame(i_model->getModelData(), roomNo)) { + mModel[i].insert(&mList[mListCount]); + break; + } + } + mListCount++; + } } -#pragma pop /* 80048F70-80049058 0438B0 00E8+00 0/0 1/1 0/0 .text * addModel__15dSmplMdl_draw_cFP12J3DModelDataiUc */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dSmplMdl_draw_c::addModel(J3DModelData* param_0, int param_1, u8 param_2) { - nofralloc -#include "asm/d/d_simple_model/addModel__15dSmplMdl_draw_cFP12J3DModelDataiUc.s" +BOOL dSmplMdl_draw_c::addModel(J3DModelData* i_modelData, int roomNo, u8 drawBG) { + for (int i = 0; i < 8; i++) { + if (mModel[i].isSame(i_modelData, roomNo)) { + return mModel[i].create(i_modelData, roomNo, drawBG) ? TRUE : FALSE; + } + } + + for (int i = 0; i < 8; i++) { + if (mModel[i].getModelData() == NULL) { + return mModel[i].create(i_modelData, roomNo, drawBG) ? TRUE : FALSE; + } + } + + return 0; } -#pragma pop /* 80049058-800490EC 043998 0094+00 0/0 1/1 0/0 .text * removeModel__15dSmplMdl_draw_cFP12J3DModelDatai */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dSmplMdl_draw_c::removeModel(J3DModelData* param_0, int param_1) { - nofralloc -#include "asm/d/d_simple_model/removeModel__15dSmplMdl_draw_cFP12J3DModelDatai.s" -} -#pragma pop +int dSmplMdl_draw_c::removeModel(J3DModelData* i_modelData, int roomNo) { + if (i_modelData == NULL) { + return 0; + } + + for (int i = 0; i < 8; i++) { + if (mModel[i].isSame(i_modelData, roomNo)) { + mModel[i].remove(0); + return 0; + } + } -/* ############################################################################################## */ -/* 80451F38-80451F40 000538 0004+04 1/1 0/0 0/0 .sdata2 @3763 */ -SECTION_SDATA2 static f32 lit_3763[1 + 1 /* padding */] = { - 0.0f, - /* padding */ - 0.0f, -}; + return 0; +} /* 800490EC-800491F4 043A2C 0108+00 1/1 0/0 0/0 .text create__12diff_model_cFP12J3DModelDataiUc */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void diff_model_c::create(J3DModelData* param_0, int param_1, u8 param_2) { - nofralloc -#include "asm/d/d_simple_model/create__12diff_model_cFP12J3DModelDataiUc.s" +BOOL diff_model_c::create(J3DModelData* i_modelData, int roomNo, u8 drawBG) { + if (mpHeap == NULL) { + mpHeap = mDoExt_createSolidHeapFromGameToCurrent(0x2000, 0x20); + + if (mpHeap != NULL) { + mpModel = mDoExt_J3DModel__create(i_modelData, 0x80000, 0x11000084); + + if (mpModel == NULL) { + remove(1); + mDoExt_restoreCurrentHeap(); + } else { + mpModel->setBaseScale(cXyz(0.0f, 0.0f, 0.0f)); + mpModel->i_setBaseTRMtx(g_mDoMtx_identity); + mCreateNum++; + mDoExt_adjustSolidHeapToSystem(mpHeap); + mRoomNo = roomNo; + mDrawBG = drawBG; + return 1; + } + } + } else { + mCreateNum++; + return 1; + } + + return 0; } -#pragma pop /* 800491F4-80049210 043B34 001C+00 2/2 0/0 0/0 .text getModelData__12diff_model_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void diff_model_c::getModelData() { - nofralloc -#include "asm/d/d_simple_model/getModelData__12diff_model_cFv.s" +J3DModelData* diff_model_c::getModelData() { + if (mpModel != NULL) { + return mpModel->getModelData(); + } + return NULL; } -#pragma pop /* 80049210-80049270 043B50 0060+00 3/3 0/0 0/0 .text remove__12diff_model_cFi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void diff_model_c::remove(int param_0) { - nofralloc -#include "asm/d/d_simple_model/remove__12diff_model_cFi.s" +void diff_model_c::remove(int param_0) { + mCreateNum--; + + if (mCreateNum == 0 || param_0 != 0) { + JKRSolidHeap* heap = mpHeap; + if (heap != NULL) { + mDoExt_destroySolidHeap(heap); + init(); + } + } } -#pragma pop /* 80049270-80049368 043BB0 00F8+00 1/1 0/0 0/0 .text draw__12diff_model_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void diff_model_c::draw() { - nofralloc -#include "asm/d/d_simple_model/draw__12diff_model_cFv.s" +void diff_model_c::draw() { + modelList_c* list = mpList; + if (list != NULL) { + if (dComIfGp_roomControl_checkStatusFlag(getRoomNo(), 0x10)) { + dKy_tevstr_c* tevstr = dComIfGp_roomControl_getTevStr(getRoomNo()); + g_env_light.setLightTevColorType_MAJI(mpModel, tevstr); + + if (mDrawBG == 1) { + dComIfGd_setListBG(); + } + + for (; list != NULL; list = list->field_0x4) { + dSmplMdl_modelUpdateDL(list->mpModel); + } + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + } + } } -#pragma pop /* 80049368-80049388 043CA8 0020+00 2/2 0/0 0/0 .text init__12diff_model_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void diff_model_c::init() { - nofralloc -#include "asm/d/d_simple_model/init__12diff_model_cFv.s" +void diff_model_c::init() { + mpModel = NULL; + mpHeap = NULL; + mpList = NULL; + mCreateNum = 0; + mRoomNo = 63; } -#pragma pop /* 80049388-800493FC 043CC8 0074+00 3/3 0/0 0/0 .text isSame__12diff_model_cFP12J3DModelDatai */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void diff_model_c::isSame(J3DModelData* param_0, int param_1) { - nofralloc -#include "asm/d/d_simple_model/isSame__12diff_model_cFP12J3DModelDatai.s" +BOOL diff_model_c::isSame(J3DModelData* i_modelData, int roomNo) { + if (mpModel != NULL) { + return getModelData() == i_modelData && roomNo == getRoomNo(); + } + + return FALSE; } -#pragma pop /* 800493FC-80049408 043D3C 000C+00 2/2 0/0 0/0 .text getRoomNo__12diff_model_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void diff_model_c::getRoomNo() { - nofralloc -#include "asm/d/d_simple_model/getRoomNo__12diff_model_cFv.s" +s32 diff_model_c::getRoomNo() { + return mRoomNo; } -#pragma pop /* 80049408-80049420 043D48 0018+00 2/2 0/0 0/0 .text insert__12diff_model_cFP11modelList_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void diff_model_c::insert(modelList_c* param_0) { - nofralloc -#include "asm/d/d_simple_model/insert__12diff_model_cFP11modelList_c.s" +void diff_model_c::insert(modelList_c* list) { + modelList_c* prev = mpList; + mpList = list; + + if (list == NULL) { + return; + } + + list->field_0x4 = prev; } -#pragma pop |
