summaryrefslogtreecommitdiff
path: root/include/JSystem
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2021-12-24 13:01:37 -0800
committerJasper St. Pierre <jstpierre@mecheye.net>2021-12-24 13:01:37 -0800
commitb9a53e816975978d060446be054cc384cbddd3df (patch)
tree15c47ee2276227ea9a87f52c2addcf9e5d6ab9bc /include/JSystem
parente4e6a51a5ae4d88ba4b0e6eacc1374e877040f9f (diff)
JPAChildShape, more work on JPADynamicsBlock
Diffstat (limited to 'include/JSystem')
-rw-r--r--include/JSystem/JGeometry.h16
-rw-r--r--include/JSystem/JParticle/JPABaseShape.h10
-rw-r--r--include/JSystem/JParticle/JPAChildShape.h38
-rw-r--r--include/JSystem/JParticle/JPADynamicsBlock.h18
-rw-r--r--include/JSystem/JParticle/JPAParticle.h49
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*);