25 lines
814 B
C++
25 lines
814 B
C++
#pragma once
|
|
#include <algorithm>
|
|
#include <cstdint>
|
|
|
|
namespace mtgodot {
|
|
// MapOutdoorWater: one shared vertical translation, alternating a random
|
|
// 0..-15cm endpoint and zero, linearly interpolated over 1000..3000ms.
|
|
struct WaterMotion {
|
|
uint64_t start_ms = 0, duration_ms = 300;
|
|
double begin = 0, end = 0, current = 0;
|
|
bool initialized = false;
|
|
double sample(uint64_t now, uint64_t next_duration, double next_depth_cm) {
|
|
if (!initialized) { start_ms = now; initialized = true; }
|
|
if (now - start_ms > duration_ms) {
|
|
begin = current;
|
|
end = end == 0 ? -std::clamp(next_depth_cm, 0.0, 15.0) * 0.01 : 0;
|
|
start_ms = now;
|
|
duration_ms = std::clamp<uint64_t>(next_duration, 1000, 3000);
|
|
}
|
|
current = begin + (end - begin) * double(now - start_ms) / double(duration_ms);
|
|
return current;
|
|
}
|
|
};
|
|
}
|