From e82c1557e4d5b430599d06039ebe372a4c0413ff Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Wed, 11 Oct 2023 01:00:21 -0700 Subject: [PATCH] JPAParticle start --- include/JSystem/JParticle/JPAEmitter.h | 27 ++++++++++++++ include/JSystem/JParticle/JPAParticle.h | 20 +++++------ src/JSystem/JParticle/JPAParticle.cpp | 48 ++++++++++++++++++++++++- 3 files changed, 84 insertions(+), 11 deletions(-) diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index cdc54c550..893ad4ed2 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -47,6 +47,31 @@ public: inline virtual void draw(T, U); }; +struct JPAEmitterInfo { +public: + /* 0x000 */ JMath::TRandom_fast_ mRandom; + /* 0x004 */ JPABaseEmitter * mpCurEmitter; + /* 0x008 */ Mtx mEmitterGlobalSR; + /* 0x038 */ Mtx mEmitterGlobalRot; + /* 0x068 */ Mtx mGlobalRot; + /* 0x098 */ Mtx mEmitterDirMtx; + /* 0x0C8 */ JGeometry::TVec3 mEmitterGlobalScale; + /* 0x0D4 */ JGeometry::TVec3 mEmitterTranslation; + /* 0x0E0 */ JGeometry::TVec3 mEmitterGlobalCenter; + /* 0x0EC */ JGeometry::TVec3 mPublicScale; + /* 0x0F8 */ u8 field_0xf8[0x10c - 0xf8]; + /* 0x10C */ JGeometry::TVec3 mVolumePos; + /* 0x118 */ JGeometry::TVec3 mVelOmni; + /* 0x124 */ JGeometry::TVec3 mVelAxis; + /* 0x130 */ f32 mVolumeSize; + /* 0x134 */ u32 mVolumeEmitCount; + /* 0x138 */ u32 mVolumeEmitIdx; + /* 0x13C */ u32 mVolumeEmitAngleCount; + /* 0x140 */ u32 mVolumeEmitXCount; + /* 0x144 */ u32 mVolumeEmitAngleMax; + /* 0x148 */ u32 mDivNumber; +}; + class JPABaseEmitter { public: typedef void (JPABaseEmitter::*VolumeFunc)(); @@ -123,6 +148,8 @@ public: mpParticleCallBack = callback; } + static JPAEmitterInfo emtrInfo; + /* 0x000 */ VolumeFunc mVolumeFunc; /* 0x00C */ cXyz mEmitterScale; /* 0x018 */ cXyz mEmitterTranslation; diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index 3ab594179..d1e6ed74d 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -34,14 +34,14 @@ public: public: /* 0x00 */ JSUPtrLink mLink; - /* 0x10 */ cXyz mGlobalPosition; - /* 0x1C */ cXyz mLocalPosition; - /* 0x28 */ cXyz mPosition; - /* 0x34 */ cXyz mVelocity; - /* 0x40 */ cXyz mBaseVel; - /* 0x4C */ cXyz mAccel; - /* 0x58 */ cXyz mFieldVel; - /* 0x64 */ cXyz mFieldAccel; + /* 0x10 */ JGeometry::TVec3 mGlobalPosition; + /* 0x1C */ JGeometry::TVec3 mLocalPosition; + /* 0x28 */ JGeometry::TVec3 mPosition; + /* 0x34 */ JGeometry::TVec3 mVelocity; + /* 0x40 */ JGeometry::TVec3 mBaseVel; + /* 0x4C */ JGeometry::TVec3 mAccel; + /* 0x58 */ JGeometry::TVec3 mFieldVel; + /* 0x64 */ JGeometry::TVec3 mFieldAccel; /* 0x70 */ f32 mAirResist; /* 0x74 */ f32 mMoment; /* 0x78 */ f32 mCurFrame; @@ -49,7 +49,7 @@ public: /* 0x80 */ f32 mCurNormTime; /* 0x84 */ f32 mFieldDrag; /* 0x88 */ f32 mDrag; - /* 0x8C */ cXyz mAxis; + /* 0x8C */ JGeometry::TVec3 mAxis; /* 0x98 */ f32 mScaleOut; /* 0x9C */ f32 mScaleX; /* 0xA0 */ f32 mScaleY; @@ -64,7 +64,7 @@ public: /* 0xC4 */ u8 field_0xC4[0xC6 - 0xC4]; /* 0xC6 */ u16 mTexIdx; /* 0xC8 */ JPACallBackBase2* mpCallBack2; - /* 0xCC */ u32 mFlags; + /* 0xCC */ u32 mStatus; }; class JPAParticleCallBack { diff --git a/src/JSystem/JParticle/JPAParticle.cpp b/src/JSystem/JParticle/JPAParticle.cpp index 391bb932c..eb63a5366 100644 --- a/src/JSystem/JParticle/JPAParticle.cpp +++ b/src/JSystem/JParticle/JPAParticle.cpp @@ -4,6 +4,7 @@ // #include "JSystem/JParticle/JPAParticle.h" +#include "JSystem/JParticle/JPAEmitter.h" #include "dolphin/types.h" /* 8025DEF4-8025E62C .text initParticle__15JPABaseParticleFv */ @@ -18,17 +19,62 @@ void JPABaseParticle::initChild(JPABaseParticle*) { /* 8025EB28-8025EB90 .text incFrame__15JPABaseParticleFv */ void JPABaseParticle::incFrame() { - /* Nonmatching */ + mCurFrame += 1.0f; + if (mCurFrame < 0.0f) + mCurFrame = 0.0f; + + mStatus &= ~0x01; + + if (mCurFrame >= mLifeTime) { + mCurNormTime = 1.0f; + mStatus |= 0x02; + } else { + mCurNormTime = mCurFrame / mLifeTime; + } } /* 8025EB90-8025ECE8 .text calcVelocity__15JPABaseParticleFv */ void JPABaseParticle::calcVelocity() { /* Nonmatching */ + mFieldVel.zero(); + if (mStatus & 0x20) + mGlobalPosition = JPABaseEmitter::emtrInfo.mEmitterGlobalCenter; + mBaseVel.x += mAccel.x; + mBaseVel.y += mAccel.y; + mBaseVel.z += mAccel.z; + if (!(mStatus & 0x40)) + JPABaseEmitter::emtrInfo.mpCurEmitter->mFieldManager.calc(this); + mFieldVel.x += mFieldAccel.x; + mFieldVel.y += mFieldAccel.y; + mFieldVel.z += mFieldAccel.z; + + f32 airResist = mAirResist; + mBaseVel.x *= airResist; + mBaseVel.y *= airResist; + mBaseVel.z *= airResist; + + f32 velScale = mMoment * mDrag; + JGeometry::TVec3 vel; + vel.x = (mBaseVel.x + mFieldVel.x) * velScale; + vel.y = (mBaseVel.y + mFieldVel.y) * velScale; + vel.z = (mBaseVel.z + mFieldVel.z) * velScale; + + mVelocity = vel; } /* 8025ECE8-8025ED6C .text calcPosition__15JPABaseParticleFv */ void JPABaseParticle::calcPosition() { /* Nonmatching */ + mLocalPosition.x += mVelocity.x; + mLocalPosition.y += mVelocity.y; + mLocalPosition.z += mVelocity.z; + + JGeometry::TVec3 pos; + pos.x = mGlobalPosition.x + JPABaseEmitter::emtrInfo.mPublicScale.x * mLocalPosition.x; + pos.y = mGlobalPosition.y + JPABaseEmitter::emtrInfo.mPublicScale.y * mLocalPosition.y; + pos.z = mGlobalPosition.z + JPABaseEmitter::emtrInfo.mPublicScale.z * mLocalPosition.z; + + mPosition = pos; } /* 8025ED6C-8025EE44 .text checkCreateChild__15JPABaseParticleFv */