object-particle OK

This commit is contained in:
LagoLunatic
2025-04-08 17:03:42 -04:00
parent 6a64986a39
commit cd777aa35b
10 changed files with 97 additions and 65 deletions
+1 -1
View File
@@ -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(
+1 -1
View File
@@ -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;
};
};
@@ -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
+7 -7
View File
@@ -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
+2 -2
View File
@@ -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; }
+2 -3
View File
@@ -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;
}
@@ -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<f32> 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<s16>(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]);
+1 -1
View File
@@ -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 */
+1 -1
View File
@@ -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;
}
+1 -1
View File
@@ -1137,7 +1137,7 @@ BOOL daPy_lk_c::procCutRollEnd_init() {
JPABaseEmitter* emitter =
m33A8.makeEmitter(dPa_name::ID_COMMON_STARS_SPIN, mpCLModel->getAnmMtx(15), &current.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);