2023-12-09 21:53:24 +03:00
|
|
|
#include "global.h"
|
|
|
|
|
|
|
|
#include "fox_A4290_colheaders.c"
|
|
|
|
|
2024-04-03 02:20:08 +03:00
|
|
|
bool func_col2_800A36FC(Vec3f* objPos, Vec3f* colliderPos, CollisionHeader2* colHeader, Vec3f* hitDataOut);
|
|
|
|
bool func_col2_800A3A74(Vec3f* point, Vec3f** tri, Vec3f* normOut);
|
2023-12-09 21:53:24 +03:00
|
|
|
|
2024-04-03 02:20:08 +03:00
|
|
|
bool func_col2_800A3690(Vec3f* objPos, Vec3f* colliderPos, s32 colId, Vec3f* hitDataOut) {
|
|
|
|
return func_col2_800A36FC(objPos, colliderPos, SEGMENTED_TO_VIRTUAL(&D_800D2CA0[colId]), hitDataOut);
|
2023-12-09 21:53:24 +03:00
|
|
|
}
|
|
|
|
|
2024-04-03 02:20:08 +03:00
|
|
|
bool func_col2_800A36FC(Vec3f* objPos, Vec3f* colliderPos, CollisionHeader2* colHeader, Vec3f* hitDataOut) {
|
2024-03-12 22:46:25 +03:00
|
|
|
Vec3f objRelPos;
|
2024-03-27 23:06:28 +03:00
|
|
|
PlaneF triPlane;
|
2024-01-03 00:33:26 +03:00
|
|
|
bool above;
|
2023-12-09 21:53:24 +03:00
|
|
|
s32 i;
|
|
|
|
s32 j;
|
2024-01-03 00:33:26 +03:00
|
|
|
Vec3f* tri[3];
|
|
|
|
Vec3f norm;
|
|
|
|
Vec3f vtx;
|
2023-12-09 21:53:24 +03:00
|
|
|
s32 sp38 = false;
|
2024-01-03 00:33:26 +03:00
|
|
|
s32 count;
|
|
|
|
Triangle* polys;
|
|
|
|
Vec3f* mesh;
|
2023-12-09 21:53:24 +03:00
|
|
|
|
2024-03-12 22:46:25 +03:00
|
|
|
objRelPos.x = objPos->x - colliderPos->x;
|
|
|
|
objRelPos.y = objPos->y - colliderPos->y;
|
|
|
|
objRelPos.z = objPos->z - colliderPos->z;
|
|
|
|
if ((objRelPos.x < colHeader->min.x) || (objRelPos.y < colHeader->min.y) || (objRelPos.z < colHeader->min.z) ||
|
|
|
|
(colHeader->max.x < objRelPos.x) || (colHeader->max.y < objRelPos.y) || (colHeader->max.z < objRelPos.z)) {
|
2023-12-09 21:53:24 +03:00
|
|
|
return false;
|
|
|
|
}
|
2024-01-03 00:33:26 +03:00
|
|
|
above = false;
|
2024-03-12 22:46:25 +03:00
|
|
|
count = colHeader->polyCount;
|
|
|
|
polys = SEGMENTED_TO_VIRTUAL(colHeader->polys);
|
|
|
|
mesh = SEGMENTED_TO_VIRTUAL(colHeader->mesh);
|
2024-01-03 00:33:26 +03:00
|
|
|
for (i = 0; i < count; i++, polys++) {
|
2023-12-09 21:53:24 +03:00
|
|
|
for (j = 0; j < 3; j++) {
|
2024-01-03 00:33:26 +03:00
|
|
|
tri[j] = &mesh[polys->vtx[j]];
|
2023-12-09 21:53:24 +03:00
|
|
|
}
|
2024-04-03 02:20:08 +03:00
|
|
|
above = func_col2_800A3A74(&objRelPos, tri, &norm);
|
2024-01-03 00:33:26 +03:00
|
|
|
if (above) {
|
2023-12-09 21:53:24 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2024-01-03 00:33:26 +03:00
|
|
|
if (above) {
|
|
|
|
vtx.x = tri[0]->x;
|
|
|
|
vtx.y = tri[0]->y;
|
|
|
|
vtx.z = tri[0]->z;
|
2024-04-03 02:20:08 +03:00
|
|
|
func_col1_80098860(&triPlane, &vtx, &norm);
|
|
|
|
hitDataOut->y = func_col1_800988B4(&objRelPos, &triPlane);
|
2024-01-03 00:33:26 +03:00
|
|
|
if (triPlane.normal.x != 0.0f) {
|
|
|
|
norm.x = -triPlane.dist / triPlane.normal.x;
|
2023-12-09 21:53:24 +03:00
|
|
|
} else {
|
2024-01-03 00:33:26 +03:00
|
|
|
norm.x = 0.0f;
|
2023-12-09 21:53:24 +03:00
|
|
|
}
|
2024-01-03 00:33:26 +03:00
|
|
|
if (triPlane.normal.y != 0.0f) {
|
|
|
|
norm.y = -triPlane.dist / triPlane.normal.y;
|
2023-12-09 21:53:24 +03:00
|
|
|
} else {
|
2024-01-03 00:33:26 +03:00
|
|
|
norm.y = 0.0f;
|
2023-12-09 21:53:24 +03:00
|
|
|
}
|
2024-01-03 00:33:26 +03:00
|
|
|
if (triPlane.normal.z != 0.0f) {
|
|
|
|
norm.z = -triPlane.dist / triPlane.normal.z;
|
2023-12-09 21:53:24 +03:00
|
|
|
} else {
|
2024-01-03 00:33:26 +03:00
|
|
|
norm.z = 0.0f;
|
2023-12-09 21:53:24 +03:00
|
|
|
}
|
2024-03-12 22:46:25 +03:00
|
|
|
hitDataOut->x = Math_Atan2F_XY(norm.y, norm.z);
|
2024-01-03 00:33:26 +03:00
|
|
|
if (norm.z != 0.0f) {
|
2024-03-12 22:46:25 +03:00
|
|
|
hitDataOut->z = -Math_Atan2F_XY(__sinf(Math_Atan2F_XY(norm.y, norm.z)) * norm.z, norm.x);
|
|
|
|
} else if (hitDataOut->x >= M_PI) {
|
|
|
|
hitDataOut->z = Math_Atan2F_XY(norm.y, norm.x);
|
2023-12-09 21:53:24 +03:00
|
|
|
} else {
|
2024-03-12 22:46:25 +03:00
|
|
|
hitDataOut->z = -Math_Atan2F_XY(norm.y, norm.x);
|
2023-12-09 21:53:24 +03:00
|
|
|
}
|
2024-03-12 22:46:25 +03:00
|
|
|
if ((objPos->y - hitDataOut->y <= 0.0f) || (gCurrentLevel == LEVEL_MACBETH)) {
|
2023-12-09 21:53:24 +03:00
|
|
|
sp38 = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return sp38;
|
|
|
|
}
|
|
|
|
|
2024-03-12 22:46:25 +03:00
|
|
|
// Checks if point is above the triangle tri. If so, puts the triangle normal in normOut
|
2024-04-03 02:20:08 +03:00
|
|
|
bool func_col2_800A3A74(Vec3f* point, Vec3f** tri, Vec3f* normOut) {
|
2023-12-09 21:53:24 +03:00
|
|
|
s32 pad;
|
|
|
|
f32 temp1;
|
2024-01-03 00:33:26 +03:00
|
|
|
bool ret = false;
|
2023-12-09 21:53:24 +03:00
|
|
|
f32 temp_fv0;
|
2024-01-03 00:33:26 +03:00
|
|
|
Vec3f vtx1;
|
|
|
|
Vec3f vtx2;
|
|
|
|
Vec3f vtx3;
|
|
|
|
f32 ptx;
|
|
|
|
f32 ptz;
|
2023-12-09 21:53:24 +03:00
|
|
|
|
2024-01-03 00:33:26 +03:00
|
|
|
vtx1.x = (*tri)->x;
|
|
|
|
vtx1.y = (*tri)->y;
|
|
|
|
vtx1.z = (*tri)->z;
|
|
|
|
tri++;
|
|
|
|
vtx2.x = (*tri)->x;
|
|
|
|
vtx2.y = (*tri)->y;
|
|
|
|
vtx2.z = (*tri)->z;
|
|
|
|
tri++;
|
|
|
|
vtx3.x = (*tri)->x;
|
|
|
|
vtx3.y = (*tri)->y;
|
|
|
|
vtx3.z = (*tri)->z;
|
|
|
|
tri++;
|
2023-12-09 21:53:24 +03:00
|
|
|
|
2024-01-03 00:33:26 +03:00
|
|
|
ptx = point->x;
|
|
|
|
ptz = point->z;
|
|
|
|
temp1 = ((vtx2.z - vtx1.z) * (ptx - vtx2.x)) - ((vtx2.x - vtx1.x) * (ptz - vtx2.z));
|
2023-12-09 21:53:24 +03:00
|
|
|
if (temp1 >= 0.0f) {
|
2024-01-03 00:33:26 +03:00
|
|
|
if (((vtx3.x - vtx2.x) * (ptz - vtx3.z)) <= ((vtx3.z - vtx2.z) * (ptx - vtx3.x))) {
|
|
|
|
if (((vtx1.x - vtx3.x) * (ptz - vtx1.z)) <= ((vtx1.z - vtx3.z) * (ptx - vtx1.x))) {
|
|
|
|
ret = true;
|
2024-03-12 22:46:25 +03:00
|
|
|
normOut->x = ((vtx2.y - vtx1.y) * (vtx3.z - vtx2.z)) - ((vtx2.z - vtx1.z) * (vtx3.y - vtx2.y));
|
|
|
|
normOut->y = ((vtx2.z - vtx1.z) * (vtx3.x - vtx2.x)) - ((vtx2.x - vtx1.x) * (vtx3.z - vtx2.z));
|
|
|
|
normOut->z = ((vtx2.x - vtx1.x) * (vtx3.y - vtx2.y)) - ((vtx2.y - vtx1.y) * (vtx3.x - vtx2.x));
|
|
|
|
if ((normOut->x != 0.0f) || (normOut->y != 0.0f) || (normOut->z != 0.0f)) {
|
|
|
|
temp_fv0 = VEC3F_MAG(normOut);
|
2023-12-09 21:53:24 +03:00
|
|
|
if (temp_fv0 != 0) {
|
2024-03-12 22:46:25 +03:00
|
|
|
normOut->x = (normOut->x / temp_fv0) * 127.0f;
|
|
|
|
normOut->y = (normOut->y / temp_fv0) * 127.0f;
|
|
|
|
normOut->z = (normOut->z / temp_fv0) * 127.0f;
|
2023-12-09 21:53:24 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-01-03 00:33:26 +03:00
|
|
|
return ret;
|
2023-12-09 21:53:24 +03:00
|
|
|
}
|