summaryrefslogtreecommitdiff
path: root/src/d/d_model.cpp
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2022-02-19 05:22:47 -0800
committerGitHub <noreply@github.com>2022-02-19 14:22:47 +0100
commit9ba9d7c06cde1db164e3282550855880148dc940 (patch)
tree4f548b05d3ca3296f5337e5ab13944ff24fd2907 /src/d/d_model.cpp
parentd85ab6d159201ae41110a7b80f3fcbdca0b8efeb (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_model.cpp')
-rw-r--r--src/d/d_model.cpp240
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