// // Generated By: dol2asm // Translation Unit: JPABaseShape // #include "JSystem/JParticle/JPABaseShape.h" #include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JParticle/JPAParticle.h" #include "JSystem/JParticle/JPAEmitter.h" #include "JSystem/JParticle/JPAResourceManager.h" #include "JSystem/JMath/JMATrigonometric.h" #include "dolphin/mtx.h" #include "dolphin/gx.h" /* 80276A90-80276ACC 2713D0 003C+00 0/0 1/1 0/0 .text JPASetPointSize__FP18JPAEmitterWorkData */ void JPASetPointSize(JPAEmitterWorkData* work) { GXSetPointSize((u8)(25.0f * work->mGlobalPtclScl.x), GX_TO_ONE); } /* 80276ACC-80276B08 27140C 003C+00 0/0 1/1 0/0 .text JPASetLineWidth__FP18JPAEmitterWorkData */ void JPASetLineWidth(JPAEmitterWorkData* work) { GXSetLineWidth((u8)(25.0f * work->mGlobalPtclScl.x), GX_TO_ONE); } /* 80276B08-80276B4C 271448 0044+00 0/0 1/1 0/0 .text * JPASetPointSize__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPASetPointSize(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { GXSetPointSize((u8)(ptcl->mParticleScaleX * (25.0f * work->mGlobalPtclScl.x)), GX_TO_ONE); } /* 80276B4C-80276B90 27148C 0044+00 0/0 1/1 0/0 .text * JPASetLineWidth__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPASetLineWidth(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { GXSetLineWidth((u8)(ptcl->mParticleScaleX * (25.0f * work->mGlobalPtclScl.x)), GX_TO_ONE); } /* 80276B90-80276C2C 2714D0 009C+00 0/0 1/1 0/0 .text JPARegistPrm__FP18JPAEmitterWorkData */ void JPARegistPrm(JPAEmitterWorkData* work) { JPABaseEmitter* emtr = work->mpEmtr; GXColor prm = emtr->mPrmClr; prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r); prm.g = COLOR_MULTI(prm.g, emtr->mGlobalPrmClr.g); prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b); prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a); GXSetTevColor(GX_TEVREG0, prm); } /* 80276C2C-80276CB0 27156C 0084+00 0/0 1/1 0/0 .text JPARegistEnv__FP18JPAEmitterWorkData */ void JPARegistEnv(JPAEmitterWorkData* work) { JPABaseEmitter* emtr = work->mpEmtr; GXColor env = emtr->mEnvClr; env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r); env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g); env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b); GXSetTevColor(GX_TEVREG1, env); } /* 80276CB0-80276DB0 2715F0 0100+00 0/0 1/1 0/0 .text JPARegistPrmEnv__FP18JPAEmitterWorkData */ void JPARegistPrmEnv(JPAEmitterWorkData* work) { JPABaseEmitter* emtr = work->mpEmtr; GXColor prm = emtr->mPrmClr; GXColor env = emtr->mEnvClr; prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r); prm.g = COLOR_MULTI(prm.g, emtr->mGlobalPrmClr.g); prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b); prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a); env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r); env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g); env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b); GXSetTevColor(GX_TEVREG0, prm); GXSetTevColor(GX_TEVREG1, env); } /* 80276DB0-80276E60 2716F0 00B0+00 0/0 1/1 0/0 .text * JPARegistAlpha__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPARegistAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { JPABaseEmitter* emtr = work->mpEmtr; GXColor prm = emtr->mPrmClr; prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r); prm.g = COLOR_MULTI(prm.g, emtr->mGlobalPrmClr.g); prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b); prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a); prm.a = COLOR_MULTI(prm.a, ptcl->mPrmColorAlphaAnm); GXSetTevColor(GX_TEVREG0, prm); } /* 80276E60-80276F10 2717A0 00B0+00 0/0 1/1 0/0 .text * JPARegistPrmAlpha__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { JPABaseEmitter* emtr = work->mpEmtr; GXColor prm = ptcl->mPrmClr; prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r); prm.g = COLOR_MULTI(prm.g, emtr->mGlobalPrmClr.g); prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b); prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a); prm.a = COLOR_MULTI(prm.a, ptcl->mPrmColorAlphaAnm); GXSetTevColor(GX_TEVREG0, prm); } /* 80276F10-80277024 271850 0114+00 0/0 1/1 0/0 .text * JPARegistPrmAlphaEnv__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPARegistPrmAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { JPABaseEmitter* emtr = work->mpEmtr; GXColor prm = ptcl->mPrmClr; GXColor env = ptcl->mEnvClr; prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r); prm.g = COLOR_MULTI(prm.g, emtr->mGlobalPrmClr.g); prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b); prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a); prm.a = COLOR_MULTI(prm.a, ptcl->mPrmColorAlphaAnm); env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r); env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g); env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b); GXSetTevColor(GX_TEVREG0, prm); GXSetTevColor(GX_TEVREG1, env); } /* 80277024-80277138 271964 0114+00 0/0 1/1 0/0 .text * JPARegistAlphaEnv__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPARegistAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { JPABaseEmitter* emtr = work->mpEmtr; GXColor prm = emtr->mPrmClr; GXColor env = ptcl->mEnvClr; prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r); prm.g = COLOR_MULTI(prm.g, emtr->mGlobalPrmClr.g); prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b); prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a); prm.a = COLOR_MULTI(prm.a, ptcl->mPrmColorAlphaAnm); env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r); env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g); env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b); GXSetTevColor(GX_TEVREG0, prm); GXSetTevColor(GX_TEVREG1, env); } /* 80277138-802771BC 271A78 0084+00 0/0 1/1 0/0 .text * JPARegistEnv__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPARegistEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { JPABaseEmitter* emtr = work->mpEmtr; GXColor env = ptcl->mEnvClr; env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r); env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g); env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b); GXSetTevColor(GX_TEVREG1, env); } /* 802771BC-802771E8 271AFC 002C+00 0/0 1/1 0/0 .text JPACalcClrIdxNormal__FP18JPAEmitterWorkData */ void JPACalcClrIdxNormal(JPAEmitterWorkData* work) { JPABaseShape* bsp = work->mpRes->getBsp(); // can't get the extsh to appear in the right spot... s16 keyFrame; if (work->mpEmtr->mTick < bsp->getClrAnmMaxFrm()) { keyFrame = work->mpEmtr->mTick; } else { keyFrame = bsp->getClrAnmMaxFrm(); } work->mClrKeyFrame = keyFrame; } /* 802771E8-80277210 271B28 0028+00 0/0 1/1 0/0 .text * JPACalcClrIdxNormal__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcClrIdxNormal(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); s16 age = param_1->mAge; s16 maxFrm = shape->getClrAnmMaxFrm(); s16 keyFrame; if (age < maxFrm) { keyFrame = age; } else { keyFrame = maxFrm; } work->mClrKeyFrame = keyFrame; } /* 80277210-80277240 271B50 0030+00 0/0 1/1 0/0 .text JPACalcClrIdxRepeat__FP18JPAEmitterWorkData */ void JPACalcClrIdxRepeat(JPAEmitterWorkData* work) { JPABaseShape* shape = work->mpRes->getBsp(); work->mClrKeyFrame = work->mpEmtr->mTick % (shape->getClrAnmMaxFrm() + 1); } /* 80277240-8027727C 271B80 003C+00 0/0 1/1 0/0 .text * JPACalcClrIdxRepeat__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcClrIdxRepeat(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); s32 tick = shape->getClrLoopOfst(param_1->mAnmRandom); tick = param_1->mAge + tick; work->mClrKeyFrame = tick % (shape->getClrAnmMaxFrm() + 1); } /* 8027727C-802772BC 271BBC 0040+00 0/0 1/1 0/0 .text JPACalcClrIdxReverse__FP18JPAEmitterWorkData */ void JPACalcClrIdxReverse(JPAEmitterWorkData* work) { JPABaseShape* shape = work->mpRes->getBsp(); int maxFrm = shape->getClrAnmMaxFrm(); u32 tick = work->mpEmtr->mTick; u32 uVar1 = tick / maxFrm; tick = tick % maxFrm; uVar1 &= 1; work->mClrKeyFrame = tick + (uVar1) * (maxFrm - tick * 2); } /* 802772BC-80277308 271BFC 004C+00 0/0 1/1 0/0 .text * JPACalcClrIdxReverse__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcClrIdxReverse(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); s32 tick = param_1->mAge + shape->getClrLoopOfst(param_1->mAnmRandom); s32 maxFrm = shape->getClrAnmMaxFrm(); s32 rem = tick % maxFrm; work->mClrKeyFrame = rem + ((tick / maxFrm) & 1) * (maxFrm - rem * 2); } /* 80277308-80277314 271C48 000C+00 0/0 1/1 0/0 .text JPACalcClrIdxMerge__FP18JPAEmitterWorkData */ void JPACalcClrIdxMerge(JPAEmitterWorkData* work) { work->mClrKeyFrame = 0; } /* 80277314-80277384 271C54 0070+00 0/0 1/1 0/0 .text * JPACalcClrIdxMerge__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcClrIdxMerge(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); s32 maxFrm = shape->getClrAnmMaxFrm() + 1; s32 tick = (s32)(param_1->mTime * maxFrm) + shape->getClrLoopOfst(param_1->mAnmRandom); work->mClrKeyFrame = tick % maxFrm; } /* 80277384-80277390 271CC4 000C+00 0/0 1/1 0/0 .text JPACalcClrIdxRandom__FP18JPAEmitterWorkData */ void JPACalcClrIdxRandom(JPAEmitterWorkData* work) { work->mClrKeyFrame = 0; } /* 80277390-802773C4 271CD0 0034+00 0/0 1/1 0/0 .text * JPACalcClrIdxRandom__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcClrIdxRandom(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); s32 tick = shape->getClrLoopOfst(param_1->mAnmRandom); s32 maxFrm = shape->getClrAnmMaxFrm() + 1; work->mClrKeyFrame = tick % maxFrm; } /* 802773C4-80277404 271D04 0040+00 0/0 1/1 0/0 .text JPACalcPrm__FP18JPAEmitterWorkData */ void JPACalcPrm(JPAEmitterWorkData* work) { work->mpRes->getBsp()->getPrmClr(work->mClrKeyFrame, &work->mpEmtr->mPrmClr); } /* 80277404-80277440 271D44 003C+00 0/0 1/1 0/0 .text * JPACalcPrm__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcPrm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { work->mpRes->getBsp()->getPrmClr(work->mClrKeyFrame, &ptcl->mPrmClr); } /* 80277440-80277480 271D80 0040+00 0/0 1/1 0/0 .text JPACalcEnv__FP18JPAEmitterWorkData */ void JPACalcEnv(JPAEmitterWorkData* work) { work->mpRes->getBsp()->getEnvClr(work->mClrKeyFrame, &work->mpEmtr->mEnvClr); } /* 80277480-802774BC 271DC0 003C+00 0/0 1/1 0/0 .text * JPACalcEnv__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { work->mpRes->getBsp()->getEnvClr(work->mClrKeyFrame, &ptcl->mEnvClr); } /* 802774BC-80277504 271DFC 0048+00 0/0 1/1 0/0 .text * JPACalcColorCopy__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcColorCopy(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { JPABaseEmitter* emtr = work->mpEmtr; ptcl->mPrmClr = emtr->mPrmClr; ptcl->mEnvClr = emtr->mEnvClr; } /* 80277504-8027753C 271E44 0038+00 0/0 1/1 0/0 .text JPAGenTexCrdMtxIdt__FP18JPAEmitterWorkData */ void JPAGenTexCrdMtxIdt(JPAEmitterWorkData* param_0) { GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_FALSE, GX_PTIDENTITY); } /* 8027753C-80277574 271E7C 0038+00 0/0 1/1 0/0 .text JPAGenTexCrdMtxAnm__FP18JPAEmitterWorkData */ void JPAGenTexCrdMtxAnm(JPAEmitterWorkData* param_0) { GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0, GX_FALSE, GX_PTIDENTITY); } /* 80277574-802775AC 271EB4 0038+00 0/0 1/1 0/0 .text JPAGenTexCrdMtxPrj__FP18JPAEmitterWorkData */ void JPAGenTexCrdMtxPrj(JPAEmitterWorkData* param_0) { GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX3x4, GX_TG_POS, GX_TEXMTX0, GX_FALSE, GX_PTIDENTITY); } /* 802775AC-80277758 271EEC 01AC+00 0/0 1/1 0/0 .text * JPAGenCalcTexCrdMtxAnm__FP18JPAEmitterWorkData */ void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) { JPABaseShape* shape = work->mpRes->getBsp(); f32 dVar16 = work->mpEmtr->mTick; f32 dVar15 = 0.5f * (1.0f + shape->getTilingS()); f32 dVar14 = 0.5f * (1.0f + shape->getTilingT()); f32 dVar11 = (dVar16 * shape->getIncTransX()) + shape->getInitTransX(); f32 dVar10 = (dVar16 * shape->getIncTransY()) + shape->getInitTransY(); f32 dVar13 = (dVar16 * shape->getIncScaleX()) + shape->getInitScaleX(); f32 dVar12 = (dVar16 * shape->getIncScaleY()) + shape->getInitScaleY(); s32 local_c0 = (dVar16 * shape->getIncRot()) + shape->getInitRot(); f32 dVar8 = JMASSin(local_c0); f32 dVar9 = JMASCos(local_c0); Mtx local_108; local_108[0][0] = dVar13 * dVar9; local_108[0][1] = -dVar13 * dVar8; local_108[0][2] = 0.0f; local_108[0][3] = (dVar15 + (dVar13 * ((dVar8 * (dVar14 + dVar10)) - (dVar9 * (dVar15 + dVar11))))); local_108[1][0] = dVar12 * dVar8; local_108[1][1] = dVar12 * dVar9; local_108[1][2] = 0.0f; local_108[1][3] = (dVar14 + (-dVar12 * ((dVar8 * (dVar15 + dVar11)) + (dVar9 * (dVar14 + dVar10))))); local_108[2][0] = 0.0f; local_108[2][1] = 0.0f; local_108[2][2] = 1.0f; local_108[2][3] = 0.0f; GXLoadTexMtxImm(local_108, 0x1e, GX_MTX2x4); GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x1e, false, 0x7d); } /* 80277758-802778EC 272098 0194+00 0/0 1/1 0/0 .text * JPALoadCalcTexCrdMtxAnm__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); f32 dVar16 = param_1->mAge; f32 dVar15 = 0.5f * (1.0f + shape->getTilingS()); f32 dVar14 = 0.5f * (1.0f + shape->getTilingT()); f32 dVar11 = (dVar16 * shape->getIncTransX()) + shape->getInitTransX(); f32 dVar10 = (dVar16 * shape->getIncTransY()) + shape->getInitTransY(); f32 dVar13 = (dVar16 * shape->getIncScaleX()) + shape->getInitScaleX(); f32 dVar12 = (dVar16 * shape->getIncScaleY()) + shape->getInitScaleY(); s32 local_c0 = (dVar16 * shape->getIncRot()) + shape->getInitRot(); f32 dVar8 = JMASSin(local_c0); f32 dVar9 = JMASCos(local_c0); Mtx local_108; local_108[0][0] = dVar13 * dVar9; local_108[0][1] = -dVar13 * dVar8; local_108[0][2] = 0.0f; local_108[0][3] = (dVar15 + (dVar13 * ((dVar8 * (dVar14 + dVar10)) - (dVar9 * (dVar15 + dVar11))))); local_108[1][0] = dVar12 * dVar8; local_108[1][1] = dVar12 * dVar9; local_108[1][2] = 0.0f; local_108[1][3] = (dVar14 + (-dVar12 * ((dVar8 * (dVar15 + dVar11)) + (dVar9 * (dVar14 + dVar10))))); local_108[2][0] = 0.0f; local_108[2][1] = 0.0f; local_108[2][2] = 1.0f; local_108[2][3] = 0.0f; GXLoadTexMtxImm(local_108, 0x1e, GX_MTX2x4); } /* 802778EC-80277940 27222C 0054+00 0/0 1/1 0/0 .text JPALoadTex__FP18JPAEmitterWorkData */ void JPALoadTex(JPAEmitterWorkData* work) { work->mpResMgr->load(work->mpRes->getTexIdx(work->mpRes->getBsp()->getTexIdx()), GX_TEXMAP0); } /* 80277940-80277990 272280 0050+00 0/0 1/1 0/0 .text JPALoadTexAnm__FP18JPAEmitterWorkData */ void JPALoadTexAnm(JPAEmitterWorkData* work) { work->mpResMgr->load(work->mpRes->getTexIdx(work->mpEmtr->mTexAnmIdx), GX_TEXMAP0); } /* 80277990-802779DC 2722D0 004C+00 0/0 1/1 0/0 .text * JPALoadTexAnm__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPALoadTexAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { work->mpResMgr->load(work->mpRes->getTexIdx(ptcl->mTexAnmIdx), GX_TEXMAP0); } /* 802779DC-80277A18 27231C 003C+00 0/0 1/1 0/0 .text JPACalcTexIdxNormal__FP18JPAEmitterWorkData */ void JPACalcTexIdxNormal(JPAEmitterWorkData* work) { JPABaseShape* shape = work->mpRes->getBsp(); u8 tick = shape->getTexAnmKeyNum() - 1 < work->mpEmtr->mTick ? shape->getTexAnmKeyNum() - 1 : work->mpEmtr->mTick; work->mpEmtr->mTexAnmIdx = shape->getTexIdx(tick); } /* 80277A18-80277A50 272358 0038+00 0/0 1/1 0/0 .text * JPACalcTexIdxNormal__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcTexIdxNormal(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); u8 tick = shape->getTexAnmKeyNum() - 1 < param_1->mAge ? shape->getTexAnmKeyNum() - 1 : param_1->mAge; param_1->mTexAnmIdx = shape->getTexIdx(tick); } /* 80277A50-80277A88 272390 0038+00 0/0 1/1 0/0 .text JPACalcTexIdxRepeat__FP18JPAEmitterWorkData */ void JPACalcTexIdxRepeat(JPAEmitterWorkData* work) { JPABaseShape* shape = work->mpRes->getBsp(); work->mpEmtr->mTexAnmIdx = shape->getTexIdx(work->mpEmtr->mTick % shape->getTexAnmKeyNum()); } /* 80277A88-80277ACC 2723C8 0044+00 0/0 1/1 0/0 .text * JPACalcTexIdxRepeat__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcTexIdxRepeat(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); param_1->mTexAnmIdx = shape->getTexIdx( ((int)shape->getTexLoopOfst(param_1->mAnmRandom) + param_1->mAge) % shape->getTexAnmKeyNum()); } /* 80277ACC-80277B1C 27240C 0050+00 0/0 1/1 0/0 .text JPACalcTexIdxReverse__FP18JPAEmitterWorkData */ void JPACalcTexIdxReverse(JPAEmitterWorkData* work) { JPABaseShape* shape = work->mpRes->getBsp(); int tick = work->mpEmtr->mTick; int keyNum = (int)shape->getTexAnmKeyNum() - 1; int div = tick / keyNum; int rem = tick % keyNum; work->mpEmtr->mTexAnmIdx = shape->getTexIdx(rem + (div & 1) * (keyNum - rem * 2)); } /* 80277B1C-80277B78 27245C 005C+00 0/0 1/1 0/0 .text * JPACalcTexIdxReverse__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcTexIdxReverse(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); s32 tick = shape->getTexLoopOfst(param_1->mAnmRandom) + param_1->mAge; int keyNum = (int)shape->getTexAnmKeyNum() - 1; int div = tick / keyNum; int rem = tick % keyNum; param_1->mTexAnmIdx = shape->getTexIdx(rem + (div & 1) * (keyNum - rem * 2)); } /* 80277B78-80277B94 2724B8 001C+00 0/0 1/1 0/0 .text JPACalcTexIdxMerge__FP18JPAEmitterWorkData */ void JPACalcTexIdxMerge(JPAEmitterWorkData* work) { work->mpEmtr->mTexAnmIdx = work->mpRes->getBsp()->getTexIdx(); } /* 80277B94-80277C0C 2724D4 0078+00 0/0 1/1 0/0 .text * JPACalcTexIdxMerge__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcTexIdxMerge(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); s32 maxFrm = shape->getTexAnmKeyNum(); s32 tick = (s32)(maxFrm * param_1->mTime) + shape->getTexLoopOfst(param_1->mAnmRandom); param_1->mTexAnmIdx = shape->getTexIdx(tick % maxFrm); } /* 80277C0C-80277C28 27254C 001C+00 0/0 1/1 0/0 .text JPACalcTexIdxRandom__FP18JPAEmitterWorkData */ void JPACalcTexIdxRandom(JPAEmitterWorkData* work) { work->mpEmtr->mTexAnmIdx = work->mpRes->getBsp()->getTexIdx(); } /* 80277C28-80277C64 272568 003C+00 0/0 1/1 0/0 .text * JPACalcTexIdxRandom__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPACalcTexIdxRandom(JPAEmitterWorkData* work, JPABaseParticle* param_1) { JPABaseShape* shape = work->mpRes->getBsp(); param_1->mTexAnmIdx = shape->getTexIdx(((int)shape->getTexLoopOfst(param_1->mAnmRandom)) % shape->getTexAnmKeyNum()); } /* 80277C64-80277C8C 2725A4 0028+00 0/0 1/1 0/0 .text JPALoadPosMtxCam__FP18JPAEmitterWorkData */ void JPALoadPosMtxCam(JPAEmitterWorkData* work) { GXLoadPosMtxImm(work->mPosCamMtx, GX_PNMTX0); } /* 80277C8C-80277C90 2725CC 0004+00 1/0 0/0 0/0 .text noLoadPrj__FPC18JPAEmitterWorkDataPA4_Cf */ static void noLoadPrj(JPAEmitterWorkData const* work, const Mtx srt) { /* empty function */ } /* 80277C90-80277CC8 2725D0 0038+00 1/0 0/0 0/0 .text loadPrj__FPC18JPAEmitterWorkDataPA4_Cf */ void loadPrj(JPAEmitterWorkData const* work, const Mtx srt) { Mtx mtx; MTXConcat(work->mPrjMtx, srt, mtx); GXLoadTexMtxImm(mtx, GX_TEXMTX0, GX_MTX3x4); } /* 80277CC8-80277E88 272608 01C0+00 1/0 0/0 0/0 .text loadPrjAnm__FPC18JPAEmitterWorkDataPA4_Cf */ static void loadPrjAnm(JPAEmitterWorkData const* work, const Mtx srt) { JPABaseShape* shape = work->mpRes->getBsp(); f32 dVar16 = work->mpEmtr->getAge(); f32 dVar15 = 0.5f * (1.0f + shape->getTilingS()); f32 dVar14 = 0.5f * (1.0f + shape->getTilingT()); f32 dVar11 = (dVar16 * shape->getIncTransX()) + shape->getInitTransX(); f32 dVar10 = (dVar16 * shape->getIncTransY()) + shape->getInitTransY(); f32 dVar13 = (dVar16 * shape->getIncScaleX()) + shape->getInitScaleX(); f32 dVar12 = (dVar16 * shape->getIncScaleY()) + shape->getInitScaleY(); s32 local_c0 = (dVar16 * shape->getIncRot()) + shape->getInitRot(); f32 dVar8 = JMASSin(local_c0); f32 dVar9 = JMASCos(local_c0); Mtx local_108; local_108[0][0] = dVar13 * dVar9; local_108[0][1] = -dVar13 * dVar8; local_108[0][2] = (dVar15 + (dVar13 * ((dVar8 * (dVar14 + dVar10)) - (dVar9 * (dVar15 + dVar11))))); local_108[0][3] = 0.0f; local_108[1][0] = dVar12 * dVar8; local_108[1][1] = dVar12 * dVar9; local_108[1][2] = (dVar14 + (-dVar12 * ((dVar8 * (dVar15 + dVar11)) + (dVar9 * (dVar14 + dVar10))))); local_108[1][3] = 0.0f; local_108[2][0] = 0.0f; local_108[2][1] = 0.0f; local_108[2][2] = 1.0f; local_108[2][3] = 0.0f; MTXConcat(local_108, work->mPrjMtx, local_108); MTXConcat(local_108, srt, local_108); GXLoadTexMtxImm(local_108, 0x1e, GX_MTX3x4); } /* 803C42E0-803C4300 021400 0020+00 10/9 0/0 0/0 .data jpa_dl */ static u8 jpa_dl[32] = { 0x80, 0x00, 0x04, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; /* 803C4300-803C4320 021420 0020+00 1/0 0/0 0/0 .data jpa_dl_x */ static u8 jpa_dl_x[32] = { 0x80, 0x00, 0x08, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x48, 0x00, 0x49, 0x01, 0x4A, 0x02, 0x4B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; typedef void (*projectionFunc)(JPAEmitterWorkData const*, const Mtx); /* 803C4320-803C432C -00001 000C+00 6/10 0/0 0/0 .data p_prj */ static projectionFunc p_prj[3] = { noLoadPrj, loadPrj, loadPrjAnm, }; /* 80277E88-80277F70 2727C8 00E8+00 0/0 1/1 0/0 .text * JPADrawBillboard__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { JGeometry::TVec3 local_48; MTXMultVec(work->mPosCamMtx, param_1->mPosition, local_48); Mtx local_38; local_38[0][0] = work->mGlobalPtclScl.x * param_1->mParticleScaleX; local_38[0][3] = local_48.x; local_38[1][1] = work->mGlobalPtclScl.y * param_1->mParticleScaleY; local_38[1][3] = local_48.y; local_38[2][2] = 1.0f; local_38[2][3] = local_48.z; local_38[2][1] = 0.0f; local_38[2][0] = 0.0f; local_38[1][2] = 0.0f; local_38[1][0] = 0.0f; local_38[0][2] = 0.0f; local_38[0][1] = 0.0f; GXLoadPosMtxImm(local_38, 0); p_prj[work->mPrjType](work, local_38); GXCallDisplayList(jpa_dl, sizeof(jpa_dl)); } } /* 80277F70-80278088 2728B0 0118+00 0/0 1/1 0/0 .text * JPADrawRotBillboard__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { JGeometry::TVec3 local_48; MTXMultVec(work->mPosCamMtx, param_1->mPosition, local_48); f32 sinRot = JMASSin(param_1->mRotateAngle); f32 cosRot = JMASCos(param_1->mRotateAngle); f32 particleX = work->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY; Mtx local_38; local_38[0][0] = cosRot * particleX; local_38[0][1] = -sinRot * particleY; local_38[0][3] = local_48.x; local_38[1][0] = sinRot * particleX; local_38[1][1] = cosRot * particleY; local_38[1][3] = local_48.y; local_38[2][2] = 1.0f; local_38[2][3] = local_48.z; local_38[2][1] = 0.0f; local_38[2][0] = 0.0f; local_38[1][2] = 0.0f; local_38[0][2] = 0.0f; GXLoadPosMtxImm(local_38, 0); p_prj[work->mPrjType](work, local_38); GXCallDisplayList(jpa_dl, sizeof(jpa_dl)); } } /* 80278088-80278184 2729C8 00FC+00 0/0 1/1 0/0 .text * JPADrawYBillboard__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { JGeometry::TVec3 local_48; MTXMultVec(work->mPosCamMtx, param_1->mPosition, local_48); Mtx local_38; f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY; local_38[0][0] = work->mGlobalPtclScl.x * param_1->mParticleScaleX; local_38[0][3] = local_48.x; local_38[1][1] = work->mYBBCamMtx[1][1] * particleY; local_38[1][2] = work->mYBBCamMtx[1][2]; local_38[1][3] = local_48.y; local_38[2][1] = work->mYBBCamMtx[2][1] * particleY; local_38[2][2] = work->mYBBCamMtx[2][2]; local_38[2][3] = local_48.z; local_38[2][0] = 0.0f; local_38[1][0] = 0.0f; local_38[0][2] = 0.0f; local_38[0][1] = 0.0f; GXLoadPosMtxImm(local_38, 0); p_prj[work->mPrjType](work, local_38); GXCallDisplayList(jpa_dl, sizeof(jpa_dl)); } } /* 80278184-802782B4 272AC4 0130+00 0/0 1/1 0/0 .text * JPADrawRotYBillboard__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { JGeometry::TVec3 local_48; MTXMultVec(work->mPosCamMtx, param_1->mPosition, local_48); f32 sinRot = JMASSin(param_1->mRotateAngle); f32 cosRot = JMASCos(param_1->mRotateAngle); Mtx local_38; f32 particleX = work->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY; f32 local_98 = (float)(sinRot * particleX); f32 local_94 = (float)(cosRot * particleY); f32 local_90 = work->mYBBCamMtx[1][1]; f32 fVar1 = work->mYBBCamMtx[2][1]; local_38[0][0] = (float)(cosRot * particleX); local_38[0][1] = (float)(-sinRot * particleY); local_38[0][2] = 0.0f; local_38[0][3] = local_48.x; local_38[1][0] = local_98 * local_90; local_38[1][1] = local_94 * local_90; local_38[1][2] = -fVar1; local_38[1][3] = local_48.y; local_38[2][0] = local_98 * fVar1; local_38[2][1] = local_94 * fVar1; local_38[2][2] = local_90; local_38[2][3] = local_48.z; GXLoadPosMtxImm(local_38, 0); p_prj[work->mPrjType](work, local_38); GXCallDisplayList(jpa_dl, sizeof(jpa_dl)); } } /* 802782B4-802782D0 272BF4 001C+00 1/0 0/0 0/0 .text * dirTypeVel__FPC18JPAEmitterWorkDataPC15JPABaseParticlePQ29JGeometry8TVec3 */ void dirTypeVel(JPAEmitterWorkData const* work, JPABaseParticle const* param_1, JGeometry::TVec3* param_2) { param_1->getVelVec(*param_2); } /* 802782D0-802782EC 272C10 001C+00 1/0 0/0 0/0 .text * dirTypePos__FPC18JPAEmitterWorkDataPC15JPABaseParticlePQ29JGeometry8TVec3 */ void dirTypePos(JPAEmitterWorkData const* work, JPABaseParticle const* param_1, JGeometry::TVec3* param_2) { param_1->getLocalPosition(*param_2); } /* 802782EC-80278320 272C2C 0034+00 1/0 0/0 0/0 .text * dirTypePosInv__FPC18JPAEmitterWorkDataPC15JPABaseParticlePQ29JGeometry8TVec3 */ void dirTypePosInv(JPAEmitterWorkData const* work, JPABaseParticle const* param_1, JGeometry::TVec3* param_2) { param_1->getLocalPosition(*param_2); param_2->negate(); } /* 80278320-8027833C 272C60 001C+00 1/0 0/0 0/0 .text * dirTypeEmtrDir__FPC18JPAEmitterWorkDataPC15JPABaseParticlePQ29JGeometry8TVec3 */ void dirTypeEmtrDir(JPAEmitterWorkData const* work, JPABaseParticle const* param_1, JGeometry::TVec3* param_2) { param_2->set(work->mGlobalEmtrDir); } /* 8027833C-802783D4 272C7C 0098+00 1/0 0/0 0/0 .text * dirTypePrevPtcl__FPC18JPAEmitterWorkDataPC15JPABaseParticlePQ29JGeometry8TVec3 */ void dirTypePrevPtcl(JPAEmitterWorkData const* work, JPABaseParticle const* param_1, JGeometry::TVec3* param_2) { JGeometry::TVec3 aTStack_24; param_1->getGlobalPosition(aTStack_24); JPANode* end = work->mpAlivePtcl->getEnd(); JPANode* prev = work->mpCurNode->getPrev(); if (end != prev) { JPABaseParticle* particle = work->mpCurNode->getPrev()->getObject(); particle->getGlobalPosition(*param_2); } else { work->mpEmtr->calcEmitterGlobalPosition(param_2); } param_2->sub(aTStack_24); } /* 802783D4-80278414 272D14 0040+00 1/0 0/0 0/0 .text rotTypeY__FffRA3_A4_f */ static void rotTypeY(f32 param_0, f32 param_1, Mtx& param_2) { param_2[0][0] = param_1; param_2[0][1] = 0.0f; param_2[0][2] = -param_0; param_2[0][3] = 0.0f; param_2[1][0] = 0.0f; param_2[1][1] = 1.0f; param_2[1][2] = 0.0f; param_2[1][3] = 0.0f; param_2[2][0] = param_0; param_2[2][1] = 0.0f; param_2[2][2] = param_1; param_2[2][3] = 0.0f; } /* 80278414-80278454 272D54 0040+00 1/0 0/0 0/0 .text rotTypeX__FffRA3_A4_f */ static void rotTypeX(f32 param_0, f32 param_1, Mtx& param_2) { param_2[0][0] = 1.0f; param_2[0][1] = 0.0f; param_2[0][2] = 0.0f; param_2[0][3] = 0.0f; param_2[1][0] = 0.0f; param_2[1][1] = param_1; param_2[1][2] = -param_0; param_2[1][3] = 0.0f; param_2[2][0] = 0.0f; param_2[2][1] = param_0; param_2[2][2] = param_1; param_2[2][3] = 0.0f; } /* 80278454-80278494 272D94 0040+00 1/0 0/0 0/0 .text rotTypeZ__FffRA3_A4_f */ static void rotTypeZ(f32 param_0, f32 param_1, Mtx& param_2) { param_2[0][0] = param_1; param_2[0][1] = -param_0; param_2[0][2] = 0.0f; param_2[0][3] = 0.0f; param_2[1][0] = param_0; param_2[1][1] = param_1; param_2[1][2] = 0.0f; param_2[1][3] = 0.0f; param_2[2][0] = 0.0f; param_2[2][1] = 0.0f; param_2[2][2] = 1.0f; param_2[2][3] = 0.0f; } /* 80278494-802784F0 272DD4 005C+00 1/0 0/0 0/0 .text rotTypeXYZ__FffRA3_A4_f */ static void rotTypeXYZ(f32 param_0, f32 param_1, Mtx& param_2) { f32 f3 = 0.33333298563957214f * (1.0f - param_1); f32 fVar1; f32 f4; f4 = f3 + 0.5773500204086304f * param_0; fVar1 = f3 - 0.5773500204086304f * param_0; f3 += param_1; param_2[0][0] = f3; param_2[0][1] = fVar1; param_2[0][2] = f4; param_2[0][3] = 0.0f; param_2[1][0] = f4; param_2[1][1] = f3; param_2[1][2] = fVar1; param_2[1][3] = 0.0f; param_2[2][0] = fVar1; param_2[2][1] = f4; param_2[2][2] = f3; param_2[2][3] = 0.0f; } /* 802784F0-8027853C 272E30 004C+00 1/0 0/0 0/0 .text basePlaneTypeXY__FPA4_fff */ static void basePlaneTypeXY(MtxP param_0, f32 param_1, f32 param_2) { param_0[0][0] *= param_1; param_0[1][0] *= param_1; param_0[2][0] *= param_1; param_0[0][1] *= param_2; param_0[1][1] *= param_2; param_0[2][1] *= param_2; } /* 8027853C-80278588 272E7C 004C+00 1/0 0/0 0/0 .text basePlaneTypeXZ__FPA4_fff */ static void basePlaneTypeXZ(MtxP param_0, f32 param_1, f32 param_2) { param_0[0][0] *= param_1; param_0[1][0] *= param_1; param_0[2][0] *= param_1; param_0[0][2] *= param_2; param_0[1][2] *= param_2; param_0[2][2] *= param_2; } /* 80278588-802785F8 272EC8 0070+00 1/0 0/0 0/0 .text basePlaneTypeX__FPA4_fff */ static void basePlaneTypeX(MtxP param_0, f32 param_1, f32 param_2) { param_0[0][0] *= param_1; param_0[1][0] *= param_1; param_0[2][0] *= param_1; param_0[0][1] *= param_2; param_0[1][1] *= param_2; param_0[2][1] *= param_2; param_0[0][2] *= param_1; param_0[1][2] *= param_1; param_0[2][2] *= param_1; } /* 803C432C-803C4340 -00001 0014+00 2/5 0/0 0/0 .data p_direction */ typedef void (*dirTypeFunc)(JPAEmitterWorkData const*, JPABaseParticle const*, JGeometry::TVec3*); static dirTypeFunc p_direction[5] = { dirTypeVel, dirTypePos, dirTypePosInv, dirTypeEmtrDir, dirTypePrevPtcl, }; /* 803C4340-803C4354 -00001 0014+00 0/2 0/0 0/0 .data p_rot */ typedef void (*rotTypeFunc)(f32, f32, Mtx&); #pragma push #pragma force_active on static rotTypeFunc p_rot[5] = { rotTypeY, rotTypeX, rotTypeZ, rotTypeXYZ, rotTypeY, }; #pragma pop /* 803C4354-803C4360 -00001 000C+00 0/3 0/0 0/0 .data p_plane */ typedef void (*planeFunc)(MtxP, f32, f32); static planeFunc p_plane[3] = { basePlaneTypeXY, basePlaneTypeXZ, basePlaneTypeX, }; /* 804507A0-804507A8 -00001 0008+00 3/3 0/0 0/0 .sdata p_dl */ static u8* p_dl[2] = { jpa_dl, jpa_dl_x, }; /* 802785F8-80278994 272F38 039C+00 0/0 1/1 0/0 .text * JPADrawDirection__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { JGeometry::TVec3 local_6c; JGeometry::TVec3 local_78; p_direction[param_0->mDirType](param_0, param_1, &local_6c); if (!local_6c.isZero()) { local_6c.normalize(); local_78.cross(param_1->mBaseAxis, local_6c); if (!local_78.isZero()) { local_78.normalize(); param_1->mBaseAxis.cross(local_6c, local_78); param_1->mBaseAxis.normalize(); Mtx local_60; f32 fVar1 = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 fVar2 = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY; local_60[0][0] = param_1->mBaseAxis.x; local_60[0][1] = local_6c.x; local_60[0][2] = local_78.x; local_60[0][3] = param_1->mPosition.x; local_60[1][0] = param_1->mBaseAxis.y; local_60[1][1] = local_6c.y; local_60[1][2] = local_78.y; local_60[1][3] = param_1->mPosition.y; local_60[2][0] = param_1->mBaseAxis.z; local_60[2][1] = local_6c.z; local_60[2][2] = local_78.z; local_60[2][3] = param_1->mPosition.z; p_plane[param_0->mPlaneType](local_60, fVar1, fVar2); MTXConcat(param_0->mPosCamMtx, local_60, local_60); GXLoadPosMtxImm(local_60, 0); p_prj[param_0->mPrjType](param_0, local_60); GXCallDisplayList(p_dl[param_0->mDLType], sizeof(jpa_dl)); } } } } /* 80278994-80278DA8 2732D4 0414+00 0/0 1/1 0/0 .text * JPADrawRotDirection__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawRotDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { f32 sinRot = JMASSin(param_1->mRotateAngle); f32 cosRot = JMASCos(param_1->mRotateAngle); JGeometry::TVec3 local_6c; JGeometry::TVec3 local_78; p_direction[param_0->mDirType](param_0, param_1, &local_6c); if (!local_6c.isZero()) { local_6c.normalize(); local_78.cross(param_1->mBaseAxis, local_6c); if (!local_78.isZero()) { local_78.normalize(); param_1->mBaseAxis.cross(local_6c, local_78); param_1->mBaseAxis.normalize(); f32 particleX = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY; Mtx auStack_80; Mtx local_60; p_rot[param_0->mRotType](sinRot, cosRot, auStack_80); p_plane[param_0->mPlaneType](auStack_80, particleX, particleY); local_60[0][0] = param_1->mBaseAxis.x; local_60[0][1] = local_6c.x; local_60[0][2] = local_78.x; local_60[0][3] = param_1->mPosition.x; local_60[1][0] = param_1->mBaseAxis.y; local_60[1][1] = local_6c.y; local_60[1][2] = local_78.y; local_60[1][3] = param_1->mPosition.y; local_60[2][0] = param_1->mBaseAxis.z; local_60[2][1] = local_6c.z; local_60[2][2] = local_78.z; local_60[2][3] = param_1->mPosition.z; MTXConcat(local_60, auStack_80, auStack_80); MTXConcat(param_0->mPosCamMtx, auStack_80, local_60); GXLoadPosMtxImm(local_60, 0); p_prj[param_0->mPrjType](param_0, local_60); GXCallDisplayList(p_dl[param_0->mDLType], sizeof(jpa_dl)); } } } } /* 80278DA8-80278FC8 2736E8 0220+00 0/0 1/1 0/0 .text * JPADrawDBillboard__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { JGeometry::TVec3 local_70; p_direction[param_0->mDirType](param_0, param_1, &local_70); JGeometry::TVec3 aTStack_7c; aTStack_7c.set(param_0->mPosCamMtx[2][0], param_0->mPosCamMtx[2][1], param_0->mPosCamMtx[2][2]); local_70.cross(local_70, aTStack_7c); if (!local_70.isZero()) { local_70.normalize(); MTXMultVecSR(param_0->mPosCamMtx, local_70, local_70); JGeometry::TVec3 local_88; MTXMultVec(param_0->mPosCamMtx, param_1->mPosition, local_88); f32 particleX = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY; Mtx local_60; local_60[0][0] = local_70.x * particleX; local_60[0][1] = -local_70.y * particleY; local_60[0][3] = local_88.x; local_60[1][0] = local_70.y * particleX; local_60[1][1] = local_70.x * particleY; local_60[1][3] = local_88.y; local_60[2][2] = 1.0f; local_60[2][3] = local_88.z; local_60[2][1] = 0.0f; local_60[2][0] = 0.0f; local_60[1][2] = 0.0f; local_60[0][2] = 0.0f; GXLoadPosMtxImm(local_60, 0); p_prj[param_0->mPrjType](param_0, local_60); GXCallDisplayList(jpa_dl, sizeof(jpa_dl)); } } } /* 80278FC8-80279110 273908 0148+00 0/0 1/1 0/0 .text * JPADrawRotation__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawRotation(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { f32 sinRot = JMASSin(param_1->mRotateAngle); f32 cosRot = JMASCos(param_1->mRotateAngle); f32 particleX = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX; f32 particleY = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY; Mtx auStack_88; p_rot[param_0->mRotType](sinRot, cosRot, auStack_88); p_plane[param_0->mPlaneType](auStack_88, particleX, particleY); auStack_88[0][3] = param_1->mPosition.x; auStack_88[1][3] = param_1->mPosition.y; auStack_88[2][3] = param_1->mPosition.z; MTXConcat(param_0->mPosCamMtx, auStack_88, auStack_88); GXLoadPosMtxImm(auStack_88, 0); p_prj[param_0->mPrjType](param_0, auStack_88); GXCallDisplayList(p_dl[param_0->mDLType], sizeof(jpa_dl)); } } /* 80279110-802791B0 273A50 00A0+00 0/0 1/1 0/0 .text * JPADrawPoint__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawPoint(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { if (!!(ptcl->mStatus & JPAPtclStts_Invisible)) return; GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); GXBegin(GX_POINTS, GX_VTXFMT1, 1); GXPosition3f32(ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z); GXTexCoord2f32(0.0f, 0.0f); GXEnd(); GXSetVtxDesc(GX_VA_POS, GX_INDEX8); GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8); } /* 802791B0-80279364 273AF0 01B4+00 0/0 1/1 0/0 .text * JPADrawLine__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawLine(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { if (param_1->checkStatus(8) == 0) { JGeometry::TVec3 local_1c; JGeometry::setTVec3f(¶m_1->mPosition.x, &local_1c.x); JGeometry::TVec3 local_28; param_1->getVelVec(local_28); if (!local_28.isZero()) { local_28.setLength(param_0->mGlobalPtclScl.y * (25.0f * param_1->mParticleScaleY)); local_28.sub(local_1c, local_28); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); GXBegin(GX_LINES, GX_VTXFMT1, 2); GXPosition3f32(local_1c.x, local_1c.y, local_1c.z); GXTexCoord2f32(0.0f, 0.0f); GXPosition3f32(local_28.x, local_28.y, local_28.z); GXTexCoord2f32(0.0f, 1.0f); GXEnd(); GXSetVtxDesc(GX_VA_POS, GX_INDEX8); GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8); } } } /* 80279364-8027936C 273CA4 0008+00 2/2 0/0 0/0 .text getNext__FP26JPANode<15JPABaseParticle> */ JPANode* getNext(JPANode* param_0) { return param_0->getNext(); } /* 8027936C-80279374 273CAC 0008+00 2/2 0/0 0/0 .text getPrev__FP26JPANode<15JPABaseParticle> */ JPANode* getPrev(JPANode* param_0) { return param_0->getPrev(); } typedef JPANode* (*getNodeFunc)(JPANode*); /* 80279374-8027996C 273CB4 05F8+00 0/0 1/1 0/0 .text JPADrawStripe__FP18JPAEmitterWorkData */ void JPADrawStripe(JPAEmitterWorkData* param_0) { JPABaseShape* shape = param_0->mpRes->getBsp(); u32 ptcl_num = param_0->mpAlivePtcl->getNum(); if (ptcl_num < 2) { return; } f32 coord = 0.0f; f32 step = 1.0f / (ptcl_num - 1.0f); f32 dVar14 = (1.0f + param_0->mPivot.x) * (25.0f * param_0->mGlobalPtclScl.x); f32 dVar13 = (1.0f - param_0->mPivot.x) * (25.0f * param_0->mGlobalPtclScl.x); Mtx local_c8; f32 dVar11; f32 dVar12; JGeometry::TVec3 local_ec; JGeometry::TVec3 local_e0[2]; JGeometry::TVec3 local_f8; JGeometry::TVec3 local_104; getNodeFunc node_func; JPANode* startNode; if (shape->isDrawFwdAhead()) { startNode = param_0->mpAlivePtcl->getLast(); node_func = getPrev; coord = 1.0f; step = -step; } else { startNode = param_0->mpAlivePtcl->getFirst(); node_func = getNext; } GXLoadPosMtxImm(param_0->mPosCamMtx, 0); p_prj[param_0->mPrjType](param_0, param_0->mPosCamMtx); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT1, ptcl_num << 1); for (JPANode* node = startNode; node != param_0->mpAlivePtcl->getEnd(); node = node_func(node), coord += step) { param_0->mpCurNode = node; JPABaseParticle* particle = node->getObject(); local_ec.set(particle->mPosition); dVar11 = JMASSin(particle->mRotateAngle); dVar12 = JMASCos(particle->mRotateAngle); local_e0[0].set(-particle->mParticleScaleX * dVar14, 0.0f, 0.0f); local_e0[0].set(local_e0[0].x * dVar12, 0.0f, local_e0[0].x * dVar11); local_e0[1].set(particle->mParticleScaleX * dVar13, 0.0f, 0.0f); local_e0[1].set(local_e0[1].x * dVar12, 0.0f, local_e0[1].x * dVar11); p_direction[param_0->mDirType](param_0, particle, &local_f8); if (local_f8.isZero()) { local_f8.set(0.0f, 1.0f, 0.0f); } else { local_f8.normalize(); } local_104.cross(particle->mBaseAxis, local_f8); if (local_104.isZero()) { local_104.set(1.0f, 0.0f, 0.0f); } else { local_104.normalize(); } particle->mBaseAxis.cross(local_f8, local_104); particle->mBaseAxis.normalize(); local_c8[0][0] = local_104.x; local_c8[0][1] = local_f8.x; local_c8[0][2] = particle->mBaseAxis.x; local_c8[0][3] = 0.0f; local_c8[1][0] = local_104.y; local_c8[1][1] = local_f8.y; local_c8[1][2] = particle->mBaseAxis.y; local_c8[1][3] = 0.0f; local_c8[2][0] = local_104.z; local_c8[2][1] = local_f8.z; local_c8[2][2] = particle->mBaseAxis.z; local_c8[2][3] = 0.0f; MTXMultVecArraySR(local_c8, (Vec*)local_e0, (Vec*)local_e0, 2); GXPosition3f32(local_e0[0].x + local_ec.x, local_e0[0].y + local_ec.y, local_e0[0].z + local_ec.z); GXTexCoord2f32(0.0f, coord); GXPosition3f32(local_e0[1].x + local_ec.x, local_e0[1].y + local_ec.y, local_e0[1].z + local_ec.z); GXTexCoord2f32(1.0f, coord); } GXEnd(); GXSetVtxDesc(GX_VA_POS, GX_INDEX8); GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8); } /* 8027996C-8027A3D8 2742AC 0A6C+00 0/0 1/1 0/0 .text JPADrawStripeX__FP18JPAEmitterWorkData */ void JPADrawStripeX(JPAEmitterWorkData* param_0) { JPABaseShape* shape = param_0->mpRes->getBsp(); u32 ptcl_num = param_0->mpAlivePtcl->getNum(); if (ptcl_num < 2) { return; } f32 start_coord = 0.0f; f32 coord = 0.0f; f32 step = 1.0f / (ptcl_num - 1.0f); f32 local_154 = (1.0f + param_0->mPivot.x) * (25.0f * param_0->mGlobalPtclScl.x); f32 local_158 = (1.0f - param_0->mPivot.x) * (25.0f * param_0->mGlobalPtclScl.x); f32 local_15c = (1.0f + param_0->mPivot.y) * (25.0f * param_0->mGlobalPtclScl.y); f32 local_160 = (1.0f - param_0->mPivot.y) * (25.0f * param_0->mGlobalPtclScl.y); Mtx local_90; f32 dVar11; f32 dVar12; JGeometry::TVec3 local_b4; JGeometry::TVec3 local_a8[2]; JGeometry::TVec3 local_c0; JGeometry::TVec3 local_cc; JPANode* startNode; getNodeFunc node_func; if (shape->isDrawFwdAhead()) { startNode = param_0->mpAlivePtcl->getLast(); node_func = getPrev; start_coord = coord = 1.0f; step = -step; } else { startNode = param_0->mpAlivePtcl->getFirst(); node_func = getNext; } GXLoadPosMtxImm(param_0->mPosCamMtx, 0); p_prj[param_0->mPrjType](param_0, param_0->mPosCamMtx); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT1, ptcl_num << 1); for (JPANode* node = startNode; node != param_0->mpAlivePtcl->getEnd(); node = node_func(node), coord += step) { param_0->mpCurNode = node; JPABaseParticle* particle = node->getObject(); local_b4.set(particle->mPosition); dVar11 = JMASSin(particle->mRotateAngle); dVar12 = JMASCos(particle->mRotateAngle); local_a8[0].set(-particle->mParticleScaleX * local_154, 0.0f, 0.0f); local_a8[0].set(local_a8[0].x * dVar12, 0.0f, local_a8[0].x * dVar11); local_a8[1].set(particle->mParticleScaleX * local_158, 0.0f, 0.0f); local_a8[1].set(local_a8[1].x * dVar12, 0.0f, local_a8[1].x * dVar11); p_direction[param_0->mDirType](param_0, particle, &local_c0); if (local_c0.isZero()) { local_c0.set(0.0f, 1.0f, 0.0f); } else { local_c0.normalize(); } local_cc.cross(particle->mBaseAxis, local_c0); if (local_cc.isZero()) { local_cc.set(1.0f, 0.0f, 0.0f); } else { local_cc.normalize(); } particle->mBaseAxis.cross(local_c0, local_cc); particle->mBaseAxis.normalize(); local_90[0][0] = local_cc.x; local_90[0][1] = local_c0.x; local_90[0][2] = particle->mBaseAxis.x; local_90[0][3] = 0.0f; local_90[1][0] = local_cc.y; local_90[1][1] = local_c0.y; local_90[1][2] = particle->mBaseAxis.y; local_90[1][3] = 0.0f; local_90[2][0] = local_cc.z; local_90[2][1] = local_c0.z; local_90[2][2] = particle->mBaseAxis.z; local_90[2][3] = 0.0f; MTXMultVecArraySR(local_90, (Vec*)local_a8, (Vec*)local_a8, 2); GXPosition3f32(local_a8[0].x + local_b4.x, local_a8[0].y + local_b4.y, local_a8[0].z + local_b4.z); GXTexCoord2f32(0.0f, coord); GXPosition3f32(local_a8[1].x + local_b4.x, local_a8[1].y + local_b4.y, local_a8[1].z + local_b4.z); GXTexCoord2f32(1.0f, coord); } GXEnd(); coord = start_coord; GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT1, ptcl_num << 1); for (JPANode* node = startNode; node != param_0->mpAlivePtcl->getEnd(); node = node_func(node), coord += step) { param_0->mpCurNode = node; JPABaseParticle* particle = node->getObject(); local_b4.set(particle->mPosition); dVar11 = JMASCos(particle->mRotateAngle); dVar12 = -JMASSin(particle->mRotateAngle); local_a8[0].set(-particle->mParticleScaleY * local_15c, 0.0f, 0.0f); local_a8[0].set(local_a8[0].x * dVar12, 0.0f, local_a8[0].x * dVar11); local_a8[1].set(particle->mParticleScaleY * local_160, 0.0f, 0.0f); local_a8[1].set(local_a8[1].x * dVar12, 0.0f, local_a8[1].x * dVar11); p_direction[param_0->mDirType](param_0, particle, &local_c0); if (local_c0.isZero()) { local_c0.set(0.0f, 1.0f, 0.0f); } else { local_c0.normalize(); } local_cc.cross(particle->mBaseAxis, local_c0); if (local_cc.isZero()) { local_cc.set(1.0f, 0.0f, 0.0f); } else { local_cc.normalize(); } particle->mBaseAxis.cross(local_c0, local_cc); particle->mBaseAxis.normalize(); local_90[0][0] = local_cc.x; local_90[0][1] = local_c0.x; local_90[0][2] = particle->mBaseAxis.x; local_90[0][3] = 0.0f; local_90[1][0] = local_cc.y; local_90[1][1] = local_c0.y; local_90[1][2] = particle->mBaseAxis.y; local_90[1][3] = 0.0f; local_90[2][0] = local_cc.z; local_90[2][1] = local_c0.z; local_90[2][2] = particle->mBaseAxis.z; local_90[2][3] = 0.0f; MTXMultVecArraySR(local_90, (Vec*)local_a8, (Vec*)local_a8, 2); GXPosition3f32(local_a8[0].x + local_b4.x, local_a8[0].y + local_b4.y, local_a8[0].z + local_b4.z); GXTexCoord2f32(0.0f, coord); GXPosition3f32(local_a8[1].x + local_b4.x, local_a8[1].y + local_b4.y, local_a8[1].z + local_b4.z); GXTexCoord2f32(1.0f, coord); } GXEnd(); GXSetVtxDesc(GX_VA_POS, GX_INDEX8); GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8); } /* 8027A3D8-8027A414 274D18 003C+00 0/0 1/1 0/0 .text * JPADrawEmitterCallBackB__FP18JPAEmitterWorkData */ void JPADrawEmitterCallBackB(JPAEmitterWorkData* work) { if (work->mpEmtr->mpEmtrCallBack == NULL) return; work->mpEmtr->mpEmtrCallBack->draw(work->mpEmtr); } /* 8027A414-8027A454 274D54 0040+00 0/0 1/1 0/0 .text * JPADrawParticleCallBack__FP18JPAEmitterWorkDataP15JPABaseParticle */ void JPADrawParticleCallBack(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { if (work->mpEmtr->mpPtclCallBack == NULL) return; work->mpEmtr->mpPtclCallBack->draw(work->mpEmtr, ptcl); } /* 8027A454-8027A6DC 274D94 0288+00 1/1 0/0 0/0 .text * makeColorTable__FPP8_GXColorPC16JPAClrAnmKeyDataUcsP7JKRHeap */ static void makeColorTable(GXColor** o_color_table, JPAClrAnmKeyData const* i_data, u8 param_2, s16 i_size, JKRHeap* i_heap) { GXColor* color_table = (GXColor*)JKRAllocFromHeap(i_heap, (i_size + 1) * 4, 4); f32 r_step, g_step, b_step, a_step; r_step = g_step = b_step = a_step = 0.0f; f32 r = i_data[0].color.r; f32 g = i_data[0].color.g; f32 b = i_data[0].color.b; f32 a = i_data[0].color.a; int j = 0; for (s16 i = 0; i < i_size + 1; i++) { if (i == i_data[j].index) { color_table[i] = i_data[j].color; r = i_data[j].color.r; g = i_data[j].color.g; b = i_data[j].color.b; a = i_data[j].color.a; j++; if (j < param_2) { f32 base_step = 1.0f / (i_data[j].index - i_data[j - 1].index); r_step = base_step * ((f32)i_data[j].color.r - r); g_step = base_step * ((f32)i_data[j].color.g - g); b_step = base_step * ((f32)i_data[j].color.b - b); a_step = base_step * ((f32)i_data[j].color.a - a); } else { r_step = g_step = b_step = a_step = 0.0f; } } else { r += r_step; color_table[i].r = r; g += g_step; color_table[i].g = g; b += b_step; color_table[i].b = b; a += a_step; color_table[i].a = a; } } *o_color_table = color_table; } /* 8027A6DC-8027A7E8 27501C 010C+00 0/0 1/1 0/0 .text __ct__12JPABaseShapeFPCUcP7JKRHeap */ JPABaseShape::JPABaseShape(u8 const* pData, JKRHeap* pHeap) { mpData = (const JPABaseShapeData*)pData; if (isTexCrdAnm()) { mpTexCrdMtxAnmTbl = (const void*)(pData + sizeof(JPABaseShapeData)); } else { mpTexCrdMtxAnmTbl = NULL; } if (isTexAnm()) { u32 offs = sizeof(JPABaseShapeData); if (isTexCrdAnm()) offs = sizeof(JPABaseShapeData) + 0x28; mpTexIdxAnimTbl = (const u8*)(pData + offs); } else { mpTexIdxAnimTbl = NULL; } if (isPrmAnm()) { makeColorTable(&mpPrmClrAnmTbl, (JPAClrAnmKeyData*)(pData + mpData->mClrPrmAnmOffset), mpData->mClrPrmKeyNum, mpData->mClrAnmFrmMax, pHeap); } else { mpPrmClrAnmTbl = NULL; } if (isEnvAnm()) { makeColorTable(&mpEnvClrAnmTbl, (JPAClrAnmKeyData*)(pData + mpData->mClrEnvAnmOffset), mpData->mClrEnvKeyNum, mpData->mClrAnmFrmMax, pHeap); } else { mpEnvClrAnmTbl = NULL; } } /* 803C4360-803C436C 021480 000C+00 0/1 0/0 0/0 .data st_bm__12JPABaseShape */ GXBlendMode JPABaseShape::st_bm[3] = { GX_BM_NONE, GX_BM_BLEND, GX_BM_LOGIC, }; /* 803C436C-803C4394 02148C 0028+00 0/1 0/0 0/0 .data st_bf__12JPABaseShape */ GXBlendFactor JPABaseShape::st_bf[10] = { GX_BL_ZERO, GX_BL_ONE, GX_BL_SRC_COLOR, GX_BL_INV_SRC_COLOR, GX_BL_SRC_COLOR, GX_BL_INV_SRC_COLOR, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_BL_DST_ALPHA, GX_BL_INV_DST_ALPHA, }; /* 803C4394-803C43D4 0214B4 0040+00 0/1 0/0 0/0 .data st_lo__12JPABaseShape */ GXLogicOp JPABaseShape::st_lo[16] = { GX_LO_CLEAR, GX_LO_SET, GX_LO_COPY, GX_LO_INV_COPY, GX_LO_NOOP, GX_LO_INV, GX_LO_AND, GX_LO_NAND, GX_LO_OR, GX_LO_NOR, GX_LO_XOR, GX_LO_EQUIV, GX_LO_REV_AND, GX_LO_INV_AND, GX_LO_REV_OR, GX_LO_INV_OR, }; /* 803C43D4-803C43F4 0214F4 0020+00 0/1 0/0 0/0 .data st_c__12JPABaseShape */ GXCompare JPABaseShape::st_c[8] = { GX_NEVER, GX_LESS, GX_LEQUAL, GX_EQUAL, GX_NEQUAL, GX_GEQUAL, GX_GREATER, GX_ALWAYS, }; /* 803C43F4-803C4404 021514 0010+00 0/1 0/0 0/0 .data st_ao__12JPABaseShape */ GXAlphaOp JPABaseShape::st_ao[4] = { GX_AOP_AND, GX_AOP_OR, GX_AOP_XOR, GX_AOP_XNOR, }; /* 803C4404-803C4464 021524 0060+00 0/1 0/0 0/0 .data st_ca__12JPABaseShape */ GXTevColorArg JPABaseShape::st_ca[6][4] = { { GX_CC_ZERO, GX_CC_TEXC, GX_CC_ONE, GX_CC_ZERO, }, { GX_CC_ZERO, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO, }, { GX_CC_C0, GX_CC_ONE, GX_CC_TEXC, GX_CC_ZERO, }, { GX_CC_C1, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO, }, { GX_CC_ZERO, GX_CC_TEXC, GX_CC_C0, GX_CC_C1, }, { GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C0, }, }; /* 803C4464-803C4488 021584 0020+04 0/1 0/0 0/0 .data st_aa__12JPABaseShape */ GXTevAlphaArg JPABaseShape::st_aa[2][4] = { { GX_CA_ZERO, GX_CA_TEXA, GX_CA_A0, GX_CA_ZERO, }, { GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0, }, }; /* 8027A7E8-8027A918 275128 0130+00 0/0 1/1 0/0 .text setGX__12JPABaseShapeCFP18JPAEmitterWorkData */ void JPABaseShape::setGX(JPAEmitterWorkData* work) const { const GXTevColorArg* colorArg = getTevColorArg(); const GXTevAlphaArg* alphaArg = getTevAlphaArg(); GXSetBlendMode(getBlendMode(), getBlendSrc(), getBlendDst(), getLogicOp()); GXSetZMode(getZEnable(), getZCmp(), getZUpd()); GXSetAlphaCompare(getAlphaCmp0(), getAlphaRef0(), getAlphaOp(), getAlphaCmp1(), getAlphaRef1()); GXSetTevColorIn(GX_TEVSTAGE0, colorArg[0], colorArg[1], colorArg[2], colorArg[3]); GXSetTevAlphaIn(GX_TEVSTAGE0, alphaArg[0], alphaArg[1], alphaArg[2], alphaArg[3]); GXSetTevDirect(GX_TEVSTAGE0); GXSetTevDirect(GX_TEVSTAGE1); GXSetZCompLoc(getZCompLoc()); }