diff options
| author | Jasper St. Pierre <jstpierre@mecheye.net> | 2021-12-24 13:01:37 -0800 |
|---|---|---|
| committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2021-12-24 13:01:37 -0800 |
| commit | b9a53e816975978d060446be054cc384cbddd3df (patch) | |
| tree | 15c47ee2276227ea9a87f52c2addcf9e5d6ab9bc /include/JSystem | |
| parent | e4e6a51a5ae4d88ba4b0e6eacc1374e877040f9f (diff) | |
JPAChildShape, more work on JPADynamicsBlock
Diffstat (limited to 'include/JSystem')
| -rw-r--r-- | include/JSystem/JGeometry.h | 16 | ||||
| -rw-r--r-- | include/JSystem/JParticle/JPABaseShape.h | 10 | ||||
| -rw-r--r-- | include/JSystem/JParticle/JPAChildShape.h | 38 | ||||
| -rw-r--r-- | include/JSystem/JParticle/JPADynamicsBlock.h | 18 | ||||
| -rw-r--r-- | include/JSystem/JParticle/JPAParticle.h | 49 |
5 files changed, 121 insertions, 10 deletions
diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h index fc2d86cd9b..a4c0ca50ed 100644 --- a/include/JSystem/JGeometry.h +++ b/include/JSystem/JGeometry.h @@ -33,6 +33,22 @@ struct TVec3<f32> { y = other.y; z = other.z; } + + void set(f32 x_, f32 y_, f32 z_) { + x = x_; + y = y_; + z = z_; + } + + void zero() { + x = y = z = 0.0f; + } + + void mul(const TVec3<f32>& a, const TVec3<f32>& b) { + x = a.x * b.x; + y = a.y * b.y; + z = a.z * b.z; + } }; template <typename T> diff --git a/include/JSystem/JParticle/JPABaseShape.h b/include/JSystem/JParticle/JPABaseShape.h index 3a38c81bd7..a081b0c916 100644 --- a/include/JSystem/JParticle/JPABaseShape.h +++ b/include/JSystem/JParticle/JPABaseShape.h @@ -99,11 +99,11 @@ public: f32 getBaseSizeY() const { return mpData->mBaseSizeY; } public: - const JPABaseShapeData* mpData; - const void* mpTexCrdMtxAnmTbl; - const u8* mpTexIdxAnimTbl; - GXColor* mpPrmClrAnmTbl; - GXColor* mpEnvClrAnmTbl; + /* 0x00 */ const JPABaseShapeData* mpData; + /* 0x04 */ const void* mpTexCrdMtxAnmTbl; + /* 0x08 */ const u8* mpTexIdxAnimTbl; + /* 0x0C */ GXColor* mpPrmClrAnmTbl; + /* 0x10 */ GXColor* mpEnvClrAnmTbl; }; #endif /* JPABASESHAPE_H */ diff --git a/include/JSystem/JParticle/JPAChildShape.h b/include/JSystem/JParticle/JPAChildShape.h index f5ef5fa60e..5f6edf0d30 100644 --- a/include/JSystem/JParticle/JPAChildShape.h +++ b/include/JSystem/JParticle/JPAChildShape.h @@ -2,5 +2,43 @@ #define JPACHILDSHAPE_H #include "dolphin/types.h" +#include "dolphin/gx/GX.h" + +struct JPAChildShapeData { + // Common header. + /* 0x00 */ u8 mMagic[4]; + /* 0x04 */ u32 mSize; + + /* 0x08 */ u32 mFlags; + /* 0x0C */ f32 mPosRndm; + /* 0x10 */ f32 mBaseVel; + /* 0x14 */ f32 mBaseVelRndm; + /* 0x18 */ f32 mVelInfRate; + /* 0x1C */ f32 mGravity; + /* 0x20 */ f32 mScaleX; + /* 0x24 */ f32 mScaleY; + /* 0x28 */ f32 mInheritScale; + /* 0x2C */ f32 mInheritAlpha; + /* 0x30 */ f32 mInheritRGB; + /* 0x34 */ GXColor mPrmClr; + /* 0x38 */ GXColor mEnvClr; + /* 0x3C */ f32 mTiming; + /* 0x40 */ s16 mLife; + /* 0x42 */ s16 mRate; + /* 0x44 */ u8 mStep; + /* 0x45 */ u8 mTexIdx; + /* 0x46 */ s16 mRotSpeed; +}; + +class JPAChildShape { +public: + /* 8027B038 */ JPAChildShape(u8 const*); + + void getPrmClr(GXColor* dst) { *dst = mpData->mPrmClr; } + void getEnvClr(GXColor* dst) { *dst = mpData->mEnvClr; } + +public: + /* 0x00 */ const JPAChildShapeData* mpData; +}; #endif /* JPACHILDSHAPE_H */ diff --git a/include/JSystem/JParticle/JPADynamicsBlock.h b/include/JSystem/JParticle/JPADynamicsBlock.h index aa424f49a9..8b3e441c19 100644 --- a/include/JSystem/JParticle/JPADynamicsBlock.h +++ b/include/JSystem/JParticle/JPADynamicsBlock.h @@ -35,13 +35,21 @@ struct JPADynamicsBlockData { /* 0x70 */ s16 mStartFrame; /* 0x72 */ s16 mLifeTime; /* 0x74 */ s16 mVolumeSize; - /* 0x76 */ s16 mDivNumber; + /* 0x76 */ u16 mDivNumber; /* 0x78 */ u8 mRateStep; /* 0x7C */ u32 field_0x7c; }; typedef void (*JPADynamicsCalcVolumeFunc)(JPAEmitterWorkData*); +enum { + JPADynFlag_FixedDensity = 0x01, + JPADynFlag_FixedInterval = 0x02, + JPADynFlag_InheritScale = 0x04, + JPADynFlag_FollowEmtr = 0x08, + JPADynFlag_FollowEmtrChld = 0x10, +}; + class JPADynamicsBlock { public: /* 8027BB18 */ JPADynamicsBlock(u8 const*); @@ -52,10 +60,14 @@ public: s16 getStartFrame() const { return mpData->mStartFrame; } u32 getResUserWork() const { return mpData->mResUserWork; } + u32 getFlag() const { return mpData->mFlags; } + u32 getVolumeType() const { return (mpData->mFlags >> 8) & 0x07; } + u16 getDivNumber() const { return mpData->mDivNumber; } + f32 getRateRndm() const { return mpData->mRateRndm; } public: - JPADynamicsBlockData* mpData; - JPADynamicsCalcVolumeFunc mpCalcVolumeFunc; + /* 0x00 */ const JPADynamicsBlockData* mpData; + /* 0x04 */ JPADynamicsCalcVolumeFunc mpCalcVolumeFunc; }; #endif /* JPADYNAMICSBLOCK_H */ diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index 7b72bbe1c7..ae0a07b8b2 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -7,6 +7,9 @@ #include "JSystem/JGeometry.h" #include "JSystem/JSupport/JSUList.h" +#include "JSystem/JParticle/JPADynamicsBlock.h" +#include "JSystem/JParticle/JPAResource.h" + class JKRHeap; class JPABaseEmitter; class JPABaseParticle; @@ -31,6 +34,30 @@ public: JPARandom() { mSeed = 0; } void set_seed(u32 seed) { mSeed = seed; } + u32 get_rndm_u() { + return mSeed = mSeed * 0x19660du + 0x3c6ef35fu; + } + + f32 get_rndm_f() { + union { u32 u; f32 f; } a; + a.u = ((get_rndm_u() >> 9) | 0x3f800000); + return a.f - 1.0f; + } + + f32 get_rndm_zp() { + f32 f = get_rndm_f(); + return (f + f) - 1.0f; + } + + f32 get_rndm_zh() { + f32 f = get_rndm_f(); + return f - 1.0f; + } + + s16 get_rndm_ss() { + return ((s16)get_rndm_u()) >> 16; + } + public: u32 mSeed; }; @@ -175,6 +202,13 @@ public: /* 8027E6A4 */ ~JPAEmitterCallBack(); }; +enum { + JPAEmtrStts_StopEmit = 0x01, + JPAEmtrStts_StopCalc = 0x02, + JPAEmtrStts_FirstEmit = 0x10, + JPAEmtrStts_RateStepEmit = 0x20, +}; + class JPABaseEmitter { public: /* 8027E5EC */ ~JPABaseEmitter(); @@ -191,11 +225,18 @@ public: /* 8027EF50 */ bool loadTexture(u8, GXTexMapID); void setStatus(u32 status) { mStatus |= status; } + void clearStatus(u32 status) { mStatus &= ~status; } bool checkStatus(u32 status) { return !!(mStatus & status); } + bool checkFlag(u32 flag) { return !!(mpRes->getDyn()->getFlag() & flag); } u8 getResourceManagerID() const { return mResMgrID; } u8 getGroupID() const { return mGroupID; } u8 getDrawTimes() const { return mDrawTimes; } + f32 get_r_f() { return mRndm.get_rndm_f(); } + f32 get_r_zp() { return mRndm.get_rndm_zp(); } + f32 get_r_zh() { return mRndm.get_rndm_zh(); } + s16 get_r_ss() { return mRndm.get_rndm_ss(); } + public: /* 0x00 */ Vec mLocalScl; /* 0x0C */ Vec mLocalTrs; @@ -235,7 +276,7 @@ public: /* 0xFC */ f32 mScaleOut; /* 0x100 */ u32 mTick; /* 0x104 */ s16 mWaitTime; - /* 0x106 */ u16 mRateStepTimer; + /* 0x106 */ s16 mRateStepTimer; /* 0x108 */ GXColor mPrmClr; /* 0x10C */ GXColor mEnvClr; /* 0x110 */ u8 mDrawTimes; @@ -246,11 +287,15 @@ public: class JPAParticleCallBack { public: - ~JPAParticleCallBack(); + virtual ~JPAParticleCallBack(); virtual void execute(JPABaseEmitter*, JPABaseParticle*); virtual void draw(JPABaseEmitter*, JPABaseParticle*); }; +enum { + JPAPtclStts_Invisible = 0x08, +}; + class JPABaseParticle { public: /* 8027EFEC */ void init_p(JPAEmitterWorkData*); |
