mirror of
https://github.com/zeldaret/mm.git
synced 2026-07-08 13:26:14 -04:00
sys_math3d.c Decompiled and Mostly Documented (#1450)
* Use matched sys_math3d functions by Tharo Co-authored-by: Tharo <17233964+Thar0@users.noreply.github.com> * kinda match some unattempted functions * move sys_math3d function declarations to z64math.h * Rename some simple functions * Take matched Math3D_LineVsLineClosestTwoPoints from OoT * minor fixes to make stuff actually equivalent * func_8017FB1C * format * minor cleanup * Math3D_PointOnDirectedLine * func_8017FB1C documentation Co-authored-by: EllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com> * Remove actorfixer * fix merge * Apply renames * more cleanup * bss cleanup * match Math3D_CylVsLineSeg * WIP * OK * small cleanup * Remove macros.h from sys_math3d * Small cleanup * Some more small clean up * cleanup and docs * cleanup * PR Review * cleanup * fix merge * fix merge * merge main * fix bss * bss * fix * PR Review * bss fix * Merge main * Fix bss * Fix merge * Add zero vecs to sys_math3d * Format * namefixer run --------- Co-authored-by: angie <angheloalf95@gmail.com> Co-authored-by: Tharo <17233964+Thar0@users.noreply.github.com> Co-authored-by: EllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com> Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>
This commit is contained in:
+2464
-189
File diff suppressed because it is too large
Load Diff
+9
-9
@@ -4141,7 +4141,7 @@ void Actor_GetClosestPosOnPath(Vec3s* points, s32 numPoints, Vec3f* srcPos, Vec3
|
||||
|
||||
// Find the point closest to srcPos
|
||||
for (pointIndex = 0; pointIndex < numPoints; pointIndex++) {
|
||||
distSq = Math3D_XZDistanceSquared(srcPos->x, srcPos->z, points[pointIndex].x, points[pointIndex].z);
|
||||
distSq = Math3D_Dist2DSq(srcPos->x, srcPos->z, points[pointIndex].x, points[pointIndex].z);
|
||||
if (distSq < closestPointDistSq) {
|
||||
closestPointDistSq = distSq;
|
||||
closestPointIndex = pointIndex;
|
||||
@@ -4166,8 +4166,8 @@ void Actor_GetClosestPosOnPath(Vec3s* points, s32 numPoints, Vec3f* srcPos, Vec3
|
||||
if ((closestPointIndex != 0) || isPathLoop) {
|
||||
// Use the adjacent line
|
||||
useAdjacentLines[0] =
|
||||
Math3D_PointDistToLine2D(srcPos->x, srcPos->z, closestPointPrev.x, closestPointPrev.z, closestPoint.x,
|
||||
closestPoint.z, &closestPos[0].x, &closestPos[0].z, &distSq);
|
||||
Math3D_PointDistSqToLine2DImpl(srcPos->x, srcPos->z, closestPointPrev.x, closestPointPrev.z, closestPoint.x,
|
||||
closestPoint.z, &closestPos[0].x, &closestPos[0].z, &distSq);
|
||||
}
|
||||
|
||||
// Analyze point on path immediately next to the closest point
|
||||
@@ -4183,8 +4183,8 @@ void Actor_GetClosestPosOnPath(Vec3s* points, s32 numPoints, Vec3f* srcPos, Vec3
|
||||
}
|
||||
if ((closestPointIndex + 1 != numPoints) || isPathLoop) {
|
||||
useAdjacentLines[1] =
|
||||
Math3D_PointDistToLine2D(srcPos->x, srcPos->z, closestPoint.x, closestPoint.z, closestPointNext.x,
|
||||
closestPointNext.z, &closestPos[1].x, &closestPos[1].z, &distSq);
|
||||
Math3D_PointDistSqToLine2DImpl(srcPos->x, srcPos->z, closestPoint.x, closestPoint.z, closestPointNext.x,
|
||||
closestPointNext.z, &closestPos[1].x, &closestPos[1].z, &distSq);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4202,7 +4202,7 @@ void Actor_GetClosestPosOnPath(Vec3s* points, s32 numPoints, Vec3f* srcPos, Vec3
|
||||
for (i = 0; i < ARRAY_COUNT(loopDistSq); i++) {
|
||||
if (useAdjacentLines[i]) {
|
||||
// Get distSq from srcPos to closestPos
|
||||
loopDistSq[i] = Math3D_XZDistanceSquared(srcPos->x, srcPos->z, closestPos[i].x, closestPos[i].z);
|
||||
loopDistSq[i] = Math3D_Dist2DSq(srcPos->x, srcPos->z, closestPos[i].x, closestPos[i].z);
|
||||
} else {
|
||||
// The closest Pos is not contained within the line-segment
|
||||
loopDistSq[i] = SQ(40000.0f);
|
||||
@@ -4221,9 +4221,9 @@ void Actor_GetClosestPosOnPath(Vec3s* points, s32 numPoints, Vec3f* srcPos, Vec3
|
||||
// srcPos is somewhere withing the bend of the path
|
||||
if (!isRightSideOfAdjacentLines[0] && !isRightSideOfAdjacentLines[1]) {
|
||||
// srcPos is not inside a loop
|
||||
if (!Math3D_PointDistToLine2D(srcPos->x, srcPos->z, closestPos[0].x, closestPos[0].z, closestPos[1].x,
|
||||
closestPos[1].z, &dstPos->x, &dstPos->z, &distSq)) {
|
||||
// The dstPos calculated in Math3D_PointDistToLine2D was not valid.
|
||||
if (!Math3D_PointDistSqToLine2DImpl(srcPos->x, srcPos->z, closestPos[0].x, closestPos[0].z, closestPos[1].x,
|
||||
closestPos[1].z, &dstPos->x, &dstPos->z, &distSq)) {
|
||||
// The dstPos calculated in Math3D_PointDistSqToLine2DImpl was not valid.
|
||||
// Take the midpoint of the two closest ponits instead
|
||||
dstPos->x = (closestPos[1].x + closestPos[0].x) * 0.5f;
|
||||
dstPos->z = (closestPos[1].z + closestPos[0].z) * 0.5f;
|
||||
|
||||
+10
-10
@@ -355,14 +355,14 @@ s32 CollisionPoly_CheckYIntersect(CollisionPoly* poly, Vec3s* vtxList, f32 x, f3
|
||||
D_801EDA18[2].y = sVerts->y;
|
||||
D_801EDA18[2].z = sVerts->z;
|
||||
|
||||
if (!func_8017A304(&D_801EDA18[0], &D_801EDA18[1], &D_801EDA18[2], z, x, checkDist)) {
|
||||
if (!Math3D_CirSquareVsTriSquareZX(&D_801EDA18[0], &D_801EDA18[1], &D_801EDA18[2], z, x, checkDist)) {
|
||||
return 0;
|
||||
}
|
||||
nx = COLPOLY_GET_NORMAL(poly->normal.x);
|
||||
ny = COLPOLY_GET_NORMAL(poly->normal.y);
|
||||
nz = COLPOLY_GET_NORMAL(poly->normal.z);
|
||||
return Math3D_TriChkPointParaYIntersectInsideTri2(&D_801EDA18[0], &D_801EDA18[1], &D_801EDA18[2], nx, ny, nz,
|
||||
poly->dist, z, x, yIntersect, checkDist);
|
||||
return Math3D_TriChkPointParaYNoRangeCheckIntersectInsideTri(&D_801EDA18[0], &D_801EDA18[1], &D_801EDA18[2], nx, ny,
|
||||
nz, poly->dist, z, x, yIntersect, checkDist);
|
||||
}
|
||||
|
||||
s32 CollisionPoly_CheckYIntersectApprox2(CollisionPoly* poly, Vec3s* vtxList, f32 x, f32 z, f32* yIntersect) {
|
||||
@@ -425,17 +425,17 @@ s32 CollisionPoly_LineVsPoly(BgLineVsPolyTest* a0) {
|
||||
|
||||
CollisionPoly_GetNormalF(a0->poly, &sPlane.normal.x, &sPlane.normal.y, &sPlane.normal.z);
|
||||
CollisionPoly_GetVertices(a0->poly, a0->vtxList, sPolyVerts);
|
||||
Math3D_Lerp(a0->posA, a0->posB, planeDistA / (planeDistA - planeDistB), a0->planeIntersect);
|
||||
Math3D_LineSplitRatio(a0->posA, a0->posB, planeDistA / (planeDistA - planeDistB), a0->planeIntersect);
|
||||
|
||||
if (((fabsf(sPlane.normal.x) > 0.5f) &&
|
||||
Math3D_TriChkPointParaXDist(&sPolyVerts[0], &sPolyVerts[1], &sPolyVerts[2], a0->planeIntersect->y,
|
||||
Math3D_TriChkPointParaXImpl(&sPolyVerts[0], &sPolyVerts[1], &sPolyVerts[2], a0->planeIntersect->y,
|
||||
a0->planeIntersect->z, 0.0f, a0->checkDist, sPlane.normal.x)) ||
|
||||
((fabsf(sPlane.normal.y) > 0.5f) &&
|
||||
Math3D_TriChkPointParaYDist(&sPolyVerts[0], &sPolyVerts[1], &sPolyVerts[2], a0->planeIntersect->z,
|
||||
Math3D_TriChkPointParaYImpl(&sPolyVerts[0], &sPolyVerts[1], &sPolyVerts[2], a0->planeIntersect->z,
|
||||
a0->planeIntersect->x, 0.0f, a0->checkDist, sPlane.normal.y)) ||
|
||||
((fabsf(sPlane.normal.z) > 0.5f) &&
|
||||
Math3D_TriChkLineSegParaZDist(&sPolyVerts[0], &sPolyVerts[1], &sPolyVerts[2], a0->planeIntersect->x,
|
||||
a0->planeIntersect->y, 0.0f, a0->checkDist, sPlane.normal.z))) {
|
||||
Math3D_TriChkPointParaZImpl(&sPolyVerts[0], &sPolyVerts[1], &sPolyVerts[2], a0->planeIntersect->x,
|
||||
a0->planeIntersect->y, 0.0f, a0->checkDist, sPlane.normal.z))) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -453,7 +453,7 @@ s32 CollisionPoly_SphVsPoly(CollisionPoly* poly, Vec3s* vtxList, Vec3f* center,
|
||||
sSphere.center.y = center->y;
|
||||
sSphere.center.z = center->z;
|
||||
sSphere.radius = radius;
|
||||
return Math3D_ColSphereTri(&sSphere, &sTri, &intersect);
|
||||
return Math3D_TriVsSphIntersect(&sSphere, &sTri, &intersect);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3825,7 +3825,7 @@ s32 BgCheck_CheckLineAgainstDyna(CollisionContext* colCtx, u16 xpFlags, Vec3f* p
|
||||
s32 pad;
|
||||
s32 i;
|
||||
s32 result = false;
|
||||
LineSegment line;
|
||||
Linef line;
|
||||
f32 ay;
|
||||
f32 by;
|
||||
|
||||
|
||||
+11
-13
@@ -1240,7 +1240,7 @@ s32 func_800CD44C(Camera* camera, VecGeo* diffGeo, CameraCollision* camEyeCollis
|
||||
// different bgIds for at->eye[Next] and eye[Next]->at
|
||||
ret = 3;
|
||||
} else {
|
||||
cosEyeAt = Math3D_Parallel(&camEyeCollision->norm, &camAtCollision->norm);
|
||||
cosEyeAt = Math3D_Cos(&camEyeCollision->norm, &camAtCollision->norm);
|
||||
if (cosEyeAt < -0.5f) {
|
||||
ret = 6;
|
||||
} else if ((cosEyeAt > 0.5f) || (checkEye & 2)) {
|
||||
@@ -1822,20 +1822,18 @@ void Camera_CalcDefaultSwing(Camera* camera, VecGeo* arg1, VecGeo* arg2, f32 arg
|
||||
if (swing->unk_64 == 1) {
|
||||
if (arg3 < (sp88 = OLib_Vec3fDist(at, &swing->collisionClosePoint))) {
|
||||
swing->unk_64 = 0;
|
||||
} else if ((sp88 = Math3D_SignedDistanceFromPlane(swing->eyeAtColChk.norm.x, swing->eyeAtColChk.norm.y,
|
||||
swing->eyeAtColChk.norm.z, swing->eyeAtColChk.poly->dist,
|
||||
at)) > 0.0f) {
|
||||
} else if ((sp88 = Math3D_PlaneF(swing->eyeAtColChk.norm.x, swing->eyeAtColChk.norm.y,
|
||||
swing->eyeAtColChk.norm.z, swing->eyeAtColChk.poly->dist, at)) > 0.0f) {
|
||||
swing->unk_64 = 0;
|
||||
} else if ((sp88 = OLib_Vec3fDist(eye, &swing->eyeAtColChk.pos)) < 10.0f) {
|
||||
swing->unk_64 = 0;
|
||||
} else if ((sp88 = Math3D_SignedDistanceFromPlane(swing->atEyeColChk.norm.x, swing->atEyeColChk.norm.y,
|
||||
swing->atEyeColChk.norm.z, swing->atEyeColChk.poly->dist,
|
||||
eye)) > 0.0f) {
|
||||
} else if ((sp88 = Math3D_PlaneF(swing->atEyeColChk.norm.x, swing->atEyeColChk.norm.y,
|
||||
swing->atEyeColChk.norm.z, swing->atEyeColChk.poly->dist, eye)) > 0.0f) {
|
||||
swing->unk_64 = 0;
|
||||
} else if (swing->atEyeColChk.norm.y > 0.50f) {
|
||||
swing->unk_64 = 0;
|
||||
} else {
|
||||
Math3D_AngleBetweenVectors(&camera->unk_0F0, &swing->eyeAtColChk.norm, &sp88);
|
||||
Math3D_CosOut(&camera->unk_0F0, &swing->eyeAtColChk.norm, &sp88);
|
||||
if (sp88 > 0.0f) {
|
||||
swing->unk_64 = 0;
|
||||
}
|
||||
@@ -5415,8 +5413,8 @@ s32 Camera_Unique0(Camera* camera) {
|
||||
switch (camera->animState) {
|
||||
case 0:
|
||||
bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
|
||||
rwData->unk_1C = Camera_Vec3sToVec3f(&bgCamFuncData->pos);
|
||||
camera->eye = camera->eyeNext = rwData->unk_1C;
|
||||
rwData->unk_1C.point = Camera_Vec3sToVec3f(&bgCamFuncData->pos);
|
||||
camera->eye = camera->eyeNext = rwData->unk_1C.point;
|
||||
rwData->unk_34 = bgCamFuncData->rot;
|
||||
|
||||
temp_v1 = bgCamFuncData->fov;
|
||||
@@ -5447,7 +5445,7 @@ s32 Camera_Unique0(Camera* camera) {
|
||||
}
|
||||
rwData->unk_3A = camera->focalActor->world.rot.y;
|
||||
rwData->unk_3E = 0;
|
||||
camera->eye = camera->eyeNext = rwData->unk_1C;
|
||||
camera->eye = camera->eyeNext = rwData->unk_1C.point;
|
||||
Camera_UnsetStateFlag(camera, CAM_STATE_2);
|
||||
camera->animState++;
|
||||
// fallthrough
|
||||
@@ -5455,8 +5453,8 @@ s32 Camera_Unique0(Camera* camera) {
|
||||
sp84.r = OLib_Vec3fDist(&sp8C, &camera->eye);
|
||||
sp84.yaw = rwData->unk_34.y;
|
||||
sp84.pitch = -rwData->unk_34.x;
|
||||
rwData->unk_28 = OLib_VecGeoToVec3f(&sp84);
|
||||
func_80179A44(&rwData->unk_1C, focalActorPosRot, &rwData->unk_0C);
|
||||
rwData->unk_1C.dir = OLib_VecGeoToVec3f(&sp84);
|
||||
Math3D_LineClosestToPoint(&rwData->unk_1C, &focalActorPosRot->pos, &rwData->unk_0C);
|
||||
camera->at = rwData->unk_0C;
|
||||
|
||||
if (player->stateFlags1 & PLAYER_STATE1_20000000) {
|
||||
|
||||
@@ -17,14 +17,14 @@ Vec3f D_801EDE20;
|
||||
Vec3f D_801EDE30;
|
||||
TriNorm D_801EDE40;
|
||||
TriNorm D_801EDE78;
|
||||
LineSegment D_801EDEB0;
|
||||
Linef D_801EDEB0;
|
||||
TriNorm D_801EDEC8;
|
||||
TriNorm D_801EDF00;
|
||||
Vec3f D_801EDF38;
|
||||
Vec3f D_801EDF48;
|
||||
TriNorm D_801EDF58;
|
||||
TriNorm D_801EDF90;
|
||||
LineSegment D_801EDFC8;
|
||||
Linef D_801EDFC8;
|
||||
Vec3f D_801EDFE0;
|
||||
Vec3f D_801EDFF0;
|
||||
TriNorm D_801EE000;
|
||||
@@ -631,7 +631,7 @@ s32 Collider_SetTrisElementDim(PlayState* play, TriNorm* dim, ColliderTrisElemen
|
||||
*destVtx = *srcVtx;
|
||||
}
|
||||
|
||||
Math3D_UnitNormalVector(&src->vtx[0], &src->vtx[1], &src->vtx[2], &nx, &ny, &nz, &originDist);
|
||||
Math3D_DefPlane(&src->vtx[0], &src->vtx[1], &src->vtx[2], &nx, &ny, &nz, &originDist);
|
||||
|
||||
dim->plane.normal.x = nx;
|
||||
dim->plane.normal.y = ny;
|
||||
@@ -1745,8 +1745,8 @@ void CollisionCheck_AC_JntSphVsJntSph(PlayState* play, CollisionCheckContext* co
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Math3D_ColSphereSphereIntersectAndDistance(&atElem->dim.worldSphere, &acElem->dim.worldSphere,
|
||||
&overlapSize, ¢erDist) != 0) {
|
||||
if (Math3D_SphVsSphOverlapCenterDist(&atElem->dim.worldSphere, &acElem->dim.worldSphere, &overlapSize,
|
||||
¢erDist) != 0) {
|
||||
f32 acToHit;
|
||||
Vec3f hitPos;
|
||||
Vec3f atPos;
|
||||
@@ -1796,8 +1796,7 @@ void CollisionCheck_AC_JntSphVsCyl(PlayState* play, CollisionCheckContext* colCt
|
||||
if (CollisionCheck_NoSharedFlags(&atElem->info, &ac->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereCylinderDistanceAndAmount(&atElem->dim.worldSphere, &ac->dim, &overlapSize,
|
||||
¢erDist)) {
|
||||
if (Math3D_SphVsCylOverlapCenterDist(&atElem->dim.worldSphere, &ac->dim, &overlapSize, ¢erDist)) {
|
||||
Vec3f hitPos;
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -1846,7 +1845,7 @@ void CollisionCheck_AC_JntSphVsTris(PlayState* play, CollisionCheckContext* colC
|
||||
if (CollisionCheck_NoSharedFlags(&atElem->info, &acElem->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereTri(&atElem->dim.worldSphere, &acElem->dim, &hitPos) != 0) {
|
||||
if (Math3D_TriVsSphIntersect(&atElem->dim.worldSphere, &acElem->dim, &hitPos) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -1874,8 +1873,8 @@ void CollisionCheck_AC_JntSphVsQuad(PlayState* play, CollisionCheckContext* colC
|
||||
if (CollisionCheck_SkipBump(&ac->info)) {
|
||||
return;
|
||||
}
|
||||
Math3D_TriSetCoords(&D_801EF590, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EF5C8, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]);
|
||||
Math3D_TriNorm(&D_801EF590, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EF5C8, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]);
|
||||
|
||||
for (sphElem = at->elements; sphElem < &at->elements[at->count]; sphElem++) {
|
||||
if (CollisionCheck_SkipTouch(&sphElem->info)) {
|
||||
@@ -1884,8 +1883,8 @@ void CollisionCheck_AC_JntSphVsQuad(PlayState* play, CollisionCheckContext* colC
|
||||
if (CollisionCheck_NoSharedFlags(&sphElem->info, &ac->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereTri(&sphElem->dim.worldSphere, &D_801EF590, &hitPos) != 0 ||
|
||||
Math3D_ColSphereTri(&sphElem->dim.worldSphere, &D_801EF5C8, &hitPos) != 0) {
|
||||
if (Math3D_TriVsSphIntersect(&sphElem->dim.worldSphere, &D_801EF590, &hitPos) != 0 ||
|
||||
Math3D_TriVsSphIntersect(&sphElem->dim.worldSphere, &D_801EF5C8, &hitPos) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -1921,8 +1920,8 @@ void CollisionCheck_AC_JntSphVsSphere(PlayState* play, CollisionCheckContext* co
|
||||
if (CollisionCheck_NoSharedFlags(&sphElem->info, &ac->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereSphereIntersectAndDistance(&sphElem->dim.worldSphere, &ac->dim.worldSphere,
|
||||
&overlapSize, ¢erDist) != 0) {
|
||||
if (Math3D_SphVsSphOverlapCenterDist(&sphElem->dim.worldSphere, &ac->dim.worldSphere, &overlapSize,
|
||||
¢erDist) != 0) {
|
||||
f32 acToHit;
|
||||
Vec3f hitPos;
|
||||
Vec3f atPos;
|
||||
@@ -1966,8 +1965,7 @@ void CollisionCheck_AC_CylVsJntSph(PlayState* play, CollisionCheckContext* colCt
|
||||
if (CollisionCheck_NoSharedFlags(&at->info, &sphElem->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereCylinderDistanceAndAmount(&sphElem->dim.worldSphere, &at->dim, &overlapSize,
|
||||
¢erDist) != 0) {
|
||||
if (Math3D_SphVsCylOverlapCenterDist(&sphElem->dim.worldSphere, &at->dim, &overlapSize, ¢erDist) != 0) {
|
||||
Vec3f hitPos;
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -2017,7 +2015,7 @@ void CollisionCheck_AC_CylVsCyl(PlayState* play, CollisionCheckContext* colCtxt,
|
||||
return;
|
||||
}
|
||||
|
||||
if (Math3D_ColCylinderCylinderAmountAndDistance(&at->dim, &ac->dim, &overlapSize, ¢erDist) != 0) {
|
||||
if (Math3D_CylVsCylOverlapCenterDist(&at->dim, &ac->dim, &overlapSize, ¢erDist) != 0) {
|
||||
Vec3f hitPos;
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -2071,7 +2069,7 @@ void CollisionCheck_AC_CylVsTris(PlayState* play, CollisionCheckContext* colCtxt
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Math3D_ColCylinderTri(&at->dim, &acElem->dim, &hitPos) != 0) {
|
||||
if (Math3D_CylTriVsIntersect(&at->dim, &acElem->dim, &hitPos) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2101,17 +2099,17 @@ void CollisionCheck_AC_CylVsQuad(PlayState* play, CollisionCheckContext* colCtxt
|
||||
if (CollisionCheck_NoSharedFlags(&at->info, &ac->info)) {
|
||||
return;
|
||||
}
|
||||
Math3D_TriSetCoords(&D_801EF600, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EF638, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]);
|
||||
Math3D_TriNorm(&D_801EF600, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EF638, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]);
|
||||
|
||||
if (Math3D_ColCylinderTri(&at->dim, &D_801EF600, &D_801EDE00) != 0) {
|
||||
if (Math3D_CylTriVsIntersect(&at->dim, &D_801EF600, &D_801EDE00) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
Math_Vec3s_ToVec3f(&atPos, &at->dim.pos);
|
||||
CollisionCheck_QuadAvgPoint(ac, &acPos);
|
||||
CollisionCheck_SetATvsAC(play, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &D_801EDE00);
|
||||
} else if (Math3D_ColCylinderTri(&at->dim, &D_801EF638, &D_801EDE00) != 0) {
|
||||
} else if (Math3D_CylTriVsIntersect(&at->dim, &D_801EF638, &D_801EDE00) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2142,7 +2140,7 @@ void CollisionCheck_AC_CylVsSphere(PlayState* play, CollisionCheckContext* colCt
|
||||
return;
|
||||
}
|
||||
|
||||
if (Math3D_ColSphereCylinderDistanceAndAmount(&ac->dim.worldSphere, &at->dim, &overlapSize, ¢erDist) != 0) {
|
||||
if (Math3D_SphVsCylOverlapCenterDist(&ac->dim.worldSphere, &at->dim, &overlapSize, ¢erDist) != 0) {
|
||||
Vec3f hitPos;
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -2190,7 +2188,7 @@ void CollisionCheck_AC_TrisVsJntSph(PlayState* play, CollisionCheckContext* colC
|
||||
if (CollisionCheck_NoSharedFlags(&atElem->info, &acElem->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereTri(&acElem->dim.worldSphere, &atElem->dim, &hitPos)) {
|
||||
if (Math3D_TriVsSphIntersect(&acElem->dim.worldSphere, &atElem->dim, &hitPos)) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2227,7 +2225,7 @@ void CollisionCheck_AC_TrisVsCyl(PlayState* play, CollisionCheckContext* colCtxt
|
||||
if (CollisionCheck_NoSharedFlags(&atElem->info, &ac->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColCylinderTri(&ac->dim, &atElem->dim, &D_801EDE10) != 0) {
|
||||
if (Math3D_CylTriVsIntersect(&ac->dim, &atElem->dim, &D_801EDE10) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2262,7 +2260,7 @@ void CollisionCheck_AC_TrisVsTris(PlayState* play, CollisionCheckContext* colCtx
|
||||
if (CollisionCheck_NoSharedFlags(&atElem->info, &acElem->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3d_ColTriTri(&atElem->dim, &acElem->dim, &D_801EDE20) != 0) {
|
||||
if (Math3D_TriVsTriIntersect(&atElem->dim, &acElem->dim, &D_801EDE20) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2290,8 +2288,8 @@ void CollisionCheck_AC_TrisVsQuad(PlayState* play, CollisionCheckContext* colCtx
|
||||
return;
|
||||
}
|
||||
|
||||
Math3D_TriSetCoords(&D_801EDE40, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EDE78, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]);
|
||||
Math3D_TriNorm(&D_801EDE40, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EDE78, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]);
|
||||
|
||||
for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) {
|
||||
if (CollisionCheck_SkipTouch(&atElem->info)) {
|
||||
@@ -2300,8 +2298,8 @@ void CollisionCheck_AC_TrisVsQuad(PlayState* play, CollisionCheckContext* colCtx
|
||||
if (CollisionCheck_NoSharedFlags(&atElem->info, &ac->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3d_ColTriTri(&D_801EDE40, &atElem->dim, &D_801EDE30) != 0 ||
|
||||
Math3d_ColTriTri(&D_801EDE78, &atElem->dim, &D_801EDE30) != 0) {
|
||||
if (Math3D_TriVsTriIntersect(&D_801EDE40, &atElem->dim, &D_801EDE30) != 0 ||
|
||||
Math3D_TriVsTriIntersect(&D_801EDE78, &atElem->dim, &D_801EDE30) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2335,7 +2333,7 @@ void CollisionCheck_AC_TrisVsSphere(PlayState* play, CollisionCheckContext* colC
|
||||
if (CollisionCheck_NoSharedFlags(&atElem->info, &ac->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereTri(&ac->dim.worldSphere, &atElem->dim, &hitPos) != 0) {
|
||||
if (Math3D_TriVsSphIntersect(&ac->dim.worldSphere, &atElem->dim, &hitPos) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2360,8 +2358,8 @@ void CollisionCheck_AC_QuadVsJntSph(PlayState* play, CollisionCheckContext* colC
|
||||
if (CollisionCheck_SkipTouch(&at->info)) {
|
||||
return;
|
||||
}
|
||||
Math3D_TriSetCoords(&D_801EDEC8, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EDF00, &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]);
|
||||
Math3D_TriNorm(&D_801EDEC8, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EDF00, &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]);
|
||||
|
||||
for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) {
|
||||
if (CollisionCheck_SkipBump(&acElem->info)) {
|
||||
@@ -2370,8 +2368,8 @@ void CollisionCheck_AC_QuadVsJntSph(PlayState* play, CollisionCheckContext* colC
|
||||
if (CollisionCheck_NoSharedFlags(&at->info, &acElem->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereTri(&acElem->dim.worldSphere, &D_801EDEC8, &hitPos) != 0 ||
|
||||
Math3D_ColSphereTri(&acElem->dim.worldSphere, &D_801EDF00, &hitPos) != 0) {
|
||||
if (Math3D_TriVsSphIntersect(&acElem->dim.worldSphere, &D_801EDEC8, &hitPos) != 0 ||
|
||||
Math3D_TriVsSphIntersect(&acElem->dim.worldSphere, &D_801EDF00, &hitPos) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2408,10 +2406,10 @@ void CollisionCheck_AC_QuadVsCyl(PlayState* play, CollisionCheckContext* colCtxt
|
||||
return;
|
||||
}
|
||||
|
||||
Math3D_TriSetCoords(&D_801EDF58, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EDF90, &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]);
|
||||
Math3D_TriNorm(&D_801EDF58, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EDF90, &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]);
|
||||
|
||||
if (Math3D_ColCylinderTri(&ac->dim, &D_801EDF58, &D_801EDFE0) != 0) {
|
||||
if (Math3D_CylTriVsIntersect(&ac->dim, &D_801EDF58, &D_801EDFE0) != 0) {
|
||||
if (Collider_QuadSetNearestAC(play, at, &D_801EDFE0)) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -2422,7 +2420,7 @@ void CollisionCheck_AC_QuadVsCyl(PlayState* play, CollisionCheckContext* colCtxt
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (Math3D_ColCylinderTri(&ac->dim, &D_801EDF90, &D_801EDFE0) != 0) {
|
||||
if (Math3D_CylTriVsIntersect(&ac->dim, &D_801EDF90, &D_801EDFE0) != 0) {
|
||||
if (Collider_QuadSetNearestAC(play, at, &D_801EDFE0)) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -2448,8 +2446,8 @@ void CollisionCheck_AC_QuadVsTris(PlayState* play, CollisionCheckContext* colCtx
|
||||
return;
|
||||
}
|
||||
|
||||
Math3D_TriSetCoords(&D_801EE000, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EE038, &at->dim.quad[1], &at->dim.quad[0], &at->dim.quad[2]);
|
||||
Math3D_TriNorm(&D_801EE000, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EE038, &at->dim.quad[1], &at->dim.quad[0], &at->dim.quad[2]);
|
||||
|
||||
for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) {
|
||||
if (CollisionCheck_SkipBump(&acElem->info)) {
|
||||
@@ -2459,8 +2457,8 @@ void CollisionCheck_AC_QuadVsTris(PlayState* play, CollisionCheckContext* colCtx
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((Math3d_ColTriTri(&D_801EE000, &acElem->dim, &D_801EDFF0) != 0) ||
|
||||
(Math3d_ColTriTri(&D_801EE038, &acElem->dim, &D_801EDFF0) != 0)) {
|
||||
if ((Math3D_TriVsTriIntersect(&D_801EE000, &acElem->dim, &D_801EDFF0) != 0) ||
|
||||
(Math3D_TriVsTriIntersect(&D_801EE038, &acElem->dim, &D_801EDFF0) != 0)) {
|
||||
if (Collider_QuadSetNearestAC(play, at, &D_801EDFF0)) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -2495,14 +2493,14 @@ void CollisionCheck_AC_QuadVsQuad(PlayState* play, CollisionCheckContext* colCtx
|
||||
return;
|
||||
}
|
||||
|
||||
Math3D_TriSetCoords(&D_801EE0E8[0], &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EE0E8[1], &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]);
|
||||
Math3D_TriSetCoords(&D_801EE070[0], &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EE070[1], &ac->dim.quad[2], &ac->dim.quad[1], &ac->dim.quad[0]);
|
||||
Math3D_TriNorm(&D_801EE0E8[0], &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EE0E8[1], &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]);
|
||||
Math3D_TriNorm(&D_801EE070[0], &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EE070[1], &ac->dim.quad[2], &ac->dim.quad[1], &ac->dim.quad[0]);
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
for (j = 0; j < 2; j++) {
|
||||
if (Math3d_ColTriTri(&D_801EE0E8[j], &D_801EE070[i], &D_801EE0D8) != 0 &&
|
||||
if (Math3D_TriVsTriIntersect(&D_801EE0E8[j], &D_801EE070[i], &D_801EE0D8) != 0 &&
|
||||
Collider_QuadSetNearestAC(play, at, &D_801EE0D8) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -2531,11 +2529,11 @@ void CollisionCheck_AC_QuadVsSphere(PlayState* play, CollisionCheckContext* colC
|
||||
return;
|
||||
}
|
||||
|
||||
Math3D_TriSetCoords(&D_801EE150, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EE188, &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]);
|
||||
Math3D_TriNorm(&D_801EE150, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EE188, &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]);
|
||||
|
||||
if ((Math3D_ColSphereTri(&ac->dim.worldSphere, &D_801EE150, &hitPos) != 0) ||
|
||||
(Math3D_ColSphereTri(&ac->dim.worldSphere, &D_801EE188, &hitPos) != 0)) {
|
||||
if ((Math3D_TriVsSphIntersect(&ac->dim.worldSphere, &D_801EE150, &hitPos) != 0) ||
|
||||
(Math3D_TriVsSphIntersect(&ac->dim.worldSphere, &D_801EE188, &hitPos) != 0)) {
|
||||
if (Collider_QuadSetNearestAC(play, at, &hitPos)) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -2571,8 +2569,8 @@ void CollisionCheck_AC_SphereVsJntSph(PlayState* play, CollisionCheckContext* co
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Math3D_ColSphereSphereIntersectAndDistance(&at->dim.worldSphere, &acElem->dim.worldSphere, &overlapSize,
|
||||
¢erDist) != 0) {
|
||||
if (Math3D_SphVsSphOverlapCenterDist(&at->dim.worldSphere, &acElem->dim.worldSphere, &overlapSize,
|
||||
¢erDist) != 0) {
|
||||
f32 acToHit;
|
||||
Vec3f hitPos;
|
||||
Vec3f atPos;
|
||||
@@ -2614,7 +2612,7 @@ void CollisionCheck_AC_SphereVsCylinder(PlayState* play, CollisionCheckContext*
|
||||
return;
|
||||
}
|
||||
|
||||
if (Math3D_ColSphereCylinderDistanceAndAmount(&at->dim.worldSphere, &ac->dim, &overlapSize, ¢erDist) != 0) {
|
||||
if (Math3D_SphVsCylOverlapCenterDist(&at->dim.worldSphere, &ac->dim, &overlapSize, ¢erDist) != 0) {
|
||||
Vec3f hitPos;
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
@@ -2661,7 +2659,7 @@ void CollisionCheck_AC_SphereVsTris(PlayState* play, CollisionCheckContext* colC
|
||||
if (CollisionCheck_NoSharedFlags(&at->info, &acElem->info)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereTri(&at->dim.worldSphere, &acElem->dim, &hitPos) != 0) {
|
||||
if (Math3D_TriVsSphIntersect(&at->dim.worldSphere, &acElem->dim, &hitPos) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2688,11 +2686,11 @@ void CollisionCheck_AC_SphereVsQuad(PlayState* play, CollisionCheckContext* colC
|
||||
return;
|
||||
}
|
||||
|
||||
Math3D_TriSetCoords(&D_801EE6C8, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriSetCoords(&D_801EE700, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]);
|
||||
Math3D_TriNorm(&D_801EE6C8, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]);
|
||||
Math3D_TriNorm(&D_801EE700, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]);
|
||||
|
||||
if (Math3D_ColSphereTri(&at->dim.worldSphere, &D_801EE6C8, &hitPos) != 0 ||
|
||||
Math3D_ColSphereTri(&at->dim.worldSphere, &D_801EE700, &hitPos) != 0) {
|
||||
if (Math3D_TriVsSphIntersect(&at->dim.worldSphere, &D_801EE6C8, &hitPos) != 0 ||
|
||||
Math3D_TriVsSphIntersect(&at->dim.worldSphere, &D_801EE700, &hitPos) != 0) {
|
||||
Vec3f atPos;
|
||||
Vec3f acPos;
|
||||
|
||||
@@ -2722,8 +2720,7 @@ void CollisionCheck_AC_SphereVsSphere(PlayState* play, CollisionCheckContext* co
|
||||
return;
|
||||
}
|
||||
|
||||
if (Math3D_ColSphereSphereIntersectAndDistance(&at->dim.worldSphere, &ac->dim.worldSphere, &overlapSize,
|
||||
¢erDist) != 0) {
|
||||
if (Math3D_SphVsSphOverlapCenterDist(&at->dim.worldSphere, &ac->dim.worldSphere, &overlapSize, ¢erDist) != 0) {
|
||||
f32 acToHit;
|
||||
Vec3f hitPos;
|
||||
Vec3f atPos;
|
||||
@@ -2940,8 +2937,8 @@ s32 CollisionCheck_GetMassType(u8 mass) {
|
||||
* also performs an elastic collision where both colliders are moved apart in proportion to their masses.
|
||||
*/
|
||||
void CollisionCheck_SetOCvsOC(PlayState* play, Collider* left, ColliderInfo* leftInfo, Vec3f* leftPos, Collider* right,
|
||||
ColliderInfo* rightInfo, Vec3f* rightPos, f32 overlap) {
|
||||
s32 pad;
|
||||
ColliderInfo* rightInfo, Vec3f* rightPos, f32 overlapSize) {
|
||||
f32 pad;
|
||||
f32 leftDispRatio;
|
||||
f32 rightDispRatio;
|
||||
f32 xzDist;
|
||||
@@ -3020,15 +3017,15 @@ void CollisionCheck_SetOCvsOC(PlayState* play, Collider* left, ColliderInfo* lef
|
||||
}
|
||||
|
||||
if (!IS_ZERO(xzDist)) {
|
||||
xDelta *= overlap / xzDist;
|
||||
zDelta *= overlap / xzDist;
|
||||
xDelta *= overlapSize / xzDist;
|
||||
zDelta *= overlapSize / xzDist;
|
||||
leftActor->colChkInfo.displacement.x += -xDelta * leftDispRatio;
|
||||
leftActor->colChkInfo.displacement.z += -zDelta * leftDispRatio;
|
||||
rightActor->colChkInfo.displacement.x += xDelta * rightDispRatio;
|
||||
rightActor->colChkInfo.displacement.z += zDelta * rightDispRatio;
|
||||
} else if (overlap != 0.0f) {
|
||||
leftActor->colChkInfo.displacement.x += -overlap * leftDispRatio;
|
||||
rightActor->colChkInfo.displacement.x += overlap * rightDispRatio;
|
||||
} else if (overlapSize != 0.0f) {
|
||||
leftActor->colChkInfo.displacement.x += -overlapSize * leftDispRatio;
|
||||
rightActor->colChkInfo.displacement.x += overlapSize * rightDispRatio;
|
||||
} else {
|
||||
leftActor->colChkInfo.displacement.x += -leftDispRatio;
|
||||
rightActor->colChkInfo.displacement.x += rightDispRatio;
|
||||
@@ -3043,7 +3040,7 @@ void CollisionCheck_OC_JntSphVsJntSph(PlayState* play, CollisionCheckContext* co
|
||||
ColliderJntSph* right = (ColliderJntSph*)r;
|
||||
ColliderJntSphElement* leftElem;
|
||||
ColliderJntSphElement* rightElem;
|
||||
f32 overlap;
|
||||
f32 overlapSize;
|
||||
|
||||
if ((left->count > 0) && (left->elements != NULL) && (right->count > 0) && (right->elements != NULL) &&
|
||||
(left->base.ocFlags1 & OCELEM_ON) && (right->base.ocFlags1 & OCELEM_ON)) {
|
||||
@@ -3056,15 +3053,15 @@ void CollisionCheck_OC_JntSphVsJntSph(PlayState* play, CollisionCheckContext* co
|
||||
if (!(rightElem->info.ocElemFlags & OCELEM_ON)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereSphereIntersect(&leftElem->dim.worldSphere, &rightElem->dim.worldSphere,
|
||||
&overlap) != 0) {
|
||||
if (Math3D_SphVsSphOverlap(&leftElem->dim.worldSphere, &rightElem->dim.worldSphere, &overlapSize) !=
|
||||
0) {
|
||||
Vec3f leftPos;
|
||||
Vec3f rightPos;
|
||||
|
||||
Math_Vec3s_ToVec3f(&leftPos, &leftElem->dim.worldSphere.center);
|
||||
Math_Vec3s_ToVec3f(&rightPos, &rightElem->dim.worldSphere.center);
|
||||
CollisionCheck_SetOCvsOC(play, &left->base, &leftElem->info, &leftPos, &right->base,
|
||||
&rightElem->info, &rightPos, overlap);
|
||||
&rightElem->info, &rightPos, overlapSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3078,7 +3075,7 @@ void CollisionCheck_OC_JntSphVsCyl(PlayState* play, CollisionCheckContext* colCt
|
||||
ColliderJntSph* left = (ColliderJntSph*)l;
|
||||
ColliderCylinder* right = (ColliderCylinder*)r;
|
||||
ColliderJntSphElement* leftElem;
|
||||
f32 overlap;
|
||||
f32 overlapSize;
|
||||
|
||||
if ((left->count > 0) && (left->elements != NULL) && (left->base.ocFlags1 & OCELEM_ON) &&
|
||||
(right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) {
|
||||
@@ -3087,14 +3084,14 @@ void CollisionCheck_OC_JntSphVsCyl(PlayState* play, CollisionCheckContext* colCt
|
||||
if (!(leftElem->info.ocElemFlags & OCELEM_ON)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereCylinderDistance(&leftElem->dim.worldSphere, &right->dim, &overlap) != 0) {
|
||||
if (Math3D_SphVsCylOverlap(&leftElem->dim.worldSphere, &right->dim, &overlapSize) != 0) {
|
||||
Vec3f leftPos;
|
||||
Vec3f rightPos;
|
||||
|
||||
Math_Vec3s_ToVec3f(&leftPos, &leftElem->dim.worldSphere.center);
|
||||
Math_Vec3s_ToVec3f(&rightPos, &right->dim.pos);
|
||||
CollisionCheck_SetOCvsOC(play, &left->base, &leftElem->info, &leftPos, &right->base, &right->info,
|
||||
&rightPos, overlap);
|
||||
&rightPos, overlapSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3107,7 +3104,7 @@ void CollisionCheck_OC_JntSphVsSphere(PlayState* play, CollisionCheckContext* co
|
||||
ColliderJntSph* left = (ColliderJntSph*)l;
|
||||
ColliderSphere* right = (ColliderSphere*)r;
|
||||
ColliderJntSphElement* leftElem;
|
||||
f32 overlap;
|
||||
f32 overlapSize;
|
||||
|
||||
if ((left->count > 0) && (left->elements != NULL) && (left->base.ocFlags1 & OCELEM_ON) &&
|
||||
(right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) {
|
||||
@@ -3116,14 +3113,14 @@ void CollisionCheck_OC_JntSphVsSphere(PlayState* play, CollisionCheckContext* co
|
||||
if (!(leftElem->info.ocElemFlags & OCELEM_ON)) {
|
||||
continue;
|
||||
}
|
||||
if (Math3D_ColSphereSphereIntersect(&leftElem->dim.worldSphere, &right->dim.worldSphere, &overlap) != 0) {
|
||||
if (Math3D_SphVsSphOverlap(&leftElem->dim.worldSphere, &right->dim.worldSphere, &overlapSize) != 0) {
|
||||
Vec3f leftPos;
|
||||
Vec3f rightPos;
|
||||
|
||||
Math_Vec3s_ToVec3f(&leftPos, &leftElem->dim.worldSphere.center);
|
||||
Math_Vec3s_ToVec3f(&rightPos, &right->dim.worldSphere.center);
|
||||
CollisionCheck_SetOCvsOC(play, &left->base, &leftElem->info, &leftPos, &right->base, &right->info,
|
||||
&rightPos, overlap);
|
||||
&rightPos, overlapSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3142,18 +3139,18 @@ void CollisionCheck_OC_CylVsJntSph(PlayState* play, CollisionCheckContext* colCt
|
||||
void CollisionCheck_OC_CylVsCyl(PlayState* play, CollisionCheckContext* colCtxt, Collider* l, Collider* r) {
|
||||
ColliderCylinder* left = (ColliderCylinder*)l;
|
||||
ColliderCylinder* right = (ColliderCylinder*)r;
|
||||
f32 overlap;
|
||||
f32 overlapSize;
|
||||
|
||||
if ((left->base.ocFlags1 & OCELEM_ON) && (right->base.ocFlags1 & OCELEM_ON) &&
|
||||
(left->info.ocElemFlags & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) {
|
||||
if (Math3D_ColCylinderCylinderAmount(&left->dim, &right->dim, &overlap) != 0) {
|
||||
if (Math3D_CylVsCylOverlap(&left->dim, &right->dim, &overlapSize) != 0) {
|
||||
Vec3f leftPos;
|
||||
Vec3f rightPos;
|
||||
|
||||
Math_Vec3s_ToVec3f(&leftPos, &left->dim.pos);
|
||||
Math_Vec3s_ToVec3f(&rightPos, &right->dim.pos);
|
||||
CollisionCheck_SetOCvsOC(play, &left->base, &left->info, &leftPos, &right->base, &right->info, &rightPos,
|
||||
overlap);
|
||||
overlapSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3164,18 +3161,18 @@ void CollisionCheck_OC_CylVsCyl(PlayState* play, CollisionCheckContext* colCtxt,
|
||||
void CollisionCheck_OC_CylVsSphere(PlayState* play, CollisionCheckContext* colCtxt, Collider* l, Collider* r) {
|
||||
ColliderCylinder* left = (ColliderCylinder*)l;
|
||||
ColliderSphere* right = (ColliderSphere*)r;
|
||||
f32 overlap;
|
||||
f32 overlapSize;
|
||||
|
||||
if ((left->base.ocFlags1 & OCELEM_ON) && (left->info.ocElemFlags & OCELEM_ON) &&
|
||||
(right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) {
|
||||
if (Math3D_ColSphereCylinderDistance(&right->dim.worldSphere, &left->dim, &overlap) != 0) {
|
||||
if (Math3D_SphVsCylOverlap(&right->dim.worldSphere, &left->dim, &overlapSize) != 0) {
|
||||
Vec3f leftPos;
|
||||
Vec3f rightPos;
|
||||
|
||||
Math_Vec3s_ToVec3f(&leftPos, &left->dim.pos);
|
||||
Math_Vec3s_ToVec3f(&rightPos, &right->dim.worldSphere.center);
|
||||
CollisionCheck_SetOCvsOC(play, &left->base, &left->info, &leftPos, &right->base, &right->info, &rightPos,
|
||||
overlap);
|
||||
overlapSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3200,18 +3197,18 @@ void CollisionCheck_OC_SphereVsCyl(PlayState* play, CollisionCheckContext* colCt
|
||||
void CollisionCheck_OC_SphereVsSphere(PlayState* play, CollisionCheckContext* colCtxt, Collider* l, Collider* r) {
|
||||
ColliderSphere* left = (ColliderSphere*)l;
|
||||
ColliderSphere* right = (ColliderSphere*)r;
|
||||
f32 overlap;
|
||||
f32 overlapSize;
|
||||
|
||||
if ((left->base.ocFlags1 & OCELEM_ON) && (left->info.ocElemFlags & OCELEM_ON) &&
|
||||
(right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) {
|
||||
if (Math3D_ColSphereSphereIntersect(&left->dim.worldSphere, &right->dim.worldSphere, &overlap) != 0) {
|
||||
if (Math3D_SphVsSphOverlap(&left->dim.worldSphere, &right->dim.worldSphere, &overlapSize) != 0) {
|
||||
Vec3f leftPos;
|
||||
Vec3f rightPos;
|
||||
|
||||
Math_Vec3s_ToVec3f(&leftPos, &left->dim.worldSphere.center);
|
||||
Math_Vec3s_ToVec3f(&rightPos, &right->dim.worldSphere.center);
|
||||
CollisionCheck_SetOCvsOC(play, &left->base, &left->info, &leftPos, &right->base, &right->info, &rightPos,
|
||||
overlap);
|
||||
overlapSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3509,7 +3506,7 @@ s32 CollisionCheck_LineOC_Cyl(PlayState* play, CollisionCheckContext* colChkCtx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (func_8017E350(&cylinder->dim, a, b, &D_801EDF38, &D_801EDF48) != 0) {
|
||||
if (Math3D_CylVsLineSeg(&cylinder->dim, a, b, &D_801EDF38, &D_801EDF48) != 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -3640,7 +3637,7 @@ void Collider_SetTrisVertices(ColliderTris* collider, s32 index, Vec3f* a, Vec3f
|
||||
Math_Vec3f_Copy(&element->dim.vtx[0], a);
|
||||
Math_Vec3f_Copy(&element->dim.vtx[1], b);
|
||||
Math_Vec3f_Copy(&element->dim.vtx[2], c);
|
||||
Math3D_UnitNormalVector(a, b, c, &nx, &ny, &nz, &originDist);
|
||||
Math3D_DefPlane(a, b, c, &nx, &ny, &nz, &originDist);
|
||||
element->dim.plane.normal.x = nx;
|
||||
element->dim.plane.normal.y = ny;
|
||||
element->dim.plane.normal.z = nz;
|
||||
|
||||
@@ -286,8 +286,8 @@ void EffectBlure_UpdateFlags(EffectBlureElement* elem) {
|
||||
Math_Vec3s_DiffToVec3f(&sp4C, &next->p1, &elem->p1);
|
||||
Math_Vec3s_DiffToVec3f(&sp40, &next->p2, &elem->p2);
|
||||
|
||||
if (Math3D_AngleBetweenVectors(&sp64, &sp4C, &sp34) || Math3D_AngleBetweenVectors(&sp58, &sp40, &sp30) ||
|
||||
Math3D_AngleBetweenVectors(&sp4C, &sp40, &sp2C)) {
|
||||
if (Math3D_CosOut(&sp64, &sp4C, &sp34) || Math3D_CosOut(&sp58, &sp40, &sp30) ||
|
||||
Math3D_CosOut(&sp4C, &sp40, &sp2C)) {
|
||||
elem->flags &= ~(EFFECT_BLURE_ELEMENT_FLAG_1 | EFFECT_BLURE_ELEMENT_FLAG_2);
|
||||
elem->flags |= 0;
|
||||
} else if ((sp34 <= -0.5f) || (sp30 <= -0.5f) || (sp2C <= 0.7071f)) {
|
||||
|
||||
@@ -59,8 +59,8 @@ void func_800AE930(CollisionContext* colCtx, EffectTireMark* this, Vec3f* pos, f
|
||||
sp48.y = spB8.y;
|
||||
sp48.z = spB8.z;
|
||||
|
||||
if ((func_80179798(&sp84, &sp90, &sp54, &sp60, &sp6C, &sp30) != 0) &&
|
||||
(func_80179798(&sp84, &sp90, &sp3C, &sp48, &sp78, &sp30) != 0)) {
|
||||
if (Math3D_LineSegMakePerpLineSeg(&sp84, &sp90, &sp54, &sp60, &sp6C, &sp30) &&
|
||||
Math3D_LineSegMakePerpLineSeg(&sp84, &sp90, &sp3C, &sp48, &sp78, &sp30)) {
|
||||
if (!(spAC->flags & EFFECT_TIRE_MARK_ELEMENT_FLAG_2)) {
|
||||
spAC->flags |= EFFECT_TIRE_MARK_ELEMENT_FLAG_1;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "libc64/sleep.h"
|
||||
#include "libc64/malloc.h"
|
||||
#include "macros.h"
|
||||
#include "z64math.h"
|
||||
|
||||
Gfx sTransTileSetupDL[] = {
|
||||
gsDPPipeSync(),
|
||||
|
||||
@@ -114,7 +114,7 @@ void FireObj_UpdateStateTransitions(PlayState* play, FireObj* fire) {
|
||||
}
|
||||
if ((fire->flags & FIRE_FLAG_INTERACT_STICK) && (player->heldItemAction == PLAYER_IA_DEKU_STICK)) {
|
||||
Math_Vec3f_Diff(&player->meleeWeaponInfo[0].tip, &fire->position, &dist);
|
||||
if (Math3D_LengthSquared(&dist) < SQ(20.0f)) {
|
||||
if (Math3D_Vec3fMagnitudeSq(&dist) < SQ(20.0f)) {
|
||||
sp40 = true;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1880,7 +1880,7 @@ void Environment_DrawLensFlare(PlayState* play, EnvironmentContext* envCtx, View
|
||||
|
||||
OPEN_DISPS(gfxCtx);
|
||||
|
||||
dist = Math3D_Distance(&pos, &view->eye) / 12.0f;
|
||||
dist = Math3D_Vec3f_DistXYZ(&pos, &view->eye) / 12.0f;
|
||||
|
||||
// compute a unit vector in the look direction
|
||||
tempX = view->at.x - view->eye.x;
|
||||
|
||||
+2
-2
@@ -1681,7 +1681,7 @@ s32 Play_SetCameraAtEye(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye) {
|
||||
successfullySet <<= 1;
|
||||
successfullySet |= Camera_SetViewParam(camera, CAM_VIEW_EYE, eye);
|
||||
|
||||
camera->dist = Math3D_Distance(at, eye);
|
||||
camera->dist = Math3D_Vec3f_DistXYZ(at, eye);
|
||||
|
||||
if (camera->focalActor != NULL) {
|
||||
camera->focalActorAtOffset.x = at->x - camera->focalActor->world.pos.x;
|
||||
@@ -1710,7 +1710,7 @@ s32 Play_SetCameraAtEyeUp(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye, Vec
|
||||
successfullySet <<= 1;
|
||||
successfullySet |= Camera_SetViewParam(camera, CAM_VIEW_UP, up);
|
||||
|
||||
camera->dist = Math3D_Distance(at, eye);
|
||||
camera->dist = Math3D_Vec3f_DistXYZ(at, eye);
|
||||
|
||||
if (camera->focalActor != NULL) {
|
||||
camera->focalActorAtOffset.x = at->x - camera->focalActor->world.pos.x;
|
||||
|
||||
+3
-3
@@ -578,7 +578,7 @@ s32 SubS_HasReachedPoint(Actor* actor, Path* path, s32 pointIndex) {
|
||||
diffZ = points[index + 1].z - points[index - 1].z;
|
||||
}
|
||||
|
||||
func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
|
||||
Math3D_RotateXZPlane(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
|
||||
|
||||
if (((px * actor->world.pos.x) + (pz * actor->world.pos.z) + d) > 0.0f) {
|
||||
reached = true;
|
||||
@@ -1328,8 +1328,8 @@ void SubS_ActorPathing_ComputePointInfo(PlayState* play, ActorPathing* actorPath
|
||||
diff.x = actorPath->curPoint.x - actorPath->worldPos->x;
|
||||
diff.y = actorPath->curPoint.y - actorPath->worldPos->y;
|
||||
diff.z = actorPath->curPoint.z - actorPath->worldPos->z;
|
||||
actorPath->distSqToCurPointXZ = Math3D_XZLengthSquared(diff.x, diff.z);
|
||||
actorPath->distSqToCurPoint = Math3D_LengthSquared(&diff);
|
||||
actorPath->distSqToCurPointXZ = Math3D_Dist1DSq(diff.x, diff.z);
|
||||
actorPath->distSqToCurPoint = Math3D_Vec3fMagnitudeSq(&diff);
|
||||
actorPath->rotToCurPoint.y = Math_Atan2S_XY(diff.z, diff.x);
|
||||
actorPath->rotToCurPoint.x = Math_Atan2S_XY(sqrtf(actorPath->distSqToCurPointXZ), -diff.y);
|
||||
actorPath->rotToCurPoint.z = 0;
|
||||
|
||||
Reference in New Issue
Block a user