载入中...
搜索中...
未找到
ActionTimelineEditor.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
18
19#include <memory>
20#include <optional>
21#include <set>
22#include <string>
23#include <vector>
24
25namespace eve::editor {
26
32
35 unsigned long long timelineRevision = 0;
38 bool includeStart = false;
39 bool reachesEnd = false;
40 std::vector<action::ActionTimelineEvent> events;
41};
42
51public:
53 void clear() noexcept;
55 bool empty() const noexcept;
56
57private:
59
60 struct Item {
62 enum class Kind : std::uint8_t { AnimationSection, Notify, NotifyState };
63 Kind kind = Kind::Notify;
67 action::ActionNotifyState notifyState;
68 };
69
70 std::vector<Item> items_;
71 std::optional<action::ActionTrack> track_;
72};
73
84 public IPropertyProvider,
86public:
91 explicit ActionTimelineTarget(std::string targetId);
94
96 static CapabilityId propertyCapabilityId() { return CapabilityId("eve.editor.target.action-properties"); }
97
99 TargetId targetId() const override { return TargetId(targetId_); }
101 std::uint64_t revision() const override { return revision_; }
103 EditRegion dirtyRegion() const override { return {}; }
105 void clearDirtyRegion() override {}
107 TargetDescriptor describe() const override;
113 void* queryCapability(const CapabilityId& capability) override;
114
116 const action::ActionTimeline& timeline() const noexcept { return timeline_; }
118 [[nodiscard]] Result<void> applyDomainOperation(const DomainOperation& operation) override;
120 [[nodiscard]] std::unique_ptr<IDomainOperationTarget> cloneDomainState() const override;
122 [[nodiscard]] Result<void> commitDomainState(std::unique_ptr<IDomainOperationTarget> candidate) override;
123
124 [[nodiscard]] eve::Result<eve::Revision> currentRevision(const SelectionSnapshot& selection) const override;
125 PropertySchema schema(const SelectionSnapshot& selection) const override;
127 PropertyReadResult read(const SelectionSnapshot& selection, const PropertyPath& path) const override;
129 [[nodiscard]] Result<DomainOperation> makeSet(const SelectionSnapshot& selection, const PropertyPath& path,
130 const EditorValue& value, PropertySetMode mode) const override;
132 [[nodiscard]] Result<DomainOperation> makeReset(const SelectionSnapshot& selection,
133 const PropertyPath& path) const override;
134
136 EditorValue snapshotValue() const override;
138 [[nodiscard]] Result<void> loadSnapshot(const EditorValue& snapshot);
139
140private:
142 bool matches(const SelectionSnapshot& selection) const;
144 [[nodiscard]] Result<DomainOperation> replacement(const action::ActionTimeline& candidate,
145 std::string property) const;
147 [[nodiscard]] Result<void> assign(action::ActionTimeline candidate);
148
149 std::string targetId_;
150 action::ActionTimeline timeline_;
151 unsigned long long revision_ = 0;
152};
153
163public:
173 std::shared_ptr<ActionTimelineClipboard> clipboard);
174
176 const ActionTimelineTarget& target() const noexcept { return target_; }
178 [[nodiscard]] Result<void> reloadDocument(const EditorValue& snapshot);
180 [[nodiscard]] Result<void> configureWorkspace(EditorWorkspace& workspace) const;
182 [[nodiscard]] Result<void> addTrack(action::ActionTrack track);
184 [[nodiscard]] Result<void> removeTrack(const LogicalId& trackId);
186 [[nodiscard]] Result<void> renameTrack(const LogicalId& trackId, std::string label);
188 [[nodiscard]] Result<void> setMontageSettings(action::ActionMontageSettings settings);
190 [[nodiscard]] Result<void> addSectionSplit(Duration time);
192 [[nodiscard]] Result<void> setSectionSplit(std::size_t index, Duration time);
194 [[nodiscard]] Result<void> removeSectionSplit(std::size_t index);
196 [[nodiscard]] Result<void> addAnimationSection(action::ActionAnimationSection section);
198 [[nodiscard]] Result<void> moveAnimationSection(const LogicalId& sectionId, Duration delta);
200 [[nodiscard]] Result<void> resizeAnimationSection(const LogicalId& sectionId, Duration start, Duration end,
201 Duration blendIn);
203 [[nodiscard]] Result<void> editAnimationSection(const LogicalId& sectionId, Duration start, Duration end,
204 Duration blendIn, std::string animationUri);
206 [[nodiscard]] Result<void> editAnimationSectionSource(const LogicalId& sectionId, Duration sourceStart,
207 Duration sourceEnd,
208 action::ActionBlendCurve blendCurve);
210 [[nodiscard]] Result<void> editAnimationSectionFull(action::ActionAnimationSection section);
212 [[nodiscard]] Result<void> removeAnimationSection(const LogicalId& sectionId);
214 [[nodiscard]] Result<void> addNotify(const LogicalId& trackId, action::ActionNotify notify);
216 [[nodiscard]] Result<void> addState(const LogicalId& trackId, action::ActionNotifyState state);
218 [[nodiscard]] Result<void> moveItem(const LogicalId& itemId, Duration delta);
220 [[nodiscard]] Result<void> resizeState(const LogicalId& itemId, Duration start, Duration end);
222 [[nodiscard]] Result<void> updateItem(const LogicalId& itemId, LogicalId type, Value::Object payload);
224 [[nodiscard]] Result<void> addParameterKey(const LogicalId& itemId, action::ActionParameterKey key);
226 [[nodiscard]] Result<void> editParameterKey(const LogicalId& itemId, std::size_t index,
229 [[nodiscard]] Result<void> removeParameterKey(const LogicalId& itemId, std::size_t index);
231 [[nodiscard]] Result<void> editItem(const LogicalId& itemId, Duration start, Duration end, LogicalId type,
234 [[nodiscard]] Result<void> setItemEnabled(const LogicalId& itemId, bool enabled);
236 [[nodiscard]] Result<void> removeItem(const LogicalId& itemId);
238 [[nodiscard]] Result<void> setTrackMuted(const LogicalId& trackId, bool muted);
240 [[nodiscard]] Result<void> setTrackLocked(const LogicalId& trackId, bool locked);
241
243 [[nodiscard]] Result<std::size_t> boxSelect(Duration start, Duration end);
245 void clearSelection() { selection_.clear(); }
247 [[nodiscard]] Result<void> selectItem(const LogicalId& itemId, bool additive = false);
249 std::size_t selectionCount() const noexcept { return selection_.size(); }
251 [[nodiscard]] std::vector<LogicalId> selectedItemIds() const;
253 [[nodiscard]] Result<TimelineSelectionRange> selectionRange() const;
255 [[nodiscard]] Result<void> moveSelection(Duration delta);
257 [[nodiscard]] Result<void> alignSelectionStart();
259 [[nodiscard]] Result<void> alignSelectionEnd();
264 [[nodiscard]] Result<void> scaleSelection(Duration start, Duration end);
266 [[nodiscard]] Result<std::size_t> copySelection();
268 [[nodiscard]] Result<std::size_t> paste(Duration offset);
270 [[nodiscard]] Result<std::size_t> pasteToTrack(const LogicalId& trackId, Duration offset);
272 [[nodiscard]] Result<void> copyTrack(const LogicalId& trackId);
274 [[nodiscard]] Result<LogicalId> pasteTrack();
276 [[nodiscard]] Result<void> deleteSelection();
277
279 [[nodiscard]] Result<TransactionReceipt> undo();
281 [[nodiscard]] Result<TransactionReceipt> redo();
283 bool canUndo() const noexcept { return transactions_.canUndo(); }
285 bool canRedo() const noexcept { return transactions_.canRedo(); }
286
288 void play() noexcept { playing_ = true; }
290 void pause() noexcept { playing_ = false; }
292 [[nodiscard]] Result<void> stop();
298 [[nodiscard]] Result<Duration> frameStepTarget(std::int64_t frames, double frameRate) const;
300 [[nodiscard]] Result<void> stepFrames(std::int64_t frames, double frameRate);
302 [[nodiscard]] Result<void> jumpToEnd();
304 [[nodiscard]] Result<void> seek(Duration time);
306 [[nodiscard]] Result<std::size_t> update(Duration delta);
308 [[nodiscard]] Result<ActionTimelinePreviewPlan> planPreview(Duration delta) const;
310 [[nodiscard]] Result<std::size_t> applyPreviewPlan(ActionTimelinePreviewPlan plan);
312 Duration previewTime() const noexcept { return previewTime_; }
314 bool playing() const noexcept { return playing_; }
316 const std::vector<action::ActionTimelineEvent>& previewEvents() const noexcept { return previewEvents_; }
317
318private:
319 [[nodiscard]] Result<void> commit(action::ActionTimeline candidate, std::string label, std::string mergeKey);
320 [[nodiscard]] static Result<void> rejected(std::string rule, std::string message);
321 [[nodiscard]] LogicalId copiedId(const LogicalId& source, const action::ActionTimeline& candidate);
322 [[nodiscard]] Result<std::size_t> pasteItems(Duration offset, const LogicalId* destinationTrack);
323
324 ActionTimelineTarget target_;
325 LocalWorldAuthority authority_;
326 LocalTransactionBackend transactions_;
327 std::set<std::string> selection_;
328 std::shared_ptr<ActionTimelineClipboard> clipboard_;
329 std::uint64_t transactionSequence_ = 0;
330 std::uint64_t copySequence_ = 0;
331 Duration previewTime_ = Duration::zero();
332 bool playing_ = false;
333 bool previewStarted_ = false;
334 std::vector<action::ActionTimelineEvent> previewEvents_;
335};
336
338enum class ActionTimelineCloseMode : std::uint8_t { ProtectDirty, Discard };
339
346
356public:
359
367
375 [[nodiscard]] Result<DocumentId> open(DocumentKey key, std::string title, std::string resourceUri,
376 action::ActionTimeline initialTimeline);
378 [[nodiscard]] Result<void> activate(const DocumentId& document);
380 [[nodiscard]] Result<DocumentSnapshot> save(const DocumentId& document);
382 [[nodiscard]] Result<DocumentSnapshot> reconcile(const DocumentId& document);
384 [[nodiscard]] Result<void> close(const DocumentId& document, ActionTimelineCloseMode mode);
385
387 [[nodiscard]] Result<std::vector<ActionTimelineTabSnapshot>> tabs() const;
393 ActionTimelineEditor* activeEditor() noexcept;
395 const DocumentId& activeDocument() const noexcept { return activeDocument_; }
396
397private:
398 struct Tab {
399 DocumentId document;
400 std::unique_ptr<ActionTimelineEditor> editor;
401 std::uint64_t synchronizedEditorRevision = 0;
402 std::uint64_t savedEditorRevision = 0;
403 };
404
405 Tab* find(const DocumentId& document);
406 const Tab* find(const DocumentId& document) const;
407 [[nodiscard]] Result<DocumentSnapshot> synchronize(Tab& tab);
408 [[nodiscard]] static Result<action::ActionTimeline> decode(const EditorValue& content);
409
410 DocumentService* documents_ = nullptr;
411 std::shared_ptr<ActionTimelineClipboard> clipboard_ = std::make_shared<ActionTimelineClipboard>();
412 std::vector<Tab> tabs_;
413 DocumentId activeDocument_;
414};
415
416} // namespace eve::editor
ActionParameterOperation operation
double value
Typed continuous parameter-curve action block.
LogicalId trackId
Value::Object payload
bool locked
Duration start
bool animationSection
LogicalId itemId
Versioned, deterministic authoring timeline for gameplay actions.
std::string title
std::string label
#define EVENGINE_API_EDITORS
Definition Export.h:112
std::string message
std::uint32_t key
TokenKind kind
size_t offset
std::string path
Definition PlayHost.cpp:110
std::uint32_t targetId
TerrainThermalSettings settings
uint32_t index
const UnitySourceAsset & source
Signed, fixed-resolution simulation duration in nanoseconds.
Definition Time.h:43
static constexpr Duration zero() noexcept
Return zero duration.
Definition Time.h:60
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
Move-only operation result carrying either a value or Status.
Definition Result.h:155
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
std::map< std::string, Value > Object
Definition Value.h:34
Id128 public API.
Definition Identity.h:112
Optional candidate/publish capability for atomic domain operations.
Editable-target capability that applies owning domain operations.
Optional capability exposing a deterministic, persistence-safe editing snapshot.
UI-independent property access for an immutable selection snapshot.
In-process authority for a single editable runtime or document target.
Dotted property path (layout.size) compared and persisted as text.
Definition EditingIds.h:78
Deterministic owning value tree shared by authoring hosts.
Owning clipboard shared explicitly by one or more action timeline editors.
void clear() noexcept
Remove every copied item and track.
bool empty() const noexcept
Whether neither item nor track content is available.
Multi-document Montage workspace backed by the engine document service.
ActionTimelineDocumentWorkspace(ActionTimelineDocumentWorkspace &&)=default
Action timeline document workspace.
ActionTimelineDocumentWorkspace & operator=(ActionTimelineDocumentWorkspace &&)=default
Operator =.
ActionTimelineDocumentWorkspace(const ActionTimelineDocumentWorkspace &)=delete
Tab editors are uniquely owned; the workspace is move-only.
ActionTimelineDocumentWorkspace & operator=(const ActionTimelineDocumentWorkspace &)=delete
Timeline editing controller shared by developer and in-game editors.
Duration previewTime() const noexcept
Current deterministic preview cursor.
bool canUndo() const noexcept
Whether undo history is non-empty.
std::size_t selectionCount() const noexcept
Number of selected timeline items.
bool canRedo() const noexcept
Whether redo history is non-empty.
const ActionTimelineTarget & target() const noexcept
Borrow the authoritative target.
bool playing() const noexcept
Whether preview transport is playing.
const std::vector< action::ActionTimelineEvent > & previewEvents() const noexcept
Events crossed by the latest preview update.
void pause() noexcept
Pause preview playback.
void play() noexcept
Begin preview playback from the current cursor.
Authoritative editor target for one action timeline asset.
static CapabilityId propertyCapabilityId()
Capability identity published by describe() for Inspector property editing.
EditRegion dirtyRegion() const override
Timeline edits invalidate the semantic surface, not a pixel region.
void clearDirtyRegion() override
No-op for a semantic document target.
TargetId targetId() const override
Stable editor target identity.
const action::ActionTimeline & timeline() const noexcept
Borrow the authoritative timeline until the next mutation.
std::uint64_t revision() const override
Monotonic content revision.
Document coordinator with revision-safe requestSave/executeSave sequencing.
Composition model shared by project-specific developer and runtime editors.
Local transaction coordinator backed by an injected edit authority.
ActionBlendCurve
Built-in deterministic cross-fade curve evaluated without asset callbacks.
PropertySetMode
PropertySetMode public API.
ActionTimelineCloseMode
Dirty-document policy applied when closing one Montage tab.
bool enabled
Objective animation segment placed on the montage presentation lane.
Montage-wide presentation settings persisted with the action timeline.
Typed interval with explicit enter/exit boundaries.
Instantaneous typed event placed on an action track.
One normalized, owning parameter-curve key.
Canonical action timeline asset shared by runtime and editor.
Ordered semantic lane in one action timeline.
DomainOperation public API.
EditRegion public API.
PropertyReadResult public API.
EVENGINE_API_PLATFORM public API.
SelectionSnapshot public API.
Stable discovery metadata exposed by every editable target.
Prepared deterministic preview advance that can be validated before presentation side effects.
std::vector< action::ActionTimelineEvent > events
Immutable projection of one open Montage document tab.
Stable document identity; paths are deliberately excluded.
Immutable document metadata snapshot.
Exact outer time bounds of the current owning timeline selection.