summaryrefslogtreecommitdiff
path: root/src/JSystem
diff options
context:
space:
mode:
Diffstat (limited to 'src/JSystem')
-rw-r--r--src/JSystem/JParticle/JPABaseShape.cpp77
-rw-r--r--src/JSystem/JParticle/JPADynamicsBlock.cpp18
-rw-r--r--src/JSystem/JParticle/JPAExTexShape.cpp4
-rw-r--r--src/JSystem/JParticle/JPAResource.cpp57
4 files changed, 101 insertions, 55 deletions
diff --git a/src/JSystem/JParticle/JPABaseShape.cpp b/src/JSystem/JParticle/JPABaseShape.cpp
index 48dd5951..6e600a1d 100644
--- a/src/JSystem/JParticle/JPABaseShape.cpp
+++ b/src/JSystem/JParticle/JPABaseShape.cpp
@@ -3,6 +3,7 @@
// Translation Unit: JPABaseShape
//
+#include "JSystem/JParticle/JPAExTexShape.h"
#include "egg/core/eggHeap.h"
#include "JSystem/JParticle/JPABaseShape.h"
#include "JSystem/JParticle/JPAParticle.h"
@@ -161,13 +162,11 @@ void JPACalcClrIdxNormal(JPAEmitterWorkData* work) {
* JPACalcClrIdxNormal__FP18JPAEmitterWorkDataP15JPABaseParticle */
void JPACalcClrIdxNormal(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
JPABaseShape* shape = work->mpRes->getBsp();
- s16 age = param_1->mAge;
- s16 maxFrm = shape->getClrAnmMaxFrm();
s16 keyFrame;
- if (age < maxFrm) {
- keyFrame = age;
+ if (param_1->mAge < shape->getClrAnmMaxFrm()) {
+ keyFrame = param_1->mAge;
} else {
- keyFrame = maxFrm;
+ keyFrame = shape->getClrAnmMaxFrm();
}
work->mClrKeyFrame = keyFrame;
}
@@ -183,8 +182,7 @@ void JPACalcClrIdxRepeat(JPAEmitterWorkData* work) {
* JPACalcClrIdxRepeat__FP18JPAEmitterWorkDataP15JPABaseParticle */
void JPACalcClrIdxRepeat(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
JPABaseShape* shape = work->mpRes->getBsp();
- s32 tick = shape->getClrLoopOfst(param_1->mAnmRandom);
- tick = param_1->mAge + tick;
+ s32 tick = param_1->mAge + shape->getClrLoopOfst(param_1->mAnmRandom);
work->mClrKeyFrame = tick % (shape->getClrAnmMaxFrm() + 1);
}
@@ -355,6 +353,10 @@ void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1)
GXLoadTexMtxImm(local_108, 0x1e, GX_MTX2x4);
}
+void fn_8031A8C0(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
+ work->mpRes->getEts()->fn_8031DE80(work->mpRes->getBsp(), ptcl->getAge());
+}
+
/* 802778EC-80277940 27222C 0054+00 0/0 1/1 0/0 .text JPALoadTex__FP18JPAEmitterWorkData
*/
void JPALoadTex(JPAEmitterWorkData* work) {
@@ -508,13 +510,13 @@ static void loadPrjAnm(JPAEmitterWorkData const* work, const Mtx srt) {
}
/* 803C42E0-803C4300 021400 0020+00 10/9 0/0 0/0 .data jpa_dl */
-static u8 jpa_dl[32] = {
+static u8 ALIGN_DECL(32) jpa_dl[32] = {
0x80, 0x00, 0x04, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 803C4300-803C4320 021420 0020+00 1/0 0/0 0/0 .data jpa_dl_x */
-static u8 jpa_dl_x[32] = {
+static u8 ALIGN_DECL(32) jpa_dl_x[32] = {
0x80, 0x00, 0x08, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x48, 0x00, 0x49, 0x01, 0x4A,
0x02, 0x4B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
@@ -616,8 +618,8 @@ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
if (param_1->checkStatus(8) == 0) {
EGG::Vector3f local_48;
MTXMultVec(work->mPosCamMtx, param_1->mPosition, local_48);
- f32 sinRot = nw4r::math::SinIdx((s16)param_1->mRotateAngle);
- f32 cosRot = nw4r::math::CosIdx((s16)param_1->mRotateAngle);
+ f32 sinRot = nw4r::math::SinIdx(param_1->mRotateAngle);
+ f32 cosRot = nw4r::math::CosIdx(param_1->mRotateAngle);
Mtx local_38;
f32 particleX = work->mGlobalPtclScl.x * param_1->mParticleScaleX;
f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY;
@@ -742,12 +744,15 @@ 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;
f32 fVar1;
- f32 f4;
f32 fVar2;
+ f32 f4;
+ f32 tmp;
+
f3 = 0.33333298563957214f * (1.0f - param_1);
- f4 = f3 + 0.5773500204086304f * param_0;
- fVar1 = f3 - 0.5773500204086304f * param_0;
+ tmp = 0.5773500204086304f * param_0;
+ f4 = f3 + tmp;
+ fVar1 = f3 - tmp;
fVar2 = f3 + param_1;
param_2[0][0] = fVar2;
param_2[0][1] = fVar1;
@@ -838,12 +843,12 @@ void JPADrawDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
EGG::Vector3f local_78;
p_direction[param_0->mDirType](param_0, param_1, &local_6c);
if (!local_6c.isZero()) {
- local_6c.normalize();
+ local_6c.normalise();
local_78 = param_1->mBaseAxis.cross(local_6c);
if (!local_78.isZero()) {
- local_78.normalize();
+ local_78.normalise();
param_1->mBaseAxis = local_6c.cross(local_78);
- param_1->mBaseAxis.normalize();
+ param_1->mBaseAxis.normalise();
Mtx local_60;
f32 fVar1 = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX;
f32 fVar2 = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY;
@@ -879,12 +884,12 @@ void JPADrawRotDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1)
EGG::Vector3f local_78;
p_direction[param_0->mDirType](param_0, param_1, &local_6c);
if (!local_6c.isZero()) {
- local_6c.normalize();
+ local_6c.normalise();
local_78 = param_1->mBaseAxis.cross(local_6c);
if (!local_78.isZero()) {
- local_78.normalize();
+ local_78.normalise();
param_1->mBaseAxis = local_6c.cross(local_78);
- param_1->mBaseAxis.normalize();
+ param_1->mBaseAxis.normalise();
f32 particleX = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX;
f32 particleY = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY;
Mtx auStack_80;
@@ -924,7 +929,7 @@ void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
param_0->mPosCamMtx[2][2]);
local_70 = local_70.cross(aTStack_7c);
if (!local_70.isZero()) {
- local_70.normalize();
+ local_70.normalise();
MTXMultVecSR(param_0->mPosCamMtx, local_70, local_70);
EGG::Vector3f local_88;
MTXMultVec(param_0->mPosCamMtx, param_1->mPosition, local_88);
@@ -1023,6 +1028,10 @@ JPANode<JPABaseParticle>* getPrev(JPANode<JPABaseParticle>* param_0) {
typedef JPANode<JPABaseParticle>* (*getNodeFunc)(JPANode<JPABaseParticle>*);
+void fn_8031C2C0(JPAEmitterWorkData* work) {
+ work->mpRes->getEts()->fn_8031DE80(work->mpRes->getBsp(), work->mpEmtr->getAge());
+}
+
/* 80279374-8027996C 273CB4 05F8+00 0/0 1/1 0/0 .text JPADrawStripe__FP18JPAEmitterWorkData */
void JPADrawStripe(JPAEmitterWorkData* param_0) {
JPABaseShape* shape = param_0->mpRes->getBsp();
@@ -1074,16 +1083,16 @@ void JPADrawStripe(JPAEmitterWorkData* param_0) {
if (local_f8.isZero()) {
local_f8.set(0.0f, 1.0f, 0.0f);
} else {
- local_f8.normalize();
+ local_f8.normalise();
}
local_104 = particle->mBaseAxis.cross(local_f8);
if (local_104.isZero()) {
local_104.set(1.0f, 0.0f, 0.0f);
} else {
- local_104.normalize();
+ local_104.normalise();
}
particle->mBaseAxis = local_f8.cross( local_104);
- particle->mBaseAxis.normalize();
+ particle->mBaseAxis.normalise();
local_c8[0][0] = local_104.x;
local_c8[0][1] = local_f8.x;
@@ -1164,16 +1173,16 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
if (local_c0.isZero()) {
local_c0.set(0.0f, 1.0f, 0.0f);
} else {
- local_c0.normalize();
+ local_c0.normalise();
}
local_cc = particle->mBaseAxis.cross(local_c0);
if (local_cc.isZero()) {
local_cc.set(1.0f, 0.0f, 0.0f);
} else {
- local_cc.normalize();
+ local_cc.normalise();
}
particle->mBaseAxis = local_c0.cross( local_cc);
- particle->mBaseAxis.normalize();
+ particle->mBaseAxis.normalise();
local_90[0][0] = local_cc.x;
local_90[0][1] = local_c0.x;
@@ -1214,16 +1223,16 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
if (local_c0.isZero()) {
local_c0.set(0.0f, 1.0f, 0.0f);
} else {
- local_c0.normalize();
+ local_c0.normalise();
}
local_cc = particle->mBaseAxis.cross(local_c0);
if (local_cc.isZero()) {
local_cc.set(1.0f, 0.0f, 0.0f);
} else {
- local_cc.normalize();
+ local_cc.normalise();
}
particle->mBaseAxis = local_c0.cross( local_cc);
- particle->mBaseAxis.normalize();
+ particle->mBaseAxis.normalise();
local_90[0][0] = local_cc.x;
local_90[0][1] = local_c0.x;
@@ -1290,10 +1299,10 @@ static void makeColorTable(GXColor** o_color_table, JPAClrAnmKeyData const* i_da
j++;
if (j < param_2) {
f32 base_step = 1.0f / (i_data[j].index - i_data[j - 1].index);
- r_step = base_step * ((f32)i_data[j].color.r - r);
- g_step = base_step * ((f32)i_data[j].color.g - g);
- b_step = base_step * ((f32)i_data[j].color.b - b);
- a_step = base_step * ((f32)i_data[j].color.a - a);
+ r_step = base_step * (i_data[j].color.r - r);
+ g_step = base_step * (i_data[j].color.g - g);
+ b_step = base_step * (i_data[j].color.b - b);
+ a_step = base_step * (i_data[j].color.a - a);
} else {
r_step = g_step = b_step = a_step = 0.0f;
}
diff --git a/src/JSystem/JParticle/JPADynamicsBlock.cpp b/src/JSystem/JParticle/JPADynamicsBlock.cpp
index 15b6f2f7..a037be31 100644
--- a/src/JSystem/JParticle/JPADynamicsBlock.cpp
+++ b/src/JSystem/JParticle/JPADynamicsBlock.cpp
@@ -102,8 +102,10 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) {
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
work->mVolumeCalcData.mVolumePos.set(rad * nw4r::math::CosIdx(phi) * nw4r::math::SinIdx(theta), -rad * nw4r::math::SinIdx(phi),
rad * nw4r::math::CosIdx(phi) * nw4r::math::CosIdx(theta));
- work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos;
- work->mVolumeCalcData.mVelOmni *= work->mGlobalScl;
+ work->mVolumeCalcData.mVelOmni.set(
+ work->mVolumeCalcData.mVolumePos.x * work->mGlobalScl.x,
+ work->mVolumeCalcData.mVolumePos.y * work->mGlobalScl.y, work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z
+ );
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
work->mVolumeCalcData.mVolumePos.z);
}
@@ -118,8 +120,10 @@ static void JPAVolumeCylinder(JPAEmitterWorkData* work) {
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
work->mVolumeCalcData.mVolumePos.set(
rad * nw4r::math::SinIdx(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * nw4r::math::CosIdx(theta));
- work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos;
- work->mVolumeCalcData.mVelOmni *= work->mGlobalScl;
+ work->mVolumeCalcData.mVelOmni.set(
+ work->mVolumeCalcData.mVolumePos.x * work->mGlobalScl.x,
+ work->mVolumeCalcData.mVolumePos.y * work->mGlobalScl.y, work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z
+ );
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
work->mVolumeCalcData.mVolumePos.z);
}
@@ -135,8 +139,10 @@ static void JPAVolumeTorus(JPAEmitterWorkData* work) {
work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * nw4r::math::SinIdx(theta),
work->mVolumeCalcData.mVelAxis.y,
work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * nw4r::math::CosIdx(theta));
- work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos;
- work->mVolumeCalcData.mVelOmni *= work->mGlobalScl;
+ work->mVolumeCalcData.mVelOmni.set(
+ work->mVolumeCalcData.mVolumePos.x * work->mGlobalScl.x,
+ work->mVolumeCalcData.mVolumePos.y * work->mGlobalScl.y, work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z
+ );
}
/* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */
diff --git a/src/JSystem/JParticle/JPAExTexShape.cpp b/src/JSystem/JParticle/JPAExTexShape.cpp
index 18b0a01e..74274c62 100644
--- a/src/JSystem/JParticle/JPAExTexShape.cpp
+++ b/src/JSystem/JParticle/JPAExTexShape.cpp
@@ -37,3 +37,7 @@ void JPALoadExTex(JPAEmitterWorkData* work) {
JPAExTexShape::JPAExTexShape(u8 const* data) {
mpData = (const JPAExTexShapeData*)data;
}
+
+void JPAExTexShape::fn_8031DE80(JPABaseShape* shp, f32) {
+ // TODO
+}
diff --git a/src/JSystem/JParticle/JPAResource.cpp b/src/JSystem/JParticle/JPAResource.cpp
index 50a891af..e2910181 100644
--- a/src/JSystem/JParticle/JPAResource.cpp
+++ b/src/JSystem/JParticle/JPAResource.cpp
@@ -79,8 +79,9 @@ static u8 jpa_crd[32] ALIGN_DECL(32) = {
/* 80274080-802755E8 26E9C0 1568+00 2/0 1/1 0/0 .text init__11JPAResourceFP7EGG::Heap */
void JPAResource::init(EGG::Heap* heap) {
- BOOL is_glbl_clr_anm = mpBaseShape->isGlblClrAnm();
- BOOL is_glbl_tex_anm = mpBaseShape->isGlblTexAnm();
+ // The s32s here are probably fake but fixes the regswaps
+ s32 is_glbl_clr_anm = mpBaseShape->isGlblClrAnm();
+ s32 is_glbl_tex_anm = mpBaseShape->isGlblTexAnm();
BOOL is_prm_anm = mpBaseShape->isPrmAnm();
BOOL is_env_anm = mpBaseShape->isEnvAnm();
BOOL is_tex_anm = mpBaseShape->isTexAnm();
@@ -354,6 +355,9 @@ void JPAResource::init(EGG::Heap* heap) {
if (is_draw_parent && base_type_5_6) {
mpDrawEmitterFuncListNum++;
+ if (mpExTexShape != NULL && mpExTexShape->isUseIndirect() && mpExTexShape->getfield_0x4C()) {
+ mpDrawEmitterFuncListNum++;
+ }
}
mpDrawEmitterFuncListNum++;
@@ -395,6 +399,10 @@ void JPAResource::init(EGG::Heap* heap) {
mpDrawEmitterFuncList[func_no] = &JPADrawStripeX;
func_no++;
}
+ if (mpExTexShape != NULL && mpExTexShape->isUseIndirect() && mpExTexShape->getfield_0x4C()) {
+ mpDrawEmitterFuncList[func_no] = &fn_8031C2C0;
+ func_no++;
+ }
}
mpDrawEmitterFuncList[func_no] = &JPADrawEmitterCallBackB;
@@ -473,8 +481,8 @@ void JPAResource::init(EGG::Heap* heap) {
mpDrawEmitterChildFuncListNum++;
}
- if (mpChildShape != NULL && !mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited()
- && !mpChildShape->isColorInherited()) {
+ if (mpChildShape != NULL && ((!mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited()
+ && !mpChildShape->isColorInherited()) || is_draw_child && child_type_5_6)) {
mpDrawEmitterChildFuncListNum++;
}
@@ -503,9 +511,12 @@ void JPAResource::init(EGG::Heap* heap) {
func_no++;
}
- if (mpChildShape != NULL && !mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited()
- && !mpChildShape->isColorInherited()) {
- mpDrawEmitterChildFuncList[func_no] = &JPARegistChildPrmEnv;
+ if (mpChildShape != NULL) {
+ if (!mpChildShape->isAlphaOutOn() && !mpChildShape->isAlphaInherited() && !mpChildShape->isColorInherited()) {
+ mpDrawEmitterChildFuncList[func_no] = &JPARegistChildPrmEnv;
+ } else if (is_draw_child && child_type_5_6) {
+ mpDrawEmitterChildFuncList[func_no] = &fn_8031DBA0;
+ }
}
if (is_draw_parent && !base_type_5_6) {
@@ -517,9 +528,16 @@ void JPAResource::init(EGG::Heap* heap) {
if (!is_glbl_tex_anm && is_tex_anm) {
mpDrawParticleFuncListNum++;
}
-
- if ((base_type_0_1 && is_enable_scale_anm) || (is_tex_crd_anm && !is_prj_tex)) {
+
+ if (base_type_0_1 && is_enable_scale_anm) {
mpDrawParticleFuncListNum++;
+ } else {
+ if (is_tex_crd_anm && !is_prj_tex) {
+ mpDrawParticleFuncListNum++;
+ }
+ if (mpExTexShape != NULL && mpExTexShape->isUseIndirect() && mpExTexShape->getfield_0x4C()) {
+ mpDrawParticleFuncListNum++;
+ }
}
if ((!is_glbl_clr_anm && (is_prm_anm || is_env_anm || is_enable_alpha_anm))
@@ -591,9 +609,16 @@ void JPAResource::init(EGG::Heap* heap) {
mpDrawParticleFuncList[func_no] = &JPASetLineWidth;
func_no++;
}
- } else if (is_tex_crd_anm && !is_prj_tex) {
- mpDrawParticleFuncList[func_no] = &JPALoadCalcTexCrdMtxAnm;
- func_no++;
+ } else {
+ if (is_tex_crd_anm && !is_prj_tex) {
+ mpDrawParticleFuncList[func_no] = &JPALoadCalcTexCrdMtxAnm;
+ func_no++;
+ }
+
+ if (mpExTexShape != NULL && mpExTexShape->isUseIndirect() && mpExTexShape->getfield_0x4C()) {
+ mpDrawParticleFuncList[func_no] = &fn_8031A8C0;
+ func_no++;
+ }
}
if (!is_glbl_clr_anm) {
@@ -997,7 +1022,7 @@ void JPAResource::setCTev(JPAEmitterWorkData* work) {
GXSetArray(GX_VA_POS, jpa_pos + pos_offset, 3);
GXSetArray(GX_VA_TEX0, jpa_crd, 2);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP1, GX_COLOR_NULL);
- GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C);
+ GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C, GX_FALSE, 0x7D);
GXSetTevDirect(GX_TEVSTAGE0);
GXSetNumTevStages(1);
GXSetNumIndStages(0);
@@ -1101,7 +1126,8 @@ void JPAResource::calcWorkData_c(JPAEmitterWorkData* work) {
MTXConcat(work->mRotationMtx, local_rot_mtx, work->mGlobalRot);
MTXConcat(work->mGlobalRot, local_scl_mtx, work->mGlobalSR);
work->mEmitterPos.set(work->mpEmtr->mLocalTrs);
- work->mGlobalScl *= work->mpEmtr->mLocalScl;
+ work->mGlobalScl.mul(work->mpEmtr->mGlobalScl, work->mpEmtr->mLocalScl);
+
JPAGetDirMtx(work->mpEmtr->mLocalDir, work->mDirectionMtx);
work->mPublicScale.set(work->mpEmtr->mGlobalScl);
MTXMultVec(global_mtx, work->mpEmtr->mLocalTrs, work->mGlobalPos);
@@ -1116,8 +1142,9 @@ void JPAResource::calcWorkData_d(JPAEmitterWorkData* work) {
MTXConcat(work->mpEmtr->mGlobalRot, mtx, work->mGlobalRot);
MTXMultVecSR(work->mGlobalRot, work->mpEmtr->mLocalDir, work->mGlobalEmtrDir);
}
-
+/*
#pragma push
#pragma force_active on
static u8 jpa_resource_padding[28] = {0};
#pragma pop
+*/