载入中...
搜索中...
未找到
EditorCurveDocument.cpp
浏览该文件的文档.
25 const auto string = [&](const char* name) { const auto* entry = field(value, name); return entry ? entry->getIf<std::string>() : nullptr; };
26 const auto number = [&](const char* name) { const auto* entry = field(value, name); return entry ? entry->getIf<double>() : nullptr; };
27 const auto* id = string("id"); const auto* time = number("time"); const auto* assigned = number("value");
28 const auto* in = number("inTangent"); const auto* out = number("outTangent"); const auto* interpolation = string("interpolation");
33 return eve::editing::failed<EditorCurveKey>(EditorStatus::Rejected, RuleId("editor.curve.invalid-key"),
35 return eve::editing::applied<EditorCurveKey>({StableId(*id), *time, *assigned, *in, *out, *interpolation});
40 return EditorValue::Object{{"id", stop.id.value()}, {"time", stop.time}, {"color", std::move(color)}};
44 const auto* idValue = field(value, "id"); const auto* timeValue = field(value, "time"); const auto* colorValue = field(value, "color");
45 const auto* id = idValue ? idValue->getIf<std::string>() : nullptr; const auto* time = timeValue ? timeValue->getIf<double>() : nullptr;
47 if (!id || id->empty() || !time || !std::isfinite(*time) || *time < 0.0 || *time > 1.0 || !color || color->size() != 4)
48 return eve::editing::failed<EditorGradientStop>(EditorStatus::Rejected, RuleId("editor.curve.invalid-stop"),
55 EditorStatus::Rejected, RuleId("editor.curve.invalid-color"), "Gradient color must be normalized");
63 DomainOperation result; result.type = type; result.inverseType = inverseType; result.target = TargetId(target);
64 result.payload = std::move(payload); result.inverse = std::move(inverse); result.hasInverse = true;
70 std::vector<T> result; for (const auto& [id, value] : values) { static_cast<void>(id); result.push_back(value); }
71 std::sort(result.begin(), result.end(), [](const auto& a, const auto& b) { return a.time == b.time ? a.id < b.id : a.time < b.time; });
82 return {TargetId(id_), "curve-document", revisionValue(), false, {ICurveDocumentEditTarget::editorCapabilityId()}};
92 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.curve.target-mismatch"),
114 return eve::editing::failed<void>(EditorStatus::NotFound, RuleId("editor.curve.stop-not-found"),
117 return eve::editing::failed<void>(EditorStatus::Unsupported, RuleId("editor.curve.operation-unsupported"),
128Result<void> EditorCurveDocument::commitDomainState(std::unique_ptr<IDomainOperationTarget> candidate) {
131 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.curve.invalid-candidate"),
148 return eve::editing::failed<DomainOperation>(EditorStatus::NotFound, RuleId("editor.curve.key-not-found"),
156 return eve::editing::failed<DomainOperation>(parsed.code(), RuleId("editor.curve.invalid-stop"),
165 return eve::editing::failed<DomainOperation>(EditorStatus::NotFound, RuleId("editor.curve.stop-not-found"),
191 const auto upper = std::upper_bound(values.begin(), values.end(), time, [](double t, const auto& stop) { return t < stop.time; });
194 const auto& a = *(upper - 1); const auto& b = *upper; const double t = b.time > a.time ? (time - a.time) / (b.time - a.time) : 0.0;
208 result.curveSamples.reserve(static_cast<std::size_t>(sampleCount)); result.gradientSamples.reserve(static_cast<std::size_t>(sampleCount));
209 for (int i = 0; i < sampleCount; ++i) { const double t = static_cast<double>(i) / (sampleCount - 1); result.curveSamples.push_back(sampleCurve(t)); result.gradientSamples.push_back(sampleGradient(t)); }
215 EditorValue::Array stops; for (const auto& stop : this->stops()) stops.push_back(stopValue(stop));
216 return EditorValue::Object{{"schemaVersion", int64_t{1}}, {"keys", std::move(keys)}, {"stops", std::move(stops)}};
220 const auto* versionValue = field(snapshot, "schemaVersion"); const auto* keysValue = field(snapshot, "keys"); const auto* stopsValue = field(snapshot, "stops");
221 const auto* version = versionValue ? versionValue->getIf<int64_t>() : nullptr; const auto* keys = keysValue ? keysValue->getIf<EditorValue::Array>() : nullptr; const auto* stops = stopsValue ? stopsValue->getIf<EditorValue::Array>() : nullptr;
223 return eve::editing::failed<void>(EditorStatus::Unsupported, RuleId("editor.curve.invalid-snapshot"),
229 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.curve.invalid-snapshot-key"),
236 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.curve.invalid-snapshot-stop"),
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
const std::string & value() const noexcept
Returns the exact legacy or canonical compatibility spelling.
Definition Identity.h:362
void setRevision(Revision revision)
Adopt a revision observed elsewhere, without advancing it.
Definition EditableTarget.h:181
void bumpRevision()
Advance the revision without touching the dirty region.
Definition EditableTarget.h:179
void clearDirtyRegion() override
Discard the dirty region; the revision does not change.
Definition EditableTarget.h:163
Revision revisionValue() const noexcept
Return the revision as the shared protocol revision type.
Definition EditableTarget.h:169
void widenDirty()
Mark an unknown area dirty without advancing the revision.
Definition EditableTarget.h:177
eve::OptionalRef< C > capability()
Query a capability through its interface-owned stable identity.
Definition EditableTarget.h:82
Deterministic owning value tree shared by authoring hosts.
Definition EditingValue.h:19
UI-neutral reversible curve and gradient timeline document.
Definition EditorCurveDocument.h:64
Result< void > commitDomainState(std::unique_ptr< IDomainOperationTarget > candidate) override
Commits domain state.
Definition EditorCurveDocument.cpp:128
std::unique_ptr< IDomainOperationTarget > cloneDomainState() const override
Clones domain state.
Definition EditorCurveDocument.cpp:124
EditorCurvePreview preview(int sampleCount, int maximumSamples=4096) const
Build a bounded lookup preview for viewport/material upload.
Definition EditorCurveDocument.cpp:198
std::vector< EditorCurveKey > keys() const
Return scalar keys in stable timeline order.
Definition EditorCurveDocument.cpp:170
Result< void > applyDomainOperation(const DomainOperation &operation) override
Applies domain operation.
Definition EditorCurveDocument.cpp:90
double sampleCurve(double time) const
Sample scalar curve at normalized time.
Definition EditorCurveDocument.cpp:173
EditorValue snapshotValue() const
Capture deterministic schema-version-one timeline data.
Definition EditorCurveDocument.cpp:213
Result< void > loadSnapshot(const EditorValue &snapshot)
Atomically load a validated timeline snapshot.
Definition EditorCurveDocument.cpp:219
Result< DomainOperation > makeSetKey(const EditorCurveKey &key) const override
Make set key.
Definition EditorCurveDocument.cpp:136
Result< DomainOperation > makeDeleteStop(const StableId &stop) const override
Make delete stop.
Definition EditorCurveDocument.cpp:162
Result< DomainOperation > makeDeleteKey(const StableId &key) const override
Make delete key.
Definition EditorCurveDocument.cpp:145
std::vector< EditorGradientStop > stops() const
Return gradient stops in stable timeline order.
Definition EditorCurveDocument.cpp:171
Result< DomainOperation > makeSetStop(const EditorGradientStop &stop) const override
Make set stop.
Definition EditorCurveDocument.cpp:153
std::array< double, 4 > sampleGradient(double time) const
Sample gradient at normalized time.
Definition EditorCurveDocument.cpp:188
void * queryCapability(const CapabilityId &capability) override
Query an optional target capability.
Definition EditorCurveDocument.cpp:85
Stable key/gradient editing capability shared by effects and animation presenters.
Definition EditorCurveDocument.h:43
Diagnostic ruleDiagnostic(eve::DiagnosticCode code, RuleId rule, DiagnosticSeverity severity, std::string message)
Build a common diagnostic carrying an open editing rule identity.
Definition EditingResult.h:25
Definition ActionPreviewController.cpp:6
eve::editing::Value EditorValue
Compatibility alias for the UI-independent authoring value tree.
Definition EditorValue.h:8
eve::editing::DomainOperation DomainOperation
Definition EditorProtocol.h:12
const EditorValue * field(const EditorValue &value, const char *name)
Definition RoadNetworkEditTarget.cpp:15
@ PreconditionViolation
Definition Container.h:602
Stable discovery metadata exposed by every editable target.
Definition EditableTarget.h:39
Stable scalar curve key with editable Hermite tangents.
Definition EditorCurveDocument.h:17
Bounded revision-tagged curve/gradient lookup preview.
Definition EditorCurveDocument.h:34
std::vector< double > curveSamples
Definition EditorCurveDocument.h:37
Revision documentRevision
Definition EditorCurveDocument.h:36
std::vector< EditorDiagnostic > diagnostics
Definition EditorCurveDocument.h:39
std::vector< std::array< double, 4 > > gradientSamples
Definition EditorCurveDocument.h:38
Stable normalized RGBA gradient stop.
Definition EditorCurveDocument.h:27