This commit is contained in:
Jasper St. Pierre
2024-04-14 09:05:44 -07:00
parent 5b3b66015a
commit 4ce4072fef
4 changed files with 116 additions and 97 deletions
+47 -14
View File
@@ -23,7 +23,7 @@ void JPABaseEmitter::calcVolumePoint() {
/* 8025C254-8025C394 .text calcVolumeLine__14JPABaseEmitterFv */
void JPABaseEmitter::calcVolumeLine() {
if (mDataFlag & 2) {
if (checkEmDataFlag(0x02)) {
emtrInfo.mVolumePos.set(0.0f, 0.0f, emtrInfo.mVolumeSize * ((f32)emtrInfo.mVolumeEmitIdx / ((f32)emtrInfo.mVolumeEmitCount - 1.0f) - 0.5f));
emtrInfo.mVolumeEmitIdx++;
} else {
@@ -37,7 +37,7 @@ void JPABaseEmitter::calcVolumeLine() {
/* 8025C394-8025C538 .text calcVolumeCircle__14JPABaseEmitterFv */
void JPABaseEmitter::calcVolumeCircle() {
s16 angle;
if (mDataFlag & 0x02) {
if (checkEmDataFlag(0x02)) {
s16 idx = (0x10000 * emtrInfo.mVolumeEmitIdx / emtrInfo.mVolumeEmitCount);
angle = idx * mVolumeSweep;
emtrInfo.mVolumeEmitIdx++;
@@ -46,7 +46,7 @@ void JPABaseEmitter::calcVolumeCircle() {
}
f32 rad = getRandomF();
if (mDataFlag & 0x01)
if (checkEmDataFlag(0x01))
rad = 1.0f - rad * rad;
rad = emtrInfo.mVolumeSize * (mVolumeMinRad + rad * (1.0f - mVolumeMinRad));
@@ -73,7 +73,7 @@ void JPABaseEmitter::calcVolumeCylinder() {
s16 angle = mVolumeSweep * getRandomSS();
f32 rad = getRandomF();
if (mDataFlag & 0x01)
if (checkEmDataFlag(0x01))
rad = 1.0f - rad * rad;
rad = emtrInfo.mVolumeSize * (mVolumeMinRad + rad * (1.0f - mVolumeMinRad));
@@ -125,8 +125,7 @@ void JPABaseEmitter::create(JPADataBlockLinkInfo* info) {
mInitialVelDir = dyn->getInitVelDir();
mAccel = dyn->getAccel();
dyn->getEmitterDir(mEmitterDir);
// This appears to be an attempt at a normalize, but it scales by the length instead (???)
mEmitterDir.normalize_broken();
mEmitterDir.normalize();
mSpread = dyn->getSpread();
mDataFlag = dyn->getDataFlag();
mUseKeyFlag = dyn->getUseKeyFlag();
@@ -197,31 +196,65 @@ void JPABaseEmitter::calc() {
emtrInfo.mVolumeEmitCount = 0;
if (!checkStatus(JPAEmtrStts_StopCalc)) {
calcKey();
if (mpEmitterCallBack != NULL)
mpEmitterCallBack->execute(this);
calcBeforeCB();
calcEmitterInfo();
mDraw.calc();
mFieldManager.preCalc();
if (!checkStatus(JPAEmtrStts_EnableDeleteEmitter))
calcCreatePtcls();
if (mpEmitterCallBack != NULL)
mpEmitterCallBack->executeAfter(this);
calcAfterCB();
calcParticle();
calcChild();
mTick += 1.0f;
if (mTick < 0.0f)
mTick = 0.0f;
} else {
if (mpEmitterCallBack != NULL)
mpEmitterCallBack->execute(this);
if (mpEmitterCallBack != NULL)
mpEmitterCallBack->executeAfter(this);
calcBeforeCB();
calcAfterCB();
}
}
/* 8025D3C0-8025D5D4 .text calcCreatePtcls__14JPABaseEmitterFv */
void JPABaseEmitter::calcCreatePtcls() {
/* Nonmatching */
if (checkStatus(JPAEmtrStts_RateStepEmit)) {
s32 emitCount = 0;
if (checkEmDataFlag(0x02)) { // Fixed interval
emitCount = (mVolumeType == 1) ?
(mDivNumber + 1) * (mDivNumber - 1) * 4 + 6 : // Sphere
mDivNumber;
emtrInfo.mVolumeEmitIdx = 0;
} else {
f32 incr = mRate * (1.0f + mRateRndm * getRandomRF());
mEmitCount += incr;
if (mEmitCount >= 1) {
emitCount = mEmitCount;
mEmitCount -= emitCount;
} else if (mEmitCount > 0 && checkStatus(JPAEmtrStts_FirstEmit)) {
emitCount = 1;
}
}
emtrInfo.mVolumeEmitCount = emitCount;
if (checkStatus(JPAEmtrStts_StopEmit))
emitCount = 0;
for (s32 i = 0; i < emitCount; i++) {
JPABaseParticle* ptcl = createParticle();
if (ptcl == NULL)
break;
}
}
if (mRateStepTimer++ >= mRateStep + 1) {
mRateStepTimer -= mRateStep + 1;
setStatus(JPAEmtrStts_RateStepEmit);
} else {
clearStatus(JPAEmtrStts_RateStepEmit);
}
clearStatus(JPAEmtrStts_FirstEmit);
}
/* 8025D5D4-8025D670 .text createChildren__14JPABaseEmitterFP15JPABaseParticle */
+40 -22
View File
@@ -40,7 +40,6 @@ void JPABaseField::loadFieldData(JPAFieldData* data, JPAFieldBlock* block) {
/* 8025A0D8-8025A21C .text calcVel__12JPABaseFieldFP12JPAFieldDataP15JPABaseParticle */
void JPABaseField::calcVel(JPAFieldData* data, JPABaseParticle* ptcl) {
/* Nonmatching - copy of vel shouldn't be using PS */
JGeometry::TVec3<f32> vel = data->mVel;
if (!(ptcl->mStatus & 0x04)) {
@@ -56,8 +55,17 @@ void JPABaseField::calcVel(JPAFieldData* data, JPABaseParticle* ptcl) {
}
/* 8025A21C-8025A2B0 .text calcFadeAffect__12JPABaseFieldFP12JPAFieldDataf */
f32 JPABaseField::calcFadeAffect(JPAFieldData* data, f32 t) {
/* Nonmatching */
f32 JPABaseField::calcFadeAffect(JPAFieldData* data, f32 time) {
f32 affect = 1.0f;
if (((data->mSttFlag & 0x08) && time < data->mEnTime) || ((data->mSttFlag & 0x10) && time >= data->mDisTime)) {
affect = 0.0f;
} else {
if ((data->mSttFlag & 0x40) && time >= data->mFadeOut)
affect = data->mFadeOutRate * (data->mDisTime - time);
else if ((data->mSttFlag & 0x20) && time < data->mFadeIn)
affect = data->mFadeInRate * (time - data->mEnTime);
}
return affect;
}
/* 8025A2B0-8025A330 .text preCalc__12JPABaseFieldFP12JPAFieldData */
@@ -87,17 +95,11 @@ bool JPABaseField::isItinRange(JPAFieldData* data, f32 v) {
void JPAGravityField::preCalc(JPAFieldData* data) {
JPABaseField::preCalc(data);
if (data->mSttFlag & 0x02) {
f32 mag = data->mMag;
data->mVel.x = data->mDir.x * mag;
data->mVel.y = data->mDir.y * mag;
data->mVel.z = data->mDir.z * mag;
data->mVel.scale(data->mMag, data->mDir);
} else {
JGeometry::TVec3<f32> rotDir;
MTXMultVec(JPAFieldData::pEmtrInfo->mGlobalRot, data->mDir, rotDir);
f32 mag = data->mMag;
data->mVel.x = rotDir.x * mag;
data->mVel.y = rotDir.y * mag;
data->mVel.z = rotDir.z * mag;
data->mVel.scale(data->mMag, rotDir);
}
}
@@ -115,10 +117,7 @@ void JPAAirField::preCalc(JPAFieldData* data) {
MTXMultVec(JPAFieldData::pEmtrInfo->mGlobalRot, data->mDir, data->mLocalDir);
}
f32 mag = data->mMag;
data->mVel.x = data->mLocalDir.x * mag;
data->mVel.y = data->mLocalDir.y * mag;
data->mVel.z = data->mLocalDir.z * mag;
data->mVel.scale(data->mMag, data->mLocalDir);
if (data->mSttFlag & 0x01) {
data->mAirMinDist = JMASCos(data->mVal1 * 0xFFFF);
if (data->mSttFlag & 0x02) {
@@ -132,6 +131,29 @@ void JPAAirField::preCalc(JPAFieldData* data) {
/* 8025A510-8025A6EC .text calc__11JPAAirFieldFP12JPAFieldDataP15JPABaseParticle */
void JPAAirField::calc(JPAFieldData* data, JPABaseParticle* ptcl) {
/* Nonmatching */
if (data->mSttFlag & 0x01) {
JGeometry::TVec3<f32> vel;
if (data->mSttFlag & 0x02) {
vel.sub(ptcl->mPosition, data->mLocalPos);
} else {
vel.sub(ptcl->mLocalPosition, data->mLocalPos);
}
vel.normalize();
if (data->mAirMinDist <= data->mLocalDir.dot(vel)) {
JPABaseField::calcVel(data, ptcl);
}
} else {
JPABaseField::calcVel(data, ptcl);
}
if (data->mSttFlag & 0x04) {
f32 len = ptcl->mBaseVel.length();
if (len > data->mMagRndm) {
ptcl->mBaseVel.scale(data->mMagRndm / len);
}
}
}
/* 8025A6EC-8025A788 .text preCalc__14JPAMagnetFieldFP12JPAFieldData */
@@ -152,15 +174,11 @@ void JPAMagnetField::preCalc(JPAFieldData* data) {
void JPAMagnetField::calc(JPAFieldData* data, JPABaseParticle* ptcl) {
/* Nonmatching */
if (data->mSttFlag & 0x02) {
data->mVel.x = data->mLocalPos.x - ptcl->mPosition.x;
data->mVel.y = data->mLocalPos.y - ptcl->mPosition.y;
data->mVel.z = data->mLocalPos.z - ptcl->mPosition.z;
data->mVel.sub(data->mLocalPos, ptcl->mPosition);
} else {
data->mVel.x = data->mLocalPos.x - ptcl->mLocalPosition.x;
data->mVel.y = data->mLocalPos.y - ptcl->mLocalPosition.y;
data->mVel.z = data->mLocalPos.z - ptcl->mLocalPosition.z;
data->mVel.sub(data->mLocalPos, ptcl->mLocalPosition);
}
data->mVel.normalize();
data->mVel.setLength(data->mMag);
calcVel(data, ptcl);
}