summaryrefslogtreecommitdiff
path: root/libs/JSystem/JParticle/JPAEmitterManager.cpp
blob: 5731c63ef32e4a7bc81d9e9baf53bb301ddbadaa (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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
//
// Generated By: dol2asm
// Translation Unit: JPAEmitterManager
//

#include "JSystem/JParticle/JPAEmitterManager.h"
#include "JSystem/JParticle/JPAEmitter.h"
#include "JSystem/JParticle/JPAResourceManager.h"
#include "dolphin/gx.h"

//
// Types:
//

//
// Forward References:
//

extern "C" void __ct__17JPAEmitterManagerFUlUlP7JKRHeapUcUc();
extern "C" void func_8027DEBC();
extern "C" void calc__17JPAEmitterManagerFUc();
extern "C" void draw__17JPAEmitterManagerFPC11JPADrawInfoUc();
extern "C" void forceDeleteAllEmitter__17JPAEmitterManagerFv();
extern "C" void forceDeleteGroupEmitter__17JPAEmitterManagerFUc();
extern "C" void forceDeleteEmitter__17JPAEmitterManagerFP14JPABaseEmitter();
extern "C" void entryResourceManager__17JPAEmitterManagerFP18JPAResourceManagerUc();
extern "C" void clearResourceManager__17JPAEmitterManagerFUc();
extern "C" void calcYBBCam__17JPAEmitterManagerFv();
extern "C" void func_8027E51C(void* _this);
extern "C" void func_8027E54C(void* _this);
extern "C" void func_8027E588(void* _this);
extern "C" void func_8027E598(void* _this);
extern "C" void __dt__14JPABaseEmitterFv();
extern "C" void __ct__14JPABaseEmitterFv();

//
// External References:
//

extern "C" void getResource__18JPAResourceManagerCFUs();
extern "C" void calc__11JPAResourceFP18JPAEmitterWorkDataP14JPABaseEmitter();
extern "C" void draw__11JPAResourceFP18JPAEmitterWorkDataP14JPABaseEmitter();
extern "C" void init__14JPABaseEmitterFP17JPAEmitterManagerP11JPAResource();
extern "C" void deleteAllParticle__14JPABaseEmitterFv();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void* __nwa__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void __ct__10JSUPtrLinkFPv();
extern "C" void __dt__10JSUPtrLinkFv();
extern "C" void __dt__10JSUPtrListFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void prepend__10JSUPtrListFP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void __construct_new_array();
extern "C" void _savegpr_24();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _savegpr_29();
extern "C" void _restgpr_24();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" void _restgpr_29();

//
// Declarations:
//

/* 8027DCA0-8027DEBC 2785E0 021C+00 0/0 1/1 0/0 .text __ct__17JPAEmitterManagerFUlUlP7JKRHeapUcUc
 */
// template ctors are at the end of the TU for some reason
#ifdef NONMATCHING
JPAEmitterManager::JPAEmitterManager(u32 ptclMax, u32 emtrMax, JKRHeap* pHeap, u8 grpMax,
                                     u8 resMax) {
    mEmtrMax = emtrMax;
    mPtclMax = ptclMax;
    mGrpMax = grpMax;
    mResMax = resMax;

    JPABaseEmitter* emtr = new (pHeap, 0) JPABaseEmitter[mEmtrMax];
    for (u32 i = 0; i < mEmtrMax; i++)
        mFreeEmtrList.prepend(&emtr[i].mLink);

    JPANode<JPABaseParticle>* ptcl = new (pHeap, 0) JPANode<JPABaseParticle>[mPtclMax];
    for (u32 i = 0; i < mPtclMax; i++)
        mPtclPool.push_back(&ptcl[i]);

    mpGrpEmtr = new (pHeap, 0) JSUList<JPABaseEmitter>[mGrpMax];
    mpResMgrAry = new (pHeap, 0) JPAResourceManager*[mResMax];
    for (int i = 0; i < mResMax; i++) {
        mpResMgrAry[i] = NULL;
    }

    mpWorkData = new (pHeap, 0) JPAEmitterWorkData();
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JPAEmitterManager::JPAEmitterManager(u32 param_0, u32 param_1, JKRHeap* param_2, u8 param_3,
                                         u8 param_4) {
    nofralloc
#include "asm/JSystem/JParticle/JPAEmitterManager/__ct__17JPAEmitterManagerFUlUlP7JKRHeapUcUc.s"
}
#pragma pop
#endif

/* 8027DEBC-8027DFA0 2787FC 00E4+00 0/0 3/3 0/0 .text
 * createSimpleEmitterID__17JPAEmitterManagerFRCQ29JGeometry8TVec3<f>UsUcUcP18JPAEmitterCallBackP19JPAParticleCallBack
 */
JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(JGeometry::TVec3<f32> const& pos,
                                                         u16 resID, u8 groupID, u8 resMgrID,
                                                         JPAEmitterCallBack* emtrCB,
                                                         JPAParticleCallBack* ptclCB) {
    JPAResource* pRes = mpResMgrAry[resMgrID]->getResource(resID);
    if (pRes != NULL && mFreeEmtrList.getNumLinks() != 0) {
        JSULink<JPABaseEmitter>* pLink = mFreeEmtrList.getFirst();
        mFreeEmtrList.remove(pLink);
        mpGrpEmtr[groupID].append(pLink);
        JPABaseEmitter* emtr = pLink->getObject();
        emtr->init(this, pRes);
        emtr->mpPtclPool = &mPtclPool;
        emtr->mpEmtrCallBack = emtrCB;
        emtr->mpPtclCallBack = ptclCB;
        emtr->mGroupID = groupID;
        emtr->mResMgrID = resMgrID;
        emtr->mGlobalTrs.set(pos);
        return emtr;
    }

    return NULL;
}

/* 8027DFA0-8027E028 2788E0 0088+00 0/0 3/3 0/0 .text            calc__17JPAEmitterManagerFUc */
void JPAEmitterManager::calc(u8 groupID) {
    for (JSULink<JPABaseEmitter>*pLink = mpGrpEmtr[groupID].getFirst(), *pNext;
         pLink != mpGrpEmtr[groupID].getEnd(); pLink = pNext) {
        pNext = pLink->getNext();

        JPABaseEmitter* emtr = pLink->getObject();
        bool done = emtr->mpRes->calc(mpWorkData, emtr);

        if (done && !emtr->checkStatus(0x200))
            forceDeleteEmitter(emtr);
    }
}

/* 8027E028-8027E220 278968 01F8+00 0/0 1/1 0/0 .text draw__17JPAEmitterManagerFPC11JPADrawInfoUc
 */
void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 groupID) {
    drawInfo->getCamMtx(&mpWorkData->mPosCamMtx);
    drawInfo->getPrjMtx(&mpWorkData->mPrjMtx);
    calcYBBCam();
    GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
    GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
    GXEnableTexOffsets(GX_TEXCOORD0, GX_TRUE, GX_TRUE);
    GXEnableTexOffsets(GX_TEXCOORD1, GX_TRUE, GX_TRUE);
    GXEnableTexOffsets(GX_TEXCOORD2, GX_TRUE, GX_TRUE);
    GXSetCullMode(GX_CULL_NONE);
    GXSetCoPlanar(GX_FALSE);
    GXClearVtxDesc();
    GXSetVtxDesc(GX_VA_POS, GX_INDEX8);
    GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8);
    GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S8, 0);
    GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S8, 0);
    GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
    GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
    GXSetCurrentMtx(GX_PNMTX0);
    GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE,
                  GX_AF_NONE);
    GXSetChanCtrl(GX_COLOR1A1, GX_FALSE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE,
                  GX_AF_NONE);
    GXSetNumChans(0);

    for (JSULink<JPABaseEmitter>* pLink = mpGrpEmtr[groupID].getFirst();
         pLink != mpGrpEmtr[groupID].getEnd(); pLink = pLink->getNext()) {
        JPABaseEmitter* emtr = pLink->getObject();
        if (!emtr->checkStatus(0x04)) {
            mpWorkData->mpResMgr = mpResMgrAry[emtr->mResMgrID];
            emtr->mpRes->draw(mpWorkData, emtr);
        }
    }
}

/* 8027E220-8027E278 278B60 0058+00 0/0 1/1 0/0 .text forceDeleteAllEmitter__17JPAEmitterManagerFv
 */
void JPAEmitterManager::forceDeleteAllEmitter() {
    for (u8 i = 0; i < mGrpMax; i++)
        forceDeleteGroupEmitter(i);
}

/* 8027E278-8027E2D8 278BB8 0060+00 1/1 0/0 0/0 .text
 * forceDeleteGroupEmitter__17JPAEmitterManagerFUc              */
void JPAEmitterManager::forceDeleteGroupEmitter(u8 groupID) {
    while (mpGrpEmtr[groupID].getNumLinks())
        forceDeleteEmitter(mpGrpEmtr[groupID].getLast()->getObject());
}

/* 8027E2D8-8027E344 278C18 006C+00 3/3 1/1 0/0 .text
 * forceDeleteEmitter__17JPAEmitterManagerFP14JPABaseEmitter    */
void JPAEmitterManager::forceDeleteEmitter(JPABaseEmitter* emtr) {
    emtr->deleteAllParticle();
    emtr->setStatus(0x300);
    mpGrpEmtr[emtr->getGroupID()].remove(&emtr->mLink);
    mFreeEmtrList.prepend(&emtr->mLink);
}

/* 8027E344-8027E354 278C84 0010+00 0/0 2/2 0/0 .text
 * entryResourceManager__17JPAEmitterManagerFP18JPAResourceManagerUc */
void JPAEmitterManager::entryResourceManager(JPAResourceManager* resMgr, u8 resMgrID) {
    mpResMgrAry[resMgrID] = resMgr;
}

/* 8027E354-8027E3F4 278C94 00A0+00 0/0 1/1 0/0 .text clearResourceManager__17JPAEmitterManagerFUc
 */
void JPAEmitterManager::clearResourceManager(u8 resMgrID) {
    for (u8 i = 0; i < mGrpMax; i++) {
        for (JSULink<JPABaseEmitter>*pLink = mpGrpEmtr[i].getFirst(), *pNext;
             pLink != mpGrpEmtr[i].getEnd(); pLink = pNext) {
            pNext = pLink->getNext();

            if (resMgrID == pLink->getObject()->getResourceManagerID())
                forceDeleteEmitter(pLink->getObject());
        }
    }

    mpResMgrAry[resMgrID] = NULL;
}

/* ############################################################################################## */

/* 8027E3F4-8027E51C 278D34 0128+00 1/1 0/0 0/0 .text            calcYBBCam__17JPAEmitterManagerFv
 */
void JPAEmitterManager::calcYBBCam() {
    JGeometry::TVec3<float> v;
    v.set(0.0f, mpWorkData->mPosCamMtx[1][1], mpWorkData->mPosCamMtx[2][1]);
    v.normalize();
    mpWorkData->mYBBCamMtx[0][0] = 1.0f;
    mpWorkData->mYBBCamMtx[0][1] = 0.0f;
    mpWorkData->mYBBCamMtx[0][2] = 0.0f;
    mpWorkData->mYBBCamMtx[0][3] = mpWorkData->mPosCamMtx[0][3];
    mpWorkData->mYBBCamMtx[1][0] = 0.0f;
    mpWorkData->mYBBCamMtx[1][1] = v.y;
    mpWorkData->mYBBCamMtx[1][2] = -v.z;
    mpWorkData->mYBBCamMtx[1][3] = mpWorkData->mPosCamMtx[1][3];
    mpWorkData->mYBBCamMtx[2][0] = 0.0f;
    mpWorkData->mYBBCamMtx[2][1] = v.z;
    mpWorkData->mYBBCamMtx[2][2] = v.y;
    mpWorkData->mYBBCamMtx[2][3] = mpWorkData->mPosCamMtx[2][3];
}

/* 8027E51C-8027E54C 278E5C 0030+00 1/1 0/0 0/0 .text            __ct__25JSUList<14JPABaseEmitter>Fv
 */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_8027E51C(void* _this) {
    nofralloc
#include "asm/JSystem/JParticle/JPAEmitterManager/func_8027E51C.s"
}
#pragma pop

/* 8027E54C-8027E588 278E8C 003C+00 1/1 0/0 0/0 .text __dt__26JPANode<15JPABaseParticle>Fv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_8027E54C(void* _this) {
    nofralloc
#include "asm/JSystem/JParticle/JPAEmitterManager/func_8027E54C.s"
}
#pragma pop

/* 8027E588-8027E598 278EC8 0010+00 1/1 0/0 0/0 .text __ct__26JPANode<15JPABaseParticle>Fv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_8027E588(void* _this) {
    nofralloc
#include "asm/JSystem/JParticle/JPAEmitterManager/func_8027E588.s"
}
#pragma pop

/* 8027E598-8027E5EC 278ED8 0054+00 1/1 0/0 0/0 .text            __dt__25JSUList<14JPABaseEmitter>Fv
 */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_8027E598(void* _this) {
    nofralloc
#include "asm/JSystem/JParticle/JPAEmitterManager/func_8027E598.s"
}
#pragma pop

/* 8027E5EC-8027E64C 278F2C 0060+00 1/1 0/0 0/0 .text            __dt__14JPABaseEmitterFv */
JPABaseEmitter::~JPABaseEmitter() {}

/* 8027E64C-8027E6A4 278F8C 0058+00 1/1 0/0 0/0 .text            __ct__14JPABaseEmitterFv */
JPABaseEmitter::JPABaseEmitter() : mLink(this) {}