From 5c92991c515443fd3165d75684f543033042d64e Mon Sep 17 00:00:00 2001 From: Fexty12573 Date: Sat, 27 Jul 2024 18:21:17 +0200 Subject: [PATCH] fully decompile spl --- lib/spl/include/spl.h | 52 +- lib/spl/src/unk_0209C400.c | 359 +++++------- lib/spl/src/unk_0209CF00.c | 834 +++++++-------------------- lib/spl/src/unk_0209DD54.c | 1118 ++++++++++++++++++++++++++++++++++++ lib/spl/src/unk_020A05BC.c | 236 +++++++- lib/spl/src/unk_020A1E30.c | 3 +- lib/spl/src/unk_020A2354.c | 2 + 7 files changed, 1750 insertions(+), 854 deletions(-) create mode 100644 lib/spl/src/unk_0209DD54.c diff --git a/lib/spl/include/spl.h b/lib/spl/include/spl.h index 792005177c..b8edfd5d00 100644 --- a/lib/spl/include/spl.h +++ b/lib/spl/include/spl.h @@ -13,6 +13,10 @@ extern "C" { #define GX_RGB_G(RGB) (((RGB) >> GX_RGB_G_SHIFT) & 31) #define GX_RGB_B(RGB) (((RGB) >> GX_RGB_B_SHIFT) & 31) +#define GX_RGB_R_(rgb) (rgb & GX_RGB_R_MASK) +#define GX_RGB_G_(rgb) (rgb & GX_RGB_G_MASK) +#define GX_RGB_B_(rgb) (rgb & GX_RGB_B_MASK) + typedef void * (* UnkFuncPtr_0209CD00)(u32); typedef union { @@ -433,6 +437,29 @@ typedef struct SPLList { SPLNode* p_end; } SPLList; +typedef struct FieldFunc { + void(*func)(SPLParticle *, UnkSPLStruct4 *, int); + BOOL loop; +} FieldFunc; + +typedef struct FieldFunc8 { + void(*func)(SPLParticle *, UnkSPLStruct4 *, u8); + BOOL loop; +} FieldFunc8; + +typedef struct SPLArcHdr +{ + u32 id; + u32 ver; + u16 res_num; + u16 tex_num; + u32 reserved0; + u32 res_size; + u32 tex_size; + u32 tex_offset; + u32 reserved1; +} SPLArcHdr; + void SPL_0209C400(SPLManager * param0); void SPL_0209C444(SPLManager * param0, SPLEmitter * param1); SPLEmitter * SPL_0209C4D8(SPLManager * param0, int param1, void (* param2)(struct SPLEmitter_t *)); @@ -453,6 +480,23 @@ void SPL_020A20B8(const void * param0, SPLParticle * param1, VecFx32 * param2, s void SPL_020A213C(const void * param0, SPLParticle * param1, VecFx32 * param2, struct SPLEmitter_t * param3); void SPL_020A2204(const void * param0, SPLParticle * param1, VecFx32 * param2, struct SPLEmitter_t * param3); +void sub_020A1DA0(SPLParticle *ptcl, UnkSPLStruct4 *res, int lifeRate); // spl_scl_in_out +void sub_020A1BD4(SPLParticle *ptcl, UnkSPLStruct4 *res, int lifeRate); // spl_clr_in_out +void sub_020A1AF8(SPLParticle *ptcl, UnkSPLStruct4 *res, int lifeRate); // spl_alp_in_out +void sub_020A1A94(SPLParticle *ptcl, UnkSPLStruct4 *res, int lifeRate); // spl_tex_ptn_anm +void sub_020A1A48(SPLParticle *ptcl, UnkSPLStruct4 *res, int lifeRate); // spl_chld_scl_out +void sub_020A19F0(SPLParticle *ptcl, UnkSPLStruct4 *res, int lifeRate); // spl_chld_alp_out + +void sub_020A08DC(SPLEmitter *emtr, SPLList *list); +void sub_020A05BC(SPLParticle *ptcl, SPLEmitter *emtr, SPLList *list); + +void sub_020A1768(SPLEmitter *emtr); +void sub_020A1608(VecFx32 *ptclPos, VecFx32 *pos, SPLEmitter *emtr); + +void sub_020A2354(VecFx32 *vec); +void sub_020A23B0(VecFx32 *vec); + + void sub_0209D998(SPLEmitter *emtr, UnkSPLStruct4 *res, const VecFx32 *param2); void sub_0209CF00(SPLManager *mgr); void sub_0209D150(SPLManager *mgr, SPLEmitter *emtr); @@ -462,7 +506,7 @@ void sub_020A2304(SPLList *list, SPLNode *node); SPLNode *sub_020A2238(SPLList *list, SPLNode *node); u32 sub_0209CE90(u32 param0, BOOL param1); -u32 sub_0209CEB4(u32 param0, BOOL param1); +u32 sub_0209CEC8(u32 param0, BOOL param1); void sub_0209D064(SPLManager *mgr); void sub_0209CF7C(SPLManager *mgr); @@ -483,6 +527,12 @@ void sub_0209E1D4(SPLManager *mgr, SPLParticle *ptcl); // spl_draw_dpl void sub_0209DC68(UnkSPLStruct5 *tex); // spl_set_tex void sub_0209DC64(UnkSPLStruct5 *tex); // spl_set_tex_dummy +void sub_020A0358(fx32 sin, fx32 cos, MtxFx43 *mat); +void sub_020A0398(fx32 sin, fx32 cos, MtxFx43 *mat); + +void sub_020A0444(fx16 s, fx16 t, fx16 offsetX, fx16 offsetZ); +void sub_020A0500(fx16 s, fx16 t, fx16 offsetX, fx16 offsetY); + static inline void SPL_UnkInline1 (SPLEmitter * param0, const VecFx32 * param1) { param0->unk_98.x = param1->x + param0->p_res->unk_00->unk_04.x; diff --git a/lib/spl/src/unk_0209C400.c b/lib/spl/src/unk_0209C400.c index 4ffaafe6dc..3ee3b9f413 100644 --- a/lib/spl/src/unk_0209C400.c +++ b/lib/spl/src/unk_0209C400.c @@ -4,6 +4,8 @@ #include #include +#define DECODE_WH(X) ((u16)(1 << ((X) + 3))) + void SPL_0209C400(SPLManager *p0) { SPLEmitter *next; @@ -146,7 +148,7 @@ int SPL_0209C7E0(SPLManager *mgr) int SPL_0209C7F4(SPLManager *mgr) { - return SPL_0209C8BC(mgr, sub_0209CEB4); + return SPL_0209C8BC(mgr, sub_0209CEC8); } BOOL SPL_0209C808(SPLManager *mgr, u32 (*func)(u32, BOOL)) @@ -200,234 +202,135 @@ BOOL SPL_0209C8BC(SPLManager *mgr, u32 (*func)(u32, BOOL)) return TRUE; } -asm static void SPL_0209C988(SPLManager *mgr, void *spa) +void SPL_0209C988(SPLManager *mgr, const void *p_spa) { - stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x2c - mov sb, r1 - ldrh r1, [sb, #8] - mov sl, r0 - mov r8, #0x20 - strh r1, [sl, #0x30] - ldrh r0, [sb, #0xa] - strh r0, [sl, #0x32] - ldrh r0, [sl, #0x30] - ldr r1, [sl] - mov r0, r0, lsl #5 - blx r1 - str r0, [sl, #0x28] - ldrh r2, [sl, #0x30] - ldr r0, [sl, #0x28] - mov r1, #0 - mov r2, r2, lsl #5 - bl MI_CpuFill8 - ldrh r1, [sl, #0x30] - mov r0, #0 - str r0, [sp] - cmp r1, #0 - ble _0209CC28 - mov r6, r0 - str r0, [sp, #0x10] - str r0, [sp, #0x14] - str r0, [sp, #0x18] - str r0, [sp, #0x1c] - str r0, [sp, #0x20] - str r0, [sp, #0x24] -_0209CA04: - ldr r1, [sl, #0x28] - add r0, sb, r8 - str r0, [r1, r6] - ldr r0, [r1, r6] - add r8, r8, #0x58 - ldr r0, [r0, #0] - add r7, r1, r6 - str r0, [sp, #0x28] - mov r0, r0, lsl #0x17 - movs r0, r0, lsr #0x1f - addne r0, sb, r8 - strne r0, [r7, #4] - ldreq r0, [sp, #0x10] - addne r8, r8, #0xc - streq r0, [r7, #4] - ldr r0, [sp, #0x28] - mov r0, r0, lsl #0x16 - movs r0, r0, lsr #0x1f - addne r0, sb, r8 - strne r0, [r7, #8] - ldreq r0, [sp, #0x14] - addne r8, r8, #0xc - streq r0, [r7, #8] - ldr r0, [sp, #0x28] - mov r0, r0, lsl #0x15 - movs r0, r0, lsr #0x1f - addne r0, sb, r8 - strne r0, [r7, #0xc] - ldreq r0, [sp, #0x18] - addne r8, r8, #8 - streq r0, [r7, #0xc] - ldr r0, [sp, #0x28] - mov r0, r0, lsl #0x14 - movs r0, r0, lsr #0x1f - addne r0, sb, r8 - strne r0, [r7, #0x10] - ldreq r0, [sp, #0x1c] - addne r8, r8, #0xc - streq r0, [r7, #0x10] - ldr r0, [sp, #0x28] - mov r0, r0, lsl #0xf - movs r0, r0, lsr #0x1f - addne r0, sb, r8 - strne r0, [r7, #0x14] - ldreq r0, [sp, #0x20] - addne r8, r8, #0x14 - streq r0, [r7, #0x14] - ldr r0, [sp, #0x28] - mov r1, r0, lsl #7 - mov r2, r0, lsl #6 - mov r5, r1, lsr #0x1f - mov r4, r2, lsr #0x1f - add r1, r5, r2, lsr #31 - mov r2, r0, lsl #5 - add r1, r1, r2, lsr #31 - mov r3, r0, lsl #4 - mov fp, r2, lsr #0x1f - add r2, r1, r3, lsr #31 - mov r1, r3, lsr #0x1f - mov ip, r0, lsl #3 - str r1, [sp, #4] - mov r3, r0, lsl #2 - mov r0, ip, lsr #0x1f - add r1, r2, ip, lsr #31 - str r0, [sp, #8] - add r0, r1, r3, lsr #31 - strh r0, [r7, #0x1c] - mov r0, r3, lsr #0x1f - str r0, [sp, #0xc] - ldrh r0, [r7, #0x1c] - cmp r0, #0 - beq _0209CC04 - mov r0, r0, lsl #3 - ldr r1, [sl] - blx r1 - str r0, [r7, #0x18] - cmp r5, #0 - ldr r0, [r7, #0x18] - beq _0209CB58 - add r1, sb, r8 - str r1, [r0, #4] - ldr r1, _0209CCE8 - add r8, r8, #8 - str r1, [r0, #0] - add r0, r0, #8 -_0209CB58: - cmp r4, #0 - beq _0209CB78 - add r1, sb, r8 - str r1, [r0, #4] - ldr r1, _0209CCEC - add r8, r8, #8 - str r1, [r0, #0] - add r0, r0, #8 -_0209CB78: - cmp fp, #0 - beq _0209CB98 - add r1, sb, r8 - str r1, [r0, #4] - ldr r1, _0209CCF0 - add r8, r8, #0x10 - str r1, [r0, #0] - add r0, r0, #8 -_0209CB98: - ldr r1, [sp, #4] - cmp r1, #0 - beq _0209CBBC - add r1, sb, r8 - str r1, [r0, #4] - ldr r1, _0209CCF4 - add r8, r8, #4 - str r1, [r0, #0] - add r0, r0, #8 -_0209CBBC: - ldr r1, [sp, #8] - cmp r1, #0 - beq _0209CBE0 - add r1, sb, r8 - str r1, [r0, #4] - ldr r1, _0209CCF8 - add r8, r8, #8 - str r1, [r0, #0] - add r0, r0, #8 -_0209CBE0: - ldr r1, [sp, #0xc] - cmp r1, #0 - beq _0209CC0C - add r1, sb, r8 - str r1, [r0, #4] - ldr r1, _0209CCFC - add r8, r8, #0x10 - str r1, [r0, #0] - b _0209CC0C -_0209CC04: - ldr r0, [sp, #0x24] - str r0, [r7, #0x18] -_0209CC0C: - ldr r0, [sp] - ldrh r1, [sl, #0x30] - add r0, r0, #1 - add r6, r6, #0x20 - str r0, [sp] - cmp r0, r1 - blt _0209CA04 -_0209CC28: - ldrh r2, [sl, #0x32] - mov r0, #0x14 - ldr r1, [sl] - mul r0, r2, r0 - blx r1 - str r0, [sl, #0x2c] - ldrh r3, [sl, #0x32] - mov r1, #0x14 - ldr r0, [sl, #0x2c] - mul r2, r3, r1 - mov r1, #0 - bl MI_CpuFill8 - ldrh r0, [sl, #0x32] - mov r3, #0 - cmp r0, #0 - addle sp, sp, #0x2c - ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - bxle lr - mov r4, r3 - mov r0, #1 -_0209CC78: - ldr r2, [sl, #0x2c] - add r1, sb, r8 - str r1, [r2, r4] - ldr r5, [r1, #4] - add r2, r2, r4 - mov r5, r5, lsl #0x18 - mov r5, r5, lsr #0x1c - add r5, r5, #3 - mov r5, r0, lsl r5 - strh r5, [r2, #0x10] - ldr r5, [r1, #4] - add r3, r3, #1 - mov r5, r5, lsl #0x14 - mov r5, r5, lsr #0x1c - add r5, r5, #3 - mov r5, r0, lsl r5 - strh r5, [r2, #0x12] - ldr r5, [r1, #4] - add r4, r4, #0x14 - str r5, [r2, #0xc] - ldrh r2, [sl, #0x32] - ldr r1, [r1, #0x1c] - cmp r3, r2 - add r8, r8, r1 - blt _0209CC78 - add sp, sp, #0x2c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - bx lr + int i; + int offset; + SPLArcHdr *spa; + UnkSPLStruct4 *p_res; + UnkSPLUnion1 flag; + UnkStruct_020147B8 *fld; + UnkSPLStruct5 *p_tex; + UnkSPLStruct15 *p_tex_hdr; + + spa = (SPLArcHdr *)p_spa; + offset = sizeof(SPLArcHdr); + + mgr->unk_30 = spa->res_num; + mgr->unk_32 = spa->tex_num; + + mgr->unk_28 = mgr->unk_00(mgr->unk_30 * sizeof(UnkSPLStruct4)); + + MI_CpuFill8(mgr->unk_28, 0, mgr->unk_30 * sizeof(UnkSPLStruct4)); + + for (i = 0; i < mgr->unk_30; ++i) { + p_res = mgr->unk_28 + i; + p_res->unk_00 = (UnkSPLStruct9 *)((u8 *)spa + offset); + + offset += sizeof(UnkSPLStruct9); + flag = p_res->unk_00->unk_00; + + if (flag.unk_05_0) { // Has scaleAnim + p_res->unk_04 = (UnkSPLStruct10 *)((u8 *)spa + offset); + offset += sizeof(UnkSPLStruct10); + } else { + p_res->unk_04 = NULL; + } + + if (flag.unk_05_1) { // Has colorAnim + p_res->unk_08 = (UnkSPLStruct11 *)((u8 *)spa + offset); + offset += sizeof(UnkSPLStruct11); + } else { + p_res->unk_08 = NULL; + } + + if (flag.unk_05_2) { // Has alphaAnim + p_res->unk_0C = (UnkSPLStruct12 *)((u8 *)spa + offset); + offset += sizeof(UnkSPLStruct12); + } else { + p_res->unk_0C = NULL; + } + + if (flag.unk_05_3) { // Has texAnim + p_res->unk_10 = (UnkSPLStruct13 *)((u8 *)spa + offset); + offset += sizeof(UnkSPLStruct13); + } else { + p_res->unk_10 = NULL; + } + + if (flag.unk_06_0) { // Has child + p_res->unk_14 = (UnkSPLStruct14 *)((u8 *)spa + offset); + offset += sizeof(UnkSPLStruct14); + } else { + p_res->unk_14 = NULL; + } + + // Sum up all fields + p_res->unk_1C = flag.unk_07_0 + flag.unk_07_1 + flag.unk_07_2 + + flag.unk_07_3 + flag.unk_07_4 + flag.unk_07_5; + + if (p_res->unk_1C != 0) { + p_res->unk_18 = (UnkStruct_020147B8 *)mgr->unk_00(p_res->unk_1C * sizeof(UnkStruct_020147B8)); + fld = p_res->unk_18; + + if (flag.unk_07_0) { + fld->unk_04 = (const void *)((u8 *)spa + offset); + fld->unk_00 = SPL_020A2204; + offset += sizeof(SPLGravity); + fld++; + } + + if (flag.unk_07_1) { + fld->unk_04 = (const void *)((u8 *)spa + offset); + fld->unk_00 = SPL_020A213C; + offset += sizeof(SPLRandom); + fld++; + } + + if (flag.unk_07_2) { + fld->unk_04 = (const void *)((u8 *)spa + offset); + fld->unk_00 = SPL_020A20B8; + offset += sizeof(SPLMagnet); + fld++; + } + + if (flag.unk_07_3) { + fld->unk_04 = (const void *)((u8 *)spa + offset); + fld->unk_00 = SPL_020A1FE0; + offset += sizeof(SPLSpin); + fld++; + } + + if (flag.unk_07_4) { + fld->unk_04 = (const void *)((u8 *)spa + offset); + fld->unk_00 = SPL_020A1EC4; + offset += sizeof(SPLSimpleCollisionField); + fld++; + } + + if (flag.unk_07_5) { + fld->unk_04 = (void *)((u8 *)spa + offset); + fld->unk_00 = SPL_020A1E30; + offset += sizeof(SPLConvergence); + } + } else { + p_res->unk_18 = NULL; + } + } + + mgr->unk_2C = (UnkSPLStruct5 *)mgr->unk_00(mgr->unk_32 * sizeof(UnkSPLStruct5)); + + MI_CpuFill8(mgr->unk_2C, 0, mgr->unk_32 * sizeof(UnkSPLStruct5)); + + for (i = 0; i < mgr->unk_32; ++i) { + p_tex = &mgr->unk_2C[i]; + p_tex_hdr = (UnkSPLStruct15 *)((u8 *)spa + offset); + p_tex->unk_00 = p_tex_hdr; + p_tex->unk_10 = DECODE_WH(p_tex_hdr->unk_04.val2_00_4); + p_tex->unk_12 = DECODE_WH(p_tex_hdr->unk_04.val2_01_0); + p_tex->unk_0C = p_tex_hdr->unk_04; + offset += p_tex_hdr->unk_1C; + } } SPLManager *SPL_0209CD00(void *(*alloc)(u32), u16 max_emtr, u16 max_ptcl, u16 fixPolyID, u16 minPolyID, u16 maxPolyID) diff --git a/lib/spl/src/unk_0209CF00.c b/lib/spl/src/unk_0209CF00.c index 9c81f41469..5513064336 100644 --- a/lib/spl/src/unk_0209CF00.c +++ b/lib/spl/src/unk_0209CF00.c @@ -1,7 +1,9 @@ #include "spl.h" #include - +#include +#include +#include void sub_0209CF00(SPLManager *mgr) { @@ -87,565 +89,199 @@ void sub_0209D064(SPLManager *mgr) } } -asm void sub_0209D150(SPLManager *mgr, SPLEmitter *emtr) +void sub_0209D150(SPLManager *mgr, SPLEmitter *emtr) { - stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x74 - mov sb, r1 - ldr r8, [sb, #0x20] - mov sl, r0 - ldr r0, [r8, #0x14] - ldr r4, [r8] - str r0, [sp, #4] - ldr r0, [r4, #0] - mov r6, #0 - str r0, [sp, #0x24] - ldrb r0, [r4, #0x46] - ldr r2, [sb, #0x90] - ldrh r7, [r8, #0x1c] - add r0, r0, #0x180 - cmp r2, #0 - str r0, [sp, #8] - beq _0209D1A4 - mov r0, sb - mov r1, r6 - blx r2 -_0209D1A4: - ldrh r1, [r4, #0x3c] - cmp r1, #0 - beq _0209D1BC - ldrh r0, [sb, #0x4c] - cmp r0, r1 - bhs _0209D204 -_0209D1BC: - ldrh r0, [sb, #0x4c] - ldrb r1, [sb, #0x80] - bl _s32_div_f - cmp r1, #0 - bne _0209D204 - ldr r1, [sb, #0x24] - mov r0, r1, lsl #0x1f - movs r0, r0, lsr #0x1f - bne _0209D204 - mov r0, r1, lsl #0x1e - movs r0, r0, lsr #0x1f - bne _0209D204 - mov r0, r1, lsl #0x1b - movs r0, r0, lsr #0x1f - beq _0209D204 - mov r0, sb - add r1, sl, #0x1c - bl sub_020A08DC -_0209D204: - ldr r0, [sp, #0x24] - mov r0, r0, lsl #0x17 - movs r0, r0, lsr #0x1f - beq _0209D234 - ldr r0, _0209D980 // =sub_020A1DA0 - add r6, r6, #1 - str r0, [sp, #0x28] - ldr r0, [r8, #4] - ldrh r0, [r0, #8] - mov r0, r0, lsl #0x1f - mov r0, r0, lsr #0x1f - str r0, [sp, #0x2c] -_0209D234: - ldr r0, [sp, #0x24] - mov r0, r0, lsl #0x16 - movs r0, r0, lsr #0x1f - beq _0209D280 - ldr r3, [r8, #8] - ldrh r0, [r3, #8] - mov r0, r0, lsl #0x1f - movs r0, r0, lsr #0x1f - bne _0209D280 - ldr r2, _0209D984 // =sub_020A1BD4 - add r1, sp, #0x28 - str r2, [r1, r6, lsl #3] - ldrh r1, [r3, #8] - mov r2, r6, lsl #3 - add r0, sp, #0x2c - mov r1, r1, lsl #0x1e - mov r1, r1, lsr #0x1f - add r6, r6, #1 - str r1, [r0, r2] -_0209D280: - ldr r0, [sp, #0x24] - mov r0, r0, lsl #0x15 - movs r0, r0, lsr #0x1f - beq _0209D2BC - ldr r2, _0209D988 // =sub_020A1AF8 - add r1, sp, #0x28 - str r2, [r1, r6, lsl #3] - ldr r1, [r8, #0xc] - mov r2, r6, lsl #3 - ldrh r1, [r1, #2] - add r0, sp, #0x2c - add r6, r6, #1 - mov r1, r1, lsl #0x17 - mov r1, r1, lsr #0x1f - str r1, [r0, r2] -_0209D2BC: - ldr r0, [sp, #0x24] - mov r0, r0, lsl #0x14 - movs r0, r0, lsr #0x1f - beq _0209D304 - ldr r3, [r8, #0x10] - ldr r0, [r3, #8] - mov r0, r0, lsl #0xf - movs r0, r0, lsr #0x1f - bne _0209D304 - ldr r2, _0209D98C // =sub_020A1A94 - add r1, sp, #0x28 - str r2, [r1, r6, lsl #3] - ldr r1, [r3, #8] - add r0, sp, #0x2c - mov r1, r1, lsl #0xe - mov r1, r1, lsr #0x1f - str r1, [r0, r6, lsl #3] - add r6, r6, #1 -_0209D304: - ldr r4, [sb, #8] - cmp r4, #0 - beq _0209D640 - ldr r0, [sp, #0x24] - add fp, sp, #0x28 - mov r2, r0, lsl #0x10 - mov r1, r0, lsl #0xf - mov r0, r2, lsr #0x1f - str r0, [sp, #0xc] - mov r0, r1, lsr #0x1f - str r0, [sp, #0x10] - mov r0, #0 - str r0, [sp, #0x18] -_0209D338: - ldr r0, [r4, #0] - ldrh r1, [r4, #0x2a] - str r0, [sp] - ldrh r0, [r4, #0x26] - cmp r6, #0 - ldr r5, [sp, #0x18] - mul r2, r1, r0 - mov r1, r2, asr #8 - strb r1, [sp, #0x20] - ldrh r1, [r4, #0x28] - ldrb r2, [r4, #0x2d] - mul r0, r1, r0 - add r0, r2, r0, asr #8 - strb r0, [sp, #0x21] - ble _0209D3A0 -_0209D374: - add r2, fp, r5, lsl #3 - ldr ip, [r2, #4] - add r2, sp, #0x20 - ldrb r2, [r2, ip] - ldr r3, [fp, r5, lsl #3] - mov r0, r4 - mov r1, r8 - blx r3 - add r5, r5, #1 - cmp r5, r6 - blt _0209D374 -_0209D3A0: - ldr r0, [sp, #0x18] - ldr r5, [sp, #0x18] - str r0, [sp, #0x70] - str r0, [sp, #0x6c] - str r0, [sp, #0x68] - ldr r0, [sp, #0xc] - cmp r0, #0 - addne r0, sb, #0x28 - addne r3, r4, #0x38 - ldmneia r0, {r0, r1, r2} - stmneia r3, {r0, r1, r2} - cmp r7, #0 - ble _0209D400 -_0209D3D4: - ldr r2, [r8, #0x18] - mov r1, r4 - add r0, r2, r5, lsl #3 - ldr ip, [r2, r5, lsl #3] - ldr r0, [r0, #4] - add r2, sp, #0x68 - mov r3, sb - blx ip - add r5, r5, #1 - cmp r5, r7 - blt _0209D3D4 -_0209D400: - ldr r0, [sp, #0x10] - ldrh r1, [r4, #0x20] - cmp r0, #0 - ldrsh r0, [r4, #0x22] - add r0, r1, r0 - strh r0, [r4, #0x20] - ldr r1, [r4, #0x14] - ldr r0, [sp, #8] - mul r0, r1, r0 - mov r0, r0, asr #9 - str r0, [r4, #0x14] - ldr r1, [r4, #0x18] - ldr r0, [sp, #8] - mul r0, r1, r0 - mov r0, r0, asr #9 - str r0, [r4, #0x18] - ldr r1, [r4, #0x1c] - ldr r0, [sp, #8] - mul r0, r1, r0 - mov r0, r0, asr #9 - str r0, [r4, #0x1c] - ldr r1, [r4, #0x14] - ldr r0, [sp, #0x68] - add r0, r1, r0 - str r0, [r4, #0x14] - ldr r1, [r4, #0x18] - ldr r0, [sp, #0x6c] - add r0, r1, r0 - str r0, [r4, #0x18] - ldr r1, [r4, #0x1c] - ldr r0, [sp, #0x70] - add r0, r1, r0 - str r0, [r4, #0x1c] - ldr r1, [r4, #0x14] - ldr r0, [sb, #0x34] - ldr r2, [r4, #8] - add r0, r1, r0 - add r0, r2, r0 - str r0, [r4, #8] - ldr r1, [r4, #0x18] - ldr r0, [sb, #0x38] - ldr r2, [r4, #0xc] - add r0, r1, r0 - add r0, r2, r0 - str r0, [r4, #0xc] - ldr r1, [r4, #0x1c] - ldr r0, [sb, #0x3c] - ldr r2, [r4, #0x10] - add r0, r1, r0 - add r0, r2, r0 - str r0, [r4, #0x10] - beq _0209D538 - ldr r0, [sp, #4] - ldrh r2, [r4, #0x24] - ldrb r1, [r0, #0xd] - ldrh r3, [r4, #0x26] - mov r2, r2, lsl #0xc - mov r1, r1, lsl #0xc - mov r0, r3, lsl #0xc - smull r5, r3, r2, r1 - mov r1, #0x800 - adds r2, r5, r1 - adc r1, r3, #0 - mov r2, r2, lsr #0xc - orr r2, r2, r1, lsl #20 - mov r1, r2, asr #8 - subs r0, r0, r1 - bmi _0209D538 - ldr r1, [sp, #4] - mov r0, r0, asr #0xc - ldrb r1, [r1, #0xe] - bl _s32_div_f - cmp r1, #0 - bne _0209D538 - mov r0, r4 - mov r1, sb - add r2, sl, #0x1c - bl sub_020A05BC -_0209D538: - ldr r0, [sb, #0x20] - ldr r0, [r0, #0] - ldr r0, [r0, #0] - mov r0, r0, lsl #1 - movs r0, r0, lsr #0x1f - beq _0209D57C - ldrh r0, [r4, #0x2e] - ldr r1, [sl, #0x38] - bic r0, r0, #0xfc00 - mov r1, r1, lsl #8 - mov r1, r1, lsr #0x1a - mov r1, r1, lsl #0x10 - mov r1, r1, lsr #0x10 - and r1, r1, #0x3f - orr r0, r0, r1, lsl #10 - strh r0, [r4, #0x2e] - b _0209D5FC -_0209D57C: - ldrh r0, [r4, #0x2e] - ldr r2, [sl, #0x38] - add r1, sl, #0x38 - bic r0, r0, #0xfc00 - mov r2, r2, lsl #0xe - mov r2, r2, lsr #0x1a - mov r2, r2, lsl #0x10 - mov r2, r2, lsr #0x10 - and r2, r2, #0x3f - orr r0, r0, r2, lsl #10 - strh r0, [r4, #0x2e] - ldr r2, [sl, #0x38] - bic r0, r2, #0x3f000 - mov r2, r2, lsl #0xe - mov r2, r2, lsr #0x1a - add r2, r2, #1 - and r2, r2, #0x3f - orr r0, r0, r2, lsl #12 - str r0, [sl, #0x38] - ldr r2, [sl, #0x38] - mov r0, r2, lsl #0xe - mov r3, r0, lsr #0x1a - mov r0, r2, lsl #0x14 - cmp r3, r0, lsr #26 - bls _0209D5FC - mov r0, r2, lsl #0x1a - mov r0, r0, lsr #0x1a - and r0, r0, #0x3f - ldr r2, [r1, #0] - bic r2, r2, #0x3f000 - orr r0, r2, r0, lsl #12 - str r0, [r1, #0] -_0209D5FC: - ldrh r0, [r4, #0x26] - add r0, r0, #1 - strh r0, [r4, #0x26] - ldrh r1, [r4, #0x26] - ldrh r0, [r4, #0x24] - cmp r1, r0 - bls _0209D630 - mov r1, r4 - add r0, sb, #8 - bl sub_020A2238 - mov r1, r0 - add r0, sl, #0x1c - bl sub_020A2304 -_0209D630: - ldr r0, [sp] - cmp r0, #0 - mov r4, r0 - bne _0209D338 -_0209D640: - ldr r0, [sp, #0x24] - mov r0, r0, lsl #0xf - movs r0, r0, lsr #0x1f - beq _0209D948 - ldr r0, [sp, #4] - mov r6, #0 - ldrh r0, [r0] - mov r0, r0, lsl #0x1e - movs r0, r0, lsr #0x1f - ldrne r0, _0209D990 // =sub_020A1A48 - strne r6, [sp, #0x4c] - strne r0, [sp, #0x48] - ldr r0, [sp, #4] - addne r6, r6, #1 - ldrh r0, [r0] - mov r0, r0, lsl #0x1d - movs r0, r0, lsr #0x1f - beq _0209D6A4 - ldr r2, _0209D994 // =sub_020A19F0 - add r1, sp, #0x48 - str r2, [r1, r6, lsl #3] - add r0, sp, #0x4c - mov r1, #0 - str r1, [r0, r6, lsl #3] - add r6, r6, #1 -_0209D6A4: - ldr r0, [sp, #4] - ldr r5, [sb, #0x14] - ldrh r0, [r0] - mov r0, r0, lsl #0x1f - movs r0, r0, lsr #0x1f - moveq r7, #0 - cmp r5, #0 - beq _0209D948 - mov r0, #0 - str r0, [sp, #0x1c] -_0209D6CC: - ldrh r2, [r5, #0x26] - ldr r0, [r5, #0] - ldrh r1, [r5, #0x24] - str r0, [sp, #0x14] - mov r0, r2, lsl #8 - bl _s32_div_f - ldr r4, [sp, #0x1c] - strb r0, [sp, #0x20] - cmp r6, #0 - ble _0209D71C - ldrb fp, [sp, #0x20] -_0209D6F8: - add r3, sp, #0x48 - ldr r3, [r3, r4, lsl #3] - mov r0, r5 - mov r1, r8 - mov r2, fp - blx r3 - add r4, r4, #1 - cmp r4, r6 - blt _0209D6F8 -_0209D71C: - ldr r0, [sp, #0x1c] - ldr r4, [sp, #0x1c] - str r0, [sp, #0x70] - str r0, [sp, #0x6c] - str r0, [sp, #0x68] - ldr r0, [sp, #4] - ldrh r0, [r0] - mov r0, r0, lsl #0x1a - movs r0, r0, lsr #0x1f - addne r0, sb, #0x28 - addne r3, r5, #0x38 - ldmneia r0, {r0, r1, r2} - stmneia r3, {r0, r1, r2} - cmp r7, #0 - ble _0209D784 -_0209D758: - ldr r2, [r8, #0x18] - mov r1, r5 - add r0, r2, r4, lsl #3 - ldr fp, [r2, r4, lsl #3] - ldr r0, [r0, #4] - add r2, sp, #0x68 - mov r3, sb - blx fp - add r4, r4, #1 - cmp r4, r7 - blt _0209D758 -_0209D784: - ldrh r1, [r5, #0x20] - ldrsh r0, [r5, #0x22] - add r0, r1, r0 - strh r0, [r5, #0x20] - ldr r1, [r5, #0x14] - ldr r0, [sp, #8] - mul r0, r1, r0 - mov r0, r0, asr #9 - str r0, [r5, #0x14] - ldr r1, [r5, #0x18] - ldr r0, [sp, #8] - mul r0, r1, r0 - mov r0, r0, asr #9 - str r0, [r5, #0x18] - ldr r1, [r5, #0x1c] - ldr r0, [sp, #8] - mul r0, r1, r0 - mov r0, r0, asr #9 - str r0, [r5, #0x1c] - ldr r1, [r5, #0x14] - ldr r0, [sp, #0x68] - add r0, r1, r0 - str r0, [r5, #0x14] - ldr r1, [r5, #0x18] - ldr r0, [sp, #0x6c] - add r0, r1, r0 - str r0, [r5, #0x18] - ldr r1, [r5, #0x1c] - ldr r0, [sp, #0x70] - add r0, r1, r0 - str r0, [r5, #0x1c] - ldr r1, [r5, #0x14] - ldr r0, [sb, #0x34] - ldr r2, [r5, #8] - add r0, r1, r0 - add r0, r2, r0 - str r0, [r5, #8] - ldr r1, [r5, #0x18] - ldr r0, [sb, #0x38] - ldr r2, [r5, #0xc] - add r0, r1, r0 - add r0, r2, r0 - str r0, [r5, #0xc] - ldr r1, [r5, #0x1c] - ldr r0, [sb, #0x3c] - ldr r2, [r5, #0x10] - add r0, r1, r0 - add r0, r2, r0 - str r0, [r5, #0x10] - ldr r0, [sb, #0x20] - ldr r0, [r0, #0] - ldr r0, [r0, #0] - movs r0, r0, lsr #0x1f - beq _0209D888 - ldr r0, [sl, #0x38] - ldrh r1, [r5, #0x2e] - mov r0, r0, lsl #8 - mov r0, r0, lsr #0x1a - bic r1, r1, #0xfc00 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - and r0, r0, #0x3f - orr r0, r1, r0, lsl #10 - strh r0, [r5, #0x2e] - b _0209D908 -_0209D888: - ldr r0, [sl, #0x38] - ldrh r1, [r5, #0x2e] - mov r0, r0, lsl #0xe - mov r0, r0, lsr #0x1a - bic r1, r1, #0xfc00 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - and r0, r0, #0x3f - orr r0, r1, r0, lsl #10 - strh r0, [r5, #0x2e] - ldr r1, [sl, #0x38] - add r0, sl, #0x38 - bic r2, r1, #0x3f000 - mov r1, r1, lsl #0xe - mov r1, r1, lsr #0x1a - add r1, r1, #1 - and r1, r1, #0x3f - orr r1, r2, r1, lsl #12 - str r1, [sl, #0x38] - ldr r2, [sl, #0x38] - mov r1, r2, lsl #0xe - mov r3, r1, lsr #0x1a - mov r1, r2, lsl #0x14 - cmp r3, r1, lsr #26 - bls _0209D908 - mov r1, r2, lsl #0x1a - mov r1, r1, lsr #0x1a - and r1, r1, #0x3f - ldr r2, [r0, #0] - bic r2, r2, #0x3f000 - orr r1, r2, r1, lsl #12 - str r1, [r0, #0] -_0209D908: - ldrh r0, [r5, #0x26] - add r0, r0, #1 - strh r0, [r5, #0x26] - ldrh r1, [r5, #0x26] - ldrh r0, [r5, #0x24] - cmp r1, r0 - bls _0209D93C - mov r1, r5 - add r0, sb, #0x14 - bl sub_020A2238 - mov r1, r0 - add r0, sl, #0x1c - bl sub_020A2304 -_0209D93C: - ldr r5, [sp, #0x14] - movs r0, r5 - bne _0209D6CC -_0209D948: - ldrh r0, [sb, #0x4c] - add r0, r0, #1 - strh r0, [sb, #0x4c] - ldr r2, [sb, #0x90] - cmp r2, #0 - addeq sp, sp, #0x74 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - bxeq lr - mov r0, sb - mov r1, #1 - blx r2 - add sp, sp, #0x74 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - bx lr -_0209D980: .word sub_020A1DA0 -_0209D984: .word sub_020A1BD4 -_0209D988: .word sub_020A1AF8 -_0209D98C: .word sub_020A1A94 -_0209D990: .word sub_020A1A48 -_0209D994: .word sub_020A19F0 + SPLParticle *ptcl; + SPLParticle *next; + UnkSPLStruct4 *res; + UnkSPLStruct9 *resBase; + UnkSPLStruct14 *child; + UnkSPLUnion1 resFlags; + FieldFunc fieldFuncs[4]; + FieldFunc fieldFuncs2[4]; + int i, fieldIndex, fldNum; + int airResistance; + u8 lifeRates[2]; + VecFx32 vec; + int idx; + + res = emtr->p_res; + child = res->unk_14; + fieldIndex = 0; + resBase = res->unk_00; + resFlags = resBase->unk_00; + fldNum = res->unk_1C; + airResistance = resBase->unk_48.unk_02_0 + 0x180; + + if (emtr->unk_100) { + emtr->unk_100(emtr, FALSE); + } + + if (resBase->unk_3C == 0 || emtr->unk_BC < resBase->unk_3C) { + if (emtr->unk_BC % emtr->unk_F0.unk_00_0 == 0) { + if (!emtr->unk_94.terminate && !emtr->unk_94.stop_generate && emtr->unk_94.started) { + sub_020A08DC(emtr, (SPLList *)(&mgr->unk_1C)); + } + } + } + + if (resFlags.unk_05_0) { // ScaleAnim + fieldFuncs[fieldIndex].func = sub_020A1DA0; + fieldFuncs[fieldIndex++].loop = res->unk_04->unk_08.unk_00_0; + } + + if (resFlags.unk_05_1 && !res->unk_08->unk_08.unk_00_0) { // ColorAnim + fieldFuncs[fieldIndex].func = sub_020A1BD4; + fieldFuncs[fieldIndex++].loop = res->unk_08->unk_08.unk_00_1; + } + + if (resFlags.unk_05_2) { // AlphaAnim + fieldFuncs[fieldIndex].func = sub_020A1AF8; + fieldFuncs[fieldIndex++].loop = res->unk_0C->unk_02.unk_01_0; + } + + if (resFlags.unk_05_3 && !res->unk_10->unk_08.unk_02_0) { // TexAnim + fieldFuncs[fieldIndex].func = sub_020A1A94; + fieldFuncs[fieldIndex++].loop = res->unk_10->unk_08.unk_02_1; + } + + + for (ptcl = emtr->unk_08.unk_00; ptcl != NULL; ptcl = next) { + next = ptcl->unk_00; + lifeRates[0] = ptcl->unk_2A * ptcl->unk_26 >> 8; + lifeRates[1] = ptcl->unk_2C.unk_01 + (ptcl->unk_28 * ptcl->unk_26 >> 8); + + for (i = 0; i < fieldIndex; i++) { + fieldFuncs[i].func(ptcl, res, lifeRates[fieldFuncs[i].loop]); + } + + vec.x = vec.y = vec.z = 0; + + if (resFlags.unk_05_7) { + ptcl->unk_38 = emtr->unk_98; + } + + for (i = 0; i < fldNum; i++) { + res->unk_18[i].unk_00(res->unk_18[i].unk_04, ptcl, &vec, emtr); + } + + ptcl->unk_20 += ptcl->unk_22; + + ptcl->unk_14.x = (ptcl->unk_14.x * airResistance >> 9); + ptcl->unk_14.y = (ptcl->unk_14.y * airResistance >> 9); + ptcl->unk_14.z = (ptcl->unk_14.z * airResistance >> 9); + + ptcl->unk_14.x += vec.x; + ptcl->unk_14.y += vec.y; + ptcl->unk_14.z += vec.z; + + ptcl->unk_08.x += ptcl->unk_14.x + emtr->unk_A4.x; + ptcl->unk_08.y += ptcl->unk_14.y + emtr->unk_A4.y; + ptcl->unk_08.z += ptcl->unk_14.z + emtr->unk_A4.z; + + if (resFlags.unk_06_0) { + fx32 x = FX_MUL((fx32)ptcl->unk_24 << FX32_SHIFT, (fx32)child->unk_0C.unk_01_0 << FX32_SHIFT); + fx32 a = (fx32)ptcl->unk_26 * FX32_ONE; + fx32 diff = a - (x >> 8); + + if (diff >= 0) { + if ((diff >> FX32_SHIFT) % child->unk_0C.unk_02_0 == 0) { + sub_020A05BC(ptcl, emtr, (SPLList *)&mgr->unk_1C); + } + } + } + + if (emtr->p_res->unk_00->unk_00.unk_07_6) { + ptcl->unk_2E.unk_01_2 = mgr->unk_38.unk_02_2; + } else { + ptcl->unk_2E.unk_01_2 = mgr->unk_38.unk_01_4; + mgr->unk_38.unk_01_4 += 1; + + if (mgr->unk_38.unk_01_4 > mgr->unk_38.unk_00_6) { + mgr->unk_38.unk_01_4 = mgr->unk_38.unk_00_0; + } + } + + ptcl->unk_26 += 1; + + if (ptcl->unk_26 > ptcl->unk_24) { + SPLNode *node = sub_020A2238((SPLList *)(&emtr->unk_08), (SPLNode *)ptcl); + sub_020A2304((SPLList *)&mgr->unk_1C, node); + } + } + + if (resFlags.unk_06_0) { + fieldIndex = 0; + if (child->unk_00.unk_02_1) { + fieldFuncs2[fieldIndex].func = sub_020A1A48; + fieldFuncs2[fieldIndex++].loop = FALSE; + } + + if (child->unk_00.unk_02_2) { + fieldFuncs2[fieldIndex].func = sub_020A19F0; + fieldFuncs2[fieldIndex++].loop = FALSE; + } + + if (!child->unk_00.unk_02_0) { + fldNum = 0; + } + + for (ptcl = emtr->unk_4C.unk_00; ptcl != NULL; ptcl = next) { + next = ptcl->unk_00; + lifeRates[0] = (ptcl->unk_26 << 8) / ptcl->unk_24; + for (i = 0; i < fieldIndex; i++) { + u8 lifeRate = lifeRates[0]; + fieldFuncs2[i].func(ptcl, res, lifeRate); + } + + vec.x = vec.y = vec.z = 0; + + if (child->unk_00.unk_02_5) { + ptcl->unk_38 = emtr->unk_98; + } + + for (i = 0; i < fldNum; i++) { + res->unk_18[i].unk_00(res->unk_18[i].unk_04, ptcl, &vec, emtr); + } + + ptcl->unk_20 += ptcl->unk_22; + + ptcl->unk_14.x = ptcl->unk_14.x * airResistance >> 9; + ptcl->unk_14.y = ptcl->unk_14.y * airResistance >> 9; + ptcl->unk_14.z = ptcl->unk_14.z * airResistance >> 9; + + ptcl->unk_14.x += vec.x; + ptcl->unk_14.y += vec.y; + ptcl->unk_14.z += vec.z; + + ptcl->unk_08.x += ptcl->unk_14.x + emtr->unk_A4.x; + ptcl->unk_08.y += ptcl->unk_14.y + emtr->unk_A4.y; + ptcl->unk_08.z += ptcl->unk_14.z + emtr->unk_A4.z; + + if (emtr->p_res->unk_00->unk_00.unk_07_7) { + ptcl->unk_2E.unk_01_2 = mgr->unk_38.unk_02_2; + } else { + ptcl->unk_2E.unk_01_2 = mgr->unk_38.unk_01_4; + mgr->unk_38.unk_01_4 += 1; + + if (mgr->unk_38.unk_01_4 > mgr->unk_38.unk_00_6) { + mgr->unk_38.unk_01_4 = mgr->unk_38.unk_00_0; + } + } + + ptcl->unk_26 += 1; + + if (ptcl->unk_26 > ptcl->unk_24) { + sub_020A2304((SPLList *)&mgr->unk_1C, sub_020A2238((SPLList *)(&emtr->unk_4C), (SPLNode *)ptcl)); + } + } + } + + emtr->unk_BC += 1; + + if (emtr->unk_100) { + emtr->unk_100(emtr, TRUE); + } } void sub_0209D998(SPLEmitter *emtr, UnkSPLStruct4 *res, const VecFx32 *pos) @@ -715,66 +351,24 @@ void sub_0209D998(SPLEmitter *emtr, UnkSPLStruct4 *res, const VecFx32 *pos) void sub_0209DC64(UnkSPLStruct5 *tex) { } -asm void sub_0209DC68(UnkSPLStruct5 *tex) +void sub_0209DC68(UnkSPLStruct5 *tex) { - stmfd sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - ldr r7, [r0, #0xc] - ldr r3, _0209DD40 // =0x040004A8 - str r7, [sp] - ldr r1, [r0, #4] - mov r2, r7, lsl #0x1c - mov lr, r2, lsr #0x1c - mov r1, r1, lsr #3 - orr ip, r1, lr, lsl #26 - mov r4, r7, lsl #0x18 - mov r5, r7, lsl #0x14 - mov r2, r7, lsl #0xf - mov r4, r4, lsr #0x1c - orr ip, ip, #0x40000000 - mov r6, r7, lsl #0x12 - orr ip, ip, r4, lsl #20 - mov r5, r5, lsr #0x1c - mov r1, r7, lsl #0x10 - orr ip, ip, r5, lsl #23 - mov r4, r6, lsr #0x1e - mov r5, r1, lsr #0x1e - orr r1, ip, r4, lsl #16 - mov r2, r2, lsr #0x1f - orr r1, r1, r5, lsl #18 - orr r1, r1, r2, lsl #29 - str r1, [r3, #0] - cmp lr, #2 - moveq r1, #1 - movne r1, #0 - ldr r2, [r0, #8] - rsb r1, r1, #4 - mov r2, r2, lsr r1 - ldr r1, _0209DD44 // =0x040004AC - ldr ip, _0209DD48 // =0x04000440 - str r2, [r1, #0] - mov r2, #3 - ldr r1, _0209DD4C // =0x04000454 - str r2, [ip] - mov r3, #0 - str r3, [r1, #0] - ldrh r1, [r0, #0x10] - ldrh r2, [r0, #0x12] - ldr r0, _0209DD50 // =0x0400046C - mov r1, r1, lsl #0xc - str r1, [r0, #0] - mov r1, r2, lsl #0xc - str r1, [r0, #0] - str r3, [r0, #0] - mov r0, #1 - str r0, [ip] - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - // .align 2, 0 -_0209DD40: .word 0x040004A8 -_0209DD44: .word 0x040004AC -_0209DD48: .word 0x04000440 -_0209DD4C: .word 0x04000454 -_0209DD50: .word 0x0400046C + UnkSPLUnion5 param = tex->unk_0C; + + G3_TexImageParam( + param.val2_00_0, + GX_TEXGEN_TEXCOORD, + param.val2_00_4, + param.val2_01_0, + param.val2_01_4, + param.val2_01_6, + param.val2_02_0, + tex->unk_04 + ); + + G3_TexPlttBase(tex->unk_08, param.val2_00_0); + G3_MtxMode(GX_MTXMODE_TEXTURE); + G3_Identity(); + G3_Scale(tex->unk_10 * FX32_ONE, tex->unk_12 * FX32_ONE, 0); + G3_MtxMode(GX_MTXMODE_POSITION); } diff --git a/lib/spl/src/unk_0209DD54.c b/lib/spl/src/unk_0209DD54.c new file mode 100644 index 0000000000..d23ba44bf8 --- /dev/null +++ b/lib/spl/src/unk_0209DD54.c @@ -0,0 +1,1118 @@ + +#include "spl.h" + +#include +#include +#include +#include +#include +#include + +typedef void (*RotFunc)(fx32 sin, fx32 cos, MtxFx43 *rot); +typedef void (*DrawPlaneFunc)(fx16 s, fx16 t, fx16 offsetX, fx16 offsetY); + +DrawPlaneFunc Unk_02100DA0[2] = { + sub_020A0500, + sub_020A0444, +}; +RotFunc Unk_02100DA8[2] = { + sub_020A0358, + sub_020A0398, +}; + + +void sub_0209DD54(SPLManager *mgr, SPLParticle *ptcl) +{ + MtxFx43 transform; + MtxFx43 rotMtx; + MtxFx43 sclMat; + VecFx32 vec1, vec2, vec3, vec4, axis; + MtxFx43 mat; + fx32 dot, scaleX, scaleY, scaleZ, alpha, tmp; + u32 polygonID, cullMode; + UnkSPLStruct9 *resBase; + + alpha = ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1) >> 5; + polygonID = ptcl->unk_2E.unk_01_2 << REG_G3_POLYGON_ATTR_ID_SHIFT; + cullMode = GX_CULL_NONE << REG_G3_POLYGON_ATTR_BK_SHIFT; + + reg_G3_POLYGON_ATTR = (u32)( + (0 << REG_G3_POLYGON_ATTR_LE_SHIFT) + | (GX_POLYGONMODE_MODULATE << REG_G3_POLYGON_ATTR_PM_SHIFT) + | (cullMode) + | (mgr->unk_3C) + | (polygonID) + | (alpha << REG_G3_POLYGON_ATTR_ALPHA_SHIFT) + ); + + u32 polygonAttr = reg_G3_POLYGON_ATTR; + + if (alpha == 0) { + return; + } + + int rotation = ptcl->unk_20; + RotFunc rot = Unk_02100DA8[mgr->unk_40.unk_00->p_res->unk_14->unk_00.unk_03_1]; + rot(FX_SinIdx(rotation), FX_CosIdx(rotation), &rotMtx); + + MTX_Identity43(&mat); + + if (!mgr->unk_40.unk_00->p_res->unk_14->unk_0C.unk_04_6) { + VEC_Normalize(&ptcl->unk_14, &vec1); + } else { + VEC_Normalize(&ptcl->unk_08, &vec1); + vec1.x = -vec1.x; + vec1.y = -vec1.y; + vec1.z = -vec1.z; + } + + axis.x = 0; + axis.y = FX32_ONE; + axis.z = 0; + + dot = VEC_DotProduct(&vec1, &axis); + if (dot > FX32_CONST(0.800049) || dot < FX32_CONST(-0.800049)) { + axis.x = FX32_ONE; + axis.y = 0; + axis.z = 0; + } + + VEC_CrossProduct(&vec1, &axis, &vec2); + VEC_CrossProduct(&vec1, &vec2, &vec3); + + mat._00 = vec2.x; + mat._01 = vec2.y; + mat._02 = vec2.z; + scaleY = vec1.x; + mat._10 = scaleY; + mat._11 = vec1.y; + mat._12 = vec1.z; + mat._20 = vec3.x; + tmp = vec3.z; + mat._21 = vec3.y; + mat._22 = tmp; + MTX_Concat43(&rotMtx, &mat, &rotMtx); + + resBase = mgr->unk_40.unk_00->p_res->unk_00; + scaleY = ptcl->unk_30; + scaleX = FX_MUL(scaleY, resBase->unk_30); + + switch (resBase->unk_48.unk_07_4) { + case 0: + scaleX = FX_MUL(scaleX, ptcl->unk_34); + scaleY = FX_MUL(scaleY, ptcl->unk_34); + break; + + case 1: + scaleX = FX_MUL(scaleX, ptcl->unk_34); + break; + + case 2: + scaleY = FX_MUL(scaleY, ptcl->unk_34); + break; + } + + MTX_Scale43(&sclMat, scaleX, scaleY, scaleY); + MTX_Concat43(&rotMtx, &sclMat, &transform); + + resBase = mgr->unk_40.unk_00->p_res->unk_00; + if (!resBase->unk_00.unk_06_7) { + transform._30 = ptcl->unk_08.x + ptcl->unk_38.x; + transform._31 = ptcl->unk_08.y + ptcl->unk_38.y; + transform._32 = ptcl->unk_08.z + ptcl->unk_38.z; + G3_LoadMtx43(mgr->unk_40.unk_04); + G3_MultMtx43(&transform); + } else { + transform._30 = ptcl->unk_08.x + ptcl->unk_38.x - resBase->unk_04.x; + transform._31 = ptcl->unk_08.y + ptcl->unk_38.y - mgr->unk_40.unk_00->p_res->unk_00->unk_04.y; + transform._32 = ptcl->unk_08.z + ptcl->unk_38.z - mgr->unk_40.unk_00->p_res->unk_00->unk_04.z; + + reg_G3_MTX_IDENTITY = 0; + + resBase = mgr->unk_40.unk_00->p_res->unk_00; + fx32 x = resBase->unk_04.x, z = resBase->unk_04.z, y = resBase->unk_04.y; + reg_G3_MTX_TRANS = x; + reg_G3_MTX_TRANS = y; + reg_G3_MTX_TRANS = z; + + G3_MultMtx43(mgr->unk_40.unk_04); + G3_MultMtx43(&transform); + } + + GXRgb colA = ptcl->unk_36; + GXRgb colB = mgr->unk_40.unk_00->unk_E2; + reg_G3_COLOR = GX_RGB( + GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5, + GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15, + GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25 + ); + + SPLEmitter *emtr = mgr->unk_40.unk_00; + DrawPlaneFunc drawPlane = Unk_02100DA0[emtr->p_res->unk_14->unk_00.unk_03_3]; + drawPlane(emtr->unk_EC, emtr->unk_EE, 0, 0); +} + +void sub_0209E1D4(SPLManager *mgr, SPLParticle *ptcl) +{ + MtxFx43 transform; + MtxFx43 rotMat; + MtxFx43 sclMat; + VecFx32 vec1, vec2, vec3, vec4, axis; + MtxFx43 mat; + u32 polygonID, cullMode; + fx32 dot, scaleX, scaleY, alpha, tmp; + UnkSPLStruct9 *resBase; + SPLEmitter *emtr; + int rotation; + RotFunc rot; + DrawPlaneFunc drawPlane; + GXRgb colA, colB; + + alpha = ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1) >> 5; + polygonID = ptcl->unk_2E.unk_01_2 << REG_G3_POLYGON_ATTR_ID_SHIFT; + cullMode = GX_CULL_NONE << REG_G3_POLYGON_ATTR_BK_SHIFT; + + reg_G3_POLYGON_ATTR = (u32)( + (0 << REG_G3_POLYGON_ATTR_LE_SHIFT) + | (GX_POLYGONMODE_MODULATE << REG_G3_POLYGON_ATTR_PM_SHIFT) + | (cullMode) + | (mgr->unk_3C) + | (polygonID) + | (alpha << REG_G3_POLYGON_ATTR_ALPHA_SHIFT) + ); + + u32 polygonAttr = reg_G3_POLYGON_ATTR; + + if (alpha == 0) { + return; + } + + rotation = ptcl->unk_20; + rot = Unk_02100DA8[mgr->unk_40.unk_00->p_res->unk_00->unk_00.unk_06_1]; + rot(FX_SinIdx(rotation), FX_CosIdx(rotation), &rotMat); + + MTX_Identity43(&mat); + + if (!mgr->unk_40.unk_00->p_res->unk_00->unk_48.unk_07_7) { + VEC_Normalize(&ptcl->unk_14, &vec1); + } else { + VEC_Normalize(&ptcl->unk_08, &vec1); + vec1.x = -vec1.x; + vec1.y = -vec1.y; + vec1.z = -vec1.z; + } + + axis.x = 0; + axis.y = FX32_ONE; + axis.z = 0; + + dot = VEC_DotProduct(&vec1, &axis); + if (dot > FX32_CONST(0.800049) || dot < FX32_CONST(-0.800049)) { + axis.x = FX32_ONE; + axis.y = 0; + axis.z = 0; + } + + VEC_CrossProduct(&vec1, &axis, &vec2); + VEC_CrossProduct(&vec1, &vec2, &vec3); + + // vec2: sp + 0x9C + // vec1: sp + 0x90 + // vec3: sp + 0xA8 + mat._00 = vec2.x; + mat._01 = vec2.y; + mat._02 = vec2.z; + mat._10 = vec1.x; + mat._11 = vec1.y; + mat._12 = vec1.z; + mat._20 = vec3.x; + tmp = vec3.z; + mat._21 = vec3.y; + mat._22 = tmp; + MTX_Concat43(&rotMat, &mat, &rotMat); + + resBase = mgr->unk_40.unk_00->p_res->unk_00; + scaleY = ptcl->unk_30; + scaleX = FX_MUL(scaleY, resBase->unk_30); + + switch (resBase->unk_48.unk_07_4) { + case 0: + scaleX = FX_MUL(scaleX, ptcl->unk_34); + scaleY = FX_MUL(scaleY, ptcl->unk_34); + break; + + case 1: + scaleX = FX_MUL(scaleX, ptcl->unk_34); + break; + + case 2: + scaleY = FX_MUL(scaleY, ptcl->unk_34); + break; + } + + MTX_Scale43(&sclMat, scaleX, scaleY, scaleY); + MTX_Concat43(&sclMat, &rotMat, &transform); + + resBase = mgr->unk_40.unk_00->p_res->unk_00; + if (!resBase->unk_00.unk_06_7) { + transform._30 = ptcl->unk_08.x + ptcl->unk_38.x; + transform._31 = ptcl->unk_08.y + ptcl->unk_38.y; + transform._32 = ptcl->unk_08.z + ptcl->unk_38.z; + G3_LoadMtx43(mgr->unk_40.unk_04); + G3_MultMtx43(&transform); + } else { + transform._30 = ptcl->unk_08.x + ptcl->unk_38.x - resBase->unk_04.x; + transform._31 = ptcl->unk_08.y + ptcl->unk_38.y - mgr->unk_40.unk_00->p_res->unk_00->unk_04.y; + transform._32 = ptcl->unk_08.z + ptcl->unk_38.z - mgr->unk_40.unk_00->p_res->unk_00->unk_04.z; + + reg_G3_MTX_IDENTITY = 0; + + resBase = mgr->unk_40.unk_00->p_res->unk_00; + fx32 x = resBase->unk_04.x, z = resBase->unk_04.z, y = resBase->unk_04.y; + reg_G3_MTX_TRANS = x; + reg_G3_MTX_TRANS = y; + reg_G3_MTX_TRANS = z; + + G3_MultMtx43(mgr->unk_40.unk_04); + G3_MultMtx43(&transform); + } + + colA = ptcl->unk_36; + colB = mgr->unk_40.unk_00->unk_E2; + reg_G3_COLOR = GX_RGB( + GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5, + GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15, + GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25 + ); + + emtr = mgr->unk_40.unk_00; + resBase = emtr->p_res->unk_00; + drawPlane = Unk_02100DA0[resBase->unk_00.unk_06_3]; + drawPlane(emtr->unk_E8, emtr->unk_EA, resBase->unk_54, resBase->unk_56); +} + +void sub_0209E650(SPLManager *mgr, SPLParticle *ptcl) +{ + fx32 sclX, sclY; + MtxFx43 load; + MtxFx43 rotMtx; + MtxFx43 sclMtx; + u32 polygonID, cullMode; + fx32 alpha; + UnkSPLStruct9 *resBase; + + alpha = ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1) >> 5; + polygonID = ptcl->unk_2E.unk_01_2 << REG_G3_POLYGON_ATTR_ID_SHIFT; + cullMode = GX_CULL_NONE << REG_G3_POLYGON_ATTR_BK_SHIFT; + + reg_G3_POLYGON_ATTR = (u32)( + (0 << REG_G3_POLYGON_ATTR_LE_SHIFT) + | (GX_POLYGONMODE_MODULATE << REG_G3_POLYGON_ATTR_PM_SHIFT) + | (cullMode) + | (mgr->unk_3C) + | (polygonID) + | (alpha << REG_G3_POLYGON_ATTR_ALPHA_SHIFT) + ); + + u32 polygonAttr = reg_G3_POLYGON_ATTR; + + if (alpha == 0) { + return; + } + + Unk_02100DA8[mgr->unk_40.unk_00->p_res->unk_14->unk_00.unk_03_1]( + FX_SinIdx(ptcl->unk_20), + FX_CosIdx(ptcl->unk_20), + &rotMtx + ); + + sclY = ptcl->unk_30; + resBase = mgr->unk_40.unk_00->p_res->unk_00; + sclX = FX_MUL(sclY, resBase->unk_30); + + switch (resBase->unk_48.unk_07_4) { + case 0: + sclX = FX_MUL(sclX, ptcl->unk_34); + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + + case 1: + sclX = FX_MUL(sclX, ptcl->unk_34); + break; + + case 2: + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + } + + MTX_Scale43(&sclMtx, sclX, sclY, sclY); + MTX_Concat43(&rotMtx, &sclMtx, &load); + + // resBase = mgr->unk_40.unk_00->p_res->unk_00; + if (!mgr->unk_40.unk_00->p_res->unk_00->unk_00.unk_06_7) { + load._30 = ptcl->unk_08.x + ptcl->unk_38.x; + load._31 = ptcl->unk_08.y + ptcl->unk_38.y; + load._32 = ptcl->unk_08.z + ptcl->unk_38.z; + G3_LoadMtx43(mgr->unk_40.unk_04); + G3_MultMtx43(&load); + } else { + load._30 = ptcl->unk_08.x + ptcl->unk_38.x - mgr->unk_40.unk_00->p_res->unk_00->unk_04.x; + load._31 = ptcl->unk_08.y + ptcl->unk_38.y - mgr->unk_40.unk_00->p_res->unk_00->unk_04.y; + load._32 = ptcl->unk_08.z + ptcl->unk_38.z - mgr->unk_40.unk_00->p_res->unk_00->unk_04.z; + + reg_G3_MTX_IDENTITY = 0; + + resBase = mgr->unk_40.unk_00->p_res->unk_00; + fx32 x = resBase->unk_04.x, z = resBase->unk_04.z, y = resBase->unk_04.y; + reg_G3_MTX_TRANS = x; + reg_G3_MTX_TRANS = y; + reg_G3_MTX_TRANS = z; + + G3_MultMtx43(mgr->unk_40.unk_04); + G3_MultMtx43(&load); + } + + GXRgb colA = ptcl->unk_36; + GXRgb colB = mgr->unk_40.unk_00->unk_E2; + reg_G3_COLOR = GX_RGB( + GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5, + GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15, + GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25 + ); + + SPLEmitter *emtr = mgr->unk_40.unk_00; + Unk_02100DA0[emtr->p_res->unk_14->unk_00.unk_03_3](emtr->unk_EC, emtr->unk_EE, 0, 0); +} + +void sub_0209E9A0(SPLManager *mgr, SPLParticle *ptcl) +{ + fx32 sclX, sclY; + MtxFx43 load; + MtxFx43 rotMtx; + MtxFx43 sclMtx; + u32 polygonID, cullMode; + fx32 alpha; + UnkSPLStruct9 *resBase; + + alpha = ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1) >> 5; + polygonID = ptcl->unk_2E.unk_01_2 << REG_G3_POLYGON_ATTR_ID_SHIFT; + cullMode = GX_CULL_NONE << REG_G3_POLYGON_ATTR_BK_SHIFT; + + reg_G3_POLYGON_ATTR = (u32)( + (0 << REG_G3_POLYGON_ATTR_LE_SHIFT) + | (GX_POLYGONMODE_MODULATE << REG_G3_POLYGON_ATTR_PM_SHIFT) + | (cullMode) + | (mgr->unk_3C) + | (polygonID) + | (alpha << REG_G3_POLYGON_ATTR_ALPHA_SHIFT) + ); + + u32 polygonAttr = reg_G3_POLYGON_ATTR; + + if (alpha == 0) { + return; + } + + Unk_02100DA8[mgr->unk_40.unk_00->p_res->unk_00->unk_00.unk_06_1]( + FX_SinIdx(ptcl->unk_20), + FX_CosIdx(ptcl->unk_20), + &rotMtx + ); + + sclY = ptcl->unk_30; + resBase = mgr->unk_40.unk_00->p_res->unk_00; + sclX = FX_MUL(sclY, resBase->unk_30); + + switch (resBase->unk_48.unk_07_4) { + case 0: + sclX = FX_MUL(sclX, ptcl->unk_34); + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + + case 1: + sclX = FX_MUL(sclX, ptcl->unk_34); + break; + + case 2: + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + } + + MTX_Scale43(&sclMtx, sclX, sclY, sclY); + MTX_Concat43(&sclMtx, &rotMtx, &load); + + // resBase = mgr->unk_40.unk_00->p_res->unk_00; + if (!mgr->unk_40.unk_00->p_res->unk_00->unk_00.unk_06_7) { + load._30 = ptcl->unk_08.x + ptcl->unk_38.x; + load._31 = ptcl->unk_08.y + ptcl->unk_38.y; + load._32 = ptcl->unk_08.z + ptcl->unk_38.z; + G3_LoadMtx43(mgr->unk_40.unk_04); + G3_MultMtx43(&load); + } else { + load._30 = ptcl->unk_08.x + ptcl->unk_38.x - mgr->unk_40.unk_00->p_res->unk_00->unk_04.x; + load._31 = ptcl->unk_08.y + ptcl->unk_38.y - mgr->unk_40.unk_00->p_res->unk_00->unk_04.y; + load._32 = ptcl->unk_08.z + ptcl->unk_38.z - mgr->unk_40.unk_00->p_res->unk_00->unk_04.z; + + reg_G3_MTX_IDENTITY = 0; + + resBase = mgr->unk_40.unk_00->p_res->unk_00; + fx32 x = resBase->unk_04.x, z = resBase->unk_04.z, y = resBase->unk_04.y; + reg_G3_MTX_TRANS = x; + reg_G3_MTX_TRANS = y; + reg_G3_MTX_TRANS = z; + + G3_MultMtx43(mgr->unk_40.unk_04); + G3_MultMtx43(&load); + } + + GXRgb colA = ptcl->unk_36; + GXRgb colB = mgr->unk_40.unk_00->unk_E2; + reg_G3_COLOR = GX_RGB( + GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5, + GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15, + GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25 + ); + + SPLEmitter *emtr = mgr->unk_40.unk_00; + resBase = emtr->p_res->unk_00; + Unk_02100DA0[resBase->unk_00.unk_06_3](emtr->unk_E8, emtr->unk_EA, resBase->unk_54, resBase->unk_56); +} + +void sub_0209ECF0(SPLManager *mgr, SPLParticle *ptcl) +{ + fx32 aspect; + const MtxFx43 *cmr; + VecFx32 vel_dir; + fx32 dot; + VecFx32 trs; + fx32 sclX, sclY; + VecFx32 dir, look; + MtxFx33 mtx; + MtxFx43 load; + + + cmr = mgr->unk_40.unk_04; + aspect = mgr->unk_40.unk_00->p_res->unk_00->unk_30; + + u32 polygonID = ptcl->unk_2E.unk_01_2 << REG_G3_POLYGON_ATTR_ID_SHIFT; + u32 cullMode = GX_CULL_NONE << REG_G3_POLYGON_ATTR_BK_SHIFT; + fx32 alpha = (fx32)(ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1)) >> 5; + + reg_G3_POLYGON_ATTR = (u32)( + (0 << REG_G3_POLYGON_ATTR_LE_SHIFT) + | (GX_POLYGONMODE_MODULATE << REG_G3_POLYGON_ATTR_PM_SHIFT) + | (cullMode) + | (mgr->unk_3C) + | (polygonID) + | (alpha << REG_G3_POLYGON_ATTR_ALPHA_SHIFT) + ); + + u32 polygonAttr = reg_G3_POLYGON_ATTR; + + if (alpha == 0) { + return; + } + + sclY = ptcl->unk_30; + sclX = FX_MUL(sclY, aspect); + + switch (mgr->unk_40.unk_00->p_res->unk_00->unk_48.unk_07_4) { + case 0: + sclX = FX_MUL(sclX, ptcl->unk_34); + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + + case 1: + sclX = FX_MUL(sclX, ptcl->unk_34); + break; + + case 2: + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + } + + if (!mgr->unk_40.unk_00->p_res->unk_00->unk_00.unk_06_7) { + trs.x = ptcl->unk_08.x + ptcl->unk_38.x; + trs.y = ptcl->unk_08.y + ptcl->unk_38.y; + trs.z = ptcl->unk_08.z + ptcl->unk_38.z; + + dir = ptcl->unk_14; + + look.x = cmr->_02; + look.y = cmr->_12; + look.z = cmr->_22; + + VEC_CrossProduct(&dir, &look, &dir); + if (dir.x == 0 && dir.y == 0 && dir.z == 0) { + return; + } + + VEC_Normalize(&dir, &dir); + MI_Copy36B(cmr, &mtx); + MTX_MultVec33(&dir, &mtx, &dir); + MTX_MultVec43(&trs, cmr, &trs); + + vel_dir = ptcl->unk_14; + VEC_Normalize(&vel_dir, &vel_dir); + + dot = FX_MUL(vel_dir.x, -cmr->_02) + FX_MUL(vel_dir.y, -cmr->_12) + FX_MUL(vel_dir.z, -cmr->_22); + if (dot < 0) { + dot = -dot; + } + + dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->unk_40.unk_00->p_res->unk_00->unk_48.unk_05_0) + FX32_ONE); + load._00 = FX_MUL(dir.x, sclX); + load._10 = FX_MUL(-dir.y, dot); + load._30 = trs.x; + load._31 = trs.y; + load._01 = FX_MUL(dir.y, sclX); + load._11 = FX_MUL(dir.x, dot); + load._20 = 0; + load._21 = 0; + load._02 = 0; + load._12 = 0; + load._22 = FX32_ONE; + load._32 = trs.z; + + reg_G3_MTX_IDENTITY = 0; + + G3_MultMtx43(&load); + } else { + trs.x = ptcl->unk_08.x + ptcl->unk_38.x - mgr->unk_40.unk_00->p_res->unk_00->unk_04.x; + trs.y = ptcl->unk_08.y + ptcl->unk_38.y - mgr->unk_40.unk_00->p_res->unk_00->unk_04.y; + trs.z = ptcl->unk_08.z + ptcl->unk_38.z - mgr->unk_40.unk_00->p_res->unk_00->unk_04.z; + + dir = ptcl->unk_14; + + look.x = cmr->_02; + look.y = cmr->_12; + look.z = cmr->_22; + + VEC_CrossProduct(&dir, &look, &dir); + if (dir.x == 0 && dir.y == 0 && dir.z == 0) { + return; + } + + VEC_Normalize(&dir, &dir); + MI_Copy36B(cmr, &mtx); + MTX_MultVec33(&dir, &mtx, &dir); + MTX_MultVec43(&trs, cmr, &trs); + + vel_dir = ptcl->unk_14; + VEC_Normalize(&vel_dir, &vel_dir); + + dot = FX_MUL(vel_dir.x, -cmr->_02) + FX_MUL(vel_dir.y, -cmr->_12) + FX_MUL(vel_dir.z, -cmr->_22); + if (dot < 0) { + dot = -dot; + } + + dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->unk_40.unk_00->p_res->unk_00->unk_48.unk_05_0) + FX32_ONE); + /* 54 */ load._00 = FX_MUL(dir.x, sclX); + /* 48 */ load._10 = FX_MUL(-dir.y, dot); + /* 40 */ load._20 = 0; + /* 30 */ load._30 = trs.x; + /* 50 */ load._01 = FX_MUL(dir.y, sclX); + /* 3C */ load._11 = FX_MUL(dir.x, dot); + /* 38 */ load._21 = 0; + /* 2C */ load._31 = trs.y; + /* 4C */ load._02 = 0; + /* 44 */ load._12 = 0; + /* 34 */ load._22 = FX32_ONE; + /* 28 */ load._32 = trs.z; + + reg_G3_MTX_IDENTITY = 0; + + UnkSPLStruct9 *resBase = mgr->unk_40.unk_00->p_res->unk_00; + fx32 px = resBase->unk_04.x, pz = resBase->unk_04.z, py = resBase->unk_04.y; + reg_G3_MTX_TRANS = px; + reg_G3_MTX_TRANS = py; + reg_G3_MTX_TRANS = pz; + + G3_MultMtx43(&load); + } + + GXRgb colA = ptcl->unk_36; + GXRgb colB = mgr->unk_40.unk_00->unk_E2; + reg_G3_COLOR = GX_RGB( + GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5, + GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15, + GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25 + ); + + SPLEmitter *emtr = mgr->unk_40.unk_00; + sub_020A0500(emtr->unk_EC, emtr->unk_EE, 0, 0); +} + +void sub_0209F3D0(SPLManager *mgr, SPLParticle *ptcl) +{ + fx32 aspect; + const MtxFx43 *cmr; + VecFx32 vel_dir; + fx32 dot; + VecFx32 trs; + fx32 sclX, sclY; + VecFx32 dir, look; + MtxFx33 mtx; + MtxFx43 load; + + cmr = mgr->unk_40.unk_04; + aspect = mgr->unk_40.unk_00->p_res->unk_00->unk_30; + + u32 polygonID = ptcl->unk_2E.unk_01_2 << REG_G3_POLYGON_ATTR_ID_SHIFT; + u32 cullMode = GX_CULL_NONE << REG_G3_POLYGON_ATTR_BK_SHIFT; + fx32 alpha = (fx32)(ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1)) >> 5; + + reg_G3_POLYGON_ATTR = (u32)( + (0 << REG_G3_POLYGON_ATTR_LE_SHIFT) + | (GX_POLYGONMODE_MODULATE << REG_G3_POLYGON_ATTR_PM_SHIFT) + | (cullMode) + | (mgr->unk_3C) + | (polygonID) + | (alpha << REG_G3_POLYGON_ATTR_ALPHA_SHIFT) + ); + + u32 polygonAttr = reg_G3_POLYGON_ATTR; + + if (alpha == 0) { + return; + } + + sclY = ptcl->unk_30; + sclX = FX_MUL(sclY, aspect); + + switch (mgr->unk_40.unk_00->p_res->unk_00->unk_48.unk_07_4) { + case 0: + sclX = FX_MUL(sclX, ptcl->unk_34); + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + + case 1: + sclX = FX_MUL(sclX, ptcl->unk_34); + break; + + case 2: + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + } + + if (!mgr->unk_40.unk_00->p_res->unk_00->unk_00.unk_06_7) { + trs.x = ptcl->unk_08.x + ptcl->unk_38.x; + trs.y = ptcl->unk_08.y + ptcl->unk_38.y; + trs.z = ptcl->unk_08.z + ptcl->unk_38.z; + + dir = ptcl->unk_14; + + look.x = cmr->_02; + look.y = cmr->_12; + look.z = cmr->_22; + + VEC_CrossProduct(&dir, &look, &dir); + if (dir.x == 0 && dir.y == 0 && dir.z == 0) { + return; + } + + VEC_Normalize(&dir, &dir); + MI_Copy36B(cmr, &mtx); + MTX_MultVec33(&dir, &mtx, &dir); + MTX_MultVec43(&trs, cmr, &trs); + + vel_dir = ptcl->unk_14; + VEC_Normalize(&vel_dir, &vel_dir); + + dot = FX_MUL(vel_dir.x, -cmr->_02) + FX_MUL(vel_dir.y, -cmr->_12) + FX_MUL(vel_dir.z, -cmr->_22); + if (dot < 0) { + dot = -dot; + } + + // dot = FX_MUL(FX32_ONE - dot, mgr->unk_40.unk_00->p_res->unk_00->unk_48.unk_05_0) + FX32_ONE + dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->unk_40.unk_00->p_res->unk_00->unk_48.unk_05_0) + FX32_ONE); + // fx32 x = FX_MUL(dir.x, sclX); + /* 54 */ load._00 = FX_MUL(dir.x, sclX); + /* 48 */ load._10 = FX_MUL(-dir.y, dot); + /* 30 */ load._30 = trs.x; + /* 2C */ load._31 = trs.y; + /* 50 */ load._01 = FX_MUL(dir.y, sclX); + /* 44 */ load._11 = FX_MUL(dir.x, dot); + /* 3C */ load._20 = 0; + /* 38 */ load._21 = 0; + /* 4C */ load._02 = 0; + /* 40 */ load._12 = 0; + /* 34 */ load._22 = FX32_ONE; + /* 28 */ load._32 = trs.z; + + reg_G3_MTX_IDENTITY = 0; + + G3_MultMtx43(&load); + } else { + trs.x = ptcl->unk_08.x + ptcl->unk_38.x - mgr->unk_40.unk_00->p_res->unk_00->unk_04.x; + trs.y = ptcl->unk_08.y + ptcl->unk_38.y - mgr->unk_40.unk_00->p_res->unk_00->unk_04.y; + trs.z = ptcl->unk_08.z + ptcl->unk_38.z - mgr->unk_40.unk_00->p_res->unk_00->unk_04.z; + + dir = ptcl->unk_14; + + look.x = cmr->_02; + look.y = cmr->_12; + look.z = cmr->_22; + + VEC_CrossProduct(&dir, &look, &dir); + if (dir.x == 0 && dir.y == 0 && dir.z == 0) { + return; + } + + VEC_Normalize(&dir, &dir); + MI_Copy36B(cmr, &mtx); + MTX_MultVec33(&dir, &mtx, &dir); + MTX_MultVec43(&trs, cmr, &trs); + + vel_dir = ptcl->unk_14; + VEC_Normalize(&vel_dir, &vel_dir); + + dot = FX_MUL(vel_dir.x, -cmr->_02) + FX_MUL(vel_dir.y, -cmr->_12) + FX_MUL(vel_dir.z, -cmr->_22); + if (dot < 0) { + dot = -dot; + } + + dot = FX_MUL(sclY, FX_MUL(FX32_ONE - dot, (fx32)mgr->unk_40.unk_00->p_res->unk_00->unk_48.unk_05_0) + FX32_ONE); + /* 54 */ load._00 = FX_MUL(dir.x, sclX); + /* 48 */ load._10 = FX_MUL(-dir.y, dot); + /* 40 */ load._20 = 0; + /* 30 */ load._30 = trs.x; + /* 50 */ load._01 = FX_MUL(dir.y, sclX); + /* 3C */ load._11 = FX_MUL(dir.x, dot); + /* 38 */ load._21 = 0; + /* 2C */ load._31 = trs.y; + /* 4C */ load._02 = 0; + /* 44 */ load._12 = 0; + /* 34 */ load._22 = FX32_ONE; + /* 28 */ load._32 = trs.z; + + reg_G3_MTX_IDENTITY = 0; + + UnkSPLStruct9 *resBase = mgr->unk_40.unk_00->p_res->unk_00; + fx32 px = resBase->unk_04.x, pz = resBase->unk_04.z, py = resBase->unk_04.y; + reg_G3_MTX_TRANS = px; + reg_G3_MTX_TRANS = py; + reg_G3_MTX_TRANS = pz; + + G3_MultMtx43(&load); + } + + GXRgb colA = ptcl->unk_36; + GXRgb colB = mgr->unk_40.unk_00->unk_E2; + reg_G3_COLOR = GX_RGB( + GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5, + GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15, + GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25 + ); + + SPLEmitter *emtr = mgr->unk_40.unk_00; + sub_020A0500(emtr->unk_E8, emtr->unk_EA, emtr->p_res->unk_00->unk_54, emtr->p_res->unk_00->unk_56); +} + +void sub_0209FAB8(SPLManager *mgr, SPLParticle *ptcl) +{ + fx32 aspect; + const MtxFx43 *cmr; + VecFx32 trs; + fx32 sclX, sclY; + MtxFx43 load; + fx32 sin; + + cmr = mgr->unk_40.unk_04; + aspect = mgr->unk_40.unk_00->p_res->unk_00->unk_30; + + u32 polygonID = ptcl->unk_2E.unk_01_2 << REG_G3_POLYGON_ATTR_ID_SHIFT; + u32 cullMode = GX_CULL_NONE << REG_G3_POLYGON_ATTR_BK_SHIFT; + fx32 alpha = (fx32)(ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1)) >> 5; + + reg_G3_POLYGON_ATTR = (u32)( + (0 << REG_G3_POLYGON_ATTR_LE_SHIFT) + | (GX_POLYGONMODE_MODULATE << REG_G3_POLYGON_ATTR_PM_SHIFT) + | (cullMode) + | (mgr->unk_3C) + | (polygonID) + | (alpha << REG_G3_POLYGON_ATTR_ALPHA_SHIFT) + ); + + u32 polygonAttr = reg_G3_POLYGON_ATTR; + + if (alpha == 0) { + return; + } + + sclY = ptcl->unk_30; + sclX = FX_MUL(sclY, aspect); + + switch (mgr->unk_40.unk_00->p_res->unk_00->unk_48.unk_07_4) { + case 0: + sclX = FX_MUL(sclX, ptcl->unk_34); + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + + case 1: + sclX = FX_MUL(sclX, ptcl->unk_34); + break; + + case 2: + sclY = FX_MUL(sclY, ptcl->unk_34); + break; + } + + if (!mgr->unk_40.unk_00->p_res->unk_00->unk_00.unk_06_7) { + trs.x = ptcl->unk_08.x + ptcl->unk_38.x; + trs.y = ptcl->unk_08.y + ptcl->unk_38.y; + trs.z = ptcl->unk_08.z + ptcl->unk_38.z; + MTX_MultVec43(&trs, cmr, &trs); + + sin = FX_SinIdx(ptcl->unk_20); + fx32 cos = FX_CosIdx(ptcl->unk_20); + load._00 = FX_MUL(cos, sclX); + load._01 = FX_MUL(sin, sclX); + load._02 = 0; + load._10 = FX_MUL(-sin, sclY); + load._11 = FX_MUL(cos, sclY); + load._12 = 0; + load._20 = 0; + load._21 = 0; + load._22 = FX32_ONE; + load._30 = trs.x; + load._31 = trs.y; + load._32 = trs.z; + + reg_G3_MTX_IDENTITY = 0; + + G3_MultMtx43(&load); + } else { + trs.x = ptcl->unk_08.x + ptcl->unk_38.x - mgr->unk_40.unk_00->p_res->unk_00->unk_04.x; + trs.y = ptcl->unk_08.y + ptcl->unk_38.y - mgr->unk_40.unk_00->p_res->unk_00->unk_04.y; + trs.z = ptcl->unk_08.z + ptcl->unk_38.z - mgr->unk_40.unk_00->p_res->unk_00->unk_04.z; + MTX_MultVec43(&trs, cmr, &trs); + + sin = FX_SinIdx(ptcl->unk_20); + fx32 cos = FX_CosIdx(ptcl->unk_20); + load._00 = FX_MUL(cos, sclX); + load._01 = FX_MUL(sin, sclX); + load._02 = 0; + load._10 = FX_MUL(-sin, sclY); + load._11 = FX_MUL(cos, sclY); + load._12 = 0; + load._20 = 0; + load._21 = 0; + load._22 = FX32_ONE; + load._30 = trs.x; + load._31 = trs.y; + load._32 = trs.z; + + reg_G3_MTX_IDENTITY = 0; + + UnkSPLStruct9 *resBase = mgr->unk_40.unk_00->p_res->unk_00; + fx32 px = resBase->unk_04.x, pz = resBase->unk_04.z, py = resBase->unk_04.y; + reg_G3_MTX_TRANS = px; + reg_G3_MTX_TRANS = py; + reg_G3_MTX_TRANS = pz; + + G3_MultMtx43(&load); + } + + GXRgb colA = ptcl->unk_36; + GXRgb colB = mgr->unk_40.unk_00->unk_E2; + reg_G3_COLOR = GX_RGB( + GX_RGB_R_(colA) * GX_RGB_R_(colB) >> 5, + GX_RGB_G_(colA) * GX_RGB_G_(colB) >> 15, + GX_RGB_B_(colA) * GX_RGB_B_(colB) >> 25 + ); + + SPLEmitter *emtr = mgr->unk_40.unk_00; + sub_020A0500(emtr->unk_EC, emtr->unk_EE, 0, 0); +} + +void sub_0209FF0C(SPLManager *mgr, SPLParticle *ptcl) +{ + fx32 aspect; + const MtxFx43 *cmr; + VecFx32 trs; + fx32 sclX, sclY; + MtxFx43 load; + fx32 sin; + fx16 animScale; + GXRgb ptclCol, emtrCol; + u8 scaleAnimDirect; + + SPLEmitter *emtr = mgr->unk_40.unk_00; + UnkSPLStruct9 *resBase = emtr->p_res->unk_00; + + cmr = mgr->unk_40.unk_04; + aspect = mgr->unk_40.unk_00->p_res->unk_00->unk_30; + animScale = ptcl->unk_34; + + ptclCol = ptcl->unk_36; + emtrCol = emtr->unk_E2; + + scaleAnimDirect = resBase->unk_48.unk_07_4; + + fx32 alpha = ptcl->unk_2E.unk_00_0 * (ptcl->unk_2E.unk_00_5 + 1) >> 5; + + G3_PolygonAttr( + GX_LIGHTMASK_NONE, + GX_POLYGONMODE_MODULATE, + GX_CULL_NONE, + ptcl->unk_2E.unk_01_2, + alpha, + mgr->unk_3C + ); + + reg_G3_POLYGON_ATTR; + + if (alpha == 0) { + return; + } + + sclY = ptcl->unk_30; + sclX = FX_MUL(sclY, aspect); + + if (scaleAnimDirect == 0) { + sclX = FX_MUL(sclX, animScale); + sclY = FX_MUL(sclY, animScale); + } else if (scaleAnimDirect == 1) { + sclX = FX_MUL(sclX, animScale); + } else { + sclY = FX_MUL(sclY, animScale); + } + + if (!mgr->unk_40.unk_00->p_res->unk_00->unk_00.unk_06_7) { + trs.x = ptcl->unk_08.x + ptcl->unk_38.x; + trs.y = ptcl->unk_08.y + ptcl->unk_38.y; + trs.z = ptcl->unk_08.z + ptcl->unk_38.z; + MTX_MultVec43(&trs, cmr, &trs); + + sin = FX_SinIdx(ptcl->unk_20); + fx32 cos = FX_CosIdx(ptcl->unk_20); + load._00 = FX_MUL(cos, sclX); + load._01 = FX_MUL(sin, sclX); + load._02 = 0; + load._10 = FX_MUL(-sin, sclY); + load._11 = FX_MUL(cos, sclY); + load._12 = 0; + load._20 = 0; + load._21 = 0; + load._22 = FX32_ONE; + load._30 = trs.x; + load._31 = trs.y; + load._32 = trs.z; + + G3_Identity(); + G3_MultMtx43(&load); + } else { + trs.x = ptcl->unk_08.x + ptcl->unk_38.x - mgr->unk_40.unk_00->p_res->unk_00->unk_04.x; + trs.y = ptcl->unk_08.y + ptcl->unk_38.y - mgr->unk_40.unk_00->p_res->unk_00->unk_04.y; + trs.z = ptcl->unk_08.z + ptcl->unk_38.z - mgr->unk_40.unk_00->p_res->unk_00->unk_04.z; + MTX_MultVec43(&trs, cmr, &trs); + + sin = FX_SinIdx(ptcl->unk_20); + fx32 cos = FX_CosIdx(ptcl->unk_20); + load._00 = FX_MUL(cos, sclX); + load._01 = FX_MUL(sin, sclX); + load._02 = 0; + load._10 = FX_MUL(-sin, sclY); + load._11 = FX_MUL(cos, sclY); + load._12 = 0; + load._20 = 0; + load._21 = 0; + load._22 = FX32_ONE; + load._30 = trs.x; + load._31 = trs.y; + load._32 = trs.z; + + G3_Identity(); + + UnkSPLStruct9 *resBase = mgr->unk_40.unk_00->p_res->unk_00; + G3_Translate(resBase->unk_04.x, resBase->unk_04.y, resBase->unk_04.z); + G3_MultMtx43(&load); + } + + G3_Color(GX_RGB( + GX_RGB_R_(ptclCol) * GX_RGB_R_(emtrCol) >> 5, + GX_RGB_G_(ptclCol) * GX_RGB_G_(emtrCol) >> 15, + GX_RGB_B_(ptclCol) * GX_RGB_B_(emtrCol) >> 25 + )); + + emtr = mgr->unk_40.unk_00; + sub_020A0500(emtr->unk_E8, emtr->unk_EA, emtr->p_res->unk_00->unk_54, emtr->p_res->unk_00->unk_56); +} + +void sub_020A0358(fx32 sin, fx32 cos, MtxFx43 *mat) +{ + mat->_00 = cos; + mat->_10 = 0; + mat->_20 = sin; + mat->_30 = 0; + mat->_01 = 0; + mat->_11 = FX32_ONE; + mat->_21 = 0; + mat->_31 = 0; + mat->_02 = -sin; + mat->_12 = 0; + mat->_22 = cos; + mat->_32 = 0; +} + +void sub_020A0398(fx32 sin, fx32 cos, MtxFx43 *mat) +{ + fx32 C, Sm, Sp; + + C = FX_MUL(FX32_ONE - cos, FX32_CONST(1 / 3.0)); + Sm = C + FX_MUL(sin, FX32_SQRT1_3); + Sp = C - FX_MUL(sin, FX32_SQRT1_3); + C += cos; + + mat->_00 = C; + mat->_10 = Sm; + mat->_20 = Sp; + mat->_30 = 0; + mat->_01 = Sp; + mat->_11 = C; + mat->_21 = Sm; + mat->_31 = 0; + mat->_02 = Sm; + mat->_12 = Sp; + mat->_22 = C; + mat->_32 = 0; +} + +void sub_020A0444(fx16 s, fx16 t, fx16 offsetX, fx16 offsetZ) +{ + G3_Begin(GX_BEGIN_QUADS); + + G3_TexCoord(0, 0); + G3_Vtx10(offsetX - FX32_ONE, 0, offsetZ + FX32_ONE); + + G3_TexCoord(s, 0); + G3_Vtx10(offsetX + FX32_ONE, 0, offsetZ + FX32_ONE); + + G3_TexCoord(s, t); + G3_Vtx10(offsetX + FX32_ONE, 0, offsetZ - FX32_ONE); + + G3_TexCoord(0, t); + G3_Vtx10(offsetX - FX32_ONE, 0, offsetZ - FX32_ONE); + + G3_End(); +} + +void sub_020A0500(fx16 s, fx16 t, fx16 offsetX, fx16 offsetY) +{ + G3_Begin(GX_BEGIN_QUADS); + + G3_TexCoord(0, 0); + G3_Vtx10(offsetX - FX32_ONE, offsetY + FX32_ONE, 0); + + G3_TexCoord(s, 0); + G3_Vtx10(offsetX + FX32_ONE, offsetY + FX32_ONE, 0); + + G3_TexCoord(s, t); + G3_Vtx10(offsetX + FX32_ONE, offsetY - FX32_ONE, 0); + + G3_TexCoord(0, t); + G3_Vtx10(offsetX - FX32_ONE, offsetY - FX32_ONE, 0); + + G3_End(); +} diff --git a/lib/spl/src/unk_020A05BC.c b/lib/spl/src/unk_020A05BC.c index f8927ff2bf..24c768a5f4 100644 --- a/lib/spl/src/unk_020A05BC.c +++ b/lib/spl/src/unk_020A05BC.c @@ -1,9 +1,10 @@ #include #include +#include #include "spl.h" -void sub_020A05BC(SPLParticle *ptcl, SPLEmitter *emtr, void *list) +void sub_020A05BC(SPLParticle *ptcl, SPLEmitter *emtr, SPLList *list) { SPLParticle *chld; fx32 velBase, velRand; @@ -78,9 +79,236 @@ void sub_020A05BC(SPLParticle *ptcl, SPLEmitter *emtr, void *list) } } -asm static void sub_020A08DC(SPLEmitter *emtr, SPLList *list) +void sub_020A08DC(SPLEmitter *emtr, SPLList *list) { - .balign 4, 0 stmfd sp !, { r4, r5, r6, r7, r8, sb, sl, fp, lr } sub sp, sp, #0xc4 mov sb, r0 ldr r0, [ sb, #0x20 ] ldrsh r3, [ sb, #0x4e ] str r0, [ sp, #4 ] ldr r0, [ sb, #0x58 ] ldr r2, _020A15E8 add r3, r0, r3 ldr r0, [ sp, #4 ] str r1, [sp] ldr r8, [r0] and r0, r3, r2 strh r0, [ sb, #0x4e ] ldr r0, [r8] mov r0, r0, lsl #0x1c mov r1, r0, lsr #0x1c mov r0, r3, asr #0xc cmp r1, #2 str r0, [ sp, #0xc ] beq _020A0944 cmp r1, #3 beq _020A0944 sub r0, r1, #5 cmp r0, #4 bhi _020A094C _020A0944 : mov r0, sb bl sub_020A1768 _020A094C : ldr r0, [ sp, #0xc ] cmp r0, #0 mov r0, #0 str r0, [ sp, #8 ] addle sp, sp, #0xc4 ldmleia sp !, { r4, r5, r6, r7, r8, sb, sl, fp, lr } bxle lr str r0, [ sp, #0x18 ] str r0, [ sp, #0x24 ] str r0, [ sp, #0x20 ] str r0, [ sp, #0x1c ] mov r0, #0x1000 str r0, [ sp, #0x34 ] ldr r0, [ sp, #8 ] ldr r6, _020A15EC ldr r4, _020A15F0 ldr r5, _020A15F4 str r0, [ sp, #0x38 ] str r0, [ sp, #0x3c ] str r0, [ sp, #0x40 ] _020A099C : ldr r0, [sp] bl sub_020A22B8 movs r7, r0 addeq sp, sp, #0xc4 ldmeqia sp !, { r4, r5, r6, r7, r8, sb, sl, fp, lr } bxeq lr add r0, sb, #8 mov r1, r7 bl sub_020A2304 ldr r0, [r8] mov r0, r0, lsl #0x1c mov r0, r0, lsr #0x1c cmp r0, #9 addls pc, pc, r0, lsl #2 b _020A10DC _020A09D8 : b _020A0A00 b _020A0A1C b _020A0A8C b _020A0AF4 b _020A0B88 b _020A0C88 b _020A0F80 b _020A1004 b _020A0D44 b _020A0E14 _020A0A00 : ldr r0, [ sp, #0x1c ] str r0, [ r7, #0x10 ] ldr r0, [ r7, #0x10 ] str r0, [ r7, #0xc ] ldr r0, [ r7, #0xc ] str r0, [ r7, #8 ] b _020A10DC _020A0A1C : add r0, r7, #8 bl sub_020A23B0 ldr r2, [ r7, #8 ] ldr r1, [ sb, #0x5c ] mov r0, #0x800 smull r3, r1, r2, r1 adds r2, r3, r0 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ r7, #8 ] ldr r2, [ r7, #0xc ] ldr r1, [ sb, #0x5c ] smull r3, r1, r2, r1 adds r2, r3, r0 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ r7, #0xc ] ldr r2, [ r7, #0x10 ] ldr r1, [ sb, #0x5c ] smull r3, r1, r2, r1 adds r2, r3, r0 adc r0, r1, #0 mov r1, r2, lsr #0xc orr r1, r1, r0, lsl #20 str r1, [ r7, #0x10 ] b _020A10DC _020A0A8C : add r0, sp, #0x58 bl sub_020A2354 ldr r2, [ sp, #0x58 ] ldr r0, [ sb, #0x5c ] mov r1, #0x800 smull r3, r0, r2, r0 adds r2, r3, r1 adc r0, r0, #0 mov r2, r2, lsr #0xc orr r2, r2, r0, lsl #20 str r2, [ sp, #0x58 ] ldr r3, [ sp, #0x5c ] ldr r2, [ sb, #0x5c ] add r0, r7, #8 smull sl, r2, r3, r2 adds r3, sl, r1 adc r1, r2, #0 mov r2, r3, lsr #0xc orr r2, r2, r1, lsl #20 ldr r1, [ sp, #0x20 ] str r2, [ sp, #0x5c ] str r1, [ sp, #0x60 ] add r1, sp, #0x58 mov r2, sb bl sub_020A1608 b _020A10DC _020A0AF4 : ldr r0, [ sp, #0x18 ] ldr r1, [ sp, #0xc ] bl _s32_div_f ldr r1, [ sp, #0x18 ] mov r0, r0, asr #4 add r1, r1, #0x10000 mov r2, r0, lsl #1 str r1, [ sp, #0x18 ] ldr r0, _020A15F8 mov r1, r2, lsl #1 ldrsh r0, [ r0, r1 ] add r1, r2, #1 mov r2, r1, lsl #1 ldr r1, _020A15F8 ldrsh r3, [ r1, r2 ] ldr r2, [ sb, #0x5c ] mov r1, #0x800 smull sl, r2, r0, r2 adds sl, sl, r1 adc r0, r2, #0 mov r2, sl, lsr #0xc orr r2, r2, r0, lsl #20 str r2, [ sp, #0x64 ] ldr r2, [ sb, #0x5c ] add r0, r7, #8 smull sl, r2, r3, r2 adds r3, sl, r1 adc r1, r2, #0 mov r2, r3, lsr #0xc orr r2, r2, r1, lsl #20 ldr r1, [ sp, #0x24 ] str r2, [ sp, #0x68 ] str r1, [ sp, #0x6c ] add r1, sp, #0x64 mov r2, sb bl sub_020A1608 b _020A10DC _020A0B88 : add r0, r7, #8 bl sub_020A23B0 ldr r1, [ r6, #0 ] mov r0, #0x800 mla r2, r1, r4, r5 str r2, [ r6, #0 ] mov r1, r2, lsr #0x17 mov r1, r1, lsl #0xc sub r1, r1, #0x100000 mov r1, r1, asr #8 ldr r3, [ r7, #8 ] ldr r2, [ sb, #0x5c ] smull sl, r2, r3, r2 adds r3, sl, r0 adc r2, r2, #0 mov r3, r3, lsr #0xc orr r3, r3, r2, lsl #20 smull r2, r1, r3, r1 adds r2, r2, r0 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ r7, #8 ] ldr r1, [ r6, #0 ] mla r2, r1, r4, r5 str r2, [ r6, #0 ] mov r1, r2, lsr #0x17 mov r1, r1, lsl #0xc sub r1, r1, #0x100000 mov r1, r1, asr #8 ldr r3, [ r7, #0xc ] ldr r2, [ sb, #0x5c ] smull sl, r2, r3, r2 adds r3, sl, r0 adc r2, r2, #0 mov r3, r3, lsr #0xc orr r3, r3, r2, lsl #20 smull r2, r1, r3, r1 adds r2, r2, r0 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ r7, #0xc ] ldr r1, [ r6, #0 ] mla r2, r1, r4, r5 str r2, [ r6, #0 ] mov r1, r2, lsr #0x17 mov r1, r1, lsl #0xc sub r1, r1, #0x100000 mov r1, r1, asr #8 ldr r3, [ r7, #0x10 ] ldr r2, [ sb, #0x5c ] smull sl, r2, r3, r2 adds r3, sl, r0 adc r2, r2, #0 mov r3, r3, lsr #0xc orr r3, r3, r2, lsl #20 smull r2, r1, r3, r1 adds r2, r2, r0 adc r0, r1, #0 mov r1, r2, lsr #0xc orr r1, r1, r0, lsl #20 str r1, [ r7, #0x10 ] b _020A10DC _020A0C88 : add r0, sp, #0x70 bl sub_020A2354 ldr r0, [ r6, #0 ] ldr r3, [ sp, #0x70 ] mla r1, r0, r4, r5 str r1, [ r6, #0 ] ldr r0, [ sb, #0x5c ] mov r2, #0x800 smull sl, r0, r3, r0 adds sl, sl, r2 adc r3, r0, #0 mov r0, sl, lsr #0xc orr r0, r0, r3, lsl #20 mov r3, r1, lsr #0x17 mov r3, r3, lsl #0xc sub r3, r3, #0x100000 mov r3, r3, asr #8 smull sl, r3, r0, r3 adds sl, sl, r2 adc r0, r3, #0 mov r3, sl, lsr #0xc orr r3, r3, r0, lsl #20 mla r0, r1, r4, r5 str r0, [ r6, #0 ] str r3, [ sp, #0x70 ] mov r0, r0, lsr #0x17 mov r0, r0, lsl #0xc sub r0, r0, #0x100000 mov r1, r0, asr #8 ldr sl, [ sp, #0x74 ] ldr r3, [ sb, #0x5c ] add r0, r7, #8 smull fp, r3, sl, r3 adds sl, fp, r2 adc r3, r3, #0 mov sl, sl, lsr #0xc orr sl, sl, r3, lsl #20 smull r3, r1, sl, r1 adds r2, r3, r2 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ sp, #0x74 ] add r1, sp, #0x70 mov r2, sb bl sub_020A1608 b _020A10DC _020A0D44 : add r0, r7, #8 bl sub_020A23B0 add r0, sb, #0x84 add r1, sb, #0x8a add r2, sp, #0x44 bl VEC_Fx16CrossProduct ldrsh r1, [ sp, #0x46 ] ldrsh r0, [ sp, #0x48 ] ldrsh r2, [ sp, #0x44 ] str r1, [ sp, #0x80 ] str r0, [ sp, #0x84 ] add r0, sp, #0x7c add r1, r7, #8 str r2, [ sp, #0x7c ] bl VEC_DotProduct cmp r0, #0 bgt _020A0DAC ldr r0, [ r7, #8 ] rsb r0, r0, #0 str r0, [ r7, #8 ] ldr r0, [ r7, #0xc ] rsb r0, r0, #0 str r0, [ r7, #0xc ] ldr r0, [ r7, #0x10 ] rsb r0, r0, #0 str r0, [ r7, #0x10 ] _020A0DAC : ldr r2, [ r7, #8 ] ldr r1, [ sb, #0x5c ] mov r0, #0x800 smull r3, r1, r2, r1 adds r2, r3, r0 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ r7, #8 ] ldr r2, [ r7, #0xc ] ldr r1, [ sb, #0x5c ] smull r3, r1, r2, r1 adds r2, r3, r0 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ r7, #0xc ] ldr r2, [ r7, #0x10 ] ldr r1, [ sb, #0x5c ] smull r3, r1, r2, r1 adds r2, r3, r0 adc r0, r1, #0 mov r1, r2, lsr #0xc orr r1, r1, r0, lsl #20 str r1, [ r7, #0x10 ] b _020A10DC _020A0E14 : add r0, r7, #8 bl sub_020A23B0 add r0, sb, #0x84 add r1, sb, #0x8a add r2, sp, #0x4a bl VEC_Fx16CrossProduct ldrsh r1, [ sp, #0x4c ] ldrsh r0, [ sp, #0x4e ] ldrsh r2, [ sp, #0x4a ] str r1, [ sp, #0x8c ] str r0, [ sp, #0x90 ] add r0, sp, #0x88 add r1, r7, #8 str r2, [ sp, #0x88 ] bl VEC_DotProduct cmp r0, #0 bge _020A0E7C ldr r0, [ r7, #8 ] rsb r0, r0, #0 str r0, [ r7, #8 ] ldr r0, [ r7, #0xc ] rsb r0, r0, #0 str r0, [ r7, #0xc ] ldr r0, [ r7, #0x10 ] rsb r0, r0, #0 str r0, [ r7, #0x10 ] _020A0E7C : ldr r1, [ r6, #0 ] mov r0, #0x800 mla r2, r1, r4, r5 str r2, [ r6, #0 ] mov r1, r2, lsr #0x17 mov r1, r1, lsl #0xc sub r1, r1, #0x100000 mov r1, r1, asr #9 add r1, r1, #0x800 ldr r3, [ r7, #8 ] ldr r2, [ sb, #0x5c ] smull sl, r2, r3, r2 adds r3, sl, r0 adc r2, r2, #0 mov r3, r3, lsr #0xc orr r3, r3, r2, lsl #20 smull r2, r1, r3, r1 adds r2, r2, r0 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ r7, #8 ] ldr r1, [ r6, #0 ] mla r2, r1, r4, r5 str r2, [ r6, #0 ] mov r1, r2, lsr #0x17 mov r1, r1, lsl #0xc sub r1, r1, #0x100000 mov r1, r1, asr #9 add r1, r1, #0x800 ldr r3, [ r7, #0xc ] ldr r2, [ sb, #0x5c ] smull sl, r2, r3, r2 adds r3, sl, r0 adc r2, r2, #0 mov r3, r3, lsr #0xc orr r3, r3, r2, lsl #20 smull r2, r1, r3, r1 adds r2, r2, r0 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ r7, #0xc ] ldr r1, [ r6, #0 ] mla r2, r1, r4, r5 str r2, [ r6, #0 ] mov r1, r2, lsr #0x17 mov r1, r1, lsl #0xc sub r1, r1, #0x100000 mov r1, r1, asr #9 add r1, r1, #0x800 ldr r3, [ r7, #0x10 ] ldr r2, [ sb, #0x5c ] smull sl, r2, r3, r2 adds r3, sl, r0 adc r2, r2, #0 mov r3, r3, lsr #0xc orr r3, r3, r2, lsl #20 smull r2, r1, r3, r1 adds r2, r2, r0 adc r0, r1, #0 mov r1, r2, lsr #0xc orr r1, r1, r0, lsl #20 str r1, [ r7, #0x10 ] b _020A10DC _020A0F80 : add r0, r7, #0x14 bl sub_020A2354 ldr r2, [ r7, #0x14 ] ldr r1, [ sb, #0x5c ] mov r0, #0x800 smull r3, r1, r2, r1 adds r2, r3, r0 adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 str r2, [ sp, #0x94 ] ldr r3, [ r7, #0x18 ] ldr r2, [ sb, #0x5c ] ldr r1, [ r6, #0 ] smull sl, r2, r3, r2 adds r3, sl, r0 adc r0, r2, #0 mov r2, r3, lsr #0xc orr r2, r2, r0, lsl #20 mla r0, r1, r4, r5 str r0, [ r6, #0 ] str r2, [ sp, #0x98 ] mov r1, r0, lsr #0x17 ldr r2, [ sb, #0x60 ] add r0, r7, #8 mul r1, r2, r1 sub r1, r1, r2, lsl #8 mov r1, r1, asr #8 str r1, [ sp, #0x9c ] add r1, sp, #0x94 mov r2, sb bl sub_020A1608 b _020A10DC _020A1004 : add r0, r7, #0x14 bl sub_020A2354 ldr r0, [ r6, #0 ] mov r3, #0x800 mla r2, r0, r4, r5 str r2, [ r6, #0 ] ldr sl, [ r7, #0x14 ] ldr r0, [ sb, #0x5c ] mov r1, r2, lsr #0x17 smull fp, r0, sl, r0 adds fp, fp, r3 mov r1, r1, lsl #0xc adc sl, r0, #0 mov r0, fp, lsr #0xc sub r1, r1, #0x100000 orr r0, r0, sl, lsl #20 mov r1, r1, asr #8 smull sl, r1, r0, r1 adds sl, sl, r3 adc r0, r1, #0 mov r1, sl, lsr #0xc orr r1, r1, r0, lsl #20 str r1, [ sp, #0xa0 ] mla r1, r2, r4, r5 str r1, [ r6, #0 ] mov r2, r1, lsr #0x17 mov r2, r2, lsl #0xc sub r2, r2, #0x100000 ldr sl, [ r7, #0x18 ] ldr r0, [ sb, #0x5c ] mov r2, r2, asr #8 smull fp, r0, sl, r0 adds fp, fp, r3 adc sl, r0, #0 mov r0, fp, lsr #0xc orr r0, r0, sl, lsl #20 smull sl, r2, r0, r2 adds r3, sl, r3 adc r0, r2, #0 mov r2, r3, lsr #0xc orr r2, r2, r0, lsl #20 mla r0, r1, r4, r5 str r0, [ r6, #0 ] str r2, [ sp, #0xa4 ] mov r1, r0, lsr #0x17 ldr r2, [ sb, #0x60 ] add r0, r7, #8 mul r1, r2, r1 sub r1, r1, r2, lsl #8 mov r1, r1, asr #8 str r1, [ sp, #0xa8 ] add r1, sp, #0xa0 mov r2, sb bl sub_020A1608 _020A10DC : ldr r1, [ r6, #0 ] mla r0, r1, r4, r5 str r0, [ r6, #0 ] ldrb r2, [ r8, #0x42 ] mov r1, r0, lsr #0x18 ldr r3, [ sb, #0x64 ] mul r1, r2, r1 add r2, r2, #0xff sub r1, r2, r1, asr #7 mul r1, r3, r1 mov r1, r1, asr #8 str r1, [ sp, #0x10 ] mla r1, r0, r4, r5 str r1, [ r6, #0 ] mov r0, r1, lsr #0x18 ldrb r2, [ r8, #0x42 ] ldr r3, [ sb, #0x68 ] ldr r1, [r8] mul r0, r2, r0 add r2, r2, #0xff sub r0, r2, r0, asr #7 mul r0, r3, r0 mov r0, r0, asr #8 str r0, [ sp, #0x14 ] mov r0, r1, lsl #0x1c mov r0, r0, lsr #0x1c cmp r0, #6 bne _020A1228 ldrsh r0, [ sb, #0x84 ] ldr r1, [ r7, #0x14 ] mov r2, #0x800 smull r3, r0, r1, r0 adds r1, r3, r2 ldrsh r3, [ sb, #0x8a ] ldr lr, [ r7, #0x18 ] mov ip, r1, lsr #0xc smull sl, r3, lr, r3 adc r0, r0, #0 adds sl, sl, r2 orr ip, ip, r0, lsl #20 adc r3, r3, #0 mov sl, sl, lsr #0xc orr sl, sl, r3, lsl #20 add r3, ip, sl str r3, [ sp, #0xb8 ] ldrsh sl, [ sb, #0x86 ] ldr r3, [ r7, #0x14 ] ldrsh lr, [ sb, #0x8c ] smull ip, sl, r3, sl adds ip, ip, r2 ldr fp, [ r7, #0x18 ] adc sl, sl, #0 smull r3, lr, fp, lr mov ip, ip, lsr #0xc adds r3, r3, r2 orr ip, ip, sl, lsl #20 adc sl, lr, #0 mov r3, r3, lsr #0xc orr r3, r3, sl, lsl #20 add r3, ip, r3 str r3, [ sp, #0xbc ] ldr sl, [ r7, #0x18 ] ldrsh fp, [ sb, #0x88 ] ldr r3, [ r7, #0x14 ] str sl, [ sp, #0x28 ] smull ip, fp, r3, fp ldrsh sl, [ sb, #0x8e ] ldr r3, [ sp, #0x28 ] adds ip, ip, r2 smull sl, lr, r3, sl adc r3, fp, #0 adds r2, sl, r2 mov sl, ip, lsr #0xc orr sl, sl, r3, lsl #20 adc r3, lr, #0 mov r2, r2, lsr #0xc orr r2, r2, r3, lsl #20 add r2, sl, r2 add r0, sp, #0xb8 add r1, sp, #0xac str r2, [ sp, #0xc0 ] bl VEC_Normalize b _020A1264 _020A1228 : ldr r0, [ r7, #8 ] cmp r0, #0 bne _020A1258 ldr r0, [ r7, #0xc ] cmp r0, #0 bne _020A1258 ldr r0, [ r7, #0x10 ] cmp r0, #0 bne _020A1258 add r0, sp, #0xac bl sub_020A23B0 b _020A1264 _020A1258 : add r0, r7, #8 add r1, sp, #0xac bl VEC_Normalize _020A1264 : ldr r2, [ sp, #0xac ] ldr r1, [ sp, #0x10 ] mov r0, #0x800 smull sl, r1, r2, r1 adds r2, sl, r0 add sl, sb, #0x28 str sl, [ sp, #0x2c ] add sl, r7, #0x38 str sl, [ sp, #0x30 ] adc r1, r1, #0 mov r2, r2, lsr #0xc orr r2, r2, r1, lsl #20 ldrsh r1, [ sb, #0x50 ] ldr sl, [ sp, #0x14 ] ldr r3, [ sb, #0x40 ] smull fp, sl, r1, sl adds fp, fp, r0 adc r1, sl, #0 mov sl, fp, lsr #0xc orr sl, sl, r1, lsl #20 add r1, r2, sl add r1, r3, r1 str r1, [ r7, #0x14 ] ldr r3, [ sp, #0xb0 ] ldr r1, [ sp, #0x10 ] ldrsh sl, [ sb, #0x52 ] smull fp, r1, r3, r1 adds fp, fp, r0 adc r3, r1, #0 mov r1, fp, lsr #0xc orr r1, r1, r3, lsl #20 ldr r3, [ sp, #0x14 ] ldr r2, [ sb, #0x44 ] smull fp, r3, sl, r3 adds sl, fp, r0 adc r3, r3, #0 mov sl, sl, lsr #0xc orr sl, sl, r3, lsl #20 add r1, r1, sl add r1, r2, r1 str r1, [ r7, #0x18 ] ldr r1, [ sp, #0xb4 ] ldr r2, [ sp, #0x10 ] ldrsh lr, [ sb, #0x54 ] smull sl, r3, r1, r2 ldr r1, [ sp, #0x14 ] adds sl, sl, r0 smull r2, r1, lr, r1 adc r3, r3, #0 adds r0, r2, r0 mov r2, sl, lsr #0xc orr r2, r2, r3, lsl #20 adc r1, r1, #0 mov r0, r0, lsr #0xc orr r0, r0, r1, lsl #20 ldr ip, [ sb, #0x48 ] add r0, r2, r0 add r0, ip, r0 str r0, [ r7, #0x1c ] ldr r0, [sp, #0x2c] ldr r3, [sp, #0x30] ldmia r0, { r0, r1, r2 } stmia r3, { r0, r1, r2 } ldr r0, [ r6, #0 ] mla r1, r0, r4, r5 str r1, [ r6, #0 ] mov r0, r1, lsr #0x18 ldrb r1, [ r8, #0x40 ] ldr r2, [ sb, #0x6c ] mul r0, r1, r0 add r1, r1, #0xff sub r0, r1, r0, asr #7 mul r0, r2, r0 mov r0, r0, asr #8 str r0, [ r7, #0x30 ] ldr r0, [ sp, #0x34 ] strh r0, [ r7, #0x34 ] ldr r0, [r8] mov r0, r0, lsl #0x16 movs r0, r0, lsr #0x1f beq _020A141C ldr r0, [ sp, #4 ] ldr r0, [ r0, #8 ] ldrh r0, [ r0, #8 ] mov r0, r0, lsl #0x1f movs r0, r0, lsr #0x1f beq _020A141C ldr r0, [ r6, #0 ] ldr r3, _020A15FC mla r1, r0, r4, r5 str r1, [ r6, #0 ] mov r0, r1, lsr #0x14 ldr r1, [ sp, #4 ] ldr r2, [ r1, #8 ] ldr r1, _020A1600 umull r1, sl, r0, r1 mov sl, sl, lsr #1 umull sl, fp, r3, sl ldrh r1, [r2] sub sl, r0, sl strh r1, [ sp, #0x50 ] ldrh r0, [ r8, #0x22 ] mov r1, sl, lsl #1 strh r0, [ sp, #0x52 ] ldrh r0, [ r2, #2 ] strh r0, [ sp, #0x54 ] add r0, sp, #0x50 ldrh r0, [ r0, r1 ] strh r0, [ r7, #0x36 ] b _020A1424 _020A141C : ldrh r0, [ r8, #0x22 ] strh r0, [ r7, #0x36 ] _020A1424 : ldrh r1, [ r7, #0x2e ] ldrb r0, [ sb, #0x81 ] bic r1, r1, #0x1f and r0, r0, #0x1f orr r0, r1, r0 strh r0, [ r7, #0x2e ] ldrh r0, [ r7, #0x2e ] bic r0, r0, #0x3e0 orr r0, r0, #0x3e0 strh r0, [ r7, #0x2e ] ldr r0, [r8] mov r0, r0, lsl #0x12 movs r0, r0, lsr #0x1f ldrne r0, [r6] mlane r1, r0, r4, r5 strne r1, [r6] strneh r1, [ r7, #0x20 ] ldreqh r0, [ sb, #0x56 ] streqh r0, [ r7, #0x20 ] ldr r0, [r8] mov r0, r0, lsl #0x13 movs r0, r0, lsr #0x1f ldreq r0, [ sp, #0x38 ] streqh r0, [ r7, #0x22 ] beq _020A14B4 ldr r0, [ r6, #0 ] mla r1, r0, r4, r5 str r1, [ r6, #0 ] mov r0, r1, lsr #0x14 ldrsh r2, [ r8, #0x34 ] ldrsh r1, [ r8, #0x36 ] sub r1, r1, r2 mul r0, r1, r0 add r0, r0, r2, lsl #12 mov r0, r0, lsr #0xc strh r0, [ r7, #0x22 ] _020A14B4 : ldr r0, [ r6, #0 ] mla r1, r0, r4, r5 str r1, [ r6, #0 ] mov r0, r1, lsr #0x18 ldrb r1, [ r8, #0x41 ] ldrh r2, [ sb, #0x70 ] mul r0, r1, r0 mov r0, r0, asr #8 rsb r0, r0, #0xff mul r0, r2, r0 mov r0, r0, asr #8 add r0, r0, #1 strh r0, [ r7, #0x24 ] ldr r0, [ sp, #0x3c ] strh r0, [ r7, #0x26 ] ldr r0, [r8] mov r0, r0, lsl #0x14 movs r1, r0, lsr #0x1f beq _020A1544 ldr r0, [ sp, #4 ] ldr r0, [ r0, #0x10 ] ldr r0, [ r0, #8 ] mov r0, r0, lsl #0xf movs r0, r0, lsr #0x1f beq _020A1544 ldr r0, [ r6, #0 ] mla r1, r0, r4, r5 str r1, [ r6, #0 ] mov r0, r1, lsr #0x14 ldr r1, [ sp, #4 ] ldr sl, [ r1, #0x10 ] ldrb r1, [ sl, #8 ] bl _u32_div_f ldrb r0, [ sl, r1 ] strb r0, [ r7, #0x2c ] b _020A1574 _020A1544 : cmp r1, #0 beq _020A156C ldr r0, [ sp, #4 ] ldr r1, [ r0, #0x10 ] ldr r0, [ r1, #8 ] mov r0, r0, lsl #0xf movs r0, r0, lsr #0x1f ldreqb r0, [r1] streqb r0, [ r7, #0x2c ] beq _020A1574 _020A156C : ldrb r0, [ r8, #0x47 ] strb r0, [ r7, #0x2c ] _020A1574 : ldr r1, [ sp, #4 ] ldr r0, _020A1604 ldr r1, [ r1, #0 ] ldrb r1, [ r1, #0x48 ] bl _s32_div_f strh r0, [ r7, #0x28 ] ldrh r1, [ r7, #0x24 ] ldr r0, _020A1604 bl _s32_div_f strh r0, [ r7, #0x2a ] ldr r0, [ sp, #0x40 ] strb r0, [ r7, #0x2d ] ldr r0, [r8] mov r0, r0, lsl #0xb movs r0, r0, lsr #0x1f ldrne r0, [r6] mlane r1, r0, r4, r5 strne r1, [r6] movne r0, r1, lsr #0x18 strneb r0, [ r7, #0x2d ] ldr r0, [ sp, #8 ] add r1, r0, #1 ldr r0, [ sp, #0xc ] str r1, [ sp, #8 ] cmp r1, r0 blt _020A099C add sp, sp, #0xc4 ldmia sp !, { r4, r5, r6, r7, r8, sb, sl, fp, lr } bx lr + UnkSPLStruct4 *res; + UnkSPLStruct9 *resBase; + //fx32 genNum; + int i, curGenNum; + SPLParticle *ptcl; + + fx32 magPos; + fx32 magAxis; + res = emtr->p_res; + resBase = res->unk_00; + + int temp = emtr->unk_C8 + FX32_CAST(emtr->unk_BE); + curGenNum = temp >> FX32_SHIFT; + emtr->unk_BE = (temp & FX32_DEC_MASK); + + u32 initType = resBase->unk_00.unk_04_0; + if (initType == 2 || initType == 3 || (initType - 5 <= 4)) { + sub_020A1768(emtr); + } + + i = 0; + if (i < curGenNum) { + fx32 genNum = 0; + do { + ptcl = (SPLParticle *)sub_020A22B8(list); + + if (ptcl == NULL) { + return; + } + + sub_020A2304((SPLList *)&emtr->unk_08, (SPLNode *)ptcl); + + switch (resBase->unk_00.unk_04_0) { + case 0: + ptcl->unk_08.x = ptcl->unk_08.y = ptcl->unk_08.z = 0; + break; + + case 1: + sub_020A23B0(&ptcl->unk_08); + ptcl->unk_08.x = FX_MUL(ptcl->unk_08.x, emtr->unk_CC); + ptcl->unk_08.y = FX_MUL(ptcl->unk_08.y, emtr->unk_CC); + ptcl->unk_08.z = FX_MUL(ptcl->unk_08.z, emtr->unk_CC); + break; + + case 2: + { + VecFx32 pos; + sub_020A2354(&pos); + pos.x = FX_MUL(pos.x, emtr->unk_CC); + pos.y = FX_MUL(pos.y, emtr->unk_CC); + pos.z = 0; + sub_020A1608(&ptcl->unk_08, &pos, emtr); + } + break; + + case 3: + { + VecFx32 pos; + int idx = genNum / curGenNum; + genNum += 0x10000; + fx32 sin = FX_SinIdx(idx); + fx32 cos = FX_CosIdx(idx); + pos.x = FX_MUL(sin, emtr->unk_CC); + pos.y = FX_MUL(cos, emtr->unk_CC); + pos.z = 0; + sub_020A1608(&ptcl->unk_08, &pos, emtr); + } + break; + + case 4: + sub_020A23B0(&ptcl->unk_08); + ptcl->unk_08.x = FX_MUL(FX_MUL(ptcl->unk_08.x, emtr->unk_CC), rng_next(0x17) * FX32_ONE - 0x100000 >> 8); + ptcl->unk_08.y = FX_MUL(FX_MUL(ptcl->unk_08.y, emtr->unk_CC), rng_next(0x17) * FX32_ONE - 0x100000 >> 8); + ptcl->unk_08.z = FX_MUL(FX_MUL(ptcl->unk_08.z, emtr->unk_CC), rng_next(0x17) * FX32_ONE - 0x100000 >> 8); + break; + + case 5: + { + VecFx32 pos; + sub_020A2354(&pos); + pos.x = FX_MUL(FX_MUL(pos.x, emtr->unk_CC), (fx32)rng_next(0x17) * FX32_ONE - 0x100000 >> 8); + pos.y = FX_MUL(FX_MUL(pos.y, emtr->unk_CC), (fx32)rng_next(0x17) * FX32_ONE - 0x100000 >> 8); + sub_020A1608(&ptcl->unk_08, &pos, emtr); + } + break; + + case 8: + { + VecFx32 pos; + VecFx16 tmpUnitVec; + sub_020A23B0(&ptcl->unk_08); + VEC_Fx16CrossProduct(&emtr->unk_F4, &emtr->unk_FA, &tmpUnitVec); + pos.x = tmpUnitVec.x; + pos.y = tmpUnitVec.y; + pos.z = tmpUnitVec.z; + if (VEC_DotProduct(&pos, &ptcl->unk_08) <= 0) { + ptcl->unk_08.x = -ptcl->unk_08.x; + ptcl->unk_08.y = -ptcl->unk_08.y; + ptcl->unk_08.z = -ptcl->unk_08.z; + } + + ptcl->unk_08.x = FX_MUL(ptcl->unk_08.x, emtr->unk_CC); + ptcl->unk_08.y = FX_MUL(ptcl->unk_08.y, emtr->unk_CC); + ptcl->unk_08.z = FX_MUL(ptcl->unk_08.z, emtr->unk_CC); + } + break; + + case 9: + { + VecFx32 pos; + VecFx16 tmpUnitVec; + sub_020A23B0(&ptcl->unk_08); + VEC_Fx16CrossProduct(&emtr->unk_F4, &emtr->unk_FA, &tmpUnitVec); + pos.x = tmpUnitVec.x; + pos.y = tmpUnitVec.y; + pos.z = tmpUnitVec.z; + if (VEC_DotProduct(&pos, &ptcl->unk_08) < 0) { + ptcl->unk_08.x = -ptcl->unk_08.x; + ptcl->unk_08.y = -ptcl->unk_08.y; + ptcl->unk_08.z = -ptcl->unk_08.z; + } + + ptcl->unk_08.x = FX_MUL(FX_MUL(ptcl->unk_08.x, emtr->unk_CC), ((fx32)rng_next(0x17) * FX32_ONE - 0x100000 >> 9) + 0x800); + ptcl->unk_08.y = FX_MUL(FX_MUL(ptcl->unk_08.y, emtr->unk_CC), ((fx32)rng_next(0x17) * FX32_ONE - 0x100000 >> 9) + 0x800); + ptcl->unk_08.z = FX_MUL(FX_MUL(ptcl->unk_08.z, emtr->unk_CC), ((fx32)rng_next(0x17) * FX32_ONE - 0x100000 >> 9) + 0x800); + } + break; + + case 6: + { + VecFx32 pos; + sub_020A2354(&ptcl->unk_14); + pos.x = FX_MUL(ptcl->unk_14.x, emtr->unk_CC); + pos.y = FX_MUL(ptcl->unk_14.y, emtr->unk_CC); + pos.z = (emtr->unk_D0 * rng_next(0x17) - emtr->unk_D0 * 256) >> 8; + sub_020A1608(&ptcl->unk_08, &pos, emtr); + } + break; + + case 7: + { + VecFx32 pos; + sub_020A2354(&ptcl->unk_14); + pos.x = FX_MUL(FX_MUL(ptcl->unk_14.x, emtr->unk_CC), (fx32)rng_next(0x17) * FX32_ONE - 0x100000 >> 8); + pos.y = FX_MUL(FX_MUL(ptcl->unk_14.y, emtr->unk_CC), (fx32)rng_next(0x17) * FX32_ONE - 0x100000 >> 8); + pos.z = (emtr->unk_D0 * (fx32)rng_next(0x17) - emtr->unk_D0 * 256) >> 8; + sub_020A1608(&ptcl->unk_08, &pos, emtr); + } + break; + } + + magPos = emtr->unk_D4 * ((resBase->unk_44.unk_02_0 + 0xFF) - ((fx32)(resBase->unk_44.unk_02_0 * rng_next(0x18)) >> 7)) >> 8; + magAxis = emtr->unk_D8 * ((resBase->unk_44.unk_02_0 + 0xFF) - ((fx32)(resBase->unk_44.unk_02_0 * rng_next(0x18)) >> 7)) >> 8; + + VecFx32 posNorm; + if (resBase->unk_00.unk_04_0 == 6) { + VecFx32 tmp; + tmp.x = FX_MUL(ptcl->unk_14.x, emtr->unk_F4.x) + FX_MUL(ptcl->unk_14.y, emtr->unk_FA.x); + tmp.y = FX_MUL(ptcl->unk_14.x, emtr->unk_F4.y) + FX_MUL(ptcl->unk_14.y, emtr->unk_FA.y); + tmp.z = FX_MUL(ptcl->unk_14.x, emtr->unk_F4.z) + FX_MUL(ptcl->unk_14.y, emtr->unk_FA.z); + + VEC_Normalize(&tmp, &posNorm); + } else if (ptcl->unk_08.x == 0 && ptcl->unk_08.y == 0 && ptcl->unk_08.z == 0) { + sub_020A23B0(&posNorm); + } else { + VEC_Normalize(&ptcl->unk_08, &posNorm); + } + + ptcl->unk_14.x = FX_MUL(posNorm.x, magPos) + FX_MUL(emtr->unk_C0.x, magAxis) + emtr->unk_B0.x; + ptcl->unk_14.y = FX_MUL(posNorm.y, magPos) + FX_MUL(emtr->unk_C0.y, magAxis) + emtr->unk_B0.y; + ptcl->unk_14.z = FX_MUL(posNorm.z, magPos) + FX_MUL(emtr->unk_C0.z, magAxis) + emtr->unk_B0.z; + + ptcl->unk_38 = emtr->unk_98; + + ptcl->unk_30 = emtr->unk_DC * ((resBase->unk_44.unk_00_0 + 0xFF) - ((resBase->unk_44.unk_00_0 * (fx32)rng_next(0x18)) >> 7)) >> 8; + ptcl->unk_34 = FX32_ONE; + + if (resBase->unk_00.unk_05_1 && res->unk_08->unk_08.unk_00_0) { + u16 clr[3]; + u32 indxx = rng_next(0x14); + clr[0] = res->unk_08->unk_00; + clr[1] = resBase->unk_22; + clr[2] = res->unk_08->unk_02; + ptcl->unk_36 = clr[indxx % 3]; + } else { + ptcl->unk_36 = resBase->unk_22; + } + + ptcl->unk_2E.unk_00_0 = emtr->unk_F0.unk_01_0; + ptcl->unk_2E.unk_00_5 = 31; + + if (resBase->unk_00.unk_05_5) { + ptcl->unk_20 = rng_next(0); + } else { + ptcl->unk_20 = emtr->unk_C6; + } + + if (resBase->unk_00.unk_05_4) { + ptcl->unk_22 = ((resBase->unk_36 - resBase->unk_34) * (u32)rng_next(0x14) + (fx32)resBase->unk_34 * FX32_ONE) >> FX32_SHIFT; + } else { + ptcl->unk_22 = 0; + } + + ptcl->unk_24 = (emtr->unk_E0 * (0xFF - ((resBase->unk_44.unk_01_0 * rng_next(0x18) >> 8))) >> 8) + 1; + ptcl->unk_26 = 0; + + if (resBase->unk_00.unk_05_3 && res->unk_10->unk_08.unk_02_0) { + ptcl->unk_2C.unk_00 = res->unk_10->unk_00[rng_next(0x14) % res->unk_10->unk_08.unk_00_0]; + } else if (resBase->unk_00.unk_05_3 && !res->unk_10->unk_08.unk_02_0) { + ptcl->unk_2C.unk_00 = res->unk_10->unk_00[0]; + } else { + ptcl->unk_2C.unk_00 = resBase->unk_48.unk_03_0; + } + + ptcl->unk_28 = 0xFFFF / res->unk_00->unk_48.unk_04_0; + ptcl->unk_2A = 0xFFFF / ptcl->unk_24; + + ptcl->unk_2C.unk_01 = 0; + + if (resBase->unk_00.unk_06_4) { + ptcl->unk_2C.unk_01 = (u8)rng_next(0x18); + } + i++; + } while (i < curGenNum); + } + for (i = 0; i < curGenNum; i++) { + + } } void sub_020A1608(VecFx32 *ptclPos, VecFx32 *pos, SPLEmitter *emtr) @@ -94,7 +322,7 @@ void sub_020A1608(VecFx32 *ptclPos, VecFx32 *pos, SPLEmitter *emtr) ptclPos->z = FX_MUL(pos->x, emtr->unk_F4.z) + FX_MUL(pos->y, emtr->unk_FA.z) + FX_MUL(pos->z, vec.z); } -extern VecFx16 Unk_02100DB0; +VecFx16 Unk_02100DB0 = { 0, 0, FX16_ONE }; void sub_020A1768(SPLEmitter *emtr) { diff --git a/lib/spl/src/unk_020A1E30.c b/lib/spl/src/unk_020A1E30.c index 640e2c70fd..217fc01d9b 100644 --- a/lib/spl/src/unk_020A1E30.c +++ b/lib/spl/src/unk_020A1E30.c @@ -1,7 +1,8 @@ #include "spl.h" #include - +#include +#include void SPL_020A1E30(const void *obj, SPLParticle *ptcl, VecFx32 *pos, SPLEmitter *emtr) { diff --git a/lib/spl/src/unk_020A2354.c b/lib/spl/src/unk_020A2354.c index 9a4c5455b3..d66f8f3bb3 100644 --- a/lib/spl/src/unk_020A2354.c +++ b/lib/spl/src/unk_020A2354.c @@ -2,6 +2,8 @@ #include +u32 Unk_021C3A38; + void sub_020A2354(VecFx32 *vec) { vec->x = rng_next(8);