summaryrefslogtreecommitdiff
path: root/src/d/d_model.cpp
blob: 75a0a9d42486fad6edd610f7a92c4d5daa3fb2c4 (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
//
// Generated By: dol2asm
// Translation Unit: d/d_model
//

#include "d/d_model.h"
#include "JSystem/J3DGraphBase/J3DDrawBuffer.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "d/com/d_com_inf_game.h"

//
// Forward References:
//

//
// External References:
//

//
// 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) {
        MTXConcat(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 */
dMdl_c* dMdl_mng_c::entry(J3DModelData* i_modelData, u16 i_materialId, int i_roomNo) {
    if (m_myObj == NULL) {
        return NULL;
    }
    dKy_tevstr_c* tevstr = dComIfGp_roomControl_getTevStr(i_roomNo);
    return m_myObj->entry(i_modelData, i_materialId, tevstr);
}

/* 8009C930-8009C964 097270 0034+00 1/1 0/0 0/0 .text            __ct__6dMdl_cFv */
dMdl_c::dMdl_c() {
    mpModelData = NULL;
    mMaterialId = 0;
}