summaryrefslogtreecommitdiff
path: root/src/JSystem/JParticle/JPADynamicsBlock.cpp
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2024-10-10 07:29:58 -0700
committerGitHub <noreply@github.com>2024-10-10 08:29:58 -0600
commit12eb254d769d84743b5cc6cd5424057c57eaf0ad (patch)
tree4509be332b2ccfc6fe939f47740d68f7746eca3e /src/JSystem/JParticle/JPADynamicsBlock.cpp
parent2fd702c0ac170a789af879b8b92a82d4dcc9080c (diff)
switch to dtk setup (#2203)
* switch to dtk setup * some cleanup / fixes * cleanup d_a_alink literals * Restore doxygen, update CI & README.md (#1) * Fix build image ref (#2) --------- Co-authored-by: Luke Street <luke@street.dev>
Diffstat (limited to 'src/JSystem/JParticle/JPADynamicsBlock.cpp')
-rw-r--r--src/JSystem/JParticle/JPADynamicsBlock.cpp273
1 files changed, 273 insertions, 0 deletions
diff --git a/src/JSystem/JParticle/JPADynamicsBlock.cpp b/src/JSystem/JParticle/JPADynamicsBlock.cpp
new file mode 100644
index 0000000000..d7003def53
--- /dev/null
+++ b/src/JSystem/JParticle/JPADynamicsBlock.cpp
@@ -0,0 +1,273 @@
+//
+// Generated By: dol2asm
+// Translation Unit: JPADynamicsBlock
+//
+
+#include "JSystem/JParticle/JPADynamicsBlock.h"
+#include "JSystem/JParticle/JPAEmitter.h"
+#include "dol2asm.h"
+
+//
+// Types:
+//
+
+//
+// Forward References:
+//
+
+extern "C" static void JPAVolumePoint(JPAEmitterWorkData*);
+extern "C" static void JPAVolumeLine(JPAEmitterWorkData*);
+extern "C" static void JPAVolumeCircle(JPAEmitterWorkData*);
+extern "C" static void JPAVolumeCube(JPAEmitterWorkData*);
+extern "C" static void JPAVolumeSphere(JPAEmitterWorkData*);
+extern "C" static void JPAVolumeCylinder(JPAEmitterWorkData*);
+extern "C" static void JPAVolumeTorus(JPAEmitterWorkData*);
+extern "C" void __ct__16JPADynamicsBlockFPCUc();
+extern "C" void init__16JPADynamicsBlockFv();
+extern "C" void create__16JPADynamicsBlockFP18JPAEmitterWorkData();
+
+//
+// External References:
+//
+
+extern "C" void createParticle__14JPABaseEmitterFv();
+extern "C" u8 sincosTable___5JMath[65536];
+
+//
+// Declarations:
+//
+
+/* ############################################################################################## */
+/* 80455310-80455314 003910 0004+00 7/7 0/0 0/0 .sdata2 @2287 */
+SECTION_SDATA2 static u8 lit_2287[4] = {
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+};
+
+/* 80455314-80455318 003914 0004+00 7/7 0/0 0/0 .sdata2 @2288 */
+SECTION_SDATA2 static f32 lit_2288 = 1.0f;
+
+/* 80455318-80455320 003918 0004+04 3/3 0/0 0/0 .sdata2 @2289 */
+SECTION_SDATA2 static f32 lit_2289[1 + 1 /* padding */] = {
+ 0.5f,
+ /* padding */
+ 0.0f,
+};
+
+/* 8027B144-8027B220 275A84 00DC+00 1/1 0/0 0/0 .text JPAVolumePoint__FP18JPAEmitterWorkData */
+void JPAVolumePoint(JPAEmitterWorkData* work) {
+ work->mVolumePos.zero();
+ work->mVelOmni.set(work->mpEmtr->get_r_zh(), work->mpEmtr->get_r_zh(),
+ work->mpEmtr->get_r_zh());
+ work->mVelAxis.set(work->mVelOmni.x, 0.0f, work->mVelOmni.z);
+}
+
+
+
+/* ############################################################################################## */
+/* 80455320-80455328 003920 0008+00 6/6 0/0 0/0 .sdata2 @2321 */
+SECTION_SDATA2 static f64 lit_2321 = 4503601774854144.0 /* cast s32 to float */;
+
+/* 8027B220-8027B33C 275B60 011C+00 1/1 0/0 0/0 .text JPAVolumeLine */
+void JPAVolumeLine(JPAEmitterWorkData* work) {
+ if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
+ work->mVolumePos.set(0.0f, 0.0f,
+ work->mVolumeSize *
+ ((work->mVolumeEmitIdx / (work->mEmitCount - 1.0f) - 0.5f)));
+ work->mVolumeEmitIdx++;
+ } else {
+ work->mVolumePos.set(0.0f, 0.0f, work->mVolumeSize * work->mpEmtr->get_r_zh());
+ }
+
+ work->mVelOmni.set(0.0f, 0.0f, work->mVolumePos.z * work->mGlobalScl.z);
+ work->mVelAxis.set(0.0f, 0.0f, work->mVolumePos.z);
+}
+
+
+
+/* 8027B33C-8027B4E8 275C7C 01AC+00 1/1 0/0 0/0 .text JPAVolumeCircle */
+// regalloc. Could be issue with mul asm implementations
+#ifdef NONMATCHING
+void JPAVolumeCircle(JPAEmitterWorkData* work) {
+ s16 thetai;
+ f32 theta;
+ f32 distance;
+ f32 sizeXZ;
+ f32 temp;
+ if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
+ theta = (s16)((work->mVolumeEmitIdx << 16) / work->mEmitCount);
+ thetai = theta * work->mVolumeSweep;
+ work->mVolumeEmitIdx++;
+ } else {
+ theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
+ thetai = theta;
+ }
+
+ distance = work->mpEmtr->get_r_f();
+ if (work->mpEmtr->checkFlag(JPADynFlag_FixedDensity)) {
+ distance = 1.0f - (distance * distance);
+ }
+
+ sizeXZ = work->mVolumeSize * (work->mVolumeMinRad + distance * (1.0f - work->mVolumeMinRad));
+ work->mVolumePos.set(sizeXZ * JMASSin(thetai), 0.0f, sizeXZ * JMASCos(thetai));
+ work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
+ work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
+}
+
+#else
+
+static void JPAVolumeCircle(JPAEmitterWorkData* param_0) {
+ // NONMATCHING
+}
+
+#endif
+
+/* 8027B4E8-8027B5F0 275E28 0108+00 1/1 0/0 0/0 .text JPAVolumeCube */
+void JPAVolumeCube(JPAEmitterWorkData* work) {
+ work->mVolumePos.set(work->mpEmtr->get_r_zh() * work->mVolumeSize,
+ work->mpEmtr->get_r_zh() * work->mVolumeSize,
+ work->mpEmtr->get_r_zh() * work->mVolumeSize);
+ work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
+ work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
+}
+
+
+
+/* ############################################################################################## */
+/* 80455328-80455330 003928 0004+04 1/1 0/0 0/0 .sdata2 @2501 */
+SECTION_SDATA2 static f32 lit_2501[1 + 1 /* padding */] = {
+ 32768.0f,
+ /* padding */
+ 0.0f,
+};
+
+/* 80455330-80455338 003930 0008+00 1/1 0/0 0/0 .sdata2 @2503 */
+SECTION_SDATA2 static f64 lit_2503 = 4503599627370496.0 /* cast u32 to float */;
+
+/* 8027B5F0-8027B87C 275F30 028C+00 1/1 0/0 0/0 .text JPAVolumeSphere__FP18JPAEmitterWorkData */
+static void JPAVolumeSphere(JPAEmitterWorkData* param_0) {
+ // NONMATCHING
+}
+
+/* 8027B87C-8027B9F8 2761BC 017C+00 1/1 0/0 0/0 .text JPAVolumeCylinder__FP18JPAEmitterWorkData */
+static void JPAVolumeCylinder(JPAEmitterWorkData* param_0) {
+ // NONMATCHING
+}
+
+/* 8027B9F8-8027BB18 276338 0120+00 1/1 0/0 0/0 .text JPAVolumeTorus__FP18JPAEmitterWorkData */
+static void JPAVolumeTorus(JPAEmitterWorkData* param_0) {
+ // NONMATCHING
+}
+
+/* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */
+JPADynamicsBlock::JPADynamicsBlock(u8 const* data) {
+ mpData = (const JPADynamicsBlockData*)data;
+ init();
+}
+
+enum {
+ VOL_Cube = 0x00,
+ VOL_Sphere = 0x01,
+ VOL_Cylinder = 0x02,
+ VOL_Torus = 0x03,
+ VOL_Point = 0x04,
+ VOL_Circle = 0x05,
+ 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:
+ mpCalcVolumeFunc = &JPAVolumeCube;
+ break;
+ case VOL_Sphere:
+ mpCalcVolumeFunc = &JPAVolumeSphere;
+ break;
+ case VOL_Cylinder:
+ mpCalcVolumeFunc = &JPAVolumeCylinder;
+ break;
+ case VOL_Torus:
+ mpCalcVolumeFunc = &JPAVolumeTorus;
+ break;
+ case VOL_Point:
+ mpCalcVolumeFunc = &JPAVolumePoint;
+ break;
+ case VOL_Circle:
+ mpCalcVolumeFunc = &JPAVolumeCircle;
+ break;
+ case VOL_Line:
+ mpCalcVolumeFunc = &JPAVolumeLine;
+ break;
+ }
+}
+
+/* 8027BBE8-8027BDEC 276528 0204+00 0/0 1/1 0/0 .text
+ * create__16JPADynamicsBlockFP18JPAEmitterWorkData */
+
+#ifdef NONMATCHING
+
+// literal only
+void JPADynamicsBlock::create(JPAEmitterWorkData* work) {
+ if (work->mpEmtr->checkStatus(JPAEmtrStts_RateStepEmit)) {
+ s32 emitCount;
+ s32 createCount;
+
+ // 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;
+
+ 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;
+ work->mpEmtr->mEmitCount -= emitCount;
+
+ if (work->mpEmtr->checkStatus(JPAEmtrStts_FirstEmit) && 0.0f < newPtclCount &&
+ newPtclCount < 1.0f)
+ emitCount = 1;
+ }
+
+ work->mEmitCount = emitCount;
+ if (work->mpEmtr->checkStatus(JPAEmtrStts_StopEmit)) {
+ emitCount = 0;
+ }
+
+ // Probably an inlined function.
+ createCount = emitCount;
+ while (createCount > 0) {
+ JPABaseParticle* ptcl = work->mpEmtr->createParticle();
+ if (ptcl == NULL)
+ break;
+ createCount--;
+ }
+ }
+
+ if (++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);
+ }
+
+ work->mpEmtr->clearStatus(JPAEmtrStts_FirstEmit);
+}
+
+#else
+
+void JPADynamicsBlock::create(JPAEmitterWorkData* param_0) {
+ // NONMATCHING
+}
+
+#endif \ No newline at end of file