// // 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; } }