载入中...
搜索中...
未找到
SplinePathDocument.cpp
浏览该文件的文档.
83 if (!id || id->empty() || !order || !x || !y || !z || !inX || !inY || !inZ || !outX || !outY || !outZ ||
85 !std::isfinite(*inY) || !std::isfinite(*inZ) || !std::isfinite(*outX) || !std::isfinite(*outY) ||
87 !std::isfinite(resolvedScaleY) || !std::isfinite(resolvedPitch) || !std::isfinite(resolvedYaw) ||
93 {StableId(*id), *order, *x, *y, *z, *inX, *inY, *inZ, *outX, *outY, *outZ, resolvedRoll, resolvedScaleX,
110DomainOperation operation(const char* type, const char* inverseType, const std::string& target, EditorValue payload,
143 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.spline.target-mismatch"),
165 return eve::editing::failed<void>(EditorStatus::NotFound, RuleId("editor.spline.point-not-found"),
174 return eve::editing::failed<void>(EditorStatus::Unsupported, RuleId("editor.spline.operation-unsupported"),
188 if (settings_.closed && ordered.size() > 1u) segments.emplace_back(static_cast<int>(ordered.size()) - 1, 0);
190 if (point.empty() || points_.contains(point) || segment < 0 || segment >= segmentCount || !std::isfinite(t) ||
197 return eve::editing::failed<DomainOperation>(runtime.code(), RuleId("editor.spline.insert-incomplete"),
199 auto sampled = runtime.value().evaluateResult((static_cast<float>(segment) + static_cast<float>(t)) /
203 EditorStatus::Rejected, RuleId("editor.spline.insert-sample-failed"), sampled.status().describe());
220 const double q0x = lerp(first.x, first.x + first.outX), q0y = lerp(first.y, first.y + first.outY),
225 const double q2x = lerp(second.x + second.inX, second.x), q2y = lerp(second.y + second.inY, second.y),
245 const int insertionIndex = nextIndex == 0 ? static_cast<int>(candidatePoints.size()) : nextIndex;
252 return eve::editing::applied<DomainOperation>(operation("spline.snapshot.replace.v1", "spline.snapshot.replace.v1",
256Result<DomainOperation> SplinePathDocument::makeSnapPoint(const StableId& point, double gridSize) const {
259 return eve::editing::failed<DomainOperation>(EditorStatus::NotFound, RuleId("editor.spline.snap-point-missing"),
262 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.spline.snap-grid-invalid"),
273 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.spline.snap-grid-invalid"),
282 return eve::editing::applied<DomainOperation>(operation("spline.snapshot.replace.v1", "spline.snapshot.replace.v1",
289 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.spline.flip-incomplete"),
315 return eve::editing::applied<DomainOperation>(operation("spline.snapshot.replace.v1", "spline.snapshot.replace.v1",
320Result<DomainOperation> SplinePathDocument::makeSetChunkBreak(const StableId& point, bool disconnected) const {
322 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.spline.chunk-break-closed"),
326 std::find_if(ordered.begin(), ordered.end(), [&](const auto& value) { return value.id == point; });
353 if (first.id.empty() || second.id.empty() || first.id == second.id || points_.contains(first.id) ||
374 return eve::editing::applied<DomainOperation>(operation("spline.snapshot.replace.v1", "spline.snapshot.replace.v1",
381 return eve::editing::failed<DomainOperation>(EditorStatus::NotFound, RuleId("editor.spline.chunk-not-found"),
390 return eve::editing::failed<DomainOperation>(EditorStatus::NotFound, RuleId("editor.spline.chunk-not-found"),
404 return eve::editing::applied<DomainOperation>(operation("spline.snapshot.replace.v1", "spline.snapshot.replace.v1",
409Result<DomainOperation> SplinePathDocument::makeSetPointRotation(const StableId& point, double pitchDegrees,
414 EditorStatus::NotFound, RuleId("editor.spline.rotation-point-missing"), "Spline point was not found");
416 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.spline.rotation-invalid"),
432 std::find_if(ordered.begin(), ordered.end(), [&](const auto& value) { return value.id == point; });
435 EditorStatus::NotFound, RuleId("editor.spline.center-point-missing"), "Spline point was not found");
463 return eve::editing::applied<DomainOperation>(operation("spline.snapshot.replace.v1", "spline.snapshot.replace.v1",
472Result<void> SplinePathDocument::commitDomainState(std::unique_ptr<IDomainOperationTarget> candidate) {
475 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.spline.invalid-candidate"),
481Result<DomainOperation> SplinePathDocument::makeSetPoint(const SplinePathControlPoint& point) const {
484 return eve::editing::failed<DomainOperation>(parsed.code(), RuleId("editor.spline.invalid-point"),
496 return eve::editing::failed<DomainOperation>(EditorStatus::NotFound, RuleId("editor.spline.point-not-found"),
498 return eve::editing::applied<DomainOperation>(operation("spline.point.delete.v1", "spline.point.set.v1", id_,
503Result<DomainOperation> SplinePathDocument::makeSetSettings(const SplinePathSettings& settings) const {
506 return eve::editing::failed<DomainOperation>(parsed.code(), RuleId("editor.spline.invalid-settings"),
509 std::any_of(points_.begin(), points_.end(), [](const auto& entry) { return entry.second.breakBefore; }))
510 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.spline.closed-has-breaks"),
512 return eve::editing::applied<DomainOperation>(operation("spline.settings.set.v1", "spline.settings.set.v1", id_,
534 return eve::editing::failed<procgen::SplinePath>(EditorStatus::Rejected, RuleId("editor.spline.compile-kind"),
541 static_cast<float>(point.rollDegrees), static_cast<float>(point.scaleX), static_cast<float>(point.scaleY),
574 if (!schema || *schema != "eve.procgen.splinePath" || !version || *version != 1 || !kindValue || !closedValue ||
576 return eve::editing::failed<void>(EditorStatus::Unsupported, RuleId("editor.spline.invalid-snapshot"),
578 auto settings = parseSettings(EditorValue::Object{{"kind", *kindValue}, {"closed", *closedValue}});
580 return eve::editing::failed<void>(settings.code(), RuleId("editor.spline.invalid-snapshot-settings"),
587 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.spline.invalid-snapshot-point"),
591 if (candidate.settings_.closed && std::any_of(candidate.points_.begin(), candidate.points_.end(),
593 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.spline.invalid-snapshot-breaks"),
605 return eve::editing::failed<procgen::SplinePath>(loaded.code(), RuleId("editor.spline.snapshot-compile"),
std::array< std::uint64_t, kPixelChunkSize *kPixelChunkSize > updated
Definition PixelWorld.cpp:53
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(int x, int y)
Widen the dirty region without advancing the revision.
Definition EditableTarget.h:173
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
Owning multi-segment 3D spline with deterministic bounded sampling.
Definition SplinePath.h:91
Result< void > setKindResult(std::string_view kind)
Select linear, catmullRom, quadraticBezier, or cubic bezier interpolation.
Definition SplinePath.cpp:41
UI-neutral reversible spline editing capability.
Definition SplinePathDocument.h:44
static CapabilityId editingCapabilityId()
Return the stable capability id.
Definition SplinePathDocument.h:49
Owning spline authoring document with transactional operations and schema-versioned snapshots.
Definition SplinePathDocument.h:91
Result< DomainOperation > makeSetPoint(const SplinePathControlPoint &point) const override
Make set point.
Definition SplinePathDocument.cpp:481
std::unique_ptr< IDomainOperationTarget > cloneDomainState() const override
Clones domain state.
Definition SplinePathDocument.cpp:468
Result< DomainOperation > makeDeletePoint(const StableId &point) const override
Make delete point.
Definition SplinePathDocument.cpp:493
Result< DomainOperation > makeSetPointRotation(const StableId &point, double pitchDegrees, double yawDegrees, double rollDegrees) const override
Make set point rotation.
Definition SplinePathDocument.cpp:409
Result< DomainOperation > makeCenterPoint(const StableId &point) const override
Make center point.
Definition SplinePathDocument.cpp:429
Result< void > commitDomainState(std::unique_ptr< IDomainOperationTarget > candidate) override
Commits domain state.
Definition SplinePathDocument.cpp:472
Result< DomainOperation > makeAppendChunk(const SplinePathControlPoint &first, const SplinePathControlPoint &second) const override
Make append chunk.
Definition SplinePathDocument.cpp:347
std::vector< SplinePathControlPoint > points() const
Return points in deterministic order and stable-id tie order.
Definition SplinePathDocument.cpp:517
Result< DomainOperation > makeMirrorAxis(std::string_view axis) const override
Make mirror axis.
Definition SplinePathDocument.cpp:448
Result< DomainOperation > makeResetPointRotation(const StableId &point) const override
Make reset point rotation.
Definition SplinePathDocument.cpp:425
Result< DomainOperation > makeDeleteChunk(int chunk) const override
Make delete chunk.
Definition SplinePathDocument.cpp:379
Result< DomainOperation > makeFlipDirection() const override
Make flip direction.
Definition SplinePathDocument.cpp:287
Result< DomainOperation > makeInsertPointAt(int segment, double t, const StableId &point) const override
Make insert point at.
Definition SplinePathDocument.cpp:182
SplinePathDocument(std::string id)
Construct an empty document with a stable target id.
Definition SplinePathDocument.cpp:125
void * queryCapability(const CapabilityId &capability) override
Query the spline editing capability.
Definition SplinePathDocument.cpp:135
EditorValue snapshotValue() const
Capture schema eve.procgen.splinePath version one.
Definition SplinePathDocument.cpp:555
Result< DomainOperation > makeSetChunkBreak(const StableId &point, bool disconnected) const override
Make set chunk break.
Definition SplinePathDocument.cpp:320
Result< void > applyDomainOperation(const DomainOperation &operation) override
Applies domain operation.
Definition SplinePathDocument.cpp:141
Result< DomainOperation > makeSnapPoint(const StableId &point, double gridSize) const override
Make snap point.
Definition SplinePathDocument.cpp:256
Result< void > loadSnapshot(const EditorValue &snapshot)
Atomically load a validated version-one snapshot.
Definition SplinePathDocument.cpp:565
Result< DomainOperation > makeSetSettings(const SplinePathSettings &settings) const override
Make set settings.
Definition SplinePathDocument.cpp:503
Result< procgen::SplinePath > compilePath() const
Compile an owning runtime spline without retaining document references.
Definition SplinePathDocument.cpp:530
Result< DomainOperation > makeSnapAll(double gridSize) const override
Make snap all.
Definition SplinePathDocument.cpp:271
const SplinePathSettings & settings() const noexcept
Return current interpolation and closure settings.
Definition SplinePathDocument.h:146
editing::DomainOperation DomainOperation
Definition ArchSpaceTarget.h:19
const EditorValue * field(const EditorValue &value, const char *name)
Definition RoadNetworkEditTarget.cpp:15
Definition HeightmapBrush.h:9
Result< procgen::SplinePath > compileSplinePathSnapshot(const EditorValue &snapshot)
Compile a version-one spline snapshot for isolated graph preview.
Definition SplinePathDocument.cpp:601
Definition Container.h:602
Stable discovery metadata exposed by every editable target.
Definition EditableTarget.h:39
Stable authoring control point for a 3D spline path.
Definition SplinePathDocument.h:25
Spline authoring settings stored independently from runtime caches.
Definition SplinePathDocument.h:38