| 10 | JPAParticleCallBack::~JPAParticleCallBack() { } |
| 11 | |
| 12 | void JPABaseParticle::init_p(JPAEmitterWorkData *workData) |
| 13 | { |
| 14 | JPAExtraShape *extraShape = workData->mResource->pEsp; |
| 15 | JPABaseEmitter *emitter = workData->mEmitter; |
| 16 | JPABaseShape *baseShape = workData->mResource->pBsp; |
| 17 | JPADynamicsBlock *dynamicsBlock = workData->mResource->pDyn; |
| 18 | |
| 19 | mAge = -1; |
| 20 | mLifeTime = (f32)emitter->mLifeTime * (1.0f - dynamicsBlock->mData->mLifeTimeRndm * emitter->mRandom.getRandF32()); |
| 21 | mTime = 0.0f; |
| 22 | initStatus(0); |
| 23 | PSMTXMultVecSR(workData->mGlobalSR, &workData->mVolumePos, &mLocalPosition); |
| 24 | if (emitter->checkDynFlag(8)) { |
| 25 | setStatus(0x20); |
| 26 | } |
| 27 | mOffsetPosition.set(workData->mGlobalPos); |
| 28 | mPosition.set(mOffsetPosition.x + mLocalPosition.x * workData->mPublicScale.x, |
| 29 | mOffsetPosition.y + mLocalPosition.y * workData->mPublicScale.y, |
| 30 | mOffsetPosition.z + mLocalPosition.z * workData->mPublicScale.z); |
| 31 | |
| 32 | JGeometry::TVec3f vec1; // 0x38 |
| 33 | if (emitter->mAwayFromCenterSpeed) { |
| 34 | vec1.setLength(workData->mVelOmni, emitter->mAwayFromCenterSpeed); |
| 35 | } else { |
| 36 | vec1.zero(); |
| 37 | } |
| 38 | |
| 39 | JGeometry::TVec3f vec2; // 0x2C |
| 40 | if (emitter->mAwayFromAxisSpeed) { |
| 41 | vec2.setLength(workData->mVelAxis, emitter->mAwayFromAxisSpeed); |
| 42 | } else { |
| 43 | vec2.zero(); |
| 44 | } |
| 45 | |
| 46 | JGeometry::TVec3f vec3; // 0x20 |
| 47 | if (emitter->mDirSpeed) { |
| 48 | Mtx yzRotMtx; |
| 49 | JPAGetYZRotateMtx(emitter->mSpread * (32768.0f * emitter->getRandZP()), emitter->getRandS16(), yzRotMtx); |
| 50 | PSMTXConcat(workData->mDirectionMtx, yzRotMtx, yzRotMtx); |
| 51 | vec3.set(emitter->mDirSpeed * yzRotMtx[0][2], emitter->mDirSpeed * yzRotMtx[1][2], emitter->mDirSpeed * yzRotMtx[2][2]); |
| 52 | } else { |
| 53 | vec3.zero(); |
| 54 | } |
| 55 | |
| 56 | JGeometry::TVec3f vec4; // 0x14 |
| 57 | if (emitter->mRndmDirSpeed) { |
| 58 | vec4.set(emitter->mRndmDirSpeed * emitter->getRandZH(), emitter->mRndmDirSpeed * emitter->getRandZH(), |
| 59 | emitter->mRndmDirSpeed * emitter->getRandZH()); |
| 60 | } else { |
| 61 | vec4.zero(); |
| 62 | } |
| 63 | |
| 64 | f32 type1Factor = (1.0f + emitter->getRandZP() * dynamicsBlock->getInitVelRatio()); |
| 65 | mVelType1.set(type1Factor * (vec1.x + vec2.x + vec3.x + vec4.x), type1Factor * (vec1.y + vec2.y + vec3.y + vec4.y), |
| 66 | type1Factor * (vec1.z + vec2.z + vec3.z + vec4.z)); |
| 67 | |
| 68 | if (emitter->checkDynFlag(4)) { |
| 69 | mVelType1.mul(emitter->mLocalScl); |
no test coverage detected