diff options
| author | robojumper <robojumper@gmail.com> | 2025-04-27 11:14:54 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-04-27 11:14:54 +0200 |
| commit | a962cdd14ac4520d72151c1b83b3e98d608e06be (patch) | |
| tree | 3af28a1b00a8fddde18bc312e89b578d2e421349 /src | |
| parent | 70125c1eacee19e03b8fd9b4dcf277c019ab4f3f (diff) | |
JPAEmitterManager OK
Diffstat (limited to 'src')
| -rw-r--r-- | src/JSystem/JParticle/JPADynamicsBlock.cpp | 36 | ||||
| -rw-r--r-- | src/JSystem/JParticle/JPAEmitterManager.cpp | 51 | ||||
| -rw-r--r-- | src/JSystem/JParticle/JPAExtraShape.cpp | 5 |
3 files changed, 69 insertions, 23 deletions
diff --git a/src/JSystem/JParticle/JPADynamicsBlock.cpp b/src/JSystem/JParticle/JPADynamicsBlock.cpp index ab45d938..15b6f2f7 100644 --- a/src/JSystem/JParticle/JPADynamicsBlock.cpp +++ b/src/JSystem/JParticle/JPADynamicsBlock.cpp @@ -4,8 +4,9 @@ // #include "JSystem/JParticle/JPADynamicsBlock.h" -#include "JSystem/JMath/JMATrigonometric.h" + #include "JSystem/JParticle/JPAEmitter.h" +#include "nw4r/math/math_triangular.h" /* 8027B144-8027B220 275A84 00DC+00 1/1 0/0 0/0 .text JPAVolumePoint__FP18JPAEmitterWorkData */ void JPAVolumePoint(JPAEmitterWorkData* work) { @@ -53,9 +54,10 @@ void JPAVolumeCircle(JPAEmitterWorkData* work) { } distance = work->mVolumeSize * (work->mVolumeMinRad + distance * (1.0f - work->mVolumeMinRad)); - work->mVolumeCalcData.mVolumePos.set(distance * JMASSin(theta), 0.0f, - distance * JMASCos(theta)); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVolumePos.set(distance * nw4r::math::SinIdx(theta), 0.0f, + distance * nw4r::math::CosIdx(theta)); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -65,7 +67,8 @@ void JPAVolumeCube(JPAEmitterWorkData* work) { work->mVolumeCalcData.mVolumePos.set(work->mpEmtr->get_r_zh() * work->mVolumeSize, work->mpEmtr->get_r_zh() * work->mVolumeSize, work->mpEmtr->get_r_zh() * work->mVolumeSize); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -97,9 +100,10 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) { rnd = 1.0f - rnd * rnd * rnd; } f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad)); - work->mVolumeCalcData.mVolumePos.set(rad * JMASCos(phi) * JMASSin(theta), -rad * JMASSin(phi), - rad * JMASCos(phi) * JMASCos(theta)); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVolumePos.set(rad * nw4r::math::CosIdx(phi) * nw4r::math::SinIdx(theta), -rad * nw4r::math::SinIdx(phi), + rad * nw4r::math::CosIdx(phi) * nw4r::math::CosIdx(theta)); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -113,8 +117,9 @@ static void JPAVolumeCylinder(JPAEmitterWorkData* work) { } f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad)); work->mVolumeCalcData.mVolumePos.set( - rad * JMASSin(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * JMASCos(theta)); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + rad * nw4r::math::SinIdx(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * nw4r::math::CosIdx(theta)); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -124,13 +129,14 @@ static void JPAVolumeTorus(JPAEmitterWorkData* work) { s16 theta = work->mVolumeSweep * work->mpEmtr->get_r_ss(); s16 phi = work->mpEmtr->get_r_ss(); f32 rad = work->mVolumeSize * work->mVolumeMinRad; - work->mVolumeCalcData.mVelAxis.set(rad * JMASSin(theta) * JMASCos(phi), rad * JMASSin(phi), - rad * JMASCos(theta) * JMASCos(phi)); + work->mVolumeCalcData.mVelAxis.set(rad * nw4r::math::SinIdx(theta) * nw4r::math::CosIdx(phi), rad * nw4r::math::SinIdx(phi), + rad * nw4r::math::CosIdx(theta) * nw4r::math::CosIdx(phi)); work->mVolumeCalcData.mVolumePos.set( - work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * JMASSin(theta), + work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * nw4r::math::SinIdx(theta), work->mVolumeCalcData.mVelAxis.y, - work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * JMASCos(theta)); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * nw4r::math::CosIdx(theta)); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; } /* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */ diff --git a/src/JSystem/JParticle/JPAEmitterManager.cpp b/src/JSystem/JParticle/JPAEmitterManager.cpp index 6d39cf80..54f4a874 100644 --- a/src/JSystem/JParticle/JPAEmitterManager.cpp +++ b/src/JSystem/JParticle/JPAEmitterManager.cpp @@ -3,6 +3,8 @@ // Translation Unit: JPAEmitterManager // +#include "JSystem/JParticle/JPAList.h" +#include "JSystem/JSupport/JSUList.h" #include "egg/core/eggHeap.h" #include "JSystem/JParticle/JPAEmitterManager.h" #include "JSystem/JParticle/JPAEmitter.h" @@ -10,6 +12,8 @@ #include "JSystem/JParticle/JPAResourceManager.h" #include "JSystem/JUtility/JUTAssert.h" #include "egg/math/eggVector.h" +#include "rvl/GX/GXTransform.h" +#include "rvl/GX/GXTypes.h" #include "rvl/GX.h" /* 8027DCA0-8027DEBC 2785E0 021C+00 0/0 1/1 0/0 .text __ct__17JPAEmitterManagerFUlUlP7EGG::HeapUcUc @@ -23,25 +27,25 @@ JPAEmitterManager::JPAEmitterManager(u32 i_ptclNum, u32 i_emtrNum, EGG::Heap* pH JUT_ASSERT(40, emtrNum && ptclNum && gidMax && ridMax); - JPABaseEmitter* p_emtr_link = new (pHeap, 0) JPABaseEmitter[emtrNum]; + JPABaseEmitter* p_emtr_link = new (pHeap, 4) 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]; + JPANode<JPABaseParticle>* p_ptcl_node = new (pHeap, 4) 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]; + pEmtrUseList = new (pHeap, 4) JSUList<JPABaseEmitter>[gidMax]; JUT_ASSERT(58, pEmtrUseList); - pResMgrAry = new (pHeap, 0) JPAResourceManager*[ridMax]; + pResMgrAry = new (pHeap, 4) JPAResourceManager*[ridMax]; JUT_ASSERT(62, pResMgrAry) for (int i = 0; i < ridMax; i++) { pResMgrAry[i] = NULL; } - pWd = new (pHeap, 0) JPAEmitterWorkData(); + pWd = new (pHeap, 4) JPAEmitterWorkData(); JUT_ASSERT(67, pWd); } @@ -79,6 +83,41 @@ JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(EGG::Vector3f const& po return NULL; } +// SS addition +void JPAEmitterManager::fn_80320E20(u8 group_id, f32 of_x, f32 of_z) { + JSULink<JPABaseEmitter> *pNext = NULL; + for (JSULink<JPABaseEmitter> *pLink = pEmtrUseList[group_id].getFirst(); pLink != pEmtrUseList[group_id].getEnd(); + pLink = pNext) { + pNext = pLink->getNext(); + JPABaseEmitter *pEmit = pLink->getObject(); + + EGG::Vector3f offset; + JPANode<JPABaseParticle> *pNextBase = NULL; + + for (JPANode<JPABaseParticle> *baseLink = pEmit->mAlivePtclBase.getFirst(); + baseLink != pEmit->mAlivePtclBase.getEnd(); baseLink = pNextBase) { + pNextBase = baseLink->getNext(); + + JPABaseParticle *o = baseLink->getObject(); + o->getOffsetPosition(offset); + offset.x += of_x; + offset.z += of_z; + o->setOffsetPosition(offset); + } + + for (JPANode<JPABaseParticle> *childLink = pEmit->mAlivePtclChld.getFirst(); + childLink != pEmit->mAlivePtclChld.getEnd(); childLink = pNextBase) { + pNextBase = childLink->getNext(); + + JPABaseParticle *o = childLink->getObject(); + o->getOffsetPosition(offset); + offset.x += of_x; + offset.z += of_z; + o->setOffsetPosition(offset); + } + } +} + /* 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); @@ -130,6 +169,8 @@ void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 group_id) { emtr->mpRes->draw(pWd, emtr); } } + + GXSetClipMode(GX_CLIP_ENABLE); } /* 8027E220-8027E278 278B60 0058+00 0/0 1/1 0/0 .text forceDeleteAllEmitter__17JPAEmitterManagerFv diff --git a/src/JSystem/JParticle/JPAExtraShape.cpp b/src/JSystem/JParticle/JPAExtraShape.cpp index 5271261a..0c0e8bf5 100644 --- a/src/JSystem/JParticle/JPAExtraShape.cpp +++ b/src/JSystem/JParticle/JPAExtraShape.cpp @@ -4,10 +4,9 @@ // #include "JSystem/JParticle/JPAExtraShape.h" -#include "JSystem/JMath/JMATrigonometric.h" #include "JSystem/JParticle/JPAParticle.h" #include "JSystem/JParticle/JPAEmitter.h" -#include "rvl/OS.h" +#include "nw4r/math/math_triangular.h" /* 8027A918-8027A990 275258 0078+00 0/0 1/1 0/0 .text * JPACalcScaleX__FP18JPAEmitterWorkDataP15JPABaseParticle */ @@ -116,7 +115,7 @@ void JPACalcAlphaFlickAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { alpha = esp->getAlphaBaseValue(); } s32 theta = ptcl->mAlphaWaveRandom * ptcl->mAge * 16384.0f * (1.0f - esp->getAlphaFreq()); - f32 wave = JMASSin(theta); + f32 wave = nw4r::math::SinIdx(theta); alpha *= (1.0f + esp->getAlphaAmp() * (wave - 1.0f) * 0.5f) * 255.0f; OSf32tou8(&alpha, &ptcl->mPrmColorAlphaAnm); } |
