-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathWaterSurfaceFinder.cpp
74 lines (61 loc) · 3.11 KB
/
WaterSurfaceFinder.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "Library/Nature/WaterSurfaceFinder.h"
#include "Library/Nature/NatureUtil.h"
namespace al {
WaterSurfaceFinder::WaterSurfaceFinder(const LiveActor* actor) : mActor(actor) {}
// NON_MATCHING: inlined updateLocal
void WaterSurfaceFinder::update(const sead::Vector3f& position, const sead::Vector3f& gravity,
f32 distance) {
updateLocal(position, gravity, distance, false, false, false);
}
// NON_MATCHING: storing {0,0,0} if no surface was found (https://decomp.me/scratch/zHEdm)
void WaterSurfaceFinder::updateLocal(const sead::Vector3f& position, const sead::Vector3f& gravity,
f32 distance, bool flat, bool displacement, bool overGround) {
sead::Vector3f surfacePos = {0.0f, 0.0f, 0.0f};
sead::Vector3f surfaceNormal = {0.0f, 0.0f, 0.0f};
mIsFoundSurface = false;
if (flat)
mIsFoundSurface = calcFindWaterSurfaceFlat(&surfacePos, &surfaceNormal, mActor, position,
gravity, distance);
else if (displacement)
mIsFoundSurface = calcFindWaterSurfaceDisplacement(&surfacePos, &surfaceNormal, mActor,
position, gravity, distance);
else if (overGround)
mIsFoundSurface = calcFindWaterSurfaceOverGround(&surfacePos, &surfaceNormal, mActor,
position, gravity, distance);
else
mIsFoundSurface =
calcFindWaterSurface(&surfacePos, &surfaceNormal, mActor, position, gravity, distance);
if (mIsFoundSurface) {
// requires this manual dot product calculation to match
mDistance = gravity.x * (surfacePos.x - position.x) +
gravity.y * (surfacePos.y - position.y) +
gravity.z * (surfacePos.z - position.z);
// mDistance = gravity.dot(surfacePos - position);
mSurfacePosition.set(surfacePos);
mSurfaceNormal.set(surfaceNormal);
} else {
mDistance = 0.0f;
mSurfacePosition = {0.0f, 0.0f, 0.0f};
mSurfaceNormal = {0.0f, 0.0f, 0.0f};
}
_28 = {0.0f, 0.0f, 0.0f};
}
// NON_MATCHING: inlined updateLocal
void WaterSurfaceFinder::updateForSurfaceShadow(const sead::Vector3f& position,
const sead::Vector3f& gravity, f32 distance) {
updateLocal(position, gravity, distance, true, false, false);
}
// NON_MATCHING: inlined updateLocal
void WaterSurfaceFinder::updateForDisplacement(const sead::Vector3f& position,
const sead::Vector3f& gravity, f32 distance) {
updateLocal(position, gravity, distance, false, true, false);
}
// NON_MATCHING: inlined updateLocal
void WaterSurfaceFinder::updateConsiderGround(const sead::Vector3f& position,
const sead::Vector3f& gravity, f32 distance) {
updateLocal(position, gravity, distance, false, false, true);
}
bool WaterSurfaceFinder::isNearSurface(f32 distance) const {
return mIsFoundSurface && sead::Mathf::abs(mDistance) < distance;
}
} // namespace al