载入中...
搜索中...
未找到
PhysicsPublishingTarget.cpp
浏览该文件的文档.
2
3namespace eve::physics_editing {
4namespace {
5
6} // namespace
7
10 : document_(std::move(id), dimensions), sink_(sink) {}
11
13 if (staging_) return document_.applyDomainOperation(operation);
14 auto candidate = cloneDomainState();
15 auto applied = candidate->applyDomainOperation(operation);
16 if (!applied.ok()) return applied;
17 return commitDomainState(std::move(candidate));
18}
19
20std::unique_ptr<IDomainOperationTarget> PhysicsColliderPublishingTarget::cloneDomainState() const {
21 auto candidate = std::make_unique<PhysicsColliderPublishingTarget>(*this);
22 candidate->staging_ = true;
23 return candidate;
24}
25
27 std::unique_ptr<IDomainOperationTarget> candidate) {
28 auto* typed = dynamic_cast<PhysicsColliderPublishingTarget*>(candidate.get());
29 if (!typed || typed->targetId() != targetId() || typed->sink_ != sink_ || !typed->staging_ ||
30 typed->document_.describe().type != document_.describe().type)
31 return eve::editing::failed<void>(EditorStatus::Conflict,
32 RuleId("editor.physics.publishing-candidate-mismatch"),
33 "Collider candidate belongs to another live target");
34 if (!sink_)
35 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.physics.publishing-sink-missing"),
36 "Collider publishing target requires a live runtime sink");
37 Result<void> published = sink_->publish(typed->document_);
38 if (!published.ok()) return published;
39 document_ = typed->document_;
40 return eve::editing::applied<void>();
41}
42
43} // namespace eve::physics_editing
ActionParameterOperation operation
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
Atomic runtime publication boundary for a complete collider candidate.
virtual Result< void > publish(const PhysicsColliderTarget &candidate)=0
Publish a candidate; failure must preserve the previous live collider.
Candidate-first collider target whose commit/undo publishes to a live sink.
Result< void > commitDomainState(std::unique_ptr< IDomainOperationTarget > candidate) override
Commits domain state.
Result< void > applyDomainOperation(const DomainOperation &operation) override
Applies domain operation.
TargetId targetId() const override
Target id.
PhysicsColliderPublishingTarget(std::string id, int dimensions, IPhysicsColliderRuntimeSink *sink)
Create an owned collider document bound to a non-owning runtime sink.
std::unique_ptr< IDomainOperationTarget > cloneDomainState() const override
Clones domain state.
TargetDescriptor describe() const override
Describe.
Result< void > applyDomainOperation(const DomainOperation &operation) override
Applies domain operation.
DomainOperation public API.