From 53ac2be5cf4064c9e5df4a97f4233b7014acb004 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 12 Jun 2021 21:18:42 -0400 Subject: Decompile unk_0201E7D8, 2 --- arm9/asm/unk_0201E7D8_s.s | 263 +----------------------------------------- arm9/lib/include/FX_types.h | 106 +++++++++++++++++ arm9/lib/include/GX_g3_util.h | 4 +- arm9/lib/include/NNS_g3d.h | 77 +++++++++++++ arm9/lib/include/fx.h | 119 +++---------------- arm9/lib/src/FX_vec.c | 4 +- arm9/lib/src/GX_g3_util.c | 2 +- arm9/src/unk_0201E7D8.c | 139 +++++++++++++++++++--- 8 files changed, 331 insertions(+), 383 deletions(-) create mode 100644 arm9/lib/include/FX_types.h create mode 100644 arm9/lib/include/NNS_g3d.h (limited to 'arm9') diff --git a/arm9/asm/unk_0201E7D8_s.s b/arm9/asm/unk_0201E7D8_s.s index 6a0f205f..70a62da3 100644 --- a/arm9/asm/unk_0201E7D8_s.s +++ b/arm9/asm/unk_0201E7D8_s.s @@ -13,268 +13,7 @@ .extern FUN_0201E99C .extern FUN_0201E9E8 .extern FUN_0201EA08 - - thumb_func_start FUN_0201EABC -FUN_0201EABC: ; 0x0201EABC - push {r3-r7, lr} - add r5, r0, #0x0 - ldr r0, [sp, #0x18] - add r7, r1, #0x0 - str r0, [sp, #0x18] - ldr r0, [r0, #0x54] - add r6, r2, #0x0 - str r3, [sp, #0x0] - cmp r0, #0x0 - beq _0201EB46 - add r0, r7, #0x1 - cmp r0, r5 - ble _0201EADA - bl GF_AssertFail -_0201EADA: - ldr r0, [sp, #0x0] - mov r1, #0x24 - bl AllocFromHeap - add r4, r0, #0x0 - mov r1, #0xc - ldr r0, [sp, #0x0] - mul r1, r5 - bl AllocFromHeap - mov r1, #0x0 - str r0, [r4, #0x20] - cmp r5, #0x0 - ble _0201EB12 - add r2, r1, #0x0 - add r0, r1, #0x0 -_0201EAFA: - ldr r3, [r4, #0x20] - add r1, r1, #0x1 - str r0, [r3, r2] - ldr r3, [r4, #0x20] - add r3, r3, r2 - str r0, [r3, #0x4] - ldr r3, [r4, #0x20] - add r3, r3, r2 - str r0, [r3, #0x8] - add r2, #0xc - cmp r1, r5 - blt _0201EAFA -_0201EB12: - str r5, [r4, #0x0] - mov r0, #0x0 - str r0, [r4, #0x4] - str r7, [r4, #0x8] - str r7, [r4, #0xc] - str r0, [r4, #0x10] - str r0, [r4, #0x14] - str r0, [r4, #0x18] - str r0, [r4, #0x1c] - mov r0, #0x1 - add r1, r6, #0x0 - tst r1, r0 - beq _0201EB2E - str r0, [r4, #0x14] -_0201EB2E: - mov r0, #0x2 - tst r0, r6 - beq _0201EB38 - mov r0, #0x1 - str r0, [r4, #0x18] -_0201EB38: - mov r0, #0x4 - tst r0, r6 - beq _0201EB42 - mov r0, #0x1 - str r0, [r4, #0x1c] -_0201EB42: - ldr r0, [sp, #0x18] - str r4, [r0, #0x64] -_0201EB46: - pop {r3-r7, pc} - - thumb_func_start FUN_0201EB48 -FUN_0201EB48: ; 0x0201EB48 - push {r4, lr} - add r4, r0, #0x0 - ldr r0, [r4, #0x64] - cmp r0, #0x0 - beq _0201EB62 - ldr r0, [r0, #0x20] - bl FreeToHeap - ldr r0, [r4, #0x64] - bl FreeToHeap - mov r0, #0x0 - str r0, [r4, #0x64] -_0201EB62: - pop {r4, pc} - - thumb_func_start FUN_0201EB64 -FUN_0201EB64: ; 0x0201EB64 - ldr r3, _0201EB6C ; =AllocFromHeap - mov r1, #0x68 - bx r3 - nop -_0201EB6C: .word AllocFromHeap - - thumb_func_start FUN_0201EB70 -FUN_0201EB70: ; 0x0201EB70 - ldr r3, _0201EB74 ; =FreeToHeap - bx r3 - .balign 4 -_0201EB74: .word FreeToHeap - - thumb_func_start FUN_0201EB78 -FUN_0201EB78: ; 0x0201EB78 - push {r3-r4} - add r4, r0, #0x0 - add r3, r1, #0x0 - mov r2, #0xd -_0201EB80: - ldmia r4!, {r0-r1} - stmia r3!, {r0-r1} - sub r2, r2, #0x1 - bne _0201EB80 - pop {r3-r4} - bx lr - - thumb_func_start FUN_0201EB8C -FUN_0201EB8C: ; 0x0201EB8C - ldr r1, _0201EB94 ; =UNK_021C59A4 - str r0, [r1, #0x0] - bx lr - nop -_0201EB94: .word UNK_021C59A4 - - thumb_func_start FUN_0201EB98 -FUN_0201EB98: ; 0x0201EB98 - ldr r0, _0201EBA0 ; =UNK_021C59A4 - mov r1, #0x0 - str r1, [r0, #0x0] - bx lr - .balign 4 -_0201EBA0: .word UNK_021C59A4 - - thumb_func_start FUN_0201EBA4 -FUN_0201EBA4: ; 0x0201EBA4 - push {r3-r6, lr} - sub sp, #0x1c - ldr r0, _0201EC40 ; =UNK_021C59A4 - ldr r1, [r0, #0x0] - cmp r1, #0x0 - beq _0201EC3A - ldr r0, [r1, #0x54] - cmp r0, #0x0 - beq _0201EBEE - add r1, #0x48 - add r2, sp, #0x10 - bl VEC_Subtract - ldr r0, _0201EC40 ; =UNK_021C59A4 - add r1, sp, #0x10 - ldr r0, [r0, #0x0] - bl FUN_0201E9E8 - ldr r0, _0201EC40 ; =UNK_021C59A4 - add r1, sp, #0x10 - ldr r0, [r0, #0x0] - add r2, sp, #0x4 - bl FUN_0201EA08 - ldr r1, _0201EC40 ; =UNK_021C59A4 - add r0, sp, #0x4 - ldr r1, [r1, #0x0] - bl FUN_0201EF70 - ldr r0, _0201EC40 ; =UNK_021C59A4 - ldr r3, [r0, #0x0] - ldr r2, [r3, #0x54] - add r3, #0x48 - ldmia r2!, {r0-r1} - stmia r3!, {r0-r1} - ldr r0, [r2, #0x0] - str r0, [r3, #0x0] -_0201EBEE: - ldr r0, _0201EC40 ; =UNK_021C59A4 - ldr r5, _0201EC44 ; =NNS_G3dGlb + 0x240 - ldr r4, [r0, #0x0] - add r3, r4, #0x0 - add r2, r4, #0x0 - add r4, #0x14 - add r6, r4, #0x0 - ldmia r6!, {r0-r1} - stmia r5!, {r0-r1} - ldr r0, [r6, #0x0] - add r2, #0x2c - str r0, [r5, #0x0] - add r6, r2, #0x0 - ldr r5, _0201EC48 ; =NNS_G3dGlb + 0x24C - ldmia r6!, {r0-r1} - stmia r5!, {r0-r1} - ldr r0, [r6, #0x0] - add r3, #0x20 - str r0, [r5, #0x0] - add r6, r3, #0x0 - ldr r5, _0201EC4C ; =NNS_G3dGlb + 0x258 - ldmia r6!, {r0-r1} - stmia r5!, {r0-r1} - ldr r0, [r6, #0x0] - add r1, r2, #0x0 - str r0, [r5, #0x0] - ldr r0, _0201EC50 ; =NNS_G3dGlb + 0x4C - add r2, r3, #0x0 - str r0, [sp, #0x0] - add r0, r4, #0x0 - mov r3, #0x0 - bl G3i_LookAt_ - ldr r1, _0201EC54 ; =NNS_G3dGlb + 0x80 - mov r0, #0xe8 - ldr r2, [r1, #0x7c] - bic r2, r0 - str r2, [r1, #0x7c] -_0201EC3A: - add sp, #0x1c - pop {r3-r6, pc} - nop -_0201EC40: .word UNK_021C59A4 -_0201EC44: .word NNS_G3dGlb + 0x240 -_0201EC48: .word NNS_G3dGlb + 0x24C -_0201EC4C: .word NNS_G3dGlb + 0x258 -_0201EC50: .word NNS_G3dGlb + 0x4C -_0201EC54: .word NNS_G3dGlb + 0x80 - - thumb_func_start FUN_0201EC58 -FUN_0201EC58: ; 0x0201EC58 - add r3, r0, #0x0 - add r2, r1, #0x0 - ldmia r3!, {r0-r1} - add r2, #0x2c - stmia r2!, {r0-r1} - ldr r0, [r3, #0x0] - str r0, [r2, #0x0] - bx lr - - thumb_func_start FUN_0201EC68 -FUN_0201EC68: ; 0x0201EC68 - push {r3-r4} - add r3, r1, #0x0 - add r4, r0, #0x0 - str r4, [r3, #0x54] - add r2, r3, #0x0 - ldmia r4!, {r0-r1} - add r2, #0x48 - stmia r2!, {r0-r1} - ldr r0, [r4, #0x0] - str r0, [r2, #0x0] - mov r0, #0x1 - str r0, [r3, #0x58] - str r0, [r3, #0x5c] - str r0, [r3, #0x60] - pop {r3-r4} - bx lr - - thumb_func_start FUN_0201EC88 -FUN_0201EC88: ; 0x0201EC88 - mov r1, #0x0 - str r1, [r0, #0x54] - str r1, [r0, #0x58] - str r1, [r0, #0x5c] - str r1, [r0, #0x60] - bx lr + .extern FUN_0201EABC thumb_func_start FUN_0201EC94 FUN_0201EC94: ; 0x0201EC94 diff --git a/arm9/lib/include/FX_types.h b/arm9/lib/include/FX_types.h new file mode 100644 index 00000000..b5b56348 --- /dev/null +++ b/arm9/lib/include/FX_types.h @@ -0,0 +1,106 @@ +#ifndef GUARD_FX_TYPES_H +#define GUARD_FX_TYPES_H + +typedef s16 fx16; +typedef s32 fx32; +typedef s64 fx64; +typedef s64 fx64c; + +#define FX16_INT_MASK 0xF000 +#define FX16_INT_ABS_MASK 0x7000 +#define FX16_FRAC_MASK 0x0FFF +#define FX16_INT_SHIFT 0xC + +#define FX32_INT_MASK 0xFFFFF000 +#define FX32_INT_ABS_MASK 0x7FFFF000 +#define FX32_FRAC_MASK 0x00000FFF +#define FX32_INT_SHIFT 0xC + +#define FX64_INT_MASK 0xFFFFFFFFFFFFF000 +#define FX64_INT_ABS_MASK 0x7FFFFFFFFFFFF000 +#define FX64_FRAC_MASK 0x0000000000000FFF +#define FX64_INT_SHIFT 0xC + +#define FX64C_INT_MASK 0xFFFFFFFF00000000 +#define FX64C_INT_ABS_MASK 0x7FFFFFFF00000000 +#define FX64C_FRAC_MASK 0x00000000FFFFFFFF +#define FX64C_INT_SHIFT 0x20 + +#define FX_INT(TYPE, x) (((x) & TYPE ## _INT_MASK) >> TYPE ## _INT_SHIFT) +#define FX_INT_ABS(TYPE, x) (((x) & TYPE ## _INT_ABS_MASK) >> TYPE ## _INT_SHIFT) +#define FX_FRAC(TYPE, x) ((x) & TYPE ## _FRAC_MASK) + +#define FX16_INT(x) FX_INT(FX16, x) +#define FX16_INT_ABS(x) FX_INT_ABS(FX16, x) +#define FX16_FRAC(x) FX_FRAC(FX16, x) + +#define FX32_INT(x) FX_INT(FX32, x) +#define FX32_INT_ABS(x) FX_INT_ABS(FX32, x) +#define FX32_FRAC(x) FX_FRAC(FX32, x) + +#define FX64_INT(x) FX_INT(FX64, x) +#define FX64_INT_ABS(x) FX_INT_ABS(FX64, x) +#define FX64_FRAC(x) FX_FRAC(FX64, x) + +#define FX64C_INT(x) FX_INT(FX64C, x) +#define FX64C_INT_ABS(x) FX_INT_ABS(FX64C, x) +#define FX64C_FRAC(x) FX_FRAC(FX64C, x) + +//TODO: clean up these macros +#define FX32_MUL_NO_ROUND(a, b) ((fx32)(((fx64)(a) * (b)) >> FX32_INT_SHIFT)) +#define FX32_MUL(a, b) ((fx32)((((fx64)(a) * (b) + (1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT))) +#define FX32_MUL_ADD_MUL(a, b, c, d) ((fx32)(((fx64)(a) * (b) + (fx64)c * d) >> FX32_INT_SHIFT)) +//the extra term here is for rounding +#define FX32_MUL_SUB_MUL(a, b, c, d) ((fx32)(((fx64)(a) * (b) - (fx64)c * d + (1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT)) + +#define FX_MUL_FX32_FX64C(a, b) ((fx32)((((a) * (b) + ((fx64)1 << (FX64C_INT_SHIFT - 1))) >> FX64C_INT_SHIFT))) + +#define FX_FX16_TO_F32(x) ((f32)((x) / (f32)(1 << FX16_SHIFT))) +#define FX_F32_TO_FX16(x) ((fx16)(((x) > 0) ? \ + (fx16)((x) * (1 << FX16_INT_SHIFT) + 0.5f ) : \ + (fx16)((x) * (1 << FX16_INT_SHIFT) - 0.5f ))) +#define FX_F32_TO_FX32(x) ((fx32)(((x) > 0) ? \ + (fx32)((x) * (1 << FX32_INT_SHIFT) + 0.5f ) : \ + (fx32)((x) * (1 << FX32_INT_SHIFT) - 0.5f ))) +#define FX16_CONST(x) FX_F32_TO_FX16(x) +#define FX32_CONST(x) FX_F32_TO_FX32(x) + +#define FX16_ONE ((fx16)0x1000) +#define FX32_ONE ((fx32)0x00001000L) + +typedef struct Vecx32 +{ + fx32 x; + fx32 y; + fx32 z; +} VecFx32; + +typedef struct Vecx16 +{ + fx16 x; + fx16 y; + fx16 z; +} VecFx16; + +//Matrices are indexed as [column][row] +typedef struct Mtx44 +{ + fx32 _[16]; +} MtxFx44; + +typedef struct Mtx43 +{ + fx32 _[12]; +} MtxFx43; + +typedef struct Mtx33 +{ + fx32 _[9]; +} MtxFx33; + +typedef struct Mtx22 +{ + fx32 _[4]; +} MtxFx22; + +#endif //GUARD_FX_TYPES_H diff --git a/arm9/lib/include/GX_g3_util.h b/arm9/lib/include/GX_g3_util.h index a9bc4c17..7a35f545 100644 --- a/arm9/lib/include/GX_g3_util.h +++ b/arm9/lib/include/GX_g3_util.h @@ -1,9 +1,11 @@ #ifndef GUARD_GX_G3_UTIL_H #define GUARD_GX_G3_UTIL_H +#include "FX_types.h" + void G3i_PerspectiveW_(fx32 fovsin, fx32 fovcos, fx32 ratio, fx32 near, fx32 far, fx32 scale, u32 load, struct Mtx44 *mtx); void G3i_OrthoW_(fx32 top, fx32 bottom, fx32 left, fx32 right, fx32 near, fx32 far, fx32 scale, u32 load, struct Mtx44 *mtx); -void G3i_LookAt_(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *c, u32 load, struct Mtx44 *mtx); +void G3i_LookAt_(const struct Vecx32 *a, const struct Vecx32 *b, const struct Vecx32 *c, BOOL load, struct Mtx43 *mtx); void G3_RotX(fx32 sinphi, fx32 cosphi); void G3_RotY(fx32 sinphi, fx32 cosphi); void G3_RotZ(fx32 sinphi, fx32 cosphi); diff --git a/arm9/lib/include/NNS_g3d.h b/arm9/lib/include/NNS_g3d.h new file mode 100644 index 00000000..b927ecfb --- /dev/null +++ b/arm9/lib/include/NNS_g3d.h @@ -0,0 +1,77 @@ +#ifndef GUARD_NNS_G3D_H +#define GUARD_NNS_G3D_H + +#include "fx.h" + +typedef enum +{ + NNS_G3D_GLB_FLAG_FLUSH_WVP = 0x00000001, + NNS_G3D_GLB_FLAG_FLUSH_VP = 0x00000002, + NNS_G3D_GLB_FLAG_INVBASE_UPTODATE = 0x00000004, + NNS_G3D_GLB_FLAG_INVCAMERA_UPTODATE = 0x00000008, + NNS_G3D_GLB_FLAG_INVPROJ_UPTODATE = 0x00000010, + NNS_G3D_GLB_FLAG_INVBASECAMERA_UPTODATE = 0x00000020, + NNS_G3D_GLB_FLAG_INVCAMERAPROJ_UPTODATE = 0x00000040, + + NNS_G3D_GLB_FLAG_BASECAMERA_UPTODATE = 0x00000080, + + NNS_G3D_GLB_FLAG_SRTCAMERA_UPTODATE = NNS_G3D_GLB_FLAG_BASECAMERA_UPTODATE, + NNS_G3D_GLB_FLAG_FLUSH_ALT = NNS_G3D_GLB_FLAG_FLUSH_WVP +} + NNSG3dGlbFlag; + +typedef struct +{ + /*0x000*/ u32 cmd0; + /*0x004*/ u32 mtxmode_proj; + /*0x008*/ MtxFx44 projMtx; + + /*0x048*/ u32 mtxmode_posvec; + /*0x04C*/ MtxFx43 cameraMtx; + + /*0x07C*/ u32 cmd1; + /*0x080*/ u32 lightVec[4]; + + /*0x090*/ u32 cmd2; + /*0x094*/ u32 prmMatColor0; + /*0x098*/ u32 prmMatColor1; + /*0x09C*/ u32 prmPolygonAttr; + /*0x0A0*/ u32 prmViewPort; + + /*0x0A4*/ u32 cmd3; + /*0x0A8*/ u32 lightColor[4]; + + /*0x0B8*/ u32 cmd4; + /*0x0BC*/ MtxFx33 prmBaseRot; + /*0x0E0*/ VecFx32 prmBaseTrans; + /*0x0EC*/ VecFx32 prmBaseScale; + /*0x0F8*/ u32 prmTexImageParam; + + /*0x0FC*/ u32 flag; + /*0x100*/ MtxFx43 invCameraMtx; + /*0x130*/ MtxFx43 srtCameraMtx; + /*0x160*/ MtxFx43 invSrtCameraMtx; + + /*0x190*/ MtxFx43 invBaseMtx; + + /*0x1C0*/ MtxFx44 invProjMtx; + /*0x200*/ MtxFx44 invCameraProjMtx; + + /*0x240*/ VecFx32 camPos; + /*0x24C*/ VecFx32 camUp; + /*0x258*/ VecFx32 camTarget; +} +NNSG3dGlb; + +extern NNSG3dGlb NNS_G3dGlb; + +static inline void NNS_G3dGlbLookAt(const VecFx32 * camPos, const VecFx32 * camUp, const VecFx32 * camTarget) +{ + NNS_G3dGlb.camPos = *camPos; + NNS_G3dGlb.camUp = *camUp; + NNS_G3dGlb.camTarget = *camTarget; + MTX_LookAt(camPos, camUp, camTarget, &NNS_G3dGlb.cameraMtx); + NNS_G3dGlb.flag &= ~(NNS_G3D_GLB_FLAG_INVCAMERA_UPTODATE | NNS_G3D_GLB_FLAG_INVBASECAMERA_UPTODATE | NNS_G3D_GLB_FLAG_INVCAMERAPROJ_UPTODATE | NNS_G3D_GLB_FLAG_BASECAMERA_UPTODATE); +} + +#endif //GUARD_NNS_G3D_H diff --git a/arm9/lib/include/fx.h b/arm9/lib/include/fx.h index 18bb09f2..5e8b5dca 100644 --- a/arm9/lib/include/fx.h +++ b/arm9/lib/include/fx.h @@ -1,107 +1,8 @@ #ifndef GUARD_FX_H #define GUARD_FX_H -typedef s16 fx16; -typedef s32 fx32; -typedef s64 fx64; -typedef s64 fx64c; - -#define FX16_INT_MASK 0xF000 -#define FX16_INT_ABS_MASK 0x7000 -#define FX16_FRAC_MASK 0x0FFF -#define FX16_INT_SHIFT 0xC - -#define FX32_INT_MASK 0xFFFFF000 -#define FX32_INT_ABS_MASK 0x7FFFF000 -#define FX32_FRAC_MASK 0x00000FFF -#define FX32_INT_SHIFT 0xC - -#define FX64_INT_MASK 0xFFFFFFFFFFFFF000 -#define FX64_INT_ABS_MASK 0x7FFFFFFFFFFFF000 -#define FX64_FRAC_MASK 0x0000000000000FFF -#define FX64_INT_SHIFT 0xC - -#define FX64C_INT_MASK 0xFFFFFFFF00000000 -#define FX64C_INT_ABS_MASK 0x7FFFFFFF00000000 -#define FX64C_FRAC_MASK 0x00000000FFFFFFFF -#define FX64C_INT_SHIFT 0x20 - -#define FX_INT(TYPE, x) (((x) & TYPE ## _INT_MASK) >> TYPE ## _INT_SHIFT) -#define FX_INT_ABS(TYPE, x) (((x) & TYPE ## _INT_ABS_MASK) >> TYPE ## _INT_SHIFT) -#define FX_FRAC(TYPE, x) ((x) & TYPE ## _FRAC_MASK) - -#define FX16_INT(x) FX_INT(FX16, x) -#define FX16_INT_ABS(x) FX_INT_ABS(FX16, x) -#define FX16_FRAC(x) FX_FRAC(FX16, x) - -#define FX32_INT(x) FX_INT(FX32, x) -#define FX32_INT_ABS(x) FX_INT_ABS(FX32, x) -#define FX32_FRAC(x) FX_FRAC(FX32, x) - -#define FX64_INT(x) FX_INT(FX64, x) -#define FX64_INT_ABS(x) FX_INT_ABS(FX64, x) -#define FX64_FRAC(x) FX_FRAC(FX64, x) - -#define FX64C_INT(x) FX_INT(FX64C, x) -#define FX64C_INT_ABS(x) FX_INT_ABS(FX64C, x) -#define FX64C_FRAC(x) FX_FRAC(FX64C, x) - -//TODO: clean up these macros -#define FX32_MUL_NO_ROUND(a, b) ((fx32)(((fx64)(a) * (b)) >> FX32_INT_SHIFT)) -#define FX32_MUL(a, b) ((fx32)((((fx64)(a) * (b) + (1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT))) -#define FX32_MUL_ADD_MUL(a, b, c, d) ((fx32)(((fx64)(a) * (b) + (fx64)c * d) >> FX32_INT_SHIFT)) -//the extra term here is for rounding -#define FX32_MUL_SUB_MUL(a, b, c, d) ((fx32)(((fx64)(a) * (b) - (fx64)c * d + (1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT)) - -#define FX_MUL_FX32_FX64C(a, b) ((fx32)((((a) * (b) + ((fx64)1 << (FX64C_INT_SHIFT - 1))) >> FX64C_INT_SHIFT))) - -#define FX_FX16_TO_F32(x) ((f32)((x) / (f32)(1 << FX16_SHIFT))) -#define FX_F32_TO_FX16(x) ((fx16)(((x) > 0) ? \ - (fx16)((x) * (1 << FX16_INT_SHIFT) + 0.5f ) : \ - (fx16)((x) * (1 << FX16_INT_SHIFT) - 0.5f ))) -#define FX_F32_TO_FX32(x) ((fx32)(((x) > 0) ? \ - (fx32)((x) * (1 << FX32_INT_SHIFT) + 0.5f ) : \ - (fx32)((x) * (1 << FX32_INT_SHIFT) - 0.5f ))) -#define FX16_CONST(x) FX_F32_TO_FX16(x) -#define FX32_CONST(x) FX_F32_TO_FX32(x) - -#define FX16_ONE ((fx16)0x1000) -#define FX32_ONE ((fx32)0x00001000L) - -struct Vecx32 -{ - fx32 x; - fx32 y; - fx32 z; -}; - -struct Vecx16 -{ - fx16 x; - fx16 y; - fx16 z; -}; - -//Matrices are indexed as [column][row] -struct Mtx44 -{ - fx32 _[16]; -}; - -struct Mtx43 -{ - fx32 _[12]; -}; - -struct Mtx33 -{ - fx32 _[9]; -}; - -struct Mtx22 -{ - fx32 _[4]; -}; +#include "FX_types.h" +#include "GX_g3_util.h" //FX void FX_Init(); @@ -115,9 +16,9 @@ u16 FX_Atan2(fx32 x, fx32 y); void VEC_Add(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *dst); void VEC_Subtract(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *dst); void VEC_Fx16Add(struct Vecx16 *x, struct Vecx16 *y, struct Vecx16 *dst); -fx32 VEC_DotProduct(struct Vecx32 *x, struct Vecx32 *y); +fx32 VEC_DotProduct(const struct Vecx32 *a, const struct Vecx32 *b); fx32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b); -void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst); +void VEC_CrossProduct(const struct Vecx32 *a, const struct Vecx32 *b, struct Vecx32 *dst); void VEC_Fx16CrossProduct(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst); fx32 VEC_Mag(struct Vecx32 *a); void VEC_Normalize(struct Vecx32 *a, struct Vecx32 *dst); @@ -197,4 +98,16 @@ static inline fx32 FX_MulInline(fx32 v1, fx32 v2) #define FX_Mul(v1, v2) FX_MulInline(v1, v2) +static inline void VEC_Set(struct Vecx32 * vec, fx32 x, fx32 y, fx32 z) +{ + vec->x = x; + vec->y = y; + vec->z = z; +} + +static inline void MTX_LookAt(const VecFx32 * camPos, const VecFx32 * camUp, const VecFx32 * target, MtxFx43 * mtx) +{ + G3i_LookAt_(camPos, camUp, target, FALSE, mtx); +} + #endif //GUARD_FX_H diff --git a/arm9/lib/src/FX_vec.c b/arm9/lib/src/FX_vec.c index 39dd3076..4ea65e96 100644 --- a/arm9/lib/src/FX_vec.c +++ b/arm9/lib/src/FX_vec.c @@ -19,7 +19,7 @@ ARM_FUNC void VEC_Fx16Add(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst dst->z = (s16)(a->z + b->z); } -ARM_FUNC fx32 VEC_DotProduct(struct Vecx32 *a, struct Vecx32 *b){ +ARM_FUNC fx32 VEC_DotProduct(const struct Vecx32 *a, const struct Vecx32 *b){ return (fx32)(((fx64)a->x * b->x + (fx64)a->y * b->y + (fx64)a->z * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); } @@ -30,7 +30,7 @@ ARM_FUNC fx32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b){ return (fx32)(((fx64)temp1 + temp2) >> FX64_INT_SHIFT); } -ARM_FUNC void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ +ARM_FUNC void VEC_CrossProduct(const struct Vecx32 *a, const struct Vecx32 *b, struct Vecx32 *dst){ fx32 x, y, z; x = (fx32)(((fx64)a->y * b->z - (fx64)a->z * b->y + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); y = (fx32)(((fx64)a->z * b->x - (fx64)a->x * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); diff --git a/arm9/lib/src/GX_g3_util.c b/arm9/lib/src/GX_g3_util.c index e647f1c7..b4fdd0cc 100644 --- a/arm9/lib/src/GX_g3_util.c +++ b/arm9/lib/src/GX_g3_util.c @@ -165,7 +165,7 @@ ARM_FUNC void G3i_OrthoW_(fx32 top, fx32 bottom, fx32 left, fx32 right, fx32 nea } } -ARM_FUNC void G3i_LookAt_(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *c, u32 load, struct Mtx44 *mtx){ +ARM_FUNC void G3i_LookAt_(const struct Vecx32 *a, const struct Vecx32 *b, const struct Vecx32 *c, BOOL load, struct Mtx43 *mtx){ struct Vecx32 temp, temp1, temp2; fx32 c1, c2, c3; vu32 *reg_ptr; diff --git a/arm9/src/unk_0201E7D8.c b/arm9/src/unk_0201E7D8.c index 5915c4f5..3860e89d 100644 --- a/arm9/src/unk_0201E7D8.c +++ b/arm9/src/unk_0201E7D8.c @@ -1,5 +1,7 @@ #include "global.h" #include "fx.h" +#include "heap.h" +#include "NNS_g3d.h" struct UnkStruct_0201E7D8_64 { @@ -11,7 +13,7 @@ struct UnkStruct_0201E7D8_64 s32 unk_14; s32 unk_18; s32 unk_1C; - struct Vecx32 * unk_20; + VecFx32 * unk_20; }; struct UnkStruct_0201E7D8 @@ -21,18 +23,16 @@ struct UnkStruct_0201E7D8 fx32 unk_08; fx32 unk_0C; fx32 unk_10; - struct Vecx32 unk_14; - struct Vecx32 unk_20; - fx32 unk_2C; - fx32 unk_30; - fx32 unk_34; + VecFx32 unk_14; + VecFx32 unk_20; + VecFx32 unk_2C; fx32 unk_38; u16 unk_3C; u16 unk_3E; u8 filler_40[6]; u16 unk_46; - u8 filler_48[12]; - u32 unk_54; + VecFx32 unk_48; + VecFx32 * unk_54; u32 unk_58; u32 unk_5C; u32 unk_60; @@ -40,7 +40,9 @@ struct UnkStruct_0201E7D8 }; BOOL UNK_02105BB8 = TRUE; -void * UNK_021C59A4; +struct UnkStruct_0201E7D8 * UNK_021C59A4; + +void FUN_0201EF70(VecFx32 * a0, struct UnkStruct_0201E7D8 * a1); THUMB_FUNC void FUN_0201E7D8(struct UnkStruct_0201E7D8 * a0) { @@ -68,9 +70,9 @@ THUMB_FUNC void FUN_0201E99C(u16 a0, struct UnkStruct_0201E7D8 * a1) a1->unk_08 = FX32_CONST(1.33333333); a1->unk_0C = FX32_CONST(150); a1->unk_10 = FX32_CONST(900); - a1->unk_2C = 0; - a1->unk_30 = FX32_ONE; - a1->unk_34 = 0; + a1->unk_2C.x = 0; + a1->unk_2C.y = FX32_ONE; + a1->unk_2C.z = 0; a1->unk_54 = 0; a1->unk_58 = 0; a1->unk_5C = 0; @@ -78,7 +80,7 @@ THUMB_FUNC void FUN_0201E99C(u16 a0, struct UnkStruct_0201E7D8 * a1) a1->unk_64 = NULL; } -THUMB_FUNC void FUN_0201E9E8(struct UnkStruct_0201E7D8 * a0, struct Vecx32 * a1) +THUMB_FUNC void FUN_0201E9E8(struct UnkStruct_0201E7D8 * a0, VecFx32 * a1) { if (a0->unk_58 == 0) a1->x = 0; @@ -88,7 +90,7 @@ THUMB_FUNC void FUN_0201E9E8(struct UnkStruct_0201E7D8 * a0, struct Vecx32 * a1) a1->z = 0; } -THUMB_FUNC void FUN_0201EA08(struct UnkStruct_0201E7D8 * a0, struct Vecx32 * a1, struct Vecx32 * a2) +THUMB_FUNC void FUN_0201EA08(struct UnkStruct_0201E7D8 * a0, VecFx32 * a1, VecFx32 * a2) { s32 * r7; s32 * sp0; @@ -121,3 +123,112 @@ THUMB_FUNC void FUN_0201EA08(struct UnkStruct_0201E7D8 * a0, struct Vecx32 * a1, a2->z = a1->z; } } + +THUMB_FUNC void FUN_0201EABC(s32 r5, s32 r7, s32 r6, s32 sp0, struct UnkStruct_0201E7D8 * sp18) +{ + s32 i; + struct UnkStruct_0201E7D8_64 * r4; + + if (sp18->unk_54 != 0) + { + GF_ASSERT(r7 + 1 <= r5); + r4 = AllocFromHeap(sp0, sizeof(struct UnkStruct_0201E7D8_64)); + r4->unk_20 = AllocFromHeap(sp0, sizeof(VecFx32) * r5); + for (i = 0; i < r5; i++) + { + r4->unk_20[i].x = 0; + r4->unk_20[i].y = 0; + r4->unk_20[i].z = 0; + } + r4->unk_00 = r5; + r4->unk_04 = 0; + r4->unk_08 = r7; + r4->unk_0C = r7; + r4->unk_10 = 0; + r4->unk_14 = 0; + r4->unk_18 = 0; + r4->unk_1C = 0; + if (r6 & 1) + r4->unk_14 = 1; + if (r6 & 2) + r4->unk_18 = 1; + if (r6 & 4) + r4->unk_1C = 1; + sp18->unk_64 = r4; + } +} + +THUMB_FUNC void FUN_0201EB48(struct UnkStruct_0201E7D8 * a0) +{ + if (a0->unk_64 != NULL) + { + FreeToHeap(a0->unk_64->unk_20); + FreeToHeap(a0->unk_64); + a0->unk_64 = NULL; + } +} + +THUMB_FUNC struct UnkStruct_0201E7D8 * FUN_0201EB64(u32 heap_id) +{ + return AllocFromHeap(heap_id, sizeof(struct UnkStruct_0201E7D8)); +} + +THUMB_FUNC void FUN_0201EB70(struct UnkStruct_0201E7D8 * a0) +{ + FreeToHeap(a0); +} + +THUMB_FUNC void FUN_0201EB78(struct UnkStruct_0201E7D8 * a0, struct UnkStruct_0201E7D8 * a1) +{ + *a1 = *a0; +} + +THUMB_FUNC void FUN_0201EB8C(struct UnkStruct_0201E7D8 * a0) +{ + UNK_021C59A4 = a0; +} + +THUMB_FUNC void FUN_0201EB98(void) +{ + UNK_021C59A4 = NULL; +} + +THUMB_FUNC void FUN_0201EBA4(void) +{ + VecFx32 sp10; + VecFx32 sp4; + if (UNK_021C59A4 != NULL) + { + if (UNK_021C59A4->unk_54 != NULL) + { + VEC_Subtract(UNK_021C59A4->unk_54, &UNK_021C59A4->unk_48, &sp10); + FUN_0201E9E8(UNK_021C59A4, &sp10); + FUN_0201EA08(UNK_021C59A4, &sp10, &sp4); + FUN_0201EF70(&sp4, UNK_021C59A4); + UNK_021C59A4->unk_48 = *UNK_021C59A4->unk_54; + } + NNS_G3dGlbLookAt(&UNK_021C59A4->unk_14, &UNK_021C59A4->unk_2C, &UNK_021C59A4->unk_20); + } +} + +THUMB_FUNC void FUN_0201EC58(VecFx32 * a, struct UnkStruct_0201E7D8 * b) +{ + b->unk_2C = *a; +} + +THUMB_FUNC void FUN_0201EC68(VecFx32 * a, struct UnkStruct_0201E7D8 * b) +{ + b->unk_54 = a; + b->unk_48 = *a; + b->unk_58 = 1; + b->unk_5C = 1; + b->unk_60 = 1; +} + +THUMB_FUNC void FUN_0201EC88(struct UnkStruct_0201E7D8 * a0) +{ + a0->unk_54 = NULL; + a0->unk_58 = 0; + a0->unk_5C = 0; + a0->unk_60 = 0; +} -- cgit v1.2.3