diff options
| author | robojumper <robojumper@gmail.com> | 2025-04-27 07:13:47 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-04-27 07:13:47 +0200 |
| commit | c1a0264e6ac151f3a884bc32126de192eede19c7 (patch) | |
| tree | 1649757ae5c7b47b87f17ef69760b4a359a8d46d /src/JSystem/JParticle/JPAEmitterManager.cpp | |
| parent | 5df26c52fcc06e017f2cf525264d4f7563715e05 (diff) | |
Initial import of JParticle + JSUList from TP
Diffstat (limited to 'src/JSystem/JParticle/JPAEmitterManager.cpp')
| -rw-r--r-- | src/JSystem/JParticle/JPAEmitterManager.cpp | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/src/JSystem/JParticle/JPAEmitterManager.cpp b/src/JSystem/JParticle/JPAEmitterManager.cpp new file mode 100644 index 00000000..649f4226 --- /dev/null +++ b/src/JSystem/JParticle/JPAEmitterManager.cpp @@ -0,0 +1,203 @@ +// +// Generated By: dol2asm +// Translation Unit: JPAEmitterManager +// + +#include "JSystem/JParticle/JPAEmitterManager.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JParticle/JPAEmitter.h" +#include "JSystem/JParticle/JPAParticle.h" +#include "JSystem/JParticle/JPAResourceManager.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "dolphin/gx.h" + +/* 8027DCA0-8027DEBC 2785E0 021C+00 0/0 1/1 0/0 .text __ct__17JPAEmitterManagerFUlUlP7JKRHeapUcUc + */ +JPAEmitterManager::JPAEmitterManager(u32 i_ptclNum, u32 i_emtrNum, JKRHeap* pHeap, u8 i_gidMax, + u8 i_ridMax) { + emtrNum = i_emtrNum; + ptclNum = i_ptclNum; + gidMax = i_gidMax; + ridMax = i_ridMax; + + JUT_ASSERT(40, emtrNum && ptclNum && gidMax && ridMax); + + JPABaseEmitter* p_emtr_link = new (pHeap, 0) JPABaseEmitter[emtrNum]; + JUT_ASSERT(44, p_emtr_link); + for (u32 i = 0; i < emtrNum; i++) + mFreeEmtrList.prepend(&p_emtr_link[i].mLink); + + JPANode<JPABaseParticle>* p_ptcl_node = new (pHeap, 0) JPANode<JPABaseParticle>[ptclNum]; + JUT_ASSERT(51, p_ptcl_node); + for (u32 i = 0; i < ptclNum; i++) + mPtclPool.push_back(&p_ptcl_node[i]); + + pEmtrUseList = new (pHeap, 0) JSUList<JPABaseEmitter>[gidMax]; + JUT_ASSERT(58, pEmtrUseList); + pResMgrAry = new (pHeap, 0) JPAResourceManager*[ridMax]; + JUT_ASSERT(62, pResMgrAry) + for (int i = 0; i < ridMax; i++) { + pResMgrAry[i] = NULL; + } + + pWd = new (pHeap, 0) JPAEmitterWorkData(); + JUT_ASSERT(67, pWd); +} + +/* 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 group_id, u8 res_mgr_id, + JPAEmitterCallBack* emtrCB, + JPAParticleCallBack* ptclCB) { + JUT_ASSERT(88, group_id < gidMax); + JUT_ASSERT(89, res_mgr_id < ridMax); + JUT_ASSERT(90, pResMgrAry[res_mgr_id] != 0); + JPAResource* pRes = pResMgrAry[res_mgr_id]->getResource(resID); + + if (pRes == NULL) { + JUT_WARN_DEVICE(94, 3, "JPA : User Index %d is NOT exist\n", resID); + } else if (mFreeEmtrList.getNumLinks() == 0) { + JUT_WARN_DEVICE(97, 3, "JPA : Can NOT create emitter more\n"); + } else { + JSULink<JPABaseEmitter>* pLink = mFreeEmtrList.getFirst(); + mFreeEmtrList.remove(pLink); + pEmtrUseList[group_id].append(pLink); + JPABaseEmitter* emtr = pLink->getObject(); + emtr->init(this, pRes); + emtr->mpPtclPool = &mPtclPool; + emtr->mpEmtrCallBack = emtrCB; + emtr->mpPtclCallBack = ptclCB; + emtr->mGroupID = group_id; + emtr->mResMgrID = res_mgr_id; + 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 group_id) { + JUT_ASSERT(154, group_id < gidMax); + JSULink<JPABaseEmitter>* pNext = NULL; + for (JSULink<JPABaseEmitter>* pLink = pEmtrUseList[group_id].getFirst(); + pLink != pEmtrUseList[group_id].getEnd(); pLink = pNext) { + pNext = pLink->getNext(); + + JPABaseEmitter* emtr = pLink->getObject(); + + if (emtr->mpRes->calc(pWd, emtr) && !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 group_id) { + JUT_ASSERT(192, group_id < gidMax); + drawInfo->getCamMtx(pWd->mPosCamMtx); + drawInfo->getPrjMtx(pWd->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 = pEmtrUseList[group_id].getFirst(); + pLink != pEmtrUseList[group_id].getEnd(); pLink = pLink->getNext()) { + JPABaseEmitter* emtr = pLink->getObject(); + if (!emtr->checkStatus(0x04)) { + pWd->mpResMgr = pResMgrAry[emtr->mResMgrID]; + emtr->mpRes->draw(pWd, emtr); + } + } +} + +/* 8027E220-8027E278 278B60 0058+00 0/0 1/1 0/0 .text forceDeleteAllEmitter__17JPAEmitterManagerFv + */ +void JPAEmitterManager::forceDeleteAllEmitter() { + for (u8 i = 0; i < gidMax; i++) + forceDeleteGroupEmitter(i); +} + +/* 8027E278-8027E2D8 278BB8 0060+00 1/1 0/0 0/0 .text + * forceDeleteGroupEmitter__17JPAEmitterManagerFUc */ +void JPAEmitterManager::forceDeleteGroupEmitter(u8 group_id) { + JUT_ASSERT(288, group_id < gidMax); + while (pEmtrUseList[group_id].getNumLinks()) + forceDeleteEmitter(pEmtrUseList[group_id].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); + pEmtrUseList[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) { + JUT_ASSERT_MSG_F(325, resMgrID < ridMax && (pResMgrAry[resMgrID]) == 0, + "res_id %d res_id_max %d array[%d] = %x", resMgrID, ridMax, resMgrID, + pResMgrAry[resMgrID]); + pResMgrAry[resMgrID] = resMgr; +} + +/* 8027E354-8027E3F4 278C94 00A0+00 0/0 1/1 0/0 .text clearResourceManager__17JPAEmitterManagerFUc + */ +void JPAEmitterManager::clearResourceManager(u8 res_mgr_id) { + JUT_ASSERT(339, res_mgr_id < ridMax); + for (u8 i = 0; i < gidMax; i++) { + JSULink<JPABaseEmitter>* pNext = NULL; + for (JSULink<JPABaseEmitter>* pLink = pEmtrUseList[i].getFirst(); + pLink != pEmtrUseList[i].getEnd(); pLink = pNext) { + pNext = pLink->getNext(); + + if (res_mgr_id == pLink->getObject()->getResourceManagerID()) + forceDeleteEmitter(pLink->getObject()); + } + } + + pResMgrAry[res_mgr_id] = NULL; +} + +/* 8027E3F4-8027E51C 278D34 0128+00 1/1 0/0 0/0 .text calcYBBCam__17JPAEmitterManagerFv + */ +void JPAEmitterManager::calcYBBCam() { + JGeometry::TVec3<float> v(0.0f, pWd->mPosCamMtx[1][1], pWd->mPosCamMtx[2][1]); + JUT_ASSERT(367, !v.isZero()); + v.normalize(); + pWd->mYBBCamMtx[0][0] = 1.0f; + pWd->mYBBCamMtx[0][1] = 0.0f; + pWd->mYBBCamMtx[0][2] = 0.0f; + pWd->mYBBCamMtx[0][3] = pWd->mPosCamMtx[0][3]; + pWd->mYBBCamMtx[1][0] = 0.0f; + pWd->mYBBCamMtx[1][1] = v.y; + pWd->mYBBCamMtx[1][2] = -v.z; + pWd->mYBBCamMtx[1][3] = pWd->mPosCamMtx[1][3]; + pWd->mYBBCamMtx[2][0] = 0.0f; + pWd->mYBBCamMtx[2][1] = v.z; + pWd->mYBBCamMtx[2][2] = v.y; + pWd->mYBBCamMtx[2][3] = pWd->mPosCamMtx[2][3]; +} |
