diff options
| author | robojumper <robojumper@gmail.com> | 2025-04-27 07:13:47 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-04-27 07:13:47 +0200 |
| commit | c1a0264e6ac151f3a884bc32126de192eede19c7 (patch) | |
| tree | 1649757ae5c7b47b87f17ef69760b4a359a8d46d /src/JSystem/JParticle/JPAFieldBlock.cpp | |
| parent | 5df26c52fcc06e017f2cf525264d4f7563715e05 (diff) | |
Initial import of JParticle + JSUList from TP
Diffstat (limited to 'src/JSystem/JParticle/JPAFieldBlock.cpp')
| -rw-r--r-- | src/JSystem/JParticle/JPAFieldBlock.cpp | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/src/JSystem/JParticle/JPAFieldBlock.cpp b/src/JSystem/JParticle/JPAFieldBlock.cpp new file mode 100644 index 00000000..c9a4c038 --- /dev/null +++ b/src/JSystem/JParticle/JPAFieldBlock.cpp @@ -0,0 +1,299 @@ +// +// Generated By: dol2asm +// Translation Unit: JPAFieldBlock +// + +#include "JSystem/JParticle/JPAFieldBlock.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JParticle/JPAEmitter.h" +#include "JSystem/JParticle/JPAParticle.h" + +/* 8027BDEC-8027BF18 27672C 012C+00 8/8 0/0 0/0 .text + * calcAffect__12JPAFieldBaseFP13JPAFieldBlockP15JPABaseParticle */ +void JPAFieldBase::calcAffect(JPAFieldBlock* block, JPABaseParticle* ptcl) { + JGeometry::TVec3<f32> vec = mAccel; + if (!ptcl->checkStatus(4) && block->checkStatus(0x78)) { + vec.scale(calcFadeAffect(block, ptcl->mTime)); + } + + switch (block->getAddType()) { + case 0: + ptcl->mVelType0.add(vec); + break; + case 1: + ptcl->mVelType1.add(vec); + break; + case 2: + ptcl->mVelType2.add(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.scale(block->getMag(), block->getDir()); + } else { + MTXMultVecSR(work->mRotationMtx, &block->getDir(), &mAccel); + mAccel.scale(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) { + JGeometry::TVec3<f32> vec; + vec.normalize(block->getDir()); + if (block->checkStatus(2)) { + mAccel.scale(block->getMag(), vec); + } else { + MTXMultVecSR(work->mRotationMtx, vec, mAccel); + mAccel.scale(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.scale(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.sub(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.sub(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.sub(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.sub(mDir, ptcl->mLocalPosition); + f32 len_sq = mAccel.squared(); + 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) { + MTXMultVecSR(work->mGlobalRot, &block->getDir(), &field_0x10); + field_0x10.normalize(); + 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) { + JGeometry::TVec3<f32> vec; + vec.scale(field_0x10.dot(ptcl->mLocalPosition), field_0x10); + vec.sub(ptcl->mLocalPosition, vec); + f32 mag = vec.squared(); + if (mag > field_0x1c) { + mag = block->getMagRndm(); + } else { + mag *= field_0x20; + mag = (1.0f - mag) * block->getMag() + mag * block->getMagRndm(); + } + vec.normalize(); + mAccel.cross(vec, field_0x10); + mAccel.scale(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) { + JGeometry::TVec3<f32> vec1, vec2; + vec2.cross(block->getPos(), block->getDir()); + vec1.cross(block->getDir(), vec2); + MTXMultVecSR(work->mGlobalRot, &vec1, &field_0x10); + MTXMultVecSR(work->mGlobalRot, &block->getDir(), field_0x1c); + MTXMultVecSR(work->mGlobalRot, &vec2, &field_0x28); + field_0x10.normalize(); + field_0x1c.normalize(); + field_0x28.normalize(); +} + +/* 8027CA94-8027CCCC 2773D4 0238+00 1/0 0/0 0/0 .text + * calc__18JPAFieldConvectionFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */ +void JPAFieldConvection::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, + JPABaseParticle* ptcl) { + JGeometry::TVec3<f32> vec1, vec2, vec3; + vec1.scale(field_0x10.dot(ptcl->mLocalPosition), field_0x10); + vec3.scale(field_0x28.dot(ptcl->mLocalPosition), field_0x28); + vec1.add(vec3); + vec1.setLength(vec1, block->getVal1()); + vec2.sub(ptcl->mLocalPosition, vec1); + vec3.cross(field_0x1c, vec1); + mAccel.cross(vec3, 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.scale(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) { + JGeometry::TVec3<f32> axis; + MTXMultVecSR(work->mGlobalRot, &block->getDir(), &axis); + axis.normalize(); + 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__13JPAFieldBlockFPCUcP7JKRHeap + */ +JPAFieldBlock::JPAFieldBlock(u8 const* data, JKRHeap* heap) + : mpData((const JPAFieldBlockData*)data) { + init(heap); +} + +/* 8027D0C0-8027D3AC 277A00 02EC+00 2/1 0/0 0/0 .text init__13JPAFieldBlockFP7JKRHeap */ +void JPAFieldBlock::init(JKRHeap* 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, 0) JPAFieldGravity(); + break; + case FIELD_AIR: + mpField = new (heap, 0) JPAFieldAir(); + break; + case FIELD_MAGNET: + mpField = new (heap, 0) JPAFieldMagnet(); + break; + case FIELD_NEWTON: + mpField = new (heap, 0) JPAFieldNewton(); + break; + case FIELD_VORTEX: + mpField = new (heap, 0) JPAFieldVortex(); + break; + case FIELD_RANDOM: + mpField = new (heap, 0) JPAFieldRandom(); + break; + case FIELD_DRAG: + mpField = new (heap, 0) JPAFieldDrag(); + break; + case FIELD_CONVECTION: + mpField = new (heap, 0) JPAFieldConvection(); + break; + case FIELD_SPIN: + mpField = new (heap, 0) JPAFieldSpin(); + break; + default: + mpField = NULL; + break; + } +} |
