1#pragma once
2
3#include <math/seadVector.h>
4
5namespace al {
6class LiveActor;
7
8struct WaterSurfaceProperties {
9 f32 distance = 0.0f;
10 sead::Vector3f position = {0.0f, 0.0f, 0.0f};
11 sead::Vector3f normal = {0.0f, 0.0f, 0.0f};
12 sead::Vector3f _1c = {0.0f, 0.0f, 0.0f};
13
14 void setDistance(f32 value) { distance = value; }
15
16 void setPosition(const sead::Vector3f& vector) { position.set(vector); }
17
18 void setNormal(const sead::Vector3f& vector) { normal.set(vector); }
19
20 void set1c(const sead::Vector3f& vector) { _1c.set(vector); }
21};
22
23class WaterSurfaceFinder {
24public:
25 WaterSurfaceFinder(const LiveActor* player);
26
27 void update(const sead::Vector3f& position, const sead::Vector3f& gravity, f32 distance);
28 void updateLocal(const sead::Vector3f& position, const sead::Vector3f& gravity, f32 maxDistance,
29 bool isFlat, bool isDisplacement, bool isOverGround);
30 void updateForSurfaceShadow(const sead::Vector3f& position, const sead::Vector3f& gravity,
31 f32 distance);
32 void updateForDisplacement(const sead::Vector3f& position, const sead::Vector3f& gravity,
33 f32 distance);
34 void updateConsiderGround(const sead::Vector3f& position, const sead::Vector3f& gravity,
35 f32 distance);
36
37 bool isNearSurface(f32 distance) const;
38
39 bool isFoundSurface() const { return mIsFoundSurface; };
40
41 f32 getDistance() const { return mSurface.distance; };
42
43 const sead::Vector3f& getSurfacePosition() const { return mSurface.position; };
44
45private:
46 const LiveActor* mActor;
47 bool mIsFoundSurface = false;
48 WaterSurfaceProperties mSurface{};
49};
50
51static_assert(sizeof(WaterSurfaceFinder) == 0x38);
52
53} // namespace al
54