From b55f8ffe6e60ed2335acbe7d428049ea1056f4b5 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Sat, 15 Jun 2024 15:39:31 +1000 Subject: [PATCH] `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 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 --- include/functions.h | 95 - include/macros.h | 4 - include/variables.h | 3 - include/z64camera.h | 4 +- include/z64collision_check.h | 172 +- include/z64curve.h | 2 +- include/z64math.h | 105 +- spec | 2 - src/code/sys_math3d.c | 2653 +++++++++++++++-- src/code/z_actor.c | 18 +- src/code/z_bgcheck.c | 20 +- src/code/z_camera.c | 24 +- src/code/z_collision_check.c | 177 +- src/code/z_eff_blure.c | 4 +- src/code/z_eff_tire_mark.c | 4 +- src/code/z_fbdemo.c | 1 + src/code/z_fireobj.c | 2 +- src/code/z_kankyo.c | 2 +- src/code/z_play.c | 4 +- src/code/z_sub_s.c | 6 +- src/libultra/gu/cosf.c | 2 +- src/libultra/gu/lookat.c | 7 +- src/libultra/gu/lookathil.c | 15 +- src/libultra/gu/sinf.c | 4 +- .../ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c | 4 +- .../z_bg_dblue_waterfall.c | 2 +- .../ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c | 10 +- .../actors/ovl_Bg_Umajump/z_bg_umajump.c | 4 +- .../actors/ovl_Boss_Hakugin/z_boss_hakugin.c | 4 +- .../ovl_En_Akindonuts/z_en_akindonuts.c | 2 +- src/overlays/actors/ovl_En_Arrow/z_en_arrow.c | 2 +- src/overlays/actors/ovl_En_Az/z_en_az.c | 12 +- src/overlays/actors/ovl_En_Bat/z_en_bat.c | 4 +- .../actors/ovl_En_Bigslime/z_en_bigslime.c | 2 +- .../actors/ovl_En_Bom_Chu/z_en_bom_chu.c | 4 +- .../actors/ovl_En_Bubble/z_en_bubble.c | 2 +- src/overlays/actors/ovl_En_Butte/z_en_butte.c | 16 +- src/overlays/actors/ovl_En_Dg/z_en_dg.c | 2 +- src/overlays/actors/ovl_En_Gg2/z_en_gg2.c | 2 +- src/overlays/actors/ovl_En_Gk/z_en_gk.c | 2 +- .../actors/ovl_En_Goroiwa/z_en_goroiwa.c | 10 +- .../actors/ovl_En_Honotrap/z_en_honotrap.c | 2 +- src/overlays/actors/ovl_En_Horse/z_en_horse.c | 30 +- .../z_en_horse_game_check.c | 36 +- .../z_en_horse_link_child.c | 8 +- .../actors/ovl_En_Invadepoh/z_en_invadepoh.c | 10 +- .../z_en_invadepoh_demo.c | 4 +- src/overlays/actors/ovl_En_Ishi/z_en_ishi.c | 2 +- src/overlays/actors/ovl_En_Jg/z_en_jg.c | 2 +- src/overlays/actors/ovl_En_Kusa/z_en_kusa.c | 2 +- src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c | 6 +- .../actors/ovl_En_Mt_tag/z_en_mt_tag.c | 8 +- .../actors/ovl_En_Mushi2/z_en_mushi2.c | 48 +- src/overlays/actors/ovl_En_Ot/z_en_ot.c | 2 +- .../actors/ovl_En_Pametfrog/z_en_pametfrog.c | 10 +- src/overlays/actors/ovl_En_Rat/z_en_rat.c | 6 +- src/overlays/actors/ovl_En_Rg/z_en_rg.c | 6 +- .../actors/ovl_En_Ruppecrow/z_en_ruppecrow.c | 4 +- .../actors/ovl_En_Scopecrow/z_en_scopecrow.c | 2 +- .../actors/ovl_En_Scopenuts/z_en_scopenuts.c | 2 +- .../actors/ovl_En_Sellnuts/z_en_sellnuts.c | 2 +- .../actors/ovl_En_Suttari/z_en_suttari.c | 4 +- src/overlays/actors/ovl_En_Sw/z_en_sw.c | 6 +- src/overlays/actors/ovl_En_Trt2/z_en_trt2.c | 2 +- .../actors/ovl_En_Tru_Mt/z_en_tru_mt.c | 2 +- src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c | 4 +- .../actors/ovl_Obj_Iceblock/z_obj_iceblock.c | 4 +- src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c | 24 +- .../actors/ovl_Obj_Mure2/z_obj_mure2.c | 4 +- .../actors/ovl_Obj_Mure3/z_obj_mure3.c | 4 +- .../ovl_Obj_Skateblock/z_obj_skateblock.c | 8 +- .../actors/ovl_Obj_Snowball/z_obj_snowball.c | 2 +- .../ovl_Obj_Spidertent/z_obj_spidertent.c | 12 +- .../ovl_Obj_Spinyroll/z_obj_spinyroll.c | 2 +- .../actors/ovl_Obj_Switch/z_obj_switch.c | 2 +- src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c | 2 +- src/overlays/actors/ovl_Obj_Um/z_obj_um.c | 14 +- .../ovl_Obj_Vspinyroll/z_obj_vspinyroll.c | 2 +- src/overlays/actors/ovl_Obj_Wind/z_obj_wind.c | 21 +- .../effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c | 2 +- tools/disasm/functions.txt | 138 +- tools/disasm/variables.txt | 104 +- tools/namefixer.py | 68 +- tools/sizes/code_functions.csv | 138 +- 84 files changed, 3226 insertions(+), 949 deletions(-) diff --git a/include/functions.h b/include/functions.h index e67742901b..b9e5b8e51e 100644 --- a/include/functions.h +++ b/include/functions.h @@ -439,101 +439,6 @@ Gfx* Gfx_Open(Gfx* gfx); Gfx* Gfx_Close(Gfx* gfx, Gfx* dst); void* Gfx_Alloc(Gfx** gfxP, size_t size); -f32 Math3D_Normalize(Vec3f* vec); -s32 Math3D_PlaneVsLineSegClosestPoint(f32 planeAA, f32 planeAB, f32 planeAC, f32 planeADist, f32 planeBA, f32 planeBB, f32 planeBC, f32 planeBDist, Vec3f* linePointA, Vec3f* linePointB, Vec3f* closestPoint); -s32 func_80179798(Vec3f* param_1, Vec3f* param_2, Vec3f* param_3, Vec3f* param_4, Vec3f* param_5, Vec3f* param_6); -f32 func_80179A44(Vec3f* arg0, PosRot* arg1, Vec3f* arg2); -void func_80179B34(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32* arg7, f32* arg8); -// UNK_TYPE4 func_80179B94(f32 fParm1, f32 fParm2, f32 fParm5, f32 param_4, f32 param_5, f32 param_6, f32 param_7, f32 param_8, Vec3f* param_9); -// void func_80179D74(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10); -void Math3D_ScaleAndAdd(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dst); -void Math3D_Lerp(Vec3f* a, Vec3f* b, f32 t, Vec3f* dst); -f32 Math3D_Parallel(Vec3f* a, Vec3f* b); -s32 Math3D_AngleBetweenVectors(Vec3f* a, Vec3f* b, f32* angle); -void func_80179F64(Vec3f* param_1, Vec3f* param_2, Vec3f* param_3); -s32 Math3D_XZBoundCheck(f32 xMin, f32 xMax, f32 zMin, f32 zMax, f32 x, f32 z); -// void func_8017A09C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -// void func_8017A1D0(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -s32 func_8017A304(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 z, f32 x, f32 chkDist); -// UNK_TYPE4 func_8017A438(Vec3f* pfParm1, Vec3f* pfParm2, Vec3f* pfParm3, Vec3f* pfParm4, f32 param_5); -f32 Math3D_XZLengthSquared(f32 x, f32 z); -f32 Math3D_XZLength(f32 x, f32 z); -f32 Math3D_XZDistanceSquared(f32 x1, f32 x2, f32 z1, f32 z2); -f32 Math3D_XZDistance(f32 x1, f32 x2, f32 z1, f32 z2); -f32 Math3D_LengthSquared(Vec3f* vec); -f32 Math3D_Vec3fMagnitude(Vec3f* vec); -f32 Math3D_Vec3fDistSq(Vec3f* a, Vec3f* b); -f32 Math3D_Distance(Vec3f* a, Vec3f* b); -f32 Math3D_DistanceS(Vec3s* s, Vec3f* f); -f32 func_8017A7B8(f32* param_1, f32* param_2, f32 param_3, f32 param_4); -f32 func_8017A7F8(f32* param_1, f32* param_2, f32 param_3, f32 param_4); -f32 func_8017A838(f32* param_1, f32* param_2, f32 param_3, f32 param_4); -void Math3D_CrossProduct(Vec3f* a, Vec3f* b, Vec3f* res); -void Math3D_SurfaceNorm(Vec3f* a, Vec3f* b, Vec3f* c, Vec3f* res); -u32 Math3D_PointRelativeToCubeFaces(Vec3f* param_1, Vec3f* param_2, Vec3f* param_3); -u32 Math3D_PointRelativeToCubeEdges(Vec3f* param_1, Vec3f* param_2, Vec3f* param_3); -u32 Math3D_PointRelativeToCubeVertices(Vec3f* param_1, Vec3f* param_2, Vec3f* param_3); -s32 Math3D_LineVsCube(Vec3f* min, Vec3f* max, Vec3f* a, Vec3f* b); -// void func_8017B68C(void); -void func_8017B7F8(Vec3f* arg0, s16 arg1, f32* arg2, f32* arg3, f32* arg4); -void Math3D_UnitNormalVector(Vec3f* a, Vec3f* b, Vec3f* c, f32* normX, f32* normY, f32* normZ, f32* param_7); -f32 Math3D_SignedDistanceFromPlane(f32 normX, f32 normY, f32 normZ, f32 d, Vec3f* position); -// void func_8017B9D8(void); -f32 Math3D_UDistPlaneToPos(f32 normX, f32 normY, f32 normZ, f32 d, Vec3f* position); -f32 Math3D_DistPlaneToPos(f32 normX, f32 normY, f32 normZ, f32 d, Vec3f* position); -s32 Math3D_TriChkPointParaYDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 y, f32 z, f32 unk, f32 chkDist, f32 ny); -// void func_8017BD98(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); -// void func_8017BDE0(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -s32 Math3D_TriChkPointParaYIntersectDist(Vec3f* a, Vec3f* b, Vec3f* c, f32 nx, f32 ny, f32 nz, f32 dist, f32 z, f32 x, f32* yIntersect, f32 chkDist); -s32 Math3D_TriChkPointParaYIntersectInsideTri(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 z, f32 x, f32* yIntersect, f32 chkDist); -// void func_8017BF8C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -s32 Math3D_TriChkLineSegParaYIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 z, f32 x, f32* yIntersect, f32 y0, f32 y1); -// void func_8017C17C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); -// void func_8017C1F0(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8); -s32 Math3D_TriChkPointParaYIntersectInsideTri2(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 z, f32 x, f32* yIntersect, f32 chkDist); -s32 Math3D_TriChkPointParaXDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 y, f32 z, f32 unk, f32 chkDist, f32 nx); -// void func_8017C808(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); -s32 Math3D_TriChkPointParaXIntersect(Vec3f* a, Vec3f* b, Vec3f* c, f32 nx, f32 ny, f32 nz, f32 dist, f32 y, f32 z, f32* xIntersect); -// void func_8017C904(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -s32 Math3D_TriChkLineSegParaXIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 y, f32 z, f32* xIntersect, f32 x0, f32 x1); -// void func_8017CB08(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); -s32 Math3D_TriChkLineSegParaZDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 y, f32 z, f32 unk, f32 chkDist, f32 nz); -// void func_8017CEA8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); -s32 Math3D_TriChkPointParaZIntersect(Vec3f* a, Vec3f* b, Vec3f* c, f32 nx, f32 ny, f32 nz, f32 dist, f32 x, f32 y, f32* zIntersect); -// void func_8017CFA4(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -s32 Math3D_TriChkLineSegParaZIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 x, f32 y, f32* zIntersect, f32 z0, f32 z1); -// void func_8017D1AC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); -// void func_8017D220(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -s32 Math3D_LineSegVsPlane(f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* linePointA, Vec3f* linePointB, Vec3f* intersect, s32 fromFront); -// void func_8017D404(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11); -void Math3D_TriSetCoords(TriNorm* tri, Vec3f* pointA, Vec3f* pointB, Vec3f* pointC); -u32 Math3D_IsPointInSphere(Sphere16* sphere, Vec3f* point); -s32 Math3D_PointDistToLine2D(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32* arg6, f32* arg7, f32* arg8); // returns boolean -s32 func_8017D7C0(f32 x0, f32 y0, f32 x1, f32 y1, f32 x2, f32 y2, f32* lineLenSq); -// void func_8017D814(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -// void func_8017D91C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -// void func_8017DA24(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -s32 Math3D_LineVsSph(Sphere16* sphere, LineSegment* line); -void func_8017DD34(Sphere16* sphere, TriNorm* tri, Vec3f* pfParm3); -s32 Math3D_ColSphereTri(Sphere16* sphere, TriNorm* tri, Vec3f* uParm3); -// void func_8017E294(void); -UNK_TYPE func_8017E350(UNK_PTR, Vec3f*, Vec3f*, Vec3f*, Vec3f*); -s32 Math3D_ColCylinderTri(Cylinder16* cylinder, TriNorm* tri, Vec3f* pzParm3); -// void func_8017F1A0(void); -s32 Math3D_SphVsSph(Sphere16* sphere1, Sphere16* sphere2); -s32 Math3D_ColSphereSphereIntersect(Sphere16* sphere1, Sphere16* sphere2, f32* intersectAmount); -s32 Math3D_ColSphereSphereIntersectAndDistance(Sphere16* sphere1, Sphere16* sphere2, f32* intersectAmount, f32* dist); -s32 Math3D_ColSphereCylinderDistance(Sphere16* sphere, Cylinder16* cylinder, f32* dist); -s32 Math3D_ColSphereCylinderDistanceAndAmount(Sphere16* sphere, Cylinder16* cylinder, f32* dist, f32* intersectAmount); -s32 Math3D_ColCylinderCylinderAmount(Cylinder16* cylinder1, Cylinder16* cylinder2, f32* intersectAmount); -s32 Math3D_ColCylinderCylinderAmountAndDistance(Cylinder16* cylinder1, Cylinder16* cylinder2, f32* intersectAmount, f32* dist); -s32 Math3d_ColTriTri(TriNorm* tri1, TriNorm* tri2, Vec3f* uParm3); -s32 Math3D_XZInSphere(Sphere16* sphere, f32 x, f32 z); -s32 Math3D_XYInSphere(Sphere16* sphere, f32 x, f32 y); -s32 Math3D_YZInSphere(Sphere16* sphere, f32 y, f32 z); -// void func_8017FB1C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11); -// void func_8017FD44(void); - void func_80183070(void); AudioTask* AudioThread_Update(void); diff --git a/include/macros.h b/include/macros.h index da5063bcdb..fcede4ac2e 100644 --- a/include/macros.h +++ b/include/macros.h @@ -64,10 +64,6 @@ (flag & 0x1) ? 0 : \ 0) -#define SQ(x) ((x) * (x)) -#define CB(x) ((x) * (x) * (x)) -#define ABS(x) ((x) >= 0 ? (x) : -(x)) -#define ABS_ALT(x) ((x) < 0 ? -(x) : (x)) #define DECR(x) ((x) == 0 ? 0 : --(x)) //! checks min first diff --git a/include/variables.h b/include/variables.h index 6618a97b9d..cb5741ff87 100644 --- a/include/variables.h +++ b/include/variables.h @@ -25,9 +25,6 @@ extern u8 gPlayerFormItemRestrictions[PLAYER_FORM_MAX][114]; extern s32 gDbgCamEnabled; -extern Vec3f gZeroVec3f; -extern Vec3s gZeroVec3s; - extern s16 gLowPassFilterData[]; extern s16 gHighPassFilterData[]; extern s16 gBandStopFilterData[]; diff --git a/include/z64camera.h b/include/z64camera.h index fdc1d1bcea..8c2a001d29 100644 --- a/include/z64camera.h +++ b/include/z64camera.h @@ -2,6 +2,7 @@ #define Z64CAMERA_H #include "ultra64.h" +#include "z64math.h" #include "z64actor.h" #include "z64save.h" #include "unk.h" @@ -1196,8 +1197,7 @@ typedef struct { /* 0x00 */ Vec3f unk_00; /* 0x0C */ Vec3f unk_0C; /* 0x18 */ f32 unk_18; - /* 0x1C */ Vec3f unk_1C; - /* 0x28 */ Vec3f unk_28; + /* 0x1C */ InfiniteLine unk_1C; /* 0x34 */ Vec3s unk_34; /* 0x3A */ s16 unk_3A; /* 0x3C */ s16 timer; diff --git a/include/z64collision_check.h b/include/z64collision_check.h index ac1b97752f..02289deec1 100644 --- a/include/z64collision_check.h +++ b/include/z64collision_check.h @@ -10,100 +10,100 @@ struct PlayState; typedef struct { /* 0x00 */ struct Actor* actor; // Attached actor - /* 0x04 */ struct Actor* at; // Actor attached to what it collided with as an AT collider. - /* 0x08 */ struct Actor* ac; // Actor attached to what it collided with as an AC collider. - /* 0x0C */ struct Actor* oc; // Actor attached to what it collided with as an OC collider. - /* 0x10 */ u8 atFlags; // Information flags for AT collisions. - /* 0x11 */ u8 acFlags; // Information flags for AC collisions. - /* 0x12 */ u8 ocFlags1; // Information flags for OC collisions. - /* 0x13 */ u8 ocFlags2; // Flags related to which colliders it can OC collide with. - /* 0x14 */ u8 colType; // Determines hitmarks and sound effects during AC collisions. - /* 0x15 */ u8 shape; // JntSph, Cylinder, Tris, or Quad + /* 0x04 */ struct Actor* at; // Actor attached to what it collided with as an AT collider. + /* 0x08 */ struct Actor* ac; // Actor attached to what it collided with as an AC collider. + /* 0x0C */ struct Actor* oc; // Actor attached to what it collided with as an OC collider. + /* 0x10 */ u8 atFlags; // Information flags for AT collisions. + /* 0x11 */ u8 acFlags; // Information flags for AC collisions. + /* 0x12 */ u8 ocFlags1; // Information flags for OC collisions. + /* 0x13 */ u8 ocFlags2; // Flags related to which colliders it can OC collide with. + /* 0x14 */ u8 colType; // Determines hitmarks and sound effects during AC collisions. + /* 0x15 */ u8 shape; // JntSph, Cylinder, Tris, or Quad } Collider; // size = 0x18 typedef struct { - /* 0x0 */ u8 colType; // Determines hitmarks and sound effects during AC collisions. - /* 0x1 */ u8 atFlags; // Information flags for AT collisions. - /* 0x2 */ u8 acFlags; // Information flags for OC collisions. + /* 0x0 */ u8 colType; // Determines hitmarks and sound effects during AC collisions. + /* 0x1 */ u8 atFlags; // Information flags for AT collisions. + /* 0x2 */ u8 acFlags; // Information flags for OC collisions. /* 0x3 */ u8 ocFlags1; // Information flags for OC collisions. /* 0x4 */ u8 ocFlags2; // Flags related to which colliders it can OC collide with. - /* 0x5 */ u8 shape; // JntSph, Cylinder, Tris, or Quad + /* 0x5 */ u8 shape; // JntSph, Cylinder, Tris, or Quad } ColliderInit; // size = 0x6 typedef struct { - /* 0x0 */ u8 colType; // Determines hitmarks and sound effects during AC collisions. - /* 0x1 */ u8 atFlags; // Information flags for AT collisions. - /* 0x2 */ u8 acFlags; // Information flags for AC collisions. + /* 0x0 */ u8 colType; // Determines hitmarks and sound effects during AC collisions. + /* 0x1 */ u8 atFlags; // Information flags for AT collisions. + /* 0x2 */ u8 acFlags; // Information flags for AC collisions. /* 0x3 */ u8 ocFlags1; // Information flags for OC collisions. - /* 0x4 */ u8 shape; // JntSph, Cylinder, Tris, or Quad + /* 0x4 */ u8 shape; // JntSph, Cylinder, Tris, or Quad } ColliderInitType1; // size = 0x5 typedef struct { /* 0x0 */ struct Actor* actor; // Attached actor - /* 0x4 */ u8 atFlags; // Information flags for AT collisions. - /* 0x5 */ u8 acFlags; // Information flags for AC collisions. - /* 0x6 */ u8 ocFlags1; // Information flags for OC collisions. - /* 0x7 */ u8 shape; // JntSph, Cylinder, Tris, or Quad + /* 0x4 */ u8 atFlags; // Information flags for AT collisions. + /* 0x5 */ u8 acFlags; // Information flags for AC collisions. + /* 0x6 */ u8 ocFlags1; // Information flags for OC collisions. + /* 0x7 */ u8 shape; // JntSph, Cylinder, Tris, or Quad } ColliderInitToActor; // size = 0x8 typedef struct { - /* 0x0 */ u32 dmgFlags; // Toucher damage type flags. - /* 0x4 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) - /* 0x5 */ u8 damage; // Damage or Stun Timer + /* 0x0 */ u32 dmgFlags; // Toucher damage type flags. + /* 0x4 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) + /* 0x5 */ u8 damage; // Damage or Stun Timer } ColliderTouch; // size = 0x8 typedef struct { - /* 0x0 */ u32 dmgFlags; // Toucher damage type flags. - /* 0x4 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) - /* 0x5 */ u8 damage; // Damage or Stun Timer + /* 0x0 */ u32 dmgFlags; // Toucher damage type flags. + /* 0x4 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) + /* 0x5 */ u8 damage; // Damage or Stun Timer } ColliderTouchInit; // size = 0x8 typedef struct { - /* 0x0 */ u32 dmgFlags; // Bumper damage type flags. - /* 0x4 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) - /* 0x5 */ u8 defense; // Damage Resistance - /* 0x6 */ Vec3s hitPos; // Point of contact + /* 0x0 */ u32 dmgFlags; // Bumper damage type flags. + /* 0x4 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) + /* 0x5 */ u8 defense; // Damage Resistance + /* 0x6 */ Vec3s hitPos; // Point of contact } ColliderBump; // size = 0xC typedef struct { - /* 0x0 */ u32 dmgFlags; // Bumper exclusion mask - /* 0x4 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) - /* 0x5 */ u8 defense; // Damage Resistance + /* 0x0 */ u32 dmgFlags; // Bumper exclusion mask + /* 0x4 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) + /* 0x5 */ u8 defense; // Damage Resistance } ColliderBumpInit; // size = 0x8 typedef struct ColliderInfo { - /* 0x00 */ ColliderTouch toucher; // Damage properties when acting as an AT collider - /* 0x08 */ ColliderBump bumper; // Damage properties when acting as an AC collider - /* 0x14 */ u8 elemType; // Affects sfx reaction when attacked by Link and hookability. Full purpose unknown. - /* 0x15 */ u8 toucherFlags; // Information flags for AT collisions - /* 0x16 */ u8 bumperFlags; // Information flags for AC collisions - /* 0x17 */ u8 ocElemFlags; // Information flags for OC collisions - /* 0x18 */ Collider* atHit; // object touching this element's AT collider - /* 0x1C */ Collider* acHit; // object touching this element's AC collider - /* 0x20 */ struct ColliderInfo* atHitInfo; // element that hit the AT collider - /* 0x24 */ struct ColliderInfo* acHitInfo; // element that hit the AC collider + /* 0x00 */ ColliderTouch toucher; // Damage properties when acting as an AT collider + /* 0x08 */ ColliderBump bumper; // Damage properties when acting as an AC collider + /* 0x14 */ u8 elemType; // Affects sfx reaction when attacked by Link and hookability. Full purpose unknown. + /* 0x15 */ u8 toucherFlags; // Information flags for AT collisions + /* 0x16 */ u8 bumperFlags; // Information flags for AC collisions + /* 0x17 */ u8 ocElemFlags; // Information flags for OC collisions + /* 0x18 */ Collider* atHit; // object touching this element's AT collider + /* 0x1C */ Collider* acHit; // object touching this element's AC collider + /* 0x20 */ struct ColliderInfo* atHitInfo; // element that hit the AT collider + /* 0x24 */ struct ColliderInfo* acHitInfo; // element that hit the AC collider } ColliderInfo; // size = 0x28 typedef struct { - /* 0x00 */ u8 elemType; // Affects sfx reaction when attacked by Link and hookability. Full purpose unknown. - /* 0x04 */ ColliderTouchInit toucher; // Damage properties when acting as an AT collider - /* 0x0C */ ColliderBumpInit bumper; // Damage properties when acting as an AC collider - /* 0x14 */ u8 toucherFlags; // Information flags for AT collisions - /* 0x15 */ u8 bumperFlags; // Information flags for AC collisions - /* 0x16 */ u8 ocElemFlags; // Information flags for OC collisions + /* 0x00 */ u8 elemType; // Affects sfx reaction when attacked by Link and hookability. Full purpose unknown. + /* 0x04 */ ColliderTouchInit toucher; // Damage properties when acting as an AT collider + /* 0x0C */ ColliderBumpInit bumper; // Damage properties when acting as an AC collider + /* 0x14 */ u8 toucherFlags; // Information flags for AT collisions + /* 0x15 */ u8 bumperFlags; // Information flags for AC collisions + /* 0x16 */ u8 ocElemFlags; // Information flags for OC collisions } ColliderInfoInit; // size = 0x18 typedef struct { - /* 0x00 */ Sphere16 modelSphere; // model space sphere - /* 0x08 */ Sphere16 worldSphere; // world space sphere - /* 0x10 */ f32 scale; // worldsphere = modelsphere * scale * 0.01 - /* 0x14 */ u8 limb; // attached limb + /* 0x00 */ Sphere16 modelSphere; // model space sphere + /* 0x08 */ Sphere16 worldSphere; // world space sphere + /* 0x10 */ f32 scale; // worldsphere = modelsphere * scale * 0.01 + /* 0x14 */ u8 limb; // attached limb } ColliderJntSphElementDim; // size = 0x18 typedef struct { - /* 0x0 */ u8 limb; // attached limb - /* 0x2 */ Sphere16 modelSphere; // model space sphere - /* 0xA */ s16 scale; // world space sphere = model * scale * 0.01 + /* 0x0 */ u8 limb; // attached limb + /* 0x2 */ Sphere16 modelSphere; // model space sphere + /* 0xA */ s16 scale; // world space sphere = model * scale * 0.01 } ColliderJntSphElementDimInit; // size = 0xC typedef struct { @@ -141,27 +141,27 @@ typedef struct { } ColliderJntSphInitToActor; // size = 0x10 typedef struct { - /* 0x00 */ Collider base; + /* 0x00 */ Collider base; /* 0x18 */ ColliderInfo info; - /* 0x40 */ Cylinder16 dim; + /* 0x40 */ Cylinder16 dim; } ColliderCylinder; // size = 0x4C typedef struct { - /* 0x00 */ ColliderInit base; + /* 0x00 */ ColliderInit base; /* 0x08 */ ColliderInfoInit info; - /* 0x20 */ Cylinder16 dim; + /* 0x20 */ Cylinder16 dim; } ColliderCylinderInit; // size = 0x2C typedef struct { /* 0x00 */ ColliderInitType1 base; - /* 0x08 */ ColliderInfoInit info; - /* 0x20 */ Cylinder16 dim; + /* 0x08 */ ColliderInfoInit info; + /* 0x20 */ Cylinder16 dim; } ColliderCylinderInitType1; // size = 0x2C typedef struct { /* 0x00 */ ColliderInitToActor base; - /* 0x08 */ ColliderInfoInit info; - /* 0x20 */ Cylinder16 dim; + /* 0x08 */ ColliderInfoInit info; + /* 0x20 */ Cylinder16 dim; } ColliderCylinderInitToActor; // size = 0x2C typedef struct { @@ -170,7 +170,7 @@ typedef struct { typedef struct { /* 0x00 */ ColliderInfo info; - /* 0x28 */ TriNorm dim; + /* 0x28 */ TriNorm dim; } ColliderTrisElement; // size = 0x5C typedef struct { @@ -198,9 +198,9 @@ typedef struct { typedef struct { /* 0x00 */ Vec3f quad[4]; - /* 0x30 */ Vec3s dcMid; // midpoint of vectors d, c - /* 0x36 */ Vec3s baMid; // midpoint of vectors b, a - /* 0x3C */ f32 acDist; // distance to nearest AC collision this frame. + /* 0x30 */ Vec3s dcMid; // midpoint of vectors d, c + /* 0x36 */ Vec3s baMid; // midpoint of vectors b, a + /* 0x3C */ f32 acDist; // distance to nearest AC collision this frame. } ColliderQuadDim; // size = 0x40 typedef struct { @@ -208,50 +208,50 @@ typedef struct { } ColliderQuadDimInit; // size = 0x30 typedef struct { - /* 0x00 */ Collider base; - /* 0x18 */ ColliderInfo info; + /* 0x00 */ Collider base; + /* 0x18 */ ColliderInfo info; /* 0x40 */ ColliderQuadDim dim; } ColliderQuad; // size = 0x80 typedef struct { - /* 0x00 */ ColliderInit base; - /* 0x08 */ ColliderInfoInit info; + /* 0x00 */ ColliderInit base; + /* 0x08 */ ColliderInfoInit info; /* 0x20 */ ColliderQuadDimInit dim; } ColliderQuadInit; // size = 0x50 typedef struct { - /* 0x00 */ ColliderInitType1 base; - /* 0x08 */ ColliderInfoInit info; + /* 0x00 */ ColliderInitType1 base; + /* 0x08 */ ColliderInfoInit info; /* 0x20 */ ColliderQuadDimInit dim; } ColliderQuadInitType1; // size = 0x50 typedef struct { - /* 0x00 */ Collider base; + /* 0x00 */ Collider base; /* 0x18 */ ColliderInfo info; /* 0x40 */ ColliderJntSphElementDim dim; } ColliderSphere; // size = 0x58 typedef struct { - /* 0x00 */ ColliderInit base; + /* 0x00 */ ColliderInit base; /* 0x08 */ ColliderInfoInit info; /* 0x20 */ ColliderJntSphElementDimInit dim; } ColliderSphereInit; // size = 0x2C typedef struct { - /* 0x00 */ LineSegment line; - /* 0x18 */ u16 ocFlags; + /* 0x00 */ Linef line; + /* 0x18 */ u16 ocFlags; } OcLine; // size = 0x1C typedef struct { - /* 0x000 */ s16 colATCount; - /* 0x002 */ u16 sacFlags; // Controls whether new collidors can be added or removed, or only swapped + /* 0x000 */ s16 colATCount; + /* 0x002 */ u16 sacFlags; // Controls whether new collidors can be added or removed, or only swapped /* 0x004 */ Collider* colAT[50]; - /* 0x0CC */ s32 colACCount; + /* 0x0CC */ s32 colACCount; /* 0x0D0 */ Collider* colAC[60]; - /* 0x1C0 */ s32 colOCCount; + /* 0x1C0 */ s32 colOCCount; /* 0x1C4 */ Collider* colOC[50]; - /* 0x28C */ s32 colLineCount; - /* 0x290 */ OcLine* colLine[3]; + /* 0x28C */ s32 colLineCount; + /* 0x290 */ OcLine* colLine[3]; } CollisionCheckContext; // size = 0x29C typedef struct { @@ -626,7 +626,7 @@ void CollisionCheck_SetHitEffects(struct PlayState* play, CollisionCheckContext* void CollisionCheck_AC(struct PlayState* play, CollisionCheckContext* colCtxt, Collider* colAT); void CollisionCheck_AT(struct PlayState* play, CollisionCheckContext* colCtxt); s32 CollisionCheck_GetMassType(u8 mass); -void CollisionCheck_SetOCvsOC(struct PlayState* play, Collider* left, ColliderInfo* leftInfo, Vec3f* leftPos, Collider* right, ColliderInfo* rightInfo, Vec3f* rightPos, f32 overlap); +void CollisionCheck_SetOCvsOC(struct PlayState* play, Collider* left, ColliderInfo* leftInfo, Vec3f* leftPos, Collider* right, ColliderInfo* rightInfo, Vec3f* rightPos, f32 overlapSize); void CollisionCheck_OC_JntSphVsJntSph(struct PlayState* play, CollisionCheckContext* colCtxt, Collider* l, Collider* r); void CollisionCheck_OC_JntSphVsCyl(struct PlayState* play, CollisionCheckContext* colCtxt, Collider* l, Collider* r); void CollisionCheck_OC_JntSphVsSphere(struct PlayState* play, CollisionCheckContext* colCtxt, Collider* l, Collider* r); diff --git a/include/z64curve.h b/include/z64curve.h index 2ee1eae2ee..7cdc54526b 100644 --- a/include/z64curve.h +++ b/include/z64curve.h @@ -1,7 +1,7 @@ #ifndef Z64CURVE_H #define Z64CURVE_H -#include "PR/ultratypes.h" +#include "ultra64.h" #include "z64math.h" struct Actor; diff --git a/include/z64math.h b/include/z64math.h index 020e11a6d7..f552b513d8 100644 --- a/include/z64math.h +++ b/include/z64math.h @@ -98,7 +98,7 @@ typedef struct { typedef struct { /* 0x00 */ Vec3f a; /* 0x0C */ Vec3f b; -} LineSegment; // size = 0x18 +} Linef; // size = 0x18 typedef struct { /* 0x0 */ f32 r; // radius @@ -138,6 +138,9 @@ typedef union { }; } MtxF; // size = 0x40 +extern Vec3f gZeroVec3f; +extern Vec3s gZeroVec3s; + #define LERPIMP(v0, v1, t) ((v0) + (((v1) - (v0)) * (t))) #define LERPIMP_ALT(v0, v1, t) (((v1) - (v0)) * (t) + (v0)) #define S16_LERP(v0, v1, t) ((s16)(((v1) - (v0)) * (t)) + (v0)) @@ -161,6 +164,11 @@ typedef union { #define IS_ZERO(f) (fabsf(f) < 0.008f) +#define SQ(x) ((x) * (x)) +#define CB(x) ((x) * (x) * (x)) +#define ABS(x) ((x) >= 0 ? (x) : -(x)) +#define ABS_ALT(x) ((x) < 0 ? -(x) : (x)) + // Casting a float to an integer, when the float value is larger than what the integer type can hold, // leads to undefined behavior. For example (f32)0x8000 doesn't fit in a s16, so it cannot be cast to s16. // This isn't an issue with IDO, but is one with for example GCC. @@ -252,4 +260,99 @@ f32 Math_Atan2F(f32 y, f32 x); s16 Math_Atan2S_XY(f32 x, f32 y); f32 Math_Atan2F_XY(f32 x, f32 y); +f32 Math3D_Normalize(Vec3f* vec); +s32 Math3D_PlaneVsLineSegClosestPoint(f32 planeAA, f32 planeAB, f32 planeAC, f32 planeADist, f32 planeBA, f32 planeBB, f32 planeBC, f32 planeBDist, Vec3f* linePointA, Vec3f* linePointB, Vec3f* closestPoint); +s32 Math3D_LineSegMakePerpLineSeg(Vec3f* lineAPointA, Vec3f* lineAPointB, Vec3f* lineBPointA, Vec3f* lineBPointB, Vec3f* lineAClosestToB, Vec3f* lineBClosestToA); +f32 Math3D_LineClosestToPoint(InfiniteLine* line, Vec3f* pos, Vec3f* closestPoint); +void Math3D_FindPointOnPlaneIntersect(float planeAAxis1Norm, f32 planeAAxis2Norm, f32 planeBAxis1Norm, f32 planeBAxis2Norm, f32 axis3Direction, f32 planeADist, f32 planeBDist, float* axis1Point, float* axis2Point); +s32 Math3D_PlaneVsPlaneNewLine(f32 planeAA, f32 planeAB, f32 planeAC, f32 planeADist, f32 planeBA, f32 planeBB, f32 planeBC, f32 planeBDist, InfiniteLine* intersect); +s32 Math3D_PlaneVsPlaneVsLineClosestPoint(f32 planeAA, f32 planeAB, f32 planeAC, f32 planeADist, f32 planeBA, f32 planeBB, f32 planeBC, f32 planeBDist, Vec3f* point, Vec3f* closestPoint); +void Math3D_PointOnDirectedLine(Vec3f* v0, Vec3f* dir, f32 scale, Vec3f* ret); +void Math3D_LineSplitRatio(Vec3f* v0, Vec3f* v1, f32 ratio, Vec3f* ret); +f32 Math3D_Cos(Vec3f* a, Vec3f* b); +s32 Math3D_CosOut(Vec3f* a, Vec3f* b, f32* dst); +void Math3D_Vec3fReflect(Vec3f* vec, Vec3f* normal, Vec3f* reflVec); +s32 Math3D_PointInSquare2D(f32 upperLeftX, f32 lowerRightX, f32 upperLeftY, f32 lowerRightY, f32 x, f32 y); +s32 Math3D_CirSquareVsTriSquareXY(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 centerX, f32 centerY, f32 radius); +s32 Math3D_CirSquareVsTriSquareYZ(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 centerY, f32 centerZ, f32 radius); +s32 Math3D_CirSquareVsTriSquareZX(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 centerZ, f32 centerX, f32 radius); +s32 Math3D_SphCubeVsTriCube(Vec3f* v0, Vec3f* v1, Vec3f* v2, Vec3f* center, f32 radius); +f32 Math3D_Dist1DSq(f32 a, f32 b); +f32 Math3D_Dist1D(f32 a, f32 b); +f32 Math3D_Dist2DSq(f32 x0, f32 y0, f32 x1, f32 y1); +f32 Math3D_Dist2D(f32 x0, f32 y0, f32 x1, f32 y1); +f32 Math3D_Vec3fMagnitudeSq(Vec3f* vec); +f32 Math3D_Vec3fMagnitude(Vec3f* vec); +f32 Math3D_Vec3fDistSq(Vec3f* a, Vec3f* b); +f32 Math3D_Vec3f_DistXYZ(Vec3f* a, Vec3f* b); +f32 Math3D_DistXYZ16toF(Vec3s* a, Vec3f* b); +f32 Math3D_Vec3fDiff_CrossZ(Vec3f* a, Vec3f* b, f32 dx, f32 dy); +f32 Math3D_Vec3fDiff_CrossX(Vec3f* a, Vec3f* b, f32 dy, f32 dz); +f32 Math3D_Vec3fDiff_CrossY(Vec3f* a, Vec3f* b, f32 dz, f32 dx); +void Math3D_Vec3f_Cross(Vec3f* a, Vec3f* b, Vec3f* ret); +void Math3D_SurfaceNorm(Vec3f* va, Vec3f* vb, Vec3f* vc, Vec3f* normal); +s32 Math3D_PointRelativeToCubeFaces(Vec3f* point, Vec3f* min, Vec3f* max); +s32 Math3D_PointRelativeToCubeEdges(Vec3f* point, Vec3f* min, Vec3f* max); +s32 Math3D_PointRelativeToCubeVertices(Vec3f* point, Vec3f* min, Vec3f* max); +s32 Math3D_LineVsCube(Vec3f* min, Vec3f* max, Vec3f* a, Vec3f* b); +s32 Math3D_LineVsCubeShort(Vec3s* min, Vec3s* max, Vec3s* a, Vec3s* b); +void Math3D_RotateXZPlane(Vec3f* pointOnPlane, s16 angle, f32* a, f32* c, f32* d); +void Math3D_DefPlane(Vec3f* va, Vec3f* vb, Vec3f* vc, f32* nx, f32* ny, f32* nz, f32* originDist); +f32 Math3D_PlaneF(f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* pointOnPlane); +f32 Math3D_Plane(Plane* plane, Vec3f* pointOnPlane); +f32 Math3D_UDistPlaneToPos(f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* p); +f32 Math3D_DistPlaneToPos(f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* p); +s32 Math3D_TriChkPointParaYImpl(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 z, f32 x, f32 detMax, f32 chkDist, f32 ny); +s32 Math3D_TriChkPointParaYDeterminate(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 z, f32 x, f32 detMax, f32 ny); +s32 Math3D_TriChkPointParaYSlopedY(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 z, f32 x); +s32 Math3D_TriChkPointParaYIntersectDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 z, f32 x, f32* yIntersect, f32 chkDist); +s32 Math3D_TriChkPointParaYIntersectInsideTri(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 z, f32 x, f32* yIntersect, f32 chkDist); +s32 Math3D_TriChkPointParaY(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 ny, f32 z, f32 x); +s32 Math3D_TriChkLineSegParaYIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 z, f32 x, f32* yIntersect, f32 y0, f32 y1); +s32 Math3D_TriChkPointParaYDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, Plane* plane, f32 z, f32 x, f32 chkDist); +s32 Math3D_TriChkPointParaYImplNoCheckRange(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 z, f32 x, f32 detMax, f32 chkDist, f32 ny); +s32 Math3D_TriChkPointParaYNoRangeCheckIntersectInsideTri(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 z, f32 x, f32* yIntersect, f32 chkDist); +s32 Math3D_TriChkPointParaXImpl(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 y, f32 z, f32 detMax, f32 chkDist, f32 ny); +s32 Math3D_TriChkPointParaXDeterminate(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 y, f32 z, f32 detMax, f32 nx); +s32 Math3D_TriChkPointParaXIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 y, f32 z, f32* xIntersect); +s32 Math3D_TriChkPointParaX(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 y, f32 z); +s32 Math3D_TriChkLineSegParaXIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 y, f32 z, f32* xIntersect, f32 x0, f32 x1); +s32 Math3D_TriChkLineSegParaXDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, Plane* plane, f32 y, f32 z, f32 chkDist); +s32 Math3D_TriChkPointParaZImpl(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 x, f32 y, f32 detMax, f32 chkDist, f32 nz); +s32 Math3D_TriChkPointParaZDeterminate(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 y, f32 z, f32 detMax, f32 nx); +s32 Math3D_TriChkPointParaZIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 x, f32 y, f32* zIntersect); +s32 Math3D_TriChkPointParaZ(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 y, f32 z); +s32 Math3D_TriChkLineSegParaZIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 x, f32 y, f32* zIntersect, f32 z0, f32 z1); +s32 Math3D_TriChkLineSegParaZDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, Plane* plane, f32 x, f32 y, f32 chkDist); +s32 Math3D_LineSegFindPlaneIntersect(f32 pointADist, f32 pointBDist, Vec3f* pointA, Vec3f* pointB, Vec3f* intersect); +s32 Math3D_LineSegVsPlane(f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* linePointA, Vec3f* linePointB, Vec3f* intersect, s32 fromFront); +s32 Math3D_TriLineIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* linePointA, Vec3f* linePointB, Vec3f* intersect, s32 fromFront) ; +void Math3D_TriNorm(TriNorm* tri, Vec3f* va, Vec3f* vb, Vec3f* vc); +s32 Math3D_PointInSph(Sphere16* sphere, Vec3f* point); +s32 Math3D_PointDistSqToLine2DImpl(f32 x0, f32 y0, f32 x1, f32 y1, f32 x2, f32 y2, f32* perpXOut, f32* perpYOut, f32* lineLenSq); // returns boolean +s32 Math3D_PointDistSqToLine2D(f32 x0, f32 y0, f32 x1, f32 y1, f32 x2, f32 y2, f32* lineLenSq); +s32 Math3D_PointDistSqToLineXY(f32 x0, f32 y0, Vec3f* p1, Vec3f* p2, f32* lineLenSq); +s32 Math3D_PointDistSqToLineYZ(f32 y0, f32 z0, Vec3f* p1, Vec3f* p2, f32* lineLenSq); +s32 Math3D_PointDistSqToLineZX(f32 z0, f32 x0, Vec3f* p1, Vec3f* p2, f32* lineLenSq); +s32 Math3D_LineVsSph(Sphere16* sphere, Linef* line); +void Math3D_GetSphVsTriIntersectPoint(Sphere16* sphere, TriNorm* tri, Vec3f* intersectPoint); +s32 Math3D_TriVsSphIntersect(Sphere16* sphere, TriNorm* tri, Vec3f* intersectPoint); +s32 Math3D_PointInCyl(Cylinder16* cyl, Vec3f* point); +s32 Math3D_CylVsLineSeg(Cylinder16* cyl, Vec3f* linePointA, Vec3f* linePointB, Vec3f* intersectA, Vec3f* intersectB); +s32 Math3D_CylTriVsIntersect(Cylinder16* cyl, TriNorm* tri, Vec3f* intersect); +s32 Math3D_CylVsTri(Cylinder16* cyl, TriNorm* tri); +s32 Math3D_SphVsSph(Sphere16* sphereA, Sphere16* sphereB); +s32 Math3D_SphVsSphOverlap(Sphere16* sphereA, Sphere16* sphereB, f32* overlapSize); +s32 Math3D_SphVsSphOverlapCenterDist(Sphere16* sphereA, Sphere16* sphereB, f32* overlapSize, f32* centerDist); +s32 Math3D_SphVsCylOverlap(Sphere16* sph, Cylinder16* cyl, f32* overlapSize); +s32 Math3D_SphVsCylOverlapCenterDist(Sphere16* sph, Cylinder16* cyl, f32* overlapSize, f32* centerDist); +s32 Math3D_CylVsCylOverlap(Cylinder16* ca, Cylinder16* cb, f32* overlapSize); +s32 Math3D_CylVsCylOverlapCenterDist(Cylinder16* ca, Cylinder16* cb, f32* overlapSize, f32* centerDist); +s32 Math3D_TriVsTriIntersect(TriNorm* ta, TriNorm* tb, Vec3f* intersect); +s32 Math3D_XZInSphere(Sphere16* sphere, f32 x, f32 z); +s32 Math3D_XYInSphere(Sphere16* sphere, f32 x, f32 y); +s32 Math3D_YZInSphere(Sphere16* sphere, f32 y, f32 z); +s32 Math3D_CircleLineIntersections(f32 centreX, f32 centerY, f32 radius, f32 pointX, f32 pointY, f32 dirX, f32 dirY, f32* intersectAX, f32* intersectAY, f32* intersectBX, f32* intersectBY); +void func_8017FD44(Vec3f* arg0, Vec3f* arg1, Vec3f* dst, f32 arg3); + #endif diff --git a/spec b/spec index b0581f410c..3a80779952 100644 --- a/spec +++ b/spec @@ -573,8 +573,6 @@ beginseg include "$(BUILD_DIR)/src/code/sys_initial_check.o" include "$(BUILD_DIR)/src/code/sys_math.o" include "$(BUILD_DIR)/src/code/sys_math3d.o" - include "$(BUILD_DIR)/data/code/sys_math3d.data.o" - include "$(BUILD_DIR)/data/code/sys_math3d.bss.o" include "$(BUILD_DIR)/src/code/sys_math_atan.o" include "$(BUILD_DIR)/src/code/sys_matrix.o" include "$(BUILD_DIR)/src/code/sys_ucode.o" diff --git a/src/code/sys_math3d.c b/src/code/sys_math3d.c index 45b94d5690..ad617e50ff 100644 --- a/src/code/sys_math3d.c +++ b/src/code/sys_math3d.c @@ -1,189 +1,2464 @@ -#include "global.h" - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_Normalize.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_PlaneVsLineSegClosestPoint.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_80179798.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_80179A44.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_80179B34.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_80179B94.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_80179D74.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_ScaleAndAdd.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_Lerp.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_Parallel.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_AngleBetweenVectors.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_80179F64.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_XZBoundCheck.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017A09C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017A1D0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017A304.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017A438.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_XZLengthSquared.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_XZLength.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_XZDistanceSquared.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_XZDistance.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_LengthSquared.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_Vec3fMagnitude.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_Vec3fDistSq.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_Distance.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_DistanceS.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017A7B8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017A7F8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017A838.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_CrossProduct.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_SurfaceNorm.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_PointRelativeToCubeFaces.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_PointRelativeToCubeEdges.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_PointRelativeToCubeVertices.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_LineVsCube.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017B68C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017B7F8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_UnitNormalVector.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_SignedDistanceFromPlane.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017B9D8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_UDistPlaneToPos.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_DistPlaneToPos.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYDist.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017BD98.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017BDE0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYIntersectDist.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYIntersectInsideTri.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017BF8C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaYIntersect.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017C17C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017C1F0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYIntersectInsideTri2.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaXDist.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017C808.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaXIntersect.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017C904.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaXIntersect.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017CB08.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaZDist.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017CEA8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaZIntersect.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017CFA4.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaZIntersect.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017D1AC.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017D220.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_LineSegVsPlane.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017D404.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_TriSetCoords.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_IsPointInSphere.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_PointDistToLine2D.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017D7C0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017D814.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017D91C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017DA24.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_LineVsSph.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017DD34.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_ColSphereTri.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017E294.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017E350.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_ColCylinderTri.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017F1A0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_SphVsSph.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_ColSphereSphereIntersect.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_ColSphereSphereIntersectAndDistance.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_ColSphereCylinderDistance.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_ColSphereCylinderDistanceAndAmount.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_ColCylinderCylinderAmount.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_ColCylinderCylinderAmountAndDistance.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3d_ColTriTri.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_XZInSphere.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_XYInSphere.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/Math3D_YZInSphere.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017FB1C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/sys_math3d/func_8017FD44.s") +#include "prevent_bss_reordering.h" +// clang-format off +// Partial structs taken from "prevent_bss_reordering.h" +struct Dummy200 { int x; }; +struct Dummy201 { int x; }; +struct Dummy202 { int x; }; +struct Dummy203 { int x; }; +struct Dummy204 { int x; }; +struct Dummy205 { int x; }; +struct Dummy206 { int x; }; +struct Dummy207 { int x; }; +struct Dummy208 { int x; }; +struct Dummy209 { int x; }; +struct Dummy210 { int x; }; +struct Dummy211 { int x; }; +struct Dummy212 { int x; }; +// clang-format on + +#include "z64math.h" + +#include "libc/stdbool.h" +#include "PR/gu.h" + +Vec3f gZeroVec3f = { 0.0f, 0.0f, 0.0f }; +Vec3s gZeroVec3s = { 0, 0, 0 }; + +#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0])) + +f32 Math3D_Normalize(Vec3f* vec) { + f32 magnitude = Math3D_Vec3fMagnitude(vec); + + if (IS_ZERO(magnitude)) { + return 0.0f; + } + + vec->x *= 1.0f / magnitude; + vec->y *= 1.0f / magnitude; + vec->z *= 1.0f / magnitude; + return magnitude; +} + +/** + * Creates an infinite line along the intersection of the plane defined from `planeAA`x + `planeAB`y + `planeAB`z + + * `planeADist` = 0 and `planeBA`x + `planeBB`y + `planeBC`z + `planeBDist` = 0, and finds the closest point on that + * intersection to the line segment `linePointA and linePointB`, outputs the intersection to `closestPoint` + */ +s32 Math3D_PlaneVsLineSegClosestPoint(f32 planeAA, f32 planeAB, f32 planeAC, f32 planeADist, f32 planeBA, f32 planeBB, + f32 planeBC, f32 planeBDist, Vec3f* linePointA, Vec3f* linePointB, + Vec3f* closestPoint) { + static InfiniteLine sPlaneIntersectLine; + static Linef sPlaneIntersectSeg; + Vec3f sp34; // unused + + if (!Math3D_PlaneVsPlaneNewLine(planeAA, planeAB, planeAC, planeADist, planeBA, planeBB, planeBC, planeBDist, + &sPlaneIntersectLine)) { + // The planes are parallel + return false; + } + + // create a line segment on the plane. + Math_Vec3f_Copy(&sPlaneIntersectSeg.a, &sPlaneIntersectLine.point); + sPlaneIntersectSeg.b.x = (sPlaneIntersectLine.dir.x * 100.0f) + sPlaneIntersectLine.point.x; + sPlaneIntersectSeg.b.y = (sPlaneIntersectLine.dir.y * 100.0f) + sPlaneIntersectLine.point.y; + sPlaneIntersectSeg.b.z = (sPlaneIntersectLine.dir.z * 100.0f) + sPlaneIntersectLine.point.z; + + // closestPoint is a point on planeIntersect, sp34 is a point on linePointA, linePointB + if (!Math3D_LineSegMakePerpLineSeg(&sPlaneIntersectSeg.a, &sPlaneIntersectSeg.b, linePointA, linePointB, + closestPoint, &sp34)) { + return false; + } + return true; +} + +/** + * Finds the two points on lines A and B where the lines are closest together. + */ +s32 Math3D_LineSegMakePerpLineSeg(Vec3f* lineAPointA, Vec3f* lineAPointB, Vec3f* lineBPointA, Vec3f* lineBPointB, + Vec3f* lineAClosestToB, Vec3f* lineBClosestToA) { + f32 magSq; + f32 scaleB; + f32 lineAx = lineAPointB->x - lineAPointA->x; + f32 lineAy = lineAPointB->y - lineAPointA->y; + f32 lineAz = lineAPointB->z - lineAPointA->z; + f32 lineBx = lineBPointB->x - lineBPointA->x; + f32 lineBy = lineBPointB->y - lineBPointA->y; + f32 lineBz = lineBPointB->z - lineBPointA->z; + f32 compAAlongB; + f32 compBAAlongB; + Vec3f lineAPerpB; + Vec3f lineBAPerpB; + f32 tA; + f32 tB; + + magSq = SQ(lineBx) + SQ(lineBy) + SQ(lineBz); + if (IS_ZERO(magSq)) { + return false; + } + + scaleB = 1.0f / magSq; + + compAAlongB = ((lineAx * lineBx) + (lineAy * lineBy) + (lineAz * lineBz)) * scaleB; + + compBAAlongB = ((lineBx * (lineAPointA->x - lineBPointA->x)) + (lineBy * (lineAPointA->y - lineBPointA->y)) + + (lineBz * (lineAPointA->z - lineBPointA->z))) * + scaleB; + + lineAPerpB.x = lineAx - (lineBx * compAAlongB); + lineAPerpB.y = lineAy - (lineBy * compAAlongB); + lineAPerpB.z = lineAz - (lineBz * compAAlongB); + + magSq = SQXYZ(lineAPerpB); + if (IS_ZERO(magSq)) { + return false; + } + + lineBAPerpB.x = (lineAPointA->x - lineBPointA->x) - (lineBx * compBAAlongB); + lineBAPerpB.y = (lineAPointA->y - lineBPointA->y) - (lineBy * compBAAlongB); + lineBAPerpB.z = (lineAPointA->z - lineBPointA->z) - (lineBz * compBAAlongB); + + tA = -DOTXYZ(lineAPerpB, lineBAPerpB) / magSq; + lineAClosestToB->x = (lineAx * tA) + lineAPointA->x; + lineAClosestToB->y = (lineAy * tA) + lineAPointA->y; + lineAClosestToB->z = (lineAz * tA) + lineAPointA->z; + + tB = (compAAlongB * tA) + compBAAlongB; + lineBClosestToA->x = (lineBx * tB) + lineBPointA->x; + lineBClosestToA->y = (lineBy * tB) + lineBPointA->y; + lineBClosestToA->z = (lineBz * tB) + lineBPointA->z; + + return true; +} + +/** + * Determines the closest point on the line `line` to `pos`, by forming a line perpendicular from + * `point` to `line` closest point is placed in `closestPoint` + */ +f32 Math3D_LineClosestToPoint(InfiniteLine* line, Vec3f* pos, Vec3f* closestPoint) { + f32 dirMagnitudeSq = Math3D_Vec3fMagnitudeSq(&line->dir); + f32 t; + + if (IS_ZERO(dirMagnitudeSq)) { + Math_Vec3f_Copy(closestPoint, pos); + //! @bug Missing early return + } + + t = (((pos->x - line->point.x) * line->dir.x) + ((pos->y - line->point.y) * line->dir.y) + + ((pos->z - line->point.z) * line->dir.z)) / + dirMagnitudeSq; + closestPoint->x = (line->dir.x * t) + line->point.x; + closestPoint->y = (line->dir.y * t) + line->point.y; + closestPoint->z = (line->dir.z * t) + line->point.z; + + return t; +} + +void Math3D_FindPointOnPlaneIntersect(f32 planeAAxis1Norm, f32 planeAAxis2Norm, f32 planeBAxis1Norm, + f32 planeBAxis2Norm, f32 axis3Direction, f32 planeADist, f32 planeBDist, + f32* axis1Point, f32* axis2Point) { + *axis1Point = ((planeAAxis2Norm * planeBDist) - (planeBAxis2Norm * planeADist)) / axis3Direction; + *axis2Point = ((planeBAxis1Norm * planeADist) - (planeAAxis1Norm * planeBDist)) / axis3Direction; +} + +/** + * Creates a line between the intersections of two planes defined from `planeAA`x + `planeAB`y + `planeAC`z + + * `planeADist` = 0 and `planeBA`x + `planeBB`y + `planeBC`z + `planeBDist` = 0, and outputs the line to `intersect`. + * Returns false if the planes are parallel. + */ +s32 Math3D_PlaneVsPlaneNewLine(f32 planeAA, f32 planeAB, f32 planeAC, f32 planeADist, f32 planeBA, f32 planeBB, + f32 planeBC, f32 planeBDist, InfiniteLine* intersect) { + s32 pad; + Vec3f planeANormal; + Vec3f planeBNormal; + f32 dirX; + f32 dirY; + f32 dirZ; + + VEC_SET(planeANormal, planeAA, planeAB, planeAC); + VEC_SET(planeBNormal, planeBA, planeBB, planeBC); + + Math3D_Vec3f_Cross(&planeANormal, &planeBNormal, &intersect->dir); + + if (IS_ZERO(intersect->dir.x) && IS_ZERO(intersect->dir.y) && IS_ZERO(intersect->dir.z)) { + // planes are parallel + return false; + } + + dirX = fabsf(intersect->dir.x); + dirY = fabsf(intersect->dir.y); + dirZ = fabsf(intersect->dir.z); + + if ((dirX >= dirY) && (dirX >= dirZ)) { + Math3D_FindPointOnPlaneIntersect(planeAB, planeAC, planeBB, planeBC, intersect->dir.x, planeADist, planeBDist, + &intersect->point.y, &intersect->point.z); + intersect->point.x = 0.0f; + } else if ((dirY >= dirX) && (dirY >= dirZ)) { + Math3D_FindPointOnPlaneIntersect(planeAC, planeAA, planeBC, planeBA, intersect->dir.y, planeADist, planeBDist, + &intersect->point.z, &intersect->point.x); + intersect->point.y = 0.0f; + } else { + Math3D_FindPointOnPlaneIntersect(planeAA, planeAB, planeBA, planeBB, intersect->dir.z, planeADist, planeBDist, + &intersect->point.x, &intersect->point.y); + intersect->point.z = 0.0f; + } + return true; +} + +/** + * Gets the closest point on the line formed from the intersection of of the planes defined from + * `planeAA`x + `planeAB`y + `planeAC`z + `planeADist` = 0 and + * `planeBA`x + `planeBB`y + `planeBC`z + `planeBDist` = 0 + * the point on the intersection line closest to `point` is placed in `closestPoint` + * returns false if the planes are parallel. + */ +s32 Math3D_PlaneVsPlaneVsLineClosestPoint(f32 planeAA, f32 planeAB, f32 planeAC, f32 planeADist, f32 planeBA, + f32 planeBB, f32 planeBC, f32 planeBDist, Vec3f* point, Vec3f* closestPoint) { + static InfiniteLine sPlaneIntersect; + + if (!Math3D_PlaneVsPlaneNewLine(planeAA, planeAB, planeAC, planeADist, planeBA, planeBB, planeBC, planeBDist, + &sPlaneIntersect)) { + return false; + } + Math3D_LineClosestToPoint(&sPlaneIntersect, point, closestPoint); + return true; +} + +/** + * Calculates the point on the line from starting point `v0`, in the direction `dir` scaled by `scale`. Result is placed + * in `ret` + */ +void Math3D_PointOnDirectedLine(Vec3f* v0, Vec3f* dir, f32 scale, Vec3f* ret) { + ret->x = (dir->x * scale) + v0->x; + ret->y = (dir->y * scale) + v0->y; + ret->z = (dir->z * scale) + v0->z; +} + +/** + * Splits the line segment from end points `v0` and `v1`, and splits that segment + * by `ratio` of `v0`:`v1`, places the resulting point on the line in `ret` + */ +void Math3D_LineSplitRatio(Vec3f* v0, Vec3f* v1, f32 ratio, Vec3f* ret) { + Vec3f diff; + + Math_Vec3f_Diff(v1, v0, &diff); + Math3D_PointOnDirectedLine(v0, &diff, ratio, ret); +} + +/** + * Calculates the cosine between vectors `a` and `b` + */ +f32 Math3D_Cos(Vec3f* a, Vec3f* b) { + f32 ret; + + Math3D_CosOut(a, b, &ret); + return ret; +} + +/** + * Calculates the cosine between vectors `a` and `b` and places the result in `dst` + * returns true if the cosine cannot be calculated because the product of the magnitudes is zero + */ +s32 Math3D_CosOut(Vec3f* a, Vec3f* b, f32* dst) { + f32 magProduct = Math3D_Vec3fMagnitude(a) * Math3D_Vec3fMagnitude(b); + + if (IS_ZERO(magProduct)) { + *dst = 0.0f; + return true; + } + *dst = ((a->x * b->x) + (a->y * b->y) + (a->z * b->z)) / magProduct; + return false; +} + +/** + * Reflects vector `vec` across the normal vector `normal`, reflection vector is placed in + * `reflVec` + */ +void Math3D_Vec3fReflect(Vec3f* vec, Vec3f* normal, Vec3f* reflVec) { + f32 normScaleY; + Vec3f negVec; + f32 normScaleZ; + f32 normScaleX; + f32 vecDotNorm; + + negVec.x = vec->x * -1.0f; + negVec.y = vec->y * -1.0f; + negVec.z = vec->z * -1.0f; + + vecDotNorm = Math3D_Cos(&negVec, normal); + + normScaleX = normal->x * vecDotNorm; + normScaleY = normal->y * vecDotNorm; + normScaleZ = normal->z * vecDotNorm; + + reflVec->x = ((normScaleX + vec->x) + (normScaleX + vec->x)) + negVec.x; + reflVec->y = ((normScaleY + vec->y) + (normScaleY + vec->y)) + negVec.y; + reflVec->z = ((normScaleZ + vec->z) + (normScaleZ + vec->z)) + negVec.z; +} + +/** + * Checks if the point (`x`,`y`) is contained within the square formed from (`upperLeftX`,`upperLeftY`) to + * (`lowerRightX`,`lowerRightY`) + */ +s32 Math3D_PointInSquare2D(f32 upperLeftX, f32 lowerRightX, f32 upperLeftY, f32 lowerRightY, f32 x, f32 y) { + if ((x >= upperLeftX) && (x <= lowerRightX) && (y >= upperLeftY) && (y <= lowerRightY)) { + return true; + } + return false; +} + +/** + * Checks if the square in the XY planed formed around the circle with center (`centerX`,`centerY`) + * with radius `radius` touches any portion of the square formed around the triangle formed from `v0`, `v1`, and `v2` + */ +s32 Math3D_CirSquareVsTriSquareXY(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 centerX, f32 centerY, f32 radius) { + f32 min; + f32 max; + + if (v0->x < v1->x) { + min = v0->x; + max = v1->x; + } else { + min = v1->x; + max = v0->x; + } + + if (min > v2->x) { + min = v2->x; + } else if (max < v2->x) { + max = v2->x; + } + + if ((centerX < (min - radius)) || ((max + radius) < centerX)) { + return false; + } + if (v0->y < v1->y) { + min = v0->y; + max = v1->y; + } else { + min = v1->y; + max = v0->y; + } + if (min > v2->y) { + min = v2->y; + } else if (max < v2->y) { + max = v2->y; + } + + if ((centerY < (min - radius)) || (centerY > (max + radius))) { + return false; + } + return true; +} + +/** + * Checks if the square in the YZ planed formed around the circle with center (`centerY`,`centerZ`) + * with radius `radius` touches any portion of the square formed around the triangle formed from `v0`, `v1`, and `v2` + */ +s32 Math3D_CirSquareVsTriSquareYZ(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 centerY, f32 centerZ, f32 radius) { + f32 min; + f32 max; + + if (v0->z < v1->z) { + min = v0->z; + max = v1->z; + } else { + min = v1->z; + max = v0->z; + } + + if (min > v2->z) { + min = v2->z; + } else if (max < v2->z) { + max = v2->z; + } + + if ((centerZ < (min - radius)) || ((max + radius) < centerZ)) { + return false; + } + + if (v0->y < v1->y) { + min = v0->y; + max = v1->y; + } else { + min = v1->y; + max = v0->y; + } + + if (min > v2->y) { + min = v2->y; + } else if (max < v2->y) { + max = v2->y; + } + + if ((centerY < (min - radius)) || ((max + radius) < centerY)) { + return false; + } + return true; +} + +/** + * Checks if the square in the ZX planed formed around the circle with center (`centerZ`,`centerX`) + * with radius `radius` touches any portion of the square formed around the triangle formed from `v0`, `v1`, and `v2` + */ +s32 Math3D_CirSquareVsTriSquareZX(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 centerZ, f32 centerX, f32 radius) { + f32 min; + f32 max; + + if (v0->x < v1->x) { + min = v0->x; + max = v1->x; + } else { + min = v1->x; + max = v0->x; + } + + if (min > v2->x) { + min = v2->x; + } else if (max < v2->x) { + max = v2->x; + } + + if ((centerX < (min - radius)) || ((max + radius) < centerX)) { + return false; + } + + if (v0->z < v1->z) { + min = v0->z; + max = v1->z; + } else { + min = v1->z; + max = v0->z; + } + + if (min > v2->z) { + min = v2->z; + } else if (max < v2->z) { + max = v2->z; + } + + if ((centerZ < (min - radius)) || ((max + radius) < centerZ)) { + return false; + } + return true; +} + +/** + * Checks if the cube formed around the triangle formed from `v0`, `v1`, and `v2` + * has any portion touching the cube formed around the sphere with center `center` + * and radius of `radius` + */ +s32 Math3D_SphCubeVsTriCube(Vec3f* v0, Vec3f* v1, Vec3f* v2, Vec3f* center, f32 radius) { + f32 min; + f32 max; + + if (v0->x < v1->x) { + min = v0->x; + max = v1->x; + } else { + min = v1->x; + max = v0->x; + } + + if (min > v2->x) { + min = v2->x; + } else if (max < v2->x) { + max = v2->x; + } + + if ((center->x < (min - radius)) || ((max + radius) < center->x)) { + return false; + } + + if (v0->z < v1->z) { + min = v0->z; + max = v1->z; + } else { + min = v1->z; + max = v0->z; + } + + if (min > v2->z) { + min = v2->z; + } else if (max < v2->z) { + max = v2->z; + } + + if ((center->z < (min - radius)) || ((max + radius) < center->z)) { + return false; + } + + if (v0->y < v1->y) { + min = v0->y; + max = v1->y; + } else { + min = v1->y; + max = v0->y; + } + + if (min > v2->y) { + min = v2->y; + } else if (max < v2->y) { + max = v2->y; + } + + if ((center->y < (min - radius)) || ((max + radius) < center->y)) { + return false; + } + return true; +} + +/** + * Returns the distance squared between `a` and `b` on a single axis + */ +f32 Math3D_Dist1DSq(f32 a, f32 b) { + return SQ(a) + SQ(b); +} + +/** + * Returns the distance between `a` and `b` on a single axis + */ +f32 Math3D_Dist1D(f32 a, f32 b) { + return sqrtf(Math3D_Dist1DSq(a, b)); +} + +/** + * Returns the distance squared between (`x0`,`y0`) and (`x1`,`x2`) + */ +f32 Math3D_Dist2DSq(f32 x0, f32 y0, f32 x1, f32 y1) { + return Math3D_Dist1DSq(x0 - x1, y0 - y1); +} + +/** + * Returns the distance between points (`x0`,`y0`) and (`x1`,`y1`) + */ +f32 Math3D_Dist2D(f32 x0, f32 y0, f32 x1, f32 y1) { + return sqrtf(Math3D_Dist2DSq(x0, y0, x1, y1)); +} + +/** + * Returns the magnitude (length) squared of `vec` + */ +f32 Math3D_Vec3fMagnitudeSq(Vec3f* vec) { + return SQ(vec->x) + SQ(vec->y) + SQ(vec->z); +} + +/** + * Returns the magnitude (length) of `vec` + */ +f32 Math3D_Vec3fMagnitude(Vec3f* vec) { + return sqrtf(Math3D_Vec3fMagnitudeSq(vec)); +} + +/** + * Returns the distance between `a` and `b` squared. + */ +f32 Math3D_Vec3fDistSq(Vec3f* a, Vec3f* b) { + Vec3f diff; + + Math_Vec3f_Diff(a, b, &diff); + + return Math3D_Vec3fMagnitudeSq(&diff); +} + +/* + * Calculates the distance between points `a` and `b` + */ +f32 Math3D_Vec3f_DistXYZ(Vec3f* a, Vec3f* b) { + return Math_Vec3f_DistXYZ(a, b); +} + +/* + * Calculates the distance between `a` and `b`. + */ +f32 Math3D_DistXYZ16toF(Vec3s* a, Vec3f* b) { + Vec3f diff; + + diff.x = a->x - b->x; + diff.y = a->y - b->y; + diff.z = a->z - b->z; + + return Math3D_Vec3fMagnitude(&diff); +} + +static Vec3f sABDiff; +static Vec3f sACDiff; + +/** + * Gets the Z portion of the cross product of vectors `a - (`dx`,`dy`,z) and `b` - (`dx`,`dy`,z) + */ +f32 Math3D_Vec3fDiff_CrossZ(Vec3f* a, Vec3f* b, f32 dx, f32 dy) { + return ((a->x - dx) * (b->y - dy)) - ((a->y - dy) * (b->x - dx)); +} + +/** + * Gets the X portion of the cross product of vectors `a - (x,`dy`,`dz`) and `b` - (x,`dy`,`dz`) + */ +f32 Math3D_Vec3fDiff_CrossX(Vec3f* a, Vec3f* b, f32 dy, f32 dz) { + return ((a->y - dy) * (b->z - dz)) - ((a->z - dz) * (b->y - dy)); +} + +/** + * Gets the Y portion of the cross product of vectors `a - (`dx`,y,`dz`) and `b` - (`dx`,y,`dz`) + */ +f32 Math3D_Vec3fDiff_CrossY(Vec3f* a, Vec3f* b, f32 dz, f32 dx) { + return ((a->z - dz) * (b->x - dx)) - ((a->x - dx) * (b->z - dz)); +} + +/** + * Gets the Cross Product of vectors `a` and `b` and places the result in `ret` + */ +void Math3D_Vec3f_Cross(Vec3f* a, Vec3f* b, Vec3f* ret) { + ret->x = (a->y * b->z) - (a->z * b->y); + ret->y = (a->z * b->x) - (a->x * b->z); + ret->z = (a->x * b->y) - (a->y * b->x); +} + +/* + * Calculates the normal vector to a surface with sides `vb` - `va` and `vc` - `va` + * outputs the normal to `normal` + */ +void Math3D_SurfaceNorm(Vec3f* va, Vec3f* vb, Vec3f* vc, Vec3f* normal) { + Math_Vec3f_Diff(vb, va, &sABDiff); + Math_Vec3f_Diff(vc, va, &sACDiff); + Math3D_Vec3f_Cross(&sABDiff, &sACDiff, normal); +} + +/** + * Creates flags relative to the faces of a cube. + */ +s32 Math3D_PointRelativeToCubeFaces(Vec3f* point, Vec3f* min, Vec3f* max) { + s32 ret = 0; + + if (point->x > max->x) { + ret = 1; + } else if (point->x < min->x) { + ret |= 2; + } + + if (point->y > max->y) { + ret |= 4; + } else if (point->y < min->y) { + ret |= 8; + } + + if (point->z > max->z) { + ret |= 0x10; + } else if (point->z < min->z) { + ret |= 0x20; + } + + return ret; +} + +/** + * Creates flags of `point` relative to the edges of a cube + */ +s32 Math3D_PointRelativeToCubeEdges(Vec3f* point, Vec3f* min, Vec3f* max) { + s32 ret = 0; + + if ((-min->x + max->y) < (-point->x + point->y)) { + ret |= 1; + } + + if ((-point->x + point->y) < (-max->x + min->y)) { + ret |= 2; + } + + if ((max->x + max->y) < (point->x + point->y)) { + ret |= 4; + } + + if ((point->x + point->y) < (min->x + min->y)) { + ret |= 8; + } + + if ((-min->z + max->y) < (-point->z + point->y)) { + ret |= 0x10; + } + + if ((-point->z + point->y) < (-max->z + min->y)) { + ret |= 0x20; + } + + if ((max->z + max->y) < (point->z + point->y)) { + ret |= 0x40; + } + + if ((point->z + point->y) < (min->z + min->y)) { + ret |= 0x80; + } + + if ((-min->z + max->x) < (-point->z + point->x)) { + ret |= 0x100; + } + + if ((-point->z + point->x) < (-max->z + min->x)) { + ret |= 0x200; + } + + if ((max->z + max->x) < (point->z + point->x)) { + ret |= 0x400; + } + + if ((point->z + point->x) < (min->z + min->x)) { + ret |= 0x800; + } + return ret; +} + +/** + * Creates flags for `point` relative to the vertices of a cube + */ +s32 Math3D_PointRelativeToCubeVertices(Vec3f* point, Vec3f* min, Vec3f* max) { + s32 ret = 0; + + if ((max->x + max->y + max->z) < (point->x + point->y + point->z)) { + ret = 1; + } + + if ((-min->x + max->y + max->z) < (-point->x + point->y + point->z)) { + ret |= 2; + } + + if ((-min->x + max->y - min->z) < (-point->x + point->y - point->z)) { + ret |= 4; + } + + if ((max->x + max->y - min->z) < (point->x + point->y - point->z)) { + ret |= 8; + } + + if ((max->x - min->y + max->z) < (point->x - point->y + point->z)) { + ret |= 0x10; + } + + //! @bug: The next 2 conditions are the same check. + if ((-min->x - min->y + max->z) < (-point->x - point->y + point->z)) { + ret |= 0x20; + } + + if ((-min->x - min->y + max->z) < (-point->x - point->y + point->z)) { + ret |= 0x40; + } + + if ((-min->x - min->y - min->z) < (-point->x - point->y - point->z)) { + ret |= 0x80; + } + return ret; +} + +/** + * Checks if a line segment with endpoints `a` and `b` intersect a cube + */ +s32 Math3D_LineVsCube(Vec3f* min, Vec3f* max, Vec3f* a, Vec3f* b) { + static Vec3f sTriVtx0; + static Vec3f sTriVtx1; + static Vec3f sTriVtx2; + static Vec3f sIntersectPoint; + s32 flags[2]; + + flags[0] = flags[1] = 0; + flags[0] = Math3D_PointRelativeToCubeFaces(a, min, max); + if (!flags[0]) { + return true; + } + + flags[1] = Math3D_PointRelativeToCubeFaces(b, min, max); + if (!flags[1]) { + return true; + } + + if (flags[0] & flags[1]) { + return false; + } + + flags[0] |= (Math3D_PointRelativeToCubeEdges(a, min, max) << 8); + flags[1] |= (Math3D_PointRelativeToCubeEdges(b, min, max) << 8); + if (flags[0] & flags[1]) { + return false; + } + + flags[0] |= (Math3D_PointRelativeToCubeVertices(a, min, max) << 0x18); + flags[1] |= (Math3D_PointRelativeToCubeVertices(b, min, max) << 0x18); + if (flags[0] & flags[1]) { + return false; + } + + // face 1 + sTriVtx0.x = min->x; + sTriVtx0.y = min->y; + sTriVtx0.z = min->z; + sTriVtx1.x = min->x; + sTriVtx1.y = min->y; + sTriVtx1.z = max->z; + sTriVtx2.x = min->x; + sTriVtx2.y = max->y; + sTriVtx2.z = max->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, -1.0f, 0.0f, 0.0f, min->x, a, b, &sIntersectPoint, + 0)) { + return true; + } + + sTriVtx1.x = min->x; + sTriVtx1.y = max->y; + sTriVtx1.z = max->z; + sTriVtx2.x = min->x; + sTriVtx2.y = max->y; + sTriVtx2.z = min->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, -1.0f, 0.0f, 0.0f, min->x, a, b, &sIntersectPoint, + 0)) { + return true; + } + + // face 2 + sTriVtx0.x = min->x; + sTriVtx0.y = max->y; + sTriVtx0.z = max->z; + sTriVtx1.x = min->x; + sTriVtx1.y = min->y; + sTriVtx1.z = max->z; + sTriVtx2.x = max->x; + sTriVtx2.y = max->y; + sTriVtx2.z = max->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 0.0f, 0.0f, 1.0f, -max->z, a, b, &sIntersectPoint, + 0)) { + return true; + } + sTriVtx0.x = max->x; + sTriVtx0.y = max->y; + sTriVtx0.z = max->z; + sTriVtx2.x = max->x; + //! @bug trVtx1.y should be sTriVtx2.y, prevents a tri on the cube from being checked. + sTriVtx1.y = min->y; + sTriVtx2.z = max->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 0.0f, 0.0f, 1.0f, -max->z, a, b, &sIntersectPoint, + 0)) { + return true; + } + + // face 3 + sTriVtx1.x = min->x; + sTriVtx1.y = max->y; + sTriVtx1.z = min->z; + sTriVtx2.x = min->x; + sTriVtx2.y = max->y; + sTriVtx2.z = max->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 0.0f, 1.0f, 0.0f, -max->y, a, b, &sIntersectPoint, + 0)) { + return true; + } + sTriVtx1.x = max->x; + sTriVtx1.y = max->y; + sTriVtx1.z = min->z; + sTriVtx2.x = min->x; + sTriVtx2.y = max->y; + sTriVtx2.z = min->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 0.0f, 1.0f, 0.0f, -max->y, a, b, &sIntersectPoint, + 0)) { + return true; + } + + // face 4 + sTriVtx0.x = min->x; + sTriVtx0.y = min->y; + sTriVtx0.z = min->z; + sTriVtx1.x = min->x; + sTriVtx1.y = max->y; + sTriVtx1.z = min->z; + sTriVtx2.x = max->x; + sTriVtx2.y = max->y; + sTriVtx2.z = min->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 0.0f, 0.0f, -1.0f, min->z, a, b, &sIntersectPoint, + 0)) { + return true; + } + sTriVtx1.x = max->x; + sTriVtx1.y = max->y; + sTriVtx1.z = min->z; + sTriVtx2.x = max->x; + sTriVtx2.y = min->y; + sTriVtx2.z = min->z; + + // face 5 + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 0.0f, 0.0f, -1.0f, min->z, a, b, &sIntersectPoint, + 0)) { + return true; + } + sTriVtx1.x = max->x; + sTriVtx1.y = min->y; + sTriVtx1.z = min->z; + sTriVtx2.x = max->x; + sTriVtx2.y = min->y; + sTriVtx2.z = max->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 0.0f, -1.0f, 0.0f, min->y, a, b, &sIntersectPoint, + 0)) { + return true; + } + sTriVtx1.x = max->x; + sTriVtx1.y = min->y; + sTriVtx1.z = max->z; + sTriVtx2.x = min->x; + sTriVtx2.y = min->y; + sTriVtx2.z = max->z; + + // face 6 + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 0.0f, -1.0f, 0.0f, min->y, a, b, &sIntersectPoint, + 0)) { + return true; + } + sTriVtx0.x = max->x; + sTriVtx0.y = max->y; + sTriVtx0.z = max->z; + sTriVtx1.x = max->x; + sTriVtx1.y = min->y; + sTriVtx1.z = min->z; + sTriVtx2.x = max->x; + sTriVtx2.y = max->y; + sTriVtx2.z = min->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 1.0f, 0.0f, 0.0f, -max->x, a, b, &sIntersectPoint, + 0)) { + return true; + } + sTriVtx1.x = max->x; + sTriVtx1.y = min->y; + sTriVtx1.z = max->z; + sTriVtx2.x = max->x; + sTriVtx2.y = min->y; + sTriVtx2.z = min->z; + if (Math3D_TriLineIntersect(&sTriVtx0, &sTriVtx1, &sTriVtx2, 1.0f, 0.0f, 0.0f, -max->x, a, b, &sIntersectPoint, + 0)) { + return true; + } + + return false; +} + +/** + * Checks if a line segment with endpoints `a` and `b` intersect a cube + */ +s32 Math3D_LineVsCubeShort(Vec3s* min, Vec3s* max, Vec3s* a, Vec3s* b) { + static Vec3f sMinF; + static Vec3f sMaxF; + static Vec3f sAF; + static Vec3f sBF; + + sMinF.x = min->x; + sMinF.y = min->y; + sMinF.z = min->z; + sMaxF.x = max->x; + sMaxF.y = max->y; + sMaxF.z = max->z; + sAF.x = a->x; + sAF.y = a->y; + sAF.z = a->z; + sBF.x = b->x; + sBF.y = b->y; + sBF.z = b->z; + + return Math3D_LineVsCube(&sMinF, &sMaxF, &sAF, &sBF); +} + +/** + * Rotates the xz plane around the y axis `angle` degrees. + * outputs the plane equation `a``pointOnPlane->x` + 0y + `c``pointOnPlane->z`+`d` = 0 + */ +void Math3D_RotateXZPlane(Vec3f* pointOnPlane, s16 angle, f32* a, f32* c, f32* d) { + *a = Math_SinS(angle) * 0x7FFF; + *c = Math_CosS(angle) * 0x7FFF; + *d = -((*a * pointOnPlane->x) + (*c * pointOnPlane->z)); +} + +/* + * Defines a plane from vertices `va`, `vb`, and `vc`. Normal components are output to + * `nx`, `ny`, and `nz`. Distance from the origin is output to `originDist` + * Satisfies the plane equation NxVx + NyVy + NzVz + D = 0 + */ +void Math3D_DefPlane(Vec3f* va, Vec3f* vb, Vec3f* vc, f32* nx, f32* ny, f32* nz, f32* originDist) { + static Vec3f sNormal; + f32 normMagnitude; + f32 normMagInv; + + Math3D_SurfaceNorm(va, vb, vc, &sNormal); + normMagnitude = sqrtf(SQ(sNormal.x) + SQ(sNormal.y) + SQ(sNormal.z)); + if (!IS_ZERO(normMagnitude)) { + normMagInv = 1.0f / normMagnitude; + *nx = sNormal.x * normMagInv; + *ny = sNormal.y * normMagInv; + *nz = sNormal.z * normMagInv; + *originDist = -((*nx * va->x) + (*ny * va->y) + (*nz * va->z)); + } else { + *originDist = 0.0f; + *nz = 0.0f; + *ny = 0.0f; + *nx = 0.0f; + } +} + +/* + * Returns the answer to the plane equation with elements specified by arguments. + */ +f32 Math3D_PlaneF(f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* pointOnPlane) { + return (nx * pointOnPlane->x) + (ny * pointOnPlane->y) + (nz * pointOnPlane->z) + originDist; +} + +/* + * Returns the answer to the plane equation + */ +f32 Math3D_Plane(Plane* plane, Vec3f* pointOnPlane) { + return (plane->normal.x * pointOnPlane->x) + (plane->normal.y * pointOnPlane->y) + + (plane->normal.z * pointOnPlane->z) + plane->originDist; +} + +/* + * Calculates the absolute distance from a point `p` to the plane defined as + * `nx`, `ny`, `nz`, and `originDist` + */ +f32 Math3D_UDistPlaneToPos(f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* p) { + return fabsf(Math3D_DistPlaneToPos(nx, ny, nz, originDist, p)); +} + +/* + * Calculates the signed distance from a point `p` to a plane defined as + * `nx`, `ny`, `nz`, and `originDist` + */ +f32 Math3D_DistPlaneToPos(f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* p) { + f32 normMagnitude = sqrtf(SQ(nx) + SQ(ny) + SQ(nz)); + + if (IS_ZERO(normMagnitude)) { + return 0.0f; + } + return Math3D_PlaneF(nx, ny, nz, originDist, p) / normMagnitude; +} + +/** + * Checks if the point defined by (`z`,`x`) is within distance of the triangle defined from `v0`,`v1`, and `v2` + */ +s32 Math3D_TriChkPointParaYImpl(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 z, f32 x, f32 detMax, f32 chkDist, f32 ny) { + f32 detv0v1; + f32 detv1v2; + f32 detv2v0; + f32 distToEdgeSq; + f32 chkDistSq; + + // first check if the point is within range of the triangle. + if (!Math3D_CirSquareVsTriSquareZX(v0, v1, v2, z, x, chkDist)) { + return false; + } + + // check if the point is within `chkDist` units of any vertex of the triangle. + chkDistSq = SQ(chkDist); + if (((SQ(v0->z - z) + SQ(v0->x - x)) < chkDistSq) || ((SQ(v1->z - z) + SQ(v1->x - x)) < chkDistSq) || + ((SQ(v2->z - z) + SQ(v2->x - x)) < chkDistSq)) { + return true; + } + + // Calculate the determinant of each face of the triangle to the point. + // If all the of determinants are within abs(`detMax`), return true. + if (((detMax >= (detv0v1 = ((v0->z - z) * (v1->x - x)) - ((v0->x - x) * (v1->z - z)))) && + (detMax >= (detv1v2 = ((v1->z - z) * (v2->x - x)) - ((v1->x - x) * (v2->z - z)))) && + (detMax >= (detv2v0 = ((v2->z - z) * (v0->x - x)) - ((v2->x - x) * (v0->z - z)))))) { + return true; + } + + if (((-detMax <= (detv0v1 = ((v0->z - z) * (v1->x - x)) - ((v0->x - x) * (v1->z - z)))) && + (-detMax <= (detv1v2 = ((v1->z - z) * (v2->x - x)) - ((v1->x - x) * (v2->z - z)))) && + (-detMax <= (detv2v0 = ((v2->z - z) * (v0->x - x)) - ((v2->x - x) * (v0->z - z)))))) { + return true; + } + + if ((fabsf(ny) > 0.5f) && (chkDistSq > 0.0f)) { + // Do a check on each face of the triangle, if the point is within `chkDist` units return true. + if (Math3D_PointDistSqToLineZX(z, x, v0, v1, &distToEdgeSq) && (distToEdgeSq < chkDistSq)) { + return true; + } + if (Math3D_PointDistSqToLineZX(z, x, v1, v2, &distToEdgeSq) && (distToEdgeSq < chkDistSq)) { + return true; + } + if (Math3D_PointDistSqToLineZX(z, x, v2, v0, &distToEdgeSq) && (distToEdgeSq < chkDistSq)) { + return true; + } + } + return false; +} + +s32 Math3D_TriChkPointParaYDeterminate(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 z, f32 x, f32 detMax, f32 ny) { + return Math3D_TriChkPointParaYImpl(v0, v1, v2, z, x, detMax, 1.0f, ny); +} + +s32 Math3D_TriChkPointParaYSlopedY(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 z, f32 x) { + return Math3D_TriChkPointParaYImpl(v0, v1, v2, z, x, 300.0f, 1.0f, 0.6f); +} + +/** + * Performs the triangle and point check parallel to the Y axis, outputs the y coordinate of the point to `yIntersect` + */ +s32 Math3D_TriChkPointParaYIntersectDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 z, + f32 x, f32* yIntersect, f32 chkDist) { + if (IS_ZERO(ny)) { + return false; + } + + if (Math3D_TriChkPointParaYImpl(v0, v1, v2, z, x, 300.0f, chkDist, ny)) { + *yIntersect = (((-nx * x) - (nz * z)) - originDist) / ny; + return true; + } + + return false; +} + +s32 Math3D_TriChkPointParaYIntersectInsideTri(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, + f32 z, f32 x, f32* yIntersect, f32 chkDist) { + if (IS_ZERO(ny)) { + return false; + } + + if (Math3D_TriChkPointParaYImpl(v0, v1, v2, z, x, 0.0f, chkDist, ny)) { + *yIntersect = (((-nx * x) - (nz * z)) - originDist) / ny; + return true; + } + + return false; +} + +s32 Math3D_TriChkPointParaY(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 ny, f32 z, f32 x) { + if (IS_ZERO(ny)) { + return false; + } + + if (Math3D_TriChkPointParaYImpl(v0, v1, v2, z, x, 300.0f, 1.0f, ny)) { + return true; + } + + return false; +} + +s32 Math3D_TriChkLineSegParaYIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 z, + f32 x, f32* yIntersect, f32 y0, f32 y1) { + f32 pointADist; + f32 pointBDist; + Vec3f planePos; + + if (IS_ZERO(ny)) { + return false; + } + + planePos.x = x; + planePos.y = y0; + planePos.z = z; + + pointADist = Math3D_PlaneF(nx, ny, nz, originDist, &planePos); + planePos.y = y1; + pointBDist = Math3D_PlaneF(nx, ny, nz, originDist, &planePos); + + if (((pointADist > 0.0f) && (pointBDist > 0.0f)) || ((pointADist < 0.0f) && (pointBDist < 0.0f))) { + return false; + } + + if (Math3D_TriChkPointParaYImpl(v0, v1, v2, z, x, 300.0f, 1.0f, ny)) { + *yIntersect = (((-nx * x) - (nz * z)) - originDist) / ny; + return true; + } + + return false; +} + +s32 Math3D_TriChkPointParaYDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, Plane* plane, f32 z, f32 x, f32 chkDist) { + if (IS_ZERO(plane->normal.y)) { + return false; + } + + if (Math3D_TriChkPointParaYImpl(v0, v1, v2, z, x, 0.0f, chkDist, plane->normal.y)) { + return true; + } + + return false; +} + +s32 Math3D_TriChkPointParaYImplNoCheckRange(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 z, f32 x, f32 detMax, f32 chkDist, + f32 ny) { + f32 detv0v1; + f32 detv1v2; + f32 detv2v0; + f32 distToEdgeSq; + f32 chkDistSq; + + // check if the point is within `chkDist` units of any vertex of the triangle. + chkDistSq = SQ(chkDist); + if (((SQ(v0->z - z) + SQ(v0->x - x)) < chkDistSq) || ((SQ(v1->z - z) + SQ(v1->x - x)) < chkDistSq) || + ((SQ(v2->z - z) + SQ(v2->x - x)) < chkDistSq)) { + return true; + } + + // Calculate the determinant of each face of the triangle to the point. + // If all the of determinants are within abs(`detMax`), return true. + if (((detMax >= (detv0v1 = ((v0->z - z) * (v1->x - x)) - ((v0->x - x) * (v1->z - z)))) && + (detMax >= (detv1v2 = ((v1->z - z) * (v2->x - x)) - ((v1->x - x) * (v2->z - z)))) && + (detMax >= (detv2v0 = ((v2->z - z) * (v0->x - x)) - ((v2->x - x) * (v0->z - z)))))) { + return true; + } + if (((-detMax <= (detv0v1 = ((v0->z - z) * (v1->x - x)) - ((v0->x - x) * (v1->z - z)))) && + (-detMax <= (detv1v2 = ((v1->z - z) * (v2->x - x)) - ((v1->x - x) * (v2->z - z)))) && + (-detMax <= (detv2v0 = ((v2->z - z) * (v0->x - x)) - ((v2->x - x) * (v0->z - z)))))) { + return true; + } + + if ((fabsf(ny) > 0.5f) && (chkDistSq > 0.0f)) { + // Do a check on each face of the triangle, if the point is within `chkDist` units return true. + if (Math3D_PointDistSqToLineZX(z, x, v0, v1, &distToEdgeSq) && (distToEdgeSq < chkDistSq)) { + return true; + } + if (Math3D_PointDistSqToLineZX(z, x, v1, v2, &distToEdgeSq) && (distToEdgeSq < chkDistSq)) { + return true; + } + if (Math3D_PointDistSqToLineZX(z, x, v2, v0, &distToEdgeSq) && (distToEdgeSq < chkDistSq)) { + return true; + } + } + + return false; +} + +s32 Math3D_TriChkPointParaYNoRangeCheckIntersectInsideTri(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, + f32 originDist, f32 z, f32 x, f32* yIntersect, f32 chkDist) { + if (IS_ZERO(ny)) { + return false; + } + + if (Math3D_TriChkPointParaYImplNoCheckRange(v0, v1, v2, z, x, 0.0f, chkDist, ny)) { + *yIntersect = (((-nx * x) - (nz * z)) - originDist) / ny; + return true; + } + + return false; +} + +s32 Math3D_TriChkPointParaXImpl(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 y, f32 z, f32 detMax, f32 chkDist, f32 ny) { + f32 detv0v1; + f32 detv1v2; + f32 detv2v0; + f32 distToEdgeSq; + f32 chkDistSq; + + // first check if the point is within range of the triangle. + if (!Math3D_CirSquareVsTriSquareYZ(v0, v1, v2, y, z, chkDist)) { + return false; + } + + // check if the point is within `chkDist` units of any vertex of the triangle. + chkDistSq = SQ(chkDist); + if (((SQ(v0->y - y) + SQ(v0->z - z)) < chkDistSq) || ((SQ(v1->y - y) + SQ(v1->z - z)) < chkDistSq) || + ((SQ(v2->y - y) + SQ(v2->z - z)) < chkDistSq)) { + return true; + } + + // Calculate the determinant of each face of the triangle to the point. + // If all the of determinants are within abs(`detMax`), return true. + if (((detMax >= (detv0v1 = ((v0->y - y) * (v1->z - z)) - ((v0->z - z) * (v1->y - y)))) && + (detMax >= (detv1v2 = ((v1->y - y) * (v2->z - z)) - ((v1->z - z) * (v2->y - y)))) && + (detMax >= (detv2v0 = ((v2->y - y) * (v0->z - z)) - ((v2->z - z) * (v0->y - y)))))) { + return true; + } + if (((-detMax <= (detv0v1 = ((v0->y - y) * (v1->z - z)) - ((v0->z - z) * (v1->y - y)))) && + (-detMax <= (detv1v2 = ((v1->y - y) * (v2->z - z)) - ((v1->z - z) * (v2->y - y)))) && + (-detMax <= (detv2v0 = ((v2->y - y) * (v0->z - z)) - ((v2->z - z) * (v0->y - y)))))) { + return true; + } + + if ((fabsf(ny) > 0.5f) && (chkDistSq > 0.0f)) { + // Do a check on each face of the triangle, if the point is within `chkDist` units return true. + if ((Math3D_PointDistSqToLineYZ(y, z, v0, v1, &distToEdgeSq) != 0) && (distToEdgeSq < chkDistSq)) { + return true; + } + if ((Math3D_PointDistSqToLineYZ(y, z, v1, v2, &distToEdgeSq) != 0) && (distToEdgeSq < chkDistSq)) { + return true; + } + if ((Math3D_PointDistSqToLineYZ(y, z, v2, v0, &distToEdgeSq) != 0) && (distToEdgeSq < chkDistSq)) { + return true; + } + } + return false; +} + +s32 Math3D_TriChkPointParaXDeterminate(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 y, f32 z, f32 detMax, f32 nx) { + return Math3D_TriChkPointParaXImpl(v0, v1, v2, y, z, detMax, 1.0f, nx); +} + +s32 Math3D_TriChkPointParaXIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 y, + f32 z, f32* xIntersect) { + if (IS_ZERO(nx)) { + return false; + } + + if (Math3D_TriChkPointParaXImpl(v0, v1, v2, y, z, 300.0f, 1.0f, nx)) { + *xIntersect = (((-ny * y) - (nz * z)) - originDist) / nx; + return true; + } + + return false; +} + +s32 Math3D_TriChkPointParaX(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 y, f32 z) { + if (IS_ZERO(nx)) { + return false; + } + + if (Math3D_TriChkPointParaXImpl(v0, v1, v2, y, z, 300.0f, 1.0f, nx)) { + return true; + } + + return false; +} + +s32 Math3D_TriChkLineSegParaXIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 y, + f32 z, f32* xIntersect, f32 x0, f32 x1) { + static Vec3f sPlanePos; + f32 pointADist; + f32 pointBDist; + + if (IS_ZERO(nx)) { + return false; + } + + sPlanePos.x = x0; + sPlanePos.y = y; + sPlanePos.z = z; + pointADist = Math3D_PlaneF(nx, ny, nz, originDist, &sPlanePos); + + sPlanePos.x = x1; + pointBDist = Math3D_PlaneF(nx, ny, nz, originDist, &sPlanePos); + + if (((pointADist > 0.0f) && (pointBDist > 0.0f)) || ((pointADist < 0.0f) && (pointBDist < 0.0f))) { + return false; + } + + if (Math3D_TriChkPointParaXImpl(v0, v1, v2, y, z, 300.0f, 1.0f, nx)) { + *xIntersect = (((-ny * y) - (nz * z)) - originDist) / nx; + return true; + } + return false; +} + +s32 Math3D_TriChkLineSegParaXDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, Plane* plane, f32 y, f32 z, f32 chkDist) { + if (IS_ZERO(plane->normal.x)) { + return false; + } + + if (Math3D_TriChkPointParaXImpl(v0, v1, v2, y, z, 0.0f, chkDist, plane->normal.x)) { + return true; + } + + return false; +} + +s32 Math3D_TriChkPointParaZImpl(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 x, f32 y, f32 detMax, f32 chkDist, f32 nz) { + f32 detv0v1; + f32 detv1v2; + f32 detv2v0; + f32 distToEdgeSq; + f32 chkDistSq; + + if (!Math3D_CirSquareVsTriSquareXY(v0, v1, v2, x, y, chkDist)) { + return false; + } + + chkDistSq = SQ(chkDist); + + if (((SQ(x - v0->x) + SQ(y - v0->y)) < chkDistSq) || ((SQ(x - v1->x) + SQ(y - v1->y)) < chkDistSq) || + ((SQ(x - v2->x) + SQ(y - v2->y)) < chkDistSq)) { + // Distance from any vertex to a point is less than chkDist + return true; + } + + if (((detMax >= (detv0v1 = ((v0->x - x) * (v1->y - y)) - ((v0->y - y) * (v1->x - x)))) && + (detMax >= (detv1v2 = ((v1->x - x) * (v2->y - y)) - ((v1->y - y) * (v2->x - x)))) && + (detMax >= (detv2v0 = ((v2->x - x) * (v0->y - y)) - ((v2->y - y) * (v0->x - x)))))) { + return true; + } + + if (((-detMax <= (detv0v1 = ((v0->x - x) * (v1->y - y)) - ((v0->y - y) * (v1->x - x)))) && + (-detMax <= (detv1v2 = ((v1->x - x) * (v2->y - y)) - ((v1->y - y) * (v2->x - x)))) && + (-detMax <= (detv2v0 = ((v2->x - x) * (v0->y - y)) - ((v2->y - y) * (v0->x - x)))))) { + return true; + } + + if (fabsf(nz) > 0.5f && chkDistSq > 0.0f) { + + if (Math3D_PointDistSqToLineXY(x, y, v0, v1, &distToEdgeSq) && (distToEdgeSq < chkDistSq)) { + return true; + } + + if (Math3D_PointDistSqToLineXY(x, y, v1, v2, &distToEdgeSq) && (distToEdgeSq < chkDistSq)) { + return true; + } + + if (Math3D_PointDistSqToLineXY(x, y, v2, v0, &distToEdgeSq) && (distToEdgeSq < chkDistSq)) { + return true; + } + } + + return false; +} + +s32 Math3D_TriChkPointParaZDeterminate(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 y, f32 z, f32 detMax, f32 nx) { + return Math3D_TriChkPointParaZImpl(v0, v1, v2, y, z, detMax, 1.0f, nx); +} + +s32 Math3D_TriChkPointParaZIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 x, + f32 y, f32* zIntersect) { + if (IS_ZERO(nz)) { + return false; + } + + if (Math3D_TriChkPointParaZImpl(v0, v1, v2, x, y, 300.0f, 1.0f, nz)) { + *zIntersect = (((-nx * x) - (ny * y)) - originDist) / nz; + return true; + } + + return false; +} + +s32 Math3D_TriChkPointParaZ(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 y, f32 z) { + if (IS_ZERO(nx)) { + return false; + } + + if (Math3D_TriChkPointParaZImpl(v0, v1, v2, y, z, 300.0f, 1.0f, nx)) { + return true; + } + + return false; +} + +s32 Math3D_TriChkLineSegParaZIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, f32 x, + f32 y, f32* zIntersect, f32 z0, f32 z1) { + static Vec3f sPlanePos; + f32 pointADist; + f32 pointBDist; + + if (IS_ZERO(nz)) { + return false; + } + + sPlanePos.x = x; + sPlanePos.y = y; + sPlanePos.z = z0; + pointADist = Math3D_PlaneF(nx, ny, nz, originDist, &sPlanePos); + + sPlanePos.z = z1; + pointBDist = Math3D_PlaneF(nx, ny, nz, originDist, &sPlanePos); + + if (((pointADist > 0.0f) && (pointBDist > 0.0f)) || ((pointADist < 0.0f) && (pointBDist < 0.0f))) { + // points on the line segment are on the same side of the plane + return false; + } + + if (Math3D_TriChkPointParaZImpl(v0, v1, v2, x, y, 300.0f, 1.0f, nz)) { + *zIntersect = (((-nx * x) - (ny * y)) - originDist) / nz; + return true; + } + return false; +} + +s32 Math3D_TriChkLineSegParaZDist(Vec3f* v0, Vec3f* v1, Vec3f* v2, Plane* plane, f32 x, f32 y, f32 chkDist) { + if (IS_ZERO(plane->normal.z)) { + return false; + } + + if (Math3D_TriChkPointParaZImpl(v0, v1, v2, x, y, 0.0f, chkDist, plane->normal.z)) { + return true; + } + + return false; +} + +s32 Math3D_LineSegFindPlaneIntersect(f32 pointADist, f32 pointBDist, Vec3f* pointA, Vec3f* pointB, Vec3f* intersect) { + f32 distDiff = pointADist - pointBDist; + + if (IS_ZERO(distDiff)) { + // both points lie on the plane. + *intersect = *pointB; + return false; + } + + if (pointADist == 0.0f) { + // pointA is on the plane + *intersect = *pointA; + } else if (pointBDist == 0.0f) { + // pointB is on the plane + *intersect = *pointB; + } else { + // place the point at the intersection point. + Math3D_LineSplitRatio(pointA, pointB, pointADist / distDiff, intersect); + } + return true; +} + +/** + * Determines if the line segment from `linePointA` to `linePointB` crosses the plane + * from `nx` + `ny` + `nz` + `originDist` = 0. If fromFront is set, then detection will only + * be true if point A crosses from the front of the plane + */ +s32 Math3D_LineSegVsPlane(f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* linePointA, Vec3f* linePointB, + Vec3f* intersect, s32 fromFront) { + f32 pointADist = Math3D_PlaneF(nx, ny, nz, originDist, linePointA); + f32 pointBDist = Math3D_PlaneF(nx, ny, nz, originDist, linePointB); + + if ((pointADist * pointBDist) > 0.0f) { + *intersect = *linePointB; + return false; + } + + if (fromFront && (pointADist < 0.0f) && (pointBDist > 0.0f)) { + *intersect = *linePointB; + return false; + } + + return Math3D_LineSegFindPlaneIntersect(pointADist, pointBDist, linePointA, linePointB, intersect); +} + +/* + * Determines if the line formed by `linePointA` and `linePointB` intersect with Triangle formed from + * vertices `v0`, `v1`, and `v2` with normal vector `nx`, `ny`, and `nz` with plane distance from origin + * `originDist` Outputs the intersection point at to `intersect` + * Returns 1 if the line intersects with the triangle, 0 otherwise + */ +s32 Math3D_TriLineIntersect(Vec3f* v0, Vec3f* v1, Vec3f* v2, f32 nx, f32 ny, f32 nz, f32 originDist, Vec3f* linePointA, + Vec3f* linePointB, Vec3f* intersect, s32 fromFront) { + + if (!Math3D_LineSegVsPlane(nx, ny, nz, originDist, linePointA, linePointB, intersect, fromFront)) { + return false; + } + + if (((nx == 0.0f) || Math3D_TriChkPointParaX(v0, v1, v2, nx, intersect->y, intersect->z)) && + ((ny == 0.0f) || Math3D_TriChkPointParaY(v0, v1, v2, ny, intersect->z, intersect->x)) && + ((nz == 0.0f) || Math3D_TriChkPointParaZ(v0, v1, v2, nz, intersect->x, intersect->y))) { + return true; + } + + *intersect = *linePointB; + return false; +} + +/* + * Creates a TriNorm output to `tri`, and calculates the normal vector and plane from vertices + * `va`, `vb`, and `vc` + */ +void Math3D_TriNorm(TriNorm* tri, Vec3f* va, Vec3f* vb, Vec3f* vc) { + tri->vtx[0] = *va; + tri->vtx[1] = *vb; + tri->vtx[2] = *vc; + + Math3D_DefPlane(va, vb, vc, &tri->plane.normal.x, &tri->plane.normal.y, &tri->plane.normal.z, + &tri->plane.originDist); +} + +/* + * Determines if point `point` lies within `sphere` + */ +s32 Math3D_PointInSph(Sphere16* sphere, Vec3f* point) { + if (Math3D_DistXYZ16toF(&sphere->center, point) < sphere->radius) { + return true; + } + + return false; +} + +/** + * Determines the distance from point (`x0`,`y0`) to the line formed from (`x1`,`y1`) and (`x2`,`y2`) + * Distance squared is output to `lineLenSq`, returns true if the point perpendicular from (`x0`,`y0`) + * is contained within the segment between (`x1`,`y1`) and (`x2`,`y2`) + */ +s32 Math3D_PointDistSqToLine2DImpl(f32 x0, f32 y0, f32 x1, f32 y1, f32 x2, f32 y2, f32* perpXOut, f32* perpYOut, + f32* lineLenSq) { + f32 perpendicularRatio; + f32 xDiff = x2 - x1; + f32 yDiff = y2 - y1; + f32 distSq = SQ(xDiff) + SQ(yDiff); + s32 ret = false; + + if (IS_ZERO(distSq)) { + *lineLenSq = 0.0f; + return false; + } + + perpendicularRatio = ((x0 - x1) * xDiff + (y0 - y1) * yDiff) / distSq; + if ((perpendicularRatio >= 0.0f) && (perpendicularRatio <= 1.0f)) { + ret = true; + } + + *perpXOut = (xDiff * perpendicularRatio) + x1; + *perpYOut = (yDiff * perpendicularRatio) + y1; + + *lineLenSq = SQ(*perpXOut - x0) + SQ(*perpYOut - y0); + return ret; +} + +/** + * Determines the distance from point (`x0`,`y0`) to the line formed from (`x1`,`y1`) and (`x2`,`y2`) + * Distance squared is output to `lineLenSq`, returns true if the point perpendicular from (`x0`,`y0`) + * is contained within the segment between (`x1`,`y1`) and (`x2`,`y2`) + */ +s32 Math3D_PointDistSqToLine2D(f32 x0, f32 y0, f32 x1, f32 y1, f32 x2, f32 y2, f32* lineLenSq) { + f32 perpX; + f32 perpY; + + return Math3D_PointDistSqToLine2DImpl(x0, y0, x1, y1, x2, y2, &perpX, &perpY, lineLenSq); +} + +s32 Math3D_PointDistSqToLineXY(f32 x0, f32 y0, Vec3f* p1, Vec3f* p2, f32* lineLenSq) { + f32 perpendicularRatio; + f32 xDiff = p2->x - p1->x; + f32 yDiff = p2->y - p1->y; + f32 distSq = SQ(xDiff) + SQ(yDiff); + f32 perpX; + f32 perpY; + s32 ret = false; + + if (IS_ZERO(distSq)) { + *lineLenSq = 0.0f; + return false; + } + + perpendicularRatio = ((x0 - p1->x) * xDiff + (y0 - p1->y) * yDiff) / distSq; + if ((perpendicularRatio >= 0.0f) && (perpendicularRatio <= 1.0f)) { + ret = true; + } + perpX = (xDiff * perpendicularRatio) + p1->x; + perpY = (yDiff * perpendicularRatio) + p1->y; + *lineLenSq = SQ(perpX - x0) + SQ(perpY - y0); + + return ret; +} + +s32 Math3D_PointDistSqToLineYZ(f32 y0, f32 z0, Vec3f* p1, Vec3f* p2, f32* lineLenSq) { + f32 perpendicularRatio; + f32 yDiff = p2->y - p1->y; + f32 zDiff = p2->z - p1->z; + f32 distSq = SQ(yDiff) + SQ(zDiff); + f32 perpY; + f32 perpZ; + s32 ret = false; + + if (IS_ZERO(distSq)) { + *lineLenSq = 0.0f; + return false; + } + + perpendicularRatio = ((y0 - p1->y) * yDiff + (z0 - p1->z) * zDiff) / distSq; + if ((perpendicularRatio >= 0.0f) && (perpendicularRatio <= 1.0f)) { + ret = true; + } + perpY = (yDiff * perpendicularRatio) + p1->y; + perpZ = (zDiff * perpendicularRatio) + p1->z; + *lineLenSq = SQ(perpY - y0) + SQ(perpZ - z0); + + return ret; +} + +s32 Math3D_PointDistSqToLineZX(f32 z0, f32 x0, Vec3f* p1, Vec3f* p2, f32* lineLenSq) { + f32 perpendicularRatio; + f32 zDiff = p2->z - p1->z; + f32 xDiff = p2->x - p1->x; + f32 distSq = SQ(zDiff) + SQ(xDiff); + f32 perpZ; + f32 perpX; + s32 ret = false; + + if (IS_ZERO(distSq)) { + *lineLenSq = 0.0f; + return false; + } + + perpendicularRatio = ((z0 - p1->z) * zDiff + (x0 - p1->x) * xDiff) / distSq; + if ((perpendicularRatio >= 0.0f) && (perpendicularRatio <= 1.0f)) { + ret = true; + } + perpZ = (zDiff * perpendicularRatio) + p1->z; + perpX = (xDiff * perpendicularRatio) + p1->x; + *lineLenSq = SQ(perpZ - z0) + SQ(perpX - x0); + + return ret; +} + +/** + * Determines if the line `line` is touching the sphere `sphere` at any point in the line. + */ +s32 Math3D_LineVsSph(Sphere16* sphere, Linef* line) { + static Vec3f sSphLinePerpendicularPoint; + Vec3f lineDiff; + f32 temp_f0_2; + f32 lineLenSq; + + if ((Math3D_PointInSph(sphere, &line->a)) || (Math3D_PointInSph(sphere, &line->b))) { + // either point of the line is in the sphere. + return true; + } + lineDiff.x = line->b.x - line->a.x; + lineDiff.y = line->b.y - line->a.y; + lineDiff.z = line->b.z - line->a.z; + + lineLenSq = SQ(lineDiff.x) + SQ(lineDiff.y) + SQ(lineDiff.z); + if (IS_ZERO(lineLenSq)) { + // line length is "0" + return false; + } + temp_f0_2 = ((((sphere->center.x - line->a.x) * lineDiff.x) + ((sphere->center.y - line->a.y) * lineDiff.y)) + + ((sphere->center.z - line->a.z) * lineDiff.z)) / + lineLenSq; + if ((temp_f0_2 < 0.0f) || (temp_f0_2 > 1.0f)) { + return false; + } + + sSphLinePerpendicularPoint.x = (lineDiff.x * temp_f0_2) + line->a.x; + sSphLinePerpendicularPoint.y = (lineDiff.y * temp_f0_2) + line->a.y; + sSphLinePerpendicularPoint.z = (lineDiff.z * temp_f0_2) + line->a.z; + + if ((SQ(sSphLinePerpendicularPoint.x - sphere->center.x) + SQ(sSphLinePerpendicularPoint.y - sphere->center.y) + + SQ(sSphLinePerpendicularPoint.z - sphere->center.z)) <= SQ((f32)sphere->radius)) { + return true; + } + return false; +} + +/** + * Gets the surface point of `sphere` intersecting with `tri` generated from the line formed from the + * sphere's surface to the midpoint of the line formed from the first two vertices of the tri + */ +void Math3D_GetSphVsTriIntersectPoint(Sphere16* sphere, TriNorm* tri, Vec3f* intersectPoint) { + static Vec3f sV0V1Center; + static Vec3f sSphereCenter; + f32 dist; + f32 splitRatio; + + sV0V1Center.x = (tri->vtx[0].x + tri->vtx[1].x) * 0.5f; + sV0V1Center.y = (tri->vtx[0].y + tri->vtx[1].y) * 0.5f; + sV0V1Center.z = (tri->vtx[0].z + tri->vtx[1].z) * 0.5f; + sSphereCenter.x = sphere->center.x; + sSphereCenter.y = sphere->center.y; + sSphereCenter.z = sphere->center.z; + dist = Math3D_Vec3f_DistXYZ(&sV0V1Center, &sSphereCenter); + // Distance from the sphere's center to the center of the line formed from v0->v1 + if (IS_ZERO(dist)) { + intersectPoint->x = sSphereCenter.x; + intersectPoint->y = sSphereCenter.y; + intersectPoint->z = sSphereCenter.z; + return; + } + splitRatio = sphere->radius / dist; + Math3D_LineSplitRatio(&sSphereCenter, &sV0V1Center, splitRatio, intersectPoint); +} + +/** + * Determines if `sphere` and `tri` and touching, and outputs the intersection point to `intersectPoint` + */ +s32 Math3D_TriVsSphIntersect(Sphere16* sphere, TriNorm* tri, Vec3f* intersectPoint) { + static Linef sTriTestLine; + static Vec3f sSphereCenter; + static Vec3f sSphPlanePos; + f32 radius; + f32 nx; + f32 ny; + f32 nz; + f32 planeDist; + + sSphereCenter.x = sphere->center.x; + sSphereCenter.y = sphere->center.y; + sSphereCenter.z = sphere->center.z; + radius = sphere->radius; + + if (!Math3D_SphCubeVsTriCube(&tri->vtx[0], &tri->vtx[1], &tri->vtx[2], &sSphereCenter, radius)) { + return false; + } + + planeDist = Math3D_UDistPlaneToPos(tri->plane.normal.x, tri->plane.normal.y, tri->plane.normal.z, + tri->plane.originDist, &sSphereCenter); + if (radius < planeDist) { + // the point that lies within the plane of the triangle which is perpendicular to the sphere's center is more + // than the radius of the sphere, the plane never crosses the sphere. + return false; + } + + // tests if any of the edges of the triangle are intersecting the sphere + sTriTestLine.a = tri->vtx[0]; + sTriTestLine.b = tri->vtx[1]; + if (Math3D_LineVsSph(sphere, &sTriTestLine)) { + Math3D_GetSphVsTriIntersectPoint(sphere, tri, intersectPoint); + return true; + } + + sTriTestLine.a = tri->vtx[1]; + sTriTestLine.b = tri->vtx[2]; + if (Math3D_LineVsSph(sphere, &sTriTestLine)) { + Math3D_GetSphVsTriIntersectPoint(sphere, tri, intersectPoint); + return true; + } + + sTriTestLine.a = tri->vtx[2]; + sTriTestLine.b = tri->vtx[0]; + if (Math3D_LineVsSph(sphere, &sTriTestLine)) { + Math3D_GetSphVsTriIntersectPoint(sphere, tri, intersectPoint); + return true; + } + + nx = tri->plane.normal.x * planeDist; + ny = tri->plane.normal.y * planeDist; + nz = tri->plane.normal.z * planeDist; + + if (Math3D_PlaneF(tri->plane.normal.x, tri->plane.normal.y, tri->plane.normal.z, tri->plane.originDist, + &sSphereCenter) > 0.0f) { + sSphPlanePos.x = sSphereCenter.x - nx; + sSphPlanePos.y = sSphereCenter.y - ny; + sSphPlanePos.z = sSphereCenter.z - nz; + } else { + sSphPlanePos.x = sSphereCenter.x + nx; + sSphPlanePos.y = sSphereCenter.y + ny; + sSphPlanePos.z = sSphereCenter.z + nz; + } + + if (fabsf(tri->plane.normal.y) > 0.5f) { + if (Math3D_TriChkPointParaYDeterminate(&tri->vtx[0], &tri->vtx[1], &tri->vtx[2], sSphPlanePos.z, sSphPlanePos.x, + 0.0f, tri->plane.normal.y)) { + Math3D_GetSphVsTriIntersectPoint(sphere, tri, intersectPoint); + return true; + } + } else if (fabsf(tri->plane.normal.x) > 0.5f) { + if (Math3D_TriChkPointParaXDeterminate(&tri->vtx[0], &tri->vtx[1], &tri->vtx[2], sSphPlanePos.y, sSphPlanePos.z, + 0.0f, tri->plane.normal.x)) { + Math3D_GetSphVsTriIntersectPoint(sphere, tri, intersectPoint); + return true; + } + } else if (Math3D_TriChkPointParaZDeterminate(&tri->vtx[0], &tri->vtx[1], &tri->vtx[2], sSphPlanePos.x, + sSphPlanePos.y, 0.0f, tri->plane.normal.z)) { + Math3D_GetSphVsTriIntersectPoint(sphere, tri, intersectPoint); + return true; + } + return false; +} + +/* + * Checks if point `point` is within cylinder `cyl` + * Returns 1 if the point is inside the cylinder, 0 otherwise. + */ +s32 Math3D_PointInCyl(Cylinder16* cyl, Vec3f* point) { + f32 bottom; + f32 top; + f32 x = cyl->pos.x - point->x; + f32 z = cyl->pos.z - point->z; + + bottom = (f32)cyl->pos.y + cyl->yShift; + top = cyl->height + bottom; + + if ((SQ(x) + SQ(z)) < SQ(cyl->radius) && (bottom < point->y) && (point->y < top)) { + return true; + } else { + return false; + } +} + +s32 Math3D_CylVsLineSeg(Cylinder16* cyl, Vec3f* linePointA, Vec3f* linePointB, Vec3f* intersectA, Vec3f* intersectB) { + Vec3f cylToPtA; + Vec3f cylToPtB; + Vec3f ptAToPtB; + f32 fracA; + f32 fracB; + f32 fracBase; + f32 zero; + f32 pad; + f32 cylRadiusSq; + f32 radSqDiff; + f32 distCent2; + f32 dot2AB; + s32 sideIntA; + s32 sideIntB; + s32 intBeyondA; + s32 intBeyondB; + s32 intFlags; + Vec3f intPts[4]; + s32 count; + s32 i; + + fracA = 0.0f; + fracB = 0.0f; + +//! FAKE: +dummy:; + + zero = 0.0f; + intFlags = 0; + + if (Math3D_PointInCyl(cyl, linePointA) && Math3D_PointInCyl(cyl, linePointB)) { + // both points are in the cylinder + *intersectA = *linePointA; + *intersectB = *linePointB; + return 2; + } + + cylToPtA.x = linePointA->x - cyl->pos.x; + cylToPtA.y = linePointA->y - cyl->pos.y - cyl->yShift; + cylToPtA.z = linePointA->z - cyl->pos.z; + cylToPtB.x = linePointB->x - cyl->pos.x; + cylToPtB.y = linePointB->y - cyl->pos.y - cyl->yShift; + cylToPtB.z = linePointB->z - cyl->pos.z; + Math_Vec3f_Diff(&cylToPtB, &cylToPtA, &ptAToPtB); + cylRadiusSq = SQ(cyl->radius); + + /** + * This section checks for intersections with the cylinder's base and top + */ + if (!IS_ZERO(ptAToPtB.y)) { + // fraction of length along AB to reach y = 0 + fracBase = -cylToPtA.y / ptAToPtB.y; + if ((fracBase >= 0.0f) && (fracBase <= 1.0f)) { + f32 baseIntX = (ptAToPtB.x * fracBase) + cylToPtA.x; + f32 baseIntZ = (ptAToPtB.z * fracBase) + cylToPtA.z; + + if ((SQ(baseIntX) + SQ(baseIntZ)) < cylRadiusSq) { + // adds base intersection point to intPts and sets its flag + intPts[0].x = cyl->pos.x + baseIntX; + intPts[0].y = (f32)cyl->pos.y + cyl->yShift; + intPts[0].z = cyl->pos.z + baseIntZ; + intFlags |= 1; + } + } + // fraction of length along AB to reach y = cyl->height + fracA = (cyl->height - cylToPtA.y) / ptAToPtB.y; + if ((fracA >= 0.0f) && (fracA <= 1.0f)) { + f32 topIntX = ptAToPtB.x * fracA + cylToPtA.x; + f32 topIntZ = ptAToPtB.z * fracA + cylToPtA.z; + + if ((SQ(topIntX) + SQ(topIntZ)) < cylRadiusSq) { + // adds top intersection point to intPts and sets its flag + intPts[1].x = cyl->pos.x + topIntX; + intPts[1].y = (f32)cyl->pos.y + cyl->yShift + cyl->height; + intPts[1].z = cyl->pos.z + topIntZ; + intFlags |= 2; + } + } + } + + /** + * This section finds the points of intersection of the infinite line containing AB with the side of the infinite + * cylinder containing cyl. Intersection points beyond the bounds of the segment and cylinder are filtered out + * afterward. + */ + radSqDiff = SQXZ(cylToPtA) - cylRadiusSq; + if (!IS_ZERO(2.0f * SQXZ(ptAToPtB))) { + dot2AB = 2.0f * DOTXZ(ptAToPtB, cylToPtA); + if (SQ(dot2AB) < (4.0f * SQXZ(ptAToPtB) * radSqDiff)) { + // Line's closest xz-approach is outside cylinder. No intersections. + return 0; + } + if ((SQ(dot2AB) - (4.0f * SQXZ(ptAToPtB) * radSqDiff)) > zero) { + sideIntA = sideIntB = 1; + } else { + // Line is tangent in xz-plane. At most 1 side intersection. + sideIntA = 1; + sideIntB = 0; + } + distCent2 = sqrtf(SQ(dot2AB) - (4.0f * SQXZ(ptAToPtB) * radSqDiff)); + if (sideIntA != 0) { + // fraction of length along AB for side intersection closer to A + fracA = (distCent2 - dot2AB) / (2.0f * SQXZ(ptAToPtB)); + } + if (sideIntB != 0) { + // fraction of length along AB for side intersection closer to B + fracB = (-dot2AB - distCent2) / (2.0f * SQXZ(ptAToPtB)); + } + } else if (!IS_ZERO(2.0f * DOTXZ(ptAToPtB, cylToPtA))) { + // Used if the line segment is nearly vertical. Unclear what it's calculating. + fracA = -radSqDiff / (2.0f * DOTXZ(ptAToPtB, cylToPtA)); + sideIntA = 1; + sideIntB = 0; + } else { + return 0; + } + + // checks for intersection points outside the bounds of the segment + if (!sideIntB) { + if ((fracA < 0.0f) || (fracA > 1.0f)) { + return 0; + } + } else { + intBeyondA = (fracA < 0.0f) || (fracA > 1.0f); + intBeyondB = (fracB < 0.0f) || (fracB > 1.0f); + if (intBeyondA && intBeyondB) { + return 0; + } + if (intBeyondA) { + sideIntA = 0; + } + if (intBeyondB) { + sideIntB = 0; + } + } + + // checks for intersection points outside the bounds of the cylinder + if ((sideIntA != 0) && + (((fracA * ptAToPtB.y + cylToPtA.y) < 0.0f) || (cyl->height < (fracA * ptAToPtB.y + cylToPtA.y)))) { + sideIntA = 0; + } + if ((sideIntB != 0) && + (((fracB * ptAToPtB.y + cylToPtA.y) < 0.0f) || (cyl->height < (fracB * ptAToPtB.y + cylToPtA.y)))) { + sideIntB = 0; + } + if ((sideIntA == 0) && (sideIntB == 0)) { + return 0; + } + + // Adds intersection points to intPts and sets side A and side B flags + if (sideIntA != 0 && sideIntB != 0) { + intPts[2].x = (fracA * ptAToPtB.x + cylToPtA.x) + cyl->pos.x; + intPts[2].y = (fracA * ptAToPtB.y + cylToPtA.y) + cyl->pos.y + cyl->yShift; + intPts[2].z = (fracA * ptAToPtB.z + cylToPtA.z) + cyl->pos.z; + intFlags |= 4; + intPts[3].x = (fracB * ptAToPtB.x + cylToPtA.x) + cyl->pos.x; + intPts[3].y = (fracB * ptAToPtB.y + cylToPtA.y) + cyl->pos.y + cyl->yShift; + intPts[3].z = (fracB * ptAToPtB.z + cylToPtA.z) + cyl->pos.z; + intFlags |= 8; + } else if (sideIntA != 0) { + intPts[2].x = (fracA * ptAToPtB.x + cylToPtA.x) + cyl->pos.x; + intPts[2].y = (fracA * ptAToPtB.y + cylToPtA.y) + cyl->pos.y + cyl->yShift; + intPts[2].z = (fracA * ptAToPtB.z + cylToPtA.z) + cyl->pos.z; + intFlags |= 4; + } else if (sideIntB != 0) { + intPts[2].x = (fracB * ptAToPtB.x + cylToPtA.x) + cyl->pos.x; + intPts[2].y = (fracB * ptAToPtB.y + cylToPtA.y) + cyl->pos.y + cyl->yShift; + intPts[2].z = (fracB * ptAToPtB.z + cylToPtA.z) + cyl->pos.z; + intFlags |= 4; + } + + /** + * Places the found intersection points into intersectA and intersectB. IntersectA is always closer to point A + */ + for (count = 0, i = 0; i < ARRAY_COUNT(intPts); i++) { + if (intFlags & (1 << i)) { + if (count == 0) { + *intersectA = intPts[i]; + } else if (count == 1) { + if (Math3D_Vec3fDistSq(intersectA, linePointA) < Math3D_Vec3fDistSq(intersectA, &intPts[i])) { + *intersectB = intPts[i]; + } else { + *intersectB = *intersectA; + *intersectA = intPts[i]; + } + break; + } + count++; + } + } + return count; +} + +/* + * Determines if `cyl` and `tri` are touching. The point of intersection + * is placed in `intersect` Returns 1 if they are touching, 0 otherwise. + */ +s32 Math3D_CylTriVsIntersect(Cylinder16* cyl, TriNorm* tri, Vec3f* intersect) { + static Sphere16 sTopSphere; + static Sphere16 sBottomSphere; + static Vec3f sCylIntersectA; + static Vec3f sCylIntersectB; + f32 yIntersect; + f32 cylTop; + f32 cylBottom; + f32 minDistSq; + f32 radiusTodistFromCylYIntersectTov0v1; + f32 distFromPointAToIntersectASq; + Vec3f cylIntersectCenter; + + cylBottom = (f32)cyl->pos.y + cyl->yShift; + cylTop = cyl->height + cylBottom; + + if (((tri->vtx[0].y < cylBottom) && (tri->vtx[1].y < cylBottom) && (tri->vtx[2].y < cylBottom)) || + ((cylTop < tri->vtx[0].y) && (cylTop < tri->vtx[1].y) && (cylTop < tri->vtx[2].y))) { + // If all of the vertices are below or all of the vertices are above the cylinder. + return false; + } + + minDistSq = 1.e38f; + if (Math3D_CylVsLineSeg(cyl, &tri->vtx[0], &tri->vtx[1], &sCylIntersectA, &sCylIntersectB)) { + distFromPointAToIntersectASq = Math3D_Vec3fDistSq(&sCylIntersectA, &tri->vtx[0]); + minDistSq = distFromPointAToIntersectASq; + *intersect = sCylIntersectA; + } + + if (Math3D_CylVsLineSeg(cyl, &tri->vtx[2], &tri->vtx[1], &sCylIntersectA, &sCylIntersectB)) { + distFromPointAToIntersectASq = Math3D_Vec3fDistSq(&sCylIntersectA, &tri->vtx[2]); + if (distFromPointAToIntersectASq < minDistSq) { + *intersect = sCylIntersectA; + minDistSq = distFromPointAToIntersectASq; + } + } + + if (Math3D_CylVsLineSeg(cyl, &tri->vtx[0], &tri->vtx[2], &sCylIntersectA, &sCylIntersectB)) { + distFromPointAToIntersectASq = Math3D_Vec3fDistSq(&sCylIntersectA, &tri->vtx[0]); + if (distFromPointAToIntersectASq < minDistSq) { + *intersect = sCylIntersectA; + minDistSq = distFromPointAToIntersectASq; + } + } + + if (minDistSq != 1.e38f) { + return true; + } + + if (Math3D_TriChkLineSegParaYIntersect(&tri->vtx[0], &tri->vtx[1], &tri->vtx[2], tri->plane.normal.x, + tri->plane.normal.y, tri->plane.normal.z, tri->plane.originDist, cyl->pos.z, + cyl->pos.x, &yIntersect, cylBottom, cylTop)) { + Vec3f midpointv0v1; + Vec3f diffMidpointIntersect; + f32 distFromCylYIntersectTov0v1; + s32 pad; + + cylIntersectCenter.x = cyl->pos.x; + cylIntersectCenter.y = yIntersect; + cylIntersectCenter.z = cyl->pos.z; + + midpointv0v1.x = (tri->vtx[0].x + tri->vtx[1].x) * 0.5f; + midpointv0v1.y = (tri->vtx[0].y + tri->vtx[1].y) * 0.5f; + midpointv0v1.z = (tri->vtx[0].z + tri->vtx[1].z) * 0.5f; + + Math_Vec3f_Diff(&midpointv0v1, &cylIntersectCenter, &diffMidpointIntersect); + distFromCylYIntersectTov0v1 = sqrtf(SQ(diffMidpointIntersect.x) + SQ(diffMidpointIntersect.z)); + + if (IS_ZERO(distFromCylYIntersectTov0v1)) { + Math_Vec3f_Copy(intersect, &midpointv0v1); + return true; + } + + radiusTodistFromCylYIntersectTov0v1 = cyl->radius / distFromCylYIntersectTov0v1; + Math3D_PointOnDirectedLine(&cylIntersectCenter, &diffMidpointIntersect, radiusTodistFromCylYIntersectTov0v1, + intersect); + return true; + } + + sTopSphere.center.x = sBottomSphere.center.x = cyl->pos.x; + sTopSphere.center.z = sBottomSphere.center.z = cyl->pos.z; + sTopSphere.center.y = cylTop; + sBottomSphere.center.y = cylBottom; + sTopSphere.radius = sBottomSphere.radius = cyl->radius; + + if (Math3D_TriVsSphIntersect(&sTopSphere, tri, intersect) || + Math3D_TriVsSphIntersect(&sBottomSphere, tri, intersect)) { + return true; + } + return false; +} + +/* + * Determines if `cyl` and `tri` are touching. + */ +s32 Math3D_CylVsTri(Cylinder16* cyl, TriNorm* tri) { + Vec3f intersect; + + return Math3D_CylTriVsIntersect(cyl, tri, &intersect); +} + +/* + * Determines if two spheres are touching. + */ +s32 Math3D_SphVsSph(Sphere16* sphereA, Sphere16* sphereB) { + f32 overlapSize; + + return Math3D_SphVsSphOverlap(sphereA, sphereB, &overlapSize); +} + +/* + * Determines if two spheres are touching. The amount that they're overlapping is placed in `overlapSize` + */ +s32 Math3D_SphVsSphOverlap(Sphere16* sphereA, Sphere16* sphereB, f32* overlapSize) { + f32 centerDist; + + return Math3D_SphVsSphOverlapCenterDist(sphereA, sphereB, overlapSize, ¢erDist); +} + +/* + * Determines if two spheres are touching The distance from the centers is placed in `centerDist`, + * and the amount that they're overlapping is placed in `overlapSize` + */ +s32 Math3D_SphVsSphOverlapCenterDist(Sphere16* sphereA, Sphere16* sphereB, f32* overlapSize, f32* centerDist) { + Vec3f diff; + + diff.x = (f32)sphereA->center.x - (f32)sphereB->center.x; + diff.y = (f32)sphereA->center.y - (f32)sphereB->center.y; + diff.z = (f32)sphereA->center.z - (f32)sphereB->center.z; + + *centerDist = sqrtf(SQ(diff.x) + SQ(diff.y) + SQ(diff.z)); + + *overlapSize = (((f32)sphereA->radius + (f32)sphereB->radius) - *centerDist); + if (*overlapSize > 0.008f) { + return true; + } + + *overlapSize = 0.0f; + return false; +} + +/** + * Checks if `sph` and `cyl` are touching, output the amount of xz overlap to `overlapSize` + */ +s32 Math3D_SphVsCylOverlap(Sphere16* sph, Cylinder16* cyl, f32* overlapSize) { + f32 centerDist; + + return Math3D_SphVsCylOverlapCenterDist(sph, cyl, overlapSize, ¢erDist); +} + +/** + * Checks if `sph` and `cyl` are touching, output the xz distance of the centers to `centerDist`, and the amount of + * xz overlap to `overlapSize` + */ +s32 Math3D_SphVsCylOverlapCenterDist(Sphere16* sph, Cylinder16* cyl, f32* overlapSize, f32* centerDist) { + static Cylinderf sCylf; + static Spheref sSphf; + f32 x; + f32 z; + f32 combinedRadius; + f32 cylBottom; + f32 cylTop; + f32 sphBottom; + f32 sphTop; + + if ((sph->radius <= 0) || (cyl->radius <= 0)) { + // either radius is 0 + return false; + } + sSphf.center.y = sph->center.y; + sSphf.radius = sph->radius; + sCylf.pos.y = cyl->pos.y; + sCylf.yShift = cyl->yShift; + sCylf.height = cyl->height; + x = (f32)sph->center.x - cyl->pos.x; + z = (f32)sph->center.z - cyl->pos.z; + combinedRadius = (f32)sph->radius + cyl->radius; + *centerDist = sqrtf(SQ(x) + SQ(z)); + if (combinedRadius < *centerDist) { + // if the combined radii is less than the distance to the centers, they cannot be touching. + return false; + } + + cylBottom = (sCylf.pos.y + sCylf.yShift); + cylTop = cylBottom + sCylf.height; + sphBottom = sSphf.center.y - sSphf.radius; + sphTop = sSphf.center.y + sSphf.radius; + + if ((sphTop >= cylBottom) && (sphBottom <= cylTop)) { + // if the cylinder and sphere are intersecting on the xz plane, check if they're intersecting on + // the y axis. + *overlapSize = combinedRadius - *centerDist; + return true; + } + return false; +} + +/** + * Checks if `ca` and `cb` are touching, output the amount of xz overlap to `overlapSize` + */ +s32 Math3D_CylVsCylOverlap(Cylinder16* ca, Cylinder16* cb, f32* overlapSize) { + f32 centerDist; + + return Math3D_CylVsCylOverlapCenterDist(ca, cb, overlapSize, ¢erDist); +} + +/** + * Checks if `ca` and `cb` are touching, output the xz distance of the centers to `centerDist`, and the amount of + * xz overlap to `overlapSize` + */ +s32 Math3D_CylVsCylOverlapCenterDist(Cylinder16* ca, Cylinder16* cb, f32* overlapSize, f32* centerDist) { + static Cylinderf sCaf; + static Cylinderf sCbf; + + Math_Vec3s_ToVec3f(&sCaf.pos, &ca->pos); + sCaf.radius = ca->radius; + sCaf.yShift = ca->yShift; + sCaf.height = ca->height; + + Math_Vec3s_ToVec3f(&sCbf.pos, &cb->pos); + sCbf.radius = cb->radius; + sCbf.yShift = cb->yShift; + sCbf.height = cb->height; + + *centerDist = sqrtf(SQ(sCaf.pos.x - sCbf.pos.x) + SQ(sCaf.pos.z - sCbf.pos.z)); + + // The combined radii are within the xz distance + if ((sCaf.radius + sCbf.radius) < *centerDist) { + return false; + } + + // top of ca < bottom of cb or top of cb < bottom of ca + if ((((sCaf.pos.y + sCaf.yShift) + sCaf.height) < (sCbf.pos.y + sCbf.yShift)) || + (((sCbf.pos.y + sCbf.yShift) + sCbf.height) < (sCaf.pos.y + sCaf.yShift))) { + return false; + } + + *overlapSize = sCaf.radius + sCbf.radius - *centerDist; + return true; +} + +/* + * Determines if triangle `ta` intersects with triangle `tb` the point of + * intersection is output to `intersect. + * Returns true is the triangles intersect, 0 otherwise + */ +s32 Math3D_TriVsTriIntersect(TriNorm* ta, TriNorm* tb, Vec3f* intersect) { + f32 dist0 = Math3D_Plane(&ta->plane, &tb->vtx[0]); + f32 dist1 = Math3D_Plane(&ta->plane, &tb->vtx[1]); + f32 dist2 = Math3D_Plane(&ta->plane, &tb->vtx[2]); + + if (((dist0 > 0.0f) && (dist1 > 0.0f) && (dist2 > 0.0f)) || + (((dist0 < 0.0f) && (dist1 < 0.0f)) && (dist2 < 0.0f))) { + return false; + } + + dist0 = Math3D_Plane(&tb->plane, &ta->vtx[0]); + dist1 = Math3D_Plane(&tb->plane, &ta->vtx[1]); + dist2 = Math3D_Plane(&tb->plane, &ta->vtx[2]); + + if ((((dist0 > 0.0f) && (dist1 > 0.0f)) && (dist2 > 0.0f)) || + ((dist0 < 0.0f) && (dist1 < 0.0f) && (dist2 < 0.0f))) { + return false; + } + + if (Math3D_TriLineIntersect(&tb->vtx[0], &tb->vtx[1], &tb->vtx[2], tb->plane.normal.x, tb->plane.normal.y, + tb->plane.normal.z, tb->plane.originDist, &ta->vtx[0], &ta->vtx[1], intersect, 0)) { + return true; + } + if (Math3D_TriLineIntersect(&tb->vtx[0], &tb->vtx[1], &tb->vtx[2], tb->plane.normal.x, tb->plane.normal.y, + tb->plane.normal.z, tb->plane.originDist, &ta->vtx[1], &ta->vtx[2], intersect, 0)) { + return true; + } + if (Math3D_TriLineIntersect(&tb->vtx[0], &tb->vtx[1], &tb->vtx[2], tb->plane.normal.x, tb->plane.normal.y, + tb->plane.normal.z, tb->plane.originDist, &ta->vtx[2], &ta->vtx[0], intersect, 0)) { + return true; + } + if (Math3D_TriLineIntersect(&ta->vtx[0], &ta->vtx[1], &ta->vtx[2], ta->plane.normal.x, ta->plane.normal.y, + ta->plane.normal.z, ta->plane.originDist, &tb->vtx[0], &tb->vtx[1], intersect, 0)) { + return true; + } + if (Math3D_TriLineIntersect(&ta->vtx[0], &ta->vtx[1], &ta->vtx[2], ta->plane.normal.x, ta->plane.normal.y, + ta->plane.normal.z, ta->plane.originDist, &tb->vtx[1], &tb->vtx[2], intersect, 0)) { + return true; + } + if (Math3D_TriLineIntersect(&ta->vtx[0], &ta->vtx[1], &ta->vtx[2], ta->plane.normal.x, ta->plane.normal.y, + ta->plane.normal.z, ta->plane.originDist, &tb->vtx[2], &tb->vtx[0], intersect, 0)) { + return true; + } + return false; +} + +s32 Math3D_XZInSphere(Sphere16* sphere, f32 x, f32 z) { + f32 xDiff = sphere->center.x - x; + f32 zDiff = sphere->center.z - z; + + if ((SQ(xDiff) + SQ(zDiff)) <= SQ(sphere->radius)) { + return true; + } + return false; +} + +s32 Math3D_XYInSphere(Sphere16* sphere, f32 x, f32 y) { + f32 xDiff = sphere->center.x - x; + f32 yDiff = sphere->center.y - y; + + if ((SQ(xDiff) + SQ(yDiff)) <= SQ(sphere->radius)) { + return true; + } + return false; +} + +s32 Math3D_YZInSphere(Sphere16* sphere, f32 y, f32 z) { + f32 yDiff = sphere->center.y - y; + f32 zDiff = sphere->center.z - z; + + if ((SQ(yDiff) + SQ(zDiff)) <= SQ(sphere->radius)) { + return true; + } + return false; +} + +/** + * @brief Computes the intersection points, if any, of the circle of radius radius, center (centerX, centerY) with the + * line through the point (pointX, pointY) in direction (dirX, dirY). + * + * @param[in] centreX x coordinate of centre of circle + * @param[in] centerY y coordinate of centre of circle + * @param[in] radius of circle + * @param[in] pointX x coordinate of point on line + * @param[in] pointY y coordinate of point on line + * @param[in] dirX x value of direction vector of line + * @param[in] dirY y value of direction vecotr of line + * @param[out] intersectAX x coordinate of first intersection + * @param[out] intersectAY y coordinate of first intersection + * @param[out] intersectBX x coordinate of second intersection + * @param[out] intersectBY y coordinate of second intersection + * @return number of intersections(ish) + */ +s32 Math3D_CircleLineIntersections(f32 centreX, f32 centerY, f32 radius, f32 pointX, f32 pointY, f32 dirX, f32 dirY, + f32* intersectAX, f32* intersectAY, f32* intersectBX, f32* intersectBY) { + f32 a = SQ(dirX) + SQ(dirY); // t^2 coefficient, |dir|^2 + f32 diffX = pointX - centreX; + f32 diffY = pointY - centerY; + f32 b; // t coefficient + f32 delta; // discriminant of quadratic + f32 rootP; // larger root of quadratic + f32 rootN; // smaller root of quadratic + s32 ret; + + // if the direction vector's magnitude is too small, assume no intersections + if ((IS_ZERO(dirX) && IS_ZERO(dirY)) || IS_ZERO(a)) { + *intersectAX = 0.0f; + *intersectAY = 0.0f; + *intersectBX = 0.0f; + *intersectBY = 0.0f; + return 0; + } + + b = 2.0f * (dirX * diffX + dirY * diffY); // 2 dir . (point - centre) + delta = SQ(b) - 4.0f * a * (SQ(diffX) + SQ(diffY) - SQ(radius)); + ret = 0; + + if (IS_ZERO(delta)) { // At most one root if discriminant is close to zero + // This root is always overwritten later. + rootN = -b / (2.0f * a); + *intersectAX = dirX * rootN + pointX; + *intersectAY = dirY * rootN + pointY; + + *intersectBX = 0.0f; + *intersectBY = 0.0f; + } + + if (delta > 0.0f) { // Two roots if discriminant > 0 + rootN = (-b - sqrtf(delta)) / (2.0f * a); + *intersectAX = dirX * rootN + pointX; + *intersectAY = dirY * rootN + pointY; + + rootP = (-b + sqrtf(delta)) / (2.0f * a); + *intersectBX = dirX * rootP + pointX; + *intersectBY = dirY * rootP + pointY; + + ret = 2; + } else { // "No roots if discriminant <= 0.0f"* + //! @bug Should be one root if discriminant == 0, not zero (although this case is unlikely for floats) + *intersectAX = 0.0f; + *intersectAY = 0.0f; + } + + return ret; +} + +void func_8017FD44(Vec3f* arg0, Vec3f* arg1, Vec3f* dst, f32 arg3) { + Vec3f sp2C; + s16 sp2A; + f32 sp24; + + if ((arg3 < -1.0f) && (arg3 > 1.0f)) { + return; + } + + sp2C.x = (arg0->x + arg1->x) / 2.0f; + sp2C.z = (arg0->z + arg1->z) / 2.0f; + sp24 = sqrtf(SQ(sp2C.x - arg0->x) + SQ(sp2C.z - arg0->z)); + dst->y = (arg1->y - arg0->y) * arg3 + arg0->y; + sp2A = Math_Vec3f_Yaw(&sp2C, arg0); + dst->x = Math_SinS(TRUNCF_BINANG(0x7FFF * arg3) + sp2A) * sp24 + sp2C.x; + dst->z = Math_CosS(TRUNCF_BINANG(0x7FFF * arg3) + sp2A) * sp24 + sp2C.z; +} diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 5d31c31acd..3b6b48fda2 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -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; diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c index 7a4a86bcc0..a73878099c 100644 --- a/src/code/z_bgcheck.c +++ b/src/code/z_bgcheck.c @@ -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; diff --git a/src/code/z_camera.c b/src/code/z_camera.c index d276398584..af79344902 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -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) { diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c index 11c3865e1e..c3ac08936b 100644 --- a/src/code/z_collision_check.c +++ b/src/code/z_collision_check.c @@ -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; diff --git a/src/code/z_eff_blure.c b/src/code/z_eff_blure.c index 22dab64328..c9fc940b7e 100644 --- a/src/code/z_eff_blure.c +++ b/src/code/z_eff_blure.c @@ -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)) { diff --git a/src/code/z_eff_tire_mark.c b/src/code/z_eff_tire_mark.c index bbcad604e9..41e806a6c2 100644 --- a/src/code/z_eff_tire_mark.c +++ b/src/code/z_eff_tire_mark.c @@ -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; } diff --git a/src/code/z_fbdemo.c b/src/code/z_fbdemo.c index 2f1ecdb547..b77e377450 100644 --- a/src/code/z_fbdemo.c +++ b/src/code/z_fbdemo.c @@ -15,6 +15,7 @@ #include "libc64/sleep.h" #include "libc64/malloc.h" #include "macros.h" +#include "z64math.h" Gfx sTransTileSetupDL[] = { gsDPPipeSync(), diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c index 9c69fb6a0e..8f75a4d3eb 100644 --- a/src/code/z_fireobj.c +++ b/src/code/z_fireobj.c @@ -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; } } diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c index bdfb36183e..7e88e81d06 100644 --- a/src/code/z_kankyo.c +++ b/src/code/z_kankyo.c @@ -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; diff --git a/src/code/z_play.c b/src/code/z_play.c index 61582ca0b4..085f7f8a04 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -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; diff --git a/src/code/z_sub_s.c b/src/code/z_sub_s.c index 11f97c7d0f..a7e4adfc82 100644 --- a/src/code/z_sub_s.c +++ b/src/code/z_sub_s.c @@ -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; diff --git a/src/libultra/gu/cosf.c b/src/libultra/gu/cosf.c index 6fc6ef24e5..b70b160c4b 100644 --- a/src/libultra/gu/cosf.c +++ b/src/libultra/gu/cosf.c @@ -55,7 +55,7 @@ f32 __cosf(f32 x) { dx -= dn * pihi.d; dx -= dn * pilo.d; - xSq = SQ(dx); + xSq = dx * dx; polyApprox = ((P[4].d * xSq + P[3].d) * xSq + P[2].d) * xSq + P[1].d; result = dx + (dx * xSq) * polyApprox; // Actual Maclaurin polynomial for sin(x) diff --git a/src/libultra/gu/lookat.c b/src/libultra/gu/lookat.c index 692bb089a5..6bcfccd69d 100644 --- a/src/libultra/gu/lookat.c +++ b/src/libultra/gu/lookat.c @@ -1,5 +1,4 @@ #include "ultra64.h" -#include "macros.h" void guLookAtF(f32 mf[4][4], f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 zAt, f32 xUp, f32 yUp, f32 zUp) { f32 length; @@ -15,7 +14,7 @@ void guLookAtF(f32 mf[4][4], f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 xLook = xAt - xEye; yLook = yAt - yEye; zLook = zAt - zEye; - length = -1.0 / sqrtf(SQ(xLook) + SQ(yLook) + SQ(zLook)); + length = -1.0 / sqrtf((xLook * xLook) + (yLook * yLook) + (zLook * zLook)); xLook *= length; yLook *= length; zLook *= length; @@ -23,7 +22,7 @@ void guLookAtF(f32 mf[4][4], f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 xRight = yUp * zLook - zUp * yLook; yRight = zUp * xLook - xUp * zLook; zRight = xUp * yLook - yUp * xLook; - length = 1.0 / sqrtf(SQ(xRight) + SQ(yRight) + SQ(zRight)); + length = 1.0 / sqrtf((xRight * xRight) + (yRight * yRight) + (zRight * zRight)); xRight *= length; yRight *= length; zRight *= length; @@ -31,7 +30,7 @@ void guLookAtF(f32 mf[4][4], f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 xUp = yLook * zRight - zLook * yRight; yUp = zLook * xRight - xLook * zRight; zUp = xLook * yRight - yLook * xRight; - length = 1.0 / sqrtf(SQ(xUp) + SQ(yUp) + SQ(zUp)); + length = 1.0 / sqrtf((xUp * xUp) + (yUp * yUp) + (zUp * zUp)); xUp *= length; yUp *= length; zUp *= length; diff --git a/src/libultra/gu/lookathil.c b/src/libultra/gu/lookathil.c index ef8b443db3..ec8b380a3a 100644 --- a/src/libultra/gu/lookathil.c +++ b/src/libultra/gu/lookathil.c @@ -1,5 +1,4 @@ #include "ultra64.h" -#include "macros.h" void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 zAt, f32 xUp, f32 yUp, f32 zUp, f32 xl1, f32 yl1, f32 zl1, /* light 1 direction */ @@ -22,7 +21,7 @@ void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 xLook = xAt - xEye; yLook = yAt - yEye; zLook = zAt - zEye; - length = -1.0 / sqrtf(SQ(xLook) + SQ(yLook) + SQ(zLook)); + length = -1.0 / sqrtf((xLook * xLook) + (yLook * yLook) + (zLook * zLook)); xLook *= length; yLook *= length; zLook *= length; @@ -30,7 +29,7 @@ void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 xRight = yUp * zLook - zUp * yLook; yRight = zUp * xLook - xUp * zLook; zRight = xUp * yLook - yUp * xLook; - length = 1.0 / sqrtf(SQ(xRight) + SQ(yRight) + SQ(zRight)); + length = 1.0 / sqrtf((xRight * xRight) + (yRight * yRight) + (zRight * zRight)); xRight *= length; yRight *= length; zRight *= length; @@ -38,14 +37,14 @@ void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 xUp = yLook * zRight - zLook * yRight; yUp = zLook * xRight - xLook * zRight; zUp = xLook * yRight - yLook * xRight; - length = 1.0 / sqrtf(SQ(xUp) + SQ(yUp) + SQ(zUp)); + length = 1.0 / sqrtf((xUp * xUp) + (yUp * yUp) + (zUp * zUp)); xUp *= length; yUp *= length; zUp *= length; /* hilite vectors */ - length = 1.0 / sqrtf(SQ(xl1) + SQ(yl1) + SQ(zl1)); + length = 1.0 / sqrtf((xl1 * xl1) + (yl1 * yl1) + (zl1 * zl1)); xl1 *= length; yl1 *= length; zl1 *= length; @@ -54,7 +53,7 @@ void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 yHilite = yl1 + yLook; zHilite = zl1 + zLook; - length = sqrtf(SQ(xHilite) + SQ(yHilite) + SQ(zHilite)); + length = sqrtf((xHilite * xHilite) + (yHilite * yHilite) + (zHilite * zHilite)); if (length > 0.1) { length = 1.0 / length; @@ -70,7 +69,7 @@ void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 h->h.y1 = hiliteHeight * 2; } - length = 1.0 / sqrtf(SQ(xl2) + SQ(yl2) + SQ(zl2)); + length = 1.0 / sqrtf((xl2 * xl2) + (yl2 * yl2) + (zl2 * zl2)); xl2 *= length; yl2 *= length; zl2 *= length; @@ -78,7 +77,7 @@ void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 xHilite = xl2 + xLook; yHilite = yl2 + yLook; zHilite = zl2 + zLook; - length = sqrtf(SQ(xHilite) + SQ(yHilite) + SQ(zHilite)); + length = sqrtf((xHilite * xHilite) + (yHilite * yHilite) + (zHilite * zHilite)); if (length > 0.1) { length = 1.0 / length; xHilite *= length; diff --git a/src/libultra/gu/sinf.c b/src/libultra/gu/sinf.c index 4602940249..32215873c0 100644 --- a/src/libultra/gu/sinf.c +++ b/src/libultra/gu/sinf.c @@ -46,7 +46,7 @@ f32 __sinf(f32 x) { // |x| > 2^{-12}: for x smaller in magnitude than this, sin(x) - x is too small for a float to register the // error if (xpt >= 230) { - xSq = SQ(dx); + xSq = dx * dx; polyApprox = ((P[4].d * xSq + P[3].d) * xSq + P[2].d) * xSq + P[1].d; result = dx + (dx * xSq) * polyApprox; @@ -66,7 +66,7 @@ f32 __sinf(f32 x) { dx -= dn * pihi.d; dx -= dn * pilo.d; - xSq = SQ(dx); + xSq = dx * dx; polyApprox = ((P[4].d * xSq + P[3].d) * xSq + P[2].d) * xSq + P[1].d; result = dx + (dx * xSq) * polyApprox; // Actual Maclaurin polynomial for sin(x) diff --git a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c index 1c1ecf5a01..ef30535fdd 100644 --- a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c +++ b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c @@ -685,8 +685,8 @@ void func_80A2AED0(BgDblueMovebg* this, PlayState* play) { Vec3f sp54; f32 sp50; - if (Math3D_PointDistToLine2D(play->view.eye.x, play->view.eye.z, this->unk_190.x, this->unk_190.z, - this->unk_19C.x, this->unk_19C.z, &sp54.x, &sp54.z, &sp50)) { + if (Math3D_PointDistSqToLine2DImpl(play->view.eye.x, play->view.eye.z, this->unk_190.x, this->unk_190.z, + this->unk_19C.x, this->unk_19C.z, &sp54.x, &sp54.z, &sp50)) { sp54.y = this->dyna.actor.world.pos.y; } else { if (Math_Vec3f_DistXYZ(&play->view.eye, &this->unk_190) <= diff --git a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c index 0ce70eeb46..02b7a7e67f 100644 --- a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c +++ b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c @@ -61,7 +61,7 @@ Color_RGBA8 D_80B8539C = { 200, 255, 255, 255 }; Color_RGBA8 D_80B853A0 = { 200, 200, 200, 0 }; s32 func_80B83C80(Vec3f* arg0, Vec3f* arg1) { - f32 temp_f0 = Math3D_LengthSquared(arg0); + f32 temp_f0 = Math3D_Vec3fMagnitudeSq(arg0); f32 temp_f2; if (temp_f0 < SQ(0.001f)) { diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c b/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c index 1d17114d98..7cc9b9da37 100644 --- a/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c +++ b/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c @@ -485,12 +485,12 @@ void func_80A9BD24(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct* } if (unkStruct->unk_0000[i].unk_34 == 2) { - if (Math3D_XZLengthSquared(unkStruct->unk_0000[i].unk_14.x, unkStruct->unk_0000[i].unk_14.z) > + if (Math3D_Dist1DSq(unkStruct->unk_0000[i].unk_14.x, unkStruct->unk_0000[i].unk_14.z) > SQ(440.0f) + 0.02f) { unkStruct->unk_0000[i].unk_34 = 3; } } else if (unkStruct->unk_0000[i].unk_34 == 3) { - if (Math3D_XZLengthSquared(unkStruct->unk_0000[i].unk_14.x, unkStruct->unk_0000[i].unk_14.z) > 278784.03f) { + if (Math3D_Dist1DSq(unkStruct->unk_0000[i].unk_14.x, unkStruct->unk_0000[i].unk_14.z) > 278784.03f) { func_80A9B554(this, play, unkStruct, &unkStruct->unk_0000[i]); Audio_PlaySfx_2(NA_SE_EV_GLASSBROKEN_IMPACT); unkStruct->unk_0000[i].unk_34 = 4; @@ -543,8 +543,8 @@ void BgHakuginPost_RequestQuakeAndRumble(BgHakuginPost* this, PlayState* play) { Camera* activeCam = GET_ACTIVE_CAM(play); s16 quakeIndex; - Rumble_Request(Math3D_XZDistanceSquared(player->actor.world.pos.x, player->actor.world.pos.z, - this->dyna.actor.home.pos.x, this->dyna.actor.home.pos.z), + Rumble_Request(Math3D_Dist2DSq(player->actor.world.pos.x, player->actor.world.pos.z, this->dyna.actor.home.pos.x, + this->dyna.actor.home.pos.z), 255, 20, 150); quakeIndex = Quake_Request(activeCam, QUAKE_TYPE_3); @@ -576,7 +576,7 @@ void func_80A9C228(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct* spB8.x = Math_SinS(temp_s0) * temp_f20 + spC8->unk_14.x; spB8.z = Math_CosS(temp_s0) * temp_f20 + spC8->unk_14.z; - if (Math3D_XZLengthSquared(spB8.x, spB8.z) < SQ(550.0f) + 0.03f) { + if (Math3D_Dist1DSq(spB8.x, spB8.z) < SQ(550.0f) + 0.03f) { spB8.x += this->dyna.actor.home.pos.x; spB8.y = spC8->unk_14.y + this->unk_16C + 20.0f; spB8.z += this->dyna.actor.home.pos.z; diff --git a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c index 6d1e0d58d3..6c2fd73a53 100644 --- a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c +++ b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c @@ -72,8 +72,8 @@ void BgUmajump_CheckDistance(BgUmajump* this, PlayState* play) { Player* player = GET_PLAYER(play); if ((this->horse != NULL) && (player != NULL) && - (Math3D_XZDistance(this->horse->world.pos.x, this->horse->world.pos.z, player->actor.world.pos.x, - player->actor.world.pos.z) < 1400.0f)) { + (Math3D_Dist2D(this->horse->world.pos.x, this->horse->world.pos.z, player->actor.world.pos.x, + player->actor.world.pos.z) < 1400.0f)) { this->actionFunc = BgUmajump_PlayCutscene; } } diff --git a/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.c b/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.c index d82cdbf1c9..1716a370f3 100644 --- a/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.c +++ b/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.c @@ -692,7 +692,7 @@ void BossHakugin_StepVector(Vec3f* norm, Vec3f* targetNorm, f32 angleStep) { return; } - Math3D_CrossProduct(norm, targetNorm, &crossProduct); + Math3D_Vec3f_Cross(norm, targetNorm, &crossProduct); if (BossHakugin_Vec3fNormalize(&crossProduct)) { Matrix_RotateAxisF(angleStep, &crossProduct, MTXMODE_NEW); @@ -2981,7 +2981,7 @@ void BossHakugin_UpdateElectricBalls(BossHakugin* this, PlayState* play) { normal.x = COLPOLY_GET_NORMAL(poly->normal.x); normal.y = COLPOLY_GET_NORMAL(poly->normal.y); normal.z = COLPOLY_GET_NORMAL(poly->normal.z); - func_80179F64(&this->electricBallRot, &normal, &targetRot); + Math3D_Vec3fReflect(&this->electricBallRot, &normal, &targetRot); Math_Vec3f_Copy(&this->electricBallRot, &targetRot); } } else { diff --git a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c index e6a97c01f0..6ab339204c 100644 --- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c +++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c @@ -207,7 +207,7 @@ s32 EnAkindonuts_HasReachedPoint(EnAkindonuts* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c index 2738c2d8f2..9ef59c2433 100644 --- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c +++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c @@ -295,7 +295,7 @@ void func_8088A894(EnArrow* this, PlayState* play) { return; } - temp_f0 = Math3D_LengthSquared(&sp68); + temp_f0 = Math3D_Vec3fMagnitudeSq(&sp68); if (temp_f0 < 1.0f) { return; } diff --git a/src/overlays/actors/ovl_En_Az/z_en_az.c b/src/overlays/actors/ovl_En_Az/z_en_az.c index b7eae427f9..7c906e2bc1 100644 --- a/src/overlays/actors/ovl_En_Az/z_en_az.c +++ b/src/overlays/actors/ovl_En_Az/z_en_az.c @@ -433,7 +433,7 @@ f32 func_80A954AC(EnAz* this) { sp1C.x = pathing->curPoint.x - pathing->prevPoint.x; sp1C.y = pathing->curPoint.y - pathing->prevPoint.y; sp1C.z = pathing->curPoint.z - pathing->prevPoint.z; - return Math3D_Parallel(&sp28, &sp1C); + return Math3D_Cos(&sp28, &sp1C); } s32 func_80A95534(PlayState* play, ActorPathing* actorPathing) { @@ -1633,10 +1633,8 @@ void func_80A97EAC(EnAz* this, PlayState* play) { void func_80A97F9C(EnAz* this, PlayState* play) { Player* player = GET_PLAYER(play); - D_80A99E8C = - Math3D_XZDistanceSquared(player->actor.world.pos.x, player->actor.world.pos.z, D_80A99E80.x, D_80A99E80.z); - if (Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, D_80A99E80.x, D_80A99E80.z) >= - SQ(1000.0f)) { + D_80A99E8C = Math3D_Dist2DSq(player->actor.world.pos.x, player->actor.world.pos.z, D_80A99E80.x, D_80A99E80.z); + if (Math3D_Dist2DSq(this->actor.world.pos.x, this->actor.world.pos.z, D_80A99E80.x, D_80A99E80.z) >= SQ(1000.0f)) { this->unk_374 |= 0x1000; } if (!(this->unk_300.flags & ACTOR_PATHING_REACHED_END_PERMANENT)) { @@ -1704,8 +1702,8 @@ void func_80A982E0(PlayState* play, ActorPathing* actorPathing) { sp28.x = actorPathing->curPoint.x - actorPathing->worldPos->x; sp28.y = actorPathing->curPoint.y - actorPathing->worldPos->y; sp28.z = actorPathing->curPoint.z - actorPathing->worldPos->z; - actorPathing->distSqToCurPointXZ = Math3D_XZLengthSquared(sp28.x, sp28.z); - actorPathing->distSqToCurPoint = Math3D_LengthSquared(&sp28); + actorPathing->distSqToCurPointXZ = Math3D_Dist1DSq(sp28.x, sp28.z); + actorPathing->distSqToCurPoint = Math3D_Vec3fMagnitudeSq(&sp28); actorPathing->rotToCurPoint.y = Math_Atan2S_XY(sp28.z, sp28.x); actorPathing->rotToCurPoint.x = Math_Atan2S_XY(sqrtf(actorPathing->distSqToCurPointXZ), -sp28.y); actorPathing->rotToCurPoint.z = 0; diff --git a/src/overlays/actors/ovl_En_Bat/z_en_bat.c b/src/overlays/actors/ovl_En_Bat/z_en_bat.c index 51c7d5212a..d1d31161a5 100644 --- a/src/overlays/actors/ovl_En_Bat/z_en_bat.c +++ b/src/overlays/actors/ovl_En_Bat/z_en_bat.c @@ -228,8 +228,8 @@ void EnBat_FlyIdle(EnBat* this, PlayState* play) { if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) { this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL; this->yawTarget = this->actor.wallYaw; - } else if (Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, this->actor.home.pos.x, - this->actor.home.pos.z) > SQ(300.0f)) { + } else if (Math3D_Dist2DSq(this->actor.world.pos.x, this->actor.world.pos.z, this->actor.home.pos.x, + this->actor.home.pos.z) > SQ(300.0f)) { this->yawTarget = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos); } else if (finishedRotStep && (Rand_ZeroOne() < 0.015f)) { this->yawTarget = diff --git a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c index 2fe58764f9..d54802f827 100644 --- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c +++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c @@ -447,7 +447,7 @@ void EnBigslime_UpdateSurfaceNorm(EnBigslime* this) { vecTriEdge2.y = dynamicVtx12->n.ob[1] - dynamicVtx0->n.ob[1]; vecTriEdge2.z = dynamicVtx12->n.ob[2] - dynamicVtx0->n.ob[2]; - Math3D_CrossProduct(&vecTriEdge1, &vecTriEdge2, &vecTriNorm); + Math3D_Vec3f_Cross(&vecTriEdge1, &vecTriEdge2, &vecTriNorm); EnBigslime_Vec3fNormalize(&vecTriNorm); Math_Vec3f_Sum(&vtxNorm[sBigslimeTri[i].v[0]], &vecTriNorm, &vtxNorm[sBigslimeTri[i].v[0]]); diff --git a/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c b/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c index 3577c6296a..67a867fc0d 100644 --- a/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c +++ b/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c @@ -136,7 +136,7 @@ s32 EnBomChu_UpdateFloorPoly(EnBomChu* this, CollisionPoly* floorPoly, PlayState return false; } - Math3D_CrossProduct(&this->axisUp, &normal, &vec); + Math3D_Vec3f_Cross(&this->axisUp, &normal, &vec); magnitude = Math3D_Vec3fMagnitude(&vec); if (magnitude < 0.001f) { @@ -148,7 +148,7 @@ s32 EnBomChu_UpdateFloorPoly(EnBomChu* this, CollisionPoly* floorPoly, PlayState Matrix_RotateAxisF(angle, &vec, MTXMODE_NEW); Matrix_MultVec3f(&this->axisLeft, &vec); Math_Vec3f_Copy(&this->axisLeft, &vec); - Math3D_CrossProduct(&this->axisLeft, &normal, &this->axisForwards); + Math3D_Vec3f_Cross(&this->axisLeft, &normal, &this->axisForwards); magnitude = Math3D_Vec3fMagnitude(&this->axisForwards); if (magnitude < 0.001f) { diff --git a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c index d677e6b91e..54f9ebbb25 100644 --- a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c +++ b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c @@ -170,7 +170,7 @@ s32 func_8089F908(EnBubble* this) { void EnBubble_Vec3fNormalizedReflect(Vec3f* vec1, Vec3f* vec2, Vec3f* dest) { f32 norm; - func_80179F64(vec1, vec2, dest); + Math3D_Vec3fReflect(vec1, vec2, dest); norm = sqrtf(SQ(dest->x) + SQ(dest->y) + SQ(dest->z)); if (norm != 0.0f) { dest->x /= norm; diff --git a/src/overlays/actors/ovl_En_Butte/z_en_butte.c b/src/overlays/actors/ovl_En_Butte/z_en_butte.c index b4c80d02e6..29743c178d 100644 --- a/src/overlays/actors/ovl_En_Butte/z_en_butte.c +++ b/src/overlays/actors/ovl_En_Butte/z_en_butte.c @@ -233,8 +233,8 @@ void func_8091C794(EnButte* this, PlayState* play) { EnButteStruct* sp4C = &D_8091D324[this->unk_24E]; f32 distSq; Player* player = GET_PLAYER(play); - f32 distFromHomeSq = Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, - this->actor.home.pos.x, this->actor.home.pos.z); + f32 distFromHomeSq = Math3D_Dist2DSq(this->actor.world.pos.x, this->actor.world.pos.z, this->actor.home.pos.x, + this->actor.home.pos.z); f32 playSpeed; f32 sp38; s32 pad; @@ -289,8 +289,8 @@ void func_8091C794(EnButte* this, PlayState* play) { if ((BUTTERFLY_GET_1(&this->actor) == BUTTERFLY_1) && (player->heldItemAction == PLAYER_IA_DEKU_STICK) && (this->unk_252 <= 0) && - ((Math3D_XZDistanceSquared(player->actor.world.pos.x, player->actor.world.pos.z, this->actor.home.pos.x, - this->actor.home.pos.z) < SQ(120.0f)) || + ((Math3D_Dist2DSq(player->actor.world.pos.x, player->actor.world.pos.z, this->actor.home.pos.x, + this->actor.home.pos.z) < SQ(120.0f)) || (this->actor.xzDistToPlayer < 60.0f))) { func_8091CB68(this); this->unk_24F = 2; @@ -354,14 +354,14 @@ void func_8091CBB4(EnButte* this, PlayState* play) { D_8091D3F0 = -D_8091D3F0; } - distSq = Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, this->actor.home.pos.x, - this->actor.home.pos.z); + distSq = Math3D_Dist2DSq(this->actor.world.pos.x, this->actor.world.pos.z, this->actor.home.pos.x, + this->actor.home.pos.z); if ((player->heldItemAction != PLAYER_IA_DEKU_STICK) || !(fabsf(player->actor.speed) < 1.8f) || (this->unk_252 > 0) || !(distSq < SQ(320.0f))) { func_8091C748(this); } else if ((distSq > SQ(240.0f)) && - (Math3D_XZDistanceSquared(player->meleeWeaponInfo[0].tip.x, player->meleeWeaponInfo[0].tip.z, - this->actor.world.pos.x, this->actor.world.pos.z) < SQ(60.0f))) { + (Math3D_Dist2DSq(player->meleeWeaponInfo[0].tip.x, player->meleeWeaponInfo[0].tip.z, + this->actor.world.pos.x, this->actor.world.pos.z) < SQ(60.0f))) { func_8091CF64(this); } } diff --git a/src/overlays/actors/ovl_En_Dg/z_en_dg.c b/src/overlays/actors/ovl_En_Dg/z_en_dg.c index 340b859070..14b1a217db 100644 --- a/src/overlays/actors/ovl_En_Dg/z_en_dg.c +++ b/src/overlays/actors/ovl_En_Dg/z_en_dg.c @@ -289,7 +289,7 @@ s32 EnDg_HasReachedPoint(EnDg* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c index edb110d705..6cf6ffb44d 100644 --- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c +++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c @@ -338,7 +338,7 @@ s32 EnGg2_HasReachedPoint(EnGg2* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Gk/z_en_gk.c b/src/overlays/actors/ovl_En_Gk/z_en_gk.c index 054e009674..0368b03e88 100644 --- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c +++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c @@ -414,7 +414,7 @@ s32 EnGk_HasReachedPoint(EnGk* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c index fa0a1f3d58..4fb2694f42 100644 --- a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c +++ b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c @@ -200,7 +200,7 @@ f32 func_8093EB74(EnGoroiwa* this, PlayState* play) { for (i = 1; i < temp_s4; i++) { Math_Vec3f_Copy(&sp54, &sp48); Math_Vec3s_ToVec3f(&sp48, &this->pathPoints[i]); - temp_f20 += Math3D_Distance(&sp54, &sp48); + temp_f20 += Math3D_Vec3f_DistXYZ(&sp54, &sp48); } return temp_f20; @@ -540,7 +540,7 @@ void func_8093FAA4(EnGoroiwa* this, PlayState* play) { if (this->unk_1E5 & 0x10) { sp7C = this->unk_1C0; } else { - temp = Math3D_Distance(&this->actor.world.pos, &this->actor.prevPos); + temp = Math3D_Vec3f_DistXYZ(&this->actor.world.pos, &this->actor.prevPos); tmp2 = temp / this->unk_1DC; this->unk_1C0 = tmp2; sp7C = this->unk_1C0; @@ -548,12 +548,12 @@ void func_8093FAA4(EnGoroiwa* this, PlayState* play) { sp7C *= this->unk_1C4; if (!(this->unk_1E5 & 0x10)) { - if (Math3D_LengthSquared(&this->actor.velocity) > 0.1f) { + if (Math3D_Vec3fMagnitudeSq(&this->actor.velocity) > 0.1f) { Math_Vec3f_Copy(&this->unk_1A8, &this->actor.velocity); } } - Math3D_CrossProduct(&D_80942E60, &this->unk_1A8, &sp70); + Math3D_Vec3f_Cross(&D_80942E60, &this->unk_1A8, &sp70); if (func_8093EAD4(&sp64, &sp70)) { this->unk_1B4 = sp64; @@ -1356,7 +1356,7 @@ void func_8094220C(EnGoroiwa* this, PlayState* play) { temp_f20 = this->unk_1DC * 0.9f; if (spB8.y > 0.0f) { - if (Math3D_AngleBetweenVectors(&D_80942E60, &spB8, &spAC)) { + if (Math3D_CosOut(&D_80942E60, &spB8, &spAC)) { phi_f12 = 1.0f; } else { phi_f12 = 1.0f - SQ(spAC); diff --git a/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c index 12285e15ac..72fc843fce 100644 --- a/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c +++ b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c @@ -510,7 +510,7 @@ void EnHonotrap_FlameMove(EnHonotrap* this, PlayState* play) { shieldVec.z = -player->shieldMf.zz; EnHonotrap_GetNormal(&shieldNorm, &shieldVec); tempVel = thisx->velocity; - func_80179F64(&tempVel, &shieldNorm, &thisx->velocity); + Math3D_Vec3fReflect(&tempVel, &shieldNorm, &thisx->velocity); thisx->speed = this->speedMod * 0.5f; thisx->world.rot.y = Math_Atan2S_XY(thisx->velocity.z, thisx->velocity.x); EnHonotrap_SetupFlameVanish(this); diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c index 5f42b43cdc..f5e8e25a56 100644 --- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -345,7 +345,7 @@ void func_8087B7C0(EnHorse* this, PlayState* play, Path* path) { phi_f14 = pathPoints[this->curRaceWaypoint + 1].z - pathPoints[this->curRaceWaypoint - 1].z; } - func_8017B7F8(&sp8C, Math_Atan2S(phi_f12, phi_f14), &sp7C, &sp78, &sp74); + Math3D_RotateXZPlane(&sp8C, Math_Atan2S(phi_f12, phi_f14), &sp7C, &sp78, &sp74); if (((this->actor.world.pos.x * sp7C) + (sp78 * this->actor.world.pos.z) + sp74) > 0.0f) { this->curRaceWaypoint++; @@ -361,7 +361,7 @@ void func_8087B7C0(EnHorse* this, PlayState* play, Path* path) { Math_Vec3s_ToVec3f(&sp80, &pathPoints[this->curRaceWaypoint - 1]); } - func_8017D7C0(this->actor.world.pos.x, this->actor.world.pos.z, sp80.x, sp80.z, sp8C.x, sp8C.z, &sp70); + Math3D_PointDistSqToLine2D(this->actor.world.pos.x, this->actor.world.pos.z, sp80.x, sp80.z, sp8C.x, sp8C.z, &sp70); if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->unk_1EC & 4)) { EnHorse_RotateToPoint(this, play, &sp8C, 0xC80); @@ -404,7 +404,7 @@ void func_8087B7C0(EnHorse* this, PlayState* play, Path* path) { for (i = sp68; i < sp60; i++) { Math_Vec3s_ToVec3f(&sp50, &pathPoints[i]); - temp_f0 = Math3D_Distance(&this->actor.world.pos, &sp50); + temp_f0 = Math3D_Vec3f_DistXYZ(&this->actor.world.pos, &sp50); if (temp_f0 < sp64) { sp64 = temp_f0; sp68 = i; @@ -577,7 +577,7 @@ bool func_8087C38C(PlayState* play, EnHorse* this, Vec3f* arg2) { return false; } - eyeDist = Math3D_Distance(arg2, &play->view.eye); + eyeDist = Math3D_Vec3f_DistXYZ(arg2, &play->view.eye); return func_8087C2B8(play, this, &sp24, sp20) || (eyeDist < 100.0f); } @@ -629,7 +629,7 @@ s32 EnHorse_Spawn(EnHorse* this, PlayState* play) { spawnPos.x = pathPoints[i].x; spawnPos.y = pathPoints[i].y; spawnPos.z = pathPoints[i].z; - dist = Math3D_Distance(&player->actor.world.pos, &spawnPos); + dist = Math3D_Vec3f_DistXYZ(&player->actor.world.pos, &spawnPos); if ((minDist < dist) || func_8087C38C(play, this, &spawnPos)) { continue; @@ -655,7 +655,7 @@ s32 EnHorse_Spawn(EnHorse* this, PlayState* play) { spawnPos.x = pathPoints[i].x; spawnPos.y = pathPoints[i].y; spawnPos.z = pathPoints[i].z; - dist = Math3D_Distance(&player->actor.world.pos, &spawnPos); + dist = Math3D_Vec3f_DistXYZ(&player->actor.world.pos, &spawnPos); if (minDist < dist) { continue; @@ -2514,7 +2514,7 @@ void EnHorse_CsMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorCue* cue) { endPos.y = cue->endPos.y; endPos.z = cue->endPos.z; - if (Math3D_Distance(&endPos, &this->actor.world.pos) > 8.0f) { + if (Math3D_Vec3f_DistXYZ(&endPos, &this->actor.world.pos) > 8.0f) { EnHorse_RotateToPoint(this, play, &endPos, 0x320); this->actor.speed = 8.0f; this->skin.skelAnime.playSpeed = this->actor.speed * 0.3f; @@ -2695,7 +2695,7 @@ void EnHorse_CsWarpMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorCue* cu endPos.y = cue->endPos.y; endPos.z = cue->endPos.z; - if (Math3D_Distance(&endPos, &this->actor.world.pos) > 8.0f) { + if (Math3D_Vec3f_DistXYZ(&endPos, &this->actor.world.pos) > 8.0f) { EnHorse_RotateToPoint(this, play, &endPos, 0x320); this->actor.speed = 8.0f; this->skin.skelAnime.playSpeed = this->actor.speed * 0.3f; @@ -2828,10 +2828,10 @@ s32 EnHorse_UpdateHbaRaceInfo(EnHorse* this, PlayState* play, RaceInfo* raceInfo f32 d; EnHorse_RaceWaypointPos(raceInfo->waypoints, this->curRaceWaypoint, &pos); - func_8017B7F8(&pos, raceInfo->waypoints[this->curRaceWaypoint].angle, &px, &pz, &d); + Math3D_RotateXZPlane(&pos, raceInfo->waypoints[this->curRaceWaypoint].angle, &px, &pz, &d); if ((this->curRaceWaypoint >= (raceInfo->numWaypoints - 1)) && - (Math3D_Distance(&pos, &this->actor.world.pos) < DREG(8))) { + (Math3D_Vec3f_DistXYZ(&pos, &this->actor.world.pos) < DREG(8))) { this->hbaFlags |= 2; } @@ -2999,9 +2999,9 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) { } } - distToHome = Math3D_Distance(&this->actor.home.pos, &this->actor.world.pos); - playerDistToHome = Math3D_Distance(&player->actor.world.pos, &this->actor.home.pos); - distToPlayer = Math3D_Distance(&player->actor.world.pos, &this->actor.world.pos); + distToHome = Math3D_Vec3f_DistXYZ(&this->actor.home.pos, &this->actor.world.pos); + playerDistToHome = Math3D_Vec3f_DistXYZ(&player->actor.world.pos, &this->actor.home.pos); + distToPlayer = Math3D_Vec3f_DistXYZ(&player->actor.world.pos, &this->actor.world.pos); if (playerDistToHome > 300.0f) { if (distToHome > 150.0f) { @@ -3352,7 +3352,7 @@ void func_808848C8(EnHorse* this, PlayState* play) { Horse_RotateToPoint(&this->actor, &sp24, 0x7D0); this->skin.skelAnime.playSpeed = this->actor.speed * 0.75f; SkelAnime_Update(&this->skin.skelAnime); - if (Math3D_Distance(&sp24, &this->actor.world.pos) < 30.0f) { + if (Math3D_Vec3f_DistXYZ(&sp24, &this->actor.world.pos) < 30.0f) { this->stateFlags &= ~ENHORSE_UNRIDEABLE; EnHorse_StartIdleRidable(this); } @@ -3446,7 +3446,7 @@ void func_80884E0C(EnHorse* this, PlayState* play) { this->actor.world.pos.x = this->banditPosition.x; this->actor.world.pos.z = this->banditPosition.z; - this->unk_56C = Math3D_Distance(&this->actor.world.pos, &this->actor.prevPos); + this->unk_56C = Math3D_Vec3f_DistXYZ(&this->actor.world.pos, &this->actor.prevPos); if (((this->unk_550 == 5) || (this->unk_550 == 7)) && (Player_GetMask(play) != PLAYER_MASK_CIRCUS_LEADER)) { this->rider->animIndex2 = ENIN_ANIM2_7; } else { diff --git a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c index 16f3611141..48c918c94c 100644 --- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c +++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c @@ -259,22 +259,22 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) { } if (!(this->unk_164 & 0x1000)) { - if (Math3D_XZBoundCheck(D_808F9BAC[0], D_808F9BAC[1], D_808F9BAC[2], D_808F9BAC[3], - this->horse1->actor.world.pos.x, this->horse1->actor.world.pos.z)) { + if (Math3D_PointInSquare2D(D_808F9BAC[0], D_808F9BAC[1], D_808F9BAC[2], D_808F9BAC[3], + this->horse1->actor.world.pos.x, this->horse1->actor.world.pos.z)) { this->unk_164 |= 0x1000; } } if (!(this->unk_164 & 0x2000) && (this->unk_164 & 0x1000)) { - if (Math3D_XZBoundCheck(D_808F9BBC[0], D_808F9BBC[1], D_808F9BBC[2], D_808F9BBC[3], - this->horse1->actor.world.pos.x, this->horse1->actor.world.pos.z)) { + if (Math3D_PointInSquare2D(D_808F9BBC[0], D_808F9BBC[1], D_808F9BBC[2], D_808F9BBC[3], + this->horse1->actor.world.pos.x, this->horse1->actor.world.pos.z)) { this->unk_164 |= 0x2000; } } if (!(this->unk_164 & 0x4000) && (this->unk_164 & 0x2000)) { - if (Math3D_XZBoundCheck(D_808F9BCC[0], D_808F9BCC[1], D_808F9BCC[2], D_808F9BCC[3], - this->horse1->actor.world.pos.x, this->horse1->actor.world.pos.z)) { + if (Math3D_PointInSquare2D(D_808F9BCC[0], D_808F9BCC[1], D_808F9BCC[2], D_808F9BCC[3], + this->horse1->actor.world.pos.x, this->horse1->actor.world.pos.z)) { this->unk_164 |= 0x4000; } } @@ -292,22 +292,22 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) { } if (!(this->unk_164 & 0x80000)) { - if (Math3D_XZBoundCheck(D_808F9BAC[0], D_808F9BAC[1], D_808F9BAC[2], D_808F9BAC[3], - this->horse2->actor.world.pos.x, this->horse2->actor.world.pos.z)) { + if (Math3D_PointInSquare2D(D_808F9BAC[0], D_808F9BAC[1], D_808F9BAC[2], D_808F9BAC[3], + this->horse2->actor.world.pos.x, this->horse2->actor.world.pos.z)) { this->unk_164 |= 0x80000; } } if (!(this->unk_164 & 0x100000) && (this->unk_164 & 0x80000)) { - if (Math3D_XZBoundCheck(D_808F9BBC[0], D_808F9BBC[1], D_808F9BBC[2], D_808F9BBC[3], - this->horse2->actor.world.pos.x, this->horse2->actor.world.pos.z)) { + if (Math3D_PointInSquare2D(D_808F9BBC[0], D_808F9BBC[1], D_808F9BBC[2], D_808F9BBC[3], + this->horse2->actor.world.pos.x, this->horse2->actor.world.pos.z)) { this->unk_164 |= 0x100000; } } if (!(this->unk_164 & 0x200000) && (this->unk_164 & 0x100000)) { - if (Math3D_XZBoundCheck(D_808F9BCC[0], D_808F9BCC[1], D_808F9BCC[2], D_808F9BCC[3], - this->horse2->actor.world.pos.x, this->horse2->actor.world.pos.z)) { + if (Math3D_PointInSquare2D(D_808F9BCC[0], D_808F9BCC[1], D_808F9BCC[2], D_808F9BCC[3], + this->horse2->actor.world.pos.x, this->horse2->actor.world.pos.z)) { this->unk_164 |= 0x200000; } } @@ -324,20 +324,20 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) { this->unk_174 = 60; } - if (!(this->unk_164 & 0x20) && Math3D_XZBoundCheck(D_808F9BAC[0], D_808F9BAC[1], D_808F9BAC[2], D_808F9BAC[3], - horse->actor.world.pos.x, horse->actor.world.pos.z)) { + if (!(this->unk_164 & 0x20) && Math3D_PointInSquare2D(D_808F9BAC[0], D_808F9BAC[1], D_808F9BAC[2], D_808F9BAC[3], + horse->actor.world.pos.x, horse->actor.world.pos.z)) { this->unk_164 |= 0x20; } if (!(this->unk_164 & 0x40) && (this->unk_164 & 0x20) && - Math3D_XZBoundCheck(D_808F9BBC[0], D_808F9BBC[1], D_808F9BBC[2], D_808F9BBC[3], horse->actor.world.pos.x, - horse->actor.world.pos.z)) { + Math3D_PointInSquare2D(D_808F9BBC[0], D_808F9BBC[1], D_808F9BBC[2], D_808F9BBC[3], horse->actor.world.pos.x, + horse->actor.world.pos.z)) { this->unk_164 |= 0x40; } if (!(this->unk_164 & 0x80) && (this->unk_164 & 0x40) && - Math3D_XZBoundCheck(D_808F9BCC[0], D_808F9BCC[1], D_808F9BCC[2], D_808F9BCC[3], horse->actor.world.pos.x, - horse->actor.world.pos.z)) { + Math3D_PointInSquare2D(D_808F9BCC[0], D_808F9BCC[1], D_808F9BCC[2], D_808F9BCC[3], horse->actor.world.pos.x, + horse->actor.world.pos.z)) { this->unk_164 |= 0x80; } diff --git a/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c index 1c4461824e..bae6978ebf 100644 --- a/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c +++ b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c @@ -362,7 +362,7 @@ void func_808DF088(EnHorseLinkChild* this, PlayState* play) { s32 newYawDir; s32 pad; - if (Math3D_Distance(&player->actor.world.pos, &this->actor.home.pos) < 250.0f) { + if (Math3D_Vec3f_DistXYZ(&player->actor.world.pos, &this->actor.home.pos) < 250.0f) { newYawDiff = player->actor.shape.rot.y; if (Actor_WorldYawTowardActor(&this->actor, &player->actor) > 0) { newYawDir = 1; @@ -407,10 +407,10 @@ void EnHorseLinkChild_LonLonIdle(EnHorseLinkChild* this, PlayState* play) { (this->animIndex == OOT_CHILD_EPONA_ANIM_IDLE)) { //! @bug: The carry-over of this flag from OoT was not done correctly if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ENTERED_ZORA_HALL)) { - f32 distToHome = Math3D_Distance(&this->actor.world.pos, &this->actor.home.pos); + f32 distToHome = Math3D_Vec3f_DistXYZ(&this->actor.world.pos, &this->actor.home.pos); s32 pad; - if (Math3D_Distance(&player->actor.world.pos, &this->actor.home.pos) > 250.0f) { + if (Math3D_Vec3f_DistXYZ(&player->actor.world.pos, &this->actor.home.pos) > 250.0f) { if (distToHome >= 300.0f) { animIndex = OOT_CHILD_EPONA_ANIM_GALLOP; this->actor.speed = 6.0f; @@ -544,7 +544,7 @@ void EnHorseLinkChild_ActionFunc4(EnHorseLinkChild* this, PlayState* play) { if (!this->isReturningHome) { distToTargetPos = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor); } else { - distToTargetPos = Math3D_Distance(&this->actor.world.pos, &this->actor.home.pos); + distToTargetPos = Math3D_Vec3f_DistXYZ(&this->actor.world.pos, &this->actor.home.pos); } if (!this->isReturningHome) { diff --git a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c index f460f4bd47..38cde30b72 100644 --- a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c +++ b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c @@ -607,7 +607,7 @@ f32 EnInvadepoh_GetTotalPathDistance(EnInvadepoh* this) { for (i = 1; i < pointCount; currentPathPoint++, i++) { Math_Vec3f_Copy(&previousPathPointPos, ¤tPathPointPos); Math_Vec3s_ToVec3f(¤tPathPointPos, currentPathPoint); - totalPathDistance += Math3D_Distance(&previousPathPointPos, ¤tPathPointPos); + totalPathDistance += Math3D_Vec3f_DistXYZ(&previousPathPointPos, ¤tPathPointPos); } return totalPathDistance; @@ -688,7 +688,7 @@ s32 EnInvadepoh_Dog_IsCloseToPath(EnInvadepoh* this, f32 a, f32 b) { // Projects the dog's current position onto the line formed by the current and next path points and checks to see if // the projected position lies between the current and next points along the path. In other words, it makes sure the // dog is not "behind" the current point or "ahead of" the next point along the axis formed by the two points. - pathSegmentDistance = Math3D_XZLength(diffX, diffZ); + pathSegmentDistance = Math3D_Dist1D(diffX, diffZ); distanceAlongPath = (offsetFromPointZ * cos) + (offsetFromPointX * sin); if ((distanceAlongPath < 0.0f) || (pathSegmentDistance < distanceAlongPath)) { return false; @@ -770,7 +770,7 @@ void EnInvadepoh_Alien_SetCheckpoints(EnInvadepoh* this) { for (i = 1; i < endPoint; i++, currentPathPoint++, pathCheckpoint++) { Math_Vec3f_Copy(&previousPathPointPos, ¤tPathPointPos); Math_Vec3s_ToVec3f(¤tPathPointPos, currentPathPoint); - pathSegmentDistance += Math3D_Distance(&previousPathPointPos, ¤tPathPointPos); + pathSegmentDistance += Math3D_Vec3f_DistXYZ(&previousPathPointPos, ¤tPathPointPos); *pathCheckpoint = pathSegmentDistance * invTotalPathDistance; if (*pathCheckpoint < 0.0f) { @@ -1039,7 +1039,7 @@ s32 EnInvadepoh_Dog_MoveAlongPath(EnInvadepoh* this, PlayState* play) { worldToCurrent.z = currentPathPointZ - this->actor.world.pos.z; if (this->actor.speed > 0.0f) { - if (Math3D_AngleBetweenVectors(¤tToNext, &worldToNext, &angleToNext)) { + if (Math3D_CosOut(¤tToNext, &worldToNext, &angleToNext)) { reachedNextPoint = true; } else if (angleToNext <= 0.0f) { reachedNextPoint = true; @@ -1129,7 +1129,7 @@ void EnInvadepoh_Alien_DesegmentTexAnims(void) { s32 EnInvadepoh_StepToXZ(f32* pValueX, f32* pValueZ, f32 targetX, f32 targetZ, f32 step) { f32 diffX = targetX - *pValueX; f32 diffZ = targetZ - *pValueZ; - f32 distToTarget = Math3D_XZLength(diffX, diffZ); + f32 distToTarget = Math3D_Dist1D(diffX, diffZ); if (step < distToTarget) { f32 stepFraction = step / distToTarget; diff --git a/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c b/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c index 4d9e961a99..828bd28d15 100644 --- a/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c +++ b/src/overlays/actors/ovl_En_Invadepoh_Demo/z_en_invadepoh_demo.c @@ -14,9 +14,9 @@ * 4. The UFO (which appears as a spinning ball of light) * 5. A cow tail */ - -#include "sys_cfb.h" +#include "prevent_bss_reordering.h" #include "z_en_invadepoh_demo.h" +#include "sys_cfb.h" #define FLAGS (ACTOR_FLAG_10) diff --git a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c index 408af34902..8a8ceda614 100644 --- a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c +++ b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c @@ -317,7 +317,7 @@ void func_8095DFF0(EnIshi* this, PlayState* play) { Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY); Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY); Matrix_MultVecY(1.0f, &sp30); - sp2C = Math3D_Parallel(&sp30, &D_8095F778); + sp2C = Math3D_Cos(&sp30, &D_8095F778); if (sp2C < 0.707f) { temp_v1_2 = Math_Atan2S_XY(sp30.z, sp30.x) - sp3C->world.rot.y; if (ABS_ALT(temp_v1_2) > 0x4000) { diff --git a/src/overlays/actors/ovl_En_Jg/z_en_jg.c b/src/overlays/actors/ovl_En_Jg/z_en_jg.c index e30754c691..df0914ff3e 100644 --- a/src/overlays/actors/ovl_En_Jg/z_en_jg.c +++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.c @@ -244,7 +244,7 @@ s32 EnJg_HasReachedPoint(EnJg* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index 59442b0146..cb8ebefaf6 100644 --- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -3,7 +3,7 @@ * Overlay: ovl_En_Kusa * Description: Grass / Bush */ - +#include "prevent_bss_reordering.h" #include "z_en_kusa.h" #include "objects/object_kusa/object_kusa.h" #include "objects/gameplay_keep/gameplay_keep.h" diff --git a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c index 88d63af9d9..2188ef36a4 100644 --- a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c +++ b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c @@ -516,7 +516,7 @@ void func_80A5C410(EnKusa2UnkBssStruct* arg0, EnKusa2UnkBssSubStruct2* arg1, Vec s32 phi_s2 = true; Math_Vec3f_Diff(&arg1->unk_04, &s->unk_00, &sp98); - temp_f0 = Math3D_LengthSquared(&sp98); + temp_f0 = Math3D_Vec3fMagnitudeSq(&sp98); phi_v0 = false; if (temp_f0 <= s->unk_4C) { @@ -923,7 +923,7 @@ void func_80A5D62C(EnKusa2* this, PlayState* play) { if (this->unk_1BE != 0) { func_80A5B490(this, play); func_80A5D754(this); - } else if (Math3D_XZLengthSquared(this->actor.projectedPos.x, this->actor.projectedPos.z) < SQ(1600.0f)) { + } else if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) < SQ(1600.0f)) { func_80A5B160(this, play); func_80A5D6B0(this); } @@ -938,7 +938,7 @@ void func_80A5D6C4(EnKusa2* this, PlayState* play) { if (this->unk_1BE != 0) { func_80A5B490(this, play); func_80A5D754(this); - } else if (Math3D_XZLengthSquared(this->actor.projectedPos.x, this->actor.projectedPos.z) > SQ(1750.0f)) { + } else if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) > SQ(1750.0f)) { func_80A5B334(this, play); func_80A5D618(this); } diff --git a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c index bf2e938db9..a4d391e421 100644 --- a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c +++ b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c @@ -69,7 +69,7 @@ static Vec3f sCheckpointPositions[] = { * The range extends a little bit beyond the finish line's in-game visual. */ s32 EnMttag_IsInFinishLine(Vec3f* pos) { - return Math3D_XZBoundCheck(-1261.0f, -901.0f, -1600.0f, -1520.0f, pos->x, pos->z); + return Math3D_PointInSquare2D(-1261.0f, -901.0f, -1600.0f, -1520.0f, pos->x, pos->z); } /** @@ -78,11 +78,11 @@ s32 EnMttag_IsInFinishLine(Vec3f* pos) { */ s32 EnMttag_CheckPlayerCheatStatus(Vec3f* pos) { if (!CHECK_EVENTINF(EVENTINF_10)) { - if (Math3D_XZBoundCheck(-466.0f, -386.0f, -687.0f, 193.0f, pos->x, pos->z)) { + if (Math3D_PointInSquare2D(-466.0f, -386.0f, -687.0f, 193.0f, pos->x, pos->z)) { // The race hasn't started yet, but the player is beyond the starting line. return GORON_RACE_CHEAT_FALSE_START; } - } else if (Math3D_XZBoundCheck(-1127.0f, -1007.0f, -867.0f, -787.0f, pos->x, pos->z)) { + } else if (Math3D_PointInSquare2D(-1127.0f, -1007.0f, -867.0f, -787.0f, pos->x, pos->z)) { // The goal is actually quite close to the start, just behind a large wall. // This checks if the player is in an area "behind" the goal that is not accessible // in normal play; it can only be reached by climbing the wall somehow. Perhaps they @@ -156,7 +156,7 @@ s32 EnMttag_GetCurrentCheckpoint(Actor* actor, PlayState* play, s32* upcomingChe // Iterates through all possible checkpoints that are associated with this sceneExitIndex. do { - if (Math3D_PointDistToLine2D( + if (Math3D_PointDistSqToLine2DImpl( actor->world.pos.x, actor->world.pos.z, sCheckpointPositions[checkpointIterator - 1].x, sCheckpointPositions[checkpointIterator - 1].z, sCheckpointPositions[checkpointIterator + 1].x, sCheckpointPositions[checkpointIterator + 1].z, &perpendicularPointX, &perpendicularPointZ, diff --git a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c index 6f40ddb4df..6e7bcc8eb2 100644 --- a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c +++ b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c @@ -154,8 +154,8 @@ s32 func_80A68910(EnMushi2* this, PlayState* play) { params = OBJBEAN_GET_C000(bean); if (((params == ENOBJBEAN_GET_C000_1) || (params == ENOBJBEAN_GET_C000_2)) && (bean->room == this->actor.room)) { - temp_f0 = Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, bean->world.pos.x, - bean->world.pos.z); + temp_f0 = Math3D_Dist2DSq(this->actor.world.pos.x, this->actor.world.pos.z, bean->world.pos.x, + bean->world.pos.z); temp_f2 = bean->world.pos.y - this->actor.world.pos.y; if ((temp_f0 < minDistSq) && (temp_f2 < 100.0f) && (temp_f2 > -50.0f)) { ret = true; @@ -237,7 +237,7 @@ s32 func_80A68CE4(Vec3f* arg0, Vec3f* arg1, f32 arg2) { f32 temp_f2; Math_Vec3f_Diff(arg1, arg0, &sp34); - temp_f0 = Math3D_LengthSquared(&sp34); + temp_f0 = Math3D_Vec3fMagnitudeSq(&sp34); temp_f2 = arg2 + 0.01f; if (temp_f0 <= SQ(temp_f2)) { Math_Vec3f_Copy(arg0, arg1); @@ -269,9 +269,9 @@ s32 func_80A68DD4(EnMushi2* this, PlayState* play) { player = GET_PLAYER(play); sp2E = BINANG_ROT180(this->actor.yawTowardsPlayer); sp24 = Math_SinS(sp2E); - if (Math3D_XZDistanceSquared((sp24 * 16.0f) + player->actor.world.pos.x, - (Math_CosS(sp2E) * 16.0f) + player->actor.world.pos.z, this->actor.world.pos.x, - this->actor.world.pos.z) < SQ(20.0f)) { + if (Math3D_Dist2DSq((sp24 * 16.0f) + player->actor.world.pos.x, + (Math_CosS(sp2E) * 16.0f) + player->actor.world.pos.z, this->actor.world.pos.x, + this->actor.world.pos.z) < SQ(20.0f)) { return true; } } @@ -411,8 +411,8 @@ s32 func_80A691EC(EnMushi2* this, CollisionPoly* floorPoly, f32 arg2) { sp30 = 1; } - Math3D_CrossProduct(&this->unk_310, &sp4C, &sp40); - Math3D_CrossProduct(&sp4C, &sp40, &sp64); + Math3D_Vec3f_Cross(&this->unk_310, &sp4C, &sp40); + Math3D_Vec3f_Cross(&sp4C, &sp40, &sp64); if (func_80A68C5C(&sp64, &sp58) && func_80A68C5C(&sp40, &sp34)) { Math_Vec3f_Copy(&this->unk_31C, &sp4C); @@ -606,15 +606,13 @@ void func_80A69ADC(Actor* thisx) { s32 pad2; if (this->unk_358 < 1.0f) { - sp44 = Math3D_SignedDistanceFromPlane( - this->unk_310.x, this->unk_310.y, this->unk_310.z, - func_80A69AA8(this->unk_310.x, this->unk_310.y, this->unk_310.z, &this->actor.world.pos), - &bean->dyna.actor.world.pos); - sp40 = Math3D_SignedDistanceFromPlane( - this->unk_328.x, this->unk_328.y, this->unk_328.z, - func_80A69AA8(this->unk_328.x, this->unk_328.y, this->unk_328.z, &this->actor.world.pos), - &bean->dyna.actor.world.pos); - sp3C = Math3D_XZLength(sp44, sp40); + sp44 = Math3D_PlaneF(this->unk_310.x, this->unk_310.y, this->unk_310.z, + func_80A69AA8(this->unk_310.x, this->unk_310.y, this->unk_310.z, &this->actor.world.pos), + &bean->dyna.actor.world.pos); + sp40 = Math3D_PlaneF(this->unk_328.x, this->unk_328.y, this->unk_328.z, + func_80A69AA8(this->unk_328.x, this->unk_328.y, this->unk_328.z, &this->actor.world.pos), + &bean->dyna.actor.world.pos); + sp3C = Math3D_Dist1D(sp44, sp40); if (fabsf(sp3C) > 0.1f) { this->unk_360 = (Rand_ZeroOne() * 3000.0f * (this->unk_358 - 1.0f)) + (((sp40 / sp3C) - 1.0f) * -1500.0f); @@ -652,15 +650,13 @@ void func_80A69D3C(EnMushi2* this) { f32 sp38; if ((this->unk_34C != NULL) && (this->unk_358 > 0.999f)) { - sp40 = Math3D_SignedDistanceFromPlane( - this->unk_310.x, this->unk_310.y, this->unk_310.z, - func_80A69AA8(this->unk_310.x, this->unk_310.y, this->unk_310.z, &this->actor.world.pos), - &this->unk_34C->dyna.actor.world.pos); - sp3C = Math3D_SignedDistanceFromPlane( - this->unk_328.x, this->unk_328.y, this->unk_328.z, - func_80A69AA8(this->unk_328.x, this->unk_328.y, this->unk_328.z, &this->actor.world.pos), - &this->unk_34C->dyna.actor.world.pos); - sp38 = Math3D_XZLengthSquared(sp40, sp3C); + sp40 = Math3D_PlaneF(this->unk_310.x, this->unk_310.y, this->unk_310.z, + func_80A69AA8(this->unk_310.x, this->unk_310.y, this->unk_310.z, &this->actor.world.pos), + &this->unk_34C->dyna.actor.world.pos); + sp3C = Math3D_PlaneF(this->unk_328.x, this->unk_328.y, this->unk_328.z, + func_80A69AA8(this->unk_328.x, this->unk_328.y, this->unk_328.z, &this->actor.world.pos), + &this->unk_34C->dyna.actor.world.pos); + sp38 = Math3D_Dist1DSq(sp40, sp3C); if (fabsf(sp38) > 0.010000001f) { s16 temp_v0 = Math_Atan2S_XY(sp3C, sp40); diff --git a/src/overlays/actors/ovl_En_Ot/z_en_ot.c b/src/overlays/actors/ovl_En_Ot/z_en_ot.c index 7a469a5f36..f1e76a1db9 100644 --- a/src/overlays/actors/ovl_En_Ot/z_en_ot.c +++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.c @@ -896,7 +896,7 @@ s32 EnOt_ActorPathing_UpdateActorInfo(PlayState* play, ActorPathing* actorPath) sp44.y = actorPath->curPoint.y - actorPath->prevPoint.y; sp44.z = actorPath->curPoint.z - actorPath->prevPoint.z; - temp = Math3D_Parallel(&sp50, &sp44); + temp = Math3D_Cos(&sp50, &sp44); if ((actorPath->distSqToCurPointXZ < SQ(thisx->speed)) || (temp <= 0.0f)) { ret = true; } else { diff --git a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c index 2d7ba42782..f677f918d0 100644 --- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c +++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c @@ -312,12 +312,12 @@ s32 func_8086A2CC(EnPametfrog* this, CollisionPoly* floorPoly) { return false; } - Math3D_CrossProduct(&this->unk_2DC, &floorNorm, &vec2); + Math3D_Vec3f_Cross(&this->unk_2DC, &floorNorm, &vec2); EnPametfrog_Vec3fNormalize(&vec2); Matrix_RotateAxisF(rotation, &vec2, MTXMODE_NEW); Matrix_MultVec3f(&this->unk_2E8, &vec2); Math_Vec3f_Copy(&this->unk_2E8, &vec2); - Math3D_CrossProduct(&this->unk_2E8, &floorNorm, &this->unk_2D0); + Math3D_Vec3f_Cross(&this->unk_2E8, &floorNorm, &this->unk_2D0); EnPametfrog_Vec3fNormalize(&this->unk_2D0); Math_Vec3f_Copy(&this->unk_2DC, &floorNorm); return true; @@ -569,9 +569,9 @@ void EnPametfrog_SetupWallCrawl(EnPametfrog* this) { this->unk_2DC.x = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.x); this->unk_2DC.y = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.y); this->unk_2DC.z = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.z); - Math3D_CrossProduct(&this->unk_2DC, &this->unk_2D0, &this->unk_2E8); + Math3D_Vec3f_Cross(&this->unk_2DC, &this->unk_2D0, &this->unk_2E8); EnPametfrog_Vec3fNormalize(&this->unk_2E8); - Math3D_CrossProduct(&this->unk_2E8, &this->unk_2DC, &this->unk_2D0); + Math3D_Vec3f_Cross(&this->unk_2E8, &this->unk_2DC, &this->unk_2D0); EnPametfrog_Vec3fNormalize(&this->unk_2D0); func_8086A238(this); this->actor.floorPoly = this->actor.wallPoly; @@ -684,7 +684,7 @@ void EnPametfrog_WallPause(EnPametfrog* this, PlayState* play) { Matrix_RotateAxisF(this->wallRotation, &this->unk_2DC, MTXMODE_NEW); Matrix_MultVec3f(&this->unk_2D0, &vec); Math_Vec3f_Copy(&this->unk_2D0, &vec); - Math3D_CrossProduct(&this->unk_2DC, &this->unk_2D0, &this->unk_2E8); + Math3D_Vec3f_Cross(&this->unk_2DC, &this->unk_2D0, &this->unk_2E8); func_8086A238(this); if (((play->gameplayFrames % 60) == 0) && (Rand_ZeroOne() < 0.8f)) { Actor_PlaySfx(&this->actor, NA_SE_EN_FROG_REAL); diff --git a/src/overlays/actors/ovl_En_Rat/z_en_rat.c b/src/overlays/actors/ovl_En_Rat/z_en_rat.c index e73ade856e..acefb80573 100644 --- a/src/overlays/actors/ovl_En_Rat/z_en_rat.c +++ b/src/overlays/actors/ovl_En_Rat/z_en_rat.c @@ -246,7 +246,7 @@ s32 EnRat_UpdateFloorPoly(EnRat* this, CollisionPoly* floorPoly, PlayState* play return false; } - Math3D_CrossProduct(&this->axisUp, &normal, &vec); + Math3D_Vec3f_Cross(&this->axisUp, &normal, &vec); magnitude = Math3D_Vec3fMagnitude(&vec); if (magnitude < 0.001f) { @@ -258,7 +258,7 @@ s32 EnRat_UpdateFloorPoly(EnRat* this, CollisionPoly* floorPoly, PlayState* play Matrix_RotateAxisF(angle, &vec, MTXMODE_NEW); Matrix_MultVec3f(&this->axisLeft, &vec); Math_Vec3f_Copy(&this->axisLeft, &vec); - Math3D_CrossProduct(&this->axisLeft, &normal, &this->axisForwards); + Math3D_Vec3f_Cross(&this->axisLeft, &normal, &this->axisForwards); magnitude = Math3D_Vec3fMagnitude(&this->axisForwards); if (magnitude < 0.001f) { @@ -345,7 +345,7 @@ void EnRat_ChooseDirection(EnRat* this) { Matrix_RotateAxisF(BINANG_TO_RAD(angle), &this->axisUp, MTXMODE_NEW); Matrix_MultVec3f(&this->axisForwards, &newAxisForwards); Math_Vec3f_Copy(&this->axisForwards, &newAxisForwards); - Math3D_CrossProduct(&this->axisUp, &this->axisForwards, &this->axisLeft); + Math3D_Vec3f_Cross(&this->axisUp, &this->axisForwards, &this->axisLeft); this->shouldRotateOntoSurfaces = true; } diff --git a/src/overlays/actors/ovl_En_Rg/z_en_rg.c b/src/overlays/actors/ovl_En_Rg/z_en_rg.c index 301df98e47..f2a4d36470 100644 --- a/src/overlays/actors/ovl_En_Rg/z_en_rg.c +++ b/src/overlays/actors/ovl_En_Rg/z_en_rg.c @@ -370,8 +370,8 @@ s32 func_80BF43FC(EnRg* this) { do { SubS_CopyPointFromPathCheckBounds(this->path, phi_s0 - 1, &sp9C); SubS_CopyPointFromPathCheckBounds(this->path, phi_s0 + 1, &sp90); - if (Math3D_PointDistToLine2D(this->actor.world.pos.x, this->actor.world.pos.z, sp9C.x, sp9C.z, sp90.x, sp90.z, - &sp8C, &sp88, &sp84) && + if (Math3D_PointDistSqToLine2DImpl(this->actor.world.pos.x, this->actor.world.pos.z, sp9C.x, sp9C.z, sp90.x, + sp90.z, &sp8C, &sp88, &sp84) && (!phi_s6 || ((phi_s4 + 1) == phi_s0) || (sp84 < phi_f20))) { phi_s6 = 1; phi_f20 = sp84; @@ -604,7 +604,7 @@ void func_80BF4AB8(EnRg* this, PlayState* play) { * The range extends a little bit beyond the finish line's in-game visual. */ s32 EnRg_IsInFinishLine(Vec3f* pos) { - return Math3D_XZBoundCheck(-1261.0f, -901.0f, -1600.0f, -1520.0f, pos->x, pos->z); + return Math3D_PointInSquare2D(-1261.0f, -901.0f, -1600.0f, -1520.0f, pos->x, pos->z); } Vec3f D_80BF596C[] = { diff --git a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c index dcb7c14df1..f9b64095a7 100644 --- a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c +++ b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c @@ -148,7 +148,7 @@ s32 EnRuppecrow_HasReachedPointClockwise(EnRuppecrow* this, Path* path, s32 poin 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; @@ -182,7 +182,7 @@ s32 EnRuppecrow_HasReachedPointCounterClockwise(EnRuppecrow* this, Path* path, s 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c index 534c7842b2..2f0882bd76 100644 --- a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c +++ b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c @@ -194,7 +194,7 @@ s32 EnScopecrow_HasReachedPoint(EnScopecrow* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c index 12ae0cd1cf..389b734804 100644 --- a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c +++ b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c @@ -694,7 +694,7 @@ s32 EnScopenuts_HasReachedPoint(EnScopenuts* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c index 2ca3563f63..bdd13c3890 100644 --- a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c +++ b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c @@ -954,7 +954,7 @@ s32 EnSellnuts_HasReachedPoint(EnSellnuts* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c index a5b49b6b59..f09bd81c0c 100644 --- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c +++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c @@ -591,7 +591,7 @@ s32 EnSuttari_HasReachedPointForward(EnSuttari* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; @@ -625,7 +625,7 @@ s32 EnSuttari_HasReachedPointReverse(EnSuttari* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/src/overlays/actors/ovl_En_Sw/z_en_sw.c index 5c56ba2e7a..28e8304a54 100644 --- a/src/overlays/actors/ovl_En_Sw/z_en_sw.c +++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.c @@ -289,7 +289,7 @@ void func_808D90F0(EnSw* this, s32 arg1, s16 arg2) { Matrix_RotateAxisF(BINANG_TO_RAD_ALT(temp), &this->unk_368, MTXMODE_NEW); Matrix_MultVec3f(&this->unk_350, &sp2C); Math_Vec3f_Copy(&this->unk_350, &sp2C); - Math3D_CrossProduct(&this->unk_368, &this->unk_350, &this->unk_35C); + Math3D_Vec3f_Cross(&this->unk_368, &this->unk_350, &this->unk_35C); } s32 func_808D91C4(EnSw* this, CollisionPoly* floorPoly) { @@ -319,7 +319,7 @@ s32 func_808D91C4(EnSw* this, CollisionPoly* floorPoly) { return false; } - Math3D_CrossProduct(&this->unk_368, &sp38, &sp2C); + Math3D_Vec3f_Cross(&this->unk_368, &sp38, &sp2C); temp_f0 = Math3D_Vec3fMagnitude(&sp2C); if (temp_f0 < 0.001f) { return false; @@ -329,7 +329,7 @@ s32 func_808D91C4(EnSw* this, CollisionPoly* floorPoly) { Matrix_RotateAxisF(sp4C, &sp2C, MTXMODE_NEW); Matrix_MultVec3f(&this->unk_35C, &sp2C); Math_Vec3f_Copy(&this->unk_35C, &sp2C); - Math3D_CrossProduct(&this->unk_35C, &sp38, &this->unk_350); + Math3D_Vec3f_Cross(&this->unk_35C, &sp38, &this->unk_350); temp_f0 = Math3D_Vec3fMagnitude(&this->unk_350); if (temp_f0 < 0.001f) { diff --git a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c index 50340ea8c2..db0c0cfa12 100644 --- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c +++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c @@ -590,7 +590,7 @@ s32 EnTrt2_HasReachedPoint(EnTrt2* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c index 8db978465a..7d3ec379ad 100644 --- a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c +++ b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c @@ -299,7 +299,7 @@ s32 EnTruMt_HasReachedPoint(EnTruMt* this, 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 * this->actor.world.pos.x) + (pz * this->actor.world.pos.z) + d) > 0.0f) { reached = true; diff --git a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c index 65ba00792a..5f82028148 100644 --- a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c +++ b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c @@ -702,7 +702,7 @@ s32 MirRay_CheckInFrustum(Vec3f* vecA, Vec3f* vecB, f32 pointx, f32 pointy, f32 sp50.y = pointy - vecA->y; sp50.z = pointz - vecA->z; - if (Math3D_Parallel(&sp5C, &sp50) < 0.0f) { + if (Math3D_Cos(&sp5C, &sp50) < 0.0f) { return false; } @@ -710,7 +710,7 @@ s32 MirRay_CheckInFrustum(Vec3f* vecA, Vec3f* vecB, f32 pointx, f32 pointy, f32 sp44.y = pointy - vecB->y; sp44.z = pointz - vecB->z; - if (Math3D_Parallel(&sp5C, &sp44) > 0.0f) { + if (Math3D_Cos(&sp5C, &sp44) > 0.0f) { return false; } return true; diff --git a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c index 523155cec5..b9f2bdc440 100644 --- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c +++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c @@ -436,7 +436,7 @@ s32 func_80A24118(ObjIceblock* this, PlayState* play, f32 arg2, Vec3f* arg3) { spF0 = Math_SinS(sp9E); spEC = Math_CosS(sp9E); - temp_f20 = Math3D_Distance(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos) + + temp_f20 = Math3D_Vec3f_DistXYZ(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos) + (300.0f * this->dyna.actor.scale.z) + arg2; temp_f24 = temp_f20 * spF0; temp_f26 = temp_f20 * spEC; @@ -511,7 +511,7 @@ s32 func_80A243E0(ObjIceblock* this, PlayState* play, Vec3f* arg0) { sp100 = Math_SinS(temp_s6); spFC = Math_CosS(temp_s6); - temp_f0 = ((Math3D_Distance(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos) + + temp_f0 = ((Math3D_Vec3f_DistXYZ(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos) + (300.0f * this->dyna.actor.scale.z)) + 2.0f); temp_f12 = -temp_f0; diff --git a/src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c b/src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c index cd10516b98..a154590035 100644 --- a/src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c +++ b/src/overlays/actors/ovl_Obj_Mine/z_obj_mine.c @@ -258,7 +258,7 @@ s32 ObjMine_StepUntilParallel(Vec3f* value, Vec3f* target, f32 angleStep) { Vec3f perpVec; Vec3f prevValue; Vec3f perpNormal; - f32 cosAngle = Math3D_Parallel(value, target); + f32 cosAngle = Math3D_Cos(value, target); if (Math_CosF(angleStep) <= cosAngle) { Math_Vec3f_Copy(value, target); @@ -267,7 +267,7 @@ s32 ObjMine_StepUntilParallel(Vec3f* value, Vec3f* target, f32 angleStep) { Matrix_Push(); Math_Vec3f_Copy(&prevValue, value); - Math3D_CrossProduct(value, target, &perpVec); + Math3D_Vec3f_Cross(value, target, &perpVec); if (ObjMine_GetUnitVec3f(&perpVec, &perpNormal)) { Matrix_RotateAxisS(RAD_TO_BINANG(angleStep), &perpNormal, MTXMODE_NEW); Matrix_MultVec3f(&prevValue, value); @@ -337,10 +337,10 @@ void ObjMine_Air_SetBasis(ObjMine* this) { ObjMine_GetUnitVec3f(&tempVec, &airChain->basis.y); - Math3D_CrossProduct(&sStandardBasis.x, &airChain->basis.y, &tempVec); + Math3D_Vec3f_Cross(&sStandardBasis.x, &airChain->basis.y, &tempVec); ObjMine_GetUnitVec3f(&tempVec, &airChain->basis.z); - Math3D_CrossProduct(&airChain->basis.y, &airChain->basis.z, &tempVec); + Math3D_Vec3f_Cross(&airChain->basis.y, &airChain->basis.z, &tempVec); ObjMine_GetUnitVec3f(&tempVec, &airChain->basis.x); } @@ -441,8 +441,8 @@ void ObjMine_Water_WallCheck(ObjMine* this, PlayState* play) { waterChain->touchWall = false; if (waterChain->wallCheckDistSq > -1e-6f) { // Checks for walls if mine is sufficiently far from home. If found, sets ejection force towards home. - if (waterChain->wallCheckDistSq <= Math3D_XZDistanceSquared(this->actor.home.pos.x, this->actor.home.pos.z, - this->actor.world.pos.x, this->actor.world.pos.z)) { + if (waterChain->wallCheckDistSq <= Math3D_Dist2DSq(this->actor.home.pos.x, this->actor.home.pos.z, + this->actor.world.pos.x, this->actor.world.pos.z)) { Vec3f centerPos; Vec3f offsetPos; Vec3f result; // not used @@ -628,11 +628,11 @@ void ObjMine_Water_UpdateLinks(ObjMine* this) { tempBasisX = (prevBasisX == NULL) ? &sStandardBasis.x : prevBasisX; - Math3D_CrossProduct(tempBasisX, &newBasis.y, &tempVec); + Math3D_Vec3f_Cross(tempBasisX, &newBasis.y, &tempVec); // Skips change of basis if any of the basis vectors would be zero. if (ObjMine_GetUnitVec3f(&tempVec, &newBasis.z)) { - Math3D_CrossProduct(&newBasis.y, &newBasis.z, &tempVec); + Math3D_Vec3f_Cross(&newBasis.y, &newBasis.z, &tempVec); if (ObjMine_GetUnitVec3f(&tempVec, &newBasis.x)) { changeBasis = true; } @@ -807,7 +807,7 @@ void ObjMine_Path_Move(ObjMine* this, PlayState* play) { MtxF rotMtxF; // Makes mines appear to roll while traversing the path - Math3D_CrossProduct(&sStandardBasis.y, &thisx->velocity, &yhatCrossV); + Math3D_Vec3f_Cross(&sStandardBasis.y, &thisx->velocity, &yhatCrossV); if (ObjMine_GetUnitVec3f(&yhatCrossV, &rotAxis)) { Matrix_RotateAxisF(thisx->speed / PATH_RADIUS, &rotAxis, MTXMODE_NEW); Matrix_RotateYS(thisx->shape.rot.y, MTXMODE_APPLY); @@ -924,8 +924,8 @@ void ObjMine_Air_Chained(ObjMine* this, PlayState* play) { // Checks for wall collisions if sufficiently far from home. If collision detected, bounce off the wall at half // speed. If speed is close to zero when hitting wall, weakly eject it instead. if (airChain->wallCheckDistSq > -1e-6f) { - if (airChain->wallCheckDistSq <= Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, - this->actor.home.pos.x, this->actor.home.pos.z)) { + if (airChain->wallCheckDistSq <= Math3D_Dist2DSq(this->actor.world.pos.x, this->actor.world.pos.z, + this->actor.home.pos.x, this->actor.home.pos.z)) { Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, AIR_RADIUS, 0.0f, UPDBGCHECKINFO_FLAG_1); @@ -946,7 +946,7 @@ void ObjMine_Air_Chained(ObjMine* this, PlayState* play) { wallNormal.y = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.y); wallNormal.z = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.z); - func_80179F64(&xzDir, &wallNormal, &reflectedDir); + Math3D_Vec3fReflect(&xzDir, &wallNormal, &reflectedDir); xzSpeed /= 2.0f; airChain->velocity.x = reflectedDir.x * xzSpeed; diff --git a/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c b/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c index a20e20bf89..17dc801b5e 100644 --- a/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c +++ b/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c @@ -211,7 +211,7 @@ void ObjMure2_SetupWaitForPlayerInRange(ObjMure2* this) { } void ObjMure2_WaitForPlayerInRange(ObjMure2* this, PlayState* play) { - if (Math3D_XZLengthSquared(this->actor.projectedPos.x, this->actor.projectedPos.z) < + if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) < sActivationRangesSq[OBJ_MURE2_GET_CHILD_TYPE(&this->actor)] * this->rangeMultiplier) { this->actor.flags |= ACTOR_FLAG_10; ObjMure2_SpawnChildren(this, play); @@ -227,7 +227,7 @@ void ObjMure2_WaitForPlayerOutOfRange(ObjMure2* this, PlayState* play) { ObjMure2_ClearChildrenList(this); if ((sDeactivationRangesSq[OBJ_MURE2_GET_CHILD_TYPE(&this->actor)] * this->rangeMultiplier) <= - Math3D_XZLengthSquared(this->actor.projectedPos.x, this->actor.projectedPos.z)) { + Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z)) { this->actor.flags &= ~ACTOR_FLAG_10; ObjMure2_KillChildren(this, play); ObjMure2_SetupWaitForPlayerInRange(this); diff --git a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c index b0a7c57bf5..854206f90e 100644 --- a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c +++ b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c @@ -173,7 +173,7 @@ void func_8098F5D0(ObjMure3* this) { void func_8098F5E4(ObjMure3* this, PlayState* play) { static ObjMure3SpawnFunc sSpawnFuncs[] = { func_8098F040, func_8098F110, func_8098F220 }; - if (Math3D_XZLengthSquared(this->actor.projectedPos.x, this->actor.projectedPos.z) < SQ(1150.0f)) { + if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) < SQ(1150.0f)) { this->actor.flags |= ACTOR_FLAG_10; sSpawnFuncs[OBJMURE3_PARAM_RUPEEINDEX(&this->actor)](this, play); func_8098F66C(this); @@ -186,7 +186,7 @@ void func_8098F66C(ObjMure3* this) { void func_8098F680(ObjMure3* this, PlayState* play) { func_8098F438(this, play); - if (Math3D_XZLengthSquared(this->actor.projectedPos.x, this->actor.projectedPos.z) >= SQ(1450.0f)) { + if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) >= SQ(1450.0f)) { this->actor.flags &= ~ACTOR_FLAG_10; func_8098F364(this, play); func_8098F5D0(this); diff --git a/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c b/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c index d99c041e00..d9a7b831fd 100644 --- a/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c +++ b/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c @@ -234,7 +234,7 @@ s32 func_80A216D4(ObjSkateblock* this, PlayState* play, f32 arg2, Vec3f* arg3) { spE8 = Math_SinS(sp96); spE4 = Math_CosS(sp96); - temp_f2 = Math3D_Distance(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos) + + temp_f2 = Math3D_Vec3f_DistXYZ(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos) + (300.0f * this->dyna.actor.scale.z) + arg2; temp_f24 = temp_f2 * spE8; temp_f26 = temp_f2 * spE4; @@ -306,9 +306,9 @@ s32 func_80A21990(ObjSkateblock* this, PlayState* play, Vec3f* arg2) { sp100 = Math_SinS(phi_s6); temp_f26 = Math_CosS(phi_s6); - temp_f12 = - (300.0f * this->dyna.actor.scale.z + Math3D_Distance(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos)) + - 2.0f; + temp_f12 = (300.0f * this->dyna.actor.scale.z + + Math3D_Vec3f_DistXYZ(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos)) + + 2.0f; temp_f28 = -temp_f12 * sp100; temp_f30 = -temp_f12 * temp_f26; diff --git a/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c b/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c index 279c685f13..7bc89c3b56 100644 --- a/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c +++ b/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c @@ -691,7 +691,7 @@ void func_80B047C0(ObjSnowball* this, PlayState* play) { sp84 = this->unk_20C * 60.0f * 0.9f; if (sp88.y > 0.0f) { - if (Math3D_AngleBetweenVectors(&D_80B04FD8, &sp88, &sp7C)) { + if (Math3D_CosOut(&D_80B04FD8, &sp88, &sp7C)) { phi_f2 = 1.0f; } else { phi_f2 = 1.0f - SQ(sp7C); diff --git a/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c b/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c index 2ca3cde2c1..28b715f1c2 100644 --- a/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c +++ b/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c @@ -328,7 +328,7 @@ static InitChainEntry sInitChain[] = { }; s32 func_80B2FB10(Vec3f* arg0, Vec3f* arg1) { - f32 temp_f0 = Math3D_LengthSquared(arg0); + f32 temp_f0 = Math3D_Vec3fMagnitudeSq(arg0); f32 temp_f2; if (temp_f0 < 9.999999e-9f) { @@ -396,7 +396,7 @@ bool func_80B2FC98(TriNorm* triNorm, Vec3f* arg1) { sp78.y = vtx2->y - arg1->y; sp78.z = vtx2->z - arg1->z; - Math3D_CrossProduct(&sp84, &sp78, &sp4C[i]); + Math3D_Vec3f_Cross(&sp84, &sp78, &sp4C[i]); vtx2 = vtx; } @@ -416,7 +416,7 @@ bool func_80B2FC98(TriNorm* triNorm, Vec3f* arg1) { sp78.y = 0.0f; sp78.z = vtx2->z - arg1->z; - Math3D_CrossProduct(&sp84, &sp78, &sp4C[i]); + Math3D_Vec3f_Cross(&sp84, &sp78, &sp4C[i]); vtx2 = vtx; } @@ -436,7 +436,7 @@ bool func_80B2FC98(TriNorm* triNorm, Vec3f* arg1) { sp78.y = vtx2->y - arg1->y; sp78.z = 0.0f; - Math3D_CrossProduct(&sp84, &sp78, &sp4C[i]); + Math3D_Vec3f_Cross(&sp84, &sp78, &sp4C[i]); vtx2 = vtx; } @@ -467,9 +467,9 @@ void func_80B300F4(ObjSpidertent* thisx, PlayState* play, TriNorm* triNorm, Vec3 spAC.z = triNorm->plane.normal.z; if (triNorm->plane.normal.y < 0.5f) { - Math3D_CrossProduct(&spAC, &D_80B3140C, &sp88); + Math3D_Vec3f_Cross(&spAC, &D_80B3140C, &sp88); } else { - Math3D_CrossProduct(&spAC, &D_80B31400, &sp88); + Math3D_Vec3f_Cross(&spAC, &D_80B31400, &sp88); } if (func_80B2FB10(&sp88, &spA0)) { diff --git a/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c b/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c index 7bfcfad605..95c02a2504 100644 --- a/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c +++ b/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c @@ -254,7 +254,7 @@ s32 func_80A1DEB8(ObjSpinyroll* this) { Math_Vec3f_Diff(&this->unk_4AC[sp30], &this->dyna.actor.world.pos, &sp24); - return Math3D_LengthSquared(&sp24) < (SQ(this->dyna.actor.speed) + 0.05f); + return Math3D_Vec3fMagnitudeSq(&sp24) < (SQ(this->dyna.actor.speed) + 0.05f); } void func_80A1DFA0(ObjSpinyroll* this) { diff --git a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c index fe7fba3f2b..118cf48f40 100644 --- a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c +++ b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c @@ -652,7 +652,7 @@ s32 ObjSwitch_IsEyeSwitchHit(ObjSwitch* this) { Matrix_RotateZS(actor->shape.rot.z, MTXMODE_APPLY); Matrix_MultVecZ(1.0f, &sp20); Matrix_Pop(); - if ((Math3D_Parallel(&sp2C, &sp20) < COS_OF_5_PI_DIV_8)) { + if ((Math3D_Cos(&sp2C, &sp20) < COS_OF_5_PI_DIV_8)) { return true; } } diff --git a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c index e5a7bde0f0..b15eae0658 100644 --- a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c +++ b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c @@ -161,7 +161,7 @@ void ObjToge_Init(Actor* thisx, PlayState* play) { this->unk_1C8 = Math_CosS(sp36); this->unk_1CC = Math_SinS(sp36); this->unk_1C0 = sp3E * 7.5f; - this->unk_1C4 = Math3D_Distance(&this->unk_198[0], &this->unk_198[1]) * 0.5f; + this->unk_1C4 = Math3D_Vec3f_DistXYZ(&this->unk_198[0], &this->unk_198[1]) * 0.5f; } else { this->unk_1B4 = false; } diff --git a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c index 2f636bb53a..74e77eee35 100644 --- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c +++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c @@ -370,7 +370,7 @@ s32 func_80B783E0(ObjUm* this, PlayState* play, s32 banditIndex, EnHorse* bandit return 0; } - if (Math3D_Distance(&bandit->actor.world.pos, &this->dyna.actor.world.pos) < 800.0f) { + if (Math3D_Vec3f_DistXYZ(&bandit->actor.world.pos, &this->dyna.actor.world.pos) < 800.0f) { if (banditIndex == 0) { this->flags |= OBJ_UM_FLAG_0200; } else { @@ -397,7 +397,7 @@ s32 func_80B783E0(ObjUm* this, PlayState* play, s32 banditIndex, EnHorse* bandit temp_a1 = Math_Atan2S(phi_f12, phi_f14); - func_8017B7F8(&sp50, temp_a1, &sp4C, &sp48, &sp44); + Math3D_RotateXZPlane(&sp50, temp_a1, &sp4C, &sp48, &sp44); if (((bandit->actor.world.pos.x * sp4C) + (sp48 * bandit->actor.world.pos.z) + sp44) > 0.0f) { bandit->curRaceWaypoint++; if (bandit->curRaceWaypoint >= sp68) { @@ -480,14 +480,14 @@ s32 func_80B78764(ObjUm* this, PlayState* play, EnHorse* bandit1, EnHorse* bandi func_80B781DC(this, bandit1, bandit2, play); } - Math3D_Lerp(&bandit1->unk_540, &this->unk_360[bandit1->unk_550], 1.0f - ((f32)bandit1->unk_55C / bandit1->unk_560), - &sp30); + Math3D_LineSplitRatio(&bandit1->unk_540, &this->unk_360[bandit1->unk_550], + 1.0f - ((f32)bandit1->unk_55C / bandit1->unk_560), &sp30); bandit1->banditPosition = sp30; bandit1->unk_588 = this->dyna.actor.shape.rot.y; if ((bandit1->unk_550 == 10) || ((bandit1->unk_550 == 8))) { phi_v1_5 = bandit1->unk_588; - } else if (Math3D_Distance(&bandit1->actor.prevPos, &bandit1->actor.world.pos) < 10.0f) { + } else if (Math3D_Vec3f_DistXYZ(&bandit1->actor.prevPos, &bandit1->actor.world.pos) < 10.0f) { phi_v1_5 = bandit1->unk_588; } else { phi_v1_5 = Math_Vec3f_Yaw(&bandit1->actor.prevPos, &bandit1->actor.world.pos); @@ -1071,7 +1071,7 @@ ObjUmPathState ObjUm_UpdatePath(ObjUm* this, PlayState* play) { angle = Math_Atan2S(xDiff, zDiff); - func_8017B7F8(&sp50, angle, &sp4C, &sp48, &sp44); + Math3D_RotateXZPlane(&sp50, angle, &sp4C, &sp48, &sp44); if (((this->dyna.actor.world.pos.x * sp4C) + (sp48 * this->dyna.actor.world.pos.z) + sp44) > 0.0f) { this->pointIndex++; @@ -1832,7 +1832,7 @@ s32 ObjUm_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p sp3E = Math_Vec3f_Yaw(&this->dyna.actor.focus.pos, &sp30) - this->dyna.actor.shape.rot.y; temp_v0_3 = Math_Atan2S( this->dyna.actor.focus.pos.y - sp30.y, - Math3D_XZLength(sp30.x - this->dyna.actor.focus.pos.x, sp30.z - this->dyna.actor.focus.pos.z)); + Math3D_Dist1D(sp30.x - this->dyna.actor.focus.pos.x, sp30.z - this->dyna.actor.focus.pos.z)); this->unk_2FE.x = rot->x + sp3E; this->unk_2FE.y = rot->y; this->unk_2FE.z = rot->z + temp_v0_3; diff --git a/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c b/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c index d379070476..824ae24e2e 100644 --- a/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c +++ b/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c @@ -130,7 +130,7 @@ s32 func_80A3C700(ObjVspinyroll* this) { this->dyna.actor.world.pos.z += this->dyna.actor.speed * this->unk_3B4.z; Math_Vec3f_Diff(&this->unk_39C[sp30], &this->dyna.actor.world.pos, &sp24); - return Math3D_LengthSquared(&sp24) < (SQ(this->dyna.actor.speed) + 0.05f); + return Math3D_Vec3fMagnitudeSq(&sp24) < (SQ(this->dyna.actor.speed) + 0.05f); } void func_80A3C7E8(ObjVspinyroll* this) { diff --git a/src/overlays/actors/ovl_Obj_Wind/z_obj_wind.c b/src/overlays/actors/ovl_Obj_Wind/z_obj_wind.c index 75375d8173..4ffd66c766 100644 --- a/src/overlays/actors/ovl_Obj_Wind/z_obj_wind.c +++ b/src/overlays/actors/ovl_Obj_Wind/z_obj_wind.c @@ -79,10 +79,7 @@ void ObjWind_Update(Actor* thisx, PlayState* play) { ObjWind* this = (ObjWind*)thisx; ObjWindStruct* entry = &D_80B2448C[OBJ_WIND_GET_TYPE(thisx)]; Player* player; - f32 upZ; - f32 upY; - f32 upX; - Vec3f posCopy; + InfiniteLine line; Vec3f nearestPoint; Vec3f sp54; f32 upXZ; // reused temp @@ -107,12 +104,12 @@ void ObjWind_Update(Actor* thisx, PlayState* play) { if ((OBJ_WIND_GET_SWITCH_FLAG(thisx) == 0x7F) || !Flags_GetSwitch(play, OBJ_WIND_GET_SWITCH_FLAG(thisx))) { player = GET_PLAYER(play); - Math_Vec3f_Copy(&posCopy, &this->actor.world.pos); - upY = Math_CosS(this->actor.shape.rot.x); + Math_Vec3f_Copy(&line.point, &this->actor.world.pos); + line.dir.y = Math_CosS(this->actor.shape.rot.x); upXZ = Math_SinS(this->actor.shape.rot.x); - upX = Math_SinS(this->actor.shape.rot.y) * upXZ; - upZ = Math_CosS(this->actor.shape.rot.y) * upXZ; - distToNearestPoint = func_80179A44(&posCopy, &player->actor.world, &nearestPoint); + line.dir.x = Math_SinS(this->actor.shape.rot.y) * upXZ; + line.dir.z = Math_CosS(this->actor.shape.rot.y) * upXZ; + distToNearestPoint = Math3D_LineClosestToPoint(&line, &player->actor.world.pos, &nearestPoint); if ((distToNearestPoint >= 0.0f) && (distToNearestPoint < entry->unk_0)) { upXZ = Math_Vec3f_DistXYZAndStoreDiff(&player->actor.world.pos, &nearestPoint, &sp54); if (upXZ < entry->unk_2) { @@ -137,9 +134,9 @@ void ObjWind_Update(Actor* thisx, PlayState* play) { upXZ = 1.0f / upXZ; } temp_ft0 *= upXZ; - windSpeedX = (upX * windMagnitude) + (sp54.x * temp_ft0); - windSpeedY = (upY * windMagnitude) + (sp54.y * temp_ft0); - windSpeedZ = (upZ * windMagnitude) + (sp54.z * temp_ft0); + windSpeedX = (line.dir.x * windMagnitude) + (sp54.x * temp_ft0); + windSpeedY = (line.dir.y * windMagnitude) + (sp54.y * temp_ft0); + windSpeedZ = (line.dir.z * windMagnitude) + (sp54.z * temp_ft0); player->windSpeed = sqrtf(SQ(windSpeedX) + SQ(windSpeedY) + SQ(windSpeedZ)); player->windAngleY = Math_Atan2S_XY(windSpeedZ, windSpeedX); diff --git a/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c b/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c index 69b24c0291..8c7957a5c9 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c +++ b/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c @@ -107,7 +107,7 @@ u32 EffectSsSbn_Init(PlayState* play, u32 index, EffectSs* this, void* initParam bubbleVec.x = -mtx.mf[2][0] * 10.0f; bubbleVec.y = -mtx.mf[2][1] * 10.0f; bubbleVec.z = -mtx.mf[2][2] * 10.0f; - Math3D_AngleBetweenVectors(&colPolyVec, &bubbleVec, &angle); + Math3D_CosOut(&colPolyVec, &bubbleVec, &angle); opposite = (SQ(angle) >= 1.0f) ? 0.0f : sqrtf(1.0f - SQ(angle)); if (((mtx.mf[0][0] * colPolyVec.x) + (mtx.mf[0][1] * colPolyVec.y) + (mtx.mf[0][2] * colPolyVec.z)) < 0.0f) { diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 6e63662fad..ca850d8048 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -3257,97 +3257,97 @@ 0x801795C0:("Rand_CenteredFloat",), 0x801795F0:("Math3D_Normalize",), 0x80179678:("Math3D_PlaneVsLineSegClosestPoint",), - 0x80179798:("func_80179798",), - 0x80179A44:("func_80179A44",), - 0x80179B34:("func_80179B34",), - 0x80179B94:("func_80179B94",), - 0x80179D74:("func_80179D74",), - 0x80179DF0:("Math3D_ScaleAndAdd",), - 0x80179E3C:("Math3D_Lerp",), - 0x80179E88:("Math3D_Parallel",), - 0x80179EAC:("Math3D_AngleBetweenVectors",), - 0x80179F64:("func_80179F64",), - 0x8017A038:("Math3D_XZBoundCheck",), - 0x8017A09C:("func_8017A09C",), - 0x8017A1D0:("func_8017A1D0",), - 0x8017A304:("func_8017A304",), - 0x8017A438:("func_8017A438",), - 0x8017A5F8:("Math3D_XZLengthSquared",), - 0x8017A610:("Math3D_XZLength",), - 0x8017A634:("Math3D_XZDistanceSquared",), - 0x8017A678:("Math3D_XZDistance",), - 0x8017A6A8:("Math3D_LengthSquared",), + 0x80179798:("Math3D_LineSegMakePerpLineSeg",), + 0x80179A44:("Math3D_LineClosestToPoint",), + 0x80179B34:("Math3D_FindPointOnPlaneIntersect",), + 0x80179B94:("Math3D_PlaneVsPlaneNewLine",), + 0x80179D74:("Math3D_PlaneVsPlaneVsLineClosestPoint",), + 0x80179DF0:("Math3D_PointOnDirectedLine",), + 0x80179E3C:("Math3D_LineSplitRatio",), + 0x80179E88:("Math3D_Cos",), + 0x80179EAC:("Math3D_CosOut",), + 0x80179F64:("Math3D_Vec3fReflect",), + 0x8017A038:("Math3D_PointInSquare2D",), + 0x8017A09C:("Math3D_CirSquareVsTriSquareXY",), + 0x8017A1D0:("Math3D_CirSquareVsTriSquareYZ",), + 0x8017A304:("Math3D_CirSquareVsTriSquareZX",), + 0x8017A438:("Math3D_SphCubeVsTriCube",), + 0x8017A5F8:("Math3D_Dist1DSq",), + 0x8017A610:("Math3D_Dist1D",), + 0x8017A634:("Math3D_Dist2DSq",), + 0x8017A678:("Math3D_Dist2D",), + 0x8017A6A8:("Math3D_Vec3fMagnitudeSq",), 0x8017A6D4:("Math3D_Vec3fMagnitude",), 0x8017A6F8:("Math3D_Vec3fDistSq",), - 0x8017A720:("Math3D_Distance",), - 0x8017A740:("Math3D_DistanceS",), - 0x8017A7B8:("func_8017A7B8",), - 0x8017A7F8:("func_8017A7F8",), - 0x8017A838:("func_8017A838",), - 0x8017A878:("Math3D_CrossProduct",), + 0x8017A720:("Math3D_Vec3f_DistXYZ",), + 0x8017A740:("Math3D_DistXYZ16toF",), + 0x8017A7B8:("Math3D_Vec3fDiff_CrossZ",), + 0x8017A7F8:("Math3D_Vec3fDiff_CrossX",), + 0x8017A838:("Math3D_Vec3fDiff_CrossY",), + 0x8017A878:("Math3D_Vec3f_Cross",), 0x8017A8EC:("Math3D_SurfaceNorm",), 0x8017A954:("Math3D_PointRelativeToCubeFaces",), 0x8017AA0C:("Math3D_PointRelativeToCubeEdges",), 0x8017ABBC:("Math3D_PointRelativeToCubeVertices",), 0x8017AD38:("Math3D_LineVsCube",), - 0x8017B68C:("func_8017B68C",), - 0x8017B7F8:("func_8017B7F8",), - 0x8017B884:("Math3D_UnitNormalVector",), - 0x8017B998:("Math3D_SignedDistanceFromPlane",), - 0x8017B9D8:("func_8017B9D8",), + 0x8017B68C:("Math3D_LineVsCubeShort",), + 0x8017B7F8:("Math3D_RotateXZPlane",), + 0x8017B884:("Math3D_DefPlane",), + 0x8017B998:("Math3D_PlaneF",), + 0x8017B9D8:("Math3D_Plane",), 0x8017BA14:("Math3D_UDistPlaneToPos",), 0x8017BA4C:("Math3D_DistPlaneToPos",), - 0x8017BAD0:("Math3D_TriChkPointParaYDist",), - 0x8017BD98:("func_8017BD98",), - 0x8017BDE0:("func_8017BDE0",), + 0x8017BAD0:("Math3D_TriChkPointParaYImpl",), + 0x8017BD98:("Math3D_TriChkPointParaYDeterminate",), + 0x8017BDE0:("Math3D_TriChkPointParaYSlopedY",), 0x8017BE30:("Math3D_TriChkPointParaYIntersectDist",), 0x8017BEE0:("Math3D_TriChkPointParaYIntersectInsideTri",), - 0x8017BF8C:("func_8017BF8C",), + 0x8017BF8C:("Math3D_TriChkPointParaY",), 0x8017C008:("Math3D_TriChkLineSegParaYIntersect",), - 0x8017C17C:("func_8017C17C",), - 0x8017C1F0:("func_8017C1F0",), - 0x8017C494:("Math3D_TriChkPointParaYIntersectInsideTri2",), - 0x8017C540:("Math3D_TriChkPointParaXDist",), - 0x8017C808:("func_8017C808",), + 0x8017C17C:("Math3D_TriChkPointParaYDist",), + 0x8017C1F0:("Math3D_TriChkPointParaYImplNoCheckRange",), + 0x8017C494:("Math3D_TriChkPointParaYNoRangeCheckIntersectInsideTri",), + 0x8017C540:("Math3D_TriChkPointParaXImpl",), + 0x8017C808:("Math3D_TriChkPointParaXDeterminate",), 0x8017C850:("Math3D_TriChkPointParaXIntersect",), - 0x8017C904:("func_8017C904",), + 0x8017C904:("Math3D_TriChkPointParaX",), 0x8017C980:("Math3D_TriChkLineSegParaXIntersect",), - 0x8017CB08:("func_8017CB08",), - 0x8017CB7C:("Math3D_TriChkLineSegParaZDist",), - 0x8017CEA8:("func_8017CEA8",), + 0x8017CB08:("Math3D_TriChkLineSegParaXDist",), + 0x8017CB7C:("Math3D_TriChkPointParaZImpl",), + 0x8017CEA8:("Math3D_TriChkPointParaZDeterminate",), 0x8017CEF0:("Math3D_TriChkPointParaZIntersect",), - 0x8017CFA4:("func_8017CFA4",), + 0x8017CFA4:("Math3D_TriChkPointParaZ",), 0x8017D020:("Math3D_TriChkLineSegParaZIntersect",), - 0x8017D1AC:("func_8017D1AC",), - 0x8017D220:("func_8017D220",), + 0x8017D1AC:("Math3D_TriChkLineSegParaZDist",), + 0x8017D220:("Math3D_LineSegFindPlaneIntersect",), 0x8017D2FC:("Math3D_LineSegVsPlane",), - 0x8017D404:("func_8017D404",), - 0x8017D568:("Math3D_TriSetCoords",), - 0x8017D618:("Math3D_IsPointInSphere",), - 0x8017D668:("Math3D_PointDistToLine2D",), - 0x8017D7C0:("func_8017D7C0",), - 0x8017D814:("func_8017D814",), - 0x8017D91C:("func_8017D91C",), - 0x8017DA24:("func_8017DA24",), + 0x8017D404:("Math3D_TriLineIntersect",), + 0x8017D568:("Math3D_TriNorm",), + 0x8017D618:("Math3D_PointInSph",), + 0x8017D668:("Math3D_PointDistSqToLine2DImpl",), + 0x8017D7C0:("Math3D_PointDistSqToLine2D",), + 0x8017D814:("Math3D_PointDistSqToLineXY",), + 0x8017D91C:("Math3D_PointDistSqToLineYZ",), + 0x8017DA24:("Math3D_PointDistSqToLineZX",), 0x8017DB2C:("Math3D_LineVsSph",), - 0x8017DD34:("func_8017DD34",), - 0x8017DE74:("Math3D_ColSphereTri",), - 0x8017E294:("func_8017E294",), - 0x8017E350:("func_8017E350",), - 0x8017ED20:("Math3D_ColCylinderTri",), - 0x8017F1A0:("func_8017F1A0",), + 0x8017DD34:("Math3D_GetSphVsTriIntersectPoint",), + 0x8017DE74:("Math3D_TriVsSphIntersect",), + 0x8017E294:("Math3D_PointInCyl",), + 0x8017E350:("Math3D_CylVsLineSeg",), + 0x8017ED20:("Math3D_CylTriVsIntersect",), + 0x8017F1A0:("Math3D_CylVsTri",), 0x8017F1C0:("Math3D_SphVsSph",), - 0x8017F1E0:("Math3D_ColSphereSphereIntersect",), - 0x8017F200:("Math3D_ColSphereSphereIntersectAndDistance",), - 0x8017F2CC:("Math3D_ColSphereCylinderDistance",), - 0x8017F2EC:("Math3D_ColSphereCylinderDistanceAndAmount",), - 0x8017F45C:("Math3D_ColCylinderCylinderAmount",), - 0x8017F47C:("Math3D_ColCylinderCylinderAmountAndDistance",), - 0x8017F64C:("Math3d_ColTriTri",), + 0x8017F1E0:("Math3D_SphVsSphOverlap",), + 0x8017F200:("Math3D_SphVsSphOverlapCenterDist",), + 0x8017F2CC:("Math3D_SphVsCylOverlap",), + 0x8017F2EC:("Math3D_SphVsCylOverlapCenterDist",), + 0x8017F45C:("Math3D_CylVsCylOverlap",), + 0x8017F47C:("Math3D_CylVsCylOverlapCenterDist",), + 0x8017F64C:("Math3D_TriVsTriIntersect",), 0x8017F9C0:("Math3D_XZInSphere",), 0x8017FA34:("Math3D_XYInSphere",), 0x8017FAA8:("Math3D_YZInSphere",), - 0x8017FB1C:("func_8017FB1C",), + 0x8017FB1C:("Math3D_CircleLineIntersections",), 0x8017FD44:("func_8017FD44",), 0x8017FEB0:("Math_GetAtan2Tbl",), 0x8017FEE4:("Math_Atan2S",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 576f0cd53e..2fc14db916 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -3556,7 +3556,7 @@ 0x801E0138:("D_801E0138","f32","",0x4), 0x801E013C:("D_801E013C","f32","",0x4), 0x801E0140:("D_801E0140","f32","",0x4), - 0x801E0144:("Math3D_AngleBetweenVectors_min_length","f32","",0x4), + 0x801E0144:("Math3D_CosOut_min_length","f32","",0x4), 0x801E0148:("D_801E0148","f32","",0x4), 0x801E014C:("D_801E014C","f32","",0x4), 0x801E0150:("Math3D_UnitNormalVector_min_length","f32","",0x4), @@ -4053,78 +4053,36 @@ 0x801FBBD2:("gCfbUpperAdjust","UNK_TYPE1","",0x1), 0x801FBBD4:("gSysCfbHiResEnabled","UNK_TYPE1","",0x1), 0x801FBBE0:("sDmaBuffer","u32","[2]",0x8), - 0x801FBBF0:("D_801FBBF0","Vec3f","",0xc), - 0x801FBC00:("Math3D_ColSphereTri_line","LineSegment","",0x18), - 0x801FBC18:("Math3D_ColSphereTri_point","Vec3f","",0xc), - 0x801FBC28:("D_801FBC28","UNK_TYPE1","",0x1), - 0x801FBC2C:("D_801FBC2C","UNK_TYPE1","",0x1), - 0x801FBC30:("D_801FBC30","UNK_TYPE1","",0x1), - 0x801FBC38:("D_801FBC38","UNK_TYPE1","",0x1), - 0x801FBC3A:("D_801FBC3A","UNK_TYPE1","",0x1), - 0x801FBC3C:("D_801FBC3C","UNK_TYPE1","",0x1), - 0x801FBC3E:("D_801FBC3E","UNK_TYPE1","",0x1), - 0x801FBC40:("D_801FBC40","UNK_TYPE1","",0x1), - 0x801FBC42:("D_801FBC42","UNK_TYPE1","",0x1), - 0x801FBC44:("D_801FBC44","UNK_TYPE1","",0x1), - 0x801FBC46:("D_801FBC46","UNK_TYPE1","",0x1), - 0x801FBC48:("D_801FBC48","UNK_TYPE1","",0x1), - 0x801FBC58:("D_801FBC58","UNK_TYPE1","",0x1), - 0x801FBC68:("Math3D_SurfaceNorm_temp1","Vec3f","",0xc), - 0x801FBC78:("Math3D_SurfaceNorm_temp2","Vec3f","",0xc), - 0x801FBC8C:("D_801FBC8C","f32","",0x4), - 0x801FBC90:("D_801FBC90","f32","",0x4), - 0x801FBC98:("D_801FBC98","f32","",0x4), - 0x801FBCA4:("D_801FBCA4","f32","",0x4), - 0x801FBCAC:("D_801FBCAC","f32","",0x4), - 0x801FBCB0:("D_801FBCB0","f32","",0x4), - 0x801FBCB4:("D_801FBCB4","f32","",0x4), - 0x801FBCB8:("D_801FBCB8","f32","",0x4), - 0x801FBCBC:("D_801FBCBC","f32","",0x4), - 0x801FBCC0:("D_801FBCC0","f32","",0x4), - 0x801FBCC4:("D_801FBCC4","f32","",0x4), - 0x801FBCC8:("D_801FBCC8","f32","",0x4), - 0x801FBCCC:("D_801FBCCC","f32","",0x4), - 0x801FBCD0:("D_801FBCD0","f32","",0x4), - 0x801FBCD4:("D_801FBCD4","f32","",0x4), - 0x801FBCD8:("D_801FBCD8","f32","",0x4), - 0x801FBCDC:("D_801FBCDC","f32","",0x4), - 0x801FBCE0:("D_801FBCE0","UNK_TYPE1","",0x1), - 0x801FBCE4:("D_801FBCE4","UNK_TYPE1","",0x1), - 0x801FBCE8:("D_801FBCE8","UNK_TYPE1","",0x1), - 0x801FBCF0:("D_801FBCF0","UNK_TYPE1","",0x1), - 0x801FBCF4:("D_801FBCF4","UNK_TYPE1","",0x1), - 0x801FBCF8:("D_801FBCF8","UNK_TYPE1","",0x1), - 0x801FBD00:("D_801FBD00","UNK_TYPE1","",0x1), - 0x801FBD04:("D_801FBD04","UNK_TYPE1","",0x1), - 0x801FBD08:("D_801FBD08","UNK_TYPE1","",0x1), - 0x801FBD10:("D_801FBD10","UNK_TYPE1","",0x1), - 0x801FBD20:("D_801FBD20","UNK_TYPE1","",0x1), - 0x801FBD24:("D_801FBD24","UNK_TYPE1","",0x1), - 0x801FBD28:("D_801FBD28","UNK_TYPE1","",0x1), - 0x801FBD30:("D_801FBD30","UNK_TYPE1","",0x1), - 0x801FBD34:("D_801FBD34","UNK_TYPE1","",0x1), - 0x801FBD38:("D_801FBD38","UNK_TYPE1","",0x1), - 0x801FBD40:("D_801FBD40","UNK_TYPE1","",0x1), - 0x801FBD44:("D_801FBD44","UNK_TYPE1","",0x1), - 0x801FBD48:("D_801FBD48","UNK_TYPE1","",0x1), - 0x801FBD50:("D_801FBD50","UNK_TYPE1","",0x1), - 0x801FBD54:("D_801FBD54","UNK_TYPE1","",0x1), - 0x801FBD58:("D_801FBD58","UNK_TYPE1","",0x1), - 0x801FBD60:("Math3D_UnitNormalVector_temp","Vec3f","",0xc), - 0x801FBD70:("D_801FBD70","UNK_TYPE1","",0x1), - 0x801FBD74:("D_801FBD74","UNK_TYPE1","",0x1), - 0x801FBD78:("D_801FBD78","UNK_TYPE1","",0x1), - 0x801FBD80:("D_801FBD80","Vec3f","[2]",0x18), - 0x801FBD98:("D_801FBD98","Vec3f","",0xc), - 0x801FBDA4:("D_801FBDA4","Vec3f","",0xc), - 0x801FBDB0:("D_801FBDB0","UNK_TYPE1","",0x1), - 0x801FBDB4:("D_801FBDB4","UNK_TYPE1","",0x1), - 0x801FBDB8:("D_801FBDB8","UNK_TYPE1","",0x1), - 0x801FBDC0:("D_801FBDC0","UNK_TYPE1","",0x1), - 0x801FBDD8:("D_801FBDD8","UNK_TYPE1","",0x1), - 0x801FBDDC:("D_801FBDDC","UNK_TYPE1","",0x1), - 0x801FBDE0:("D_801FBDE0","UNK_TYPE1","",0x1), - 0x801FBDE8:("D_801FBDE8","Vec3f","",0xc), + 0x801FBBF0:("sSphereCenter","Vec3f","",0xc), + 0x801FBC00:("sTriTestLine","Linef","",0x18), + 0x801FBC18:("sSphereCenter","Vec3f","",0xc), + 0x801FBC28:("sSphPlanePos","Vec3f","",0xC), + 0x801FBC38:("sTopSphere","Sphere16","",0x8), + 0x801FBC40:("sBottomSphere","Sphere16","",0x8), + 0x801FBC48:("sCylIntersectA","Vec3f","",0xC), + 0x801FBC58:("sCylIntersectB","Vec3f","",0xC), + 0x801FBC68:("sABDiff","Vec3f","",0xc), + 0x801FBC78:("sACDiff","Vec3f","",0xc), + 0x801FBC88:("sCylf","Cylinderf","",0x18), + 0x801FBCA0:("sSphf","Spheref","",0x10), + 0x801FBCB0:("sCaf","Cylinderf","",0x18), + 0x801FBCC8:("sCbf","Cylinderf","",0x18), + 0x801FBCE0:("sTriVtx0","Vec3f","",0xC), + 0x801FBCF0:("sTriVtx1","Vec3f","",0xC), + 0x801FBD00:("sTriVtx2","Vec3f","",0xC), + 0x801FBD10:("sIntersectPoint","Vec3f","",0xC), + 0x801FBD20:("sMinF","Vec3f","",0xC), + 0x801FBD30:("sMaxF","Vec3f","",0xC), + 0x801FBD40:("sAF","Vec3f","",0xC), + 0x801FBD50:("sBF","Vec3f","",0xC), + 0x801FBD60:("sNormal","Vec3f","",0xC), + 0x801FBD70:("sPlanePos","Vec3f","",0xC), + 0x801FBD80:("sPlaneIntersectLine","InfiniteLine","",0x18), + 0x801FBD98:("sPlaneIntersectSeg","Linef","",0x18), + 0x801FBDB0:("sPlanePos","Vec3f","",0xC), + 0x801FBDC0:("sPlaneIntersect","InfiniteLine","",0x18), + 0x801FBDD8:("sSphLinePerpendicularPoint","Vec3f","",0xC), + 0x801FBDE8:("sV0V1Center","Vec3f","",0xC), 0x801FBE00:("sMatrixStack","MtxF*","",0x4), 0x801FBE04:("sCurrentMatrix","MtxF*","",0x4), 0x801FBE10:("sFlashromMesgQueue","UNK_TYPE1","",0x1), diff --git a/tools/namefixer.py b/tools/namefixer.py index 457645db79..750cef6eef 100755 --- a/tools/namefixer.py +++ b/tools/namefixer.py @@ -575,6 +575,8 @@ "func_800CA1E8": "WaterBox_GetSurface1_2", "func_800CA22C": "WaterBox_GetSurface2", "func_800CA6D8": "WaterBox_GetLightSettingIndex", + + "func_8017D668": "Math3D_PointDistSqToLine2DImpl", "func_80179678": "Math3D_PlaneVsLineSegClosestPoint", "Math3D_DistanceSquared": "Math3D_Vec3fDistSq", "Math3D_NormalVector": "Math3D_SurfaceNorm", @@ -584,22 +586,80 @@ "func_8017AD38": "Math3D_LineVsCube", "Math3D_NormalizedDistanceFromPlane": "Math3D_UDistPlaneToPos", "Math3D_NormalizedSignedDistanceFromPlane": "Math3D_DistPlaneToPos", - "func_8017BAD0": "Math3D_TriChkPointParaYDist", + "func_8017BAD0": "Math3D_TriChkPointParaYImpl", + # "Math3D_TriChkPointParaYDist": "Math3D_TriChkPointParaYImpl", "func_8017BE30": "Math3D_TriChkPointParaYIntersectDist", "func_8017BEE0": "Math3D_TriChkPointParaYIntersectInsideTri", "func_8017C008": "Math3D_TriChkLineSegParaYIntersect", - "func_8017C494": "Math3D_TriChkPointParaYIntersectInsideTri2", - "func_8017C540": "Math3D_TriChkPointParaXDist", + "func_8017C494": "Math3D_TriChkPointParaYNoRangeCheckIntersectInsideTri", + "func_8017C540": "Math3D_TriChkPointParaXImpl", "func_8017C850": "Math3D_TriChkPointParaXIntersect", "func_8017C980": "Math3D_TriChkLineSegParaXIntersect", - "func_8017CB7C": "Math3D_TriChkLineSegParaZDist", + "func_8017CB7C": "Math3D_TriChkPointParaZImpl", "func_8017CEF0": "Math3D_TriChkPointParaZIntersect", "func_8017D020": "Math3D_TriChkLineSegParaZIntersect", "Math3D_ColSphereLineSeg": "Math3D_LineVsSph", "Math3D_ColSphereSphere": "Math3D_SphVsSph", + "Math3D_CrossProduct": "Math3D_Vec3f_Cross", + "Math3D_Parallel": "Math3D_Cos", + "Math3D_AngleBetweenVectors": "Math3D_CosOut", + "func_80179A44": "Math3D_LineClosestToPoint", + "func_8017A438": "Math3D_SphCubeVsTriCube", + "Math3D_XZLengthSquared": "Math3D_Dist1DSq", + "Math3D_XZLength": "Math3D_Dist1D", + "Math3D_XZDistanceSquared": "Math3D_Dist2DSq", + "Math3D_XZDistance": "Math3D_Dist2D", + "Math3D_LengthSquared": "Math3D_Vec3fMagnitudeSq", + "Math3D_Distance": "Math3D_Vec3f_DistXYZ", + "Math3D_DistanceS": "Math3D_DistXYZ16toF", + "func_80179798": "Math3D_LineSegMakePerpLineSeg", + "Math3D_LineVsLineClosestTwoPoints": "Math3D_LineSegMakePerpLineSeg", + "func_80179B34": "Math3D_FindPointOnPlaneIntersect", + "func_80179B94": "Math3D_PlaneVsPlaneNewLine", + "func_8017B9D8": "Math3D_Plane", + "func_8017D404": "Math3D_TriLineIntersect", + "Math3D_ColCylinderCylinderAmountAndDistance": "Math3D_CylVsCylOverlapCenterDist", + "Math3D_ColCylinderCylinderAmount": "Math3D_CylVsCylOverlap", + "Math3D_ColSphereCylinderDistanceAndAmount": "Math3D_SphVsCylOverlapCenterDist", + "Math3D_ColCylinderTri": "Math3D_CylTriVsIntersect", + "func_8017F1A0": "Math3D_CylVsTri", + "Math3D_ColSphereSphereIntersect": "Math3D_SphVsSphOverlap", + "Math3D_ColSphereSphereIntersectAndDistance": "Math3D_SphVsSphOverlapCenterDist", + "Math3D_ColSphereCylinderDistance": "Math3D_SphVsCylOverlap", + "func_8017E350": "Math3D_CylVsLineSeg", + "Math3D_ColSphereTri": "Math3D_TriVsSphIntersect", + "Math3D_ScaleAndAdd": "Math3D_PointOnDirectedLine", + "Math3D_Lerp": "Math3D_LineSplitRatio", + "func_80179D74": "Math3D_PlaneVsPlaneVsLineClosestPoint", + "func_8017E294": "Math3D_PointInCyl", + "func_80179F64": "Math3D_Vec3fReflect", + "Math3D_XZBoundCheck": "Math3D_PointInSquare2D", + "func_8017B7F8": "Math3D_RotateXZPlane", + "Math3D_UnitNormalVector": "Math3D_DefPlane", + "Math3D_SignedDistanceFromPlane": "Math3D_PlaneF", + "func_8017BD98": "Math3D_TriChkPointParaYDeterminate", + "func_8017BDE0": "Math3D_TriChkPointParaYSlopedY", + "func_8017BF8C": "Math3D_TriChkPointParaY", + # "func_8017C17C": "Math3D_TriChkPointParaYDist", + "func_8017C1F0": "Math3D_TriChkPointParaYImplNoCheckRange", + "Math3D_TriChkPointParaYIntersectInsideTri2": "Math3D_TriChkPointParaYNoRangeCheckIntersectInsideTri", + "Math3D_TriChkPointParaXDist": "Math3D_TriChkPointParaXImpl", + "func_8017C808": "Math3D_TriChkPointParaXDeterminate", + "func_8017C904": "Math3D_TriChkPointParaX", + "func_8017CB08": "Math3D_TriChkLineSegParaXDist", + # "Math3D_TriChkLineSegParaZDist": "Math3D_TriChkPointParaZImpl", + "func_8017CEA8": "Math3D_TriChkPointParaZDeterminate", + "func_8017CFA4": "Math3D_TriChkPointParaZ", + # "func_8017D1AC": "Math3D_TriChkLineSegParaZDist", + "func_8017D220": "Math3D_LineSegFindPlaneIntersect", + "Math3D_TriSetCoords": "Math3D_TriNorm", + "Math3D_IsPointInSphere": "Math3D_PointInSph", + "Math3d_ColTriTri": "Math3D_TriVsTriIntersect", + "func_8017DD34": "Math3D_GetSphVsTriIntersectPoint", "func_8017F9C0": "Math3D_XZInSphere", "func_8017FA34": "Math3D_XYInSphere", "func_8017FAA8": "Math3D_YZInSphere", + "func_800DFB14": "Camera_ChangeActorCsCamIndex", "func_800DFC68": "Camera_GetInputDirYaw", "func_800DFCB4": "Camera_GetCamDirPitch", diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index c6cd916cd1..1515fb69d6 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -2771,97 +2771,97 @@ asm/non_matchings/code/sys_math/Rand_ZeroFloat.s,Rand_ZeroFloat,0x80179594,0xB asm/non_matchings/code/sys_math/Rand_CenteredFloat.s,Rand_CenteredFloat,0x801795C0,0xC asm/non_matchings/code/sys_math3d/Math3D_Normalize.s,Math3D_Normalize,0x801795F0,0x22 asm/non_matchings/code/sys_math3d/Math3D_PlaneVsLineSegClosestPoint.s,Math3D_PlaneVsLineSegClosestPoint,0x80179678,0x48 -asm/non_matchings/code/sys_math3d/func_80179798.s,func_80179798,0x80179798,0xAB -asm/non_matchings/code/sys_math3d/func_80179A44.s,func_80179A44,0x80179A44,0x3C -asm/non_matchings/code/sys_math3d/func_80179B34.s,func_80179B34,0x80179B34,0x18 -asm/non_matchings/code/sys_math3d/func_80179B94.s,func_80179B94,0x80179B94,0x78 -asm/non_matchings/code/sys_math3d/func_80179D74.s,func_80179D74,0x80179D74,0x1F -asm/non_matchings/code/sys_math3d/Math3D_ScaleAndAdd.s,Math3D_ScaleAndAdd,0x80179DF0,0x13 -asm/non_matchings/code/sys_math3d/Math3D_Lerp.s,Math3D_Lerp,0x80179E3C,0x13 -asm/non_matchings/code/sys_math3d/Math3D_Parallel.s,Math3D_Parallel,0x80179E88,0x9 -asm/non_matchings/code/sys_math3d/Math3D_AngleBetweenVectors.s,Math3D_AngleBetweenVectors,0x80179EAC,0x2E -asm/non_matchings/code/sys_math3d/func_80179F64.s,func_80179F64,0x80179F64,0x35 -asm/non_matchings/code/sys_math3d/Math3D_XZBoundCheck.s,Math3D_XZBoundCheck,0x8017A038,0x19 -asm/non_matchings/code/sys_math3d/func_8017A09C.s,func_8017A09C,0x8017A09C,0x4D -asm/non_matchings/code/sys_math3d/func_8017A1D0.s,func_8017A1D0,0x8017A1D0,0x4D -asm/non_matchings/code/sys_math3d/func_8017A304.s,func_8017A304,0x8017A304,0x4D -asm/non_matchings/code/sys_math3d/func_8017A438.s,func_8017A438,0x8017A438,0x70 -asm/non_matchings/code/sys_math3d/Math3D_XZLengthSquared.s,Math3D_XZLengthSquared,0x8017A5F8,0x6 -asm/non_matchings/code/sys_math3d/Math3D_XZLength.s,Math3D_XZLength,0x8017A610,0x9 -asm/non_matchings/code/sys_math3d/Math3D_XZDistanceSquared.s,Math3D_XZDistanceSquared,0x8017A634,0x11 -asm/non_matchings/code/sys_math3d/Math3D_XZDistance.s,Math3D_XZDistance,0x8017A678,0xC -asm/non_matchings/code/sys_math3d/Math3D_LengthSquared.s,Math3D_LengthSquared,0x8017A6A8,0xB +asm/non_matchings/code/sys_math3d/Math3D_LineSegMakePerpLineSeg.s,Math3D_LineSegMakePerpLineSeg,0x80179798,0xAB +asm/non_matchings/code/sys_math3d/Math3D_LineClosestToPoint.s,Math3D_LineClosestToPoint,0x80179A44,0x3C +asm/non_matchings/code/sys_math3d/Math3D_FindPointOnPlaneIntersect.s,Math3D_FindPointOnPlaneIntersect,0x80179B34,0x18 +asm/non_matchings/code/sys_math3d/Math3D_PlaneVsPlaneNewLine.s,Math3D_PlaneVsPlaneNewLine,0x80179B94,0x78 +asm/non_matchings/code/sys_math3d/Math3D_PlaneVsPlaneVsLineClosestPoint.s,Math3D_PlaneVsPlaneVsLineClosestPoint,0x80179D74,0x1F +asm/non_matchings/code/sys_math3d/Math3D_PointOnDirectedLine.s,Math3D_PointOnDirectedLine,0x80179DF0,0x13 +asm/non_matchings/code/sys_math3d/Math3D_LineSplitRatio.s,Math3D_LineSplitRatio,0x80179E3C,0x13 +asm/non_matchings/code/sys_math3d/Math3D_Cos.s,Math3D_Cos,0x80179E88,0x9 +asm/non_matchings/code/sys_math3d/Math3D_CosOut.s,Math3D_CosOut,0x80179EAC,0x2E +asm/non_matchings/code/sys_math3d/Math3D_Vec3fReflect.s,Math3D_Vec3fReflect,0x80179F64,0x35 +asm/non_matchings/code/sys_math3d/Math3D_PointInSquare2D.s,Math3D_PointInSquare2D,0x8017A038,0x19 +asm/non_matchings/code/sys_math3d/Math3D_CirSquareVsTriSquareXY.s,Math3D_CirSquareVsTriSquareXY,0x8017A09C,0x4D +asm/non_matchings/code/sys_math3d/Math3D_CirSquareVsTriSquareYZ.s,Math3D_CirSquareVsTriSquareYZ,0x8017A1D0,0x4D +asm/non_matchings/code/sys_math3d/Math3D_CirSquareVsTriSquareZX.s,Math3D_CirSquareVsTriSquareZX,0x8017A304,0x4D +asm/non_matchings/code/sys_math3d/Math3D_SphCubeVsTriCube.s,Math3D_SphCubeVsTriCube,0x8017A438,0x70 +asm/non_matchings/code/sys_math3d/Math3D_Dist1DSq.s,Math3D_Dist1DSq,0x8017A5F8,0x6 +asm/non_matchings/code/sys_math3d/Math3D_Dist1D.s,Math3D_Dist1D,0x8017A610,0x9 +asm/non_matchings/code/sys_math3d/Math3D_Dist2DSq.s,Math3D_Dist2DSq,0x8017A634,0x11 +asm/non_matchings/code/sys_math3d/Math3D_Dist2D.s,Math3D_Dist2D,0x8017A678,0xC +asm/non_matchings/code/sys_math3d/Math3D_Vec3fMagnitudeSq.s,Math3D_Vec3fMagnitudeSq,0x8017A6A8,0xB asm/non_matchings/code/sys_math3d/Math3D_Vec3fMagnitude.s,Math3D_Vec3fMagnitude,0x8017A6D4,0x9 asm/non_matchings/code/sys_math3d/Math3D_Vec3fDistSq.s,Math3D_Vec3fDistSq,0x8017A6F8,0xA -asm/non_matchings/code/sys_math3d/Math3D_Distance.s,Math3D_Distance,0x8017A720,0x8 -asm/non_matchings/code/sys_math3d/Math3D_DistanceS.s,Math3D_DistanceS,0x8017A740,0x1E -asm/non_matchings/code/sys_math3d/func_8017A7B8.s,func_8017A7B8,0x8017A7B8,0x10 -asm/non_matchings/code/sys_math3d/func_8017A7F8.s,func_8017A7F8,0x8017A7F8,0x10 -asm/non_matchings/code/sys_math3d/func_8017A838.s,func_8017A838,0x8017A838,0x10 -asm/non_matchings/code/sys_math3d/Math3D_CrossProduct.s,Math3D_CrossProduct,0x8017A878,0x1D +asm/non_matchings/code/sys_math3d/Math3D_Vec3f_DistXYZ.s,Math3D_Vec3f_DistXYZ,0x8017A720,0x8 +asm/non_matchings/code/sys_math3d/Math3D_DistXYZ16toF.s,Math3D_DistXYZ16toF,0x8017A740,0x1E +asm/non_matchings/code/sys_math3d/Math3D_Vec3fDiff_CrossZ.s,Math3D_Vec3fDiff_CrossZ,0x8017A7B8,0x10 +asm/non_matchings/code/sys_math3d/Math3D_Vec3fDiff_CrossX.s,Math3D_Vec3fDiff_CrossX,0x8017A7F8,0x10 +asm/non_matchings/code/sys_math3d/Math3D_Vec3fDiff_CrossY.s,Math3D_Vec3fDiff_CrossY,0x8017A838,0x10 +asm/non_matchings/code/sys_math3d/Math3D_Vec3f_Cross.s,Math3D_Vec3f_Cross,0x8017A878,0x1D asm/non_matchings/code/sys_math3d/Math3D_SurfaceNorm.s,Math3D_SurfaceNorm,0x8017A8EC,0x1A asm/non_matchings/code/sys_math3d/Math3D_PointRelativeToCubeFaces.s,Math3D_PointRelativeToCubeFaces,0x8017A954,0x2E asm/non_matchings/code/sys_math3d/Math3D_PointRelativeToCubeEdges.s,Math3D_PointRelativeToCubeEdges,0x8017AA0C,0x6C asm/non_matchings/code/sys_math3d/Math3D_PointRelativeToCubeVertices.s,Math3D_PointRelativeToCubeVertices,0x8017ABBC,0x5F asm/non_matchings/code/sys_math3d/Math3D_LineVsCube.s,Math3D_LineVsCube,0x8017AD38,0x255 -asm/non_matchings/code/sys_math3d/func_8017B68C.s,func_8017B68C,0x8017B68C,0x5B -asm/non_matchings/code/sys_math3d/func_8017B7F8.s,func_8017B7F8,0x8017B7F8,0x23 -asm/non_matchings/code/sys_math3d/Math3D_UnitNormalVector.s,Math3D_UnitNormalVector,0x8017B884,0x45 -asm/non_matchings/code/sys_math3d/Math3D_SignedDistanceFromPlane.s,Math3D_SignedDistanceFromPlane,0x8017B998,0x10 -asm/non_matchings/code/sys_math3d/func_8017B9D8.s,func_8017B9D8,0x8017B9D8,0xF +asm/non_matchings/code/sys_math3d/Math3D_LineVsCubeShort.s,Math3D_LineVsCubeShort,0x8017B68C,0x5B +asm/non_matchings/code/sys_math3d/Math3D_RotateXZPlane.s,Math3D_RotateXZPlane,0x8017B7F8,0x23 +asm/non_matchings/code/sys_math3d/Math3D_DefPlane.s,Math3D_DefPlane,0x8017B884,0x45 +asm/non_matchings/code/sys_math3d/Math3D_PlaneF.s,Math3D_PlaneF,0x8017B998,0x10 +asm/non_matchings/code/sys_math3d/Math3D_Plane.s,Math3D_Plane,0x8017B9D8,0xF asm/non_matchings/code/sys_math3d/Math3D_UDistPlaneToPos.s,Math3D_UDistPlaneToPos,0x8017BA14,0xE asm/non_matchings/code/sys_math3d/Math3D_DistPlaneToPos.s,Math3D_DistPlaneToPos,0x8017BA4C,0x21 -asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYDist.s,Math3D_TriChkPointParaYDist,0x8017BAD0,0xB2 -asm/non_matchings/code/sys_math3d/func_8017BD98.s,func_8017BD98,0x8017BD98,0x12 -asm/non_matchings/code/sys_math3d/func_8017BDE0.s,func_8017BDE0,0x8017BDE0,0x14 +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYImpl.s,Math3D_TriChkPointParaYImpl,0x8017BAD0,0xB2 +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYDeterminate.s,Math3D_TriChkPointParaYDeterminate,0x8017BD98,0x12 +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYSlopedY.s,Math3D_TriChkPointParaYSlopedY,0x8017BDE0,0x14 asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYIntersectDist.s,Math3D_TriChkPointParaYIntersectDist,0x8017BE30,0x2C asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYIntersectInsideTri.s,Math3D_TriChkPointParaYIntersectInsideTri,0x8017BEE0,0x2B -asm/non_matchings/code/sys_math3d/func_8017BF8C.s,func_8017BF8C,0x8017BF8C,0x1F +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaY.s,Math3D_TriChkPointParaY,0x8017BF8C,0x1F asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaYIntersect.s,Math3D_TriChkLineSegParaYIntersect,0x8017C008,0x5D -asm/non_matchings/code/sys_math3d/func_8017C17C.s,func_8017C17C,0x8017C17C,0x1D -asm/non_matchings/code/sys_math3d/func_8017C1F0.s,func_8017C1F0,0x8017C1F0,0xA9 -asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYIntersectInsideTri2.s,Math3D_TriChkPointParaYIntersectInsideTri2,0x8017C494,0x2B -asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaXDist.s,Math3D_TriChkPointParaXDist,0x8017C540,0xB2 -asm/non_matchings/code/sys_math3d/func_8017C808.s,func_8017C808,0x8017C808,0x12 +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYDist.s,Math3D_TriChkPointParaYDist,0x8017C17C,0x1D +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYImplNoCheckRange.s,Math3D_TriChkPointParaYImplNoCheckRange,0x8017C1F0,0xA9 +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaYNoRangeCheckIntersectInsideTri.s,Math3D_TriChkPointParaYNoRangeCheckIntersectInsideTri,0x8017C494,0x2B +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaXImpl.s,Math3D_TriChkPointParaXImpl,0x8017C540,0xB2 +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaXDeterminate.s,Math3D_TriChkPointParaXDeterminate,0x8017C808,0x12 asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaXIntersect.s,Math3D_TriChkPointParaXIntersect,0x8017C850,0x2D -asm/non_matchings/code/sys_math3d/func_8017C904.s,func_8017C904,0x8017C904,0x1F +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaX.s,Math3D_TriChkPointParaX,0x8017C904,0x1F asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaXIntersect.s,Math3D_TriChkLineSegParaXIntersect,0x8017C980,0x62 -asm/non_matchings/code/sys_math3d/func_8017CB08.s,func_8017CB08,0x8017CB08,0x1D -asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaZDist.s,Math3D_TriChkLineSegParaZDist,0x8017CB7C,0xCB -asm/non_matchings/code/sys_math3d/func_8017CEA8.s,func_8017CEA8,0x8017CEA8,0x12 +asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaXDist.s,Math3D_TriChkLineSegParaXDist,0x8017CB08,0x1D +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaZImpl.s,Math3D_TriChkPointParaZImpl,0x8017CB7C,0xCB +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaZDeterminate.s,Math3D_TriChkPointParaZDeterminate,0x8017CEA8,0x12 asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaZIntersect.s,Math3D_TriChkPointParaZIntersect,0x8017CEF0,0x2D -asm/non_matchings/code/sys_math3d/func_8017CFA4.s,func_8017CFA4,0x8017CFA4,0x1F +asm/non_matchings/code/sys_math3d/Math3D_TriChkPointParaZ.s,Math3D_TriChkPointParaZ,0x8017CFA4,0x1F asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaZIntersect.s,Math3D_TriChkLineSegParaZIntersect,0x8017D020,0x63 -asm/non_matchings/code/sys_math3d/func_8017D1AC.s,func_8017D1AC,0x8017D1AC,0x1D -asm/non_matchings/code/sys_math3d/func_8017D220.s,func_8017D220,0x8017D220,0x37 +asm/non_matchings/code/sys_math3d/Math3D_TriChkLineSegParaZDist.s,Math3D_TriChkLineSegParaZDist,0x8017D1AC,0x1D +asm/non_matchings/code/sys_math3d/Math3D_LineSegFindPlaneIntersect.s,Math3D_LineSegFindPlaneIntersect,0x8017D220,0x37 asm/non_matchings/code/sys_math3d/Math3D_LineSegVsPlane.s,Math3D_LineSegVsPlane,0x8017D2FC,0x42 -asm/non_matchings/code/sys_math3d/func_8017D404.s,func_8017D404,0x8017D404,0x59 -asm/non_matchings/code/sys_math3d/Math3D_TriSetCoords.s,Math3D_TriSetCoords,0x8017D568,0x2C -asm/non_matchings/code/sys_math3d/Math3D_IsPointInSphere.s,Math3D_IsPointInSphere,0x8017D618,0x14 -asm/non_matchings/code/sys_math3d/Math3D_PointDistToLine2D.s,Math3D_PointDistToLine2D,0x8017D668,0x56 -asm/non_matchings/code/sys_math3d/func_8017D7C0.s,func_8017D7C0,0x8017D7C0,0x15 -asm/non_matchings/code/sys_math3d/func_8017D814.s,func_8017D814,0x8017D814,0x42 -asm/non_matchings/code/sys_math3d/func_8017D91C.s,func_8017D91C,0x8017D91C,0x42 -asm/non_matchings/code/sys_math3d/func_8017DA24.s,func_8017DA24,0x8017DA24,0x42 +asm/non_matchings/code/sys_math3d/Math3D_TriLineIntersect.s,Math3D_TriLineIntersect,0x8017D404,0x59 +asm/non_matchings/code/sys_math3d/Math3D_TriNorm.s,Math3D_TriNorm,0x8017D568,0x2C +asm/non_matchings/code/sys_math3d/Math3D_PointInSph.s,Math3D_PointInSph,0x8017D618,0x14 +asm/non_matchings/code/sys_math3d/Math3D_PointDistSqToLine2DImpl.s,Math3D_PointDistSqToLine2DImpl,0x8017D668,0x56 +asm/non_matchings/code/sys_math3d/Math3D_PointDistSqToLine2D.s,Math3D_PointDistSqToLine2D,0x8017D7C0,0x15 +asm/non_matchings/code/sys_math3d/Math3D_PointDistSqToLineXY.s,Math3D_PointDistSqToLineXY,0x8017D814,0x42 +asm/non_matchings/code/sys_math3d/Math3D_PointDistSqToLineYZ.s,Math3D_PointDistSqToLineYZ,0x8017D91C,0x42 +asm/non_matchings/code/sys_math3d/Math3D_PointDistSqToLineZX.s,Math3D_PointDistSqToLineZX,0x8017DA24,0x42 asm/non_matchings/code/sys_math3d/Math3D_LineVsSph.s,Math3D_LineVsSph,0x8017DB2C,0x82 -asm/non_matchings/code/sys_math3d/func_8017DD34.s,func_8017DD34,0x8017DD34,0x50 -asm/non_matchings/code/sys_math3d/Math3D_ColSphereTri.s,Math3D_ColSphereTri,0x8017DE74,0x108 -asm/non_matchings/code/sys_math3d/func_8017E294.s,func_8017E294,0x8017E294,0x2F -asm/non_matchings/code/sys_math3d/func_8017E350.s,func_8017E350,0x8017E350,0x274 -asm/non_matchings/code/sys_math3d/Math3D_ColCylinderTri.s,Math3D_ColCylinderTri,0x8017ED20,0x120 -asm/non_matchings/code/sys_math3d/func_8017F1A0.s,func_8017F1A0,0x8017F1A0,0x8 +asm/non_matchings/code/sys_math3d/Math3D_GetSphVsTriIntersectPoint.s,Math3D_GetSphVsTriIntersectPoint,0x8017DD34,0x50 +asm/non_matchings/code/sys_math3d/Math3D_TriVsSphIntersect.s,Math3D_TriVsSphIntersect,0x8017DE74,0x108 +asm/non_matchings/code/sys_math3d/Math3D_PointInCyl.s,Math3D_PointInCyl,0x8017E294,0x2F +asm/non_matchings/code/sys_math3d/Math3D_CylVsLineSeg.s,Math3D_CylVsLineSeg,0x8017E350,0x274 +asm/non_matchings/code/sys_math3d/Math3D_CylTriVsIntersect.s,Math3D_CylTriVsIntersect,0x8017ED20,0x120 +asm/non_matchings/code/sys_math3d/Math3D_CylVsTri.s,Math3D_CylVsTri,0x8017F1A0,0x8 asm/non_matchings/code/sys_math3d/Math3D_ColSphereSphere.s,Math3D_ColSphereSphere,0x8017F1C0,0x8 -asm/non_matchings/code/sys_math3d/Math3D_ColSphereSphereIntersect.s,Math3D_ColSphereSphereIntersect,0x8017F1E0,0x8 -asm/non_matchings/code/sys_math3d/Math3D_ColSphereSphereIntersectAndDistance.s,Math3D_ColSphereSphereIntersectAndDistance,0x8017F200,0x33 -asm/non_matchings/code/sys_math3d/Math3D_ColSphereCylinderDistance.s,Math3D_ColSphereCylinderDistance,0x8017F2CC,0x8 -asm/non_matchings/code/sys_math3d/Math3D_ColSphereCylinderDistanceAndAmount.s,Math3D_ColSphereCylinderDistanceAndAmount,0x8017F2EC,0x5C -asm/non_matchings/code/sys_math3d/Math3D_ColCylinderCylinderAmount.s,Math3D_ColCylinderCylinderAmount,0x8017F45C,0x8 -asm/non_matchings/code/sys_math3d/Math3D_ColCylinderCylinderAmountAndDistance.s,Math3D_ColCylinderCylinderAmountAndDistance,0x8017F47C,0x74 -asm/non_matchings/code/sys_math3d/Math3d_ColTriTri.s,Math3d_ColTriTri,0x8017F64C,0xDD +asm/non_matchings/code/sys_math3d/Math3D_SphVsSphOverlap.s,Math3D_SphVsSphOverlap,0x8017F1E0,0x8 +asm/non_matchings/code/sys_math3d/Math3D_SphVsSphOverlapCenterDist.s,Math3D_SphVsSphOverlapCenterDist,0x8017F200,0x33 +asm/non_matchings/code/sys_math3d/Math3D_SphVsCylOverlap.s,Math3D_SphVsCylOverlap,0x8017F2CC,0x8 +asm/non_matchings/code/sys_math3d/Math3D_SphVsCylOverlapCenterDist.s,Math3D_SphVsCylOverlapCenterDist,0x8017F2EC,0x5C +asm/non_matchings/code/sys_math3d/Math3D_CylVsCylOverlap.s,Math3D_CylVsCylOverlap,0x8017F45C,0x8 +asm/non_matchings/code/sys_math3d/Math3D_CylVsCylOverlapCenterDist.s,Math3D_CylVsCylOverlapCenterDist,0x8017F47C,0x74 +asm/non_matchings/code/sys_math3d/Math3D_TriVsTriIntersect.s,Math3D_TriVsTriIntersect,0x8017F64C,0xDD asm/non_matchings/code/sys_math3d/Math3D_XZInSphere.s,Math3D_XZInSphere,0x8017F9C0,0x1D asm/non_matchings/code/sys_math3d/Math3D_XYInSphere.s,Math3D_XYInSphere,0x8017FA34,0x1D asm/non_matchings/code/sys_math3d/Math3D_YZInSphere.s,Math3D_YZInSphere,0x8017FAA8,0x1D -asm/non_matchings/code/sys_math3d/func_8017FB1C.s,func_8017FB1C,0x8017FB1C,0x8A +asm/non_matchings/code/sys_math3d/Math3D_CircleLineIntersections.s,Math3D_CircleLineIntersections,0x8017FB1C,0x8A asm/non_matchings/code/sys_math3d/func_8017FD44.s,func_8017FD44,0x8017FD44,0x5B asm/non_matchings/code/sys_math_atan/Math_GetAtan2Tbl.s,Math_GetAtan2Tbl,0x8017FEB0,0xD asm/non_matchings/code/sys_math_atan/Math_Atan2S.s,Math_Atan2S,0x8017FEE4,0x7A