diff options
Diffstat (limited to 'src/d/d_model.cpp')
| -rw-r--r-- | src/d/d_model.cpp | 240 |
1 files changed, 95 insertions, 145 deletions
diff --git a/src/d/d_model.cpp b/src/d/d_model.cpp index fb8b968a2f..ce00b54a32 100644 --- a/src/d/d_model.cpp +++ b/src/d/d_model.cpp @@ -8,54 +8,6 @@ #include "dolphin/types.h" // -// Types: -// - -struct dStage_roomControl_c { - static u8 mStatus[65792]; -}; - -struct dMdl_obj_c {}; - -struct dKy_tevstr_c {}; - -struct J3DModelData {}; - -struct dMdl_mng_c { - /* 8009C6DC */ void search(J3DModelData*, u16, dKy_tevstr_c*); - /* 8009C724 */ void entry(J3DModelData*, u16, dKy_tevstr_c*); - /* 8009C8D8 */ void entry(J3DModelData*, u16, int); - /* 8009C7AC */ void create(); - /* 8009C864 */ void remove(); - /* 8009C8C0 */ void reset(); - - static u8 m_myObj[4 + 4 /* padding */]; -}; - -struct dMdl_c { - /* 8009C4FC */ void draw(); - /* 8009C650 */ void create(J3DModelData*, u16, dKy_tevstr_c*); - /* 8009C668 */ void entryObj(dMdl_obj_c*); - /* 8009C808 */ ~dMdl_c(); - /* 8009C930 */ dMdl_c(); -}; - -struct J3DShape { - /* 80315300 */ void loadPreDrawSetting() const; - - static u8 sOldVcdVatCmd[4]; -}; - -struct J3DPacket; -struct J3DDrawBuffer { - /* 8032548C */ void entryImm(J3DPacket*, u16); -}; - -struct J3DPacket { - /* 80312750 */ bool entry(J3DDrawBuffer*); -}; - -// // Forward References: // @@ -84,11 +36,6 @@ extern "C" void __dl__FPv(); extern "C" bool entry__9J3DPacketFP13J3DDrawBuffer(); extern "C" void loadPreDrawSetting__8J3DShapeCFv(); extern "C" void entryImm__13J3DDrawBufferFP9J3DPacketUs(); -extern "C" void PSMTXConcat(); -extern "C" void GXSetChanAmbColor(); -extern "C" void GXSetChanMatColor(); -extern "C" void GXLoadPosMtxImm(); -extern "C" void GXLoadNrmMtxImm(); extern "C" void __destroy_arr(); extern "C" void __construct_array(); extern "C" void _savegpr_27(); @@ -97,144 +44,147 @@ extern "C" void _restgpr_27(); extern "C" void _restgpr_28(); extern "C" extern void* __vt__9J3DPacket[5]; extern "C" u8 mStatus__20dStage_roomControl_c[65792]; -extern "C" extern u8 g_dComIfG_gameInfo[122384]; -extern "C" extern u8 j3dSys[284]; -extern "C" extern u32 g_whiteColor; extern "C" u8 sOldVcdVatCmd__8J3DShape[4]; // // Declarations: // -/* ############################################################################################## */ -/* 80456B70-80456B78 000010 0004+04 1/1 0/0 0/0 .sbss2 @3621 */ -SECTION_SBSS2 static u8 lit_3621[4 + 4 /* padding */]; - /* 8009C4FC-8009C650 096E3C 0154+00 1/0 0/0 0/0 .text draw__6dMdl_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dMdl_c::draw() { - nofralloc -#include "asm/d/d_model/draw__6dMdl_cFv.s" +void dMdl_c::draw() { + j3dSys.setVtxPos(mpModelData->getVtxPosArray()); + j3dSys.setVtxNrm(mpModelData->getVtxNrmArray()); + j3dSys.setVtxCol(mpModelData->getVtxColorArray(0)); + J3DShape::resetVcdVatCache(); + + J3DShape* shape = mpModelData->getMaterialNodePointer(mMaterialId)->getShape(); + mpModelData->getMaterialNodePointer(mMaterialId)->loadSharedDL(); + shape->loadPreDrawSetting(); + + GXColor amb_color = {mpTevstr->field_0x348.r, mpTevstr->field_0x348.g, mpTevstr->field_0x348.b, + mpTevstr->field_0x348.a}; + GXSetChanAmbColor(GX_COLOR0A0, amb_color); + GXSetChanMatColor(GX_COLOR0A0, g_whiteColor); + dKy_setLight_nowroom_actor(mpTevstr); + dKy_setLight_again(); + dKy_GxFog_tevstr_set(mpTevstr); + + Mtx m; + for (dMdl_obj_c* obj = mpModelObj; obj != NULL; obj = obj->mpObj) { + PSMTXConcat(j3dSys.getViewMtx(), obj->getMtx(), m); + GXLoadPosMtxImm(m, GX_PNMTX0); + GXLoadNrmMtxImm(m, GX_PNMTX0); + shape->simpleDrawCache(); + } + + field_0x1a = false; } -#pragma pop /* 8009C650-8009C668 096F90 0018+00 1/1 0/0 1/1 .text * create__6dMdl_cFP12J3DModelDataUsP12dKy_tevstr_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dMdl_c::create(J3DModelData* param_0, u16 param_1, dKy_tevstr_c* param_2) { - nofralloc -#include "asm/d/d_model/create__6dMdl_cFP12J3DModelDataUsP12dKy_tevstr_c.s" +void dMdl_c::create(J3DModelData* i_modelData, u16 i_materialId, dKy_tevstr_c* i_tevstr) { + mpModelData = i_modelData; + mMaterialId = i_materialId; + mpTevstr = i_tevstr; + field_0x1a = false; } -#pragma pop /* 8009C668-8009C6DC 096FA8 0074+00 0/0 0/0 5/5 .text entryObj__6dMdl_cFP10dMdl_obj_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dMdl_c::entryObj(dMdl_obj_c* param_0) { - nofralloc -#include "asm/d/d_model/entryObj__6dMdl_cFP10dMdl_obj_c.s" +void dMdl_c::entryObj(dMdl_obj_c* i_obj) { + if (!field_0x1a) { + dComIfGd_getListPacket()->entryImm(this, 0); + field_0x1a = true; + mpModelObj = NULL; + } + + i_obj->mpObj = mpModelObj; + mpModelObj = i_obj; } -#pragma pop /* 8009C6DC-8009C724 09701C 0048+00 1/1 0/0 0/0 .text * search__10dMdl_mng_cFP12J3DModelDataUsP12dKy_tevstr_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dMdl_mng_c::search(J3DModelData* param_0, u16 param_1, dKy_tevstr_c* param_2) { - nofralloc -#include "asm/d/d_model/search__10dMdl_mng_cFP12J3DModelDataUsP12dKy_tevstr_c.s" +dMdl_c* dMdl_mng_c::search(J3DModelData* i_modelData, u16 i_materialId, dKy_tevstr_c* i_tevstr) { + dMdl_c* model = field_0x0; + for (int i = field_0x80; i > 0; i--) { + if (model->getModelData() == i_modelData && model->getMaterialId() == i_materialId && + model->getTevstr() == i_tevstr) { + return model; + } + model++; + } + return NULL; } -#pragma pop /* 8009C724-8009C7AC 097064 0088+00 1/1 0/0 0/0 .text * entry__10dMdl_mng_cFP12J3DModelDataUsP12dKy_tevstr_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dMdl_mng_c::entry(J3DModelData* param_0, u16 param_1, dKy_tevstr_c* param_2) { - nofralloc -#include "asm/d/d_model/entry__10dMdl_mng_cFP12J3DModelDataUsP12dKy_tevstr_c.s" +dMdl_c* dMdl_mng_c::entry(J3DModelData* i_modelData, u16 i_materialId, dKy_tevstr_c* i_tevstr) { + dMdl_c* model = search(i_modelData, i_materialId, i_tevstr); + + if (model == NULL) { + if (field_0x80 >= 4) { + return NULL; + } else { + model = &field_0x0[field_0x80]; + model->create(i_modelData, i_materialId, i_tevstr); + field_0x80++; + } + } + + return model; } -#pragma pop /* ############################################################################################## */ /* 80450FA0-80450FA8 0004A0 0004+04 4/4 0/0 0/0 .sbss m_myObj__10dMdl_mng_c */ -u8 dMdl_mng_c::m_myObj[4 + 4 /* padding */]; +dMdl_mng_c* dMdl_mng_c::m_myObj; /* 8009C7AC-8009C808 0970EC 005C+00 0/0 1/1 0/0 .text create__10dMdl_mng_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dMdl_mng_c::create() { - nofralloc -#include "asm/d/d_model/create__10dMdl_mng_cFv.s" +void dMdl_mng_c::create() { + m_myObj = new dMdl_mng_c(); } -#pragma pop - -/* ############################################################################################## */ -/* 803AF978-803AF990 00CA98 0014+04 2/2 0/0 1/1 .data __vt__6dMdl_c */ -SECTION_DATA extern void* __vt__6dMdl_c[5 + 1 /* padding */] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)entry__9J3DPacketFP13J3DDrawBuffer, - (void*)draw__6dMdl_cFv, - (void*)__dt__6dMdl_cFv, - /* padding */ - NULL, -}; /* 8009C808-8009C864 097148 005C+00 3/2 0/0 0/0 .text __dt__6dMdl_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm dMdl_c::~dMdl_c() { - nofralloc -#include "asm/d/d_model/__dt__6dMdl_cFv.s" -} -#pragma pop +dMdl_c::~dMdl_c() {} /* 8009C864-8009C8C0 0971A4 005C+00 0/0 1/1 0/0 .text remove__10dMdl_mng_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dMdl_mng_c::remove() { - nofralloc -#include "asm/d/d_model/remove__10dMdl_mng_cFv.s" +void dMdl_mng_c::remove() { + if (m_myObj != NULL) { + delete m_myObj; + m_myObj = NULL; + } } -#pragma pop /* 8009C8C0-8009C8D8 097200 0018+00 0/0 1/1 0/0 .text reset__10dMdl_mng_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dMdl_mng_c::reset() { - nofralloc -#include "asm/d/d_model/reset__10dMdl_mng_cFv.s" +void dMdl_mng_c::reset() { + if (m_myObj == NULL) { + return; + } + + m_myObj->field_0x80 = 0; } -#pragma pop /* 8009C8D8-8009C930 097218 0058+00 0/0 0/0 4/4 .text entry__10dMdl_mng_cFP12J3DModelDataUsi */ +// missing mr instructions +#ifdef NONMATCHING +dMdl_c* dMdl_mng_c::entry(J3DModelData* i_modelData, u16 i_materialId, int i_roomNo) { + if (m_myObj == NULL) { + return NULL; + } + + return entry(i_modelData, i_materialId, dComIfGp_roomControl_getTevStr(i_roomNo)); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void dMdl_mng_c::entry(J3DModelData* param_0, u16 param_1, int param_2) { +asm dMdl_c* dMdl_mng_c::entry(J3DModelData* param_0, u16 param_1, int param_2) { nofralloc #include "asm/d/d_model/entry__10dMdl_mng_cFP12J3DModelDataUsi.s" } #pragma pop +#endif /* 8009C930-8009C964 097270 0034+00 1/1 0/0 0/0 .text __ct__6dMdl_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm dMdl_c::dMdl_c() { - nofralloc -#include "asm/d/d_model/__ct__6dMdl_cFv.s" +dMdl_c::dMdl_c() { + mpModelData = NULL; + mMaterialId = 0; } -#pragma pop |
