From a962cdd14ac4520d72151c1b83b3e98d608e06be Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 27 Apr 2025 11:14:54 +0200 Subject: [PATCH] JPAEmitterManager OK --- config/SOUE01/splits.txt | 3 + config/SOUE01/symbols.txt | 40 +++--- configure.py | 2 +- include/JSystem/JParticle/JPABaseShape.h | 4 +- include/JSystem/JParticle/JPAChildShape.h | 2 +- include/JSystem/JParticle/JPADynamicsBlock.h | 6 +- include/JSystem/JParticle/JPAEmitter.h | 36 +++--- include/JSystem/JParticle/JPAEmitterManager.h | 24 ++-- include/JSystem/JParticle/JPAExTexShape.h | 2 +- include/JSystem/JParticle/JPAExtraShape.h | 4 +- include/JSystem/JParticle/JPAFieldBlock.h | 114 +++++++++--------- include/JSystem/JParticle/JPAKeyBlock.h | 4 +- include/JSystem/JParticle/JPAParticle.h | 14 +-- include/JSystem/JParticle/JPAResource.h | 28 ++--- include/JSystem/JParticle/JPAResourceLoader.h | 4 +- .../JSystem/JParticle/JPAResourceManager.h | 14 +-- include/JSystem/JUtility/JUTAssert.h | 12 +- include/egg/math/eggVector.h | 2 +- src/JSystem/JParticle/JPADynamicsBlock.cpp | 36 +++--- src/JSystem/JParticle/JPAEmitterManager.cpp | 51 +++++++- src/JSystem/JParticle/JPAExtraShape.cpp | 5 +- 21 files changed, 230 insertions(+), 177 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 62d2fba9..e0bcedf8 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1766,6 +1766,7 @@ JSystem/JParticle/JPABaseShape.cpp: JSystem/JParticle/JPAExtraShape.cpp: .text start:0x8031D540 end:0x8031DB98 align:16 + .sdata2 start:0x8057CE88 end:0x8057CEB0 JSystem/JParticle/JPAChildShape.cpp: .text start:0x8031DBA0 end:0x8031DD48 align:16 @@ -1775,6 +1776,7 @@ JSystem/JParticle/JPAExTexShape.cpp: JSystem/JParticle/JPADynamicsBlock.cpp: .text start:0x8031E0A0 end:0x8031F020 align:16 + .sdata2 start:0x8057CED8 end:0x8057CF00 JSystem/JParticle/JPAFieldBlock.cpp: .text start:0x8031F020 end:0x80320410 align:16 @@ -1794,6 +1796,7 @@ JSystem/JParticle/JPAResourceLoader.cpp: JSystem/JParticle/JPAEmitterManager.cpp: .text start:0x80320980 end:0x80321444 align:16 + .sdata2 start:0x8057CF18 end:0x8057CF20 JSystem/JParticle/JPAEmitter.cpp: .text start:0x80321450 end:0x80321C74 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 47d7d17d..847ca54a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -18523,7 +18523,7 @@ JPACalcScaleCopy__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031D640; / JPACalcScaleAnmNormal__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031D650; // type:function size:0xC JPACalcScaleAnmRepeatX__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031D660; // type:function size:0x64 JPACalcScaleAnmRepeatY__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031D6D0; // type:function size:0x64 -JPACalcScaleAnmReverseX__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031D740; // type:function size:0x94 +JPACalcScaleAnmReverseX__FP18JPAEmitterWorkDataPC15JPABaseParticle = .text:0x8031D740; // type:function size:0x94 JPACalcScaleAnmReverseY__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031D7E0; // type:function size:0x94 JPACalcAlphaAnm__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031D880; // type:function size:0x90 JPACalcAlphaFlickAnm__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031D910; // type:function size:0x148 @@ -18567,15 +18567,15 @@ prepare__12JPAFieldSpinFP18JPAEmitterWorkDataP13JPAFieldBlock = .text:0x8031FD80 calc__12JPAFieldSpinFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle = .text:0x8031FE30; // type:function size:0xE8 __ct__13JPAFieldBlockFPCUcPQ23EGG4Heap = .text:0x8031FF20; // type:function size:0x38 init__13JPAFieldBlockFPQ23EGG4Heap = .text:0x8031FF60; // type:function size:0x26C -fn_803201D0 = .text:0x803201D0; // type:function size:0x40 -fn_80320210 = .text:0x80320210; // type:function size:0x40 -fn_80320250 = .text:0x80320250; // type:function size:0x40 -fn_80320290 = .text:0x80320290; // type:function size:0x40 -fn_803202D0 = .text:0x803202D0; // type:function size:0x40 -fn_80320310 = .text:0x80320310; // type:function size:0x40 -fn_80320350 = .text:0x80320350; // type:function size:0x40 -fn_80320390 = .text:0x80320390; // type:function size:0x40 -fn_803203D0 = .text:0x803203D0; // type:function size:0x40 +__dt__12JPAFieldSpinFv = .text:0x803201D0; // type:function size:0x40 +__dt__18JPAFieldConvectionFv = .text:0x80320210; // type:function size:0x40 +__dt__12JPAFieldDragFv = .text:0x80320250; // type:function size:0x40 +__dt__14JPAFieldRandomFv = .text:0x80320290; // type:function size:0x40 +__dt__14JPAFieldVortexFv = .text:0x803202D0; // type:function size:0x40 +__dt__14JPAFieldNewtonFv = .text:0x80320310; // type:function size:0x40 +__dt__14JPAFieldMagnetFv = .text:0x80320350; // type:function size:0x40 +__dt__11JPAFieldAirFv = .text:0x80320390; // type:function size:0x40 +__dt__15JPAFieldGravityFv = .text:0x803203D0; // type:function size:0x40 __ct__11JPAKeyBlockFPCUc = .text:0x80320410; // type:function size:0x10 calc__11JPAKeyBlockFf = .text:0x80320420; // type:function size:0x94 __ct__10JPATextureFPCUc = .text:0x803204C0; // type:function size:0x60 @@ -18590,7 +18590,7 @@ __ct__25JSUList<14JPABaseEmitter>Fv = .text:0x80320CB0; // type:function size:0x __ct__26JPANode<15JPABaseParticle>Fv = .text:0x80320CE0; // type:function size:0x10 __dt__26JPANode<15JPABaseParticle>Fv = .text:0x80320CF0; // type:function size:0x40 createSimpleEmitterID__17JPAEmitterManagerFRCQ23EGG8Vector3fUsUcUcP18JPAEmitterCallBackP19JPAParticleCallBack = .text:0x80320D30; // type:function size:0xE4 -fn_80320E20 = .text:0x80320E20; // type:function size:0xB8 +fn_80320E20__17JPAEmitterManagerFUcff = .text:0x80320E20; // type:function size:0xB8 calc__17JPAEmitterManagerFUc = .text:0x80320EE0; // type:function size:0x88 draw__17JPAEmitterManagerFPC11JPADrawInfoUc = .text:0x80320F70; // type:function size:0x204 forceDeleteAllEmitter__17JPAEmitterManagerFv = .text:0x80321180; // type:function size:0x58 @@ -36220,15 +36220,15 @@ jpa_dl_x = .data:0x80546FA0; // type:object size:0x20 p_prj = .data:0x80546FC0; // type:object size:0xC p_direction = .data:0x80546FCC; // type:object size:0x1B4 jumptable_80547180 = .data:0x80547180; // type:object size:0x24 scope:local -lbl_805471A4 = .data:0x805471A4; // type:object size:0x14 -lbl_805471B8 = .data:0x805471B8; // type:object size:0x14 -lbl_805471CC = .data:0x805471CC; // type:object size:0x14 -lbl_805471E0 = .data:0x805471E0; // type:object size:0x14 -lbl_805471F4 = .data:0x805471F4; // type:object size:0x14 -lbl_80547208 = .data:0x80547208; // type:object size:0x14 -lbl_8054721C = .data:0x8054721C; // type:object size:0x14 -lbl_80547230 = .data:0x80547230; // type:object size:0x14 -lbl_80547244 = .data:0x80547244; // type:object size:0x14 +__vt__12JPAFieldSpin = .data:0x805471A4; // type:object size:0x14 +__vt__18JPAFieldConvection = .data:0x805471B8; // type:object size:0x14 +__vt__12JPAFieldDrag = .data:0x805471CC; // type:object size:0x14 +__vt__14JPAFieldRandom = .data:0x805471E0; // type:object size:0x14 +__vt__14JPAFieldVortex = .data:0x805471F4; // type:object size:0x14 +__vt__14JPAFieldNewton = .data:0x80547208; // type:object size:0x14 +__vt__14JPAFieldMagnet = .data:0x8054721C; // type:object size:0x14 +__vt__11JPAFieldAir = .data:0x80547230; // type:object size:0x14 +__vt__15JPAFieldGravity = .data:0x80547244; // type:object size:0x14 lbl_80547258 = .data:0x80547258; // type:object size:0xC lbl_80547268 = .data:0x80547268; // type:object size:0x9 scope:local data:string lbl_80547278 = .data:0x80547278; // type:object size:0x9 scope:local data:string diff --git a/configure.py b/configure.py index 5da06004..531df634 100644 --- a/configure.py +++ b/configure.py @@ -1219,7 +1219,7 @@ config.libs = [ Object(Matching, "JSystem/JParticle/JPAKeyBlock.cpp"), Object(Matching, "JSystem/JParticle/JPATexture.cpp"), Object(Matching, "JSystem/JParticle/JPAResourceLoader.cpp"), - Object(NonMatching, "JSystem/JParticle/JPAEmitterManager.cpp"), + Object(Matching, "JSystem/JParticle/JPAEmitterManager.cpp"), Object(NonMatching, "JSystem/JParticle/JPAEmitter.cpp"), Object(NonMatching, "JSystem/JParticle/JPAParticle.cpp"), Object(Matching, "JSystem/JParticle/JPAMath.cpp"), diff --git a/include/JSystem/JParticle/JPABaseShape.h b/include/JSystem/JParticle/JPABaseShape.h index 6c368ffe..dccd5338 100644 --- a/include/JSystem/JParticle/JPABaseShape.h +++ b/include/JSystem/JParticle/JPABaseShape.h @@ -53,8 +53,8 @@ struct JPABaseShapeAlphaArg { */ struct JPABaseShape { public: - /* 8027A6DC */ JPABaseShape(u8 const*, EGG::Heap*); - /* 8027A7E8 */ void setGX(JPAEmitterWorkData*) const; + JPABaseShape(u8 const*, EGG::Heap*); + void setGX(JPAEmitterWorkData*) const; static GXBlendMode st_bm[3]; static GXBlendFactor st_bf[10]; diff --git a/include/JSystem/JParticle/JPAChildShape.h b/include/JSystem/JParticle/JPAChildShape.h index 598ea3f3..5d63aa34 100644 --- a/include/JSystem/JParticle/JPAChildShape.h +++ b/include/JSystem/JParticle/JPAChildShape.h @@ -43,7 +43,7 @@ struct JPAChildShapeData { */ class JPAChildShape { public: - /* 8027B038 */ JPAChildShape(u8 const*); + JPAChildShape(u8 const*); f32 getPosRndm() const { return mpData->mPosRndm; } f32 getBaseVel() const { return mpData->mBaseVel; } diff --git a/include/JSystem/JParticle/JPADynamicsBlock.h b/include/JSystem/JParticle/JPADynamicsBlock.h index 689dc2b6..f1811246 100644 --- a/include/JSystem/JParticle/JPADynamicsBlock.h +++ b/include/JSystem/JParticle/JPADynamicsBlock.h @@ -62,9 +62,9 @@ enum { */ class JPADynamicsBlock { public: - /* 8027BB18 */ JPADynamicsBlock(u8 const*); - /* 8027BB4C */ void init(); - /* 8027BBE8 */ void create(JPAEmitterWorkData*); + JPADynamicsBlock(u8 const*); + void init(); + void create(JPAEmitterWorkData*); void calc(JPAEmitterWorkData* work) { mpCalcVolumeFunc(work); } diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index f220ddea..d6f84636 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -75,12 +75,12 @@ struct JPAEmitterWorkData { class JPAEmitterCallBack { public: virtual ~JPAEmitterCallBack() = 0; - /* 80050368 */ virtual void execute(JPABaseEmitter*) {} - /* 80050374 */ virtual void executeAfter(JPABaseEmitter*) {} - /* 8005036C */ virtual void draw(JPABaseEmitter*) {} - /* 80050370 */ virtual void drawAfter(JPABaseEmitter*) {} - - /* 8027E6A4 */ //~JPAEmitterCallBack(); + virtual void execute(JPABaseEmitter*) {} + virtual void executeAfter(JPABaseEmitter*) {} + virtual void draw(JPABaseEmitter*) {} + virtual void drawAfter(JPABaseEmitter*) {} + + //~JPAEmitterCallBack(); }; enum { @@ -100,18 +100,18 @@ enum { */ class JPABaseEmitter { public: - /* 8027E5EC */ ~JPABaseEmitter() {} - /* 8027E64C */ JPABaseEmitter() : mLink(this), mRndm(0) {} - /* 8027E6EC */ void init(JPAEmitterManager*, JPAResource*); - /* 8027EDD4 */ bool processTillStartFrame(); - /* 8027EE14 */ bool processTermination(); - /* 8027EEB0 */ void calcEmitterGlobalPosition(EGG::Vector3f*) const; - /* 8027EC60 */ void deleteAllParticle(); - /* 8027EB60 */ JPABaseParticle* createChild(JPABaseParticle*); - /* 8027EA40 */ JPABaseParticle* createParticle(); - /* 8027EF30 */ u32 getCurrentCreateNumber() const; - /* 8027EF40 */ u8 getDrawCount() const; - /* 8027EF50 */ bool loadTexture(u8, GXTexMapID); + ~JPABaseEmitter() {} + JPABaseEmitter() : mLink(this), mRndm(0) {} + void init(JPAEmitterManager*, JPAResource*); + bool processTillStartFrame(); + bool processTermination(); + void calcEmitterGlobalPosition(EGG::Vector3f*) const; + void deleteAllParticle(); + JPABaseParticle* createChild(JPABaseParticle*); + JPABaseParticle* createParticle(); + u32 getCurrentCreateNumber() const; + u8 getDrawCount() const; + bool loadTexture(u8, GXTexMapID); void initStatus(u32 status) { mStatus = status; } void setStatus(u32 status) { mStatus |= status; } diff --git a/include/JSystem/JParticle/JPAEmitterManager.h b/include/JSystem/JParticle/JPAEmitterManager.h index aa5113c9..f2085e80 100644 --- a/include/JSystem/JParticle/JPAEmitterManager.h +++ b/include/JSystem/JParticle/JPAEmitterManager.h @@ -21,17 +21,21 @@ struct JPAEmitterWorkData; */ class JPAEmitterManager { public: - /* 8027DCA0 */ JPAEmitterManager(u32, u32, EGG::Heap*, u8, u8); - /* 8027DEBC */ JPABaseEmitter* createSimpleEmitterID(EGG::Vector3f const&, u16, u8, u8, + JPAEmitterManager(u32, u32, EGG::Heap*, u8, u8); + JPABaseEmitter* createSimpleEmitterID(EGG::Vector3f const&, u16, u8, u8, JPAEmitterCallBack*, JPAParticleCallBack*); - /* 8027DFA0 */ void calc(u8); - /* 8027E028 */ void draw(JPADrawInfo const*, u8); - /* 8027E220 */ void forceDeleteAllEmitter(); - /* 8027E278 */ void forceDeleteGroupEmitter(u8); - /* 8027E2D8 */ void forceDeleteEmitter(JPABaseEmitter*); - /* 8027E344 */ void entryResourceManager(JPAResourceManager*, u8); - /* 8027E354 */ void clearResourceManager(u8); - /* 8027E3F4 */ void calcYBBCam(); + + ~JPAEmitterManager() {} + + void fn_80320E20(u8, f32, f32); // SS addition + void calc(u8); + void draw(JPADrawInfo const*, u8); + void forceDeleteAllEmitter(); + void forceDeleteGroupEmitter(u8); + void forceDeleteEmitter(JPABaseEmitter*); + void entryResourceManager(JPAResourceManager*, u8); + void clearResourceManager(u8); + void calcYBBCam(); JPAResourceManager* getResourceManager(u16 idx) { return pResMgrAry[idx]; } public: diff --git a/include/JSystem/JParticle/JPAExTexShape.h b/include/JSystem/JParticle/JPAExTexShape.h index 04a357b1..5efd0eac 100644 --- a/include/JSystem/JParticle/JPAExTexShape.h +++ b/include/JSystem/JParticle/JPAExTexShape.h @@ -27,7 +27,7 @@ struct JPAExTexShapeData { */ class JPAExTexShape { public: - /* 8027B13C */ JPAExTexShape(u8 const*); + JPAExTexShape(u8 const*); const f32* getIndTexMtx() const { return &mpData->mIndTexMtx[0][0]; } s8 getExpScale() const { return mpData->mExpScale; } diff --git a/include/JSystem/JParticle/JPAExtraShape.h b/include/JSystem/JParticle/JPAExtraShape.h index 186285e9..a567d768 100644 --- a/include/JSystem/JParticle/JPAExtraShape.h +++ b/include/JSystem/JParticle/JPAExtraShape.h @@ -46,8 +46,8 @@ struct JPAExtraShapeData { */ class JPAExtraShape { public: - /* 8027AD88 */ JPAExtraShape(u8 const*); - /* 8027ADBC */ void init(); + JPAExtraShape(u8 const*); + void init(); f32 getScaleInTiming() const { return mpData->mScaleInTiming; } f32 getScaleOutTiming() const { return mpData->mScaleOutTiming; } diff --git a/include/JSystem/JParticle/JPAFieldBlock.h b/include/JSystem/JParticle/JPAFieldBlock.h index 01ed4d62..108b8bf6 100644 --- a/include/JSystem/JParticle/JPAFieldBlock.h +++ b/include/JSystem/JParticle/JPAFieldBlock.h @@ -11,92 +11,92 @@ class JPAFieldBlock; class JPAFieldBase { public: - /* 8027BDEC */ void calcAffect(JPAFieldBlock*, JPABaseParticle*); - /* 8027BF18 */ f32 calcFadeAffect(JPAFieldBlock*, f32) const; + void calcAffect(JPAFieldBlock*, JPABaseParticle*); + f32 calcFadeAffect(JPAFieldBlock*, f32) const; - /* 8027D3AC */ virtual ~JPAFieldBase() {} - /* 80276A8C */ virtual void prepare(JPAEmitterWorkData*, JPAFieldBlock*) {} + virtual ~JPAFieldBase() {} + virtual void prepare(JPAEmitterWorkData*, JPAFieldBlock*) {} virtual void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*) = 0; /* 0x04 */ EGG::Vector3f mAccel; }; +class JPAFieldGravity : public JPAFieldBase { +public: + void prepare(JPAEmitterWorkData*, JPAFieldBlock*); + void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); + ~JPAFieldGravity() {} +}; + +class JPAFieldAir : public JPAFieldBase { +public: + void prepare(JPAEmitterWorkData*, JPAFieldBlock*); + void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); + ~JPAFieldAir() {} +}; + +class JPAFieldMagnet : public JPAFieldBase { +public: + void prepare(JPAEmitterWorkData*, JPAFieldBlock*); + void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); + ~JPAFieldMagnet() {} + + /* 0x10 */ EGG::Vector3f mDir; +}; + +class JPAFieldNewton : public JPAFieldBase { +public: + void prepare(JPAEmitterWorkData*, JPAFieldBlock*); + void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); + ~JPAFieldNewton() {} + + /* 0x10 */ EGG::Vector3f mDir; + /* 0x1C */ f32 mCutoff; +}; + class JPAFieldVortex : public JPAFieldBase { public: - /* 8027C56C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*); - /* 8027C674 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); - /* 8027D564 */ ~JPAFieldVortex() {} + void prepare(JPAEmitterWorkData*, JPAFieldBlock*); + void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); + ~JPAFieldVortex() {} /* 0x10 */ EGG::Vector3f field_0x10; /* 0x1C */ f32 field_0x1c; /* 0x20 */ f32 field_0x20; }; -class JPAFieldSpin : public JPAFieldBase { -public: - /* 8027CE64 */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*); - /* 8027CFA8 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); - /* 8027D3F4 */ ~JPAFieldSpin() {} - - /* 0x10 */ EGG::Vector3f field_0x10; - /* 0x1C */ EGG::Vector3f field_0x1c; - /* 0x28 */ EGG::Vector3f field_0x28; -}; - class JPAFieldRandom : public JPAFieldBase { public: - /* 8027CCCC */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); - /* 8027D4AC */ ~JPAFieldRandom() {} -}; - -class JPAFieldNewton : public JPAFieldBase { -public: - /* 8027C36C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*); - /* 8027C3E0 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); - /* 8027D5C0 */ ~JPAFieldNewton() {} - - /* 0x10 */ EGG::Vector3f mDir; - /* 0x1C */ f32 mCutoff; -}; - -class JPAFieldMagnet : public JPAFieldBase { -public: - /* 8027C24C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*); - /* 8027C29C */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); - /* 8027D61C */ ~JPAFieldMagnet() {} - - /* 0x10 */ EGG::Vector3f mDir; -}; - -class JPAFieldGravity : public JPAFieldBase { -public: - /* 8027BFB4 */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*); - /* 8027C054 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); - /* 8027D6D4 */ ~JPAFieldGravity() {} + void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); + ~JPAFieldRandom() {} }; class JPAFieldDrag : public JPAFieldBase { public: - /* 8027CDE4 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); - /* 8027D450 */ ~JPAFieldDrag() {} + void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); + ~JPAFieldDrag() {} }; class JPAFieldConvection : public JPAFieldBase { public: - /* 8027C814 */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*); - /* 8027CA94 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); - /* 8027D508 */ ~JPAFieldConvection() {} + void prepare(JPAEmitterWorkData*, JPAFieldBlock*); + void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); + ~JPAFieldConvection() {} /* 0x10 */ EGG::Vector3f field_0x10; /* 0x1C */ EGG::Vector3f field_0x1c; /* 0x28 */ EGG::Vector3f field_0x28; }; -class JPAFieldAir : public JPAFieldBase { +class JPAFieldSpin : public JPAFieldBase { public: - /* 8027C07C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*); - /* 8027C1B8 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); - /* 8027D678 */ ~JPAFieldAir() {} + void prepare(JPAEmitterWorkData*, JPAFieldBlock*); + void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*); + ~JPAFieldSpin() {} + + /* 0x10 */ EGG::Vector3f field_0x10; + /* 0x1C */ EGG::Vector3f field_0x1c; + /* 0x28 */ EGG::Vector3f field_0x28; }; // unknown name @@ -119,8 +119,8 @@ public: class JPAFieldBlock { public: - /* 8027D088 */ JPAFieldBlock(u8 const*, EGG::Heap*); - /* 8027D0C0 */ void init(EGG::Heap*); + JPAFieldBlock(u8 const*, EGG::Heap*); + void init(EGG::Heap*); u32 getType() { return mpData->mFlags & 0xF; } u32 getAddType() { return (mpData->mFlags >> 8) & 3; } diff --git a/include/JSystem/JParticle/JPAKeyBlock.h b/include/JSystem/JParticle/JPAKeyBlock.h index a9eb0fbb..005dc6c1 100644 --- a/include/JSystem/JParticle/JPAKeyBlock.h +++ b/include/JSystem/JParticle/JPAKeyBlock.h @@ -8,8 +8,8 @@ * */ struct JPAKeyBlock { - /* 8027D730 */ JPAKeyBlock(u8 const*); - /* 8027D740 */ f32 calc(f32); + JPAKeyBlock(u8 const*); + f32 calc(f32); u8 getID() { return mDataStart[8]; } diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index d1c96f9e..cc56b8e1 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -20,13 +20,13 @@ struct JPAEmitterWorkData; class JPABaseParticle { public: ~JPABaseParticle() {} - /* 8027EFEC */ void init_p(JPAEmitterWorkData*); - /* 8027F8C8 */ void init_c(JPAEmitterWorkData*, JPABaseParticle*); - /* 8027FFD0 */ bool calc_p(JPAEmitterWorkData*); - /* 80280260 */ bool calc_c(JPAEmitterWorkData*); - /* 802804C8 */ bool canCreateChild(JPAEmitterWorkData*); - /* 80280548 */ f32 getWidth(JPABaseEmitter const*) const; - /* 80280568 */ f32 getHeight(JPABaseEmitter const*) const; + void init_p(JPAEmitterWorkData*); + void init_c(JPAEmitterWorkData*, JPABaseParticle*); + bool calc_p(JPAEmitterWorkData*); + bool calc_c(JPAEmitterWorkData*); + bool canCreateChild(JPAEmitterWorkData*); + f32 getWidth(JPABaseEmitter const*) const; + f32 getHeight(JPABaseEmitter const*) const; int getAge() { return mAge; } void setOffsetPosition(const EGG::Vector3f& pos) { mOffsetPosition.set(pos); } void setOffsetPosition(f32 x, f32 y, f32 z) { mOffsetPosition.set(x, y, z); } diff --git a/include/JSystem/JParticle/JPAResource.h b/include/JSystem/JParticle/JPAResource.h index af46fa79..2d41f9b7 100644 --- a/include/JSystem/JParticle/JPAResource.h +++ b/include/JSystem/JParticle/JPAResource.h @@ -22,20 +22,20 @@ class JPAKeyBlock; */ class JPAResource { public: - /* 80274010 */ JPAResource(); - /* 80274080 */ void init(EGG::Heap*); - /* 802755E8 */ bool calc(JPAEmitterWorkData*, JPABaseEmitter*); - /* 80275A94 */ void draw(JPAEmitterWorkData*, JPABaseEmitter*); - /* 80275B74 */ void drawP(JPAEmitterWorkData*); - /* 80275EB0 */ void drawC(JPAEmitterWorkData*); - /* 802761A8 */ void setPTev(); - /* 8027642C */ void setCTev(JPAEmitterWorkData*); - /* 8027658C */ void calc_p(JPAEmitterWorkData*, JPABaseParticle*); - /* 80276608 */ void calc_c(JPAEmitterWorkData*, JPABaseParticle*); - /* 80276684 */ void calcField(JPAEmitterWorkData*, JPABaseParticle*); - /* 80276700 */ void calcKey(JPAEmitterWorkData*); - /* 80276840 */ void calcWorkData_c(JPAEmitterWorkData*); - /* 80276A0C */ void calcWorkData_d(JPAEmitterWorkData*); + JPAResource(); + void init(EGG::Heap*); + bool calc(JPAEmitterWorkData*, JPABaseEmitter*); + void draw(JPAEmitterWorkData*, JPABaseEmitter*); + void drawP(JPAEmitterWorkData*); + void drawC(JPAEmitterWorkData*); + void setPTev(); + void setCTev(JPAEmitterWorkData*); + void calc_p(JPAEmitterWorkData*, JPABaseParticle*); + void calc_c(JPAEmitterWorkData*, JPABaseParticle*); + void calcField(JPAEmitterWorkData*, JPABaseParticle*); + void calcKey(JPAEmitterWorkData*); + void calcWorkData_c(JPAEmitterWorkData*); + void calcWorkData_d(JPAEmitterWorkData*); JPABaseShape* getBsp() const { return mpBaseShape; } JPAExtraShape* getEsp() const { return mpExtraShape; } diff --git a/include/JSystem/JParticle/JPAResourceLoader.h b/include/JSystem/JParticle/JPAResourceLoader.h index 49cb6ce7..b5bb3022 100644 --- a/include/JSystem/JParticle/JPAResourceLoader.h +++ b/include/JSystem/JParticle/JPAResourceLoader.h @@ -7,8 +7,8 @@ class JPAResourceManager; class JPAResourceLoader { public: - /* 8027D8A0 */ JPAResourceLoader(u8 const*, JPAResourceManager*); - /* 8027D8E0 */ void load_jpc(u8 const*, JPAResourceManager*); + JPAResourceLoader(u8 const*, JPAResourceManager*); + void load_jpc(u8 const*, JPAResourceManager*); }; #endif /* JPARESOURCELOADER_H */ diff --git a/include/JSystem/JParticle/JPAResourceManager.h b/include/JSystem/JParticle/JPAResourceManager.h index 16ea8ef9..409bde87 100644 --- a/include/JSystem/JParticle/JPAResourceManager.h +++ b/include/JSystem/JParticle/JPAResourceManager.h @@ -14,13 +14,13 @@ class JPAResource; */ class JPAResourceManager { public: - /* 80273E10 */ JPAResourceManager(void const*, EGG::Heap*); - /* 80273E68 */ JPAResource* getResource(u16) const; - /* 80273EA8 */ bool checkUserIndexDuplication(u16) const; - /* 80273EEC */ const EGG::ResTIMG* swapTexture(EGG::ResTIMG const*, char const*); - /* 80273F8C */ void registRes(JPAResource*); - /* 80273FAC */ void registTex(JPATexture*); - /* 80273FCC */ u32 getResUserWork(u16) const; + JPAResourceManager(void const*, EGG::Heap*); + JPAResource* getResource(u16) const; + bool checkUserIndexDuplication(u16) const; + const EGG::ResTIMG* swapTexture(EGG::ResTIMG const*, char const*); + void registRes(JPAResource*); + void registTex(JPATexture*); + u32 getResUserWork(u16) const; void load(u16 idx, GXTexMapID texMapID) { mpTexArr[idx]->load(texMapID); } diff --git a/include/JSystem/JUtility/JUTAssert.h b/include/JSystem/JUtility/JUTAssert.h index 9418a9b9..c8459b1a 100644 --- a/include/JSystem/JUtility/JUTAssert.h +++ b/include/JSystem/JUtility/JUTAssert.h @@ -44,12 +44,12 @@ #endif namespace JUTAssertion { - /* 802E495C */ void create(); - /* 802E4960 */ u32 flush_subroutine(); - /* 802E499C */ void flushMessage(); - /* 802E4A54 */ void flushMessage_dbPrint(); - /* 802E4C34 */ void setVisible(bool); - /* 802E4C3C */ void setMessageCount(int); + void create(); + u32 flush_subroutine(); + void flushMessage(); + void flushMessage_dbPrint(); + void setVisible(bool); + void setMessageCount(int); u32 getSDevice(); void showAssert(u32 device, const char * file, int line, const char * assertion); diff --git a/include/egg/math/eggVector.h b/include/egg/math/eggVector.h index 1c8a220e..f1256a6a 100644 --- a/include/egg/math/eggVector.h +++ b/include/egg/math/eggVector.h @@ -48,7 +48,7 @@ struct Vector3f : public nw4r::math::VEC3 { return Vector3f(-x, -y, -z); } - Vector3f operator-(const Vector3f &v) { + Vector3f operator-(const Vector3f &v) const { return Vector3f(x - v.x, y - v.y, z - v.z); } diff --git a/src/JSystem/JParticle/JPADynamicsBlock.cpp b/src/JSystem/JParticle/JPADynamicsBlock.cpp index ab45d938..15b6f2f7 100644 --- a/src/JSystem/JParticle/JPADynamicsBlock.cpp +++ b/src/JSystem/JParticle/JPADynamicsBlock.cpp @@ -4,8 +4,9 @@ // #include "JSystem/JParticle/JPADynamicsBlock.h" -#include "JSystem/JMath/JMATrigonometric.h" + #include "JSystem/JParticle/JPAEmitter.h" +#include "nw4r/math/math_triangular.h" /* 8027B144-8027B220 275A84 00DC+00 1/1 0/0 0/0 .text JPAVolumePoint__FP18JPAEmitterWorkData */ void JPAVolumePoint(JPAEmitterWorkData* work) { @@ -53,9 +54,10 @@ void JPAVolumeCircle(JPAEmitterWorkData* work) { } distance = work->mVolumeSize * (work->mVolumeMinRad + distance * (1.0f - work->mVolumeMinRad)); - work->mVolumeCalcData.mVolumePos.set(distance * JMASSin(theta), 0.0f, - distance * JMASCos(theta)); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVolumePos.set(distance * nw4r::math::SinIdx(theta), 0.0f, + distance * nw4r::math::CosIdx(theta)); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -65,7 +67,8 @@ void JPAVolumeCube(JPAEmitterWorkData* work) { work->mVolumeCalcData.mVolumePos.set(work->mpEmtr->get_r_zh() * work->mVolumeSize, work->mpEmtr->get_r_zh() * work->mVolumeSize, work->mpEmtr->get_r_zh() * work->mVolumeSize); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -97,9 +100,10 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) { rnd = 1.0f - rnd * rnd * rnd; } f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad)); - work->mVolumeCalcData.mVolumePos.set(rad * JMASCos(phi) * JMASSin(theta), -rad * JMASSin(phi), - rad * JMASCos(phi) * JMASCos(theta)); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVolumePos.set(rad * nw4r::math::CosIdx(phi) * nw4r::math::SinIdx(theta), -rad * nw4r::math::SinIdx(phi), + rad * nw4r::math::CosIdx(phi) * nw4r::math::CosIdx(theta)); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -113,8 +117,9 @@ static void JPAVolumeCylinder(JPAEmitterWorkData* work) { } f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad)); work->mVolumeCalcData.mVolumePos.set( - rad * JMASSin(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * JMASCos(theta)); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + rad * nw4r::math::SinIdx(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * nw4r::math::CosIdx(theta)); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -124,13 +129,14 @@ static void JPAVolumeTorus(JPAEmitterWorkData* work) { s16 theta = work->mVolumeSweep * work->mpEmtr->get_r_ss(); s16 phi = work->mpEmtr->get_r_ss(); f32 rad = work->mVolumeSize * work->mVolumeMinRad; - work->mVolumeCalcData.mVelAxis.set(rad * JMASSin(theta) * JMASCos(phi), rad * JMASSin(phi), - rad * JMASCos(theta) * JMASCos(phi)); + work->mVolumeCalcData.mVelAxis.set(rad * nw4r::math::SinIdx(theta) * nw4r::math::CosIdx(phi), rad * nw4r::math::SinIdx(phi), + rad * nw4r::math::CosIdx(theta) * nw4r::math::CosIdx(phi)); work->mVolumeCalcData.mVolumePos.set( - work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * JMASSin(theta), + work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * nw4r::math::SinIdx(theta), work->mVolumeCalcData.mVelAxis.y, - work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * JMASCos(theta)); - // work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * nw4r::math::CosIdx(theta)); + work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; + work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; } /* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */ diff --git a/src/JSystem/JParticle/JPAEmitterManager.cpp b/src/JSystem/JParticle/JPAEmitterManager.cpp index 6d39cf80..54f4a874 100644 --- a/src/JSystem/JParticle/JPAEmitterManager.cpp +++ b/src/JSystem/JParticle/JPAEmitterManager.cpp @@ -3,6 +3,8 @@ // Translation Unit: JPAEmitterManager // +#include "JSystem/JParticle/JPAList.h" +#include "JSystem/JSupport/JSUList.h" #include "egg/core/eggHeap.h" #include "JSystem/JParticle/JPAEmitterManager.h" #include "JSystem/JParticle/JPAEmitter.h" @@ -10,6 +12,8 @@ #include "JSystem/JParticle/JPAResourceManager.h" #include "JSystem/JUtility/JUTAssert.h" #include "egg/math/eggVector.h" +#include "rvl/GX/GXTransform.h" +#include "rvl/GX/GXTypes.h" #include "rvl/GX.h" /* 8027DCA0-8027DEBC 2785E0 021C+00 0/0 1/1 0/0 .text __ct__17JPAEmitterManagerFUlUlP7EGG::HeapUcUc @@ -23,25 +27,25 @@ JPAEmitterManager::JPAEmitterManager(u32 i_ptclNum, u32 i_emtrNum, EGG::Heap* pH JUT_ASSERT(40, emtrNum && ptclNum && gidMax && ridMax); - JPABaseEmitter* p_emtr_link = new (pHeap, 0) JPABaseEmitter[emtrNum]; + JPABaseEmitter* p_emtr_link = new (pHeap, 4) JPABaseEmitter[emtrNum]; JUT_ASSERT(44, p_emtr_link); for (u32 i = 0; i < emtrNum; i++) mFreeEmtrList.prepend(&p_emtr_link[i].mLink); - JPANode* p_ptcl_node = new (pHeap, 0) JPANode[ptclNum]; + JPANode* p_ptcl_node = new (pHeap, 4) JPANode[ptclNum]; JUT_ASSERT(51, p_ptcl_node); for (u32 i = 0; i < ptclNum; i++) mPtclPool.push_back(&p_ptcl_node[i]); - pEmtrUseList = new (pHeap, 0) JSUList[gidMax]; + pEmtrUseList = new (pHeap, 4) JSUList[gidMax]; JUT_ASSERT(58, pEmtrUseList); - pResMgrAry = new (pHeap, 0) JPAResourceManager*[ridMax]; + pResMgrAry = new (pHeap, 4) JPAResourceManager*[ridMax]; JUT_ASSERT(62, pResMgrAry) for (int i = 0; i < ridMax; i++) { pResMgrAry[i] = NULL; } - pWd = new (pHeap, 0) JPAEmitterWorkData(); + pWd = new (pHeap, 4) JPAEmitterWorkData(); JUT_ASSERT(67, pWd); } @@ -79,6 +83,41 @@ JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(EGG::Vector3f const& po return NULL; } +// SS addition +void JPAEmitterManager::fn_80320E20(u8 group_id, f32 of_x, f32 of_z) { + JSULink *pNext = NULL; + for (JSULink *pLink = pEmtrUseList[group_id].getFirst(); pLink != pEmtrUseList[group_id].getEnd(); + pLink = pNext) { + pNext = pLink->getNext(); + JPABaseEmitter *pEmit = pLink->getObject(); + + EGG::Vector3f offset; + JPANode *pNextBase = NULL; + + for (JPANode *baseLink = pEmit->mAlivePtclBase.getFirst(); + baseLink != pEmit->mAlivePtclBase.getEnd(); baseLink = pNextBase) { + pNextBase = baseLink->getNext(); + + JPABaseParticle *o = baseLink->getObject(); + o->getOffsetPosition(offset); + offset.x += of_x; + offset.z += of_z; + o->setOffsetPosition(offset); + } + + for (JPANode *childLink = pEmit->mAlivePtclChld.getFirst(); + childLink != pEmit->mAlivePtclChld.getEnd(); childLink = pNextBase) { + pNextBase = childLink->getNext(); + + JPABaseParticle *o = childLink->getObject(); + o->getOffsetPosition(offset); + offset.x += of_x; + offset.z += of_z; + o->setOffsetPosition(offset); + } + } +} + /* 8027DFA0-8027E028 2788E0 0088+00 0/0 3/3 0/0 .text calc__17JPAEmitterManagerFUc */ void JPAEmitterManager::calc(u8 group_id) { JUT_ASSERT(154, group_id < gidMax); @@ -130,6 +169,8 @@ void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 group_id) { emtr->mpRes->draw(pWd, emtr); } } + + GXSetClipMode(GX_CLIP_ENABLE); } /* 8027E220-8027E278 278B60 0058+00 0/0 1/1 0/0 .text forceDeleteAllEmitter__17JPAEmitterManagerFv diff --git a/src/JSystem/JParticle/JPAExtraShape.cpp b/src/JSystem/JParticle/JPAExtraShape.cpp index 5271261a..0c0e8bf5 100644 --- a/src/JSystem/JParticle/JPAExtraShape.cpp +++ b/src/JSystem/JParticle/JPAExtraShape.cpp @@ -4,10 +4,9 @@ // #include "JSystem/JParticle/JPAExtraShape.h" -#include "JSystem/JMath/JMATrigonometric.h" #include "JSystem/JParticle/JPAParticle.h" #include "JSystem/JParticle/JPAEmitter.h" -#include "rvl/OS.h" +#include "nw4r/math/math_triangular.h" /* 8027A918-8027A990 275258 0078+00 0/0 1/1 0/0 .text * JPACalcScaleX__FP18JPAEmitterWorkDataP15JPABaseParticle */ @@ -116,7 +115,7 @@ void JPACalcAlphaFlickAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { alpha = esp->getAlphaBaseValue(); } s32 theta = ptcl->mAlphaWaveRandom * ptcl->mAge * 16384.0f * (1.0f - esp->getAlphaFreq()); - f32 wave = JMASSin(theta); + f32 wave = nw4r::math::SinIdx(theta); alpha *= (1.0f + esp->getAlphaAmp() * (wave - 1.0f) * 0.5f) * 255.0f; OSf32tou8(&alpha, &ptcl->mPrmColorAlphaAnm); }