summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2021-06-12 21:18:42 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2021-06-12 21:18:42 -0400
commit53ac2be5cf4064c9e5df4a97f4233b7014acb004 (patch)
treecee9846150fc137614a7163fdfd502ac526b32c0
parent17055159a4118b09acdf3481fd4ecb19faa96f1a (diff)
Decompile unk_0201E7D8, 2
-rw-r--r--arm9/asm/unk_0201E7D8_s.s263
-rw-r--r--arm9/lib/include/FX_types.h106
-rw-r--r--arm9/lib/include/GX_g3_util.h4
-rw-r--r--arm9/lib/include/NNS_g3d.h77
-rw-r--r--arm9/lib/include/fx.h119
-rw-r--r--arm9/lib/src/FX_vec.c4
-rw-r--r--arm9/lib/src/GX_g3_util.c2
-rw-r--r--arm9/src/unk_0201E7D8.c139
8 files changed, 331 insertions, 383 deletions
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;
+}