1#include "Library/Area/AreaShapeOval.h"
2
3#include <math/seadMathCalcCommon.h>
4
5#include "Library/Math/MathUtil.h"
6
7namespace al {
8
9AreaShapeOval::AreaShapeOval() {}
10
11bool AreaShapeOval::isInVolume(const sead::Vector3f& trans) const {
12 sead::Vector3f localPos = sead::Vector3f::zero;
13 calcLocalPos(localPos: &localPos, trans);
14
15 return localPos.squaredLength() <= sead::Mathf::square(t: 500.0f);
16}
17
18bool AreaShapeOval::isInVolumeOffset(const sead::Vector3f& trans, f32 offset) const {
19 sead::Vector3f scale = getScale();
20
21 // has to be this way around to match
22 if (scale.x == scale.y && scale.y == scale.z) {
23 sead::Vector3f baseTrans;
24 calcTrans(trans: &baseTrans);
25 sead::Vector3f offsetTrans = trans - baseTrans;
26 f32 radius = scale.x * 500.0f + offset;
27
28 return offsetTrans.squaredLength() <= sead::Mathf::square(t: radius);
29 }
30
31 return false;
32}
33
34bool AreaShapeOval::calcNearestEdgePoint(sead::Vector3f* edgePoint,
35 const sead::Vector3f& trans) const {
36 sead::Vector3f localPos = sead::Vector3f::zero;
37 calcLocalPos(localPos: &localPos, trans);
38 f32 length = localPos.length();
39
40 if (length > 0.0f)
41 localPos *= 500.0f / length;
42
43 calcWorldPos(worldPos: edgePoint, trans: localPos);
44 return true;
45}
46
47bool AreaShapeOval::checkArrowCollision(sead::Vector3f* a2, sead::Vector3f* a3,
48 const sead::Vector3f& a4, const sead::Vector3f& a5) const {
49 sead::Vector3f localA4 = sead::Vector3f::zero;
50 calcLocalPos(localPos: &localA4, trans: a4);
51 sead::Vector3f localA5 = sead::Vector3f::zero;
52 calcLocalPos(localPos: &localA5, trans: a5);
53
54 sead::Vector3f tmp1 = {0, 0, 0};
55 sead::Vector3f tmp2 = {0, 0, 0};
56 calcWorldPos(worldPos: &tmp1, trans: localA4);
57 calcWorldPos(worldPos: &tmp2, trans: localA5);
58
59 if (!checkHitSegmentSphere(sead::Vector3f::zero, localA4, localA5, 500.0f, a3, a2))
60 return false;
61
62 calcWorldPos(worldPos: a2, trans: *a2);
63 calcWorldDir(worldDir: a3, trans: *a3);
64 *a3 *= (-1);
65 return true;
66}
67
68} // namespace al
69