Skip to content

Commit a7ff99f

Browse files
committed
first function in coll decompiled
1 parent 1af9340 commit a7ff99f

File tree

9 files changed

+126
-19
lines changed

9 files changed

+126
-19
lines changed

include/ctr/coll.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#pragma once
2+
3+
#include <ctr/math.h>
4+
5+
void COLL_ProjectPointToEdge(SVec3* out, const SVec3* v1, const SVec3* v2, const SVec3* point);

include/ctr/gte.h

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,32 @@ typedef enum GTE_VECTOR
2323
GTE_VECTOR_0, /* SVec */
2424
GTE_VECTOR_1, /* SVec */
2525
GTE_VECTOR_2, /* SVec */
26-
GTE_VECTOR_IR, /* Vec */
26+
GTE_VECTOR_IR, /* SVec */
27+
GTE_VECTOR_MAC, /* Vec */
2728
} GTE_VECTOR;
2829

30+
typedef enum GTE_IR
31+
{
32+
GTE_IR_0, /* s16 */
33+
GTE_IR_1, /* s16 */
34+
GTE_IR_2, /* s16 */
35+
GTE_IR_3, /* s16 */
36+
} GTE_IR;
37+
2938
typedef enum GTE_MAC
3039
{
31-
GTE_MAC_0,
32-
GTE_MAC_1,
33-
GTE_MAC_2,
34-
GTE_MAC_3,
35-
GTE_MAC_VEC, /* 1-3, Vec */
40+
GTE_MAC_0, /* s32 */
41+
GTE_MAC_1, /* s32 */
42+
GTE_MAC_2, /* s32 */
43+
GTE_MAC_3, /* s32 */
3644
} GTE_MAC;
3745

46+
typedef enum GTE_INTERPOLATE
47+
{
48+
GTE_INTERPOLATE_INT,
49+
GTE_INTERPOLATE_FLOATING_POINT,
50+
} GTE_INTERPOLATE;
51+
3852
/* HELPERS */
3953
#define _CAT(a, b) a##b
4054
#define CAT(a, b) _CAT(a, b)
@@ -44,23 +58,46 @@ typedef enum GTE_MAC
4458
#define _gte_loadSVecMatrix_GTE_MATRIX_ROT_GTE_ROW_INDEX_0(v) gte_ldsvrtrow0(v)
4559
#define _gte_loadSVecMatrix_GTE_MATRIX_LIGHT_GTE_ROW_INDEX_0(v) gte_ldsvllrow0(v)
4660
#define _gte_loadSVecMatrix_GTE_MATRIX_COLOR_GTE_ROW_INDEX_0(v) gte_ldsvlcrow0(v)
47-
#define _gte_loadVec_GTE_VECTOR_0(v) gte_ldv0(v)
48-
#define _gte_loadVec_GTE_VECTOR_1(v) gte_ldv1(v)
49-
#define _gte_loadVec_GTE_VECTOR_2(v) gte_ldv2(v)
61+
#define _gte_loadSVec_GTE_VECTOR_0(v) gte_ldv0(v)
62+
#define _gte_loadSVec_GTE_VECTOR_1(v) gte_ldv1(v)
63+
#define _gte_loadSVec_GTE_VECTOR_2(v) gte_ldv2(v)
64+
#define _gte_loadSVec_GTE_VECTOR_IR(v) gte_ldsv(v)
5065
#define _gte_loadVec_GTE_VECTOR_IR(v) gte_ldlvl(v)
66+
#define _gte_loadVec_GTE_VECTOR_MAC(v) __asm__ volatile ( \
67+
"lwc2 $25, 0( %0 );" \
68+
"lwc2 $26, 4( %0 );" \
69+
"lwc2 $27, 8( %0 );" \
70+
: \
71+
: "r"( v ) )
5172
#define _gte_readMac_GTE_MAC_0(out) gte_stopz(out)
5273
#define _gte_readMac_GTE_MAC_1(out) gte_stlvnl0(out)
5374
#define _gte_readMac_GTE_MAC_2(out) gte_stlvnl1(out)
5475
#define _gte_readMac_GTE_MAC_3(out) gte_stlvnl2(out)
55-
#define _gte_readMac_GTE_MAC_VEC(out) gte_stlvnl(out)
76+
#define _gte_readMac_GTE_VECTOR_MAC(out) gte_stlvnl(out)
77+
#define _gte_loadIR_GTE_IR_0(in) gte_lddp(in)
5678
#define _gte_dotProduct_GTE_ROW_INDEX_0(out, matrixType, vecType) gte_mvmva(0, matrixType, vecType, 3, 0); _gte_readMac_GTE_MAC_1(out)
5779
#define _gte_dotProduct_GTE_ROW_INDEX_1(out, matrixType, vecType) gte_mvmva(0, matrixType, vecType, 3, 0); _gte_readMac_GTE_MAC_2(out)
5880
#define _gte_dotProduct_GTE_ROW_INDEX_2(out, matrixType, vecType) gte_mvmva(0, matrixType, vecType, 3, 0); _gte_readMac_GTE_MAC_3(out)
59-
#define _gte_mulMatrixVec(out, matrixType, vecType, shift) gte_mvmva(shift, matrixType, vecType, 3, 0); _gte_readMac_GTE_MAC_VEC(out)
81+
#define _gte_mulMatrixVec(out, matrixType, vecType, shift) gte_mvmva(shift, matrixType, vecType, 3, 0); _gte_readMac_GTE_VECTOR_MAC(out)
82+
#define _gte_interpolate_GTE_INTERPOLATE_INT() gte_gpl0()
83+
#define _gte_interpolate_GTE_INTERPOLATE_FLOATING_POINT() gte_gpl12()
84+
#define _gte_leadingZeroes(out, in) __asm__ volatile ( \
85+
"mtc2 %1, $30;" \
86+
"nop;" \
87+
"nop;" \
88+
"swc2 $31, 0( %0 );" \
89+
: \
90+
: "r"( out ), "r"( in ) \
91+
: "memory" \
92+
)
6093

6194
/* API */
6295
#define gte_readMac(out, macType) CAT(_gte_readMac_, macType)(out)
96+
#define gte_loadIR(in, irType) CAT(_gte_loadIR_, irType)(in)
97+
#define gte_loadSVec(v, vecType) CAT(_gte_loadSVec_, vecType)(v)
6398
#define gte_loadVec(v, vecType) CAT(_gte_loadVec_, vecType)(v)
6499
#define gte_loadRowMatrix(v, rowIndex, matrixType) CAT3(_gte_loadSVecMatrix_, matrixType, _##rowIndex)(v)
65100
#define gte_mulMatrixVec(out, matrixType, vecType) _gte_mulMatrixVec(out, matrixType, vecType, 1)
66-
#define gte_dotProduct(out, rowIndex, matrixType, vecType) CAT(_gte_dotProduct_, rowIndex)(out, matrixType, vecType)
101+
#define gte_dotProduct(out, rowIndex, matrixType, vecType) CAT(_gte_dotProduct_, rowIndex)(out, matrixType, vecType)
102+
#define gte_leadingZeroes(out, in) _gte_leadingZeroes(out, in)
103+
#define gte_interpolate(interpolationType) CAT(_gte_interpolate_, interpolationType)()

include/ctr/nd.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,7 @@ void ND_MATH_MatrixMultiplication(Matrix* out, const Matrix* m, const Matrix* n)
2323
u32 ND_RNG_Rand();
2424
s32 ND_RNG_RandInt(u32 n);
2525
u16 ND_RNG_PseudoRand(u16 n);
26-
u32 ND_RNG_Random(RNGSeed* seed);
26+
u32 ND_RNG_Random(RNGSeed* seed);
27+
28+
/* COLL */
29+
void ND_COLL_ProjectPointToEdge(SVec3* out, const SVec3* v1, const SVec3* v2, const SVec3* point);

include/ctr/test.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <ctr/game_tracker.h>
77
#include <ctr/math.h>
88
#include <ctr/rng.h>
9+
#include <ctr/coll.h>
910

1011
void LoadTestPatches();
1112
u32 PatchFunction_Beg(u32* index);
@@ -17,6 +18,7 @@ u32 PrintMatrixDiff(const char* name, const Matrix* expected, const Matrix* ret,
1718

1819
#define TEST_MATH_IMPL
1920
#define TEST_RNG_IMPL
21+
#define TEST_COLL_IMPL
2022

2123
#ifdef TEST_MATH_IMPL
2224
void TEST_MATH_Sin(u32 angle, s32 ret);
@@ -52,4 +54,10 @@ u32 PrintMatrixDiff(const char* name, const Matrix* expected, const Matrix* ret,
5254
#define TEST_RNG_RandInt(n, ret)
5355
#define TEST_RNG_PseudoRand(n, ret)
5456
#define TEST_RNG_Random(seed, ret)
57+
#endif
58+
59+
#ifdef TEST_COLL_IMPL
60+
void TEST_COLL_ProjectPointToEdge(const SVec3* v1, const SVec3* v2, const SVec3* point, const SVec3* ret);
61+
#else
62+
#define TEST_COLL_ProjectPointToEdge(out, v1, v2, point)
5563
#endif

rewrite/src/exe/coll.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include <ctr/coll.h>
2+
#include <ctr/gte.h>
3+
#include <ctr/test.h>
4+
5+
/* Address: 0x8001ede4 */
6+
void COLL_ProjectPointToEdge(SVec3* out, const SVec3* v1, const SVec3* v2, const SVec3* point)
7+
{
8+
const SVec3 edge = { v2->x - v1->x, v2->y - v1->y, v2->z - v1->z };
9+
const Matrix m =
10+
{
11+
.m[0][0] = edge.x, .m[0][1] = edge.y, .m[0][2] = edge.z,
12+
.m[1][0] = point->x - v1->x, .m[1][1] = point->y - v1->y, .m[1][2] = point->z - v1->z,
13+
};
14+
gte_SetRotMatrix(m.m);
15+
gte_loadSVec(edge.v, GTE_VECTOR_0);
16+
s32 edgeDot, pointDot;
17+
gte_dotProduct(&edgeDot, GTE_ROW_INDEX_0, GTE_MATRIX_ROT, GTE_VECTOR_0);
18+
gte_readMac(&pointDot, GTE_MAC_2);
19+
s32 leadingZeroes;
20+
gte_leadingZeroes(&leadingZeroes, pointDot);
21+
22+
const s32 shift = clamp(leadingZeroes - 2, 0, FRACTIONAL_BITS);
23+
if (shift < FRACTIONAL_BITS) { edgeDot >>= (FRACTIONAL_BITS - shift); }
24+
25+
s32 barycentricFactor = 0;
26+
if (edgeDot != 0) { barycentricFactor = clamp((pointDot << shift) / edgeDot, 0, FP_ONE); }
27+
28+
const Vec3 V1 = { .x = v1->x, .y = v1->y, .z = v1->z };
29+
gte_loadIR(barycentricFactor, GTE_IR_0);
30+
gte_loadSVec(edge.v, GTE_VECTOR_IR);
31+
gte_loadVec(V1.v, GTE_VECTOR_MAC);
32+
gte_interpolate(GTE_INTERPOLATE_FLOATING_POINT);
33+
Vec3 coords;
34+
gte_readMac(coords.v, GTE_VECTOR_MAC);
35+
out->x = coords.x;
36+
out->y = coords.y;
37+
out->z = coords.z;
38+
TEST_COLL_ProjectPointToEdge(v1, v2, point, out);
39+
}

rewrite/src/exe/math.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void MATH_GetInverseMatrixTransformation(Matrix* out, const Matrix* matrix)
7171
}
7272
const SVec3 t = { .x = (-matrix->t.x) & 0xFFFF, .y = (-matrix->t.y) & 0xFFFF, .z = (-matrix->t.z) & 0xFFFF };
7373
gte_SetRotMatrix(out->m);
74-
gte_loadVec(&t, GTE_VECTOR_0);
74+
gte_loadSVec(&t, GTE_VECTOR_0);
7575
gte_mulMatrixVec(out->t.v, GTE_MATRIX_ROT, GTE_VECTOR_0);
7676
TEST_MATH_GetInverseMatrixTransformation(matrix, out);
7777
}
@@ -80,7 +80,7 @@ void MATH_GetInverseMatrixTransformation(Matrix* out, const Matrix* matrix)
8080
s32 MATH_VectorLength(const SVec3* vector)
8181
{
8282
gte_loadRowMatrix(vector, GTE_ROW_INDEX_0, GTE_MATRIX_ROT);
83-
gte_loadVec(vector, GTE_VECTOR_0);
83+
gte_loadSVec(vector, GTE_VECTOR_0);
8484
s32 lengthSquared;
8585
gte_dotProduct(&lengthSquared, GTE_ROW_INDEX_0, GTE_MATRIX_ROT, GTE_VECTOR_0);
8686
const s32 len = ND_SquareRoot0_stub(lengthSquared);
@@ -142,11 +142,11 @@ void MATH_MatrixMultiplication(Matrix* out, const Matrix* m, const Matrix* n)
142142
const SVec3 v1 = { .x = n->m[0][1], .y = n->m[1][1], .z = n->m[2][1] };
143143
const SVec3 v2 = { .x = n->m[0][2], .y = n->m[1][2], .z = n->m[2][2] };
144144
gte_SetRotMatrix(m->m);
145-
gte_loadVec(&v0, GTE_VECTOR_0);
145+
gte_loadSVec(&v0, GTE_VECTOR_0);
146146
gte_mulMatrixVec(res[0].v, GTE_MATRIX_ROT, GTE_VECTOR_0);
147-
gte_loadVec(&v1, GTE_VECTOR_1);
147+
gte_loadSVec(&v1, GTE_VECTOR_1);
148148
gte_mulMatrixVec(res[1].v, GTE_MATRIX_ROT, GTE_VECTOR_1);
149-
gte_loadVec(&v2, GTE_VECTOR_2);
149+
gte_loadSVec(&v2, GTE_VECTOR_2);
150150
gte_mulMatrixVec(res[2].v, GTE_MATRIX_ROT, GTE_VECTOR_2);
151151
out->m[0][0] = res[0].x; out->m[0][1] = res[1].x; out->m[0][2] = res[2].x;
152152
out->m[1][0] = res[0].y; out->m[1][1] = res[1].y; out->m[1][2] = res[2].y;

rewrite/src/tests/test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ FunctionPatch s_functions[] =
2929
TEST_FUNC(RNG_RandInt),
3030
TEST_FUNC(RNG_PseudoRand),
3131
TEST_FUNC(RNG_Random),
32+
TEST_FUNC(COLL_ProjectPointToEdge),
3233
};
3334

3435
void LoadTestPatches()

rewrite/src/tests/test_coll.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include <ctr/test.h>
2+
3+
#ifdef TEST_COLL_IMPL
4+
5+
void TEST_COLL_ProjectPointToEdge(const SVec3* v1, const SVec3* v2, const SVec3* point, const SVec3* ret)
6+
{
7+
const u32 index = PatchFunction_Beg((u32*)(&ND_COLL_ProjectPointToEdge));
8+
SVec3 expected;
9+
ND_COLL_ProjectPointToEdge(&expected, v1, v2, point);
10+
PrintSVectorDiff("COLL_ProjectPointToEdge", &expected, ret);
11+
PatchFunction_End(index);
12+
}
13+
14+
#endif // TEST_COLL_IMPL

symbols/gcc-syms-rewrite.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ ND_COLL_FIXED_BotsSearch = 0x8001d77c;
6161
ND_COLL_FIXED_PlayerSearch = 0x8001d944;
6262
ND_COLL_SearchBSP_CallbackQUADBLK = 0x8001eb0c;
6363
ND_COLL_SearchBSP_CallbackPARAM = 0x8001ebec;
64-
ND_COLL_FIXED_TRIANGL_Barycentrics = 0x8001ede4;
64+
ND_COLL_ProjectPointToEdge = 0x8001ede4;
6565
ND_COLL_FIXED_TRIANGL_TestPoint = 0x8001ef50;
6666
ND_COLL_FIXED_TRIANGL_GetNormVec = 0x8001f2dc;
6767
ND_COLL_FIXED_QUADBLK_TestTriangles = 0x8001f41c;

0 commit comments

Comments
 (0)