From cd777aa35b59bf133b98be741a91d771fa7a2c9a Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Tue, 8 Apr 2025 17:03:42 -0400 Subject: [PATCH] object-particle OK --- configure.py | 2 +- include/JSystem/JStage/JSGObject.h | 2 +- .../JStudio/JStudio_JParticle/control.h | 14 +-- include/d/actor/d_a_obj_hha.h | 14 +-- include/d/d_demo.h | 4 +- src/JSystem/JStage/JSGObject.cpp | 5 +- .../JStudio_JParticle/object-particle.cpp | 115 +++++++++++------- src/d/actor/d_a_obj_hha.cpp | 2 +- src/d/actor/d_a_player_main.cpp | 2 +- src/d/actor/d_a_player_sword.inc | 2 +- 10 files changed, 97 insertions(+), 65 deletions(-) diff --git a/configure.py b/configure.py index 0be61d14a..3c33646c6 100755 --- a/configure.py +++ b/configure.py @@ -745,7 +745,7 @@ config.libs = [ "JStudio_JParticle", [ Object(Matching, "JSystem/JStudio/JStudio_JParticle/control.cpp"), - Object(NonMatching, "JSystem/JStudio/JStudio_JParticle/object-particle.cpp"), + Object(Matching, "JSystem/JStudio/JStudio_JParticle/object-particle.cpp", extra_cflags=['-pragma "nosyminline on"']), ], ), JSystemLib( diff --git a/include/JSystem/JStage/JSGObject.h b/include/JSystem/JStage/JSGObject.h index e702893e2..61d2e085a 100644 --- a/include/JSystem/JStage/JSGObject.h +++ b/include/JSystem/JStage/JSGObject.h @@ -29,7 +29,7 @@ namespace JStage { virtual void JSGSetParent(JStage::TObject*, u32); virtual void JSGSetRelation(bool, JStage::TObject*, u32); virtual s32 JSGFindNodeID(char const*) const; - virtual int JSGGetNodeTransformation(u32, MtxP) const; + virtual bool JSGGetNodeTransformation(u32, MtxP) const; }; }; diff --git a/include/JSystem/JStudio/JStudio_JParticle/control.h b/include/JSystem/JStudio/JStudio_JParticle/control.h index 9175ddc75..bb1858223 100644 --- a/include/JSystem/JStudio/JStudio_JParticle/control.h +++ b/include/JSystem/JStudio/JStudio_JParticle/control.h @@ -61,14 +61,14 @@ struct TAdaptor_particle : public JStudio::TAdaptor_particle { /* 0x19C */ JPAEmitterManager* mEmitterManager; /* 0x1A0 */ JPABaseEmitter* mEmitter; /* 0x1A4 */ TJPACallback_ mCallback; - /* 0x1B0 */ int _188; - /* 0x1B4 */ u32 _18C; - /* 0x1B8 */ u32 _190; - /* 0x1BC */ u32 _194; + /* 0x1B0 */ int field_0x1B0; + /* 0x1B4 */ int field_0x1B4; + /* 0x1B8 */ u32 field_0x1B8; + /* 0x1BC */ u32 field_0x1BC; /* 0x1C0 */ const JStage::TSystem* mSystem; - /* 0x1C4 */ JStage::TObject* _19C; - /* 0x1C8 */ u32 _1A0; - /* 0x1CC */ bool _1A4; + /* 0x1C4 */ JStage::TObject* mObject; + /* 0x1C8 */ u32 field_0x1C8; + /* 0x1CC */ bool field_0x1CC; }; // Size: 0x1D0 }; // namespace JStudio_JParticle diff --git a/include/d/actor/d_a_obj_hha.h b/include/d/actor/d_a_obj_hha.h index e85a5308d..af790a74a 100644 --- a/include/d/actor/d_a_obj_hha.h +++ b/include/d/actor/d_a_obj_hha.h @@ -48,28 +48,28 @@ public: f32 get_pos_y() { return mPos.y; } void set_pos(cXyz& pos) { mPos.set(pos); } void set_pos_y(float y) { mPos.y = y; } - bool chk_stop() { return bIsActive == false; } + bool chk_stop() { return mbIsActive == false; } void delete_s() { if(mSplashCb.getEmitter() != NULL){ mSplashCb.remove(); - bIsActive = false; + mbIsActive = false; } } void play_particle() { JPABaseEmitter* pSplashEmitter = mSplashCb.getEmitter(); if(pSplashEmitter != NULL){ - pSplashEmitter->clearStatus(1); - bIsActive = true; + pSplashEmitter->playCreateParticle(); + mbIsActive = true; } } void stop_particle() { JPABaseEmitter* pSplashEmitter = mSplashCb.getEmitter(); if(pSplashEmitter != NULL){ - pSplashEmitter->setStatus(1); - bIsActive = false; + pSplashEmitter->stopCreateParticle(); + mbIsActive = false; } } @@ -80,7 +80,7 @@ public: /* 0x14 */ cXyz mBasePos; /* 0x20 */ cXyz mPos; /* 0x2C */ csXyz mAngle; - /* 0x32 */ bool bIsActive; + /* 0x32 */ bool mbIsActive; }; // Size : 0x34 diff --git a/include/d/d_demo.h b/include/d/d_demo.h index 4e6ec0d22..70fa356f6 100644 --- a/include/d/d_demo.h +++ b/include/d/d_demo.h @@ -85,10 +85,10 @@ public: JUT_ASSERT(0x4d, mModel != NULL); return mModel->getModelData()->getJointName()->getIndex(name); } - int JSGGetNodeTransformation(u32 no, Mtx dst) const { + bool JSGGetNodeTransformation(u32 no, Mtx dst) const { JUT_ASSERT(0x52, mModel != NULL); cMtx_copy(mModel->getAnmMtx((u16)no), dst); - return 1; + return true; } f32 JSGGetAnimationFrameMax() const { return mAnmFrameMax; } f32 JSGGetTextureAnimationFrameMax() const { return mTexAnimationFrameMax; } diff --git a/src/JSystem/JStage/JSGObject.cpp b/src/JSystem/JStage/JSGObject.cpp index 57559dc23..8a70ba61d 100644 --- a/src/JSystem/JStage/JSGObject.cpp +++ b/src/JSystem/JStage/JSGObject.cpp @@ -51,7 +51,7 @@ s32 JStage::TObject::JSGFindNodeID(const char*) const { } /* 8026DFBC-8026DFF8 .text JSGGetNodeTransformation__Q26JStage7TObjectCFUlPA4_f */ -int JStage::TObject::JSGGetNodeTransformation(u32, MtxP mtx) const { +bool JStage::TObject::JSGGetNodeTransformation(u32, MtxP mtx) const { mtx[0][0] = 0.0f; mtx[0][1] = 0.0f; mtx[0][2] = 0.0f; @@ -64,6 +64,5 @@ int JStage::TObject::JSGGetNodeTransformation(u32, MtxP mtx) const { mtx[2][1] = 0.0f; mtx[2][2] = 0.0f; mtx[2][3] = 0.0f; - return 0; + return false; } - diff --git a/src/JSystem/JStudio/JStudio_JParticle/object-particle.cpp b/src/JSystem/JStudio/JStudio_JParticle/object-particle.cpp index bda259242..7d46be699 100644 --- a/src/JSystem/JStudio/JStudio_JParticle/object-particle.cpp +++ b/src/JSystem/JStudio/JStudio_JParticle/object-particle.cpp @@ -15,14 +15,14 @@ TAdaptor_particle::TAdaptor_particle(JPAEmitterManager* emitterManager, const JS : mEmitterManager(emitterManager) , mEmitter(NULL) , mCallback(this) - , _188(-1) - , _18C(0) - , _190(0) - , _194(0) + , field_0x1B0(-1) + , field_0x1B4(0) + , field_0x1B8(0) + , field_0x1BC(0) , mSystem(system) - , _19C(NULL) - , _1A0(0xFFFFFFFF) - , _1A4(0) + , mObject(NULL) + , field_0x1C8(0xFFFFFFFF) + , field_0x1CC(0) { } @@ -57,32 +57,32 @@ void TAdaptor_particle::adaptor_do_end(const JStudio::TObject*) {} /* 80279BD8-80279C2C .text adaptor_do_update__Q217JStudio_JParticle17TAdaptor_particleFPCQ27JStudio7TObjectUl */ void TAdaptor_particle::adaptor_do_update(const JStudio::TObject* param_1, u32 param_2) { - if (_190 == 0) { + if (field_0x1B8 == 0) { return; } - if (_194 >= _190) { + if (field_0x1BC >= field_0x1B8) { return; } - _194 += param_2; - if (_194 < _190) { + field_0x1BC += param_2; + if (field_0x1BC < field_0x1B8) { return; } - switch (_18C) { + switch (field_0x1B4) { case 2: break; default: - _18C = 0; + field_0x1B4 = 0; break; } - _190 = 0; - _194 = 0; + field_0x1B8 = 0; + field_0x1BC = 0; } /* 80279C2C-80279C40 .text adaptor_do_PARTICLE__Q217JStudio_JParticle17TAdaptor_particleFQ37JStudio4data15TEOperationDataPCvUl */ void TAdaptor_particle::adaptor_do_PARTICLE(JStudio::data::TEOperationData operation, const void* r5, u32) { switch (operation) { case JStudio::data::TEOD_Unknown_19: - _188 = *(int*)r5; + field_0x1B0 = *(int*)r5; break; default: break; @@ -94,8 +94,8 @@ void TAdaptor_particle::adaptor_do_PARENT(JStudio::data::TEOperationData operati switch (operation) { case JStudio::data::TEOD_Unknown_18: if (mSystem != NULL) { - _19C = (JStage::TObject*)mSystem->JSGFindObject((const char*)param_2, JStage::TOBJ_ACTOR_UNK); - if (_19C == 0) { + mObject = (JStage::TObject*)mSystem->JSGFindObject((const char*)param_2, JStage::TOBJ_ACTOR_UNK); + if (mObject == 0) { // Fakematch, just need something in here to stop the compiler from optimizing out the cmplwi *(f32*)NULL = *(f32*)NULL; } @@ -110,15 +110,15 @@ void TAdaptor_particle::adaptor_do_PARENT(JStudio::data::TEOperationData operati void TAdaptor_particle::adaptor_do_PARENT_NODE(JStudio::data::TEOperationData operation, const void* param_2, u32) { switch (operation) { case JStudio::data::TEOD_Unknown_18: - if (_19C != NULL) { - _1A0 = _19C->JSGFindNodeID((const char*)param_2); - if (_1A0 == 0xFFFFFFFF) { + if (mObject != NULL) { + field_0x1C8 = mObject->JSGFindNodeID((const char*)param_2); + if (field_0x1C8 == 0xFFFFFFFF) { return; } } break; case JStudio::data::TEOD_Unknown_19: - _1A0 = *(u32*)param_2; + field_0x1C8 = *(u32*)param_2; break; default: break; @@ -129,7 +129,7 @@ void TAdaptor_particle::adaptor_do_PARENT_NODE(JStudio::data::TEOperationData op void TAdaptor_particle::adaptor_do_PARENT_ENABLE(JStudio::data::TEOperationData operation, const void* param_2, u32 param_3) { switch (operation) { case JStudio::data::TEOD_Unknown_02: - _1A4 = *(u32*)param_2; + field_0x1CC = *(u32*)param_2; break; default: break; @@ -137,45 +137,78 @@ void TAdaptor_particle::adaptor_do_PARENT_ENABLE(JStudio::data::TEOperationData } /* 80279D40-80279E2C .text __cl__Q317JStudio_JParticle17TAdaptor_particle21TVVOOn_BEGIN_FADE_IN_CFfPQ27JStudio8TAdaptor */ -void TAdaptor_particle::TVVOOn_BEGIN_FADE_IN_::operator()(float, JStudio::TAdaptor*) const { - /* Nonmatching */ +void TAdaptor_particle::TVVOOn_BEGIN_FADE_IN_::operator()(f32 value, JStudio::TAdaptor* adaptor) const { + TAdaptor_particle* adaptor_particle = (TAdaptor_particle*)adaptor; + u32 temp = adaptor_particle->field_0x1B0; + if (adaptor_particle->mEmitter) { + adaptor_particle->mEmitterManager->forceDeleteEmitter(adaptor_particle->mEmitter); + } + JGeometry::TVec3 pos = (Vec){0.0f, 0.0f, 0.0f}; + adaptor_particle->mEmitter = adaptor_particle->mEmitterManager->createSimpleEmitterID( + pos, + (temp & 0x0000FFFF), + (temp & 0xFF000000) >> 0x18, + (temp & 0x00FF0000) >> 0x10, + &adaptor_particle->mCallback, + NULL + ); + if (adaptor_particle->mEmitter) { + adaptor_particle->mEmitter->becomeImmortalEmitter(); + adaptor_particle->field_0x1B4 = 1; + adaptor_particle->field_0x1B8 = value; + adaptor_particle->field_0x1BC = 0; + } } /* 80279E2C-80279F08 .text __cl__Q317JStudio_JParticle17TAdaptor_particle20TVVOOn_END_FADE_OUT_CFfPQ27JStudio8TAdaptor */ -void TAdaptor_particle::TVVOOn_END_FADE_OUT_::operator()(float, JStudio::TAdaptor*) const { - /* Nonmatching */ +void TAdaptor_particle::TVVOOn_END_FADE_OUT_::operator()(f32 value, JStudio::TAdaptor* adaptor) const { + TAdaptor_particle* adaptor_particle = (TAdaptor_particle*)adaptor; + if (adaptor_particle->mEmitter) { + if (adaptor_particle->field_0x1B4 == 1 && adaptor_particle->field_0x1BC != 0) { + adaptor_particle->field_0x1B4 = 2; + f64 temp1 = adaptor_particle->field_0x1B8; + f64 temp2 = adaptor_particle->field_0x1BC; + f64 temp = temp1 / temp2; + adaptor_particle->field_0x1B8 = value * temp; + adaptor_particle->field_0x1BC = value * (temp - 1.0); + } else { + adaptor_particle->field_0x1B4 = 2; + adaptor_particle->field_0x1B8 = value; + adaptor_particle->field_0x1BC = 0.0f; + } + } } /* 80279F08-8027A2B8 .text execute__Q317JStudio_JParticle17TAdaptor_particle13TJPACallback_FP14JPABaseEmitter */ void TAdaptor_particle::TJPACallback_::execute(JPABaseEmitter* emitter) { if (emitter->isEnableDeleteEmitter()) { - mAdaptor->_18C = 0; - mAdaptor->_190 = 0; - mAdaptor->_194 = 0; + mAdaptor->field_0x1B4 = 0; + mAdaptor->field_0x1B8 = 0; + mAdaptor->field_0x1BC = 0; mAdaptor->mEmitterManager->forceDeleteEmitter(emitter); mAdaptor->mEmitter = NULL; return; } f64 alpha = 1.0; - f64 val1 = mAdaptor->_190; // u32 stored as f64 - switch (mAdaptor->_18C) { + f64 val1 = mAdaptor->field_0x1B8; // u32 stored as f64 + switch (mAdaptor->field_0x1B4) { case 1: - if (mAdaptor->_190 != 0) { - f64 val2 = mAdaptor->_194; // u32 stored as f64 + if (mAdaptor->field_0x1B8 != 0) { + f64 val2 = mAdaptor->field_0x1BC; // u32 stored as f64 alpha = val2 / val1; } break; case 2: - if (mAdaptor->_190 == 0) { + if (mAdaptor->field_0x1B8 == 0) { alpha = 0.0; if (emitter != NULL) { emitter->stopCreateParticle(); emitter->setMaxFrame(1); - } else { - f64 val2 = mAdaptor->_190 - mAdaptor->_194; // u32 stored as f64 - alpha = val2 / val1; } + } else { + f64 val2 = mAdaptor->field_0x1B8 - mAdaptor->field_0x1BC; // u32 stored as f64 + alpha = val2 / val1; } break; } @@ -192,7 +225,7 @@ void TAdaptor_particle::TJPACallback_::execute(JPABaseEmitter* emitter) { Vec* pos; // r29 - if (!mAdaptor->_1A4) { + if (!mAdaptor->field_0x1CC) { if (!ctrl->transformOnSet_isEnabled()) { pos = srts; } else { @@ -211,13 +244,13 @@ void TAdaptor_particle::TJPACallback_::execute(JPABaseEmitter* emitter) { emitter->setGlobalRotation(JGeometry::TVec3(angleX, angleY, angleZ)); emitter->setGlobalScale(sp0C); } else { - if (mAdaptor->_19C == NULL) { + if (mAdaptor->mObject == NULL) { return; } Mtx spA8; Mtx sp78; Mtx sp48; - if (mAdaptor->_19C->JSGGetNodeTransformation(mAdaptor->_1A0, spA8) == 0) { + if (!mAdaptor->mObject->JSGGetNodeTransformation(mAdaptor->field_0x1C8, spA8)) { return; } JStudio::math::getTransformation_SRxyzT(sp78, sp0C, srts[1], srts[0]); diff --git a/src/d/actor/d_a_obj_hha.cpp b/src/d/actor/d_a_obj_hha.cpp index 6765a74df..9014d65b0 100644 --- a/src/d/actor/d_a_obj_hha.cpp +++ b/src/d/actor/d_a_obj_hha.cpp @@ -183,7 +183,7 @@ void daObjHhaSplash_c::create_s(u16 particleID, cXyz* pPos, float offsetY, float mBasePos = mPos; mAngle = *pAngle; dComIfGp_particle_set(particleID, &mPos, &mAngle, NULL, 255, &mSplashCb); - bIsActive = true; + mbIsActive = true; } /* 00000698-000008AC .text create_area__15daObjHhaYgush_cFPCc */ diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index c3c9e625f..a313a7649 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -3801,7 +3801,7 @@ BOOL daPy_lk_c::playerDelete() { mFootEffect[i].getOtherCallBack()->remove(); } if (mFanSwingCb.mpEmitter) { - mFanSwingCb.mpEmitter->clearStatus(0x40); + mFanSwingCb.mpEmitter->quitImmortalEmitter(); mFanSwingCb.mpEmitter->setEmitterCallBackPtr(NULL); mFanSwingCb.mpEmitter = NULL; } diff --git a/src/d/actor/d_a_player_sword.inc b/src/d/actor/d_a_player_sword.inc index 025957886..d74d1f7cd 100644 --- a/src/d/actor/d_a_player_sword.inc +++ b/src/d/actor/d_a_player_sword.inc @@ -1137,7 +1137,7 @@ BOOL daPy_lk_c::procCutRollEnd_init() { JPABaseEmitter* emitter = m33A8.makeEmitter(dPa_name::ID_COMMON_STARS_SPIN, mpCLModel->getAnmMtx(15), ¤t.pos, NULL); if (emitter != NULL) { - emitter->setStatus(0x40); + emitter->becomeImmortalEmitter(); emitter->setVolumeSize(5); emitter->setLifeTime(daPy_HIO_cutRoll_c0::m.field_0x6); emitter->setEmitterTranslation(emitter_trans);