summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-04-27 11:14:54 +0200
committerrobojumper <robojumper@gmail.com>2025-04-27 11:14:54 +0200
commita962cdd14ac4520d72151c1b83b3e98d608e06be (patch)
tree3af28a1b00a8fddde18bc312e89b578d2e421349 /src
parent70125c1eacee19e03b8fd9b4dcf277c019ab4f3f (diff)
JPAEmitterManager OK
Diffstat (limited to 'src')
-rw-r--r--src/JSystem/JParticle/JPADynamicsBlock.cpp36
-rw-r--r--src/JSystem/JParticle/JPAEmitterManager.cpp51
-rw-r--r--src/JSystem/JParticle/JPAExtraShape.cpp5
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);
}