@@ -33,14 +33,18 @@ s32 MATH_Cos(u32 angle)
3333 cos = s_trigTable [ANG_MODULO_HALF_PI (angle )].sin ;
3434 if (!IS_ANG_THIRD_OR_FOURTH_QUADRANT (angle )) { cos = - cos ; }
3535 }
36+ TEST_MATH_Cos (angle , cos );
3637 return cos ;
3738}
3839
3940/* Address: 0x8003d214 */
40- s32 MATH_Sqrt (u32 n , u32 shift )
41+ u32 MATH_Sqrt (u32 n , u32 shift )
4142{
4243 u32 root = 0 ;
4344 u32 remainder = 0 ;
45+ #ifdef TEST_MATH_IMPL
46+ const u32 input = n ;
47+ #endif
4448 const u32 iterations = (shift / 2 ) + (sizeof (u32 ) * 8 ) / 2 ;
4549 for (u32 i = 0 ; i < iterations ; i ++ )
4650 {
@@ -54,6 +58,7 @@ s32 MATH_Sqrt(u32 n, u32 shift)
5458 root += 1 ;
5559 }
5660 }
61+ TEST_MATH_Sqrt (input , shift , root );
5762 return root ;
5863}
5964
@@ -64,10 +69,11 @@ void MATH_GetInverseMatrixTransformation(Matrix* out, const Matrix* matrix)
6469 {
6570 for (u32 j = 0 ; j < 3 ; j ++ ) { out -> m [i ][j ] = matrix -> m [j ][i ]; }
6671 }
67- const SVec3 t = { .x = (s16 ) - matrix -> t .x , .y = (s16 ) - matrix -> t .y , .z = (s16 ) - matrix -> t .z };
72+ const SVec3 t = { .x = (- matrix -> t .x ) & 0xFFFF , .y = (- matrix -> t .y ) & 0xFFFF , .z = (- matrix -> t .z ) & 0xFFFF };
6873 gte_SetRotMatrix (matrix -> m );
6974 gte_loadVec (& t , GTE_VECTOR_0 );
7075 gte_mulMatrixVec (out -> t .v , GTE_MATRIX_ROT , GTE_VECTOR_0 );
76+ TEST_MATH_GetInverseMatrixTransformation (matrix , out );
7177}
7278
7379/* Address: 0x8003d328 */
@@ -77,17 +83,23 @@ s32 MATH_VectorLength(const SVec3* vector)
7783 gte_loadVec (vector , GTE_VECTOR_0 );
7884 s32 lengthSquared ;
7985 gte_dotProduct (& lengthSquared , GTE_ROW_INDEX_0 , GTE_MATRIX_ROT , GTE_VECTOR_0 );
80- return ND_SquareRoot0_stub (lengthSquared );
86+ const s32 len = ND_SquareRoot0_stub (lengthSquared );
87+ TEST_MATH_VectorLength (vector , len );
88+ return len ;
8189}
8290
8391/* Address: 0x8003d378 */
8492void MATH_VectorNormalize (SVec3 * vector )
8593{
94+ #ifdef TEST_MATH_IMPL
95+ SVec3 input = * vector ;
96+ #endif
8697 s32 len = MATH_VectorLength (vector );
8798 if (len == 0 ) { return ; }
8899 vector -> x = FP_DIV (vector -> x , len );
89100 vector -> y = FP_DIV (vector -> y , len );
90101 vector -> z = FP_DIV (vector -> z , len );
102+ TEST_MATH_VectorNormalize (& input , vector );
91103}
92104
93105/* Address: 0x8003d460 */
@@ -100,36 +112,45 @@ void MATH_CombineMatrixTransformation(Matrix* out, const Matrix* m, const Matrix
100112 M*N = [ RmRn (Rmtn + tm) ]
101113 [ 0 1 ]
102114 */
115+ #ifdef TEST_MATH_IMPL
116+ Matrix inputM = * m ;
117+ Matrix inputN = * n ;
118+ #endif
103119 MATH_MatrixMultiplication (out , m , n );
104-
105120 Vec3 res [2 ];
106121 Vec3 upper = { .x = n -> t .x >> 15 , .y = n -> t .y >> 15 , .z = n -> t .z >> 15 };
107122 Vec3 lower = { .x = n -> t .x & 0x7fff , .y = n -> t .y & 0x7fff , .z = n -> t .z & 0x7fff };
108123 gte_loadVec (& upper , GTE_VECTOR_IR );
109- _gte_mulMatrixVec (& res [0 ], GTE_MATRIX_ROT , GTE_VECTOR_IR , 0 ); // Special case, no shifting
124+ _gte_mulMatrixVec (res [0 ]. v , GTE_MATRIX_ROT , GTE_VECTOR_IR , 0 ); // Special case, no shifting
110125 gte_loadVec (& lower , GTE_VECTOR_IR );
111- gte_mulMatrixVec (& res [1 ], GTE_MATRIX_ROT , GTE_VECTOR_IR );
126+ gte_mulMatrixVec (res [1 ]. v , GTE_MATRIX_ROT , GTE_VECTOR_IR );
112127 out -> t .x = (res [0 ].x * 8 ) + res [1 ].x + m -> t .x ;
113128 out -> t .y = (res [0 ].y * 8 ) + res [1 ].y + m -> t .y ;
114129 out -> t .z = (res [0 ].z * 8 ) + res [1 ].z + m -> t .z ;
130+ TEST_MATH_CombineMatrixTransformation (& inputM , & inputN , out );
115131}
116132
117133/* Address: 0x8006c3b0 */
118134void MATH_MatrixMultiplication (Matrix * out , const Matrix * m , const Matrix * n )
119135{
136+ #ifdef TEST_MATH_IMPL
137+ Matrix inputM = * m ;
138+ Matrix inputN = * n ;
139+ #endif
120140 Vec3 res [3 ];
121- const SVec3 v0 = { n -> m [0 ][0 ], n -> m [1 ][0 ], n -> m [2 ][0 ] };
122- const SVec3 v1 = { n -> m [0 ][1 ], n -> m [1 ][1 ], n -> m [2 ][1 ] };
123- const SVec3 v2 = { n -> m [0 ][2 ], n -> m [1 ][2 ], n -> m [2 ][2 ] };
141+ const SVec3 v0 = { . x = n -> m [0 ][0 ], . y = n -> m [1 ][0 ], . z = n -> m [2 ][0 ] };
142+ const SVec3 v1 = { . x = n -> m [0 ][1 ], . y = n -> m [1 ][1 ], . z = n -> m [2 ][1 ] };
143+ const SVec3 v2 = { . x = n -> m [0 ][2 ], . y = n -> m [1 ][2 ], . z = n -> m [2 ][2 ] };
124144 gte_SetRotMatrix (m -> m );
125145 gte_loadVec (& v0 , GTE_VECTOR_0 );
126- gte_mulMatrixVec (& res [0 ], GTE_MATRIX_ROT , GTE_VECTOR_0 );
146+ gte_mulMatrixVec (res [0 ]. v , GTE_MATRIX_ROT , GTE_VECTOR_0 );
127147 gte_loadVec (& v1 , GTE_VECTOR_1 );
128- gte_mulMatrixVec (& res [1 ], GTE_MATRIX_ROT , GTE_VECTOR_1 );
129- gte_loadVec (& v2 , GTE_VECTOR_0 );
130- gte_mulMatrixVec (& res [2 ], GTE_MATRIX_ROT , GTE_VECTOR_2 );
148+ gte_mulMatrixVec (res [1 ]. v , GTE_MATRIX_ROT , GTE_VECTOR_1 );
149+ gte_loadVec (& v2 , GTE_VECTOR_2 );
150+ gte_mulMatrixVec (res [2 ]. v , GTE_MATRIX_ROT , GTE_VECTOR_2 );
131151 out -> m [0 ][0 ] = res [0 ].x ; out -> m [0 ][1 ] = res [1 ].x ; out -> m [0 ][2 ] = res [2 ].x ;
132152 out -> m [1 ][0 ] = res [0 ].y ; out -> m [1 ][1 ] = res [1 ].y ; out -> m [1 ][2 ] = res [2 ].y ;
133153 out -> m [2 ][0 ] = res [0 ].z ; out -> m [2 ][1 ] = res [1 ].z ; out -> m [2 ][2 ] = res [2 ].z ;
134154 gte_SetRotMatrix (out -> m );
155+ TEST_MATH_MatrixMultiplication (& inputM , & inputN , out );
135156}
0 commit comments