载入中...
搜索中...
未找到
WaterSystem.cpp
浏览该文件的文档.
2
3#include <cmath>
4
5namespace eve::graphics {
6namespace {
7bool finite3(const glm::vec3& value) {
8 return std::isfinite(value.x) && std::isfinite(value.y) && std::isfinite(value.z);
9}
10
11Result<void> validate(const WaterSystemSettings& settings, const WaterSceneConditions& scene) {
12 if ((settings.autoUpdateMode != WaterAutoUpdateMode::Interval &&
14 !std::isfinite(settings.refreshRate) || settings.refreshRate <= 0.0F || !finite3(scene.sunColor) ||
15 !finite3(scene.sunDirection) || !std::isfinite(scene.sunIntensity) ||
16 (scene.timeAvailable && (scene.hour < 0 || scene.hour > 23 || scene.minute < 0 || scene.minute > 59))) {
19 "water.system: positive refresh rate, finite lighting and valid optional time are required"));
20 }
21 return Result<void>::success();
22}
23
24bool changed(const WaterSceneConditions& lhs, const WaterSceneConditions& rhs) {
25 if (lhs.sunAvailable != rhs.sunAvailable || lhs.timeAvailable != rhs.timeAvailable) return true;
26 if (rhs.sunAvailable && (lhs.sunColor != rhs.sunColor || lhs.sunDirection != rhs.sunDirection ||
27 lhs.sunIntensity != rhs.sunIntensity))
28 return true;
29 return rhs.timeAvailable && (lhs.hour != rhs.hour || lhs.minute != rhs.minute);
30}
31} // namespace
32
34 const WaterSceneConditions& scene, int initialSceneCheckFrames) {
35 auto valid = validate(settings, scene);
36 if (!valid) return valid;
37 if (initialSceneCheckFrames < 0)
39 "water.system: scene check delay must be nonnegative"));
40 WaterSystemState candidate = state;
41 candidate.observed = scene;
42 candidate.positionY = candidate.seaLevel;
43 candidate.refreshRemaining = settings.refreshRate;
44 candidate.sceneCheckFrames = initialSceneCheckFrames;
45 candidate.initialized = true;
46 state = candidate;
47 return Result<void>::success();
48}
49
51 const WaterSceneConditions& scene, float playerX, float playerZ, float dt,
52 int nextSceneCheckFrames) {
53 auto valid = validate(settings, scene);
54 if (!valid) return Result<bool>::failure(valid.status());
55 if (!state.initialized || !std::isfinite(state.seaLevel) || !std::isfinite(state.refreshRemaining) ||
56 !std::isfinite(playerX) || !std::isfinite(playerZ) || !std::isfinite(dt) || dt < 0.0F ||
57 nextSceneCheckFrames <= 0) {
60 "water.system: initialized finite state, nonnegative dt and positive next delay are required"));
61 }
62
63 WaterSystemState candidate = state;
64 candidate.positionY = candidate.seaLevel;
65 if (settings.infiniteMode) {
66 candidate.positionX = playerX;
67 candidate.positionZ = playerZ;
68 }
69
70 bool refresh = false;
71 if (settings.autoRefresh) {
72 if (settings.autoUpdateMode == WaterAutoUpdateMode::SceneConditions) {
73 if (candidate.sceneCheckFrames <= 0 && changed(candidate.observed, scene)) {
74 candidate.observed = scene;
75 candidate.sceneCheckFrames = nextSceneCheckFrames;
76 refresh = true;
77 }
78 } else {
79 candidate.refreshRemaining -= dt;
80 if (candidate.refreshRemaining < 0.0F) {
81 candidate.refreshRemaining = settings.refreshRate;
82 if (settings.ignoreSceneConditions) {
83 refresh = true;
84 } else if (changed(candidate.observed, scene)) {
85 candidate.observed = scene;
86 refresh = true;
87 }
88 }
89 }
90 }
91 --candidate.sceneCheckFrames;
92 if (refresh) ++candidate.refreshRevision;
93 state = candidate;
94 return Result<bool>::success(refresh);
95}
96
97Result<bool> updateWaterSeaLevel(WaterSystemState& state, float seaLevel, bool regenerateReflections) {
98 if (!state.initialized || !std::isfinite(seaLevel))
100 DiagnosticCode::InvalidArgument, "water.system: initialized state and finite sea level are required"));
101 if (state.seaLevel == seaLevel) return Result<bool>::success(false);
102 WaterSystemState candidate = state;
103 candidate.seaLevel = seaLevel;
104 candidate.positionY = seaLevel;
105 if (regenerateReflections) ++candidate.refreshRevision;
106 state = candidate;
107 return Result<bool>::success(true);
108}
109
110} // namespace eve::graphics
double value
bool valid
std::weak_ptr< PrimitiveScene > scene
TerrainThermalSettings settings
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
Result< bool > advanceWaterSystem(WaterSystemState &state, const WaterSystemSettings &settings, const WaterSceneConditions &scene, float playerX, float playerZ, float dt, int nextSceneCheckFrames)
Advance infinite placement and Pcg-compatible reflection refresh scheduling.
Result< void > initializeWaterSystem(WaterSystemState &state, const WaterSystemSettings &settings, const WaterSceneConditions &scene, int initialSceneCheckFrames)
Initialize a water controller from an authored policy and current scene snapshot.
Result< bool > updateWaterSeaLevel(WaterSystemState &state, float seaLevel, bool regenerateReflections)
Atomically move the water surface to a new sea level.
void validate(const RuntimeTensor &v)
Validate.
Immutable scene inputs used to decide whether water reflections are stale.
Definition WaterSystem.h:19
Authored policy for Pcg-compatible water placement and reflection refresh.
Definition WaterSystem.h:30
Caller-owned water-system state; contains no scene pointers or hidden clock.
Definition WaterSystem.h:39
WaterSceneConditions observed
Definition WaterSystem.h:40