mirror of
https://github.com/zeldaret/tp
synced 2026-05-23 06:54:28 -04:00
JParticle debug (#3090)
This commit is contained in:
@@ -135,15 +135,7 @@ void JPACalcClrIdxNormal(JPAEmitterWorkData* work) {
|
||||
|
||||
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;
|
||||
work->mClrKeyFrame = param_1->mAge < shape->getClrAnmMaxFrm() ? param_1->mAge : shape->getClrAnmMaxFrm();
|
||||
}
|
||||
|
||||
void JPACalcClrIdxRepeat(JPAEmitterWorkData* work) {
|
||||
@@ -153,27 +145,25 @@ void JPACalcClrIdxRepeat(JPAEmitterWorkData* work) {
|
||||
|
||||
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);
|
||||
s32 r28 = shape->getClrAnmMaxFrm() + 1;
|
||||
work->mClrKeyFrame = (param_1->mAge + shape->getClrLoopOfst(param_1->mAnmRandom)) % r28;
|
||||
}
|
||||
|
||||
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);
|
||||
u32 div = (work->mpEmtr->mTick / maxFrm) & 1;
|
||||
u32 rem = work->mpEmtr->mTick % maxFrm;
|
||||
work->mClrKeyFrame = rem + (div) * (maxFrm - rem * 2);
|
||||
}
|
||||
|
||||
void JPACalcClrIdxReverse(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
JPABaseShape* shape = work->mpRes->getBsp();
|
||||
s32 tick = param_1->mAge + shape->getClrLoopOfst(param_1->mAnmRandom);
|
||||
s32 r29 = 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);
|
||||
s32 div = (r29 / maxFrm) & 1;
|
||||
s32 rem = r29 % maxFrm;
|
||||
work->mClrKeyFrame = rem + (div) * (maxFrm - rem * 2);
|
||||
}
|
||||
|
||||
void JPACalcClrIdxMerge(JPAEmitterWorkData* work) {
|
||||
@@ -183,8 +173,7 @@ void JPACalcClrIdxMerge(JPAEmitterWorkData* work) {
|
||||
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;
|
||||
work->mClrKeyFrame = (s32(param_1->mTime * maxFrm) + shape->getClrLoopOfst(param_1->mAnmRandom)) % maxFrm;
|
||||
}
|
||||
|
||||
void JPACalcClrIdxRandom(JPAEmitterWorkData* work) {
|
||||
@@ -193,9 +182,7 @@ void JPACalcClrIdxRandom(JPAEmitterWorkData* work) {
|
||||
|
||||
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;
|
||||
work->mClrKeyFrame = shape->getClrLoopOfst(param_1->mAnmRandom) % (shape->getClrAnmMaxFrm() + 1);
|
||||
}
|
||||
|
||||
void JPACalcPrm(JPAEmitterWorkData* work) {
|
||||
@@ -221,15 +208,15 @@ void JPACalcColorCopy(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
}
|
||||
|
||||
void JPAGenTexCrdMtxIdt(JPAEmitterWorkData* param_0) {
|
||||
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_FALSE, GX_PTIDENTITY);
|
||||
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
||||
}
|
||||
|
||||
void JPAGenTexCrdMtxAnm(JPAEmitterWorkData* param_0) {
|
||||
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0, GX_FALSE, GX_PTIDENTITY);
|
||||
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0);
|
||||
}
|
||||
|
||||
void JPAGenTexCrdMtxPrj(JPAEmitterWorkData* param_0) {
|
||||
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX3x4, GX_TG_POS, GX_TEXMTX0, GX_FALSE, GX_PTIDENTITY);
|
||||
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX3x4, GX_TG_POS, GX_TEXMTX0);
|
||||
}
|
||||
|
||||
void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
|
||||
@@ -260,7 +247,7 @@ void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
|
||||
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);
|
||||
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0);
|
||||
}
|
||||
|
||||
void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
@@ -307,16 +294,12 @@ void JPALoadTexAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
|
||||
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);
|
||||
work->mpEmtr->mTexAnmIdx = shape->getTexIdx(shape->getTexAnmKeyNum() - 1 < work->mpEmtr->mTick ? shape->getTexAnmKeyNum() - 1 : work->mpEmtr->mTick);
|
||||
}
|
||||
|
||||
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);
|
||||
param_1->mTexAnmIdx = shape->getTexIdx(shape->getTexAnmKeyNum() - 1 < param_1->mAge ? shape->getTexAnmKeyNum() - 1 : param_1->mAge);
|
||||
}
|
||||
|
||||
void JPACalcTexIdxRepeat(JPAEmitterWorkData* work) {
|
||||
@@ -335,18 +318,18 @@ 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 div = tick / keyNum & 1;
|
||||
int rem = tick % keyNum;
|
||||
work->mpEmtr->mTexAnmIdx = shape->getTexIdx(rem + (div & 1) * (keyNum - rem * 2));
|
||||
work->mpEmtr->mTexAnmIdx = shape->getTexIdx(rem + div * (keyNum - rem * 2));
|
||||
}
|
||||
|
||||
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 div = tick / keyNum & 1;
|
||||
int rem = tick % keyNum;
|
||||
param_1->mTexAnmIdx = shape->getTexIdx(rem + (div & 1) * (keyNum - rem * 2));
|
||||
param_1->mTexAnmIdx = shape->getTexIdx(rem + div * (keyNum - rem * 2));
|
||||
}
|
||||
|
||||
void JPACalcTexIdxMerge(JPAEmitterWorkData* work) {
|
||||
@@ -356,8 +339,7 @@ void JPACalcTexIdxMerge(JPAEmitterWorkData* work) {
|
||||
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);
|
||||
param_1->mTexAnmIdx = shape->getTexIdx((s32(maxFrm * param_1->mTime) + shape->getTexLoopOfst(param_1->mAnmRandom)) % maxFrm);
|
||||
}
|
||||
|
||||
void JPACalcTexIdxRandom(JPAEmitterWorkData* work) {
|
||||
@@ -435,124 +417,122 @@ static projectionFunc p_prj[3] = {
|
||||
};
|
||||
|
||||
void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
if (param_1->checkStatus(8) == 0) {
|
||||
JGeometry::TVec3<f32> 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));
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
JGeometry::TVec3<f32> local_48;
|
||||
MTXMultVec(work->mPosCamMtx, ¶m_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[0][1] = local_38[0][2] = local_38[1][0] = local_38[1][2] = local_38[2][0] = local_38[2][1] = 0.0f;
|
||||
GXLoadPosMtxImm(local_38, 0);
|
||||
p_prj[work->mPrjType](work, local_38);
|
||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||
}
|
||||
|
||||
void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
if (param_1->checkStatus(8) == 0) {
|
||||
JGeometry::TVec3<f32> 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));
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
JGeometry::TVec3<f32> local_48;
|
||||
MTXMultVec(work->mPosCamMtx, ¶m_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[0][2] = local_38[1][2] = local_38[2][0] = local_38[2][1] = 0.0f;
|
||||
GXLoadPosMtxImm(local_38, 0);
|
||||
p_prj[work->mPrjType](work, local_38);
|
||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||
}
|
||||
|
||||
void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
if (param_1->checkStatus(8) == 0) {
|
||||
JGeometry::TVec3<f32> 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));
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
JGeometry::TVec3<f32> local_48;
|
||||
MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48);
|
||||
Mtx local_38;
|
||||
f32 particleX = work->mGlobalPtclScl.x * param_1->mParticleScaleX;
|
||||
f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY;
|
||||
local_38[0][0] = particleX;
|
||||
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[0][1] = local_38[0][2] = local_38[1][0] = local_38[2][0] = 0.0f;
|
||||
GXLoadPosMtxImm(local_38, 0);
|
||||
p_prj[work->mPrjType](work, local_38);
|
||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||
}
|
||||
|
||||
void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
if (param_1->checkStatus(8) == 0) {
|
||||
JGeometry::TVec3<f32> 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));
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
JGeometry::TVec3<f32> local_48;
|
||||
MTXMultVec(work->mPosCamMtx, ¶m_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));
|
||||
}
|
||||
|
||||
void dirTypeVel(JPAEmitterWorkData const* work, JPABaseParticle const* param_1,
|
||||
JGeometry::TVec3<f32>* param_2) {
|
||||
param_1->getVelVec(*param_2);
|
||||
param_1->getVelVec(param_2);
|
||||
}
|
||||
|
||||
void dirTypePos(JPAEmitterWorkData const* work, JPABaseParticle const* param_1,
|
||||
JGeometry::TVec3<f32>* param_2) {
|
||||
param_1->getLocalPosition(*param_2);
|
||||
param_1->getLocalPosition(param_2);
|
||||
}
|
||||
|
||||
void dirTypePosInv(JPAEmitterWorkData const* work, JPABaseParticle const* param_1,
|
||||
JGeometry::TVec3<f32>* param_2) {
|
||||
param_1->getLocalPosition(*param_2);
|
||||
param_1->getLocalPosition(param_2);
|
||||
param_2->negate();
|
||||
}
|
||||
|
||||
@@ -564,13 +544,10 @@ void dirTypeEmtrDir(JPAEmitterWorkData const* work, JPABaseParticle const* param
|
||||
void dirTypePrevPtcl(JPAEmitterWorkData const* work, JPABaseParticle const* param_1,
|
||||
JGeometry::TVec3<f32>* param_2) {
|
||||
JGeometry::TVec3<f32> aTStack_24;
|
||||
param_1->getGlobalPosition(aTStack_24);
|
||||
JPANode<JPABaseParticle>* end = work->mpAlivePtcl->getEnd();
|
||||
JPANode<JPABaseParticle>* prev = work->mpCurNode->getPrev();
|
||||
|
||||
if (end != prev) {
|
||||
JPABaseParticle* particle = work->mpCurNode->getPrev()->getObject();
|
||||
particle->getGlobalPosition(*param_2);
|
||||
param_1->getGlobalPosition(&aTStack_24);
|
||||
|
||||
if (work->mpCurNode->getPrev() != work->mpAlivePtcl->getEnd()) {
|
||||
work->mpCurNode->getPrev()->getObject()->getGlobalPosition(param_2);
|
||||
} else {
|
||||
work->mpEmtr->calcEmitterGlobalPosition(param_2);
|
||||
}
|
||||
@@ -623,23 +600,22 @@ static void rotTypeZ(f32 param_0, f32 param_1, Mtx& param_2) {
|
||||
}
|
||||
|
||||
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;
|
||||
f32 f31 = 0.33333298563957214f * (1.0f - param_1);
|
||||
f32 f30 = 0.57735f * param_0;
|
||||
f32 f29 = f31 + f30;
|
||||
f30 = f31 - f30;
|
||||
f31 += param_1;
|
||||
param_2[0][0] = f31;
|
||||
param_2[0][1] = f30;
|
||||
param_2[0][2] = f29;
|
||||
param_2[0][3] = 0.0f;
|
||||
param_2[1][0] = f4;
|
||||
param_2[1][1] = f3;
|
||||
param_2[1][2] = fVar1;
|
||||
param_2[1][0] = f29;
|
||||
param_2[1][1] = f31;
|
||||
param_2[1][2] = f30;
|
||||
param_2[1][3] = 0.0f;
|
||||
param_2[2][0] = fVar1;
|
||||
param_2[2][1] = f4;
|
||||
param_2[2][2] = f3;
|
||||
param_2[2][0] = f30;
|
||||
param_2[2][1] = f29;
|
||||
param_2[2][2] = f31;
|
||||
param_2[2][3] = 0.0f;
|
||||
}
|
||||
|
||||
@@ -704,141 +680,160 @@ static u8* p_dl[2] = {
|
||||
};
|
||||
|
||||
void JPADrawDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
||||
if (param_1->checkStatus(8) == 0) {
|
||||
JGeometry::TVec3<f32> local_6c;
|
||||
JGeometry::TVec3<f32> 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));
|
||||
}
|
||||
}
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
JGeometry::TVec3<f32> local_6c;
|
||||
JGeometry::TVec3<f32> local_78;
|
||||
p_direction[param_0->mDirType](param_0, param_1, &local_6c);
|
||||
|
||||
if (local_6c.isZero()) {
|
||||
return;
|
||||
}
|
||||
|
||||
local_6c.normalize();
|
||||
local_78.cross(param_1->mBaseAxis, local_6c);
|
||||
|
||||
if (local_78.isZero()) {
|
||||
return;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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<f32> local_6c;
|
||||
JGeometry::TVec3<f32> 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));
|
||||
}
|
||||
}
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
f32 sinRot = JMASSin(param_1->mRotateAngle);
|
||||
f32 cosRot = JMASCos(param_1->mRotateAngle);
|
||||
JGeometry::TVec3<f32> local_6c;
|
||||
JGeometry::TVec3<f32> local_78;
|
||||
p_direction[param_0->mDirType](param_0, param_1, &local_6c);
|
||||
|
||||
if (local_6c.isZero()) {
|
||||
return;
|
||||
}
|
||||
|
||||
local_6c.normalize();
|
||||
local_78.cross(param_1->mBaseAxis, local_6c);
|
||||
|
||||
if (local_78.isZero()) {
|
||||
return;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
||||
if (param_1->checkStatus(8) == 0) {
|
||||
JGeometry::TVec3<f32> local_70;
|
||||
p_direction[param_0->mDirType](param_0, param_1, &local_70);
|
||||
JGeometry::TVec3<f32> 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<f32> 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));
|
||||
}
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
JGeometry::TVec3<f32> local_70;
|
||||
p_direction[param_0->mDirType](param_0, param_1, &local_70);
|
||||
JGeometry::TVec3<f32> aTStack_7c(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()) {
|
||||
return;
|
||||
}
|
||||
|
||||
local_70.normalize();
|
||||
MTXMultVecSR(param_0->mPosCamMtx, &local_70, &local_70);
|
||||
JGeometry::TVec3<f32> local_88;
|
||||
MTXMultVec(param_0->mPosCamMtx, ¶m_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[0][2] = local_60[1][2] = local_60[2][0] = local_60[2][1] = 0.0f;
|
||||
GXLoadPosMtxImm(local_60, 0);
|
||||
p_prj[param_0->mPrjType](param_0, local_60);
|
||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||
}
|
||||
|
||||
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));
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
void JPADrawPoint(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
if (!!(ptcl->mStatus & JPAPtclStts_Invisible))
|
||||
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
||||
@@ -851,26 +846,30 @@ void JPADrawPoint(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
}
|
||||
|
||||
void JPADrawLine(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
||||
if (param_1->checkStatus(8) == 0) {
|
||||
JGeometry::TVec3<f32> local_1c;
|
||||
JGeometry::setTVec3f(¶m_1->mPosition.x, &local_1c.x);
|
||||
JGeometry::TVec3<f32> 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);
|
||||
}
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
|
||||
JGeometry::TVec3<f32> local_1c(param_1->mPosition);
|
||||
JGeometry::TVec3<f32> local_28;
|
||||
param_1->getVelVec(&local_28);
|
||||
|
||||
if (local_28.isZero()) {
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
JPANode<JPABaseParticle>* getNext(JPANode<JPABaseParticle>* param_0) {
|
||||
@@ -901,8 +900,8 @@ void JPADrawStripe(JPAEmitterWorkData* param_0) {
|
||||
JGeometry::TVec3<f32> local_e0[2];
|
||||
JGeometry::TVec3<f32> local_f8;
|
||||
JGeometry::TVec3<f32> local_104;
|
||||
getNodeFunc node_func;
|
||||
JPANode<JPABaseParticle>* startNode;
|
||||
JPANode<JPABaseParticle>* startNode = NULL;
|
||||
getNodeFunc node_func = NULL;
|
||||
if (shape->isDrawFwdAhead()) {
|
||||
startNode = param_0->mpAlivePtcl->getLast();
|
||||
node_func = getPrev;
|
||||
@@ -990,8 +989,8 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
|
||||
JGeometry::TVec3<f32> local_a8[2];
|
||||
JGeometry::TVec3<f32> local_c0;
|
||||
JGeometry::TVec3<f32> local_cc;
|
||||
JPANode<JPABaseParticle>* startNode;
|
||||
getNodeFunc node_func;
|
||||
JPANode<JPABaseParticle>* startNode = NULL;
|
||||
getNodeFunc node_func = NULL;
|
||||
if (shape->isDrawFwdAhead()) {
|
||||
startNode = param_0->mpAlivePtcl->getLast();
|
||||
node_func = getPrev;
|
||||
@@ -1109,22 +1108,27 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
|
||||
}
|
||||
|
||||
void JPADrawEmitterCallBackB(JPAEmitterWorkData* work) {
|
||||
if (work->mpEmtr->mpEmtrCallBack == NULL)
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
if (emtr->mpEmtrCallBack == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
work->mpEmtr->mpEmtrCallBack->draw(work->mpEmtr);
|
||||
emtr->mpEmtrCallBack->draw(emtr);
|
||||
}
|
||||
|
||||
void JPADrawParticleCallBack(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
if (work->mpEmtr->mpPtclCallBack == NULL)
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
if (emtr->mpPtclCallBack == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
work->mpEmtr->mpPtclCallBack->draw(work->mpEmtr, ptcl);
|
||||
emtr->mpPtclCallBack->draw(emtr, ptcl);
|
||||
}
|
||||
|
||||
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);
|
||||
GXColor* p_clr_tbl = (GXColor*)JKRAllocFromHeap(i_heap, (i_size + 1) * 4, 4);
|
||||
JUT_ASSERT(1548, p_clr_tbl);
|
||||
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;
|
||||
@@ -1134,7 +1138,7 @@ static void makeColorTable(GXColor** o_color_table, JPAClrAnmKeyData const* i_da
|
||||
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;
|
||||
p_clr_tbl[i] = i_data[j].color;
|
||||
r = i_data[j].color.r;
|
||||
g = i_data[j].color.g;
|
||||
b = i_data[j].color.b;
|
||||
@@ -1151,49 +1155,16 @@ static void makeColorTable(GXColor** o_color_table, JPAClrAnmKeyData const* i_da
|
||||
}
|
||||
} else {
|
||||
r += r_step;
|
||||
color_table[i].r = r;
|
||||
p_clr_tbl[i].r = r;
|
||||
g += g_step;
|
||||
color_table[i].g = g;
|
||||
p_clr_tbl[i].g = g;
|
||||
b += b_step;
|
||||
color_table[i].b = b;
|
||||
p_clr_tbl[i].b = b;
|
||||
a += a_step;
|
||||
color_table[i].a = a;
|
||||
p_clr_tbl[i].a = a;
|
||||
}
|
||||
}
|
||||
*o_color_table = color_table;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
*o_color_table = p_clr_tbl;
|
||||
}
|
||||
|
||||
GXBlendMode JPABaseShape::st_bm[3] = {
|
||||
@@ -1279,15 +1250,55 @@ GXTevAlphaArg JPABaseShape::st_aa[2][4] = {
|
||||
},
|
||||
};
|
||||
|
||||
JPABaseShape::JPABaseShape(u8 const* pData, JKRHeap* pHeap) {
|
||||
pBsd = (const JPABaseShapeData*)pData;
|
||||
|
||||
if (isTexCrdAnm()) {
|
||||
mpTexCrdMtxAnmTbl = (const void*)(pData + sizeof(JPABaseShapeData));
|
||||
} else {
|
||||
mpTexCrdMtxAnmTbl = NULL;
|
||||
}
|
||||
|
||||
if (isTexAnm()) {
|
||||
JUT_ASSERT(1698, pBsd->texAnmKeyNum != NULL);
|
||||
u32 offs = sizeof(JPABaseShapeData);
|
||||
if (isTexCrdAnm()) {
|
||||
offs += 0x28;
|
||||
}
|
||||
mpTexIdxAnimTbl = (const u8*)(pData + offs);
|
||||
} else {
|
||||
mpTexIdxAnimTbl = NULL;
|
||||
}
|
||||
|
||||
if (isPrmAnm()) {
|
||||
JUT_ASSERT(1707, pBsd->prmAnmKeyNum != NULL);
|
||||
JPAClrAnmKeyData* anmKeyData = (JPAClrAnmKeyData*)(pData + pBsd->mClrPrmAnmOffset);
|
||||
makeColorTable(&mpPrmClrAnmTbl, anmKeyData,
|
||||
pBsd->prmAnmKeyNum, pBsd->mClrAnmFrmMax, pHeap);
|
||||
} else {
|
||||
mpPrmClrAnmTbl = NULL;
|
||||
}
|
||||
|
||||
if (isEnvAnm()) {
|
||||
JUT_ASSERT(1716, pBsd->envAnmKeyNum != NULL);
|
||||
JPAClrAnmKeyData* anmKeyData = (JPAClrAnmKeyData*)(pData + pBsd->mClrEnvAnmOffset);
|
||||
makeColorTable(&mpEnvClrAnmTbl, anmKeyData,
|
||||
pBsd->envAnmKeyNum, pBsd->mClrAnmFrmMax, pHeap);
|
||||
} else {
|
||||
mpEnvClrAnmTbl = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
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());
|
||||
JPAExtraShape* extraShape = work->mpRes->getEsp();
|
||||
const GXTevColorArg* colorArg = st_ca[(pBsd->mFlags >> 0x0F) & 0x07];
|
||||
const GXTevAlphaArg* alphaArg = st_aa[(pBsd->mFlags >> 0x12) & 0x01];
|
||||
GXSetBlendMode(st_bm[pBsd->mBlendModeCfg & 0x03], st_bf[(pBsd->mBlendModeCfg >> 2) & 0x0F], st_bf[(pBsd->mBlendModeCfg >> 6) & 0x0F], st_lo[(pBsd->mBlendModeCfg >> 10) & 0x0F]);
|
||||
GXSetZMode(pBsd->mZModeCfg & 0x01, st_c[(pBsd->mZModeCfg >> 1) & 0x07], (pBsd->mZModeCfg >> 4) & 0x01);
|
||||
GXSetAlphaCompare(st_c[pBsd->mAlphaCompareCfg & 0x07], pBsd->mAlphaRef0, st_ao[(pBsd->mAlphaCompareCfg >> 3) & 0x03], st_c[(pBsd->mAlphaCompareCfg >> 5) & 0x07], pBsd->mAlphaRef1);
|
||||
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());
|
||||
GXSetZCompLoc((pBsd->mZModeCfg >> 5) & 0x01);
|
||||
}
|
||||
|
||||
@@ -63,11 +63,11 @@ void JPAVolumeCube(JPAEmitterWorkData* work) {
|
||||
}
|
||||
|
||||
static void JPAVolumeSphere(JPAEmitterWorkData* work) {
|
||||
s16 phi, theta;
|
||||
s16 phi, r28;
|
||||
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
|
||||
phi = (u16)(work->mVolumeX * 0x8000 / (work->mDivNumber - 1) + 0x4000);
|
||||
f32 tmp = (u16)(work->mVolumeAngleNum * 0x10000 / (work->mVolumeAngleMax - 1));
|
||||
theta = tmp * work->mVolumeSweep + 0x8000;
|
||||
phi = u16(work->mVolumeX * 0x8000 / (work->mDivNumber - 1) + 0x4000);
|
||||
u16 r26 = u16(work->mVolumeAngleNum * 0x10000 / (work->mVolumeAngleMax - 1));
|
||||
r28 = f32(r26) * work->mVolumeSweep + 0x8000;
|
||||
work->mVolumeAngleNum++;
|
||||
if (work->mVolumeAngleNum == work->mVolumeAngleMax) {
|
||||
work->mVolumeAngleNum = 0;
|
||||
@@ -81,30 +81,30 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) {
|
||||
}
|
||||
} else {
|
||||
phi = work->mpEmtr->get_r_ss() >> 1;
|
||||
theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
|
||||
r28 = work->mVolumeSweep * work->mpEmtr->get_r_ss();
|
||||
}
|
||||
|
||||
f32 rnd = work->mpEmtr->get_r_f();
|
||||
f32 f31 = work->mpEmtr->get_r_f();
|
||||
if (work->mpEmtr->checkFlag(JPADynFlag_FixedDensity)) {
|
||||
rnd = 1.0f - rnd * rnd * rnd;
|
||||
f31 = 1.0f - f31 * f31 * f31;
|
||||
}
|
||||
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
|
||||
work->mVolumeCalcData.mVolumePos.set(rad * JMASCos(phi) * JMASSin(theta), -rad * JMASSin(phi),
|
||||
rad * JMASCos(phi) * JMASCos(theta));
|
||||
f31 = work->mVolumeSize * (work->mVolumeMinRad + f31 * (1.0f - work->mVolumeMinRad));
|
||||
work->mVolumeCalcData.mVolumePos.set(f31 * JMASCos(phi) * JMASSin(r28), -f31 * JMASSin(phi),
|
||||
f31 * JMASCos(phi) * JMASCos(r28));
|
||||
work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
|
||||
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
|
||||
work->mVolumeCalcData.mVolumePos.z);
|
||||
}
|
||||
|
||||
static void JPAVolumeCylinder(JPAEmitterWorkData* work) {
|
||||
s16 theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
|
||||
f32 rnd = work->mpEmtr->get_r_f();
|
||||
s16 r30 = work->mVolumeSweep * work->mpEmtr->get_r_ss();
|
||||
f32 f31 = work->mpEmtr->get_r_f();
|
||||
if (work->mpEmtr->checkFlag(JPADynFlag_FixedDensity)) {
|
||||
rnd = 1.0f - rnd * rnd;
|
||||
f31 = 1.0f - f31 * f31;
|
||||
}
|
||||
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
|
||||
f31 = work->mVolumeSize * (work->mVolumeMinRad + f31 * (1.0f - work->mVolumeMinRad));
|
||||
work->mVolumeCalcData.mVolumePos.set(
|
||||
rad * JMASSin(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * JMASCos(theta));
|
||||
f31 * JMASSin(r30), work->mVolumeSize * work->mpEmtr->get_r_zp(), f31 * JMASCos(r30));
|
||||
work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
|
||||
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
|
||||
work->mVolumeCalcData.mVolumePos.z);
|
||||
@@ -166,26 +166,16 @@ void JPADynamicsBlock::init() {
|
||||
|
||||
void JPADynamicsBlock::create(JPAEmitterWorkData* work) {
|
||||
if (work->mpEmtr->checkStatus(JPAEmtrStts_RateStepEmit)) {
|
||||
s32 emitCount;
|
||||
s32 createCount;
|
||||
s32 emitCount = 0;
|
||||
|
||||
// Probably an inlined function.
|
||||
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
|
||||
s32 count;
|
||||
if (getVolumeType() == VOL_Sphere) {
|
||||
count = 4 * getDivNumber() * getDivNumber() + 2;
|
||||
} else {
|
||||
count = getDivNumber();
|
||||
}
|
||||
emitCount = count;
|
||||
emitCount = getVolumeType() == VOL_Sphere ? 4 * getDivNumber() * getDivNumber() + 2 : getDivNumber();
|
||||
|
||||
work->mVolumeEmitIdx = 0;
|
||||
} else {
|
||||
f32 newPtclCount =
|
||||
work->mpEmtr->mRate * (getRateRndm() * work->mpEmtr->get_r_zp() + 1.0f);
|
||||
f32 newEmitCount = work->mpEmtr->mEmitCount + newPtclCount;
|
||||
work->mpEmtr->mEmitCount = newEmitCount;
|
||||
emitCount = (s32)newEmitCount;
|
||||
emitCount = work->mpEmtr->mEmitCount += newPtclCount;
|
||||
work->mpEmtr->mEmitCount -= emitCount;
|
||||
|
||||
if (work->mpEmtr->checkStatus(JPAEmtrStts_FirstEmit) && 0.0f < newPtclCount &&
|
||||
@@ -198,10 +188,10 @@ void JPADynamicsBlock::create(JPAEmitterWorkData* work) {
|
||||
emitCount = 0;
|
||||
}
|
||||
|
||||
// Probably an inlined function.
|
||||
createCount = emitCount;
|
||||
JPABaseParticle* ptcl = NULL;
|
||||
s32 createCount = emitCount;
|
||||
while (createCount > 0) {
|
||||
JPABaseParticle* ptcl = work->mpEmtr->createParticle();
|
||||
ptcl = work->mpEmtr->createParticle();
|
||||
if (ptcl == NULL)
|
||||
break;
|
||||
createCount--;
|
||||
@@ -209,7 +199,7 @@ void JPADynamicsBlock::create(JPAEmitterWorkData* work) {
|
||||
}
|
||||
|
||||
if (++work->mpEmtr->mRateStepTimer >= (work->mpEmtr->mRateStep + 1)) {
|
||||
work->mpEmtr->mRateStepTimer -= (work->mpEmtr->mRateStep + 1);
|
||||
work->mpEmtr->mRateStepTimer -= work->mpEmtr->mRateStep + 1;
|
||||
work->mpEmtr->setStatus(JPAEmtrStts_RateStepEmit);
|
||||
} else {
|
||||
work->mpEmtr->clearStatus(JPAEmtrStts_RateStepEmit);
|
||||
|
||||
@@ -12,38 +12,31 @@ JPAEmitterCallBack::~JPAEmitterCallBack() {
|
||||
|
||||
void JPABaseEmitter::init(JPAEmitterManager* param_0, JPAResource* param_1) {
|
||||
mpEmtrMgr = param_0;
|
||||
mpRes = param_1;
|
||||
mpRes->getDyn()->getEmitterScl(&mLocalScl);
|
||||
mpRes->getDyn()->getEmitterTrs(&mLocalTrs);
|
||||
mpRes->getDyn()->getEmitterDir(&mLocalDir);
|
||||
pRes = param_1;
|
||||
pRes->getDyn()->getEmitterScl(&mLocalScl);
|
||||
pRes->getDyn()->getEmitterTrs(&mLocalTrs);
|
||||
pRes->getDyn()->getEmitterDir(&mLocalDir);
|
||||
mLocalDir.normalize();
|
||||
mpRes->getDyn()->getEmitterRot(&mLocalRot);
|
||||
mMaxFrame = mpRes->getDyn()->getMaxFrame();
|
||||
mLifeTime = mpRes->getDyn()->getLifetime();
|
||||
mVolumeSize = mpRes->getDyn()->getVolumeSize();
|
||||
mRate = mpRes->getDyn()->getRate();
|
||||
mRateStep = mpRes->getDyn()->getRateStep();
|
||||
mVolumeSweep = mpRes->getDyn()->getVolumeSweep();
|
||||
mVolumeMinRad = mpRes->getDyn()->getVolumeMinRad();
|
||||
mAwayFromCenterSpeed = mpRes->getDyn()->getInitVelOmni();
|
||||
mAwayFromAxisSpeed = mpRes->getDyn()->getInitVelAxis();
|
||||
mDirSpeed = mpRes->getDyn()->getInitVelDir();
|
||||
mSpread = mpRes->getDyn()->getInitVelDirSp();
|
||||
mRndmDirSpeed = mpRes->getDyn()->getInitVelRndm();
|
||||
mAirResist = mpRes->getDyn()->getAirRes();
|
||||
pRes->getDyn()->getEmitterRot(&mLocalRot);
|
||||
mMaxFrame = pRes->getDyn()->getMaxFrame();
|
||||
mLifeTime = pRes->getDyn()->getLifetime();
|
||||
mVolumeSize = pRes->getDyn()->getVolumeSize();
|
||||
mRate = pRes->getDyn()->getRate();
|
||||
mRateStep = pRes->getDyn()->getRateStep();
|
||||
mVolumeSweep = pRes->getDyn()->getVolumeSweep();
|
||||
mVolumeMinRad = pRes->getDyn()->getVolumeMinRad();
|
||||
mAwayFromCenterSpeed = pRes->getDyn()->getInitVelOmni();
|
||||
mAwayFromAxisSpeed = pRes->getDyn()->getInitVelAxis();
|
||||
mDirSpeed = pRes->getDyn()->getInitVelDir();
|
||||
mSpread = pRes->getDyn()->getInitVelDirSp();
|
||||
mRndmDirSpeed = pRes->getDyn()->getInitVelRndm();
|
||||
mAirResist = pRes->getDyn()->getAirRes();
|
||||
mRndm.set_seed(mpEmtrMgr->pWd->mRndm.get_rndm_u());
|
||||
MTXIdentity(mGlobalRot);
|
||||
mGlobalScl.set(1.0f, 1.0f, 1.0f);
|
||||
mGlobalTrs.zero();
|
||||
mGlobalPScl.set(1.0f, 1.0f);
|
||||
mGlobalEnvClr.a = 0xff;
|
||||
mGlobalEnvClr.b = 0xff;
|
||||
mGlobalEnvClr.g = 0xff;
|
||||
mGlobalEnvClr.r = 0xff;
|
||||
mGlobalPrmClr.a = 0xff;
|
||||
mGlobalPrmClr.b = 0xff;
|
||||
mGlobalPrmClr.g = 0xff;
|
||||
mGlobalPrmClr.r = 0xff;
|
||||
mGlobalPrmClr.r = mGlobalPrmClr.g = mGlobalPrmClr.b = mGlobalPrmClr.a = mGlobalEnvClr.r = mGlobalEnvClr.g = mGlobalEnvClr.b = mGlobalEnvClr.a = 0xff;
|
||||
param_1->getBsp()->getPrmClr(&mPrmClr);
|
||||
param_1->getBsp()->getEnvClr(&mEnvClr);
|
||||
mpUserWork = NULL;
|
||||
@@ -61,9 +54,11 @@ JPABaseParticle* JPABaseEmitter::createParticle() {
|
||||
if (mpPtclPool->getNum() != 0) {
|
||||
JPANode<JPABaseParticle>* node = mpPtclPool->pop_front();
|
||||
mAlivePtclBase.push_front(node);
|
||||
mpRes->getDyn()->calc(mpEmtrMgr->pWd);
|
||||
node->mData.init_p(mpEmtrMgr->pWd);
|
||||
return &node->mData;
|
||||
pRes->getDyn()->calc(mpEmtrMgr->pWd);
|
||||
node->getObject()->init_p(mpEmtrMgr->pWd);
|
||||
return node->getObject();
|
||||
} else {
|
||||
JUT_WARN(128, "%s", "JPA : Can NOT create particle more\n");
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -73,8 +68,10 @@ JPABaseParticle* JPABaseEmitter::createChild(JPABaseParticle* parent) {
|
||||
if (mpPtclPool->getNum() != 0) {
|
||||
JPANode<JPABaseParticle>* node = mpPtclPool->pop_front();
|
||||
mAlivePtclChld.push_front(node);
|
||||
node->mData.init_c(mpEmtrMgr->pWd, parent);
|
||||
return &node->mData;
|
||||
node->getObject()->init_c(mpEmtrMgr->pWd, parent);
|
||||
return node->getObject();
|
||||
} else {
|
||||
JUT_WARN(151, "%s", "JPA : Can NOT create child particle more\n")
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -88,14 +85,12 @@ void JPABaseEmitter::deleteAllParticle() {
|
||||
}
|
||||
|
||||
bool JPABaseEmitter::processTillStartFrame() {
|
||||
JPADynamicsBlock* dyn = mpRes->getDyn();
|
||||
s16 startFrame = dyn->getStartFrame();
|
||||
|
||||
if (mWaitTime >= startFrame)
|
||||
if (mWaitTime >= pRes->getDyn()->getStartFrame())
|
||||
return true;
|
||||
|
||||
if (!(mStatus & 2))
|
||||
if (!checkStatus(2)) {
|
||||
mWaitTime++;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -111,7 +106,7 @@ bool JPABaseEmitter::processTermination() {
|
||||
if (mMaxFrame < 0) {
|
||||
setStatus(8);
|
||||
return getParticleNumber() == 0;
|
||||
}
|
||||
}
|
||||
if (mTick >= mMaxFrame) {
|
||||
setStatus(8);
|
||||
if (checkStatus(0x40)) {
|
||||
@@ -129,7 +124,7 @@ void JPABaseEmitter::calcEmitterGlobalPosition(JGeometry::TVec3<f32>* dst) const
|
||||
mtx[0][3] = mGlobalTrs.x;
|
||||
mtx[1][3] = mGlobalTrs.y;
|
||||
mtx[2][3] = mGlobalTrs.z;
|
||||
MTXMultVec(mtx, mLocalTrs, *dst);
|
||||
MTXMultVec(mtx, &mLocalTrs, dst);
|
||||
}
|
||||
|
||||
u32 JPABaseEmitter::getCurrentCreateNumber() const {
|
||||
@@ -140,7 +135,8 @@ u8 JPABaseEmitter::getDrawCount() const {
|
||||
return mpEmtrMgr->pWd->mDrawCount;
|
||||
}
|
||||
|
||||
bool JPABaseEmitter::loadTexture(u8 idx, GXTexMapID texMapID) {
|
||||
mpEmtrMgr->pWd->mpResMgr->load(mpRes->getTexIdx(idx), texMapID);
|
||||
bool JPABaseEmitter::loadTexture(u8 no, GXTexMapID texMapID) {
|
||||
JUT_ASSERT(286, pRes->texNum > no);
|
||||
mpEmtrMgr->pWd->mpResMgr->load(pRes->getTexIdx(no), texMapID);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ void JPAEmitterManager::calc(u8 group_id) {
|
||||
|
||||
JPABaseEmitter* emtr = pLink->getObject();
|
||||
|
||||
if (emtr->mpRes->calc(pWd, emtr) && !emtr->checkStatus(0x200))
|
||||
if (emtr->pRes->calc(pWd, emtr) && !emtr->checkStatus(0x200))
|
||||
forceDeleteEmitter(emtr);
|
||||
}
|
||||
}
|
||||
@@ -115,7 +115,7 @@ void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 group_id) {
|
||||
JPABaseEmitter* emtr = pLink->getObject();
|
||||
if (!emtr->checkStatus(0x04)) {
|
||||
pWd->mpResMgr = pResMgrAry[emtr->mResMgrID];
|
||||
emtr->mpRes->draw(pWd, emtr);
|
||||
emtr->pRes->draw(pWd, emtr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,18 +10,14 @@ void JPALoadExTex(JPAEmitterWorkData* work) {
|
||||
|
||||
GXTexCoordID secTexCoordID = GX_TEXCOORD1;
|
||||
if (ets->isUseIndirect()) {
|
||||
GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_FALSE,
|
||||
GX_PTIDENTITY);
|
||||
u8 texIdx = ets->getIndTexIdx();
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(texIdx), GX_TEXMAP2);
|
||||
GXSetTexCoordGen(secTexCoordID, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(ets->getIndTexIdx()), GX_TEXMAP2);
|
||||
secTexCoordID = GX_TEXCOORD2;
|
||||
}
|
||||
|
||||
if (ets->isUseSecTex()) {
|
||||
GXSetTexCoordGen2(secTexCoordID, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_FALSE,
|
||||
GX_PTIDENTITY);
|
||||
u8 texIdx = ets->getSecTexIdx();
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(texIdx), GX_TEXMAP3);
|
||||
GXSetTexCoordGen(secTexCoordID, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(ets->getSecTexIdx()), GX_TEXMAP3);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,6 @@ void JPACalcScaleY(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
}
|
||||
|
||||
void JPACalcScaleCopy(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
JPAExtraShape* esp = work->mpRes->getEsp();
|
||||
ptcl->mParticleScaleY = ptcl->mParticleScaleX;
|
||||
}
|
||||
|
||||
@@ -55,21 +54,21 @@ void JPACalcScaleAnmRepeatY(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
|
||||
void JPACalcScaleAnmReverseX(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
JPAExtraShape* esp = work->mpRes->getEsp();
|
||||
s32 cycle = ptcl->mAge / esp->getScaleAnmCycleX();
|
||||
f32 cycle = ptcl->mAge / esp->getScaleAnmCycleX() & 1;
|
||||
f32 base = (ptcl->mAge % esp->getScaleAnmCycleX()) / (f32)esp->getScaleAnmCycleX();
|
||||
work->mScaleAnm = base + ((cycle & 1) * (1.0f - base * 2.0f));
|
||||
work->mScaleAnm = base + cycle * (1.0f - base * 2.0f);
|
||||
}
|
||||
|
||||
void JPACalcScaleAnmReverseY(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
JPAExtraShape* esp = work->mpRes->getEsp();
|
||||
s32 cycle = ptcl->mAge / esp->getScaleAnmCycleY();
|
||||
f32 cycle = ptcl->mAge / esp->getScaleAnmCycleY() & 1;
|
||||
f32 base = (ptcl->mAge % esp->getScaleAnmCycleY()) / (f32)esp->getScaleAnmCycleY();
|
||||
work->mScaleAnm = base + ((cycle & 1) * (1.0f - base * 2.0f));
|
||||
work->mScaleAnm = base + cycle * (1.0f - base * 2.0f);
|
||||
}
|
||||
|
||||
void JPACalcAlphaAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
JPAExtraShape* esp = work->mpRes->getEsp();
|
||||
f32 alpha;
|
||||
f32 alpha = 0.0f;
|
||||
if (ptcl->mTime < esp->getAlphaInTiming()) {
|
||||
alpha = 255.0f * (esp->getAlphaInValue() + esp->getAlphaIncRate() * ptcl->mTime);
|
||||
} else if (ptcl->mTime > esp->getAlphaOutTiming()) {
|
||||
@@ -83,7 +82,7 @@ void JPACalcAlphaAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
|
||||
void JPACalcAlphaFlickAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
JPAExtraShape* esp = work->mpRes->getEsp();
|
||||
f32 alpha;
|
||||
f32 alpha = 0.0f;
|
||||
if (ptcl->mTime < esp->getAlphaInTiming()) {
|
||||
alpha = (esp->getAlphaInValue() + esp->getAlphaIncRate() * ptcl->mTime);
|
||||
} else if (ptcl->mTime > esp->getAlphaOutTiming()) {
|
||||
@@ -92,8 +91,7 @@ void JPACalcAlphaFlickAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
} else {
|
||||
alpha = esp->getAlphaBaseValue();
|
||||
}
|
||||
s32 theta = ptcl->mAlphaWaveRandom * ptcl->mAge * 16384.0f * (1.0f - esp->getAlphaFreq());
|
||||
f32 wave = JMASSin(theta);
|
||||
f32 wave = JMASSin(ptcl->mAlphaWaveRandom * ptcl->mAge * 16384.0f * (1.0f - esp->getAlphaFreq()));
|
||||
alpha *= (1.0f + esp->getAlphaAmp() * (wave - 1.0f) * 0.5f) * 255.0f;
|
||||
OSf32tou8(&alpha, &ptcl->mPrmColorAlphaAnm);
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ void JPAFieldAir::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) {
|
||||
if (block->checkStatus(2)) {
|
||||
mAccel.scale(block->getMag(), vec);
|
||||
} else {
|
||||
MTXMultVecSR(work->mRotationMtx, vec, mAccel);
|
||||
MTXMultVecSR(work->mRotationMtx, &vec, &mAccel);
|
||||
mAccel.scale(block->getMag());
|
||||
}
|
||||
}
|
||||
@@ -129,7 +129,7 @@ void JPAFieldConvection::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block)
|
||||
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, &block->getDir(), &field_0x1c);
|
||||
MTXMultVecSR(work->mGlobalRot, &vec2, &field_0x28);
|
||||
field_0x10.normalize();
|
||||
field_0x1c.normalize();
|
||||
@@ -224,34 +224,36 @@ void JPAFieldBlock::init(JKRHeap* heap) {
|
||||
|
||||
switch (getType()) {
|
||||
case FIELD_GRAVITY:
|
||||
mpField = new (heap, 0) JPAFieldGravity();
|
||||
pFld = new (heap, 0) JPAFieldGravity();
|
||||
break;
|
||||
case FIELD_AIR:
|
||||
mpField = new (heap, 0) JPAFieldAir();
|
||||
pFld = new (heap, 0) JPAFieldAir();
|
||||
break;
|
||||
case FIELD_MAGNET:
|
||||
mpField = new (heap, 0) JPAFieldMagnet();
|
||||
pFld = new (heap, 0) JPAFieldMagnet();
|
||||
break;
|
||||
case FIELD_NEWTON:
|
||||
mpField = new (heap, 0) JPAFieldNewton();
|
||||
pFld = new (heap, 0) JPAFieldNewton();
|
||||
break;
|
||||
case FIELD_VORTEX:
|
||||
mpField = new (heap, 0) JPAFieldVortex();
|
||||
pFld = new (heap, 0) JPAFieldVortex();
|
||||
break;
|
||||
case FIELD_RANDOM:
|
||||
mpField = new (heap, 0) JPAFieldRandom();
|
||||
pFld = new (heap, 0) JPAFieldRandom();
|
||||
break;
|
||||
case FIELD_DRAG:
|
||||
mpField = new (heap, 0) JPAFieldDrag();
|
||||
pFld = new (heap, 0) JPAFieldDrag();
|
||||
break;
|
||||
case FIELD_CONVECTION:
|
||||
mpField = new (heap, 0) JPAFieldConvection();
|
||||
pFld = new (heap, 0) JPAFieldConvection();
|
||||
break;
|
||||
case FIELD_SPIN:
|
||||
mpField = new (heap, 0) JPAFieldSpin();
|
||||
pFld = new (heap, 0) JPAFieldSpin();
|
||||
break;
|
||||
default:
|
||||
mpField = NULL;
|
||||
pFld = NULL;
|
||||
JUT_WARN(483, "JPA : WRONG ID (%d) in field data\n", getType());
|
||||
break;
|
||||
}
|
||||
JUT_ASSERT(485, pFld != 0);
|
||||
}
|
||||
|
||||
@@ -10,11 +10,11 @@ JPAKeyBlock::JPAKeyBlock(const u8* data)
|
||||
}
|
||||
|
||||
f32 JPAKeyBlock::calc(float p1) {
|
||||
if (mDataStart[0xB] != '\0') {
|
||||
int v1 = (int)field_0x4[(mDataStart[9] - 1) * 4] + 1;
|
||||
if (isLoop()) {
|
||||
int v1 = (int)getKeyData()[(getKeyNum() - 1) * 4] + 1;
|
||||
// p1 -= (v1 * ((int)p1 / v1));
|
||||
int v2 = ((int)p1 / v1);
|
||||
p1 = p1 - (v2 * v1);
|
||||
}
|
||||
return JPACalcKeyAnmValue(p1, mDataStart[9], field_0x4);
|
||||
return JPACalcKeyAnmValue(p1, getKeyNum(), getKeyData());
|
||||
}
|
||||
|
||||
@@ -50,10 +50,7 @@ void JPAGetYZRotateMtx(s16 angleY, s16 angleZ, f32 (*param_2)[4]) {
|
||||
param_2[1][2] = (siny * sinz);
|
||||
param_2[2][0] = -siny;
|
||||
param_2[2][2] = cosy;
|
||||
param_2[2][3] = 0.0f;
|
||||
param_2[2][1] = 0.0f;
|
||||
param_2[1][3] = 0.0f;
|
||||
param_2[0][3] = 0.0f;
|
||||
param_2[0][3] = param_2[1][3] = param_2[2][1] = param_2[2][3] = 0.0f;
|
||||
}
|
||||
|
||||
void JPAGetXYZRotateMtx(s16 x, s16 y, s16 z, Mtx mtx) {
|
||||
@@ -68,17 +65,15 @@ void JPAGetXYZRotateMtx(s16 x, s16 y, s16 z, Mtx mtx) {
|
||||
mtx[2][0] = -siny;
|
||||
mtx[2][1] = sinx * cosy;
|
||||
mtx[2][2] = cosx * cosy;
|
||||
f32 cosxsinz = cosx * sinz;
|
||||
f32 sinxcosz = sinx * cosz;
|
||||
mtx[0][1] = sinxcosz * siny - cosxsinz;
|
||||
mtx[1][2] = cosxsinz * siny - sinxcosz;
|
||||
f32 sinxsinz = sinx * sinz;
|
||||
f32 cosxcosz = cosx * cosz;
|
||||
mtx[0][2] = sinxsinz + cosxcosz * siny;
|
||||
mtx[1][1] = cosxcosz + sinxsinz * siny;
|
||||
mtx[2][3] = 0.0f;
|
||||
mtx[1][3] = 0.0f;
|
||||
mtx[0][3] = 0.0f;
|
||||
f32 f30 = cosx * sinz;
|
||||
f32 f29 = sinx * cosz;
|
||||
mtx[0][1] = f29 * siny - f30;
|
||||
mtx[1][2] = f30 * siny - f29;
|
||||
f30 = sinx * sinz;
|
||||
f29 = cosx * cosz;
|
||||
mtx[0][2] = f30 + f29 * siny;
|
||||
mtx[1][1] = f29 + f30 * siny;
|
||||
mtx[0][3] = mtx[1][3] = mtx[2][3] = 0.0f;
|
||||
}
|
||||
|
||||
void JPASetRMtxTVecfromMtx(f32 const (*param_0)[4], f32 (*param_1)[4],
|
||||
@@ -89,8 +84,7 @@ void JPASetRMtxTVecfromMtx(f32 const (*param_0)[4], f32 (*param_1)[4],
|
||||
|
||||
void JPASetRMtxSTVecfromMtx(f32 const (*param_0)[4], f32 (*param_1)[4],
|
||||
JGeometry::TVec3<f32>* param_2, JGeometry::TVec3<f32>* param_3) {
|
||||
JGeometry::TVec3<float> aTStack_54;
|
||||
aTStack_54.set(param_0[0][0], param_0[1][0], param_0[2][0]);
|
||||
JGeometry::TVec3<float> aTStack_54(param_0[0][0], param_0[1][0], param_0[2][0]);
|
||||
param_2->x = aTStack_54.length();
|
||||
aTStack_54.set(param_0[0][1], param_0[1][1], param_0[2][1]);
|
||||
param_2->y = aTStack_54.length();
|
||||
|
||||
@@ -15,32 +15,17 @@
|
||||
#include "global.h"
|
||||
|
||||
JPAResource::JPAResource() {
|
||||
mpDrawEmitterChildFuncList = NULL;
|
||||
mpDrawEmitterFuncList = NULL;
|
||||
mpCalcEmitterFuncList = NULL;
|
||||
mpDrawParticleChildFuncList = NULL;
|
||||
mpCalcParticleChildFuncList = NULL;
|
||||
mpDrawParticleFuncList = NULL;
|
||||
mpCalcParticleFuncList = NULL;
|
||||
mpBaseShape = NULL;
|
||||
mpExtraShape = NULL;
|
||||
mpChildShape = NULL;
|
||||
mpExTexShape = NULL;
|
||||
mpDynamicsBlock = NULL;
|
||||
mpFieldBlocks = NULL;
|
||||
mpKeyBlocks = NULL;
|
||||
mpCalcEmitterFuncList = mpDrawEmitterFuncList = mpDrawEmitterChildFuncList = NULL;
|
||||
mpCalcParticleFuncList = mpDrawParticleFuncList = mpCalcParticleChildFuncList = mpDrawParticleChildFuncList = NULL;
|
||||
pBsp = NULL;
|
||||
pEsp = NULL;
|
||||
pCsp = NULL;
|
||||
pEts = NULL;
|
||||
pDyn = NULL;
|
||||
ppFld = NULL;
|
||||
ppKey = NULL;
|
||||
mpTDB1 = NULL;
|
||||
mpDrawParticleChildFuncListNum = 0;
|
||||
mpCalcParticleChildFuncListNum = 0;
|
||||
mpDrawParticleFuncListNum = 0;
|
||||
mpCalcParticleFuncListNum = 0;
|
||||
mpDrawEmitterChildFuncListNum = 0;
|
||||
mpDrawEmitterFuncListNum = 0;
|
||||
mpCalcEmitterFuncListNum = 0;
|
||||
mTDB1Num = 0;
|
||||
mKeyBlockNum = 0;
|
||||
mFieldBlockNum = 0;
|
||||
mUsrIdx = 0;
|
||||
mUsrIdx = fldNum = keyNum = texNum = mpCalcEmitterFuncListNum = mpDrawEmitterFuncListNum = mpDrawEmitterChildFuncListNum = mpCalcParticleFuncListNum = mpDrawParticleFuncListNum = mpCalcParticleChildFuncListNum = mpDrawParticleChildFuncListNum = 0;
|
||||
}
|
||||
|
||||
static u8 jpa_pos[324] ATTRIBUTE_ALIGN(32) = {
|
||||
@@ -73,30 +58,31 @@ static u8 jpa_crd[32] ATTRIBUTE_ALIGN(32) = {
|
||||
};
|
||||
|
||||
void JPAResource::init(JKRHeap* heap) {
|
||||
BOOL is_glbl_clr_anm = mpBaseShape->isGlblClrAnm();
|
||||
BOOL is_glbl_tex_anm = mpBaseShape->isGlblTexAnm();
|
||||
BOOL is_prm_anm = mpBaseShape->isPrmAnm();
|
||||
BOOL is_env_anm = mpBaseShape->isEnvAnm();
|
||||
BOOL is_tex_anm = mpBaseShape->isTexAnm();
|
||||
BOOL is_tex_crd_anm = mpBaseShape->isTexCrdAnm();
|
||||
BOOL is_prj_tex = mpBaseShape->isPrjTex();
|
||||
BOOL is_enable_scale_anm = mpExtraShape != NULL && mpExtraShape->isEnableScaleAnm();
|
||||
BOOL is_enable_alpha_anm = mpExtraShape != NULL && mpExtraShape->isEnableAlphaAnm();
|
||||
BOOL is_enable_alpha_flick = mpExtraShape != NULL && mpExtraShape->isEnableAlphaAnm()
|
||||
&& mpExtraShape->isEnableAlphaFlick();
|
||||
BOOL is_enable_rotate_anm = mpExtraShape != NULL && mpExtraShape->isEnableRotateAnm();
|
||||
BOOL is_glbl_clr_anm = pBsp->isGlblClrAnm();
|
||||
BOOL is_glbl_tex_anm = pBsp->isGlblTexAnm();
|
||||
BOOL is_prm_anm = pBsp->isPrmAnm();
|
||||
BOOL is_env_anm = pBsp->isEnvAnm();
|
||||
BOOL is_tex_anm = pBsp->isTexAnm();
|
||||
BOOL is_tex_crd_anm = pBsp->isTexCrdAnm();
|
||||
BOOL is_prj_tex = pBsp->isPrjTex();
|
||||
BOOL is_enable_scale_anm = pEsp != NULL && pEsp->isEnableScaleAnm();
|
||||
BOOL is_enable_alpha_anm = pEsp != NULL && pEsp->isEnableAlphaAnm();
|
||||
BOOL is_enable_alpha_flick = pEsp != NULL && pEsp->isEnableAlphaAnm()
|
||||
&& pEsp->isEnableAlphaFlick();
|
||||
BOOL is_enable_rotate_anm = pEsp != NULL && pEsp->isEnableRotateAnm();
|
||||
BOOL is_rotate_on = is_enable_rotate_anm
|
||||
|| (mpChildShape != NULL && mpChildShape->isRotateOn());
|
||||
BOOL base_type_5_6 = mpBaseShape->getType() == 5 || mpBaseShape->getType() == 6;
|
||||
BOOL base_type_0 = mpBaseShape->getType() == 0;
|
||||
BOOL base_type_0_1 = mpBaseShape->getType() == 0 || mpBaseShape->getType() == 1;
|
||||
BOOL child_type_5_6 = mpChildShape != NULL
|
||||
&& (mpChildShape->getType() == 5 || mpChildShape->getType() == 6);
|
||||
BOOL child_type_0 = mpChildShape != NULL && mpChildShape->getType() == 0;
|
||||
BOOL child_type_0_1 = mpChildShape != NULL
|
||||
&& (mpChildShape->getType() == 0 || mpChildShape->getType() == 1);
|
||||
BOOL is_draw_parent = !mpBaseShape->isNoDrawParent();
|
||||
BOOL is_draw_child = !mpBaseShape->isNoDrawChild();
|
||||
|| (pCsp != NULL && pCsp->isRotateOn());
|
||||
BOOL base_type_5_6 = pBsp->getType() == 5 || pBsp->getType() == 6;
|
||||
BOOL base_type_0 = pBsp->getType() == 0;
|
||||
BOOL base_type_0_1 = pBsp->getType() == 0 || pBsp->getType() == 1;
|
||||
BOOL child_type_5_6 = pCsp != NULL
|
||||
&& (pCsp->getType() == 5 || pCsp->getType() == 6);
|
||||
BOOL child_type_0 = pCsp != NULL && pCsp->getType() == 0;
|
||||
BOOL child_type_0_1 = pCsp != NULL
|
||||
&& (pCsp->getType() == 0 || pCsp->getType() == 1);
|
||||
BOOL is_draw_parent = !pBsp->isNoDrawParent();
|
||||
BOOL is_draw_child = !pBsp->isNoDrawChild();
|
||||
int func_no = 0;
|
||||
|
||||
if (is_glbl_tex_anm && is_tex_anm) {
|
||||
mpCalcEmitterFuncListNum++;
|
||||
@@ -119,10 +105,10 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
(EmitterFunc*)JKRAllocFromHeap(heap, mpCalcEmitterFuncListNum * 4, 4);
|
||||
}
|
||||
|
||||
int func_no = 0;
|
||||
func_no = 0;
|
||||
|
||||
if (is_glbl_tex_anm && is_tex_anm) {
|
||||
switch (mpBaseShape->getTexAnmType()) {
|
||||
switch (pBsp->getTexAnmType()) {
|
||||
case 0:
|
||||
mpCalcEmitterFuncList[func_no] = &JPACalcTexIdxNormal;
|
||||
break;
|
||||
@@ -152,7 +138,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
func_no++;
|
||||
}
|
||||
if (is_prm_anm || is_env_anm) {
|
||||
switch (mpBaseShape->getClrAnmType()) {
|
||||
switch (pBsp->getClrAnmType()) {
|
||||
case 0:
|
||||
mpCalcEmitterFuncList[func_no] = &JPACalcClrIdxNormal;
|
||||
break;
|
||||
@@ -169,6 +155,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
mpCalcEmitterFuncList[func_no] = &JPACalcClrIdxRandom;
|
||||
break;
|
||||
}
|
||||
func_no++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,9 +182,9 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
}
|
||||
|
||||
if (is_enable_scale_anm) {
|
||||
if (mpBaseShape->getType() != 0) {
|
||||
if (mpExtraShape->isScaleXYDiff()) {
|
||||
if (mpExtraShape->getScaleAnmTypeX() == 0 && mpExtraShape->getScaleAnmTypeY() == 0) {
|
||||
if (pBsp->getType() != 0) {
|
||||
if (pEsp->isScaleXYDiff()) {
|
||||
if (pEsp->getScaleAnmTypeX() == 0 && pEsp->getScaleAnmTypeY() == 0) {
|
||||
mpCalcParticleFuncListNum++;
|
||||
} else {
|
||||
mpCalcParticleFuncListNum++;
|
||||
@@ -219,7 +206,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
func_no = 0;
|
||||
|
||||
if (!is_glbl_tex_anm && is_tex_anm) {
|
||||
switch (mpBaseShape->getTexAnmType()) {
|
||||
switch (pBsp->getTexAnmType()) {
|
||||
case 0:
|
||||
mpCalcParticleFuncList[func_no] = &JPACalcTexIdxNormal;
|
||||
break;
|
||||
@@ -259,7 +246,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
func_no++;
|
||||
}
|
||||
if (is_prm_anm || is_env_anm) {
|
||||
switch (mpBaseShape->getClrAnmType()) {
|
||||
switch (pBsp->getClrAnmType()) {
|
||||
case 0:
|
||||
mpCalcParticleFuncList[func_no] = &JPACalcClrIdxNormal;
|
||||
break;
|
||||
@@ -284,12 +271,12 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
}
|
||||
|
||||
if (is_enable_scale_anm) {
|
||||
if (mpBaseShape->getType() != 0) {
|
||||
if (mpExtraShape->isScaleXYDiff()) {
|
||||
if (pBsp->getType() != 0) {
|
||||
if (pEsp->isScaleXYDiff()) {
|
||||
mpCalcParticleFuncList[func_no] = &JPACalcScaleY;
|
||||
func_no++;
|
||||
if (mpExtraShape->getScaleAnmTypeY() != 0 || mpExtraShape->getScaleAnmTypeX() != 0) {
|
||||
switch (mpExtraShape->getScaleAnmTypeY()) {
|
||||
if (pEsp->getScaleAnmTypeY() != 0 || pEsp->getScaleAnmTypeX() != 0) {
|
||||
switch (pEsp->getScaleAnmTypeY()) {
|
||||
case 0:
|
||||
mpCalcParticleFuncList[func_no] = &JPACalcScaleAnmNormal;
|
||||
break;
|
||||
@@ -309,7 +296,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
}
|
||||
mpCalcParticleFuncList[func_no] = &JPACalcScaleX;
|
||||
func_no++;
|
||||
switch (mpExtraShape->getScaleAnmTypeX()) {
|
||||
switch (pEsp->getScaleAnmTypeX()) {
|
||||
case 0:
|
||||
mpCalcParticleFuncList[func_no] = &JPACalcScaleAnmNormal;
|
||||
break;
|
||||
@@ -320,13 +307,14 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
mpCalcParticleFuncList[func_no] = &JPACalcScaleAnmReverseX;
|
||||
break;
|
||||
}
|
||||
func_no++;
|
||||
}
|
||||
|
||||
if (mpChildShape != NULL && mpChildShape->isScaleOutOn()) {
|
||||
if (pCsp != NULL && pCsp->isScaleOutOn()) {
|
||||
mpCalcParticleChildFuncListNum++;
|
||||
}
|
||||
|
||||
if (mpChildShape != NULL && mpChildShape->isAlphaOutOn()) {
|
||||
if (pCsp != NULL && pCsp->isAlphaOutOn()) {
|
||||
mpCalcParticleChildFuncListNum++;
|
||||
}
|
||||
|
||||
@@ -337,13 +325,14 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
|
||||
func_no = 0;
|
||||
|
||||
if (mpChildShape != NULL && mpChildShape->isScaleOutOn()) {
|
||||
if (pCsp != NULL && pCsp->isScaleOutOn()) {
|
||||
mpCalcParticleChildFuncList[func_no] = &JPACalcChildScaleOut;
|
||||
func_no++;
|
||||
}
|
||||
|
||||
if (mpChildShape != NULL && mpChildShape->isAlphaOutOn()) {
|
||||
if (pCsp != NULL && pCsp->isAlphaOutOn()) {
|
||||
mpCalcParticleChildFuncList[func_no] = &JPACalcChildAlphaOut;
|
||||
func_no++;
|
||||
}
|
||||
|
||||
if (is_draw_parent && base_type_5_6) {
|
||||
@@ -352,7 +341,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
|
||||
mpDrawEmitterFuncListNum++;
|
||||
|
||||
if (mpExTexShape != NULL) {
|
||||
if (pEts != NULL) {
|
||||
mpDrawEmitterFuncListNum++;
|
||||
}
|
||||
|
||||
@@ -382,7 +371,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
func_no = 0;
|
||||
|
||||
if (is_draw_parent && base_type_5_6) {
|
||||
if (mpBaseShape->getType() == 5) {
|
||||
if (pBsp->getType() == 5) {
|
||||
mpDrawEmitterFuncList[func_no] = &JPADrawStripe;
|
||||
func_no++;
|
||||
} else {
|
||||
@@ -394,7 +383,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
mpDrawEmitterFuncList[func_no] = &JPADrawEmitterCallBackB;
|
||||
func_no++;
|
||||
|
||||
if (mpExTexShape != NULL) {
|
||||
if (pEts != NULL) {
|
||||
mpDrawEmitterFuncList[func_no] = &JPALoadExTex;
|
||||
func_no++;
|
||||
}
|
||||
@@ -444,17 +433,22 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
if (is_glbl_clr_anm) {
|
||||
if (base_type_5_6 || !is_enable_alpha_anm) {
|
||||
mpDrawEmitterFuncList[func_no] = &JPARegistPrmEnv;
|
||||
func_no++;
|
||||
} else if (is_enable_alpha_anm) {
|
||||
mpDrawEmitterFuncList[func_no] = &JPARegistEnv;
|
||||
func_no++;
|
||||
}
|
||||
} else if (!is_prm_anm && !is_enable_alpha_anm) {
|
||||
if (!is_env_anm) {
|
||||
mpDrawEmitterFuncList[func_no] = &JPARegistPrmEnv;
|
||||
func_no++;
|
||||
} else {
|
||||
mpDrawEmitterFuncList[func_no] = &JPARegistPrm;
|
||||
func_no++;
|
||||
}
|
||||
} else if (!is_env_anm) {
|
||||
mpDrawEmitterFuncList[func_no] = &JPARegistEnv;
|
||||
func_no++;
|
||||
}
|
||||
|
||||
if (is_draw_child && child_type_5_6) {
|
||||
@@ -467,8 +461,8 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
mpDrawEmitterChildFuncListNum++;
|
||||
}
|
||||
|
||||
if (mpChildShape != NULL && !mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited()
|
||||
&& !mpChildShape->isColorInherited()) {
|
||||
if (pCsp != NULL && !pCsp->isAlphaOutOn() && !pCsp->isAlphaInherited()
|
||||
&& !pCsp->isColorInherited()) {
|
||||
mpDrawEmitterChildFuncListNum++;
|
||||
}
|
||||
|
||||
@@ -480,7 +474,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
func_no = 0;
|
||||
|
||||
if (is_draw_child && child_type_5_6) {
|
||||
if (mpChildShape->getType() == 5) {
|
||||
if (pCsp->getType() == 5) {
|
||||
mpDrawEmitterChildFuncList[func_no] = &JPADrawStripe;
|
||||
func_no++;
|
||||
} else {
|
||||
@@ -497,9 +491,10 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
func_no++;
|
||||
}
|
||||
|
||||
if (mpChildShape != NULL && !mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited()
|
||||
&& !mpChildShape->isColorInherited()) {
|
||||
if (pCsp != NULL && !pCsp->isAlphaOutOn() && !pCsp->isAlphaInherited()
|
||||
&& !pCsp->isColorInherited()) {
|
||||
mpDrawEmitterChildFuncList[func_no] = &JPARegistChildPrmEnv;
|
||||
func_no++;
|
||||
}
|
||||
|
||||
if (is_draw_parent && !base_type_5_6) {
|
||||
@@ -529,7 +524,7 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
func_no = 0;
|
||||
|
||||
if (is_draw_parent && !base_type_5_6) {
|
||||
switch (mpBaseShape->getType()) {
|
||||
switch (pBsp->getType()) {
|
||||
case 2:
|
||||
if (is_enable_rotate_anm) {
|
||||
mpDrawParticleFuncList[func_no] = &JPADrawRotBillboard;
|
||||
@@ -594,23 +589,29 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
if (is_prm_anm) {
|
||||
if (is_env_anm) {
|
||||
mpDrawParticleFuncList[func_no] = &JPARegistPrmAlphaEnv;
|
||||
func_no++;
|
||||
} else {
|
||||
mpDrawParticleFuncList[func_no] = &JPARegistPrmAlpha;
|
||||
func_no++;
|
||||
}
|
||||
} else if (is_enable_alpha_anm) {
|
||||
if (is_env_anm) {
|
||||
mpDrawParticleFuncList[func_no] = &JPARegistAlphaEnv;
|
||||
func_no++;
|
||||
} else {
|
||||
mpDrawParticleFuncList[func_no] = &JPARegistAlpha;
|
||||
func_no++;
|
||||
}
|
||||
} else if (is_env_anm) {
|
||||
mpDrawParticleFuncList[func_no] = &JPARegistEnv;
|
||||
func_no++;
|
||||
}
|
||||
} else if (is_enable_alpha_anm && !base_type_5_6) {
|
||||
mpDrawParticleFuncList[func_no] = &JPARegistAlpha;
|
||||
func_no++;
|
||||
}
|
||||
|
||||
if (is_draw_child && mpChildShape != NULL && !child_type_5_6) {
|
||||
if (is_draw_child && pCsp != NULL && !child_type_5_6) {
|
||||
mpDrawParticleChildFuncListNum++;
|
||||
}
|
||||
|
||||
@@ -620,8 +621,8 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
mpDrawParticleChildFuncListNum++;
|
||||
}
|
||||
|
||||
if (mpChildShape != NULL && (mpChildShape->isAlphaOutOn() || mpChildShape->isAlphaInherited()
|
||||
|| mpChildShape->isColorInherited())) {
|
||||
if (pCsp != NULL && (pCsp->isAlphaOutOn() || pCsp->isAlphaInherited()
|
||||
|| pCsp->isColorInherited())) {
|
||||
mpDrawParticleChildFuncListNum++;
|
||||
}
|
||||
|
||||
@@ -632,8 +633,8 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
|
||||
func_no = 0;
|
||||
|
||||
if (is_draw_child && mpChildShape != NULL && !child_type_5_6) {
|
||||
switch (mpChildShape->getType()) {
|
||||
if (is_draw_child && pCsp != NULL && !child_type_5_6) {
|
||||
switch (pCsp->getType()) {
|
||||
case 2:
|
||||
if (is_rotate_on) {
|
||||
mpDrawParticleChildFuncList[func_no] = &JPADrawRotBillboard;
|
||||
@@ -686,9 +687,10 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
}
|
||||
}
|
||||
|
||||
if (mpChildShape != NULL && (mpChildShape->isAlphaOutOn() || mpChildShape->isAlphaInherited()
|
||||
|| mpChildShape->isColorInherited())) {
|
||||
if (pCsp != NULL && (pCsp->isAlphaOutOn() || pCsp->isAlphaInherited()
|
||||
|| pCsp->isColorInherited())) {
|
||||
mpDrawParticleChildFuncList[func_no] = &JPARegistPrmAlphaEnv;
|
||||
func_no++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -720,8 +722,8 @@ bool JPAResource::calc(JPAEmitterWorkData* work, JPABaseEmitter* emtr) {
|
||||
} else {
|
||||
calcKey(work);
|
||||
|
||||
for (int i = mFieldBlockNum - 1; i >= 0; i--) {
|
||||
mpFieldBlocks[i]->initOpParam();
|
||||
for (int i = fldNum - 1; i >= 0; i--) {
|
||||
ppFld[i]->initOpParam();
|
||||
}
|
||||
|
||||
if (emtr->mpEmtrCallBack != NULL) {
|
||||
@@ -737,12 +739,12 @@ bool JPAResource::calc(JPAEmitterWorkData* work, JPABaseEmitter* emtr) {
|
||||
(*mpCalcEmitterFuncList[i])(work);
|
||||
}
|
||||
|
||||
for (int i = mFieldBlockNum - 1; i >= 0; i--) {
|
||||
mpFieldBlocks[i]->prepare(work);
|
||||
for (int i = fldNum - 1; i >= 0; i--) {
|
||||
ppFld[i]->prepare(work);
|
||||
}
|
||||
|
||||
if (!emtr->checkStatus(8)) {
|
||||
mpDynamicsBlock->create(work);
|
||||
pDyn->create(work);
|
||||
}
|
||||
|
||||
if (emtr->mpEmtrCallBack != NULL) {
|
||||
@@ -752,23 +754,19 @@ bool JPAResource::calc(JPAEmitterWorkData* work, JPABaseEmitter* emtr) {
|
||||
}
|
||||
}
|
||||
|
||||
JPANode<JPABaseParticle>* node = emtr->mAlivePtclBase.getFirst();
|
||||
JPANode<JPABaseParticle>* next;
|
||||
while (node != emtr->mAlivePtclBase.getEnd()) {
|
||||
JPANode<JPABaseParticle>* next = NULL;
|
||||
for (JPANode<JPABaseParticle>* node = emtr->mAlivePtclBase.getFirst(); node != emtr->mAlivePtclBase.getEnd(); node = next) {
|
||||
next = node->getNext();
|
||||
if (node->getObject()->calc_p(work)) {
|
||||
emtr->mpPtclPool->push_front(emtr->mAlivePtclBase.erase(node));
|
||||
}
|
||||
node = next;
|
||||
}
|
||||
|
||||
node = emtr->mAlivePtclChld.getFirst();
|
||||
while (node != emtr->mAlivePtclChld.getEnd()) {
|
||||
for (JPANode<JPABaseParticle>* node = emtr->mAlivePtclChld.getFirst(); node != emtr->mAlivePtclChld.getEnd(); node = next) {
|
||||
next = node->getNext();
|
||||
if (node->getObject()->calc_c(work)) {
|
||||
emtr->mpPtclPool->push_front(emtr->mAlivePtclChld.erase(node));
|
||||
}
|
||||
node = next;
|
||||
}
|
||||
|
||||
emtr->mTick++;
|
||||
@@ -782,13 +780,13 @@ void JPAResource::draw(JPAEmitterWorkData* work, JPABaseEmitter* emtr) {
|
||||
work->mpRes = this;
|
||||
work->mDrawCount = 0;
|
||||
calcWorkData_d(work);
|
||||
mpBaseShape->setGX(work);
|
||||
pBsp->setGX(work);
|
||||
for (s32 i = 1; i <= emtr->getDrawTimes(); i++) {
|
||||
work->mDrawCount++;
|
||||
if (mpBaseShape->isDrawPrntAhead() && mpChildShape != NULL)
|
||||
if (pBsp->isDrawPrntAhead() && pCsp != NULL)
|
||||
drawC(work);
|
||||
drawP(work);
|
||||
if (!mpBaseShape->isDrawPrntAhead() && mpChildShape != NULL)
|
||||
if (!pBsp->isDrawPrntAhead() && pCsp != NULL)
|
||||
drawC(work);
|
||||
}
|
||||
}
|
||||
@@ -796,28 +794,28 @@ void JPAResource::draw(JPAEmitterWorkData* work, JPABaseEmitter* emtr) {
|
||||
void JPAResource::drawP(JPAEmitterWorkData* work) {
|
||||
work->mpEmtr->clearStatus(0x80);
|
||||
|
||||
work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * mpBaseShape->getBaseSizeX();
|
||||
work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * mpBaseShape->getBaseSizeY();
|
||||
work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * pBsp->getBaseSizeX();
|
||||
work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * pBsp->getBaseSizeY();
|
||||
|
||||
if (mpBaseShape->getType() == 0) {
|
||||
if (pBsp->getType() == 0) {
|
||||
work->mGlobalPtclScl.x *= 1.02f;
|
||||
} else if (mpBaseShape->getType() == 1) {
|
||||
} else if (pBsp->getType() == 1) {
|
||||
work->mGlobalPtclScl.x *= 1.02f;
|
||||
work->mGlobalPtclScl.y *= 0.4f;
|
||||
}
|
||||
|
||||
if (mpExtraShape != NULL && mpExtraShape->isEnableScaleAnm()) {
|
||||
work->mPivot.x = mpExtraShape->getScaleCenterX() - 1.0f;
|
||||
work->mPivot.y = mpExtraShape->getScaleCenterY() - 1.0f;
|
||||
if (pEsp != NULL && pEsp->isEnableScaleAnm()) {
|
||||
work->mPivot.x = pEsp->getScaleCenterX() - 1.0f;
|
||||
work->mPivot.y = pEsp->getScaleCenterY() - 1.0f;
|
||||
} else {
|
||||
work->mPivot.x = work->mPivot.y = 0.0f;
|
||||
}
|
||||
|
||||
work->mDirType = mpBaseShape->getDirType();
|
||||
work->mRotType = mpBaseShape->getRotType();
|
||||
work->mDLType = mpBaseShape->getType() == 4 || mpBaseShape->getType() == 8;
|
||||
work->mPlaneType = work->mDLType ? 2 : mpBaseShape->getBasePlaneType();
|
||||
work->mPrjType = mpBaseShape->isPrjTex() ? (mpBaseShape->isTexCrdAnm() ? 2 : 1) : 0;
|
||||
work->mDirType = pBsp->getDirType();
|
||||
work->mRotType = pBsp->getRotType();
|
||||
work->mDLType = pBsp->getType() == 4 || pBsp->getType() == 8;
|
||||
work->mPlaneType = work->mDLType ? 2 : pBsp->getBasePlaneType();
|
||||
work->mPrjType = pBsp->isPrjTex() ? (pBsp->isTexCrdAnm() ? 2 : 1) : 0;
|
||||
|
||||
work->mpAlivePtcl = &work->mpEmtr->mAlivePtclBase;
|
||||
setPTev();
|
||||
@@ -826,7 +824,7 @@ void JPAResource::drawP(JPAEmitterWorkData* work) {
|
||||
(*mpDrawEmitterFuncList[i])(work);
|
||||
}
|
||||
|
||||
if (mpBaseShape->isDrawFwdAhead()) {
|
||||
if (pBsp->isDrawFwdAhead()) {
|
||||
JPANode<JPABaseParticle>* node = work->mpEmtr->mAlivePtclBase.getLast();
|
||||
for (; node != work->mpEmtr->mAlivePtclBase.getEnd(); node = node->getPrev()) {
|
||||
work->mpCurNode = node;
|
||||
@@ -858,27 +856,27 @@ void JPAResource::drawP(JPAEmitterWorkData* work) {
|
||||
void JPAResource::drawC(JPAEmitterWorkData* work) {
|
||||
work->mpEmtr->setStatus(0x80);
|
||||
|
||||
if (mpChildShape->isScaleInherited()) {
|
||||
work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * mpBaseShape->getBaseSizeX();
|
||||
work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * mpBaseShape->getBaseSizeY();
|
||||
if (pCsp->isScaleInherited()) {
|
||||
work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * pBsp->getBaseSizeX();
|
||||
work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * pBsp->getBaseSizeY();
|
||||
} else {
|
||||
work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * mpChildShape->getScaleX();
|
||||
work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * mpChildShape->getScaleY();
|
||||
work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * pCsp->getScaleX();
|
||||
work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * pCsp->getScaleY();
|
||||
}
|
||||
|
||||
if (mpChildShape->getType() == 0) {
|
||||
if (pCsp->getType() == 0) {
|
||||
work->mGlobalPtclScl.x *= 1.02f;
|
||||
} else if (mpChildShape->getType() == 1) {
|
||||
} else if (pCsp->getType() == 1) {
|
||||
work->mGlobalPtclScl.x *= 1.02f;
|
||||
work->mGlobalPtclScl.y *= 0.4f;
|
||||
}
|
||||
|
||||
work->mPivot.x = work->mPivot.y = 0.0f;
|
||||
|
||||
work->mDirType = mpChildShape->getDirType();
|
||||
work->mRotType = mpChildShape->getRotType();
|
||||
work->mDLType = mpChildShape->getType() == 4 || mpChildShape->getType() == 8;
|
||||
work->mPlaneType = work->mDLType ? 2 : mpChildShape->getBasePlaneType();
|
||||
work->mDirType = pCsp->getDirType();
|
||||
work->mRotType = pCsp->getRotType();
|
||||
work->mDLType = pCsp->getType() == 4 || pCsp->getType() == 8;
|
||||
work->mPlaneType = work->mDLType ? 2 : pCsp->getBasePlaneType();
|
||||
work->mPrjType = 0;
|
||||
|
||||
work->mpAlivePtcl = &work->mpEmtr->mAlivePtclChld;
|
||||
@@ -888,7 +886,7 @@ void JPAResource::drawC(JPAEmitterWorkData* work) {
|
||||
(*mpDrawEmitterChildFuncList[i])(work);
|
||||
}
|
||||
|
||||
if (mpBaseShape->isDrawFwdAhead()) {
|
||||
if (pBsp->isDrawFwdAhead()) {
|
||||
JPANode<JPABaseParticle>* node = work->mpEmtr->mAlivePtclChld.getLast();
|
||||
for (; node != work->mpEmtr->mAlivePtclChld.getEnd(); node = node->getPrev()) {
|
||||
work->mpCurNode = node;
|
||||
@@ -923,33 +921,27 @@ void JPAResource::setPTev() {
|
||||
u8 tex_gens = 1;
|
||||
u8 ind_stages = 0;
|
||||
|
||||
int base_plane_type = (mpBaseShape->getType() == 3 || mpBaseShape->getType() == 7) ?
|
||||
mpBaseShape->getBasePlaneType() : 0;
|
||||
int center_offset;
|
||||
if (mpExtraShape != NULL) {
|
||||
center_offset =
|
||||
(mpExtraShape->getScaleCenterX() + 3 * mpExtraShape->getScaleCenterY()) * 0xC;
|
||||
} else {
|
||||
center_offset = 0x30;
|
||||
}
|
||||
int base_plane_type = (pBsp->getType() == 3 || pBsp->getType() == 7) ?
|
||||
pBsp->getBasePlaneType() : 0;
|
||||
int center_offset = pEsp != NULL ? (pEsp->getScaleCenterX() + 3 * pEsp->getScaleCenterY()) * 0xC : 0x30;
|
||||
int pos_offset = center_offset + base_plane_type * 0x6C;
|
||||
int crd_offset = (mpBaseShape->getTilingS() + 2 * mpBaseShape->getTilingT()) * 8;
|
||||
int crd_offset = (pBsp->getTilingS() + 2 * pBsp->getTilingT()) * 8;
|
||||
GXSetArray(GX_VA_POS, jpa_pos + pos_offset, 3);
|
||||
GXSetArray(GX_VA_TEX0, jpa_crd + crd_offset, 2);
|
||||
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
|
||||
|
||||
if (mpExTexShape != NULL) {
|
||||
if (mpExTexShape->isUseIndirect()) {
|
||||
GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD1, GX_TEXMAP2);
|
||||
if (pEts != NULL) {
|
||||
if (pEts->isUseIndirect()) {
|
||||
GXSetIndTexOrder(GX_INDTEXSTAGE0, tex_coord, GX_TEXMAP2);
|
||||
GXSetIndTexCoordScale(GX_INDTEXSTAGE0, GX_ITS_1, GX_ITS_1);
|
||||
GXSetIndTexMtx(GX_ITM_0, (f32(*)[3])mpExTexShape->getIndTexMtx(), mpExTexShape->getExpScale());
|
||||
GXSetIndTexMtx(GX_ITM_0, (f32(*)[3])pEts->getIndTexMtx(), pEts->getExpScale());
|
||||
GXSetTevIndirect(GX_TEVSTAGE0, GX_INDTEXSTAGE0, GX_ITF_8, GX_ITB_STU, GX_ITM_0,
|
||||
GX_ITW_OFF, GX_ITW_OFF, 0, 0, GX_ITBA_OFF);
|
||||
ind_stages++;
|
||||
tex_gens++;
|
||||
tex_coord = GX_TEXCOORD2;
|
||||
}
|
||||
if (mpExTexShape->isUseSecTex()) {
|
||||
if (pEts->isUseSecTex()) {
|
||||
GXSetTevOrder(GX_TEVSTAGE1, tex_coord, GX_TEXMAP3, GX_COLOR_NULL);
|
||||
GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO);
|
||||
GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO);
|
||||
@@ -964,7 +956,7 @@ void JPAResource::setPTev() {
|
||||
|
||||
GXSetNumTevStages(tev_stages);
|
||||
GXSetNumIndStages(ind_stages);
|
||||
if (mpBaseShape->isClipOn()) {
|
||||
if (pBsp->isClipOn()) {
|
||||
GXSetMisc(GX_MT_XF_FLUSH, 8);
|
||||
GXSetClipMode(GX_CLIP_ENABLE);
|
||||
} else {
|
||||
@@ -974,8 +966,8 @@ void JPAResource::setPTev() {
|
||||
}
|
||||
|
||||
void JPAResource::setCTev(JPAEmitterWorkData* work) {
|
||||
int base_plane_type = (mpChildShape->getType() == 3 || mpChildShape->getType() == 7) ?
|
||||
mpChildShape->getBasePlaneType() : 0;
|
||||
int base_plane_type = (pCsp->getType() == 3 || pCsp->getType() == 7) ?
|
||||
pCsp->getBasePlaneType() : 0;
|
||||
int pos_offset = 0x30 + base_plane_type * 0x6C;
|
||||
GXSetArray(GX_VA_POS, jpa_pos + pos_offset, 3);
|
||||
GXSetArray(GX_VA_TEX0, jpa_crd, 2);
|
||||
@@ -984,14 +976,14 @@ void JPAResource::setCTev(JPAEmitterWorkData* work) {
|
||||
GXSetTevDirect(GX_TEVSTAGE0);
|
||||
GXSetNumTevStages(1);
|
||||
GXSetNumIndStages(0);
|
||||
if (mpChildShape->isClipOn()) {
|
||||
if (pCsp->isClipOn()) {
|
||||
GXSetMisc(GX_MT_XF_FLUSH, 8);
|
||||
GXSetClipMode(GX_CLIP_ENABLE);
|
||||
} else {
|
||||
GXSetClipMode(GX_CLIP_DISABLE);
|
||||
}
|
||||
GXSetNumTexGens(1);
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(mpChildShape->getTexIdx()), GX_TEXMAP1);
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(pCsp->getTexIdx()), GX_TEXMAP1);
|
||||
}
|
||||
|
||||
void JPAResource::calc_p(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
@@ -1011,15 +1003,15 @@ void JPAResource::calc_c(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
}
|
||||
|
||||
void JPAResource::calcField(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
for (int i = mFieldBlockNum - 1; i >= 0; i--) {
|
||||
mpFieldBlocks[i]->calc(work, ptcl);
|
||||
for (int i = fldNum - 1; i >= 0; i--) {
|
||||
ppFld[i]->calc(work, ptcl);
|
||||
}
|
||||
}
|
||||
|
||||
void JPAResource::calcKey(JPAEmitterWorkData* work) {
|
||||
for (int i = mKeyBlockNum - 1; i >= 0; i--) {
|
||||
f32 val = mpKeyBlocks[i]->calc(work->mpEmtr->mTick);
|
||||
switch (mpKeyBlocks[i]->getID()) {
|
||||
for (int i = keyNum - 1; i >= 0; i--) {
|
||||
f32 val = ppKey[i]->calc(work->mpEmtr->mTick);
|
||||
switch (ppKey[i]->getID()) {
|
||||
case 0:
|
||||
work->mpEmtr->mRate = val;
|
||||
break;
|
||||
@@ -1047,6 +1039,9 @@ void JPAResource::calcKey(JPAEmitterWorkData* work) {
|
||||
case 10:
|
||||
work->mpEmtr->mScaleOut = val;
|
||||
break;
|
||||
default:
|
||||
JUT_WARN(917, "%s", "JPA : WRONG ID in key data\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1055,10 +1050,9 @@ void JPAResource::calcWorkData_c(JPAEmitterWorkData* work) {
|
||||
work->mVolumeSize = work->mpEmtr->mVolumeSize;
|
||||
work->mVolumeMinRad = work->mpEmtr->mVolumeMinRad;
|
||||
work->mVolumeSweep = work->mpEmtr->mVolumeSweep;
|
||||
work->mVolumeX = 0;
|
||||
work->mVolumeAngleNum = 0;
|
||||
work->mVolumeAngleNum = work->mVolumeX = 0;
|
||||
work->mVolumeAngleMax = 1;
|
||||
work->mDivNumber = mpDynamicsBlock->getDivNumber() * 2 + 1;
|
||||
work->mDivNumber = pDyn->getDivNumber() * 2 + 1;
|
||||
Mtx local_scl_mtx, local_rot_mtx, global_mtx;
|
||||
MTXScale(local_scl_mtx, work->mpEmtr->mLocalScl.x, work->mpEmtr->mLocalScl.y,
|
||||
work->mpEmtr->mLocalScl.z);
|
||||
|
||||
@@ -12,12 +12,35 @@
|
||||
#include "JSystem/JParticle/JPAResource.h"
|
||||
#include "JSystem/JParticle/JPAResourceManager.h"
|
||||
|
||||
static void dummy1() {
|
||||
JUT_WARN(0, "JPA : wrong version file %s\n");
|
||||
OS_REPORT("JPA : no jpa file\n");
|
||||
}
|
||||
|
||||
JPAResourceLoader::JPAResourceLoader(u8 const* data, JPAResourceManager* mgr) {
|
||||
if (*(u32*)(data + 4) == '2-10') {
|
||||
load_jpc(data, mgr);
|
||||
} else {
|
||||
JUT_WARN(48, "JPA : wrong version file\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void dummy2() {
|
||||
OS_REPORT("tex_num && \"a resource have to use one or more texture\"");
|
||||
OS_REPORT("p_res != 0");
|
||||
OS_REPORT("(p_res->ppFld != 0) || (p_res->fldNum == 0)");
|
||||
OS_REPORT("(p_res->ppKey != 0) || (p_res->keyNum == 0)");
|
||||
OS_REPORT("(p_res->texIdxTbl != 0) || (p_res->texNum == 0)");
|
||||
OS_REPORT("p_res->ppFld[fld_no] != 0");
|
||||
OS_REPORT("p_res->ppKey[key_no] != 0");
|
||||
OS_REPORT("p_res->pDyn != 0");
|
||||
OS_REPORT("p_res->pBsp != 0");
|
||||
OS_REPORT("p_res->pEsp != 0");
|
||||
OS_REPORT("p_res->pCsp != 0");
|
||||
OS_REPORT("p_res->pEts != 0");
|
||||
OS_REPORT("JPA : wrong type block in jpc file %x\n");
|
||||
}
|
||||
|
||||
struct JPAResourceHeader {
|
||||
/* 0x0 */ u16 mUsrIdx;
|
||||
/* 0x2 */ u16 mBlockNum;
|
||||
@@ -26,74 +49,89 @@ struct JPAResourceHeader {
|
||||
/* 0x6 */ u8 mTDB1Num;
|
||||
};
|
||||
|
||||
void JPAResourceLoader::load_jpc(u8 const* data, JPAResourceManager* mgr) {
|
||||
JKRHeap* heap = mgr->mpHeap;
|
||||
mgr->mResMax = *(u16*)(data + 8);
|
||||
mgr->mTexMax = *(u16*)(data + 0xA);
|
||||
mgr->mpResArr = new (heap, 0) JPAResource*[mgr->mResMax];
|
||||
mgr->mpTexArr = new (heap, 0) JPATexture*[mgr->mTexMax];
|
||||
void JPAResourceLoader::load_jpc(u8 const* data, JPAResourceManager* p_res_mgr) {
|
||||
JKRHeap* heap = p_res_mgr->mpHeap;
|
||||
p_res_mgr->resMaxNum = *(u16*)(data + 8);
|
||||
p_res_mgr->texMaxNum = *(u16*)(data + 0xA);
|
||||
p_res_mgr->pResAry = new (heap, 0) JPAResource*[p_res_mgr->resMaxNum];
|
||||
p_res_mgr->pTexAry = new (heap, 0) JPATexture*[p_res_mgr->texMaxNum];
|
||||
JUT_ASSERT(199, (p_res_mgr->pResAry != NULL) && (p_res_mgr->pTexAry != 0));
|
||||
|
||||
u32 offset = 0x10;
|
||||
for (int i = 0; i < *(u16*)(data + 8); i++) {
|
||||
JPAResourceHeader* header = (JPAResourceHeader*)(data + offset);
|
||||
JPAResource* res = new (heap, 0) JPAResource();
|
||||
res->mFieldBlockNum = header->mFieldBlockNum;
|
||||
res->mpFieldBlocks = res->mFieldBlockNum != 0 ?
|
||||
new (heap, 0) JPAFieldBlock*[res->mFieldBlockNum] : NULL;
|
||||
res->mKeyBlockNum = header->mKeyBlockNum;
|
||||
res->mpKeyBlocks = res->mKeyBlockNum != 0 ?
|
||||
new (heap, 0) JPAKeyBlock*[res->mKeyBlockNum] : NULL;
|
||||
res->mTDB1Num = header->mTDB1Num;
|
||||
res->mpTDB1 = NULL;
|
||||
res->mUsrIdx = header->mUsrIdx;
|
||||
JPAResource* p_res = new (heap, 0) JPAResource();
|
||||
JUT_ASSERT(211, p_res != NULL);
|
||||
p_res->fldNum = header->mFieldBlockNum;
|
||||
p_res->ppFld = p_res->fldNum != 0 ?
|
||||
new (heap, 0) JPAFieldBlock*[p_res->fldNum] : NULL;
|
||||
JUT_ASSERT(216, (p_res->ppFld != NULL) || (p_res->fldNum == 0));
|
||||
p_res->keyNum = header->mKeyBlockNum;
|
||||
p_res->ppKey = p_res->keyNum != 0 ?
|
||||
new (heap, 0) JPAKeyBlock*[p_res->keyNum] : NULL;
|
||||
JUT_ASSERT(221, (p_res->ppKey != NULL) || (p_res->keyNum == 0));
|
||||
p_res->texNum = header->mTDB1Num;
|
||||
p_res->mpTDB1 = NULL;
|
||||
p_res->mUsrIdx = header->mUsrIdx;
|
||||
|
||||
offset += 8;
|
||||
u32 field_idx = 0;
|
||||
u32 key_idx = 0;
|
||||
u32 fld_no = 0;
|
||||
u32 key_no = 0;
|
||||
|
||||
for (int j = 0; j < header->mBlockNum; j++) {
|
||||
u32 magic = *(u32*)(data + offset);
|
||||
u32 size = *(u32*)(data + offset + 4);
|
||||
switch (magic) {
|
||||
case 'FLD1':
|
||||
res->mpFieldBlocks[field_idx] = new (heap, 0) JPAFieldBlock(data + offset, heap);
|
||||
field_idx++;
|
||||
p_res->ppFld[fld_no] = new (heap, 0) JPAFieldBlock(data + offset, heap);
|
||||
JUT_ASSERT(244, p_res->ppFld[fld_no] != NULL);
|
||||
fld_no++;
|
||||
break;
|
||||
case 'KFA1':
|
||||
res->mpKeyBlocks[key_idx] = new (heap, 0) JPAKeyBlock(data + offset);
|
||||
key_idx++;
|
||||
p_res->ppKey[key_no] = new (heap, 0) JPAKeyBlock(data + offset);
|
||||
JUT_ASSERT(249, p_res->ppKey[key_no] != NULL);
|
||||
key_no++;
|
||||
break;
|
||||
case 'BEM1':
|
||||
res->mpDynamicsBlock = new (heap, 0) JPADynamicsBlock(data + offset);
|
||||
p_res->pDyn = new (heap, 0) JPADynamicsBlock(data + offset);
|
||||
JUT_ASSERT(254, p_res->pDyn != NULL);
|
||||
break;
|
||||
case 'BSP1':
|
||||
res->mpBaseShape = new (heap, 0) JPABaseShape(data + offset, heap);
|
||||
p_res->pBsp = new (heap, 0) JPABaseShape(data + offset, heap);
|
||||
JUT_ASSERT(258, p_res->pBsp != NULL);
|
||||
break;
|
||||
case 'ESP1':
|
||||
res->mpExtraShape = new (heap, 0) JPAExtraShape(data + offset);
|
||||
p_res->pEsp = new (heap, 0) JPAExtraShape(data + offset);
|
||||
JUT_ASSERT(262, p_res->pEsp != NULL);
|
||||
break;
|
||||
case 'SSP1':
|
||||
res->mpChildShape = new (heap, 0) JPAChildShape(data + offset);
|
||||
p_res->pCsp = new (heap, 0) JPAChildShape(data + offset);
|
||||
JUT_ASSERT(266, p_res->pCsp != NULL);
|
||||
break;
|
||||
case 'ETX1':
|
||||
res->mpExTexShape = new (heap, 0) JPAExTexShape(data + offset);
|
||||
p_res->pEts = new (heap, 0) JPAExTexShape(data + offset);
|
||||
JUT_ASSERT(270, p_res->pEts != NULL);
|
||||
break;
|
||||
case 'TDB1':
|
||||
res->mpTDB1 = (const u16*)(data + offset + 8);
|
||||
p_res->mpTDB1 = (const u16*)(data + offset + 8);
|
||||
break;
|
||||
default:
|
||||
JUT_WARN(275, "JPA : wrong type block in jpc file %d %x\n", header->mBlockNum, offset);
|
||||
break;
|
||||
}
|
||||
offset += size;
|
||||
}
|
||||
|
||||
res->init(heap);
|
||||
mgr->registRes(res);
|
||||
p_res->init(heap);
|
||||
p_res_mgr->registRes(p_res);
|
||||
}
|
||||
|
||||
offset = *(u32*)(data + 0xC);
|
||||
for (int i = 0; i < *(u16*)(data + 0xA); i++) {
|
||||
u32 size = *(u32*)(data + offset + 4);
|
||||
JPATexture* tex = new (heap, 0) JPATexture(data + offset);
|
||||
mgr->registTex(tex);
|
||||
JPATexture* p_tex = new (heap, 0) JPATexture(data + offset);
|
||||
JUT_ASSERT(298, p_tex != NULL);
|
||||
p_res_mgr->registTex(p_tex);
|
||||
offset += size;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,37 +9,39 @@ struct JPAResourceLoader {
|
||||
JPAResourceLoader(u8 const*, JPAResourceManager*);
|
||||
};
|
||||
|
||||
JPAResourceManager::JPAResourceManager(void const* pData, JKRHeap* pHeap) {
|
||||
mpResArr = NULL;
|
||||
mpTexArr = NULL;
|
||||
mResMax = 0;
|
||||
mResNum = 0;
|
||||
mTexMax = 0;
|
||||
mTexNum = 0;
|
||||
JPAResourceManager::JPAResourceManager(void const* p_jpc, JKRHeap* pHeap) {
|
||||
pResAry = NULL;
|
||||
pTexAry = NULL;
|
||||
resMaxNum = 0;
|
||||
resRegNum = 0;
|
||||
texMaxNum = 0;
|
||||
texRegNum = 0;
|
||||
mpHeap = pHeap;
|
||||
JPAResourceLoader loader((u8 const*)pData, this);
|
||||
JUT_ASSERT(49, (p_jpc != 0) && (pHeap != 0));
|
||||
JPAResourceLoader loader((u8 const*)p_jpc, this);
|
||||
}
|
||||
|
||||
JPAResource* JPAResourceManager::getResource(u16 usrIdx) const {
|
||||
for (u16 i = 0; i < mResNum; i++)
|
||||
if (mpResArr[i]->getUsrIdx() == usrIdx)
|
||||
return mpResArr[i];
|
||||
for (u16 i = 0; i < resRegNum; i++)
|
||||
if (pResAry[i]->getUsrIdx() == usrIdx)
|
||||
return pResAry[i];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool JPAResourceManager::checkUserIndexDuplication(u16 usrIdx) const {
|
||||
for (s32 i = 0; i < mResNum; i++)
|
||||
if (mpResArr[i]->getUsrIdx() == usrIdx)
|
||||
for (s32 i = 0; i < resRegNum; i++)
|
||||
if (pResAry[i]->getUsrIdx() == usrIdx)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
const ResTIMG* JPAResourceManager::swapTexture(ResTIMG const* img, char const* swapName) {
|
||||
const ResTIMG* ret = NULL;
|
||||
JUTTexture* tex = NULL;
|
||||
|
||||
for (s32 i = 0; i < mTexNum; i++) {
|
||||
if (strcmp(swapName, mpTexArr[i]->getName()) == 0) {
|
||||
JUTTexture* tex = mpTexArr[i]->getJUTTexture();
|
||||
for (s32 i = 0; i < texRegNum; i++) {
|
||||
if (strcmp(swapName, pTexAry[i]->getName()) == 0) {
|
||||
tex = pTexAry[i]->getJUTTexture();
|
||||
ret = tex->getTexInfo();
|
||||
tex->storeTIMG(img, (u8)0);
|
||||
break;
|
||||
@@ -50,13 +52,15 @@ const ResTIMG* JPAResourceManager::swapTexture(ResTIMG const* img, char const* s
|
||||
}
|
||||
|
||||
void JPAResourceManager::registRes(JPAResource* res) {
|
||||
mpResArr[mResNum] = res;
|
||||
mResNum++;
|
||||
JUT_ASSERT(151, resRegNum < resMaxNum);
|
||||
pResAry[resRegNum] = res;
|
||||
resRegNum++;
|
||||
}
|
||||
|
||||
void JPAResourceManager::registTex(JPATexture* tex) {
|
||||
mpTexArr[mTexNum] = tex;
|
||||
mTexNum++;
|
||||
JUT_ASSERT(166, texRegNum < texMaxNum);
|
||||
pTexAry[texRegNum] = tex;
|
||||
texRegNum++;
|
||||
}
|
||||
|
||||
u32 JPAResourceManager::getResUserWork(u16 usrIdx) const {
|
||||
|
||||
@@ -1907,7 +1907,7 @@ u16 dPa_control_c::setCommonPoly(u32* param_0, cBgS_PolyInfo* param_1, cXyz cons
|
||||
void dPa_wbPcallBack_c::execute(JPABaseEmitter* i_emitter, JPABaseParticle* param_1) {
|
||||
UNUSED(i_emitter);
|
||||
JGeometry::TVec3<f32> local_18;
|
||||
param_1->getGlobalPosition(local_18);
|
||||
param_1->getGlobalPosition(&local_18);
|
||||
cXyz cStack_24(local_18.x, local_18.y, local_18.z);
|
||||
if (fopAcM_wt_c::waterCheck(&cStack_24) && cStack_24.y > fopAcM_wt_c::getWaterY()) {
|
||||
param_1->setInvisibleParticleFlag();
|
||||
@@ -1992,7 +1992,7 @@ void dPa_light8PcallBack::draw(JPABaseEmitter* param_1, JPABaseParticle* param_2
|
||||
MTXRotAxisRad(auStack_90, &local_178, (M_PI / 180.0f) * fVar3);
|
||||
MTXConcat(local_60, auStack_90, local_60);
|
||||
}
|
||||
param_2->getGlobalPosition(local_100);
|
||||
param_2->getGlobalPosition(&local_100);
|
||||
local_60[0][3] = local_100.x;
|
||||
local_60[1][3] = local_100.y;
|
||||
local_60[2][3] = local_100.z;
|
||||
@@ -2078,7 +2078,7 @@ void dPa_gen_b_light8PcallBack::draw(JPABaseEmitter* param_1, JPABaseParticle* p
|
||||
JGeometry::TVec3<f32> local_e0;
|
||||
JGeometry::TVec3<f32> local_ec;
|
||||
JGeometry::TVec3<f32> local_f8;
|
||||
param_2->getGlobalPosition(local_8c);
|
||||
param_2->getGlobalPosition(&local_8c);
|
||||
MTXMultVec(j3dSys.getViewMtx(), &local_8c, &local_8c);
|
||||
f32 dVar9 = JMASSin(param_2->getRotateAngle());
|
||||
f32 dVar10 = JMASCos(param_2->getRotateAngle());
|
||||
@@ -2172,7 +2172,7 @@ void dPa_gen_d_light8PcallBack::draw(JPABaseEmitter* param_1, JPABaseParticle* p
|
||||
MTXIdentity(local_60);
|
||||
MTXIdentity(auStack_90);
|
||||
param_2->getBaseAxis(local_10c);
|
||||
param_2->getLocalPosition(local_118);
|
||||
param_2->getLocalPosition(&local_118);
|
||||
if (local_118.isZero()) {
|
||||
local_118.set(0.0f, 1.0f, 0.0f);
|
||||
} else {
|
||||
@@ -2201,7 +2201,7 @@ void dPa_gen_d_light8PcallBack::draw(JPABaseEmitter* param_1, JPABaseParticle* p
|
||||
MTXRotAxisRad(auStack_90, &local_178, (M_PI / 180.0f) * fVar3);
|
||||
MTXConcat(local_60, auStack_90, local_60);
|
||||
}
|
||||
param_2->getGlobalPosition(local_100);
|
||||
param_2->getGlobalPosition(&local_100);
|
||||
local_60[0][3] = local_100.x;
|
||||
local_60[1][3] = local_100.y;
|
||||
local_60[2][3] = local_100.z;
|
||||
|
||||
Reference in New Issue
Block a user