tp/libs/JSystem/JParticle/JPAEmitterManager.cpp

315 lines
11 KiB
C++

//
// Generated By: dol2asm
// Translation Unit: JPAEmitterManager
//
#include "JSystem/JParticle/JPAEmitterManager.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JParticle/JPAParticle.h"
#include "JSystem/JParticle/JPAResourceManager.h"
#include "dol2asm.h"
#include "dolphin/types.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();
extern "C" extern u32 __float_epsilon;
//
// Declarations:
//
/* 8027DCA0-8027DEBC 2785E0 021C+00 0/0 1/1 0/0 .text __ct__17JPAEmitterManagerFUlUlP7JKRHeapUcUc
*/
#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]);
// can't get __construct_new_array to call the correct constructor within.
mpGrpEmtr = new (pHeap, 0) JSUList<JPABaseEmitter>[mGrpMax];
mpResMgrAry = new (pHeap, 0) JPAResourceManager*[mResMax];
for (u8 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;
}
/* ############################################################################################## */
/* 80455358-8045535C 003958 0004+00 1/1 0/0 0/0 .sdata2 @2632 */
SECTION_SDATA2 static u8 lit_2632[4] = {
0x00,
0x00,
0x00,
0x00,
};
/* 8045535C-80455360 00395C 0004+00 1/1 0/0 0/0 .sdata2 @2633 */
SECTION_SDATA2 static f32 lit_2633 = 32.0f;
/* 80455360-80455364 003960 0004+00 1/1 0/0 0/0 .sdata2 @2634 */
SECTION_SDATA2 static f32 lit_2634 = 0.5f;
/* 80455364-80455368 003964 0004+00 1/1 0/0 0/0 .sdata2 @2635 */
SECTION_SDATA2 static f32 lit_2635 = 3.0f;
/* 80455368-80455370 003968 0004+04 1/1 0/0 0/0 .sdata2 @2636 */
SECTION_SDATA2 static f32 lit_2636[1 + 1 /* padding */] = {
1.0f,
/* padding */
0.0f,
};
/* 8027E3F4-8027E51C 278D34 0128+00 1/1 0/0 0/0 .text calcYBBCam__17JPAEmitterManagerFv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JPAEmitterManager::calcYBBCam() {
nofralloc
#include "asm/JSystem/JParticle/JPAEmitterManager/calcYBBCam__17JPAEmitterManagerFv.s"
}
#pragma pop
/* 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) {}