载入中...
搜索中...
未找到
PcgLightingSunPhotoMode.cpp
浏览该文件的文档.
2
3#include "common/Capability.h"
4
5#include <cmath>
6
7namespace eve::daynight {
8
10 if (authority_) cap::removeListener<IPhotoModeFieldSink>(this);
11}
12
14 target_ = target;
15 if (target_) state_ = target_->getPcgManualSun();
16}
17
19 if (enabled == authority_) return;
20 if (enabled) cap::addListener<IPhotoModeFieldSink>(this);
21 else cap::removeListener<IPhotoModeFieldSink>(this);
22 authority_ = enabled;
23}
24
26 const PhotoModeAssignment &assignment) const noexcept {
27 if (assignment.domain != PhotoModeDomain::Lighting)
29 return assignment.field == "m_sunRotation" || assignment.field == "m_sunPitch" ||
30 assignment.field == "m_sunOverride" ||
31 assignment.field == "m_sunIntensity" ||
32 assignment.field == "m_sunColor" ||
33 assignment.field == "m_sunKelvinValue"
36}
37
39 const PhotoModeAssignment &assignment) {
40 const auto fail = [&](DiagnosticCode code, const char *message) {
42 code, message, assignment.field, {}, "daynight.pcgLightingSun"));
43 };
44 if (!target_)
45 return fail(DiagnosticCode::Unsupported, "day-night target is unavailable");
46
47 PcgManualSunState candidate = state_;
48 if (assignment.field == "m_sunOverride") {
49 const auto *value = std::get_if<bool>(&assignment.value);
50 if (!value)
51 return fail(DiagnosticCode::InvalidArgument, "sun override requires a bool");
52 candidate.enabled = *value;
53 } else if (assignment.field == "m_sunColor") {
54 const auto *value = std::get_if<PhotoModeColor>(&assignment.value);
55 if (!value || !std::isfinite(value->r) || !std::isfinite(value->g) ||
56 !std::isfinite(value->b) || value->r < 0.f || value->g < 0.f ||
57 value->b < 0.f)
59 "sun color requires finite non-negative RGB channels");
60 candidate.red = value->r;
61 candidate.green = value->g;
62 candidate.blue = value->b;
63 } else {
64 const auto *value = std::get_if<float>(&assignment.value);
65 if (!value || !std::isfinite(*value))
67 "sun field requires a finite float");
68 if (assignment.field == "m_sunRotation")
69 candidate.rotationDegrees = *value;
70 else if (assignment.field == "m_sunPitch")
71 candidate.pitchDegrees = *value;
72 else if (assignment.field == "m_sunIntensity")
73 candidate.intensity = *value;
74 else if (assignment.field == "m_sunKelvinValue")
75 candidate.kelvin = *value;
76 else
78 "unsupported Pcg manual-sun field");
79 }
80
81 auto result = target_->setPcgManualSun(candidate);
82 if (!result.ok()) return result;
83 state_ = candidate;
84 return Result<void>::success();
85}
86
87} // 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 > setPcgManualSun(const PcgManualSunState &state)
Atomically replace the persistent Pcg manual-sun state.
Definition DayNight.cpp:344
void setTarget(DayNight *target) noexcept
Attach a borrowed DayNight target and seed local state from it.
PhotoModeFieldAcceptance acceptsPhotoModeField(const PhotoModeAssignment &assignment) const noexcept override
Return Accepted only for the six Pcg manual-sun Lighting fields.
void setAuthority(bool enabled)
Register or revoke this instance as owner of the six manual-sun fields.
Result< void > applyPhotoModeField(const PhotoModeAssignment &assignment) override
Validate and atomically project one field through DayNight's joint sun state.
~PcgLightingSunPhotoMode() override
Pcg lighting sun photo mode.
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.
Persistent manual sun settings projected from Pcg Photo Mode.
Definition DayNight.h:21