diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 783879469..f2ac8c876 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -124,10 +124,10 @@ public: /* 0x130 */ f32 mVolumeSize; /* 0x134 */ s32 mVolumeEmitCount; /* 0x138 */ s32 mVolumeEmitIdx; - /* 0x13C */ u32 mVolumeEmitAngleCount; - /* 0x140 */ u32 mVolumeEmitXCount; - /* 0x144 */ u32 mVolumeEmitAngleMax; - /* 0x148 */ u32 mDivNumber; + /* 0x13C */ s32 mVolumeEmitAngleCount; + /* 0x140 */ s32 mVolumeEmitXCount; + /* 0x144 */ s32 mVolumeEmitAngleMax; + /* 0x148 */ s32 mDivNumber; }; struct JPAFrameManager { diff --git a/src/JSystem/JParticle/JPAEmitter.cpp b/src/JSystem/JParticle/JPAEmitter.cpp index 7fd804378..c65e076f6 100644 --- a/src/JSystem/JParticle/JPAEmitter.cpp +++ b/src/JSystem/JParticle/JPAEmitter.cpp @@ -65,6 +65,38 @@ void JPABaseEmitter::calcVolumeCube() { /* 8025C63C-8025C8A4 .text calcVolumeSphere__14JPABaseEmitterFv */ void JPABaseEmitter::calcVolumeSphere() { /* Nonmatching */ + s16 x; + s16 angle; + if (checkEmDataFlag(0x02)) { + x = (u16)(((s32)emtrInfo.mVolumeEmitXCount * 0x8000) / ((s32)(emtrInfo.mDivNumber - 1)) + 0x4000); + angle = mVolumeSweep * (f32)(u16)((emtrInfo.mVolumeEmitAngleCount * 0x10000) / emtrInfo.mVolumeEmitAngleMax) + 32768.0f; + if (++emtrInfo.mVolumeEmitAngleCount == emtrInfo.mVolumeEmitAngleMax) { + emtrInfo.mVolumeEmitAngleCount = 0; + ++emtrInfo.mVolumeEmitXCount; + if (emtrInfo.mVolumeEmitXCount * 2 < emtrInfo.mDivNumber) { + emtrInfo.mVolumeEmitAngleMax = (emtrInfo.mVolumeEmitAngleMax != 1) ? emtrInfo.mVolumeEmitAngleMax + 4 : emtrInfo.mVolumeEmitAngleMax + 3; + } else { + emtrInfo.mVolumeEmitAngleMax = (emtrInfo.mVolumeEmitAngleMax != 4) ? emtrInfo.mVolumeEmitAngleMax - 4 : 1; + } + } + } else { + x = getRandomSS() >> 1; + angle = mVolumeSweep * getRandomSS(); + } + + f32 rad = getRandomF(); + if (checkEmDataFlag(0x01)) { + rad = 1.0f - rad * rad * rad; + } + rad = emtrInfo.mVolumeSize * (mVolumeMinRad + rad * (1.0f - mVolumeMinRad)); + + emtrInfo.mVolumePos.set( + rad * JMASCos(x) * JMASSin(angle), + -rad * JMASSin(x), + rad * JMASCos(x) * JMASCos(angle) + ); + emtrInfo.mVelOmni.mul(emtrInfo.mVolumePos, emtrInfo.mEmitterGlobalScale); + emtrInfo.mVelAxis.set(emtrInfo.mVolumePos.x, 0.0f, emtrInfo.mVolumePos.z); } /* 8025C8A4-8025CA28 .text calcVolumeCylinder__14JPABaseEmitterFv */