d_particle (#1176)

This commit is contained in:
Jcw87
2026-08-17 10:18:33 -07:00
committed by GitHub
parent e389a9b814
commit e3550e01e1
2 changed files with 233 additions and 69 deletions
+1 -1
View File
@@ -335,7 +335,7 @@ public:
public:
/* 0x04 */ u8 mAlpha;
/* 0x05 */ u8 field_0x5;
/* 0x06 */ u16 field_0x6;
/* 0x06 */ s16 field_0x6;
/* 0x08 */ cXyz* mPosArray;
/* 0x0C */ JPABaseEmitter* mpBaseEmitter;
}; // Size: 0x10
+232 -68
View File
@@ -13,6 +13,7 @@
#include "JSystem/JSupport/JSUList.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "SSystem/SComponent/c_malloc.h"
#include "d/actor/d_a_sea.h"
#include "d/d_bg_s_gnd_chk.h"
#include "d/d_com_inf_game.h"
#include "d/d_kankyo.h"
@@ -30,8 +31,8 @@ dPa_modelEmitter_c::dPa_modelEmitter_c() {
}
/* 8007A514-8007A804 .text __ct__21dPa_J3DmodelEmitter_cFP14JPABaseEmitterP12J3DModelDataR12dKy_tevstr_cP16J3DAnmTexPatternUsi */
dPa_J3DmodelEmitter_c::dPa_J3DmodelEmitter_c(JPABaseEmitter* param_1, J3DModelData* param_2, dKy_tevstr_c& param_3, J3DAnmTexPattern* param_4, u16 param_5, int param_6) {
mpBaseEmitter = param_1;
dPa_J3DmodelEmitter_c::dPa_J3DmodelEmitter_c(JPABaseEmitter* emitter, J3DModelData* param_2, dKy_tevstr_c& param_3, J3DAnmTexPattern* param_4, u16 param_5, int param_6) {
mpBaseEmitter = emitter;
modelData = param_2;
field_0x26 = param_6;
tevStr = param_3;
@@ -58,7 +59,7 @@ dPa_J3DmodelEmitter_c::dPa_J3DmodelEmitter_c(JPABaseEmitter* param_1, J3DModelDa
mDoExt_adjustSolidHeap(mpHeap);
}
}
param_1->becomeImmortalEmitter();
emitter->becomeImmortalEmitter();
}
/* 8007A84C-8007A8C8 .text __dt__21dPa_J3DmodelEmitter_cFv */
@@ -167,12 +168,12 @@ void dPa_J3DmodelEmitter_c::draw() {
/* 8007ADC4-8007AECC .text __ct__18dPa_modelControl_cFP12J3DModelData */
dPa_modelControl_c::dPa_modelControl_c(J3DModelData* modelData) {
mModel = new dPa_J3Dmodel_c[0x80];
JUT_ASSERT(0x10f, mModel != NULL);
JUT_ASSERT(271, mModel != NULL);
dPa_J3Dmodel_c * model = mModel;
for (s32 i = 0; i < 0x80; i++, model++) {
model->mModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x37221223);
JUT_ASSERT(0x120, model->mModel != NULL);
JUT_ASSERT(288, model->mModel != NULL);
}
cLs_Create(this);
@@ -345,12 +346,12 @@ dPa_smokeEcallBack::dPa_smokeEcallBack(const GXColor& param_1, dKy_tevstr_c* par
}
/* 8007B5E8-8007B698 .text setup__18dPa_smokeEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */
void dPa_smokeEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) {
void dPa_smokeEcallBack::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz* rot, s8 param_4) {
static dPa_smokePcallBack l_smokePcallBack;
dPa_followEcallBack::setup(param_1, param_2, param_3, param_4);
dPa_followEcallBack::setup(emitter, pos, rot, param_4);
field_0x14 = param_4;
param_1->setParticleCallBackPtr(dPa_control_c::getSmokePcallback());
param_1->setUserWork(mWindOff);
emitter->setParticleCallBackPtr(dPa_control_c::getSmokePcallback());
emitter->setUserWork(mWindOff);
}
/* 8007B73C-8007B804 .text initiateLighting__FR11_GXColorS10R8_GXColorR8_GXColor */
@@ -473,21 +474,21 @@ dPa_simpleEcallBack::dPa_simpleEcallBack() {
dPa_simpleData_c::dPa_simpleData_c() {}
/* 8007C460-8007C618 .text executeAfter__19dPa_simpleEcallBackFP14JPABaseEmitter */
void dPa_simpleEcallBack::executeAfter(JPABaseEmitter* param_1) {
s32 r28 = param_1->getCurrentCreateNumber();
void dPa_simpleEcallBack::executeAfter(JPABaseEmitter* emitter) {
s32 r28 = emitter->getCurrentCreateNumber();
if (r28 <= 0) {
mCount = 0;
} else {
dPa_simpleData_c* simpleData = mSimpleData;
param_1->playCreateParticle();
emitter->playCreateParticle();
while (mCount != 0) {
if (!mDoLib_clipper::clip(j3dSys.getViewMtx(), simpleData->mPos, 200.0f)) {
param_1->setGlobalTranslation(simpleData->mPos.x, simpleData->mPos.y, simpleData->mPos.z);
param_1->setGlobalPrmColor(simpleData->mPrmColor.r, simpleData->mPrmColor.g, simpleData->mPrmColor.b);
param_1->setGlobalAlpha(simpleData->mPrmColor.a);
param_1->setGlobalEnvColor(simpleData->mEnvColor[0], simpleData->mEnvColor[1], simpleData->mEnvColor[2]);
emitter->setGlobalTranslation(simpleData->mPos.x, simpleData->mPos.y, simpleData->mPos.z);
emitter->setGlobalPrmColor(simpleData->mPrmColor.r, simpleData->mPrmColor.g, simpleData->mPrmColor.b);
emitter->setGlobalAlpha(simpleData->mPrmColor.a);
emitter->setGlobalEnvColor(simpleData->mEnvColor[0], simpleData->mEnvColor[1], simpleData->mEnvColor[2]);
for (int i = 0; i < r28; i++) {
JPABaseParticle* particle = param_1->createParticle();
JPABaseParticle* particle = emitter->createParticle();
if (particle == NULL) {
break;
}
@@ -502,7 +503,7 @@ void dPa_simpleEcallBack::executeAfter(JPABaseEmitter* param_1) {
simpleData++;
}
}
param_1->stopCreateParticle();
emitter->stopCreateParticle();
}
/* 8007C674-8007C6EC .text draw__19dPa_simpleEcallBackFP14JPABaseEmitter */
@@ -520,8 +521,16 @@ JPABaseEmitter* dPa_simpleEcallBack::create(JPAEmitterManager* manager, u16 effe
mGrpID = groupID;
mResID = effectID;
if (createEmitter(manager)) {
if (effectID == dPa_name::ID_AK_ST_O_BKMSATTACKSMOKE00 || effectID == dPa_name::ID_AK_ST_O_KGTT2JUMPHANDSMOKE00) {
if (
effectID == dPa_name::ID_AK_ST_O_BKMSATTACKSMOKE00
#if VERSION != VERSION_DEMO
|| effectID == dPa_name::ID_AK_ST_O_KGTT2JUMPHANDSMOKE00
#endif
) {
mbIsSmoke = true;
#if VERSION == VERSION_DEMO
mpBaseEmitter->setEmitterCallBackPtr(dPa_control_c::getSmokeEcallback());
#endif
mpBaseEmitter->setParticleCallBackPtr(dPa_control_c::getSmokePcallback());
} else {
mbIsSmoke = false;
@@ -602,7 +611,7 @@ u8 dPa_control_c::mStatus;
/* 8007C8E8-8007C9A4 .text __ct__13dPa_control_cFv */
dPa_control_c::dPa_control_c() {
mHeap = mDoExt_createSolidHeapFromSystem(0x16e800, 0);
JUT_ASSERT(0x4d8, mHeap != NULL);
JUT_ASSERT(VERSION_SELECT(1240, 1240, 1240, 1241), mHeap != NULL);
mSceneNo = 0xFF;
mCount = 0;
mEmitterMng = NULL;
@@ -629,13 +638,13 @@ void dPa_control_c::swapFrameBufferTexture() {
/* 8007CA98-8007CCC8 .text createCommon__13dPa_control_cFPCv */
void dPa_control_c::createCommon(const void* param_1) {
mCommonResMng = new (mHeap, 0) JPAResourceManager(param_1, mHeap);
JUT_ASSERT(1313, mCommonResMng != NULL);
JUT_ASSERT(VERSION_SELECT(1312, 1312, 1313, 1314), mCommonResMng != NULL);
mCommonResMng->swapTexture(mDoGph_gInf_c::mFrameBufferTimg, "AK_kagerouSwap00");
mEmitterMng = new(mHeap, 0) JPAEmitterManager(mCommonResMng, 3000, 150, 200, mHeap);
JUT_ASSERT(1324, mEmitterMng != NULL);
JUT_ASSERT(VERSION_SELECT(1322, 1322, 1324, 1325), mEmitterMng != NULL);
JKRHeap* oldHeap = mDoExt_setCurrentHeap(mHeap);
mModelControl = new dPa_modelControl_c((J3DModelData*)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BDL_MPM_TUBO_e));
JUT_ASSERT(1332, mModelControl != NULL);
JUT_ASSERT(VERSION_SELECT(1329, 1329, 1332, 1333), mModelControl != NULL);
for (u16 i = 0; i < 8; i++) {
u16 id = dPa_name::j_o_id[i];
if (mCommonResMng->pEmtrRes->checkUserIndexDuplication(id)) {
@@ -646,16 +655,18 @@ void dPa_control_c::createCommon(const void* param_1) {
}
mNumSimpleCommon = mNumSimple;
mDoExt_setCurrentHeap(oldHeap);
#if VERSION >= VERSION_USA
mDoExt_adjustSolidHeap(mHeap);
#endif
}
/* 8007CCC8-8007CE50 .text createRoomScene__13dPa_control_cFPCv */
void dPa_control_c::createRoomScene(const void* param_1) {
mSceneHeap = mDoExt_createSolidHeapFromGame(0, 0);
JUT_ASSERT(1369, mSceneHeap != NULL);
JUT_ASSERT(VERSION_SELECT(1360, 1360, 1369, 1370), mSceneHeap != NULL);
mpData = param_1;
mSceneResMng = new (mSceneHeap, 0) JPAResourceManager(mpData, mSceneHeap);
JUT_ASSERT(1373, mSceneResMng != NULL);
JUT_ASSERT(VERSION_SELECT(1364, 1364, 1373, 1374), mSceneResMng != NULL);
mSceneResMng->swapTexture(mDoGph_gInf_c::mFrameBufferTimg, "AK_kagerouSwap00");
mEmitterMng->pResMgrArray[1] = mSceneResMng;
mDoExt_adjustSolidHeap(mSceneHeap);
@@ -676,7 +687,7 @@ bool dPa_control_c::readScene(u8 i_no, mDoDvdThd_toMainRam_c** param_2) {
return false;
}
if (mCount++) {
JUT_ASSERT(1415, i_no != mSceneNo);
JUT_ASSERT(VERSION_SELECT(1404, 1404, 1415, 1416), i_no != mSceneNo);
return true;
}
mSceneNo = i_no;
@@ -745,7 +756,9 @@ void dPa_control_c::draw(JPADrawInfo* param_1, u8 param_2) {
dKy_setLight_again();
mEmitterMng->draw(param_1, param_2);
GXSetAlphaUpdate(GX_DISABLE);
#if VERSION != VERSION_DEMO
GXSetNumIndStages(0);
#endif
}
/* 8007D1DC-8007D378 .text set__13dPa_control_cFUcUsPC4cXyzPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyz */
@@ -798,7 +811,7 @@ JPABaseEmitter* dPa_control_c::setBombSmoke(u16 userID, const cXyz* pos, const c
/* 8007D414-8007D998 .text setSimpleLand__13dPa_control_cFiPC4cXyzPC5csXyzfffP12dKy_tevstr_cPii */
JPABaseEmitter* dPa_control_c::setSimpleLand(int code, const cXyz* pos, const csXyz* angle, f32 scale1, f32 scale2, f32 scale3, dKy_tevstr_c* i_tevStr, int* i_return_id, int flag) {
JUT_ASSERT(0x6b1, (i_tevStr != NULL) && (i_return_id != NULL));
JUT_ASSERT(VERSION_SELECT(1698, 1702, 1713, 1714), (i_tevStr != NULL) && (i_return_id != NULL));
*i_return_id = checkAtrCodeEffect(code);
if (*i_return_id == -1)
return NULL;
@@ -928,12 +941,12 @@ dPa_simpleEcallBack* dPa_control_c::getSimple(u16 id) {
}
/* 8007DC6C-8007DC94 .text setup__19dPa_rippleEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */
void dPa_rippleEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) {
param_1->setParticleCallBackPtr(dPa_control_c::getRipplePcallBack());
mPos = param_2;
void dPa_rippleEcallBack::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz* rot, s8 param_4) {
emitter->setParticleCallBackPtr(dPa_control_c::getRipplePcallBack());
mPos = pos;
mRate = 1.0f;
mFlags |= 1;
mpBaseEmitter = param_1;
mpBaseEmitter = emitter;
}
/* 8007DC94-8007DCE4 .text end__19dPa_rippleEcallBackFv */
@@ -960,33 +973,33 @@ void dPa_rippleEcallBack::execute(JPABaseEmitter* emtr) {
}
/* 8007DD70-8007DDA8 .text draw__19dPa_rippleEcallBackFP14JPABaseEmitter */
void dPa_rippleEcallBack::draw(JPABaseEmitter*) {
void dPa_rippleEcallBack::draw(JPABaseEmitter* emitter) {
if (dPa_control_c::isStatus(1)) {
GXSetZMode(GX_FALSE, GX_NEVER, GX_FALSE);
}
}
/* 8007DDA8-8007DDB4 .text setup__25dPa_singleRippleEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */
void dPa_singleRippleEcallBack::setup(JPABaseEmitter* param_1, const cXyz*, const csXyz*, s8) {
param_1->setParticleCallBackPtr(dPa_control_c::getRipplePcallBack());
void dPa_singleRippleEcallBack::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz* rot, s8) {
emitter->setParticleCallBackPtr(dPa_control_c::getRipplePcallBack());
}
/* 8007DDB4-8007DE00 .text execute__25dPa_singleRippleEcallBackFP14JPABaseEmitter */
void dPa_singleRippleEcallBack::execute(JPABaseEmitter* param_1) {
void dPa_singleRippleEcallBack::execute(JPABaseEmitter* emitter) {
GXColor c1, c2;
dKy_get_seacolor(&c1, &c2);
param_1->setGlobalPrmColor(c1.r, c1.g, c1.b);
emitter->setGlobalPrmColor(c1.r, c1.g, c1.b);
}
/* 8007DE00-8007DE38 .text draw__25dPa_singleRippleEcallBackFP14JPABaseEmitter */
void dPa_singleRippleEcallBack::draw(JPABaseEmitter*) {
void dPa_singleRippleEcallBack::draw(JPABaseEmitter* emitter) {
if (dPa_control_c::isStatus(1)) {
GXSetZMode(GX_FALSE, GX_NEVER, GX_FALSE);
}
}
/* 8007DE38-8007DE94 .text execute__19dPa_ripplePcallBackFP14JPABaseEmitterP15JPABaseParticle */
void dPa_ripplePcallBack::execute(JPABaseEmitter* param_1, JPABaseParticle* ptcl) {
void dPa_ripplePcallBack::execute(JPABaseEmitter* emitter, JPABaseParticle* ptcl) {
/* Nonmatching - regalloc */
JGeometry::TVec3<f32> local_18;
ptcl->getGlobalPosition(local_18);
@@ -998,17 +1011,17 @@ void dPa_ripplePcallBack::execute(JPABaseEmitter* param_1, JPABaseParticle* ptcl
}
/* 8007DE94-8007E254 .text draw__19dPa_ripplePcallBackFP14JPABaseEmitterP15JPABaseParticle */
void dPa_ripplePcallBack::draw(JPABaseEmitter*, JPABaseParticle*) {
void dPa_ripplePcallBack::draw(JPABaseEmitter* emitter, JPABaseParticle* particle) {
/* Nonmatching */
}
/* 8007E254-8007E288 .text setup__17dPa_waveEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */
void dPa_waveEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) {
mpPos = param_2;
mpRot = param_3;
void dPa_waveEcallBack::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz* rot, s8 param_4) {
mpPos = pos;
mpRot = rot;
mVel = 0.0f;
mVelFade2 = 1.0f;
mpBaseEmitter = param_1;
mpBaseEmitter = emitter;
mMaxParticleVelocity = 10000.0f;
mState = 0;
mFadeTimer = 0;
@@ -1065,15 +1078,15 @@ void dPa_waveEcallBack::executeAfter(JPABaseEmitter* emitter) {
}
/* 8007E484-8007E804 .text draw__17dPa_waveEcallBackFP14JPABaseEmitter */
void dPa_waveEcallBack::draw(JPABaseEmitter*) {
void dPa_waveEcallBack::draw(JPABaseEmitter* emitter) {
/* Nonmatching */
}
/* 8007E804-8007E81C .text setup__19dPa_splashEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */
void dPa_splashEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) {
mpPos = param_2;
mpRot = param_3;
mpBaseEmitter = param_1;
void dPa_splashEcallBack::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz* rot, s8 param_4) {
mpPos = pos;
mpRot = rot;
mpBaseEmitter = emitter;
mState = 0;
}
@@ -1088,21 +1101,69 @@ void dPa_splashEcallBack::remove() {
}
/* 8007E850-8007E9B8 .text execute__19dPa_splashEcallBackFP14JPABaseEmitter */
void dPa_splashEcallBack::execute(JPABaseEmitter*) {
/* Nonmatching */
void dPa_splashEcallBack::execute(JPABaseEmitter* emitter) {
/* Nonmatching - setGlobalTranslation */
GXColor local_24;
GXColor local_28;
dKy_get_seacolor(&local_24, &local_28);
emitter->setGlobalPrmColor(local_24.r, local_24.g, local_24.b);
if (mState) {
JGeometry::TVec3<f32> local_20;
emitter->getGlobalParticleScale(local_20);
if (cLib_chaseF(&local_20.x, 0.0, 0.2)) {
remove();
return;
}
local_20.z = local_20.y = local_20.x;
emitter->setGlobalDynamicsScale(local_20);
emitter->setGlobalParticleScale(local_20);
emitter->setDirectionalSpeed(local_20.x * 15.0f);
} else {
emitter->setGlobalTranslation(*mpPos);
f32 scaleF = mScaleTimer / mMaxScaleTimer;
s16 yaw = mpRot->y;
if (scaleF > 1.0f) {
scaleF = 1.0f;
}
JGeometry::TVec3<f32> scale(scaleF, scaleF, scaleF);
emitter->setGlobalDynamicsScale(scale);
emitter->setGlobalParticleScale(scale);
emitter->setDirectionalSpeed(scaleF * 15.0f);
JGeometry::TVec3<s16> rot(s16(0), yaw, s16(0));
emitter->setGlobalRotation(rot);
}
}
/* 8007E9B8-8007E9D4 .text setup__22dPa_cutTurnEcallBack_cFP14JPABaseEmitterPC4cXyzPC5csXyzSc */
void dPa_cutTurnEcallBack_c::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) {
mpBaseEmitter = param_1;
void dPa_cutTurnEcallBack_c::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz* rot, s8 param_4) {
mpBaseEmitter = emitter;
field_0x6 = 0;
field_0x5 = 0;
mAlpha = 0xFF;
}
/* 8007E9D4-8007EAC4 .text executeAfter__22dPa_cutTurnEcallBack_cFP14JPABaseEmitter */
void dPa_cutTurnEcallBack_c::executeAfter(JPABaseEmitter*) {
/* Nonmatching */
void dPa_cutTurnEcallBack_c::executeAfter(JPABaseEmitter* emitter) {
/* Nonmatching - setGlobalTranslation */
if (field_0x5) {
emitter->becomeInvalidEmitter();
emitter->setEmitterCallBackPtr(NULL);
mpBaseEmitter = NULL;
return;
}
if (field_0x6 > 0 && mPosArray) {
cXyz* pos = &mPosArray[field_0x6] - 1;
int i = field_0x6 - 1;
for (; i >= 1; i--, pos--) {
JPABaseParticle* particle = emitter->createParticle();
if (particle) {
particle->setOffsetPosition(*pos);
}
}
emitter->setGlobalTranslation(*pos);
emitter->setGlobalAlpha(mAlpha);
field_0x6 = 0;
}
}
/* 8007EAC4-8007EB00 .text end__22dPa_cutTurnEcallBack_cFv */
@@ -1117,31 +1178,53 @@ void dPa_cutTurnEcallBack_c::end() {
}
/* 8007EB00-8007F028 .text draw__20dPa_stripesEcallBackFP14JPABaseEmitter */
void dPa_stripesEcallBack::draw(JPABaseEmitter*) {
void dPa_stripesEcallBack::draw(JPABaseEmitter* emitter) {
/* Nonmatching */
}
/* 8007F028-8007F05C .text draw__19dPa_kageroEcallBackFP14JPABaseEmitter */
void dPa_kageroEcallBack::draw(JPABaseEmitter*) {
void dPa_kageroEcallBack::draw(JPABaseEmitter* emitter) {
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0);
}
/* 8007F05C-8007F108 .text execute__22dPa_bombSmokeEcallBackFP14JPABaseEmitter */
void dPa_bombSmokeEcallBack::execute(JPABaseEmitter*) {
/* Nonmatching */
void dPa_bombSmokeEcallBack::execute(JPABaseEmitter* emitter) {
u32 local_14 = emitter->getUserWork() >> 16;
s16 r31 = emitter->getUserWork() & 0xFF;
s16 r30 = (emitter->getUserWork() >> 8) & 0xFF;
if (cLib_calcTimer(&local_14) == 0) {
s16 local_18 = emitter->getGlobalAlpha();
if (cLib_chaseS(&local_18, r31, r30)) {
emitter->setEmitterCallBackPtr(NULL);
}
emitter->setGlobalAlpha(local_18);
}
emitter->setUserWork(local_14 << 16 | r30 << 8 | r31);
}
/* 8007F108-8007F1A8 .text getMaxWaterY__18dPa_trackEcallBackFPQ29JGeometry8TVec3<f> */
void dPa_trackEcallBack::getMaxWaterY(JGeometry::TVec3<f32>*) {
/* Nonmatching */
void dPa_trackEcallBack::getMaxWaterY(JGeometry::TVec3<f32>* pos) {
if (daSea_ChkArea(pos->x, pos->z)) {
pos->y = daSea_calcWave(pos->x, pos->z);
if (mMinY > pos->y) {
pos->y = mMinY;
}
} else {
if (mMinY != - G_CM3D_F_INF) {
pos->y = mMinY;
} else {
pos->y = mBaseY;
}
}
pos->y += 2.0f;
}
/* 8007F1A8-8007F1C0 .text setup__18dPa_trackEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */
void dPa_trackEcallBack::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz* param_3, s8 param_4) {
mpPos = param_2;
void dPa_trackEcallBack::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz* rot, s8 param_4) {
mpPos = pos;
mState = 0;
mpRot = param_3;
mpBaseEmitter = param_1;
mpRot = rot;
mpBaseEmitter = emitter;
}
/* 8007F1C0-8007F1F4 .text remove__18dPa_trackEcallBackFv */
@@ -1155,13 +1238,94 @@ void dPa_trackEcallBack::remove() {
}
/* 8007F1F4-8007F3BC .text execute__18dPa_trackEcallBackFP14JPABaseEmitter */
void dPa_trackEcallBack::execute(JPABaseEmitter*) {
/* Nonmatching */
void dPa_trackEcallBack::execute(JPABaseEmitter* emitter) {
/* Nonmatching - regalloc, setGlobalTranslation */
GXColor local_30;
GXColor local_34;
dKy_get_seacolor(&local_30, &local_34);
emitter->setGlobalPrmColor(local_30.r, local_30.g, local_30.b);
if (mState) {
JGeometry::TVec3<f32> local_20;
emitter->getGlobalTranslation(local_20);
getMaxWaterY(&local_20);
s16 local_36 = emitter->getGlobalAlpha();
cLib_chaseS(&local_36, 0, 10);
emitter->setGlobalAlpha(local_36);
if (local_36 == 0) {
remove();
return;
}
} else {
emitter->setGlobalTranslation(*mpPos);
JGeometry::TVec3<s16> rot(0, mVel >= 0.0f ? mpRot->y : mpRot->y + 0x8000, 0);
emitter->setGlobalRotation(rot);
s16 local_38 = emitter->getGlobalAlpha();
if (std::fabsf(mVel) > mMinVel) {
cLib_chaseS(&local_38, 255, 5);
} else {
cLib_chaseS(&local_38, 0, 5);
}
emitter->setGlobalAlpha(local_38);
}
for (JSULink<JPABaseParticle>* link = emitter->mActiveParticles.getFirst(); link;) {
JSULink<JPABaseParticle>* next = link->getNext();
JPABaseParticle* particle = link->getObject();
JGeometry::TVec3<f32> local_2c;
particle->getOffsetPosition(local_2c);
getMaxWaterY(&local_2c);
particle->setOffsetPosition(local_2c);
link = next;
}
}
/* 8007F3BC-8007F62C .text draw__18dPa_trackEcallBackFP14JPABaseEmitter */
void dPa_trackEcallBack::draw(JPABaseEmitter*) {
/* Nonmatching */
void dPa_trackEcallBack::draw(JPABaseEmitter* emitter) {
/* Nonmatching - regalloc, instruction order */
u32 r28 = emitter->mActiveParticles.getNumLinks();
if (r28 < 6) {
return;
}
if (dPa_control_c::isStatus(1)) {
GXSetZMode(GX_DISABLE, GX_NEVER, GX_DISABLE);
}
r28 = r28 * (1.0f / 3.0f);
f32 f30 = 1.0f / (r28 - 1);
GXSetCullMode(GX_CULL_NONE);
Mtx local_bc;
MTXIdentity(local_bc);
local_bc[1][1] = mExScaleY;
local_bc[1][3] = mExTransY * emitter->getFrame();
GXLoadTexMtxImm(local_bc, GX_TEXMTX1, GX_MTX2x4);
GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX1);
JSULink<JPABaseParticle>* link = emitter->mActiveParticles.getFirst();
f32 f31 = 0.0f;
for (u32 i = 0; i < r28; i++) {
if (i) {
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, 6);
f32 f27 = 0.0f;
for (u32 j = 0; j < 3; j++) {
JPABaseParticle* particle = link->getObject();
JGeometry::TVec3<f32> local_c8;
particle->getGlobalPosition(local_c8);
getMaxWaterY(&local_c8);
GXPosition3f32(local_c8.x, local_c8.y, local_c8.z);
GXTexCoord2f32(f27, f31);
GXPosition3f32(mPos[j].x, mPos[j].y, mPos[j].z);
GXTexCoord2f32(f27, f31 - f30);
mPos[j].set(local_c8);
f27 += 0.5f;
link = link->getNext();
}
GXEnd();
} else {
for (int j = 0; j < 3; j++) {
JPABaseParticle* particle = link->getObject();
particle->getGlobalPosition(mPos[j]);
link = link->getNext();
}
}
f31 += f30;
}
}
/* 8007F704-8007F708 .text setup__22dPa_bombSmokeEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */