summaryrefslogtreecommitdiff
path: root/src/d/d_model.cpp
blob: a9d62c6da4ed6f39c78bdde7fe48a0279487aa0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
//
// Generated By: dol2asm
// Translation Unit: d/d_model
//

#include "d/d_model.h"
#include "JSystem/J3DGraphAnimator/J3DModelData.h"
#include "JSystem/J3DGraphBase/J3DDrawBuffer.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "d/com/d_com_inf_game.h"
#include "d/kankyo/d_kankyo.h"
#include "dol2asm.h"
#include "dolphin/types.h"

//
// Forward References:
//

extern "C" void draw__6dMdl_cFv();
extern "C" void create__6dMdl_cFP12J3DModelDataUsP12dKy_tevstr_c();
extern "C" void entryObj__6dMdl_cFP10dMdl_obj_c();
extern "C" void search__10dMdl_mng_cFP12J3DModelDataUsP12dKy_tevstr_c();
extern "C" void entry__10dMdl_mng_cFP12J3DModelDataUsP12dKy_tevstr_c();
extern "C" void create__10dMdl_mng_cFv();
extern "C" void __dt__6dMdl_cFv();
extern "C" void remove__10dMdl_mng_cFv();
extern "C" void reset__10dMdl_mng_cFv();
extern "C" void entry__10dMdl_mng_cFP12J3DModelDataUsi();
extern "C" void __ct__6dMdl_cFv();
extern "C" u8 m_myObj__10dMdl_mng_c[4 + 4 /* padding */];

//
// External References:
//

extern "C" void dKy_setLight_nowroom_actor__FP12dKy_tevstr_c();
extern "C" void dKy_setLight_again__Fv();
extern "C" void dKy_GxFog_tevstr_set__FP12dKy_tevstr_c();
extern "C" void* __nw__FUl();
extern "C" void __dl__FPv();
extern "C" bool entry__9J3DPacketFP13J3DDrawBuffer();
extern "C" void loadPreDrawSetting__8J3DShapeCFv();
extern "C" void entryImm__13J3DDrawBufferFP9J3DPacketUs();
extern "C" void __destroy_arr();
extern "C" void __construct_array();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
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" u8 sOldVcdVatCmd__8J3DShape[4];

//
// Declarations:
//

/* 8009C4FC-8009C650 096E3C 0154+00 1/0 0/0 0/0 .text            draw__6dMdl_cFv */
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->mColorC0.r, mpTevstr->mColorC0.g, mpTevstr->mColorC0.b,
                         mpTevstr->mColorC0.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;
}

/* 8009C650-8009C668 096F90 0018+00 1/1 0/0 1/1 .text
 * create__6dMdl_cFP12J3DModelDataUsP12dKy_tevstr_c             */
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;
}

/* 8009C668-8009C6DC 096FA8 0074+00 0/0 0/0 5/5 .text            entryObj__6dMdl_cFP10dMdl_obj_c */
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;
}

/* 8009C6DC-8009C724 09701C 0048+00 1/1 0/0 0/0 .text
 * search__10dMdl_mng_cFP12J3DModelDataUsP12dKy_tevstr_c        */
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;
}

/* 8009C724-8009C7AC 097064 0088+00 1/1 0/0 0/0 .text
 * entry__10dMdl_mng_cFP12J3DModelDataUsP12dKy_tevstr_c         */
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;
}

/* ############################################################################################## */
/* 80450FA0-80450FA8 0004A0 0004+04 4/4 0/0 0/0 .sbss            m_myObj__10dMdl_mng_c */
dMdl_mng_c* dMdl_mng_c::m_myObj;

/* 8009C7AC-8009C808 0970EC 005C+00 0/0 1/1 0/0 .text            create__10dMdl_mng_cFv */
void dMdl_mng_c::create() {
    m_myObj = new dMdl_mng_c();
}

/* 8009C808-8009C864 097148 005C+00 3/2 0/0 0/0 .text            __dt__6dMdl_cFv */
dMdl_c::~dMdl_c() {}

/* 8009C864-8009C8C0 0971A4 005C+00 0/0 1/1 0/0 .text            remove__10dMdl_mng_cFv */
void dMdl_mng_c::remove() {
    if (m_myObj != NULL) {
        delete m_myObj;
        m_myObj = NULL;
    }
}

/* 8009C8C0-8009C8D8 097200 0018+00 0/0 1/1 0/0 .text            reset__10dMdl_mng_cFv */
void dMdl_mng_c::reset() {
    if (m_myObj == NULL) {
        return;
    }

    m_myObj->field_0x80 = 0;
}

/* 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 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 */
dMdl_c::dMdl_c() {
    mpModelData = NULL;
    mMaterialId = 0;
}