summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhatal175 <hatal175@users.noreply.github.com>2024-08-17 08:19:53 +0300
committerGitHub <noreply@github.com>2024-08-16 22:19:53 -0700
commit18f4489dd6e7996152bc385ec89a340dccaafe8a (patch)
tree5800d04bb9c99f47ecdf03cf0521df9a3e3772bc
parentedd2d30a337a69c6a0228a172108ce17d3253697 (diff)
d_particle almost finished (#2193)
* d_particle almost finished * Remove dolasm.h include from JKRDvdRipper
-rw-r--r--include/JSystem/JGeometry.h13
-rw-r--r--include/JSystem/JParticle/JPAParticle.h1
-rw-r--r--include/d/kankyo/d_kankyo.h1
-rw-r--r--include/d/particle/d_particle.h7
-rw-r--r--include/dolphin/gx.h7
-rw-r--r--libs/JSystem/JKernel/JKRDvdRipper.cpp32
-rw-r--r--src/d/particle/d_particle.cpp563
7 files changed, 582 insertions, 42 deletions
diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h
index bbc4eae903..079fcf8d1b 100644
--- a/include/JSystem/JGeometry.h
+++ b/include/JSystem/JGeometry.h
@@ -305,6 +305,19 @@ struct TVec3<f32> : public Vec {
};
return res;
}
+
+ void cubic(const TVec3<f32>& param_1, const TVec3<f32>& param_2, const TVec3<f32>& param_3,
+ const TVec3<f32>& param_4, f32 param_5) {
+ f32 fVar5 = param_5 * param_5;
+ f32 fVar6 = fVar5 * param_5;
+ f32 fVar8 = 1.0f + (2.0f * fVar6 - 3.0f * fVar5);
+ f32 fVar9 = -2.0f * fVar6 + 3.0f * fVar5;
+ f32 fVar7 = param_5 + (fVar6 - 2.0f * fVar5);
+ f32 fVar4 = fVar6 - fVar5;
+ x = fVar8 * param_1.x + fVar9 * param_4.x + fVar7 * param_2.x + fVar4 * param_3.x;
+ y = fVar8 * param_1.y + fVar9 * param_4.y + fVar7 * param_2.y + fVar4 * param_3.y;
+ z = fVar8 * param_1.z + fVar9 * param_4.z + fVar7 * param_2.z + fVar4 * param_3.z;
+ }
};
template <typename T>
diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h
index ebedcc6549..5d057476d9 100644
--- a/include/JSystem/JParticle/JPAParticle.h
+++ b/include/JSystem/JParticle/JPAParticle.h
@@ -43,6 +43,7 @@ public:
void setDeleteParticleFlag() { setStatus(2); }
void getVelVec(JGeometry::TVec3<f32>& vec) const { vec.set(mVelocity); }
void getLocalPosition(JGeometry::TVec3<f32>& vec) const { vec.set(mLocalPosition); }
+ void getBaseAxis(JGeometry::TVec3<f32>& vec) const { vec.set(mBaseAxis); }
public:
/* 0x00 */ JGeometry::TVec3<f32> mPosition;
diff --git a/include/d/kankyo/d_kankyo.h b/include/d/kankyo/d_kankyo.h
index f8a2077508..13f6503598 100644
--- a/include/d/kankyo/d_kankyo.h
+++ b/include/d/kankyo/d_kankyo.h
@@ -599,6 +599,7 @@ void dKy_ParticleColor_get_bg(cXyz* param_0, dKy_tevstr_c* param_1, _GXColor* pa
f32 param_6);
_GXColor dKy_light_influence_col(_GXColor* param_0, f32 param_1);
static void dKy_WaterIn_Light_set();
+void dKy_SordFlush_set(cXyz param_0, int param_1);
#endif /* D_KANKYO_D_KANKYO_H */
diff --git a/include/d/particle/d_particle.h b/include/d/particle/d_particle.h
index 8f0152cc8f..75ae38a9ef 100644
--- a/include/d/particle/d_particle.h
+++ b/include/d/particle/d_particle.h
@@ -46,6 +46,7 @@ class cBgS_PolyInfo;
class JPAEmitterManager;
class JPADrawInfo;
class J3DAnmBase;
+class dPa_simpleData_c;
class dPa_simpleEcallBack : public JPAEmitterCallBack {
public:
@@ -67,7 +68,7 @@ public:
/* 0x0A */ u8 field_0xa;
/* 0x0C */ s16 field_0xc;
/* 0x0C */ u16 field_0xe;
- /* 0x10 */ void* mData;
+ /* 0x10 */ dPa_simpleData_c* mData;
}; // Size: 0x14
class dPa_followEcallBack : public dPa_levelEcallBack {
@@ -256,7 +257,9 @@ public:
/* 8004B024 */ ~dPa_simpleData_c();
/* 8004B060 */ dPa_simpleData_c();
- u8 field_0x0[20];
+ cXyz field_0x00;
+ GXColor field_0x0c;
+ GXColor field_0x10;
};
class dPa_control_c {
diff --git a/include/dolphin/gx.h b/include/dolphin/gx.h
index 875ce03fef..12d80c77cb 100644
--- a/include/dolphin/gx.h
+++ b/include/dolphin/gx.h
@@ -120,6 +120,13 @@ static inline void GXColor1u32(const u32 c) {
GXWGFifo.u32 = c;
}
+static inline void GXColor4u8(const u8 r, const u8 g, const u8 b, const u8 a) {
+ GXWGFifo.u8 = r;
+ GXWGFifo.u8 = g;
+ GXWGFifo.u8 = b;
+ GXWGFifo.u8 = a;
+}
+
static inline void GXTexCoord2f32(const f32 s, const f32 t) {
GXWGFifo.f32 = s;
GXWGFifo.f32 = t;
diff --git a/libs/JSystem/JKernel/JKRDvdRipper.cpp b/libs/JSystem/JKernel/JKRDvdRipper.cpp
index a0e0e97d87..e7b95f3596 100644
--- a/libs/JSystem/JKernel/JKRDvdRipper.cpp
+++ b/libs/JSystem/JKernel/JKRDvdRipper.cpp
@@ -1,6 +1,5 @@
//
-// Generated By: dol2asm
-// Translation Unit: JKRDvdRipper
+// JKRDvdRipper
//
#include "JSystem/JKernel/JKRDvdRipper.h"
@@ -8,28 +7,15 @@
#include "JSystem/JKernel/JKRDecomp.h"
#include "JSystem/JUtility/JUTException.h"
#include "string.h"
-#include "dol2asm.h"
#include "dolphin/os/OSCache.h"
#include "dolphin/os/OSInterrupt.h"
#include "dolphin/vi.h"
-//
-// Forward References:
-//
-
static int JKRDecompressFromDVD(JKRDvdFile*, void*, u32, u32, u32, u32, u32*);
static int decompSZS_subroutine(u8*, u8*);
static u8* firstSrcData();
static u8* nextSrcData(u8*);
-//
-// External References:
-//
-
-//
-// Declarations:
-//
-
/* 802D9B98-802D9C54 2D44D8 00BC+00 0/0 1/1 0/0 .text
* loadToMainRAM__12JKRDvdRipperFPCcPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl
*/
@@ -60,20 +46,8 @@ void* JKRDvdRipper::loadToMainRAM(s32 entryNumber, u8* dst, JKRExpandSwitch expa
pCompression, param_8);
}
-/* ############################################################################################## */
-/* 8039D290-8039D290 0298F0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
-#pragma push
-#pragma force_active on
-SECTION_DEAD static char const* const stringBase_8039D290 = __FILE__;
-SECTION_DEAD static char const* const stringBase_8039D2A1 = "%s";
-SECTION_DEAD static char const* const stringBase_8039D2A4 = "Sorry, not applied for SZP archive.";
-SECTION_DEAD static char const* const stringBase_8039D2C8 = "Not support SZP with offset read";
-/* @stringBase0 padding */
-SECTION_DEAD static char const* const pad_8039D2E9 = "\0\0\0\0\0\0";
-#pragma pop
-
/* 804508C8-804508CC 000348 0004+00 3/2 0/0 0/0 .sdata None */
-SECTION_SDATA static u8 errorRetry = 0x01;
+static u8 errorRetry = 0x01;
/* 802D9D10-802DA1E4 2D4650 04D4+00 2/2 0/0 0/0 .text
* loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl
@@ -276,7 +250,7 @@ JSUList<JKRDMCommand> JKRDvdRipper::sDvdAsyncList;
static OSMutex decompMutex;
/* 804508CC-804508D0 00034C 0004+00 1/1 1/1 0/0 .sdata sSZSBufferSize__12JKRDvdRipper */
-SECTION_SDATA u32 JKRDvdRipper::sSZSBufferSize = 0x00000400;
+u32 JKRDvdRipper::sSZSBufferSize = 0x00000400;
/* 80451428-8045142C 000928 0004+00 3/3 0/0 0/0 .sbss szpBuf */
static u8* szpBuf;
diff --git a/src/d/particle/d_particle.cpp b/src/d/particle/d_particle.cpp
index c957e84bc2..edbd0573d3 100644
--- a/src/d/particle/d_particle.cpp
+++ b/src/d/particle/d_particle.cpp
@@ -4,12 +4,14 @@
//
#include "d/particle/d_particle.h"
+#include "d/d_jnt_col.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/J3DGraphAnimator/J3DMaterialAnm.h"
#include "JSystem/JParticle/JPAEmitterManager.h"
#include "JSystem/JParticle/JPAResourceManager.h"
+#include "JSystem/JMath/JMATrigonometric.h"
#include "stdio.h"
#include "d/com/d_com_inf_game.h"
#include "dol2asm.h"
@@ -1411,25 +1413,25 @@ void dPa_simpleEcallBack::executeAfter(JPABaseEmitter* param_0) {
if (currentCreateNumber <= 0) {
field_0xc = 0;
} else {
- u8* pfVar3 = (u8*)mData;
+ dPa_simpleData_c* pData = mData;
param_0->playCreateParticle();
for (; field_0xc != 0; field_0xc--) {
Vec local_3c;
- if ((int)mDoLib_clipper::clip(j3dSys.getViewMtx(), *(Vec*)pfVar3, 200.0f) == 0) {
+ if ((int)mDoLib_clipper::clip(j3dSys.getViewMtx(), *(Vec*)pData, 200.0f) == 0) {
JGeometry::TVec3<f32> aTStack_30;
param_0->getLocalTranslation(aTStack_30);
- param_0->setGlobalTranslation(((f32*)pfVar3)[0], ((f32*)pfVar3)[1] + aTStack_30.y, ((f32*)pfVar3)[2]);
- param_0->setGlobalPrmColor(pfVar3[0xc], pfVar3[0xd], pfVar3[0xe]);
- param_0->setGlobalAlpha(pfVar3[0xf]);
- param_0->setGlobalEnvColor(pfVar3[0x10], pfVar3[0x11], pfVar3[0x12]);
+ param_0->setGlobalTranslation(pData->field_0x00.x, pData->field_0x00.y + aTStack_30.y, pData->field_0x00.z);
+ param_0->setGlobalPrmColor(pData->field_0x0c.r, pData->field_0x0c.g, pData->field_0x0c.b);
+ param_0->setGlobalAlpha(pData->field_0x0c.a);
+ param_0->setGlobalEnvColor(pData->field_0x10.r, pData->field_0x10.g, pData->field_0x10.b);
for (int i = 0; i < currentCreateNumber; i++) {
JPABaseParticle* particle = (JPABaseParticle*)param_0->createParticle();
if (particle == NULL)
break;
- particle->setOffsetPosition(((f32*)pfVar3)[0], ((f32*)pfVar3)[1] + aTStack_30.y, ((f32*)pfVar3)[2]);
+ particle->setOffsetPosition(pData->field_0x00.x, pData->field_0x00.y + aTStack_30.y, pData->field_0x00.z);
}
}
- pfVar3 += 0x14;
+ pData++;
}
}
param_0->stopCreateParticle();
@@ -1531,16 +1533,110 @@ SECTION_SDATA2 static f32 lit_4519 = 1.0f;
/* 8004B168-8004B4E0 045AA8 0378+00 1/1 0/0 0/0 .text
* set__19dPa_simpleEcallBackFPC4cXyzPC12dKy_tevstr_cUcRC8_GXColorRC8_GXColorif */
+// Matches with literals
+#ifdef NONMATCHING
+u32 dPa_simpleEcallBack::set(cXyz const* param_1, dKy_tevstr_c const* param_2, u8 param_3,
+ _GXColor const& param_4, _GXColor const& param_5, int param_6,
+ f32 param_7) {
+ f32 dVar7 = param_7;
+ if (param_2 != NULL && param_2->mInitType != 124) {
+ OS_REPORT("\x1b[43;30mSimple Particle tevstr nonset !!\n");
+ return 0;
+ }
+
+ dPa_simpleData_c* pData = mData;
+ if (pData == NULL || field_0xc >= field_0xe) {
+ if (pData != NULL) {
+ OS_REPORT("\x1b[43;30mSimple Particle Set Over !!\n");
+ } else {
+ OS_REPORT("\x1b[43;30mSimple Particle Nothing !!\n");
+ }
+ return 0;
+ }
+ pData = mData + field_0xc;
+ pData->field_0x00 = *param_1;
+ u32 uVar5 = dPa_control_c::getEmitterManager()->getResourceManager(dPa_control_c::getRM_ID(mID))->getResUserWork(mID);
+ u32 uVar6 = (uVar5 & 0xef0000) >> 0x10;
+ if (uVar6 < 100) {
+ dVar7 = uVar6 / 99.0f;
+ }
+ if (uVar6 < 100) {
+ dVar7 = uVar6 / 99.0f;
+ }
+ if ((uVar5 & 0x20) != 0) {
+ GXColor local_5c;
+ GXColor local_60;
+ GXColor local_64 = {0xff, 0xff, 0xff, 0xff};
+ GXColor local_68 = {0xff, 0xff, 0xff, 0xff};
+ if (&param_5 != NULL) {
+ local_64 = param_5;;
+ }
+ if (&param_4 != NULL) {
+ local_68 = param_4;
+ }
+ dKy_ParticleColor_get_actor((cXyz*)param_1, (dKy_tevstr_c*)param_2, &local_5c, &local_60,
+ &local_64, &local_68, dVar7);
+ pData->field_0x0c.r = local_60.r;
+ pData->field_0x0c.g = local_60.g;
+ pData->field_0x0c.b = local_60.b;
+ pData->field_0x10.r = local_5c.r;
+ pData->field_0x10.g = local_5c.g;
+ pData->field_0x10.b = local_5c.b;
+ } else {
+ if ((uVar5 & 0x40) != 0) {
+ GXColor local_6c;
+ GXColor local_70;
+ GXColor local_74 = {0xff, 0xff, 0xff, 0xff};
+ GXColor local_78 = {0xff, 0xff, 0xff, 0xff};
+ if (&param_5 != NULL) {
+ local_74 = param_5;
+ }
+ if (&param_4 != NULL) {
+ local_78 = param_4;
+ }
+ dKy_ParticleColor_get_bg((cXyz*)param_1, (dKy_tevstr_c*)param_2, &local_6c, &local_70, &local_74, &local_78,
+ dVar7);
+ dVar7 = g_env_light.mPaletteTerrainLightEffect +
+ (1.0f - g_env_light.mPaletteTerrainLightEffect) * dVar7;
+ OS_REPORT("\nwork__ratio=[%f]", dVar7);
+ local_6c = dKy_light_influence_col(&local_6c, dVar7);
+ local_70 = dKy_light_influence_col(&local_70, dVar7);
+ pData->field_0x0c.r = local_70.r;
+ pData->field_0x0c.g = local_70.g;
+ pData->field_0x0c.b = local_70.b;
+ pData->field_0x10.r = local_6c.r;
+ pData->field_0x10.g = local_6c.g;
+ pData->field_0x10.b = local_6c.b;
+ } else {
+ if (&param_4 != NULL) {
+ pData->field_0x0c.r = param_4.r;
+ pData->field_0x0c.g = param_4.g;
+ pData->field_0x0c.b = param_4.b;
+ }
+ if (&param_5 != NULL) {
+ pData->field_0x10.r = param_5.r;
+ pData->field_0x10.g = param_5.g;
+ pData->field_0x10.b = param_5.b;
+ }
+ }
+ }
+ pData->field_0x0c.a = param_3;
+ pData->field_0x10.a = param_6;
+ field_0xc++;
+ return 1;
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
-asm u32 dPa_simpleEcallBack::set(cXyz const* param_0, dKy_tevstr_c const* param_1, u8 param_2,
- _GXColor const& param_3, _GXColor const& param_4, int param_5,
- f32 param_6) {
+asm u32 dPa_simpleEcallBack::set(cXyz const* param_1, dKy_tevstr_c const* param_2, u8 param_3,
+ _GXColor const& param_4, _GXColor const& param_5, int param_6,
+ f32 param_7) {
nofralloc
#include "asm/d/particle/d_particle/set__19dPa_simpleEcallBackFPC4cXyzPC12dKy_tevstr_cUcRC8_GXColorRC8_GXColorif.s"
}
#pragma pop
+#endif
/* 8004B4E0-8004B504 045E20 0024+00 1/0 0/0 0/0 .text
* execute__17dPa_windPcallBackFP14JPABaseEmitterP15JPABaseParticle */
@@ -2102,6 +2198,68 @@ SECTION_SDATA2 static f32 lit_5066 = 0.5f;
/* 8004C218-8004C838 046B58 0620+00 0/0 7/7 54/54 .text
* setHitMark__13dPa_control_cFUsP10fopAc_ac_cPC4cXyzPC5csXyzPC4cXyzUl */
+// Matches with literals
+#ifdef NONMATCHING
+void dPa_control_c::setHitMark(u16 param_1, fopAc_ac_c* param_2, cXyz const* param_3,
+ csXyz const* param_4, cXyz const* param_5, u32 param_6) {
+ cXyz cStack_34;
+ csXyz cStack_78;
+ cXyz const* pPos = param_3;
+ csXyz const* pAngle = param_4;
+ if (param_2 != NULL) {
+ if (fopAcM_checkStatus(param_2, 0x40000000)) {
+ return;
+ }
+ fopAcM_OnStatus(param_2, 0x40000000);
+ if (fopAcM_GetJntCol(param_2) != NULL) {
+ dJntCol_c* jntCol = fopAcM_GetJntCol(param_2);
+ if (jntCol->getHitmarkPosAndAngle(pPos, pAngle, &cStack_34, &cStack_78,
+ param_1 == 6) >= 0)
+ {
+ pPos = &cStack_34;
+ pAngle = &cStack_78;
+ }
+ }
+ }
+ if (param_1 == 3) {
+ dComIfGp_particle_set(0x114, pPos, pAngle, param_5);
+ dComIfGp_particle_set(0x115, pPos, 0, param_5);
+ dComIfGp_particle_set(0x116, pPos, 0, param_5);
+ if ((param_6 & 2) != 0 && param_2 != NULL && fopAcM_GetGroup(param_2) == 2) {
+ dComIfGp_particle_set(0x2ed, pPos, 0, param_5);
+ }
+ dComIfGp_particle_set(0x2ee, pPos, 0, param_5);
+ dKy_SordFlush_set(*pPos, 1);
+ } else if (param_1 == 2 || param_1 == 5 || param_1 == 9 || param_1 == 8 || param_1 == 6) {
+ dComIfGp_particle_set(0x117, pPos, pAngle, param_5);
+ dComIfGp_particle_set(0x118, pPos, 0, param_5);
+ if (param_1 != 9) {
+ dKy_SordFlush_set(*pPos, 0);
+ }
+ } else if (param_1 == 7) {
+ cXyz cStack_40;
+ if (param_5 != NULL) {
+ cStack_40 = *param_5 * 0.5f;
+ } else {
+ cStack_40.set(0.5f, 0.5f, 0.5f);
+ }
+ dComIfGp_particle_set(0x119, pPos, pAngle, &cStack_40);
+ dComIfGp_particle_set(0x11a, pPos, 0, &cStack_40);
+ dComIfGp_particle_set(0x2ef, pPos, 0, &cStack_40);
+ if ((param_6 & 2) != 0 && param_2 != NULL && fopAcM_GetGroup(param_2) == 2) {
+ dComIfGp_particle_set(0x2f0, pPos, 0, &cStack_40);
+ }
+ } else if (param_1 == 1 || param_1 == 4) {
+ dComIfGp_particle_set(0x119, pPos, pAngle, param_5);
+ dComIfGp_particle_set(0x11a, pPos, 0, param_5);
+ dComIfGp_particle_set(0x2ef, pPos, 0, param_5);
+ if ((param_6 & 2) != 0 && param_2 != NULL && fopAcM_GetGroup(param_2) == 2) {
+ dComIfGp_particle_set(0x2f0, pPos, 0, param_5);
+ }
+ dKy_SordFlush_set(*pPos, 1);
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -2111,6 +2269,7 @@ asm void dPa_control_c::setHitMark(u16 param_0, fopAc_ac_c* param_1, cXyz const*
#include "asm/d/particle/d_particle/setHitMark__13dPa_control_cFUsP10fopAc_ac_cPC4cXyzPC5csXyzPC4cXyzUl.s"
}
#pragma pop
+#endif
/* ############################################################################################## */
/* 80451F90-80451F94 000590 0004+00 1/1 0/0 0/0 .sdata2 particleID$5076 */
@@ -2769,6 +2928,130 @@ SECTION_SDATA2 static f32 lit_6079 = -1.0f;
/* 8004DD1C-8004E6A8 04865C 098C+00 1/0 0/0 0/0 .text
* draw__19dPa_light8PcallBackFP14JPABaseEmitterP15JPABaseParticle */
+// Matches with literals
+#ifdef NONMATCHING
+void dPa_light8PcallBack::draw(JPABaseEmitter* param_1, JPABaseParticle* param_2) {
+ Mtx local_60;
+ Mtx auStack_90;
+ Mtx auStack_c0;
+ Mtx auStack_f0;
+ JGeometry::TVec3<f32> local_100;
+ JGeometry::TVec3<f32> local_10c;
+ JGeometry::TVec3<f32> local_118;
+ JGeometry::TVec3<f32> local_124;
+ JGeometry::TVec3<f32> local_130;
+ u8 globalAlpha = param_1->getGlobalAlpha() & 0xff;
+ JGeometry::TVec3<f32> local_13c;
+ JGeometry::TVec3<f32> local_148;
+ JGeometry::TVec3<f32> local_154;
+ JGeometry::TVec3<f32> local_160;
+ JGeometry::TVec3<f32> local_16c;
+ dPa_setWindPower(param_2);
+ MTXIdentity(local_60);
+ MTXIdentity(auStack_90);
+ param_2->getBaseAxis(local_10c);
+ param_2->getLocalPosition(local_118);
+ if (local_118.isZero()) {
+ local_118.set(0.0f, 1.0f, 0.0f);
+ } else {
+ local_118.normalize();
+ }
+ local_124.cross(local_10c, local_118);
+ if (local_124.isZero()) {
+ local_124.set(0.0f, 0.0f, 1.0f);
+ } else {
+ local_124.normalize();
+ }
+ local_10c.cross(local_118, local_124);
+ local_10c.normalize();
+ local_60[0][0] = local_10c.x;
+ local_60[0][1] = local_118.x;
+ local_60[0][2] = local_124.x;
+ local_60[1][0] = local_10c.y;
+ local_60[1][1] = local_118.y;
+ local_60[1][2] = local_124.y;
+ local_60[2][0] = local_10c.z;
+ local_60[2][1] = local_118.z;
+ local_60[2][2] = local_124.z;
+ f32 fVar3 = (-90.0f / 16384.0f) * param_2->getRotateAngle();
+ if (fVar3) {
+ Vec local_178 = {1.0f, 1.0f, 1.0f};
+ MTXRotAxisRad(auStack_90, &local_178, (M_PI / 180.0f) * fVar3);
+ MTXConcat(local_60, auStack_90, local_60);
+ }
+ param_2->getGlobalPosition(local_100);
+ local_60[0][3] = local_100.x;
+ local_60[1][3] = local_100.y;
+ local_60[2][3] = local_100.z;
+ param_1->getGlobalParticleScale(local_130);
+ local_130.x *= param_2->getParticleScaleX();
+ local_130.y *= param_2->getParticleScaleY();
+ local_130.x *= param_2->getWidth(param_1);
+ local_130.y *= param_2->getHeight(param_1);
+ local_130.x *= 10.0f;
+ local_130.y *= 10.0f;
+ local_130.z = 0.0f;
+ MTXScale(auStack_f0, local_130.x, local_130.y, local_130.z);
+ MTXConcat(local_60, auStack_f0, local_60);
+ MTXConcat(j3dSys.getViewMtx(), local_60, auStack_c0);
+ GXLoadPosMtxImm(auStack_c0, 0);
+ JGeometry::TVec3<f32> local_184;
+ JGeometry::TVec3<f32> local_190;
+ JGeometry::TVec3<f32> local_19c;
+ JGeometry::TVec3<f32> local_1a8;
+ local_184.set(1.0f, 2.0f, 0.0f);
+ local_190.set(1.0f, 0.0f, 0.0f);
+ local_19c.set(-1.0f, 0.0f, 0.0f);
+ local_1a8.set(-1.0f, 2.0f, 0.0f);
+ local_13c.x = 0.0f;
+ local_13c.y = 1.0f;
+ local_13c.z = 0.0f;
+ local_148.x = 0.0f;
+ local_148.y = 1.0f;
+ local_148.z = 0.0f;
+ local_154.x = 0.0f;
+ local_154.y = 1.0f;
+ local_154.z = 0.0f;
+ local_160.x = 0.0f;
+ local_160.y = 1.0f;
+ local_160.z = 0.0f;
+ local_16c.x = 0.0f;
+ local_16c.y = 1.0f;
+ local_16c.z = 0.0f;
+ local_13c.normalize();
+ local_148.normalize();
+ local_154.normalize();
+ local_160.normalize();
+ local_16c.normalize();
+ GXBegin(GX_TRIANGLEFAN, GX_VTXFMT0, 6);
+ GXPosition3f32(0.0f, 1.0f, 0.0f);
+ GXNormal3f32(local_13c.x, local_13c.y, local_13c.z);
+ GXColor4u8(0xff, 0xff, 0xff, globalAlpha);
+ GXTexCoord2f32(0.5f, 0.5f);
+ GXPosition3f32(local_184.x, local_184.y, local_184.z);
+ GXNormal3f32(local_148.x, local_148.y, local_148.z);
+ GXColor4u8(0xff, 0xff, 0xff, globalAlpha);
+ GXTexCoord2f32(1.0f, 0.0f);
+ GXPosition3f32(local_190.x, local_190.y, local_190.z);
+ GXNormal3f32(local_154.x, local_154.y, local_154.z);
+ GXColor4u8(0xff, 0xff, 0xff, globalAlpha);
+ GXTexCoord2f32(1.0f, 1.0f);
+ GXPosition3f32(local_19c.x, local_19c.y, local_19c.z);
+ GXNormal3f32(local_160.x, local_160.y, local_160.z);
+ GXColor4u8(0xff, 0xff, 0xff, globalAlpha);
+ GXTexCoord2f32(0.0f, 1.0f);
+ GXPosition3f32(local_1a8.x, local_1a8.y, local_1a8.z);
+ GXNormal3f32(local_16c.x, local_16c.y, local_16c.z);
+ GXColor4u8(0xff, 0xff, 0xff, globalAlpha);
+ GXTexCoord2f32(0.0f, 0.0f);
+ GXPosition3f32(local_184.x, local_184.y, local_184.z);
+ GXNormal3f32(local_148.x, local_148.y, local_148.z);
+ GXColor4u8(0xff, 0xff, 0xff, globalAlpha);
+ GXTexCoord2f32(1.0f, 0.0f);
+ GXEnd();
+ param_2->setInvisibleParticleFlag();
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -2777,6 +3060,7 @@ asm void dPa_light8PcallBack::draw(JPABaseEmitter* param_0, JPABaseParticle* par
#include "asm/d/particle/d_particle/draw__19dPa_light8PcallBackFP14JPABaseEmitterP15JPABaseParticle.s"
}
#pragma pop
+#endif
/* ############################################################################################## */
/* 80451FEC-80451FF0 0005EC 0004+00 2/2 0/0 0/0 .sdata2 @6350 */
@@ -2787,6 +3071,99 @@ SECTION_SDATA2 static f32 lit_6351 = -12.5f;
/* 8004E6A8-8004ED44 048FE8 069C+00 1/0 0/0 0/0 .text
* draw__25dPa_gen_b_light8PcallBackFP14JPABaseEmitterP15JPABaseParticle */
+// regalloc
+#ifdef NONMATCHING
+void dPa_gen_b_light8PcallBack::draw(JPABaseEmitter* param_1, JPABaseParticle* param_2) {
+ Mtx local_80;
+ JGeometry::TVec3<f32> local_8c;
+ JGeometry::TVec3<f32> aTStack_98;
+ JGeometry::TVec3<f32> aTStack_a4;
+ JGeometry::TVec3<f32> aTStack_b0;
+ JGeometry::TVec3<f32> local_bc;
+ u8 uVar7 = param_1->getGlobalAlpha() & 0xff;
+ JGeometry::TVec3<f32> local_c8;
+ JGeometry::TVec3<f32> local_d4;
+ JGeometry::TVec3<f32> local_e0;
+ JGeometry::TVec3<f32> local_ec;
+ JGeometry::TVec3<f32> local_f8;
+ param_2->getGlobalPosition(local_8c);
+ MTXMultVec(j3dSys.getViewMtx(), &local_8c, &local_8c);
+ f32 dVar9 = JMASSin(param_2->getRotateAngle());
+ f32 dVar10 = JMASCos(param_2->getRotateAngle());
+ param_1->getGlobalParticleScale(local_bc);
+ local_bc.x *= param_2->getWidth(param_1);
+ local_bc.y *= param_2->getHeight(param_1);
+ local_80[0][0] = dVar10 * local_bc.x;
+ local_80[0][1] = -dVar9 * local_bc.y;
+ local_80[0][3] = local_8c.x;
+ local_80[1][0] = dVar9 * local_bc.x;
+ local_80[1][1] = dVar10 * local_bc.y;
+ local_80[1][3] = local_8c.y;
+ local_80[2][2] = 1.0f;
+ local_80[2][3] = local_8c.z;
+ local_80[2][1] = 0.0f;
+ local_80[2][0] = 0.0f;
+ local_80[1][2] = 0.0f;
+ local_80[0][2] = 0.0f;
+ GXLoadPosMtxImm(local_80, 0);
+ GXLoadNrmMtxImm(local_80, 0);
+ JGeometry::TVec3<f32> local_104;
+ JGeometry::TVec3<f32> local_110;
+ JGeometry::TVec3<f32> local_11c;
+ JGeometry::TVec3<f32> local_128;
+ local_104.set(12.5f, 12.5f, 0.0f);
+ local_110.set(12.5f, -12.5f, 0.0f);
+ local_11c.set(-12.5f, -12.5f, 0.0f);
+ local_128.set(-12.5f, 12.5f, 0.0f);
+ local_c8.x = 0.0f;
+ local_c8.y = 0.0f;
+ local_c8.z = 0.0f;
+ local_d4.x = 1.0f;
+ local_d4.y = 1.0f;
+ local_d4.z = 0.0f;
+ local_e0.x = 1.0f;
+ local_e0.y = -1.0f;
+ local_e0.z = 0.0f;
+ local_ec.x = -1.0f;
+ local_ec.y = -1.0f;
+ local_ec.z = 0.0f;
+ local_f8.x = -1.0f;
+ local_f8.y = 1.0f;
+ local_f8.z = 0.0f;
+ local_c8.normalize();
+ local_d4.normalize();
+ local_e0.normalize();
+ local_ec.normalize();
+ local_f8.normalize();
+ GXBegin(GX_TRIANGLEFAN, GX_VTXFMT0, 6);
+ GXPosition3f32(0.0f, 0.0f, 0.0f);
+ GXNormal3f32(local_c8.x, local_c8.y, local_c8.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar7);
+ GXTexCoord2f32(0.5f, 0.5f);
+ GXPosition3f32(local_104.x, local_104.y, local_104.z);
+ GXNormal3f32(local_d4.x, local_d4.y, local_d4.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar7);
+ GXTexCoord2f32(1.0f, 0.0f);
+ GXPosition3f32(local_110.x, local_110.y, local_110.z);
+ GXNormal3f32(local_e0.x, local_e0.y, local_e0.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar7);
+ GXTexCoord2f32(1.0f, 1.0f);
+ GXPosition3f32(local_11c.x, local_11c.y, local_11c.z);
+ GXNormal3f32(local_ec.x, local_ec.y, local_ec.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar7);
+ GXTexCoord2f32(0.0f, 1.0f);
+ GXPosition3f32(local_128.x, local_128.y, local_128.z);
+ GXNormal3f32(local_f8.x, local_f8.y, local_f8.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar7);
+ GXTexCoord2f32(0.0f, 0.0f);
+ GXPosition3f32(local_104.x, local_104.y, local_104.z);
+ GXNormal3f32(local_d4.x, local_d4.y, local_d4.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar7);
+ GXTexCoord2f32(1.0f, 0.0f);
+ GXEnd();
+ param_2->setInvisibleParticleFlag();
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -2795,6 +3172,7 @@ asm void dPa_gen_b_light8PcallBack::draw(JPABaseEmitter* param_0, JPABaseParticl
#include "asm/d/particle/d_particle/draw__25dPa_gen_b_light8PcallBackFP14JPABaseEmitterP15JPABaseParticle.s"
}
#pragma pop
+#endif
/* ############################################################################################## */
/* 8037A120-8037A12C 006780 000C+00 1/1 0/0 0/0 .rodata @6363 */
@@ -2805,6 +3183,125 @@ COMPILER_STRIP_GATE(0x8037A120, &lit_6363);
/* 8004ED44-8004F6B8 049684 0974+00 1/0 0/0 0/0 .text
* draw__25dPa_gen_d_light8PcallBackFP14JPABaseEmitterP15JPABaseParticle */
+#ifdef NONMATCHING
+void dPa_gen_d_light8PcallBack::draw(JPABaseEmitter* param_1, JPABaseParticle* param_2) {
+ Mtx local_60;
+ Mtx auStack_90;
+ Mtx auStack_c0;
+ Mtx auStack_f0;
+ JGeometry::TVec3<f32> local_100;
+ JGeometry::TVec3<f32> local_10c;
+ JGeometry::TVec3<f32> local_118;
+ JGeometry::TVec3<f32> local_124;
+ JGeometry::TVec3<f32> local_130;
+ u8 uVar6 = param_1->getGlobalAlpha() & 0xff;
+ JGeometry::TVec3<f32> local_13c;
+ JGeometry::TVec3<f32> local_148;
+ JGeometry::TVec3<f32> local_154;
+ JGeometry::TVec3<f32> local_160;
+ JGeometry::TVec3<f32> local_16c;
+ MTXIdentity(local_60);
+ MTXIdentity(auStack_90);
+ param_2->getBaseAxis(local_10c);
+ param_2->getLocalPosition(local_118);
+ if (local_118.isZero()) {
+ local_118.set(0.0f, 1.0f, 0.0f);
+ } else {
+ local_118.normalize();
+ }
+ local_124.cross(local_10c, local_118);
+ if (local_124.isZero()) {
+ local_124.set(0.0f, 0.0f, 1.0f);
+ } else {
+ local_124.normalize();
+ }
+ local_10c.cross(local_118, local_124);
+ local_10c.normalize();
+ local_60[0][0] = local_10c.x;
+ local_60[0][1] = local_118.x;
+ local_60[0][2] = local_124.x;
+ local_60[1][0] = local_10c.y;
+ local_60[1][1] = local_118.y;
+ local_60[1][2] = local_124.y;
+ local_60[2][0] = local_10c.z;
+ local_60[2][1] = local_118.z;
+ local_60[2][2] = local_124.z;
+ f32 fVar3 = (-90.0f / 16384.0f) * param_2->getRotateAngle();
+ if (fVar3) {
+ Vec local_178 = {1.0f, 1.0f, 1.0f};
+ MTXRotAxisRad(auStack_90, &local_178, (M_PI / 180.0f) * fVar3);
+ MTXConcat(local_60, auStack_90, local_60);
+ }
+ param_2->getGlobalPosition(local_100);
+ local_60[0][3] = local_100.x;
+ local_60[1][3] = local_100.y;
+ local_60[2][3] = local_100.z;
+ param_1->getGlobalParticleScale(local_130);
+ local_130.x *= param_2->getWidth(param_1);
+ local_130.y *= param_2->getHeight(param_1);
+ local_130.z = 0.0f;
+ MTXScale(auStack_f0, local_130.x, local_130.y, local_130.z);
+ MTXConcat(local_60, auStack_f0, local_60);
+ MTXConcat(j3dSys.getViewMtx(), local_60, auStack_c0);
+ GXLoadPosMtxImm(auStack_c0, 0);
+ GXLoadNrmMtxImm(auStack_c0, 0);
+ JGeometry::TVec3<f32> local_184;
+ JGeometry::TVec3<f32> local_190;
+ JGeometry::TVec3<f32> local_19c;
+ JGeometry::TVec3<f32> local_1a8;
+ local_184.set(12.5f, 12.5f, 0.0f);
+ local_190.set(12.5f, -12.5f, 0.0f);
+ local_19c.set(-12.5f, -12.5f, 0.0f);
+ local_1a8.set(-12.5f, 12.5f, 0.0f);
+ local_13c.x = 0.0f;
+ local_13c.y = 0.0f;
+ local_13c.z = 0.0f;
+ local_148.x = 1.0f;
+ local_148.y = 1.0f;
+ local_148.z = 0.0f;
+ local_154.x = 1.0f;
+ local_154.y = -1.0f;
+ local_154.z = 0.0f;
+ local_160.x = -1.0f;
+ local_160.y = -1.0f;
+ local_160.z = 0.0f;
+ local_16c.x = -1.0f;
+ local_16c.y = 1.0f;
+ local_16c.z = 0.0f;
+ local_13c.normalize();
+ local_148.normalize();
+ local_154.normalize();
+ local_160.normalize();
+ local_16c.normalize();
+ GXBegin(GX_TRIANGLEFAN, GX_VTXFMT0, 6);
+ GXPosition3f32(0.0f, 0.0f, 0.0f);
+ GXNormal3f32(local_13c.x, local_13c.y, local_13c.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar6);
+ GXTexCoord2f32(0.5f, 0.5f);
+ GXPosition3f32(local_184.x, local_184.y, local_184.z);
+ GXNormal3f32(local_148.x, local_148.y, local_148.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar6);
+ GXTexCoord2f32(1.0f, 0.0f);
+ GXPosition3f32(local_190.x, local_190.y, local_190.z);
+ GXNormal3f32(local_154.x, local_154.y, local_154.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar6);
+ GXTexCoord2f32(1.0f, 1.0f);
+ GXPosition3f32(local_19c.x, local_19c.y, local_19c.z);
+ GXNormal3f32(local_160.x, local_160.y, local_160.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar6);
+ GXTexCoord2f32(0.0f, 1.0f);
+ GXPosition3f32(local_1a8.x, local_1a8.y, local_1a8.z);
+ GXNormal3f32(local_16c.x, local_16c.y, local_16c.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar6);
+ GXTexCoord2f32(0.0f, 0.0f);
+ GXPosition3f32(local_184.x, local_184.y, local_184.z);
+ GXNormal3f32(local_148.x, local_148.y, local_148.z);
+ GXColor4u8(0xff, 0xff, 0xff, uVar6);
+ GXTexCoord2f32(1.0f, 0.0f);
+ GXEnd();
+ param_2->setInvisibleParticleFlag();
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -2813,6 +3310,7 @@ asm void dPa_gen_d_light8PcallBack::draw(JPABaseEmitter* param_0, JPABaseParticl
#include "asm/d/particle/d_particle/draw__25dPa_gen_d_light8PcallBackFP14JPABaseEmitterP15JPABaseParticle.s"
}
#pragma pop
+#endif
/* 8004F6B8-8004F6C4 049FF8 000C+00 0/0 2/2 3/3 .text
* setOldPosP__22dPa_hermiteEcallBack_cFPC4cXyzPC4cXyz */
@@ -2827,6 +3325,48 @@ SECTION_SDATA2 static f32 lit_6846 = -2.0f;
/* 8004F6C4-8004FABC 04A004 03F8+00 1/0 0/0 0/0 .text
* executeAfter__22dPa_hermiteEcallBack_cFP14JPABaseEmitter */
+// Matches with literals
+#ifdef NONMATCHING
+void dPa_hermiteEcallBack_c::executeAfter(JPABaseEmitter* param_1) {
+ JGeometry::TVec3<f32> aTStack_68;
+ JGeometry::TVec3<f32> local_74;
+ local_74.x = field_0x10->x;
+ local_74.y = field_0x10->y;
+ local_74.z = field_0x10->z;
+ JGeometry::TVec3<f32> local_80;
+ local_80.x = field_0xc->x;
+ local_80.y = field_0xc->y;
+ local_80.z = field_0xc->z;
+ JGeometry::TVec3<f32> local_8c;
+ JGeometry::TVec3<f32> local_98;
+ param_1->setGlobalTranslation(local_80);
+ if (param_1->checkStatus(2) == 0) {
+ local_98.x = 0.5f * (local_80.x - local_74.x);
+ local_98.y = 0.5f * (local_80.y - local_74.y);
+ local_98.z = 0.5f * (local_80.z - local_74.z);
+ local_8c.x = 0.5f * (local_74.x - field_0x14->x);
+ local_8c.y = 0.5f * (local_74.y - field_0x14->y);
+ local_8c.z = 0.5f * (local_74.z - field_0x14->z);
+ f32 fVar2 = field_0xc->abs(*field_0x10);
+ f32 fVar1 = (0.1f * fVar2) * mRate;
+ if (mMaxCnt != 0) {
+ if (fVar1 > mMaxCnt) {
+ fVar1 = mMaxCnt;
+ }
+ }
+ if (fVar1 > 1.0f) {
+ f32 dVar9 = 1.0f / fVar1;
+ for (f32 dVar8 = dVar9; dVar8 < 1.0f; dVar8 += dVar9) {
+ aTStack_68.cubic(local_74, local_8c, local_98, local_80, dVar8);
+ JPABaseParticle* particle = param_1->createParticle();
+ if (particle != NULL) {
+ particle->setOffsetPosition(aTStack_68);
+ }
+ }
+ }
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -2835,6 +3375,7 @@ asm void dPa_hermiteEcallBack_c::executeAfter(JPABaseEmitter* param_0) {
#include "asm/d/particle/d_particle/executeAfter__22dPa_hermiteEcallBack_cFP14JPABaseEmitter.s"
}
#pragma pop
+#endif
/* 8004FABC-8004FAD4 04A3FC 0018+00 1/0 0/0 0/0 .text
* setup__22dPa_hermiteEcallBack_cFP14JPABaseEmitterPC4cXyzPC5csXyzSc */