1#include "Util/WaterSurfaceShadow.h"
2
3#include "Library/LiveActor/ActorAnimFunction.h"
4#include "Library/LiveActor/ActorFlagFunction.h"
5#include "Library/LiveActor/ActorInitUtil.h"
6#include "Library/LiveActor/ActorMovementFunction.h"
7#include "Library/LiveActor/ActorPoseUtil.h"
8#include "Library/LiveActor/LiveActor.h"
9#include "Library/Math/MathUtil.h"
10#include "Library/Nature/WaterSurfaceFinder.h"
11
12WaterSurfaceShadow::WaterSurfaceShadow(const al::ActorInitInfo& initInfo, const char* archiveName) {
13 mActor = new al::LiveActor("水面影モデル");
14 al::initChildActorWithArchiveNameNoPlacementInfo(actor: mActor, initInfo, archiveName, suffix: nullptr);
15
16 if (al::isMclAnimExist(mActor, "AlphaColor"))
17 al::startMclAnim(mActor, "AlphaColor");
18 else
19 al::startMclAnim(mActor, "AlfaColor");
20
21 mActor->makeActorDead();
22 mWaterSurfaceFinder = new al::WaterSurfaceFinder(mActor);
23}
24
25bool WaterSurfaceShadow::isAppearShadow() const {
26 return al::isAlive(actor: mActor);
27}
28
29void WaterSurfaceShadow::update(const sead::Vector3f& position, const sead::Vector3f& gravity,
30 f32 distance) {
31 mWaterSurfaceFinder->updateForSurfaceShadow(position, gravity, distance);
32
33 if (!mWaterSurfaceFinder->isFoundSurface() || mWaterSurfaceFinder->getDistance() >= 50.0f ||
34 mWaterSurfaceFinder->getDistance() + distance < 15.0f) {
35 if (al::isAlive(actor: mActor))
36 mActor->kill();
37 return;
38 }
39
40 f32 animDistance = sead::Mathf::abs(x: mWaterSurfaceFinder->getDistance());
41 f32 animTime = al::easeIn(t: al::calcRate01(animDistance, 0.0f, mMaxDistance));
42
43 if (al::isDead(actor: mActor))
44 mActor->appear();
45
46 al::setMclAnimNormalFrameAndStop(mActor, al::lerpValue(a: mStartFrame, b: mEndFrame, t: animTime));
47 al::resetPosition(actor: mActor, trans: gravity * 0.0f + mWaterSurfaceFinder->getSurfacePosition());
48}
49
50void WaterSurfaceShadow::disappearShadow() {
51 if (!al::isDead(actor: mActor))
52 mActor->kill();
53}
54
55void WaterSurfaceShadow::setScale(f32 scale) {
56 setScale(scaleX: scale, scaleZ: scale);
57}
58
59void WaterSurfaceShadow::setScale(f32 scaleX, f32 scaleZ) {
60 al::setScaleX(actor: mActor, x: scaleX);
61 al::setScaleZ(actor: mActor, z: scaleZ);
62}
63
64void WaterSurfaceShadow::setQuat(const sead::Quatf& quat) {
65 al::setQuat(actor: mActor, quat);
66}
67