载入中...
搜索中...
未找到
PcgLightingFogPhotoMode.cpp
浏览该文件的文档.
2
3#include "common/Capability.h"
4
5#include <cmath>
6#include <string_view>
7
8namespace eve::daynight {
9namespace {
10bool isFogField(std::string_view field) {
11 return field == "m_pcgAdditionalLinearFog" ||
12 field == "m_pcgAdditionalExponentialFog" ||
13 field == "m_fogOverride" || field == "m_fogMode" ||
14 field == "m_fogColor" || field == "m_fogDensity" ||
15 field == "m_fogStart" || field == "m_fogEnd" ||
16 field == "m_globalFogDensityMultiplier" ||
17 field == "m_overrideDensityVolume" ||
18 field == "m_densityVolumeAlbedoColor" ||
19 field == "m_densityVolumeFogDistance" ||
20 field == "m_densityVolumeEffectType" ||
21 field == "m_densityVolumeTilingResolution";
22}
23} // namespace
24
26 if (authority_) cap::removeListener<IPhotoModeFieldSink>(this);
27}
28
30 target_ = target;
31 if (target_) state_ = target_->getPcgFog();
32}
33
35 if (enabled == authority_) return;
36 if (enabled) cap::addListener<IPhotoModeFieldSink>(this);
37 else cap::removeListener<IPhotoModeFieldSink>(this);
38 authority_ = enabled;
39}
40
42 const PhotoModeAssignment &assignment) const noexcept {
43 return assignment.domain == PhotoModeDomain::Lighting && isFogField(assignment.field)
46}
47
49 const PhotoModeAssignment &assignment) {
50 const auto fail = [&](DiagnosticCode code, const char *message) {
52 code, message, assignment.field, {}, "daynight.pcgLightingFog"));
53 };
54 if (!target_)
55 return fail(DiagnosticCode::Unsupported, "day-night target is unavailable");
56 if (!isFogField(assignment.field))
57 return fail(DiagnosticCode::InvalidArgument, "unsupported Pcg fog field");
58
59 PcgFogState candidate = state_;
60 if (assignment.field == "m_fogOverride" ||
61 assignment.field == "m_overrideDensityVolume") {
62 const auto *value = std::get_if<bool>(&assignment.value);
63 if (!value)
64 return fail(DiagnosticCode::InvalidArgument, "fog toggle requires a bool");
65 if (assignment.field == "m_fogOverride") candidate.overrideFog = *value;
66 else candidate.overrideDensityVolume = *value;
67 } else if (assignment.field == "m_fogMode" ||
68 assignment.field == "m_densityVolumeEffectType" ||
69 assignment.field == "m_densityVolumeTilingResolution") {
70 const auto *value = std::get_if<std::int64_t>(&assignment.value);
71 if (!value)
72 return fail(DiagnosticCode::InvalidArgument, "fog enum requires an integer");
73 if (assignment.field == "m_fogMode") candidate.mode = static_cast<int>(*value);
74 else if (assignment.field == "m_densityVolumeEffectType")
75 candidate.densityVolumeEffect = static_cast<int>(*value);
76 else candidate.densityVolumeTiling = static_cast<int>(*value);
77 } else if (assignment.field == "m_fogColor" ||
78 assignment.field == "m_densityVolumeAlbedoColor") {
79 const auto *value = std::get_if<PhotoModeColor>(&assignment.value);
80 if (!value || !std::isfinite(value->r) || !std::isfinite(value->g) ||
81 !std::isfinite(value->b) || value->r < 0.f || value->g < 0.f ||
82 value->b < 0.f)
84 "fog color requires finite non-negative RGB channels");
85 if (assignment.field == "m_fogColor") {
86 candidate.red = value->r;
87 candidate.green = value->g;
88 candidate.blue = value->b;
89 } else {
90 candidate.densityAlbedoRed = value->r;
91 candidate.densityAlbedoGreen = value->g;
92 candidate.densityAlbedoBlue = value->b;
93 }
94 } else {
95 const auto *value = std::get_if<float>(&assignment.value);
96 if (!value || !std::isfinite(*value))
98 "fog setting requires a finite float");
99 if (assignment.field == "m_pcgAdditionalLinearFog")
100 candidate.additionalLinearDistance = *value;
101 else if (assignment.field == "m_pcgAdditionalExponentialFog")
103 else if (assignment.field == "m_fogDensity") candidate.density = *value;
104 else if (assignment.field == "m_fogStart") candidate.startDistance = *value;
105 else if (assignment.field == "m_fogEnd") candidate.endDistance = *value;
106 else if (assignment.field == "m_globalFogDensityMultiplier")
107 candidate.globalDensityMultiplier = *value;
108 else if (assignment.field == "m_densityVolumeFogDistance")
109 candidate.densityVolumeDistance = *value;
110 }
111
112 auto result = target_->setPcgFog(candidate);
113 if (!result.ok()) return result;
114 state_ = candidate;
115 return Result<void>::success();
116}
117
118} // namespace eve::daynight
LogicalId target
double value
std::string message
DiagnosticCode code
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
DayNight module — a time-of-day cycle that drives the sun, sky and light.
Definition DayNight.h:94
Result< void > setPcgFog(const PcgFogState &state)
Atomically replace all Pcg fog and density-volume controls.
Definition DayNight.cpp:384
Result< void > applyPhotoModeField(const PhotoModeAssignment &assignment) override
Validate and atomically project one field through the joint DayNight state.
PhotoModeFieldAcceptance acceptsPhotoModeField(const PhotoModeAssignment &assignment) const noexcept override
Accept only Pcg fog and density-volume Lighting assignments.
~PcgLightingFogPhotoMode() override
Pcg lighting fog photo mode.
void setAuthority(bool enabled)
Register or revoke ownership of Pcg fog fields.
void setTarget(DayNight *target) noexcept
Attach a borrowed DayNight target and seed local state from it.
const EditorValue * field(const EditorValue &value, const char *name)
DiagnosticCode
Stable machine-readable diagnostic codes.
Definition Diagnostic.h:47
PhotoModeFieldAcceptance
Capability implemented by the composition root that routes assignments to domain owners.
bool enabled
One reversible field assignment in a photo-mode transaction.
Joint Pcg Photo Mode fog and density-volume state.
Definition DayNight.h:43