From ca2f6bde481292758263f5898a07da512f75b0ee Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 27 Apr 2025 14:29:38 +0200 Subject: [PATCH] JPADynamicsBlock OK --- config/SOUE01/splits.txt | 4 ++ config/SOUE01/symbols.txt | 12 ++-- configure.py | 4 +- include/JSystem/JParticle/JPABaseShape.h | 18 +++-- include/JSystem/JParticle/JPAExTexShape.h | 10 ++- include/JSystem/JParticle/JPAParticle.h | 2 +- include/egg/math/eggVector.h | 4 ++ src/JSystem/JParticle/JPABaseShape.cpp | 77 ++++++++++++---------- src/JSystem/JParticle/JPADynamicsBlock.cpp | 18 +++-- src/JSystem/JParticle/JPAExTexShape.cpp | 4 ++ src/JSystem/JParticle/JPAResource.cpp | 57 +++++++++++----- 11 files changed, 136 insertions(+), 74 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 119877f1..116c9361 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1759,9 +1759,13 @@ JSystem/JParticle/JPAResourceManager.cpp: JSystem/JParticle/JPAResource.cpp: .text start:0x80316C10 end:0x803198A0 align:16 + .data start:0x80546D60 end:0x80546F80 + .sdata2 start:0x8057CE38 end:0x8057CE50 JSystem/JParticle/JPABaseShape.cpp: .text start:0x803198A0 end:0x8031D53C align:16 + .data start:0x80546F80 end:0x80547180 + .sdata start:0x80574008 end:0x80574010 .sdata2 start:0x8057CE50 end:0x8057CE88 JSystem/JParticle/JPAExtraShape.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 9d4f00e8..fcd3cc0f 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -18467,7 +18467,7 @@ JPAGenTexCrdMtxAnm__FP18JPAEmitterWorkData = .text:0x8031A400; // type:function JPAGenTexCrdMtxPrj__FP18JPAEmitterWorkData = .text:0x8031A420; // type:function size:0x1C JPAGenCalcTexCrdMtxAnm__FP18JPAEmitterWorkData = .text:0x8031A440; // type:function size:0x244 JPALoadCalcTexCrdMtxAnm__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031A690; // type:function size:0x22C -fn_8031A8C0 = .text:0x8031A8C0; // type:function size:0x4C +fn_8031A8C0__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031A8C0; // type:function size:0x4C JPALoadTex__FP18JPAEmitterWorkData = .text:0x8031A910; // type:function size:0x38 JPALoadTexAnm__FP18JPAEmitterWorkData = .text:0x8031A950; // type:function size:0x34 JPALoadTexAnm__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031A990; // type:function size:0x30 @@ -18509,7 +18509,7 @@ JPADrawPoint__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031C080; // ty JPADrawLine__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031C120; // type:function size:0x174 getNext__FP26JPANode<15JPABaseParticle> = .text:0x8031C2A0; // type:function size:0x8 getPrev__FP26JPANode<15JPABaseParticle> = .text:0x8031C2B0; // type:function size:0x8 -fn_8031C2C0 = .text:0x8031C2C0; // type:function size:0x4C +fn_8031C2C0__FP18JPAEmitterWorkData = .text:0x8031C2C0; // type:function size:0x4C JPADrawStripe__FP18JPAEmitterWorkData = .text:0x8031C310; // type:function size:0x4CC JPADrawStripeX__FP18JPAEmitterWorkData = .text:0x8031C7E0; // type:function size:0x844 JPADrawEmitterCallBackB__FP18JPAEmitterWorkData = .text:0x8031D030; // type:function size:0x24 @@ -18536,7 +18536,7 @@ JPACalcChildScaleOut__FP18JPAEmitterWorkDataP15JPABaseParticle = .text:0x8031DD1 __ct__13JPAChildShapeFPCUc = .text:0x8031DD40; // type:function size:0x8 JPALoadExTex__FP18JPAEmitterWorkData = .text:0x8031DD50; // type:function size:0x114 __ct__13JPAExTexShapeFPCUc = .text:0x8031DE70; // type:function size:0x8 -fn_8031DE80 = .text:0x8031DE80; // type:function size:0x214 +fn_8031DE80__13JPAExTexShapeFP12JPABaseShapef = .text:0x8031DE80; // type:function size:0x214 JPAVolumePoint__FP18JPAEmitterWorkData = .text:0x8031E0A0; // type:function size:0xD4 JPAVolumeLine__FP18JPAEmitterWorkData = .text:0x8031E180; // type:function size:0x114 JPAVolumeCircle__FP18JPAEmitterWorkData = .text:0x8031E2A0; // type:function size:0x204 @@ -36210,12 +36210,12 @@ lbl_80546548 = .data:0x80546548; // type:object size:0x200 data:4byte lbl_80546748 = .data:0x80546748; // type:object size:0x190 lbl_805468D8 = .data:0x805468D8; // type:object size:0x3F0 lbl_80546CC8 = .data:0x80546CC8; // type:object size:0x98 -lbl_80546D60 = .data:0x80546D60; // type:object size:0x160 +lbl_80546D60 = .data:0x80546D60; // type:object size:0x144 JParticle__jpa_crd = .data:0x80546EC0; // type:object size:0x20 jumptable_80546EE0 = .data:0x80546EE0; // type:object size:0x2C scope:local jumptable_80546F0C = .data:0x80546F0C; // type:object size:0x2C scope:local -jumptable_80546F38 = .data:0x80546F38; // type:object size:0x48 scope:local -jpa_dl = .data:0x80546F80; // type:object size:0x20 +jumptable_80546F38 = .data:0x80546F38; // type:object size:0x2C scope:local +jpa_dl = .data:0x80546F80; // type:object size:0x20 align:32 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 diff --git a/configure.py b/configure.py index f4cc30f3..4982612b 100644 --- a/configure.py +++ b/configure.py @@ -1209,12 +1209,12 @@ config.libs = [ "JParticle", [ Object(Matching, "JSystem/JParticle/JPAResourceManager.cpp"), - Object(NonMatching, "JSystem/JParticle/JPAResource.cpp"), + Object(Matching, "JSystem/JParticle/JPAResource.cpp"), Object(NonMatching, "JSystem/JParticle/JPABaseShape.cpp"), Object(Matching, "JSystem/JParticle/JPAExtraShape.cpp"), Object(Matching, "JSystem/JParticle/JPAChildShape.cpp"), Object(NonMatching, "JSystem/JParticle/JPAExTexShape.cpp"), - Object(NonMatching, "JSystem/JParticle/JPADynamicsBlock.cpp"), + Object(Matching, "JSystem/JParticle/JPADynamicsBlock.cpp"), Object(NonMatching, "JSystem/JParticle/JPAFieldBlock.cpp"), Object(Matching, "JSystem/JParticle/JPAKeyBlock.cpp"), Object(Matching, "JSystem/JParticle/JPATexture.cpp"), diff --git a/include/JSystem/JParticle/JPABaseShape.h b/include/JSystem/JParticle/JPABaseShape.h index dccd5338..de68f2b7 100644 --- a/include/JSystem/JParticle/JPABaseShape.h +++ b/include/JSystem/JParticle/JPABaseShape.h @@ -91,13 +91,13 @@ public: u32 getTilingT() const { return (mpData->mFlags >> 28) & 0x01; } // was 26 BOOL isGlblClrAnm() const { return mpData->mFlags & 0x00001000; } BOOL isGlblTexAnm() const { return mpData->mFlags & 0x00004000; } - BOOL isPrjTex() const { return mpData->mFlags & 0x00100000; } - bool isDrawFwdAhead() const { return !!(mpData->mFlags & 0x00200000); } - bool isDrawPrntAhead() const { return !!(mpData->mFlags & 0x00400000); } - bool isClipOn() const { return !!(mpData->mFlags & 0x00800000); } - BOOL isTexCrdAnm() const { return mpData->mFlags & 0x01000000; } - bool isNoDrawParent() const { return !!(mpData->mFlags & 0x08000000); } - bool isNoDrawChild() const { return !!(mpData->mFlags & 0x10000000); } + BOOL isPrjTex() const { return mpData->mFlags & 0x00400000; } // was 0x00100000 + bool isDrawFwdAhead() const { return !!(mpData->mFlags & 0x00800000); } // was 0x00200000 + bool isDrawPrntAhead() const { return !!(mpData->mFlags & 0x01000000); } // was 0x00400000 + BOOL isClipOn() const { return (mpData->mFlags & 0x02000000); } // was 0x00800000 + BOOL isTexCrdAnm() const { return mpData->mFlags & 0x04000000; } // was 0x01000000 + bool isNoDrawParent() const { return !!((mpData->mFlags >> 29) & 1); } // was 0x08000000 + bool isNoDrawChild() const { return !!((mpData->mFlags >> 30) & 1); } // was 0x10000000 BOOL isPrmAnm() const { return mpData->mClrFlg & 0x02; } BOOL isEnvAnm() const { return mpData->mClrFlg & 0x08; } @@ -177,6 +177,8 @@ void JPACalcClrIdxMerge(JPAEmitterWorkData*, JPABaseParticle*); void JPACalcClrIdxRandom(JPAEmitterWorkData*, JPABaseParticle*); void JPACalcColorCopy(JPAEmitterWorkData*, JPABaseParticle*); +// SS addition +void fn_8031C2C0(JPAEmitterWorkData*); void JPADrawStripe(JPAEmitterWorkData*); void JPADrawStripeX(JPAEmitterWorkData*); void JPADrawEmitterCallBackB(JPAEmitterWorkData*); @@ -208,6 +210,8 @@ void JPALoadTexAnm(JPAEmitterWorkData*, JPABaseParticle*); void JPASetPointSize(JPAEmitterWorkData*, JPABaseParticle*); void JPASetLineWidth(JPAEmitterWorkData*, JPABaseParticle*); void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData*, JPABaseParticle*); +// SS addition +void fn_8031A8C0(JPAEmitterWorkData*, JPABaseParticle*); void JPARegistAlpha(JPAEmitterWorkData*, JPABaseParticle*); void JPARegistEnv(JPAEmitterWorkData*, JPABaseParticle*); void JPARegistAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*); diff --git a/include/JSystem/JParticle/JPAExTexShape.h b/include/JSystem/JParticle/JPAExTexShape.h index 29e92344..91260f7d 100644 --- a/include/JSystem/JParticle/JPAExTexShape.h +++ b/include/JSystem/JParticle/JPAExTexShape.h @@ -1,6 +1,7 @@ #ifndef JPAEXTEXSHAPE_H #define JPAEXTEXSHAPE_H +#include "JSystem/JParticle/JPABaseShape.h" #include "common.h" class JPAEmitterWorkData; @@ -16,8 +17,9 @@ struct JPAExTexShapeData { /* 0x08 */ u32 mFlags; /* 0x0C */ f32 mIndTexMtx[2][3]; - /* 0x24 */ s8 mExpScale; - /* 0x25 */ u8 _0x25[0x4E - 0x25]; + /* 0x24 */ u8 _0x24[0x4C - 0x24]; + /* 0x4C */ u8 field_0x4C; + /* 0x4D */ s8 mExpScale; /* 0x4E */ s8 mIndTexIdx; /* 0x4F */ s8 mSecTexIdx; }; @@ -31,14 +33,16 @@ public: JPAExTexShape(u8 const*); const f32* getIndTexMtx() const { return &mpData->mIndTexMtx[0][0]; } + u8 getfield_0x4C() const { return mpData->field_0x4C; } s8 getExpScale() const { return mpData->mExpScale; } u8 getIndTexIdx() const { return mpData->mIndTexIdx; } u8 getSecTexIdx() const { return mpData->mSecTexIdx; } bool isUseIndirect() const { return !!(mpData->mFlags & 0x01); } - bool isUseSecTex() const { return !!(mpData->mFlags & 0x0100); } + BOOL isUseSecTex() const { return (mpData->mFlags & 0x0100); } public: const JPAExTexShapeData* mpData; + void fn_8031DE80(JPABaseShape *bsp, f32); }; void JPALoadExTex(JPAEmitterWorkData*); diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index cc56b8e1..b0430430 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -31,7 +31,7 @@ public: void setOffsetPosition(const EGG::Vector3f& pos) { mOffsetPosition.set(pos); } void setOffsetPosition(f32 x, f32 y, f32 z) { mOffsetPosition.set(x, y, z); } void getOffsetPosition(EGG::Vector3f& pos) { pos.set(mOffsetPosition); } - u16 getRotateAngle() const { return mRotateAngle; } + s16 getRotateAngle() const { return mRotateAngle; } void getGlobalPosition(EGG::Vector3f& pos) const { pos.set(mPosition); } f32 getParticleScaleX() const { return mParticleScaleX; } f32 getParticleScaleY() const { return mParticleScaleY; } diff --git a/include/egg/math/eggVector.h b/include/egg/math/eggVector.h index f1256a6a..34ccb324 100644 --- a/include/egg/math/eggVector.h +++ b/include/egg/math/eggVector.h @@ -36,6 +36,10 @@ struct Vector3f : public nw4r::math::VEC3 { return *this; } + void mul(const Vector3f &v, const Vector3f &w) { + set(v.x * w.x, v.y * w.y, v.z * w.z); + } + Vector3f &operator*=(const Vector3f &v) { set(x * v.x, y * v.y, z * v.z); return *this; diff --git a/src/JSystem/JParticle/JPABaseShape.cpp b/src/JSystem/JParticle/JPABaseShape.cpp index 48dd5951..6e600a1d 100644 --- a/src/JSystem/JParticle/JPABaseShape.cpp +++ b/src/JSystem/JParticle/JPABaseShape.cpp @@ -3,6 +3,7 @@ // Translation Unit: JPABaseShape // +#include "JSystem/JParticle/JPAExTexShape.h" #include "egg/core/eggHeap.h" #include "JSystem/JParticle/JPABaseShape.h" #include "JSystem/JParticle/JPAParticle.h" @@ -161,13 +162,11 @@ void JPACalcClrIdxNormal(JPAEmitterWorkData* work) { * JPACalcClrIdxNormal__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcClrIdxNormal(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); - s16 age = param_1->mAge; - s16 maxFrm = shape->getClrAnmMaxFrm(); s16 keyFrame; - if (age < maxFrm) { - keyFrame = age; + if (param_1->mAge < shape->getClrAnmMaxFrm()) { + keyFrame = param_1->mAge; } else { - keyFrame = maxFrm; + keyFrame = shape->getClrAnmMaxFrm(); } work->mClrKeyFrame = keyFrame; } @@ -183,8 +182,7 @@ void JPACalcClrIdxRepeat(JPAEmitterWorkData* work) { * JPACalcClrIdxRepeat__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcClrIdxRepeat(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); - s32 tick = shape->getClrLoopOfst(param_1->mAnmRandom); - tick = param_1->mAge + tick; + s32 tick = param_1->mAge + shape->getClrLoopOfst(param_1->mAnmRandom); work->mClrKeyFrame = tick % (shape->getClrAnmMaxFrm() + 1); } @@ -355,6 +353,10 @@ void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1) GXLoadTexMtxImm(local_108, 0x1e, GX_MTX2x4); } +void fn_8031A8C0(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + work->mpRes->getEts()->fn_8031DE80(work->mpRes->getBsp(), ptcl->getAge()); +} + /* 802778EC-80277940 27222C 0054+00 0/0 1/1 0/0 .text JPALoadTex__FP18JPAEmitterWorkData */ void JPALoadTex(JPAEmitterWorkData* work) { @@ -508,13 +510,13 @@ static void loadPrjAnm(JPAEmitterWorkData const* work, const Mtx srt) { } /* 803C42E0-803C4300 021400 0020+00 10/9 0/0 0/0 .data jpa_dl */ -static u8 jpa_dl[32] = { +static u8 ALIGN_DECL(32) jpa_dl[32] = { 0x80, 0x00, 0x04, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; /* 803C4300-803C4320 021420 0020+00 1/0 0/0 0/0 .data jpa_dl_x */ -static u8 jpa_dl_x[32] = { +static u8 ALIGN_DECL(32) jpa_dl_x[32] = { 0x80, 0x00, 0x08, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x48, 0x00, 0x49, 0x01, 0x4A, 0x02, 0x4B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; @@ -616,8 +618,8 @@ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { EGG::Vector3f local_48; MTXMultVec(work->mPosCamMtx, param_1->mPosition, local_48); - f32 sinRot = nw4r::math::SinIdx((s16)param_1->mRotateAngle); - f32 cosRot = nw4r::math::CosIdx((s16)param_1->mRotateAngle); + f32 sinRot = nw4r::math::SinIdx(param_1->mRotateAngle); + f32 cosRot = nw4r::math::CosIdx(param_1->mRotateAngle); Mtx local_38; f32 particleX = work->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY; @@ -742,12 +744,15 @@ static void rotTypeZ(f32 param_0, f32 param_1, Mtx& param_2) { static void rotTypeXYZ(f32 param_0, f32 param_1, Mtx& param_2) { f32 f3; f32 fVar1; - f32 f4; f32 fVar2; + f32 f4; + f32 tmp; + f3 = 0.33333298563957214f * (1.0f - param_1); - f4 = f3 + 0.5773500204086304f * param_0; - fVar1 = f3 - 0.5773500204086304f * param_0; + tmp = 0.5773500204086304f * param_0; + f4 = f3 + tmp; + fVar1 = f3 - tmp; fVar2 = f3 + param_1; param_2[0][0] = fVar2; param_2[0][1] = fVar1; @@ -838,12 +843,12 @@ void JPADrawDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { EGG::Vector3f local_78; p_direction[param_0->mDirType](param_0, param_1, &local_6c); if (!local_6c.isZero()) { - local_6c.normalize(); + local_6c.normalise(); local_78 = param_1->mBaseAxis.cross(local_6c); if (!local_78.isZero()) { - local_78.normalize(); + local_78.normalise(); param_1->mBaseAxis = local_6c.cross(local_78); - param_1->mBaseAxis.normalize(); + param_1->mBaseAxis.normalise(); Mtx local_60; f32 fVar1 = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 fVar2 = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY; @@ -879,12 +884,12 @@ void JPADrawRotDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) EGG::Vector3f local_78; p_direction[param_0->mDirType](param_0, param_1, &local_6c); if (!local_6c.isZero()) { - local_6c.normalize(); + local_6c.normalise(); local_78 = param_1->mBaseAxis.cross(local_6c); if (!local_78.isZero()) { - local_78.normalize(); + local_78.normalise(); param_1->mBaseAxis = local_6c.cross(local_78); - param_1->mBaseAxis.normalize(); + param_1->mBaseAxis.normalise(); f32 particleX = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY; Mtx auStack_80; @@ -924,7 +929,7 @@ void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { param_0->mPosCamMtx[2][2]); local_70 = local_70.cross(aTStack_7c); if (!local_70.isZero()) { - local_70.normalize(); + local_70.normalise(); MTXMultVecSR(param_0->mPosCamMtx, local_70, local_70); EGG::Vector3f local_88; MTXMultVec(param_0->mPosCamMtx, param_1->mPosition, local_88); @@ -1023,6 +1028,10 @@ JPANode* getPrev(JPANode* param_0) { typedef JPANode* (*getNodeFunc)(JPANode*); +void fn_8031C2C0(JPAEmitterWorkData* work) { + work->mpRes->getEts()->fn_8031DE80(work->mpRes->getBsp(), work->mpEmtr->getAge()); +} + /* 80279374-8027996C 273CB4 05F8+00 0/0 1/1 0/0 .text JPADrawStripe__FP18JPAEmitterWorkData */ void JPADrawStripe(JPAEmitterWorkData* param_0) { JPABaseShape* shape = param_0->mpRes->getBsp(); @@ -1074,16 +1083,16 @@ void JPADrawStripe(JPAEmitterWorkData* param_0) { if (local_f8.isZero()) { local_f8.set(0.0f, 1.0f, 0.0f); } else { - local_f8.normalize(); + local_f8.normalise(); } local_104 = particle->mBaseAxis.cross(local_f8); if (local_104.isZero()) { local_104.set(1.0f, 0.0f, 0.0f); } else { - local_104.normalize(); + local_104.normalise(); } particle->mBaseAxis = local_f8.cross( local_104); - particle->mBaseAxis.normalize(); + particle->mBaseAxis.normalise(); local_c8[0][0] = local_104.x; local_c8[0][1] = local_f8.x; @@ -1164,16 +1173,16 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) { if (local_c0.isZero()) { local_c0.set(0.0f, 1.0f, 0.0f); } else { - local_c0.normalize(); + local_c0.normalise(); } local_cc = particle->mBaseAxis.cross(local_c0); if (local_cc.isZero()) { local_cc.set(1.0f, 0.0f, 0.0f); } else { - local_cc.normalize(); + local_cc.normalise(); } particle->mBaseAxis = local_c0.cross( local_cc); - particle->mBaseAxis.normalize(); + particle->mBaseAxis.normalise(); local_90[0][0] = local_cc.x; local_90[0][1] = local_c0.x; @@ -1214,16 +1223,16 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) { if (local_c0.isZero()) { local_c0.set(0.0f, 1.0f, 0.0f); } else { - local_c0.normalize(); + local_c0.normalise(); } local_cc = particle->mBaseAxis.cross(local_c0); if (local_cc.isZero()) { local_cc.set(1.0f, 0.0f, 0.0f); } else { - local_cc.normalize(); + local_cc.normalise(); } particle->mBaseAxis = local_c0.cross( local_cc); - particle->mBaseAxis.normalize(); + particle->mBaseAxis.normalise(); local_90[0][0] = local_cc.x; local_90[0][1] = local_c0.x; @@ -1290,10 +1299,10 @@ static void makeColorTable(GXColor** o_color_table, JPAClrAnmKeyData const* i_da j++; if (j < param_2) { f32 base_step = 1.0f / (i_data[j].index - i_data[j - 1].index); - r_step = base_step * ((f32)i_data[j].color.r - r); - g_step = base_step * ((f32)i_data[j].color.g - g); - b_step = base_step * ((f32)i_data[j].color.b - b); - a_step = base_step * ((f32)i_data[j].color.a - a); + r_step = base_step * (i_data[j].color.r - r); + g_step = base_step * (i_data[j].color.g - g); + b_step = base_step * (i_data[j].color.b - b); + a_step = base_step * (i_data[j].color.a - a); } else { r_step = g_step = b_step = a_step = 0.0f; } diff --git a/src/JSystem/JParticle/JPADynamicsBlock.cpp b/src/JSystem/JParticle/JPADynamicsBlock.cpp index 15b6f2f7..a037be31 100644 --- a/src/JSystem/JParticle/JPADynamicsBlock.cpp +++ b/src/JSystem/JParticle/JPADynamicsBlock.cpp @@ -102,8 +102,10 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) { f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad)); 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.mVelOmni.set( + work->mVolumeCalcData.mVolumePos.x * work->mGlobalScl.x, + work->mVolumeCalcData.mVolumePos.y * work->mGlobalScl.y, work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z + ); work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -118,8 +120,10 @@ static void JPAVolumeCylinder(JPAEmitterWorkData* work) { f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad)); work->mVolumeCalcData.mVolumePos.set( 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.mVelOmni.set( + work->mVolumeCalcData.mVolumePos.x * work->mGlobalScl.x, + work->mVolumeCalcData.mVolumePos.y * work->mGlobalScl.y, work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z + ); work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } @@ -135,8 +139,10 @@ static void JPAVolumeTorus(JPAEmitterWorkData* work) { work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * nw4r::math::SinIdx(theta), work->mVolumeCalcData.mVelAxis.y, work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * nw4r::math::CosIdx(theta)); - work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos; - work->mVolumeCalcData.mVelOmni *= work->mGlobalScl; + work->mVolumeCalcData.mVelOmni.set( + work->mVolumeCalcData.mVolumePos.x * work->mGlobalScl.x, + work->mVolumeCalcData.mVolumePos.y * work->mGlobalScl.y, work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z + ); } /* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */ diff --git a/src/JSystem/JParticle/JPAExTexShape.cpp b/src/JSystem/JParticle/JPAExTexShape.cpp index 18b0a01e..74274c62 100644 --- a/src/JSystem/JParticle/JPAExTexShape.cpp +++ b/src/JSystem/JParticle/JPAExTexShape.cpp @@ -37,3 +37,7 @@ void JPALoadExTex(JPAEmitterWorkData* work) { JPAExTexShape::JPAExTexShape(u8 const* data) { mpData = (const JPAExTexShapeData*)data; } + +void JPAExTexShape::fn_8031DE80(JPABaseShape* shp, f32) { + // TODO +} diff --git a/src/JSystem/JParticle/JPAResource.cpp b/src/JSystem/JParticle/JPAResource.cpp index 50a891af..e2910181 100644 --- a/src/JSystem/JParticle/JPAResource.cpp +++ b/src/JSystem/JParticle/JPAResource.cpp @@ -79,8 +79,9 @@ static u8 jpa_crd[32] ALIGN_DECL(32) = { /* 80274080-802755E8 26E9C0 1568+00 2/0 1/1 0/0 .text init__11JPAResourceFP7EGG::Heap */ void JPAResource::init(EGG::Heap* heap) { - BOOL is_glbl_clr_anm = mpBaseShape->isGlblClrAnm(); - BOOL is_glbl_tex_anm = mpBaseShape->isGlblTexAnm(); + // The s32s here are probably fake but fixes the regswaps + s32 is_glbl_clr_anm = mpBaseShape->isGlblClrAnm(); + s32 is_glbl_tex_anm = mpBaseShape->isGlblTexAnm(); BOOL is_prm_anm = mpBaseShape->isPrmAnm(); BOOL is_env_anm = mpBaseShape->isEnvAnm(); BOOL is_tex_anm = mpBaseShape->isTexAnm(); @@ -354,6 +355,9 @@ void JPAResource::init(EGG::Heap* heap) { if (is_draw_parent && base_type_5_6) { mpDrawEmitterFuncListNum++; + if (mpExTexShape != NULL && mpExTexShape->isUseIndirect() && mpExTexShape->getfield_0x4C()) { + mpDrawEmitterFuncListNum++; + } } mpDrawEmitterFuncListNum++; @@ -395,6 +399,10 @@ void JPAResource::init(EGG::Heap* heap) { mpDrawEmitterFuncList[func_no] = &JPADrawStripeX; func_no++; } + if (mpExTexShape != NULL && mpExTexShape->isUseIndirect() && mpExTexShape->getfield_0x4C()) { + mpDrawEmitterFuncList[func_no] = &fn_8031C2C0; + func_no++; + } } mpDrawEmitterFuncList[func_no] = &JPADrawEmitterCallBackB; @@ -473,8 +481,8 @@ void JPAResource::init(EGG::Heap* heap) { mpDrawEmitterChildFuncListNum++; } - if (mpChildShape != NULL && !mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited() - && !mpChildShape->isColorInherited()) { + if (mpChildShape != NULL && ((!mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited() + && !mpChildShape->isColorInherited()) || is_draw_child && child_type_5_6)) { mpDrawEmitterChildFuncListNum++; } @@ -503,9 +511,12 @@ void JPAResource::init(EGG::Heap* heap) { func_no++; } - if (mpChildShape != NULL && !mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited() - && !mpChildShape->isColorInherited()) { - mpDrawEmitterChildFuncList[func_no] = &JPARegistChildPrmEnv; + if (mpChildShape != NULL) { + if (!mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited() && !mpChildShape->isColorInherited()) { + mpDrawEmitterChildFuncList[func_no] = &JPARegistChildPrmEnv; + } else if (is_draw_child && child_type_5_6) { + mpDrawEmitterChildFuncList[func_no] = &fn_8031DBA0; + } } if (is_draw_parent && !base_type_5_6) { @@ -517,9 +528,16 @@ void JPAResource::init(EGG::Heap* heap) { if (!is_glbl_tex_anm && is_tex_anm) { mpDrawParticleFuncListNum++; } - - if ((base_type_0_1 && is_enable_scale_anm) || (is_tex_crd_anm && !is_prj_tex)) { + + if (base_type_0_1 && is_enable_scale_anm) { mpDrawParticleFuncListNum++; + } else { + if (is_tex_crd_anm && !is_prj_tex) { + mpDrawParticleFuncListNum++; + } + if (mpExTexShape != NULL && mpExTexShape->isUseIndirect() && mpExTexShape->getfield_0x4C()) { + mpDrawParticleFuncListNum++; + } } if ((!is_glbl_clr_anm && (is_prm_anm || is_env_anm || is_enable_alpha_anm)) @@ -591,9 +609,16 @@ void JPAResource::init(EGG::Heap* heap) { mpDrawParticleFuncList[func_no] = &JPASetLineWidth; func_no++; } - } else if (is_tex_crd_anm && !is_prj_tex) { - mpDrawParticleFuncList[func_no] = &JPALoadCalcTexCrdMtxAnm; - func_no++; + } else { + if (is_tex_crd_anm && !is_prj_tex) { + mpDrawParticleFuncList[func_no] = &JPALoadCalcTexCrdMtxAnm; + func_no++; + } + + if (mpExTexShape != NULL && mpExTexShape->isUseIndirect() && mpExTexShape->getfield_0x4C()) { + mpDrawParticleFuncList[func_no] = &fn_8031A8C0; + func_no++; + } } if (!is_glbl_clr_anm) { @@ -997,7 +1022,7 @@ void JPAResource::setCTev(JPAEmitterWorkData* work) { GXSetArray(GX_VA_POS, jpa_pos + pos_offset, 3); GXSetArray(GX_VA_TEX0, jpa_crd, 2); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP1, GX_COLOR_NULL); - GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C, GX_FALSE, 0x7D); GXSetTevDirect(GX_TEVSTAGE0); GXSetNumTevStages(1); GXSetNumIndStages(0); @@ -1101,7 +1126,8 @@ void JPAResource::calcWorkData_c(JPAEmitterWorkData* work) { MTXConcat(work->mRotationMtx, local_rot_mtx, work->mGlobalRot); MTXConcat(work->mGlobalRot, local_scl_mtx, work->mGlobalSR); work->mEmitterPos.set(work->mpEmtr->mLocalTrs); - work->mGlobalScl *= work->mpEmtr->mLocalScl; + work->mGlobalScl.mul(work->mpEmtr->mGlobalScl, work->mpEmtr->mLocalScl); + JPAGetDirMtx(work->mpEmtr->mLocalDir, work->mDirectionMtx); work->mPublicScale.set(work->mpEmtr->mGlobalScl); MTXMultVec(global_mtx, work->mpEmtr->mLocalTrs, work->mGlobalPos); @@ -1116,8 +1142,9 @@ void JPAResource::calcWorkData_d(JPAEmitterWorkData* work) { MTXConcat(work->mpEmtr->mGlobalRot, mtx, work->mGlobalRot); MTXMultVecSR(work->mGlobalRot, work->mpEmtr->mLocalDir, work->mGlobalEmtrDir); } - +/* #pragma push #pragma force_active on static u8 jpa_resource_padding[28] = {0}; #pragma pop +*/