载入中...
搜索中...
未找到
MaterialPublishingTarget.cpp
浏览该文件的文档.
2
3namespace eve::material_editing {
4namespace {
5
6} // namespace
7
9 : document_(std::move(id)), sink_(sink) {}
10
13 descriptor.type = "material-runtime";
14 return descriptor;
15}
16
17void* MaterialPublishingTarget::queryCapability(const CapabilityId& capability) {
18 return document_.queryCapability(capability);
19}
20
23 if (staging_) return document_.applyDomainOperation(operation);
24 auto candidate = cloneDomainState();
25 auto applied = candidate->applyDomainOperation(operation);
26 if (!applied.ok()) return applied;
27 return commitDomainState(std::move(candidate));
28}
29
30std::unique_ptr<IDomainOperationTarget> MaterialPublishingTarget::cloneDomainState() const {
31 auto candidate = std::make_unique<MaterialPublishingTarget>(*this);
32 candidate->staging_ = true;
33 return candidate;
34}
35
37 std::unique_ptr<IDomainOperationTarget> candidate) {
38 auto* typed = dynamic_cast<MaterialPublishingTarget*>(candidate.get());
39 if (!typed || typed->targetId() != targetId() || typed->sink_ != sink_ || !typed->staging_)
40 return eve::editing::failed<void>(EditorStatus::Conflict,
41 RuleId("editor.material.publishing-candidate-mismatch"),
42 "Material candidate belongs to another live target");
43 if (!sink_)
44 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.material.publishing-sink-missing"),
45 "Material publishing target requires a live runtime sink");
46 Result<void> published = sink_->publish(typed->document_);
47 if (!published.ok()) return published;
48 document_ = typed->document_;
49 return eve::editing::applied<void>();
50}
51
53 auto candidate = std::make_unique<MaterialPublishingTarget>(*this);
54 candidate->staging_ = true;
55 auto loaded = candidate->document_.loadSnapshot(snapshot);
56 if (!loaded.ok()) return loaded;
57 return commitDomainState(std::move(candidate));
58}
59
60} // namespace eve::material_editing
ActionParameterOperation operation
std::string descriptor
std::string id
Definition PlayHost.cpp:108
Move-only operation result carrying either a value or Status.
Definition Result.h:155
bool ok() const noexcept
Whether this result represents a non-failure outcome.
Definition Result.h:255
eve::OptionalRef< C > capability()
Query a capability through its interface-owned stable identity.
Deterministic owning value tree shared by authoring hosts.
Atomic runtime publication boundary for a complete material candidate.
virtual Result< void > publish(const MaterialDocumentTarget &candidate)=0
Publish a candidate; failure must leave the runtime material unchanged.
TargetDescriptor describe() const override
Describe.
void * queryCapability(const CapabilityId &capability) override
Query an optional target capability.
Result< void > applyDomainOperation(const DomainOperation &operation) override
Applies domain operation.
Candidate-first material operation target with live commit/undo publication.
TargetDescriptor describe() const override
Describe.
Result< void > commitDomainState(std::unique_ptr< IDomainOperationTarget > candidate) override
Commits domain state.
Result< void > reloadSnapshot(const EditorValue &snapshot)
Atomically parse and publish a persisted material snapshot.
void * queryCapability(const CapabilityId &capability) override
Forward property and snapshot capabilities from the authoring document. @ownership Borrowed from this...
Result< void > applyDomainOperation(const DomainOperation &operation) override
Applies domain operation.
std::unique_ptr< IDomainOperationTarget > cloneDomainState() const override
Clones domain state.
TargetId targetId() const override
Target id.
MaterialPublishingTarget(std::string id, IMaterialRuntimeSink *sink)
Create an owned material document bound to a non-owning runtime sink.
DomainOperation public API.
Stable discovery metadata exposed by every editable target.