summaryrefslogtreecommitdiff
path: root/src/JSystem/JParticle/JPADynamicsBlock.cpp
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2026-05-07 21:13:24 +0200
committerrobojumper <robojumper@gmail.com>2026-05-07 21:13:24 +0200
commitf4d163797f3c21e5a705b75043e0a8fbe7dc2460 (patch)
tree9cddc9fa36ec13e7dac76c54d74257c61fe20b47 /src/JSystem/JParticle/JPADynamicsBlock.cpp
parentd8744e1f34e9955d55a5605f939bdf0bf9d8a729 (diff)
Re-import JParticle
Diffstat (limited to 'src/JSystem/JParticle/JPADynamicsBlock.cpp')
-rw-r--r--src/JSystem/JParticle/JPADynamicsBlock.cpp76
1 files changed, 24 insertions, 52 deletions
diff --git a/src/JSystem/JParticle/JPADynamicsBlock.cpp b/src/JSystem/JParticle/JPADynamicsBlock.cpp
index a037be31..4804cd6d 100644
--- a/src/JSystem/JParticle/JPADynamicsBlock.cpp
+++ b/src/JSystem/JParticle/JPADynamicsBlock.cpp
@@ -1,14 +1,8 @@
-//
-// Generated By: dol2asm
-// Translation Unit: JPADynamicsBlock
-//
-
#include "JSystem/JParticle/JPADynamicsBlock.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) {
work->mVolumeCalcData.mVolumePos.setZero();
work->mVolumeCalcData.mVelOmni.set(work->mpEmtr->get_r_zh(), work->mpEmtr->get_r_zh(),
@@ -17,7 +11,6 @@ void JPAVolumePoint(JPAEmitterWorkData* work) {
work->mVolumeCalcData.mVelOmni.z);
}
-/* 8027B220-8027B33C 275B60 011C+00 1/1 0/0 0/0 .text JPAVolumeLine */
void JPAVolumeLine(JPAEmitterWorkData* work) {
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
work->mVolumeCalcData.mVolumePos.set(
@@ -34,7 +27,6 @@ void JPAVolumeLine(JPAEmitterWorkData* work) {
work->mVolumeCalcData.mVelAxis.set(0.0f, 0.0f, work->mVolumeCalcData.mVolumePos.z);
}
-/* 8027B33C-8027B4E8 275C7C 01AC+00 1/1 0/0 0/0 .text JPAVolumeCircle */
// NONMATCHING regalloc. Could be issue with mul asm implementations
void JPAVolumeCircle(JPAEmitterWorkData* work) {
s16 theta;
@@ -56,29 +48,25 @@ void JPAVolumeCircle(JPAEmitterWorkData* work) {
distance = work->mVolumeSize * (work->mVolumeMinRad + distance * (1.0f - work->mVolumeMinRad));
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.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
work->mVolumeCalcData.mVolumePos.z);
}
-/* 8027B4E8-8027B5F0 275E28 0108+00 1/1 0/0 0/0 .text JPAVolumeCube */
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 = work->mVolumeCalcData.mVolumePos;
- work->mVolumeCalcData.mVelOmni *= work->mGlobalScl;
+ work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z);
}
-/* 8027B5F0-8027B87C 275F30 028C+00 1/1 0/0 0/0 .text JPAVolumeSphere__FP18JPAEmitterWorkData */
static void JPAVolumeSphere(JPAEmitterWorkData* work) {
- s16 phi, theta;
+ s16 phi, r28;
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
- phi = (u16)(work->mVolumeX * 0x8000 / (work->mDivNumber - 1) + 0x4000);
- f32 tmp = (u16)(work->mVolumeAngleNum * 0x10000 / (work->mVolumeAngleMax - 1));
- theta = tmp * work->mVolumeSweep + 0x8000;
+ phi = u16(work->mVolumeX * 0x8000 / (work->mDivNumber - 1) + 0x4000);
+ u16 r26 = u16(work->mVolumeAngleNum * 0x10000 / (work->mVolumeAngleMax - 1));
+ r28 = f32(r26) * work->mVolumeSweep + 0x8000;
work->mVolumeAngleNum++;
if (work->mVolumeAngleNum == work->mVolumeAngleMax) {
work->mVolumeAngleNum = 0;
@@ -92,16 +80,16 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) {
}
} else {
phi = work->mpEmtr->get_r_ss() >> 1;
- theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
+ r28 = work->mVolumeSweep * work->mpEmtr->get_r_ss();
}
- f32 rnd = work->mpEmtr->get_r_f();
+ f32 f31 = work->mpEmtr->get_r_f();
if (work->mpEmtr->checkFlag(JPADynFlag_FixedDensity)) {
- rnd = 1.0f - rnd * rnd * rnd;
+ f31 = 1.0f - f31 * f31 * f31;
}
- f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
- 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));
+ f31 = work->mVolumeSize * (work->mVolumeMinRad + f31 * (1.0f - work->mVolumeMinRad));
+ work->mVolumeCalcData.mVolumePos.set(f31 * nw4r::math::CosIdx(phi) * nw4r::math::SinIdx(r28), -f31 * nw4r::math::SinIdx(phi),
+ f31 * nw4r::math::CosIdx(phi) * nw4r::math::CosIdx(r28));
work->mVolumeCalcData.mVelOmni.set(
work->mVolumeCalcData.mVolumePos.x * work->mGlobalScl.x,
work->mVolumeCalcData.mVolumePos.y * work->mGlobalScl.y, work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z
@@ -110,16 +98,15 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) {
work->mVolumeCalcData.mVolumePos.z);
}
-/* 8027B87C-8027B9F8 2761BC 017C+00 1/1 0/0 0/0 .text JPAVolumeCylinder__FP18JPAEmitterWorkData */
static void JPAVolumeCylinder(JPAEmitterWorkData* work) {
- s16 theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
- f32 rnd = work->mpEmtr->get_r_f();
+ s16 r30 = work->mVolumeSweep * work->mpEmtr->get_r_ss();
+ f32 f31 = work->mpEmtr->get_r_f();
if (work->mpEmtr->checkFlag(JPADynFlag_FixedDensity)) {
- rnd = 1.0f - rnd * rnd;
+ f31 = 1.0f - f31 * f31;
}
- f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
+ f31 = work->mVolumeSize * (work->mVolumeMinRad + f31 * (1.0f - work->mVolumeMinRad));
work->mVolumeCalcData.mVolumePos.set(
- rad * nw4r::math::SinIdx(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * nw4r::math::CosIdx(theta));
+ f31 * nw4r::math::SinIdx(r30), work->mVolumeSize * work->mpEmtr->get_r_zp(), f31 * nw4r::math::CosIdx(r30));
work->mVolumeCalcData.mVelOmni.set(
work->mVolumeCalcData.mVolumePos.x * work->mGlobalScl.x,
work->mVolumeCalcData.mVolumePos.y * work->mGlobalScl.y, work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z
@@ -128,7 +115,6 @@ static void JPAVolumeCylinder(JPAEmitterWorkData* work) {
work->mVolumeCalcData.mVolumePos.z);
}
-/* 8027B9F8-8027BB18 276338 0120+00 1/1 0/0 0/0 .text JPAVolumeTorus__FP18JPAEmitterWorkData */
static void JPAVolumeTorus(JPAEmitterWorkData* work) {
s16 theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
s16 phi = work->mpEmtr->get_r_ss();
@@ -145,7 +131,6 @@ static void JPAVolumeTorus(JPAEmitterWorkData* work) {
);
}
-/* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */
JPADynamicsBlock::JPADynamicsBlock(u8 const* data) {
mpData = (const JPADynamicsBlockData*)data;
init();
@@ -161,7 +146,6 @@ enum {
VOL_Line = 0x06,
};
-/* 8027BB4C-8027BBE8 27648C 009C+00 2/1 0/0 0/0 .text init__16JPADynamicsBlockFv */
void JPADynamicsBlock::init() {
switch (getVolumeType()) {
case VOL_Cube:
@@ -188,30 +172,18 @@ void JPADynamicsBlock::init() {
}
}
-/* 8027BBE8-8027BDEC 276528 0204+00 0/0 1/1 0/0 .text
- * create__16JPADynamicsBlockFP18JPAEmitterWorkData */
void JPADynamicsBlock::create(JPAEmitterWorkData* work) {
if (work->mpEmtr->checkStatus(JPAEmtrStts_RateStepEmit)) {
- s32 emitCount;
- s32 createCount;
+ s32 emitCount = 0;
- // Probably an inlined function.
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
- s32 count;
- if (getVolumeType() == VOL_Sphere) {
- count = 4 * getDivNumber() * getDivNumber() + 2;
- } else {
- count = getDivNumber();
- }
- emitCount = count;
+ emitCount = getVolumeType() == VOL_Sphere ? 4 * getDivNumber() * getDivNumber() + 2 : getDivNumber();
work->mVolumeEmitIdx = 0;
} else {
f32 newPtclCount =
work->mpEmtr->mRate * (getRateRndm() * work->mpEmtr->get_r_zp() + 1.0f);
- f32 newEmitCount = work->mpEmtr->mEmitCount + newPtclCount;
- work->mpEmtr->mEmitCount = newEmitCount;
- emitCount = (s32)newEmitCount;
+ emitCount = work->mpEmtr->mEmitCount += newPtclCount;
work->mpEmtr->mEmitCount -= emitCount;
if (work->mpEmtr->checkStatus(JPAEmtrStts_FirstEmit) && 0.0f < newPtclCount &&
@@ -224,10 +196,10 @@ void JPADynamicsBlock::create(JPAEmitterWorkData* work) {
emitCount = 0;
}
- // Probably an inlined function.
- createCount = emitCount;
+ JPABaseParticle* ptcl = NULL;
+ s32 createCount = emitCount;
while (createCount > 0) {
- JPABaseParticle* ptcl = work->mpEmtr->createParticle();
+ ptcl = work->mpEmtr->createParticle();
if (ptcl == NULL)
break;
createCount--;
@@ -235,7 +207,7 @@ void JPADynamicsBlock::create(JPAEmitterWorkData* work) {
}
if (++work->mpEmtr->mRateStepTimer >= (work->mpEmtr->mRateStep + 1)) {
- work->mpEmtr->mRateStepTimer -= (work->mpEmtr->mRateStep + 1);
+ work->mpEmtr->mRateStepTimer -= work->mpEmtr->mRateStep + 1;
work->mpEmtr->setStatus(JPAEmtrStts_RateStepEmit);
} else {
work->mpEmtr->clearStatus(JPAEmtrStts_RateStepEmit);