mirror of
https://github.com/zeldaret/ss
synced 2026-06-21 00:11:13 -04:00
300 lines
11 KiB
C++
300 lines
11 KiB
C++
//
|
|
// Generated By: dol2asm
|
|
// Translation Unit: JPAFieldBlock
|
|
//
|
|
|
|
#include "egg/core/eggHeap.h"
|
|
#include "JSystem/JParticle/JPAFieldBlock.h"
|
|
#include "JSystem/JParticle/JPAEmitter.h"
|
|
#include "JSystem/JParticle/JPAParticle.h"
|
|
#include "egg/math/eggVector.h"
|
|
|
|
/* 8027BDEC-8027BF18 27672C 012C+00 8/8 0/0 0/0 .text
|
|
* calcAffect__12JPAFieldBaseFP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldBase::calcAffect(JPAFieldBlock* block, JPABaseParticle* ptcl) {
|
|
EGG::Vector3f vec = mAccel;
|
|
if (!ptcl->checkStatus(4) && block->checkStatus(0x78)) {
|
|
vec *= calcFadeAffect(block, ptcl->mTime);
|
|
}
|
|
|
|
switch (block->getAddType()) {
|
|
case 0:
|
|
ptcl->mVelType0 += vec;
|
|
break;
|
|
case 1:
|
|
ptcl->mVelType1 += vec;
|
|
break;
|
|
case 2:
|
|
ptcl->mVelType2 += vec;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 8027BF18-8027BFB4 276858 009C+00 2/2 0/0 0/0 .text
|
|
* calcFadeAffect__12JPAFieldBaseCFP13JPAFieldBlockf */
|
|
f32 JPAFieldBase::calcFadeAffect(JPAFieldBlock* block, f32 time) const {
|
|
f32 fade = 1.0f;
|
|
if ((block->checkStatus(8) && time < block->getEnTime())
|
|
|| (block->checkStatus(0x10) && time >= block->getDisTime()))
|
|
{
|
|
fade = 0.0f;
|
|
} else if (block->checkStatus(0x40) && time >= block->getFadeOutTime()) {
|
|
fade = (block->getDisTime() - time) * block->getFadeOutRate();
|
|
} else if (block->checkStatus(0x20) && time < block->getFadeInTime()) {
|
|
fade = (time - block->getEnTime()) * block->getFadeInRate();
|
|
}
|
|
return fade;
|
|
}
|
|
|
|
/* 8027BFB4-8027C054 2768F4 00A0+00 1/0 0/0 0/0 .text
|
|
* prepare__15JPAFieldGravityFP18JPAEmitterWorkDataP13JPAFieldBlock */
|
|
void JPAFieldGravity::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) {
|
|
if (block->checkStatus(2)) {
|
|
mAccel = block->getMag() * block->getDir();
|
|
} else {
|
|
MTXMultVecSR(work->mRotationMtx, block->getDir(), mAccel);
|
|
mAccel *= block->getMag();
|
|
}
|
|
}
|
|
|
|
/* 8027C054-8027C07C 276994 0028+00 1/0 0/0 0/0 .text
|
|
* calc__15JPAFieldGravityFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldGravity::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
|
|
calcAffect(block, ptcl);
|
|
}
|
|
|
|
/* 8027C07C-8027C1B8 2769BC 013C+00 1/0 0/0 0/0 .text
|
|
* prepare__11JPAFieldAirFP18JPAEmitterWorkDataP13JPAFieldBlock */
|
|
void JPAFieldAir::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) {
|
|
EGG::Vector3f vec = block->getDir();
|
|
vec.normalise();
|
|
if (block->checkStatus(2)) {
|
|
mAccel = block->getMag() * vec;
|
|
} else {
|
|
MTXMultVecSR(work->mRotationMtx, vec, mAccel);
|
|
mAccel *= block->getMag();
|
|
}
|
|
}
|
|
|
|
/* 8027C1B8-8027C24C 276AF8 0094+00 1/0 0/0 0/0 .text
|
|
* calc__11JPAFieldAirFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldAir::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
|
|
calcAffect(block, ptcl);
|
|
if (block->checkStatus(4)) {
|
|
f32 len = ptcl->mVelType1.length();
|
|
if (len > block->getMagRndm()) {
|
|
ptcl->mVelType1 *= block->getMagRndm() / len;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8027C24C-8027C29C 276B8C 0050+00 1/0 0/0 0/0 .text
|
|
* prepare__14JPAFieldMagnetFP18JPAEmitterWorkDataP13JPAFieldBlock */
|
|
void JPAFieldMagnet::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) {
|
|
mDir = block->getPos() - work->mEmitterPos;
|
|
MTXMultVecSR(work->mRotationMtx, mDir, mDir);
|
|
}
|
|
|
|
/* 8027C29C-8027C36C 276BDC 00D0+00 1/0 0/0 0/0 .text
|
|
* calc__14JPAFieldMagnetFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldMagnet::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
|
|
mAccel = mDir - ptcl->mLocalPosition;
|
|
mAccel.setLength(block->getMag());
|
|
calcAffect(block, ptcl);
|
|
}
|
|
|
|
/* 8027C36C-8027C3E0 276CAC 0074+00 1/0 0/0 0/0 .text
|
|
* prepare__14JPAFieldNewtonFP18JPAEmitterWorkDataP13JPAFieldBlock */
|
|
void JPAFieldNewton::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) {
|
|
mDir = block->getPos() - work->mEmitterPos;
|
|
MTXMultVecSR(work->mRotationMtx, mDir, mDir);
|
|
mCutoff = block->getVal1() * block->getVal1();
|
|
}
|
|
|
|
/* 8027C3E0-8027C56C 276D20 018C+00 1/0 0/0 0/0 .text
|
|
* calc__14JPAFieldNewtonFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldNewton::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
|
|
mAccel = mDir - ptcl->mLocalPosition;
|
|
f32 len_sq = mAccel.squaredLength();
|
|
if (len_sq > mCutoff) {
|
|
mAccel.setLength(mCutoff * (block->getMag() * 10.0f) / len_sq);
|
|
} else {
|
|
mAccel.setLength(block->getMag() * 10.0f);
|
|
}
|
|
calcAffect(block, ptcl);
|
|
}
|
|
|
|
/* 8027C56C-8027C674 276EAC 0108+00 1/0 0/0 0/0 .text
|
|
* prepare__14JPAFieldVortexFP18JPAEmitterWorkDataP13JPAFieldBlock */
|
|
void JPAFieldVortex::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) {
|
|
PSMTXMultVecSR(work->mGlobalRot, block->getDir(), field_0x10);
|
|
field_0x10.normalise();
|
|
field_0x1c = block->getPos().z * block->getPos().z;
|
|
field_0x20 = 1.0f / field_0x1c;
|
|
}
|
|
|
|
/* 8027C674-8027C814 276FB4 01A0+00 1/0 0/0 0/0 .text
|
|
* calc__14JPAFieldVortexFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldVortex::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
|
|
EGG::Vector3f vec;
|
|
vec = ptcl->mLocalPosition - field_0x10.dot(ptcl->mLocalPosition) * field_0x10;
|
|
f32 mag = vec.squaredLength();
|
|
if (mag > field_0x1c) {
|
|
mag = block->getMagRndm();
|
|
} else {
|
|
mag *= field_0x20;
|
|
mag = (1.0f - mag) * block->getMag() + mag * block->getMagRndm();
|
|
}
|
|
vec.normalise();
|
|
mAccel = vec.cross(field_0x10);
|
|
mAccel *= mag;
|
|
calcAffect(block, ptcl);
|
|
}
|
|
|
|
/* 8027C814-8027CA94 277154 0280+00 1/0 0/0 0/0 .text
|
|
* prepare__18JPAFieldConvectionFP18JPAEmitterWorkDataP13JPAFieldBlock */
|
|
void JPAFieldConvection::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) {
|
|
EGG::Vector3f vec1, vec2;
|
|
vec2 = block->getPos().cross(block->getDir());
|
|
vec1 = block->getDir().cross(vec2);
|
|
MTXMultVecSR(work->mGlobalRot, vec1, field_0x10);
|
|
MTXMultVecSR(work->mGlobalRot, block->getDir(), field_0x1c);
|
|
MTXMultVecSR(work->mGlobalRot, vec2, field_0x28);
|
|
field_0x10.normalise();
|
|
field_0x1c.normalise();
|
|
field_0x28.normalise();
|
|
}
|
|
|
|
/* 8027CA94-8027CCCC 2773D4 0238+00 1/0 0/0 0/0 .text
|
|
* calc__18JPAFieldConvectionFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldConvection::calc(JPAEmitterWorkData* work, JPAFieldBlock* block,
|
|
JPABaseParticle* ptcl) {
|
|
EGG::Vector3f vec1, vec2, vec3;
|
|
vec1 = field_0x10.dot(ptcl->mLocalPosition) * field_0x10;
|
|
vec3 = field_0x28.dot(ptcl->mLocalPosition) * field_0x28;
|
|
vec1 += vec3;
|
|
vec1.setLength(vec1, block->getVal1());
|
|
vec2 = ptcl->mLocalPosition - vec1;
|
|
vec3 = field_0x1c.cross(vec1);
|
|
mAccel = vec3.cross(vec2);
|
|
mAccel.setLength(block->getMag());
|
|
calcAffect(block, ptcl);
|
|
}
|
|
|
|
/* 8027CCCC-8027CDE4 27760C 0118+00 1/0 0/0 0/0 .text
|
|
* calc__14JPAFieldRandomFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldRandom::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
|
|
if (ptcl->mAge == 0 || (block->getCycle() != 0 && ptcl->mAge % block->getCycle() == 0)) {
|
|
JPABaseEmitter* emtr = work->mpEmtr;
|
|
mAccel.set(emtr->get_r_zh(), emtr->get_r_zh(), emtr->get_r_zh());
|
|
mAccel *= block->getMag();
|
|
calcAffect(block, ptcl);
|
|
}
|
|
}
|
|
|
|
/* 8027CDE4-8027CE64 277724 0080+00 1/0 0/0 0/0 .text
|
|
* calc__12JPAFieldDragFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldDrag::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
|
|
if (!ptcl->checkStatus(4)) {
|
|
f32 fade = calcFadeAffect(block, ptcl->mTime);
|
|
ptcl->mDrag *= 1.0f - fade * (1.0f - block->getMag());
|
|
} else {
|
|
ptcl->mDrag *= block->getMag();
|
|
}
|
|
}
|
|
|
|
/* 8027CE64-8027CFA8 2777A4 0144+00 1/0 0/0 0/0 .text
|
|
* prepare__12JPAFieldSpinFP18JPAEmitterWorkDataP13JPAFieldBlock */
|
|
void JPAFieldSpin::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) {
|
|
EGG::Vector3f axis;
|
|
MTXMultVecSR(work->mGlobalRot, block->getDir(), axis);
|
|
axis.normalise();
|
|
Mtx mtx;
|
|
MTXRotAxisRad(mtx, axis, block->getMag());
|
|
field_0x10.set(mtx[0][0], mtx[1][0], mtx[2][0]);
|
|
field_0x1c.set(mtx[0][1], mtx[1][1], mtx[2][1]);
|
|
field_0x28.set(mtx[0][2], mtx[1][2], mtx[2][2]);
|
|
}
|
|
|
|
/* 8027CFA8-8027D088 2778E8 00E0+00 1/0 0/0 0/0 .text
|
|
* calc__12JPAFieldSpinFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
|
|
void JPAFieldSpin::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
|
|
Mtx mtx;
|
|
mtx[0][0] = field_0x10.x;
|
|
mtx[1][0] = field_0x10.y;
|
|
mtx[2][0] = field_0x10.z;
|
|
mtx[0][1] = field_0x1c.x;
|
|
mtx[1][1] = field_0x1c.y;
|
|
mtx[2][1] = field_0x1c.z;
|
|
mtx[0][2] = field_0x28.x;
|
|
mtx[1][2] = field_0x28.y;
|
|
mtx[2][2] = field_0x28.z;
|
|
mtx[0][3] = mtx[1][3] = mtx[2][3] = 0.0f;
|
|
Vec vec;
|
|
MTXMultVecSR(mtx, ptcl->mLocalPosition, &vec);
|
|
mAccel.set(vec.x - ptcl->mLocalPosition.x, vec.y - ptcl->mLocalPosition.y,
|
|
vec.z - ptcl->mLocalPosition.z);
|
|
calcAffect(block, ptcl);
|
|
}
|
|
|
|
/* 8027D088-8027D0C0 2779C8 0038+00 0/0 1/1 0/0 .text __ct__13JPAFieldBlockFPCUcP7EGG::Heap
|
|
*/
|
|
JPAFieldBlock::JPAFieldBlock(u8 const* data, EGG::Heap* heap)
|
|
: mpData((const JPAFieldBlockData*)data) {
|
|
init(heap);
|
|
}
|
|
|
|
/* 8027D0C0-8027D3AC 277A00 02EC+00 2/1 0/0 0/0 .text init__13JPAFieldBlockFP7EGG::Heap */
|
|
void JPAFieldBlock::init(EGG::Heap* heap) {
|
|
mFadeInRate = getFadeInTime() - getEnTime();
|
|
if (mFadeInRate == 0.0f) {
|
|
mFadeInRate = 1.0f;
|
|
} else {
|
|
mFadeInRate = 1.0f / mFadeInRate;
|
|
}
|
|
|
|
mFadeOutRate = getDisTime() - getFadeOutTime();
|
|
if (mFadeOutRate == 0.0f) {
|
|
mFadeOutRate = 1.0f;
|
|
} else {
|
|
mFadeOutRate = 1.0f / mFadeOutRate;
|
|
}
|
|
|
|
getPosOrig(&mPos);
|
|
getDirOrig(&mDir);
|
|
mMag = getMagOrig();
|
|
|
|
switch (getType()) {
|
|
case FIELD_GRAVITY:
|
|
mpField = new (heap, 4) JPAFieldGravity();
|
|
break;
|
|
case FIELD_AIR:
|
|
mpField = new (heap, 4) JPAFieldAir();
|
|
break;
|
|
case FIELD_MAGNET:
|
|
mpField = new (heap, 4) JPAFieldMagnet();
|
|
break;
|
|
case FIELD_NEWTON:
|
|
mpField = new (heap, 4) JPAFieldNewton();
|
|
break;
|
|
case FIELD_VORTEX:
|
|
mpField = new (heap, 4) JPAFieldVortex();
|
|
break;
|
|
case FIELD_RANDOM:
|
|
mpField = new (heap, 4) JPAFieldRandom();
|
|
break;
|
|
case FIELD_DRAG:
|
|
mpField = new (heap, 4) JPAFieldDrag();
|
|
break;
|
|
case FIELD_CONVECTION:
|
|
mpField = new (heap, 4) JPAFieldConvection();
|
|
break;
|
|
case FIELD_SPIN:
|
|
mpField = new (heap, 4) JPAFieldSpin();
|
|
break;
|
|
default:
|
|
mpField = NULL;
|
|
break;
|
|
}
|
|
}
|