diff --git a/asm/JSystem/JParticle/JPAChildShape/JPACalcChildAlphaOut__FP18JPAEmitterWorkDataP15JPABaseParticle.s b/asm/JSystem/JParticle/JPAChildShape/JPACalcChildAlphaOut__FP18JPAEmitterWorkDataP15JPABaseParticle.s deleted file mode 100644 index 2a170dbadff..00000000000 --- a/asm/JSystem/JParticle/JPAChildShape/JPACalcChildAlphaOut__FP18JPAEmitterWorkDataP15JPABaseParticle.s +++ /dev/null @@ -1,12 +0,0 @@ -lbl_8027AFDC: -/* 8027AFDC 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 8027AFE0 C0 42 B9 08 */ lfs f2, lit_2318(r2) -/* 8027AFE4 C0 22 B9 0C */ lfs f1, lit_2319(r2) -/* 8027AFE8 C0 04 00 84 */ lfs f0, 0x84(r4) -/* 8027AFEC EC 01 00 28 */ fsubs f0, f1, f0 -/* 8027AFF0 EC 62 00 32 */ fmuls f3, f2, f0 -/* 8027AFF4 F0 61 A0 08 */ psq_st f3, 8(r1), 1, 2 /* qr2 */ -/* 8027AFF8 88 01 00 08 */ lbz r0, 8(r1) -/* 8027AFFC 98 04 00 96 */ stb r0, 0x96(r4) -/* 8027B000 38 21 00 10 */ addi r1, r1, 0x10 -/* 8027B004 4E 80 00 20 */ blr diff --git a/asm/JSystem/JParticle/JPAChildShape/JPACalcChildScaleOut__FP18JPAEmitterWorkDataP15JPABaseParticle.s b/asm/JSystem/JParticle/JPAChildShape/JPACalcChildScaleOut__FP18JPAEmitterWorkDataP15JPABaseParticle.s deleted file mode 100644 index 224478a1830..00000000000 --- a/asm/JSystem/JParticle/JPAChildShape/JPACalcChildScaleOut__FP18JPAEmitterWorkDataP15JPABaseParticle.s +++ /dev/null @@ -1,13 +0,0 @@ -lbl_8027B008: -/* 8027B008 C0 24 00 68 */ lfs f1, 0x68(r4) -/* 8027B00C C0 42 B9 0C */ lfs f2, lit_2319(r2) -/* 8027B010 C0 04 00 84 */ lfs f0, 0x84(r4) -/* 8027B014 EC 02 00 28 */ fsubs f0, f2, f0 -/* 8027B018 EC 01 00 32 */ fmuls f0, f1, f0 -/* 8027B01C D0 04 00 60 */ stfs f0, 0x60(r4) -/* 8027B020 C0 24 00 6C */ lfs f1, 0x6c(r4) -/* 8027B024 C0 04 00 84 */ lfs f0, 0x84(r4) -/* 8027B028 EC 02 00 28 */ fsubs f0, f2, f0 -/* 8027B02C EC 01 00 32 */ fmuls f0, f1, f0 -/* 8027B030 D0 04 00 64 */ stfs f0, 0x64(r4) -/* 8027B034 4E 80 00 20 */ blr diff --git a/asm/JSystem/JParticle/JPAChildShape/JPARegistChildPrmEnv__FP18JPAEmitterWorkData.s b/asm/JSystem/JParticle/JPAChildShape/JPARegistChildPrmEnv__FP18JPAEmitterWorkData.s deleted file mode 100644 index 2e75c09424e..00000000000 --- a/asm/JSystem/JParticle/JPAChildShape/JPARegistChildPrmEnv__FP18JPAEmitterWorkData.s +++ /dev/null @@ -1,73 +0,0 @@ -lbl_8027AEBC: -/* 8027AEBC 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 8027AEC0 7C 08 02 A6 */ mflr r0 -/* 8027AEC4 90 01 00 24 */ stw r0, 0x24(r1) -/* 8027AEC8 80 83 00 04 */ lwz r4, 4(r3) -/* 8027AECC 80 84 00 24 */ lwz r4, 0x24(r4) -/* 8027AED0 80 63 00 00 */ lwz r3, 0(r3) -/* 8027AED4 80 84 00 00 */ lwz r4, 0(r4) -/* 8027AED8 89 64 00 34 */ lbz r11, 0x34(r4) -/* 8027AEDC 99 61 00 14 */ stb r11, 0x14(r1) -/* 8027AEE0 89 44 00 35 */ lbz r10, 0x35(r4) -/* 8027AEE4 99 41 00 15 */ stb r10, 0x15(r1) -/* 8027AEE8 89 24 00 36 */ lbz r9, 0x36(r4) -/* 8027AEEC 99 21 00 16 */ stb r9, 0x16(r1) -/* 8027AEF0 89 04 00 37 */ lbz r8, 0x37(r4) -/* 8027AEF4 99 01 00 17 */ stb r8, 0x17(r1) -/* 8027AEF8 88 E4 00 38 */ lbz r7, 0x38(r4) -/* 8027AEFC 98 E1 00 10 */ stb r7, 0x10(r1) -/* 8027AF00 88 C4 00 39 */ lbz r6, 0x39(r4) -/* 8027AF04 98 C1 00 11 */ stb r6, 0x11(r1) -/* 8027AF08 88 A4 00 3A */ lbz r5, 0x3a(r4) -/* 8027AF0C 98 A1 00 12 */ stb r5, 0x12(r1) -/* 8027AF10 88 04 00 3B */ lbz r0, 0x3b(r4) -/* 8027AF14 98 01 00 13 */ stb r0, 0x13(r1) -/* 8027AF18 88 83 00 B8 */ lbz r4, 0xb8(r3) -/* 8027AF1C 38 04 00 01 */ addi r0, r4, 1 -/* 8027AF20 7C 0B 01 D6 */ mullw r0, r11, r0 -/* 8027AF24 54 00 C6 3E */ rlwinm r0, r0, 0x18, 0x18, 0x1f -/* 8027AF28 98 01 00 14 */ stb r0, 0x14(r1) -/* 8027AF2C 88 83 00 B9 */ lbz r4, 0xb9(r3) -/* 8027AF30 38 04 00 01 */ addi r0, r4, 1 -/* 8027AF34 7C 0A 01 D6 */ mullw r0, r10, r0 -/* 8027AF38 54 00 C6 3E */ rlwinm r0, r0, 0x18, 0x18, 0x1f -/* 8027AF3C 98 01 00 15 */ stb r0, 0x15(r1) -/* 8027AF40 88 83 00 BA */ lbz r4, 0xba(r3) -/* 8027AF44 38 04 00 01 */ addi r0, r4, 1 -/* 8027AF48 7C 09 01 D6 */ mullw r0, r9, r0 -/* 8027AF4C 54 00 C6 3E */ rlwinm r0, r0, 0x18, 0x18, 0x1f -/* 8027AF50 98 01 00 16 */ stb r0, 0x16(r1) -/* 8027AF54 88 83 00 BB */ lbz r4, 0xbb(r3) -/* 8027AF58 38 04 00 01 */ addi r0, r4, 1 -/* 8027AF5C 7C 08 01 D6 */ mullw r0, r8, r0 -/* 8027AF60 54 00 C6 3E */ rlwinm r0, r0, 0x18, 0x18, 0x1f -/* 8027AF64 98 01 00 17 */ stb r0, 0x17(r1) -/* 8027AF68 88 83 00 BC */ lbz r4, 0xbc(r3) -/* 8027AF6C 38 04 00 01 */ addi r0, r4, 1 -/* 8027AF70 7C 07 01 D6 */ mullw r0, r7, r0 -/* 8027AF74 54 00 C6 3E */ rlwinm r0, r0, 0x18, 0x18, 0x1f -/* 8027AF78 98 01 00 10 */ stb r0, 0x10(r1) -/* 8027AF7C 88 83 00 BD */ lbz r4, 0xbd(r3) -/* 8027AF80 38 04 00 01 */ addi r0, r4, 1 -/* 8027AF84 7C 06 01 D6 */ mullw r0, r6, r0 -/* 8027AF88 54 00 C6 3E */ rlwinm r0, r0, 0x18, 0x18, 0x1f -/* 8027AF8C 98 01 00 11 */ stb r0, 0x11(r1) -/* 8027AF90 88 63 00 BE */ lbz r3, 0xbe(r3) -/* 8027AF94 38 03 00 01 */ addi r0, r3, 1 -/* 8027AF98 7C 05 01 D6 */ mullw r0, r5, r0 -/* 8027AF9C 54 00 C6 3E */ rlwinm r0, r0, 0x18, 0x18, 0x1f -/* 8027AFA0 98 01 00 12 */ stb r0, 0x12(r1) -/* 8027AFA4 80 01 00 14 */ lwz r0, 0x14(r1) -/* 8027AFA8 90 01 00 0C */ stw r0, 0xc(r1) -/* 8027AFAC 38 60 00 01 */ li r3, 1 -/* 8027AFB0 38 81 00 0C */ addi r4, r1, 0xc -/* 8027AFB4 48 0E 43 C9 */ bl GXSetTevColor -/* 8027AFB8 80 01 00 10 */ lwz r0, 0x10(r1) -/* 8027AFBC 90 01 00 08 */ stw r0, 8(r1) -/* 8027AFC0 38 60 00 02 */ li r3, 2 -/* 8027AFC4 38 81 00 08 */ addi r4, r1, 8 -/* 8027AFC8 48 0E 43 B5 */ bl GXSetTevColor -/* 8027AFCC 80 01 00 24 */ lwz r0, 0x24(r1) -/* 8027AFD0 7C 08 03 A6 */ mtlr r0 -/* 8027AFD4 38 21 00 20 */ addi r1, r1, 0x20 -/* 8027AFD8 4E 80 00 20 */ blr diff --git a/asm/JSystem/JParticle/JPADynamicsBlock/__ct__16JPADynamicsBlockFPCUc.s b/asm/JSystem/JParticle/JPADynamicsBlock/__ct__16JPADynamicsBlockFPCUc.s deleted file mode 100644 index 9971f3b756d..00000000000 --- a/asm/JSystem/JParticle/JPADynamicsBlock/__ct__16JPADynamicsBlockFPCUc.s +++ /dev/null @@ -1,14 +0,0 @@ -lbl_8027BB18: -/* 8027BB18 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 8027BB1C 7C 08 02 A6 */ mflr r0 -/* 8027BB20 90 01 00 14 */ stw r0, 0x14(r1) -/* 8027BB24 93 E1 00 0C */ stw r31, 0xc(r1) -/* 8027BB28 7C 7F 1B 78 */ mr r31, r3 -/* 8027BB2C 90 83 00 00 */ stw r4, 0(r3) -/* 8027BB30 48 00 00 1D */ bl init__16JPADynamicsBlockFv -/* 8027BB34 7F E3 FB 78 */ mr r3, r31 -/* 8027BB38 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 8027BB3C 80 01 00 14 */ lwz r0, 0x14(r1) -/* 8027BB40 7C 08 03 A6 */ mtlr r0 -/* 8027BB44 38 21 00 10 */ addi r1, r1, 0x10 -/* 8027BB48 4E 80 00 20 */ blr diff --git a/asm/JSystem/JParticle/JPADynamicsBlock/init__16JPADynamicsBlockFv.s b/asm/JSystem/JParticle/JPADynamicsBlock/init__16JPADynamicsBlockFv.s deleted file mode 100644 index abe1072918d..00000000000 --- a/asm/JSystem/JParticle/JPADynamicsBlock/init__16JPADynamicsBlockFv.s +++ /dev/null @@ -1,40 +0,0 @@ -lbl_8027BB4C: -/* 8027BB4C 80 83 00 00 */ lwz r4, 0(r3) -/* 8027BB50 80 04 00 08 */ lwz r0, 8(r4) -/* 8027BB54 54 00 C7 7E */ rlwinm r0, r0, 0x18, 0x1d, 0x1f -/* 8027BB58 28 00 00 06 */ cmplwi r0, 6 -/* 8027BB5C 4D 81 00 20 */ bgtlr -/* 8027BB60 3C 80 80 3C */ lis r4, lit_2631@ha /* 0x803C4488@ha */ -/* 8027BB64 38 84 44 88 */ addi r4, r4, lit_2631@l /* 0x803C4488@l */ -/* 8027BB68 54 00 10 3A */ slwi r0, r0, 2 -/* 8027BB6C 7C 04 00 2E */ lwzx r0, r4, r0 -/* 8027BB70 7C 09 03 A6 */ mtctr r0 -/* 8027BB74 4E 80 04 20 */ bctr -/* 8027BB78 3C 80 80 28 */ lis r4, JPAVolumeCube__FP18JPAEmitterWorkData@ha /* 0x8027B4E8@ha */ -/* 8027BB7C 38 04 B4 E8 */ addi r0, r4, JPAVolumeCube__FP18JPAEmitterWorkData@l /* 0x8027B4E8@l */ -/* 8027BB80 90 03 00 04 */ stw r0, 4(r3) -/* 8027BB84 4E 80 00 20 */ blr -/* 8027BB88 3C 80 80 28 */ lis r4, JPAVolumeSphere__FP18JPAEmitterWorkData@ha /* 0x8027B5F0@ha */ -/* 8027BB8C 38 04 B5 F0 */ addi r0, r4, JPAVolumeSphere__FP18JPAEmitterWorkData@l /* 0x8027B5F0@l */ -/* 8027BB90 90 03 00 04 */ stw r0, 4(r3) -/* 8027BB94 4E 80 00 20 */ blr -/* 8027BB98 3C 80 80 28 */ lis r4, JPAVolumeCylinder__FP18JPAEmitterWorkData@ha /* 0x8027B87C@ha */ -/* 8027BB9C 38 04 B8 7C */ addi r0, r4, JPAVolumeCylinder__FP18JPAEmitterWorkData@l /* 0x8027B87C@l */ -/* 8027BBA0 90 03 00 04 */ stw r0, 4(r3) -/* 8027BBA4 4E 80 00 20 */ blr -/* 8027BBA8 3C 80 80 28 */ lis r4, JPAVolumeTorus__FP18JPAEmitterWorkData@ha /* 0x8027B9F8@ha */ -/* 8027BBAC 38 04 B9 F8 */ addi r0, r4, JPAVolumeTorus__FP18JPAEmitterWorkData@l /* 0x8027B9F8@l */ -/* 8027BBB0 90 03 00 04 */ stw r0, 4(r3) -/* 8027BBB4 4E 80 00 20 */ blr -/* 8027BBB8 3C 80 80 28 */ lis r4, JPAVolumePoint__FP18JPAEmitterWorkData@ha /* 0x8027B144@ha */ -/* 8027BBBC 38 04 B1 44 */ addi r0, r4, JPAVolumePoint__FP18JPAEmitterWorkData@l /* 0x8027B144@l */ -/* 8027BBC0 90 03 00 04 */ stw r0, 4(r3) -/* 8027BBC4 4E 80 00 20 */ blr -/* 8027BBC8 3C 80 80 28 */ lis r4, JPAVolumeCircle__FP18JPAEmitterWorkData@ha /* 0x8027B33C@ha */ -/* 8027BBCC 38 04 B3 3C */ addi r0, r4, JPAVolumeCircle__FP18JPAEmitterWorkData@l /* 0x8027B33C@l */ -/* 8027BBD0 90 03 00 04 */ stw r0, 4(r3) -/* 8027BBD4 4E 80 00 20 */ blr -/* 8027BBD8 3C 80 80 28 */ lis r4, JPAVolumeLine__FP18JPAEmitterWorkData@ha /* 0x8027B220@ha */ -/* 8027BBDC 38 04 B2 20 */ addi r0, r4, JPAVolumeLine__FP18JPAEmitterWorkData@l /* 0x8027B220@l */ -/* 8027BBE0 90 03 00 04 */ stw r0, 4(r3) -/* 8027BBE4 4E 80 00 20 */ blr diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h index fc2d86cd9ba..a4c0ca50ed6 100644 --- a/include/JSystem/JGeometry.h +++ b/include/JSystem/JGeometry.h @@ -33,6 +33,22 @@ struct TVec3 { 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& a, const TVec3& b) { + x = a.x * b.x; + y = a.y * b.y; + z = a.z * b.z; + } }; template diff --git a/include/JSystem/JParticle/JPABaseShape.h b/include/JSystem/JParticle/JPABaseShape.h index 3a38c81bd77..a081b0c916d 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 f5ef5fa60ea..5f6edf0d303 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 aa424f49a99..8b3e441c193 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 7b72bbe1c77..ae0a07b8b2e 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*); diff --git a/include/dolphin/gx/GX.h b/include/dolphin/gx/GX.h index e98033adfab..9f24e2e7106 100644 --- a/include/dolphin/gx/GX.h +++ b/include/dolphin/gx/GX.h @@ -922,7 +922,13 @@ inline void GXColor1u32(u32 c) { GFX_FIFO(u32) = c; } +inline void GXTexCoord2f32(f32 s, f32 t) { + GFX_FIFO(f32) = s; + GFX_FIFO(f32) = t; +} + inline void GXEnd() {} + }; #endif diff --git a/libs/JSystem/JParticle/JPABaseShape.cpp b/libs/JSystem/JParticle/JPABaseShape.cpp index 6d60f7a479f..158ac11b4fe 100644 --- a/libs/JSystem/JParticle/JPABaseShape.cpp +++ b/libs/JSystem/JParticle/JPABaseShape.cpp @@ -906,6 +906,22 @@ asm void JPADrawRotation(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) /* 80279110-802791B0 273A50 00A0+00 0/0 1/1 0/0 .text * JPADrawPoint__FP18JPAEmitterWorkDataP15JPABaseParticle */ +#ifdef NONMATCHING +// literal only +void JPADrawPoint(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + if (!!(ptcl->mStatus & JPAPtclStts_Invisible)) + return; + + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXBegin(GX_POINTS, GX_VTXFMT1, 1); + GXPosition3f32(ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z); + GXTexCoord2f32(0.0f, 0.0f); + GXEnd(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX8); + GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -914,6 +930,7 @@ asm void JPADrawPoint(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { #include "asm/JSystem/JParticle/JPABaseShape/JPADrawPoint__FP18JPAEmitterWorkDataP15JPABaseParticle.s" } #pragma pop +#endif /* 802791B0-80279364 273AF0 01B4+00 0/0 1/1 0/0 .text * JPADrawLine__FP18JPAEmitterWorkDataP15JPABaseParticle */ @@ -979,14 +996,12 @@ asm void JPADrawEmitterCallBackB(JPAEmitterWorkData* param_0) { /* 8027A414-8027A454 274D54 0040+00 0/0 1/1 0/0 .text * JPADrawParticleCallBack__FP18JPAEmitterWorkDataP15JPABaseParticle */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JPADrawParticleCallBack(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { - nofralloc -#include "asm/JSystem/JParticle/JPABaseShape/JPADrawParticleCallBack__FP18JPAEmitterWorkDataP15JPABaseParticle.s" +void JPADrawParticleCallBack(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + if (work->mpEmtr->mpPtclCallBack == NULL) + return; + + work->mpEmtr->mpPtclCallBack->draw(work->mpEmtr, ptcl); } -#pragma pop /* 8027A454-8027A6DC 274D94 0288+00 1/1 0/0 0/0 .text * makeColorTable__FPP8_GXColorPC16JPAClrAnmKeyDataUcsP7JKRHeap */ diff --git a/libs/JSystem/JParticle/JPAChildShape.cpp b/libs/JSystem/JParticle/JPAChildShape.cpp index 01b145b335e..8c982c3f556 100644 --- a/libs/JSystem/JParticle/JPAChildShape.cpp +++ b/libs/JSystem/JParticle/JPAChildShape.cpp @@ -7,81 +7,59 @@ #include "JSystem/JParticle/JPAParticle.h" #include "dol2asm.h" #include "dolphin/types.h" +#include "dolphin/os/OS.h" // // Types: // -struct JPAChildShape { -public: - /* 8027B038 */ JPAChildShape(u8 const*); - -public: - u8 const* mpData; -}; - // // Forward References: // -extern "C" void JPARegistChildPrmEnv__FP18JPAEmitterWorkData(); -extern "C" void JPACalcChildAlphaOut__FP18JPAEmitterWorkDataP15JPABaseParticle(); -extern "C" void JPACalcChildScaleOut__FP18JPAEmitterWorkDataP15JPABaseParticle(); -extern "C" void __ct__13JPAChildShapeFPCUc(); - // // Declarations: // +static inline u32 COLOR_MULTI(u32 a, u32 b) { + return ((a * (b + 1)) * 0x10000) >> 24; +} + /* 8027AEBC-8027AFDC 2757FC 0120+00 0/0 1/1 0/0 .text JPARegistChildPrmEnv__FP18JPAEmitterWorkData */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JPARegistChildPrmEnv(JPAEmitterWorkData* param_0) { - nofralloc -#include "asm/JSystem/JParticle/JPAChildShape/JPARegistChildPrmEnv__FP18JPAEmitterWorkData.s" +void JPARegistChildPrmEnv(JPAEmitterWorkData* work) { + JPAChildShape* csp = work->mpRes->getCsp(); + JPABaseEmitter* emtr = work->mpEmtr; + GXColor prm, env; + csp->getPrmClr(&prm); + csp->getEnvClr(&env); + prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r); + prm.g = COLOR_MULTI(prm.g, emtr->mGlobalPrmClr.g); + prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b); + prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a); + env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r); + env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g); + env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b); + GXSetTevColor(GX_TEVREG0, prm); + GXSetTevColor(GX_TEVREG1, env); } -#pragma pop - -/* ############################################################################################## */ -/* 80455308-8045530C 003908 0004+00 1/1 0/0 0/0 .sdata2 @2318 */ -SECTION_SDATA2 static f32 lit_2318 = 255.0f; - -/* 8045530C-80455310 00390C 0004+00 2/2 0/0 0/0 .sdata2 @2319 */ -SECTION_SDATA2 static f32 lit_2319 = 1.0f; /* 8027AFDC-8027B008 27591C 002C+00 0/0 1/1 0/0 .text * JPACalcChildAlphaOut__FP18JPAEmitterWorkDataP15JPABaseParticle */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JPACalcChildAlphaOut(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { - nofralloc -#include "asm/JSystem/JParticle/JPAChildShape/JPACalcChildAlphaOut__FP18JPAEmitterWorkDataP15JPABaseParticle.s" +void JPACalcChildAlphaOut(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + f32 anm = (1.0f - ptcl->mTime) * 255.0f; + OSf32tou8(&anm, &ptcl->mPrmColorAlphaAnm); } -#pragma pop /* 8027B008-8027B038 275948 0030+00 0/0 1/1 0/0 .text * JPACalcChildScaleOut__FP18JPAEmitterWorkDataP15JPABaseParticle */ -#ifdef NONMATCHING void JPACalcChildScaleOut(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { // literal ptcl->mParticleScaleX = ptcl->mScaleOut * (1.0f - ptcl->mTime); ptcl->mParticleScaleY = ptcl->mAlphaWaveRandom * (1.0f - ptcl->mTime); } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JPACalcChildScaleOut(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { - nofralloc -#include "asm/JSystem/JParticle/JPAChildShape/JPACalcChildScaleOut__FP18JPAEmitterWorkDataP15JPABaseParticle.s" -} -#pragma pop -#endif /* 8027B038-8027B040 -00001 0008+00 0/0 0/0 0/0 .text __ct__13JPAChildShapeFPCUc */ JPAChildShape::JPAChildShape(u8 const* pData) { - mpData = pData; + mpData = (JPAChildShapeData*)pData; } diff --git a/libs/JSystem/JParticle/JPADynamicsBlock.cpp b/libs/JSystem/JParticle/JPADynamicsBlock.cpp index 100a8653777..a4576e49032 100644 --- a/libs/JSystem/JParticle/JPADynamicsBlock.cpp +++ b/libs/JSystem/JParticle/JPADynamicsBlock.cpp @@ -4,6 +4,8 @@ // #include "JSystem/JParticle/JPADynamicsBlock.h" +#include "JSystem/JParticle/JPAParticle.h" +#include "JSystem/JMath/JMATrigonometric.h" #include "dol2asm.h" #include "dolphin/types.h" @@ -11,27 +13,17 @@ // Types: // -struct JPAEmitterWorkData {}; - -struct JPABaseEmitter { - /* 8027EA40 */ void createParticle(); -}; - -struct JMath { - static u8 sincosTable_[65536]; -}; - // // Forward References: // -extern "C" static void JPAVolumePoint__FP18JPAEmitterWorkData(); -extern "C" static void JPAVolumeLine__FP18JPAEmitterWorkData(); -extern "C" static void JPAVolumeCircle__FP18JPAEmitterWorkData(); -extern "C" static void JPAVolumeCube__FP18JPAEmitterWorkData(); -extern "C" static void JPAVolumeSphere__FP18JPAEmitterWorkData(); -extern "C" static void JPAVolumeCylinder__FP18JPAEmitterWorkData(); -extern "C" static void JPAVolumeTorus__FP18JPAEmitterWorkData(); +extern "C" static void JPAVolumePoint(JPAEmitterWorkData*); +extern "C" static void JPAVolumeLine(JPAEmitterWorkData*); +extern "C" static void JPAVolumeCircle(JPAEmitterWorkData*); +extern "C" static void JPAVolumeCube(JPAEmitterWorkData*); +extern "C" static void JPAVolumeSphere(JPAEmitterWorkData*); +extern "C" static void JPAVolumeCylinder(JPAEmitterWorkData*); +extern "C" static void JPAVolumeTorus(JPAEmitterWorkData*); extern "C" void __ct__16JPADynamicsBlockFPCUc(); extern "C" void init__16JPADynamicsBlockFv(); extern "C" void create__16JPADynamicsBlockFP18JPAEmitterWorkData(); @@ -67,6 +59,17 @@ SECTION_SDATA2 static f32 lit_2289[1 + 1 /* padding */] = { }; /* 8027B144-8027B220 275A84 00DC+00 1/1 0/0 0/0 .text JPAVolumePoint__FP18JPAEmitterWorkData */ +#ifdef NONMATCHING + +// bug in diff.py preventing me from seeing what's wrong +void JPAVolumePoint(JPAEmitterWorkData* work) { + work->mVolumePos.zero(); + work->mVelOmni.set(work->mpEmtr->get_r_zh(), work->mpEmtr->get_r_zh(), work->mpEmtr->get_r_zh()); + work->mVelAxis.set(work->mVelOmni.x, 0.0f, work->mVelOmni.z); +} + +#else + #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -76,11 +79,30 @@ static asm void JPAVolumePoint(JPAEmitterWorkData* param_0) { } #pragma pop +#endif + /* ############################################################################################## */ /* 80455320-80455328 003920 0008+00 6/6 0/0 0/0 .sdata2 @2321 */ SECTION_SDATA2 static f64 lit_2321 = 4503601774854144.0 /* cast s32 to float */; /* 8027B220-8027B33C 275B60 011C+00 1/1 0/0 0/0 .text JPAVolumeLine__FP18JPAEmitterWorkData */ +#ifdef NONMATCHING + +// bug in diff.py preventing me from seeing what's wrong +void JPAVolumeLine(JPAEmitterWorkData* work) { + if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) { + work->mVolumePos.set(0.0f, 0.0f, work->mVolumeSize * (s32)((work->mVolumeEmitIdx / (work->mEmitCount - 1.0f) - 0.5f))); + work->mVolumeEmitIdx++; + } else { + work->mVolumePos.set(0.0f, 0.0f, work->mVolumeSize * work->mpEmtr->get_r_zh()); + } + + work->mVelOmni.set(0.0f, 0.0f, work->mVolumePos.z * work->mGlobalScl.z); + work->mVelAxis.set(0.0f, 0.0f, work->mVolumePos.z); +} + +#else + #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -90,7 +112,34 @@ static asm void JPAVolumeLine(JPAEmitterWorkData* param_0) { } #pragma pop +#endif + /* 8027B33C-8027B4E8 275C7C 01AC+00 1/1 0/0 0/0 .text JPAVolumeCircle__FP18JPAEmitterWorkData */ + +#ifdef NONMATCHING + +// bug in diff.py preventing me from seeing what's wrong +void JPAVolumeCircle(JPAEmitterWorkData* work) { + f32 theta, distance, sizeXZ; + if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) { + theta = work->mVolumeSweep * (work->mVolumeEmitIdx++ / work->mEmitCount); + } else { + theta = work->mVolumeSweep * work->mpEmtr->get_r_ss(); + } + + distance = work->mpEmtr->get_r_f(); + if (work->mpEmtr->checkFlag(JPADynFlag_FixedDensity)) { + distance = 1.0f - (distance * distance); + } + + sizeXZ = work->mVolumeSize * (work->mVolumeMinRad + distance * (1.0f - work->mVolumeMinRad)); + work->mVolumePos.set(sizeXZ * JMASSin(theta), 0.0f, sizeXZ * JMASCos(theta)); + work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl); + work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z); +} + +#else + #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -100,7 +149,22 @@ static asm void JPAVolumeCircle(JPAEmitterWorkData* param_0) { } #pragma pop +#endif + /* 8027B4E8-8027B5F0 275E28 0108+00 1/1 0/0 0/0 .text JPAVolumeCube__FP18JPAEmitterWorkData */ + +#ifdef NONMATCHING + +// bug in diff.py preventing me from seeing what's wrong +void JPAVolumeCube(JPAEmitterWorkData* work) { + f32 size = work->mVolumeSize; + work->mVolumePos.set(size * work->mpEmtr->get_r_zh(), size * work->mpEmtr->get_r_zh(), size * work->mpEmtr->get_r_zh()); + work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl); + work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z); +} + +#else + #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -110,6 +174,8 @@ static asm void JPAVolumeCube(JPAEmitterWorkData* param_0) { } #pragma pop +#endif + /* ############################################################################################## */ /* 80455328-80455330 003928 0004+04 1/1 0/0 0/0 .sdata2 @2501 */ SECTION_SDATA2 static f32 lit_2501[1 + 1 /* padding */] = { @@ -152,41 +218,94 @@ static asm void JPAVolumeTorus(JPAEmitterWorkData* param_0) { #pragma pop /* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JPADynamicsBlock::JPADynamicsBlock(u8 const* param_0) { - nofralloc -#include "asm/JSystem/JParticle/JPADynamicsBlock/__ct__16JPADynamicsBlockFPCUc.s" +JPADynamicsBlock::JPADynamicsBlock(u8 const* data) { + mpData = (const JPADynamicsBlockData*)data; + init(); } -#pragma pop -/* ############################################################################################## */ -/* 803C4488-803C44A8 -00001 001C+04 1/1 0/0 0/0 .data @2631 */ -SECTION_DATA static void* lit_2631[7 + 1 /* padding */] = { - (void*)(((char*)init__16JPADynamicsBlockFv) + 0x2C), - (void*)(((char*)init__16JPADynamicsBlockFv) + 0x3C), - (void*)(((char*)init__16JPADynamicsBlockFv) + 0x4C), - (void*)(((char*)init__16JPADynamicsBlockFv) + 0x5C), - (void*)(((char*)init__16JPADynamicsBlockFv) + 0x6C), - (void*)(((char*)init__16JPADynamicsBlockFv) + 0x7C), - (void*)(((char*)init__16JPADynamicsBlockFv) + 0x8C), - /* padding */ - NULL, +enum { + VOL_Cube = 0x00, + VOL_Sphere = 0x01, + VOL_Cylinder = 0x02, + VOL_Torus = 0x03, + VOL_Point = 0x04, + VOL_Circle = 0x05, + VOL_Line = 0x06, }; /* 8027BB4C-8027BBE8 27648C 009C+00 2/1 0/0 0/0 .text init__16JPADynamicsBlockFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JPADynamicsBlock::init() { - nofralloc -#include "asm/JSystem/JParticle/JPADynamicsBlock/init__16JPADynamicsBlockFv.s" +void JPADynamicsBlock::init() { + switch (getVolumeType()) { + case VOL_Cube: mpCalcVolumeFunc = &JPAVolumeCube; break; + case VOL_Sphere: mpCalcVolumeFunc = &JPAVolumeSphere; break; + case VOL_Cylinder: mpCalcVolumeFunc = &JPAVolumeCylinder; break; + case VOL_Torus: mpCalcVolumeFunc = &JPAVolumeTorus; break; + case VOL_Point: mpCalcVolumeFunc = &JPAVolumePoint; break; + case VOL_Circle: mpCalcVolumeFunc = &JPAVolumeCircle; break; + case VOL_Line: mpCalcVolumeFunc = &JPAVolumeLine; break; + } } -#pragma pop /* 8027BBE8-8027BDEC 276528 0204+00 0/0 1/1 0/0 .text * create__16JPADynamicsBlockFP18JPAEmitterWorkData */ + +#ifdef NONMATCHING + +// literal only +void JPADynamicsBlock::create(JPAEmitterWorkData* work) { + if (work->mpEmtr->checkStatus(JPAEmtrStts_RateStepEmit)) { + s32 emitCount; + s32 createCount; + + // Probably an inlined function. + if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) { + s32 count; + if (getVolumeType() == VOL_Sphere) { + count = 4 * getDivNumber() * getDivNumber() + 2; + } else { + count = getDivNumber(); + } + emitCount = count; + + work->mVolumeEmitIdx = 0; + } else { + f32 newPtclCount = work->mpEmtr->mRate * (getRateRndm() * work->mpEmtr->get_r_zp() + 1.0f); + f32 newEmitCount = work->mpEmtr->mEmitCount + newPtclCount; + work->mpEmtr->mEmitCount = newEmitCount; + emitCount = (s32)newEmitCount; + work->mpEmtr->mEmitCount -= emitCount; + + if (work->mpEmtr->checkStatus(JPAEmtrStts_FirstEmit) && 0.0f < newPtclCount && newPtclCount < 1.0f) + emitCount = 1; + } + + work->mEmitCount = emitCount; + if (work->mpEmtr->checkStatus(JPAEmtrStts_StopEmit)) { + emitCount = 0; + } + + // Probably an inlined function. + createCount = emitCount; + while (createCount > 0) { + JPABaseParticle* ptcl = work->mpEmtr->createParticle(); + if (ptcl == NULL) + break; + createCount--; + } + } + + if (++work->mpEmtr->mRateStepTimer >= (work->mpEmtr->mRateStep + 1)) { + work->mpEmtr->mRateStepTimer -= (work->mpEmtr->mRateStep + 1); + work->mpEmtr->setStatus(JPAEmtrStts_RateStepEmit); + } else { + work->mpEmtr->clearStatus(JPAEmtrStts_RateStepEmit); + } + + work->mpEmtr->clearStatus(JPAEmtrStts_FirstEmit); +} + +#else + #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -195,3 +314,5 @@ asm void JPADynamicsBlock::create(JPAEmitterWorkData* param_0) { #include "asm/JSystem/JParticle/JPADynamicsBlock/create__16JPADynamicsBlockFP18JPAEmitterWorkData.s" } #pragma pop + +#endif