From 9e5c1c9cbb62eb4e99f46cb63f908e492665eeef Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 27 Apr 2025 15:34:52 +0200 Subject: [PATCH] Almost done --- config/SOUE01/splits.txt | 1 + config/SOUE01/symbols.txt | 2 +- include/JSystem/JParticle/JPAExTexShape.h | 13 ++++++-- src/JSystem/JParticle/JPABaseShape.cpp | 28 +++++++++--------- src/JSystem/JParticle/JPAExTexShape.cpp | 36 +++++++++++++++++++++-- src/JSystem/JParticle/JPAParticle.cpp | 4 +-- 6 files changed, 63 insertions(+), 21 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 116c9361..68ce0d6f 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1778,6 +1778,7 @@ JSystem/JParticle/JPAChildShape.cpp: JSystem/JParticle/JPAExTexShape.cpp: .text start:0x8031DD50 end:0x8031E094 align:16 + .sdata2 start:0x8057CEB8 end:0x8057CED8 JSystem/JParticle/JPADynamicsBlock.cpp: .text start:0x8031E0A0 end:0x8031F020 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index fcd3cc0f..2890520f 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -18536,7 +18536,7 @@ JPACalcChildScaleOut__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031DD1 __ct__13JPAChildShapeFPCUc = .text:0x8031DD40; // type:function size:0x8 JPALoadExTex__FP18JPAEmitterWorkData = .text:0x8031DD50; // type:function size:0x114 __ct__13JPAExTexShapeFPCUc = .text:0x8031DE70; // type:function size:0x8 -fn_8031DE80__13JPAExTexShapeFP12JPABaseShapef = .text:0x8031DE80; // type:function size:0x214 +fn_8031DE80__13JPAExTexShapeCFPC12JPABaseShapef = .text:0x8031DE80; // type:function size:0x214 JPAVolumePoint__FP18JPAEmitterWorkData = .text:0x8031E0A0; // type:function size:0xD4 JPAVolumeLine__FP18JPAEmitterWorkData = .text:0x8031E180; // type:function size:0x114 JPAVolumeCircle__FP18JPAEmitterWorkData = .text:0x8031E2A0; // type:function size:0x204 diff --git a/include/JSystem/JParticle/JPAExTexShape.h b/include/JSystem/JParticle/JPAExTexShape.h index 91260f7d..81970fe0 100644 --- a/include/JSystem/JParticle/JPAExTexShape.h +++ b/include/JSystem/JParticle/JPAExTexShape.h @@ -17,7 +17,16 @@ struct JPAExTexShapeData { /* 0x08 */ u32 mFlags; /* 0x0C */ f32 mIndTexMtx[2][3]; - /* 0x24 */ u8 _0x24[0x4C - 0x24]; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ f32 field_0x38; + /* 0x3C */ f32 field_0x3C; + /* 0x40 */ f32 field_0x40; + /* 0x44 */ f32 field_0x44; + /* 0x48 */ f32 field_0x48; /* 0x4C */ u8 field_0x4C; /* 0x4D */ s8 mExpScale; /* 0x4E */ s8 mIndTexIdx; @@ -42,7 +51,7 @@ public: public: const JPAExTexShapeData* mpData; - void fn_8031DE80(JPABaseShape *bsp, f32); + void fn_8031DE80(const JPABaseShape *bsp, f32) const; }; void JPALoadExTex(JPAEmitterWorkData*); diff --git a/src/JSystem/JParticle/JPABaseShape.cpp b/src/JSystem/JParticle/JPABaseShape.cpp index 6e600a1d..ba13d593 100644 --- a/src/JSystem/JParticle/JPABaseShape.cpp +++ b/src/JSystem/JParticle/JPABaseShape.cpp @@ -561,8 +561,8 @@ void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { EGG::Vector3f local_48; MTXMultVec(work->mPosCamMtx, param_1->mPosition, local_48); - f32 sinRot = nw4r::math::SinIdx(param_1->mRotateAngle); - f32 cosRot = nw4r::math::CosIdx(param_1->mRotateAngle); + f32 sinRot = nw4r::math::SinIdx((s16)param_1->mRotateAngle); + f32 cosRot = nw4r::math::CosIdx((s16)param_1->mRotateAngle); f32 particleX = work->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY; @@ -618,8 +618,8 @@ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { EGG::Vector3f local_48; MTXMultVec(work->mPosCamMtx, param_1->mPosition, local_48); - f32 sinRot = nw4r::math::SinIdx(param_1->mRotateAngle); - f32 cosRot = nw4r::math::CosIdx(param_1->mRotateAngle); + f32 sinRot = nw4r::math::SinIdx((s16)param_1->mRotateAngle); + f32 cosRot = nw4r::math::CosIdx((s16)param_1->mRotateAngle); Mtx local_38; f32 particleX = work->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY; @@ -878,8 +878,8 @@ void JPADrawDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { * JPADrawRotDirection__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawRotDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { - f32 sinRot = nw4r::math::SinIdx(param_1->mRotateAngle); - f32 cosRot = nw4r::math::CosIdx(param_1->mRotateAngle); + f32 sinRot = nw4r::math::SinIdx((s16)param_1->mRotateAngle); + f32 cosRot = nw4r::math::CosIdx((s16)param_1->mRotateAngle); EGG::Vector3f local_6c; EGG::Vector3f local_78; p_direction[param_0->mDirType](param_0, param_1, &local_6c); @@ -959,8 +959,8 @@ void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { * JPADrawRotation__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawRotation(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { - f32 sinRot = nw4r::math::SinIdx(param_1->mRotateAngle); - f32 cosRot = nw4r::math::CosIdx(param_1->mRotateAngle); + f32 sinRot = nw4r::math::SinIdx((s16)param_1->mRotateAngle); + f32 cosRot = nw4r::math::CosIdx((s16)param_1->mRotateAngle); f32 particleX = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY; Mtx auStack_88; @@ -1073,8 +1073,8 @@ void JPADrawStripe(JPAEmitterWorkData* param_0) { param_0->mpCurNode = node; JPABaseParticle* particle = node->getObject(); local_ec.set(particle->mPosition); - dVar11 = nw4r::math::SinIdx(particle->mRotateAngle); - dVar12 = nw4r::math::CosIdx(particle->mRotateAngle); + dVar11 = nw4r::math::SinIdx((s16)particle->mRotateAngle); + dVar12 = nw4r::math::CosIdx((s16)particle->mRotateAngle); local_e0[0].set(-particle->mParticleScaleX * dVar14, 0.0f, 0.0f); local_e0[0].set(local_e0[0].x * dVar12, 0.0f, local_e0[0].x * dVar11); local_e0[1].set(particle->mParticleScaleX * dVar13, 0.0f, 0.0f); @@ -1163,8 +1163,8 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) { param_0->mpCurNode = node; JPABaseParticle* particle = node->getObject(); local_b4.set(particle->mPosition); - dVar11 = nw4r::math::SinIdx(particle->mRotateAngle); - dVar12 = nw4r::math::CosIdx(particle->mRotateAngle); + dVar11 = nw4r::math::SinIdx((s16)particle->mRotateAngle); + dVar12 = nw4r::math::CosIdx((s16)particle->mRotateAngle); local_a8[0].set(-particle->mParticleScaleX * local_154, 0.0f, 0.0f); local_a8[0].set(local_a8[0].x * dVar12, 0.0f, local_a8[0].x * dVar11); local_a8[1].set(particle->mParticleScaleX * local_158, 0.0f, 0.0f); @@ -1213,8 +1213,8 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) { param_0->mpCurNode = node; JPABaseParticle* particle = node->getObject(); local_b4.set(particle->mPosition); - dVar11 = nw4r::math::CosIdx(particle->mRotateAngle); - dVar12 = -nw4r::math::SinIdx(particle->mRotateAngle); + dVar11 = nw4r::math::CosIdx((s16)particle->mRotateAngle); + dVar12 = -nw4r::math::SinIdx((s16)particle->mRotateAngle); local_a8[0].set(-particle->mParticleScaleY * local_15c, 0.0f, 0.0f); local_a8[0].set(local_a8[0].x * dVar12, 0.0f, local_a8[0].x * dVar11); local_a8[1].set(particle->mParticleScaleY * local_160, 0.0f, 0.0f); diff --git a/src/JSystem/JParticle/JPAExTexShape.cpp b/src/JSystem/JParticle/JPAExTexShape.cpp index 74274c62..3264be66 100644 --- a/src/JSystem/JParticle/JPAExTexShape.cpp +++ b/src/JSystem/JParticle/JPAExTexShape.cpp @@ -6,6 +6,7 @@ #include "JSystem/JParticle/JPAExTexShape.h" #include "JSystem/JParticle/JPAResourceManager.h" #include "JSystem/JParticle/JPAEmitter.h" +#include "nw4r/math/math_triangular.h" #include "rvl/MTX.h" #include "rvl/GX.h" @@ -38,6 +39,37 @@ JPAExTexShape::JPAExTexShape(u8 const* data) { mpData = (const JPAExTexShapeData*)data; } -void JPAExTexShape::fn_8031DE80(JPABaseShape* shp, f32) { - // TODO +void JPAExTexShape::fn_8031DE80(const JPABaseShape *shp, f32 f) const { + f32 _0x38_x_0x24 = f * mpData->field_0x38 + mpData->field_0x24; + f32 _0x3C_x_0x28 = f * mpData->field_0x3C + mpData->field_0x28; + f32 _0x40_x_0x2C = f * mpData->field_0x40 + mpData->field_0x2C; + f32 _0x44_x_0x30 = f * mpData->field_0x44 + mpData->field_0x30; + + f32 tilingS = 0.5f * (shp->getTilingS() + 1.0f); + f32 tilingT = 0.5f * (shp->getTilingT() + 1.0f); + + s16 v = f * mpData->field_0x48 * 32768.0f + mpData->field_0x34 * 32768.0f; + f32 sin = nw4r::math::SinIdx(v); + f32 cos = nw4r::math::CosIdx(v); + + f32 fS2 = tilingS + _0x38_x_0x24; + f32 fT2 = tilingT + _0x3C_x_0x28; + + Mtx texMtx; + + texMtx[0][0] = _0x40_x_0x2C * cos; + texMtx[0][1] = -_0x40_x_0x2C * sin; + texMtx[0][2] = 0.0f; + texMtx[0][3] = tilingS + _0x40_x_0x2C * (sin * fT2 - cos * fS2); + + texMtx[1][0] = _0x44_x_0x30 * sin; + texMtx[1][1] = _0x44_x_0x30 * cos; + texMtx[1][2] = 0.0f; + texMtx[1][3] = tilingT + (-_0x44_x_0x30) * (sin * fS2 + cos * fT2); + + texMtx[2][0] = 0.0f; + texMtx[2][1] = 0.0f; + texMtx[2][2] = 0.0f; + texMtx[2][3] = 1.0f; + GXLoadTexMtxImm(texMtx, 0x24, GX_MTX2x4); } diff --git a/src/JSystem/JParticle/JPAParticle.cpp b/src/JSystem/JParticle/JPAParticle.cpp index 195295ad..f6aa642c 100644 --- a/src/JSystem/JParticle/JPAParticle.cpp +++ b/src/JSystem/JParticle/JPAParticle.cpp @@ -155,8 +155,8 @@ void JPABaseParticle::init_c(JPAEmitterWorkData* work, JPABaseParticle* parent) f32 base_speed = csp->getBaseVel() * (csp->getBaseVelRndm() * emtr->get_r_zp() + 1.0f); EGG::Vector3f base_vel(emtr->get_r_zp(), emtr->get_r_zp(), emtr->get_r_zp()); base_vel.setLength(base_speed); - mVelType1 = csp->getVelInhRate() * parent->mVelType1 + base_vel; - mVelType0 = csp->getVelInhRate() * parent->mVelType2; + mVelType1 = parent->mVelType1 * csp->getVelInhRate() + base_vel; + mVelType0 = parent->mVelType2 * csp->getVelInhRate(); mMoment = parent->mMoment; if (csp->isFieldAffected()) {