Skip to content

Commit 64d289c

Browse files
committed
load vertice data decompiled
1 parent 87b0252 commit 64d289c

7 files changed

Lines changed: 60 additions & 5 deletions

File tree

include/ctr/coll.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ typedef struct CollVertex
2727
{
2828
SVec3 pos;
2929
u16 normalDominantAxis;
30-
Vertex* levVertex;
30+
const Vertex* levVertex;
3131
SVec3 triNormal;
3232
u16 planeDist;
3333
} CollVertex;
@@ -93,7 +93,7 @@ typedef struct CollDCache
9393
SVec3 distInterpolationIntersection;
9494
s16 unk7;
9595
u16 quadblockThirdIndex;
96-
u16 quadblockFouthIndex;
96+
u16 quadblockFourthIndex;
9797
CollVertex quadblockCollVertices[NUM_VERTICES_QUADBLOCK];
9898
u32 stepFlags;
9999
s16 normalScale;
@@ -104,4 +104,5 @@ typedef struct CollDCache
104104
#define DCACHE_COLL (*(CollDCache*) 0x1f800000)
105105

106106
void COLL_ProjectPointToEdge(SVec3* out, const SVec3* v1, const SVec3* v2, const SVec3* point);
107+
void COLL_LoadVerticeData(CollDCache* cache);
107108
s32 COLL_BarycentricTest(TestVertex* t, const CollVertex* v1, const CollVertex* v2, const CollVertex* v3);

include/ctr/nd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ u32 ND_RNG_Random(RNGSeed* seed);
2929

3030
/* COLL */
3131
void ND_COLL_ProjectPointToEdge(SVec3* out, const SVec3* v1, const SVec3* v2, const SVec3* point);
32+
void ND_COLL_LoadVerticeData(CollDCache* cache);
3233
s32 ND_COLL_BarycentricTest(TestVertex* t, const CollVertex* v1, const CollVertex* v2, const CollVertex* v3);

include/ctr/test.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ force_inline void FlushCache()
6666

6767
#ifdef TEST_COLL_IMPL
6868
void TEST_COLL_ProjectPointToEdge(const SVec3* v1, const SVec3* v2, const SVec3* point, const SVec3* ret);
69+
void TEST_COLL_LoadVerticeData(CollDCache* cache);
6970
void TEST_COLL_BarycentricTest(TestVertex* t, const CollVertex* v1, const CollVertex* v2, const CollVertex* v3, const SVec3* pos, s32 ret);
7071
#else
7172
#define TEST_COLL_ProjectPointToEdge(out, v1, v2, point)
73+
#define TEST_COLL_LoadVerticeData(cache)
7274
#define TEST_COLL_BarycentricTest(t, v1, v2, v3, pos, ret)
7375
#endif

rewrite/src/exe/coll.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,33 @@ void COLL_ProjectPointToEdge(SVec3* out, const SVec3* v1, const SVec3* v2, const
3636
out->y = coords.y;
3737
out->z = coords.z;
3838
TEST_COLL_ProjectPointToEdge(v1, v2, point, out);
39-
#ifdef TEST_COLL_IMPL
4039
/* This is a hand written assembly function that breaks the ABI,
4140
and some callers expect the argument registers to be untouched*/
4241
__asm__ volatile("move $a0, %0" : : "r"((u32)out));
4342
__asm__ volatile("move $a1, %0" : : "r"((u32)v1));
4443
__asm__ volatile("move $a2, %0" : : "r"((u32)v2));
4544
__asm__ volatile("move $a3, %0" : : "r"((u32)point));
46-
#endif
45+
}
46+
47+
/* Address: 0x8001f7f0 */
48+
void COLL_LoadVerticeData(CollDCache* cache)
49+
{
50+
const Quadblock* quadblock = cache->currQuadblock;
51+
const Vertex* vertices = cache->meshInfo->vertices;
52+
for (u32 i = 0; i < NUM_VERTICES_QUADBLOCK; i++)
53+
{
54+
u16 index = quadblock->index[i];
55+
const Vertex* vertex = &vertices[index];
56+
cache->quadblockCollVertices[i].pos = vertex->pos;
57+
cache->quadblockCollVertices[i].levVertex = vertex;
58+
}
59+
cache->quadblockThirdIndex = quadblock->index[2];
60+
cache->quadblockFourthIndex = quadblock->index[3];
61+
TEST_COLL_LoadVerticeData(cache);
62+
/* This is a hand written assembly function that breaks the ABI,
63+
and some callers expect the argument registers to be untouched*/
64+
__asm__ volatile("move $a0, %0" : : "r"((u32)cache));
65+
__asm__ volatile("move $t9, %0" : : "r"((u32)quadblock));
4766
}
4867

4968
/* Address: 0x8001f928 */

rewrite/src/tests/test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ FunctionPatch s_functions[] =
3131
TEST_FUNC(RNG_Random),
3232
TEST_FUNC(COLL_ProjectPointToEdge),
3333
TEST_FUNC(COLL_BarycentricTest),
34+
TEST_FUNC(COLL_LoadVerticeData),
3435
};
3536

3637
void LoadTestPatches()

rewrite/src/tests/test_coll.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,37 @@ void TEST_COLL_ProjectPointToEdge(const SVec3* v1, const SVec3* v2, const SVec3*
1313
PatchFunction_End(index);
1414
}
1515

16+
void TEST_COLL_LoadVerticeData(CollDCache* cache)
17+
{
18+
CollVertex vertices[NUM_VERTICES_QUADBLOCK];
19+
for (u32 i = 0; i < NUM_VERTICES_QUADBLOCK; i++)
20+
{
21+
vertices[i] = cache->quadblockCollVertices[i];
22+
}
23+
const u16 thirdIndex = cache->quadblockThirdIndex;
24+
const u16 fourthIndex = cache->quadblockFourthIndex;
25+
const u32 index = PatchFunction_Beg((u32*)(&ND_COLL_LoadVerticeData));
26+
27+
const u32 quadblock = (u32) cache->currQuadblock;
28+
const u32 levVertices = (u32) cache->meshInfo->vertices;
29+
__asm__ volatile("move $t9, %0" : : "r"(quadblock));
30+
__asm__ volatile("move $t8, %0" : : "r"(levVertices));
31+
32+
typedef void (*Func)(CollDCache* cache);
33+
Func func = (Func) TEST_WRAPPER;
34+
func(cache);
35+
for (u32 i = 0; i < NUM_VERTICES_QUADBLOCK; i++)
36+
{
37+
PrintSVectorDiff("COLL_LoadVerticeData", &cache->quadblockCollVertices[i].pos, &vertices[i].pos);
38+
if (cache->quadblockCollVertices[i].levVertex != vertices[i].levVertex)
39+
{
40+
ND_printf("[COLL_LoadVerticeData] Test Failed: levVertex at index %d\n", i);
41+
}
42+
}
43+
if (cache->quadblockThirdIndex != thirdIndex) { ND_printf("[COLL_LoadVerticeData] Test Failed:\nthirdIndex: %d\nResult:%d\n", cache->quadblockThirdIndex, thirdIndex); }
44+
if (cache->quadblockFourthIndex != fourthIndex) { ND_printf("[COLL_LoadVerticeData] Test Failed:\nfourthIndex: %d\nResult:%d\n", cache->quadblockFourthIndex, fourthIndex);}
45+
PatchFunction_End(index);
46+
}
1647

1748
void TEST_COLL_BarycentricTest(TestVertex* t, const CollVertex* v1, const CollVertex* v2, const CollVertex* v3, const SVec3* pos, s32 ret)
1849
{

symbols/gcc-syms-rewrite.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ ND_COLL_FIXED_QUADBLK_TestTriangles = 0x8001f41c;
6868
ND_COLL_FIXED_BSPLEAF_TestQuadblocks = 0x8001f5f0;
6969
ND_COLL_FIXED_QUADBLK_GetNormVecs_LoLOD = 0x8001f67c;
7070
ND_COLL_FIXED_QUADBLK_GetNormVecs_HiLOD = 0x8001f6f0;
71-
ND_COLL_FIXED_QUADBLK_LoadScratchpadVerts = 0x8001f7f0;
71+
ND_COLL_LoadVerticeData = 0x8001f7f0;
7272
ND_COLL_BarycentricTest = 0x8001f928;
7373
ND_COLL_MOVED_TRIANGL_TestPoint = 0x8001fc40;
7474
ND_COLL_MOVED_QUADBLK_TestTriangles = 0x80020064;

0 commit comments

Comments
 (0)