summaryrefslogtreecommitdiff
path: root/src/JSystem/JParticle/JPAEmitterManager.cpp
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-04-27 07:13:47 +0200
committerrobojumper <robojumper@gmail.com>2025-04-27 07:13:47 +0200
commitc1a0264e6ac151f3a884bc32126de192eede19c7 (patch)
tree1649757ae5c7b47b87f17ef69760b4a359a8d46d /src/JSystem/JParticle/JPAEmitterManager.cpp
parent5df26c52fcc06e017f2cf525264d4f7563715e05 (diff)
Initial import of JParticle + JSUList from TP
Diffstat (limited to 'src/JSystem/JParticle/JPAEmitterManager.cpp')
-rw-r--r--src/JSystem/JParticle/JPAEmitterManager.cpp203
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];
+}