载入中...
搜索中...
未找到
AnimationClipEditor.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
15
16#include <cstdint>
17#include <string>
18#include <vector>
19
20namespace eve::animation {
21class AnimClip;
22class AnimSkeleton;
23}
24
25namespace eve::animation_editor {
26
38public:
40 explicit AnimationClipEditor(std::string targetId);
41
59 const animation::AnimSkeleton& skeleton) const;
60
63
65 const animation_editing::AnimationClipDocumentTarget& target() const noexcept { return target_; }
66
71 [[nodiscard]] animation_editing::Result<void> configureWorkspace(editor::EditorWorkspace& workspace) const;
72
79 [[nodiscard]] animation_editing::Result<void> setViewport(float width, float rowHeight, float labelWidth);
80
81 [[nodiscard]] animation_editing::Result<void> seekSeconds(double seconds);
82 [[nodiscard]] animation_editing::Result<void> seekX(float x);
83 [[nodiscard]] animation_editing::Result<void> pointerDown(float x, float y);
84 [[nodiscard]] animation_editing::Result<void> selectBone(std::string bone);
85 [[nodiscard]] animation_editing::Result<void> setMaskWeight(double weight);
90 [[nodiscard]] animation_editing::Result<void> setDuration(double duration);
95 [[nodiscard]] animation_editing::Result<void> setSampleRate(double sampleRate);
97 [[nodiscard]] animation_editing::Result<void> setLoop(bool loop);
99 [[nodiscard]] animation_editing::Result<void> keySelectedBone();
101 [[nodiscard]] animation_editing::Result<void> deleteSelectedKey();
103 [[nodiscard]] animation_editing::Result<void> setSelectedPosition(double x, double y, double z);
105 [[nodiscard]] animation_editing::Result<void> setSelectedRotation(double xDegrees, double yDegrees,
106 double zDegrees);
108 [[nodiscard]] animation_editing::Result<void> setSelectedScale(double x, double y, double z);
109 [[nodiscard]] animation_editing::Result<void> moveSelectedKey(double time);
110
113
114 void play() noexcept;
116 void pause() noexcept;
118 void stop() noexcept;
120 [[nodiscard]] animation_editing::Result<void> update(double deltaSeconds);
121
122 bool canUndo() const noexcept { return transactions_.canUndo(); }
124 bool canRedo() const noexcept { return transactions_.canRedo(); }
126 bool isPlaying() const noexcept { return playing_; }
128 std::uint64_t revision() const noexcept { return target_.revision(); }
130 double duration() const noexcept { return target_.duration(); }
132 double sampleRate() const noexcept { return target_.sampleRate(); }
134 bool isLooping() const noexcept { return target_.isLooping(); }
136 double playhead() const noexcept { return playhead_; }
138 float layoutWidth() const noexcept { return viewportWidth_; }
140 float layoutHeight() const noexcept;
142 float playheadX() const noexcept;
144 std::string selectedBone() const { return selectedBone_; }
146 double selectedMaskWeight() const;
148 bool hasSelectedKey() const noexcept { return !selectedKeyId_.empty(); }
150 double selectedKeyTime() const;
152 double selectedPositionX() const;
154 double selectedPositionY() const;
156 double selectedPositionZ() const;
158 double selectedRotationX() const;
160 double selectedRotationY() const;
162 double selectedRotationZ() const;
164 double selectedScaleX() const;
166 double selectedScaleY() const;
168 double selectedScaleZ() const;
170 int boneCount() const noexcept;
172 std::string boneName(int index) const;
174 std::string boneParent(int index) const;
175
177 int trackCount() const;
179 std::string trackBone(int index) const;
181 std::string trackId(int index) const;
183 bool isTrackSelected(int index) const;
185 int keyCount() const;
187 float keyX(int index) const;
189 float keyY(int index) const;
191 bool isKeySelected(int index) const;
193 int eventCount() const;
195 float eventX(int index) const;
197 std::string eventName(int index) const;
198
200 int primitiveCount() const;
202 std::string primitiveKind(int index) const;
204 float primitiveX(int index) const;
206 float primitiveY(int index) const;
208 float primitiveDirX(int index) const;
210 float primitiveDirY(int index) const;
212 float primitiveLength(int index) const;
214 float primitiveRadius(int index) const;
216 float primitiveR(int index) const;
218 float primitiveG(int index) const;
220 float primitiveB(int index) const;
221
223 const animation_editing::AnimationClipPreview& preview() const noexcept { return preview_; }
224
225private:
226 struct SkeletonBone {
227 std::string name;
228 std::string parent;
229 };
230 struct TimelineKey {
232 std::string bone;
233 int keyIndex = 0;
234 double time = 0.0;
235 int row = 0;
236 };
237
238 [[nodiscard]] animation_editing::Result<void> commit(
239 animation_editing::Result<animation_editing::DomainOperation> operation, std::string label);
240 [[nodiscard]] animation_editing::Result<void> refreshPreview();
241 [[nodiscard]] animation_editing::Result<void> updateSelectedTransform(
242 const animation_editing::AnimationTransformKey& value, std::string label);
243 [[nodiscard]] animation_editing::AnimationTransformKey sampledSelectedTransform() const;
244 void seedPreviewClip();
245 std::vector<std::string> skeletonBones() const;
246 std::string skeletonParent(const std::string& bone) const;
247 float timeToX(double time) const;
248 double xToTime(float x) const;
250 const eve::editing::GizmoPrimitive* primitiveAt(int index) const;
251 std::vector<TimelineKey> flattenKeys() const;
252
253 animation_editing::AnimationClipDocumentTarget target_;
254 editor::LocalWorldAuthority authority_;
255 editor::LocalTransactionBackend transactions_;
256 animation_editing::SkeletonOverlayBuilder overlayBuilder_;
257 animation_editing::AnimationClipPreview preview_;
259 std::string selectedBone_ = "Hips";
260 animation_editing::StableId selectedKeyTrack_;
261 animation_editing::StableId selectedKeyId_;
262 std::uint64_t txSequence_ = 0;
263 double playhead_ = 0.0;
264 bool playing_ = false;
265 float viewportWidth_ = 800.0f;
266 float rowHeight_ = 36.0f;
267 float labelWidth_ = 120.0f;
268 std::vector<SkeletonBone> skeleton_;
269};
270
271} // namespace eve::animation_editor
ActionParameterOperation operation
double value
LogicalId trackId
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
float duration
std::string label
#define EVENGINE_API_EDITORS
Definition Export.h:112
glm::vec4 clip
std::uint32_t width
std::uint32_t bone
std::int32_t parent
std::string name
std::uint32_t targetId
uint32_t index
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
Keyframed skeletal animation clip (local TRS tracks per bone). Script type: AnimClip.
Definition AnimClip.h:145
3D bone hierarchy + bind-pose local TRS for skeletal animation. Independent of ik::Skeleton3D (FABRIK...
UI-neutral animation clip document with reversible stable-id timeline edits.
Timeline-style controller for one authored animation clip.
double duration() const noexcept
Duration.
animation_editing::Result< void > loadRuntimeClip(const animation::AnimSkeleton &skeleton, const animation::AnimClip &clip)
Atomically replace the editor document from a real runtime skeleton and clip.
bool isLooping() const noexcept
True when looping.
double playhead() const noexcept
Playhead.
std::uint64_t revision() const noexcept
Revision.
animation_editing::Result< void > writeRuntimeClip(animation::AnimClip &clip, const animation::AnimSkeleton &skeleton) const
Replace a runtime clip with the current authoritative editor document.
double sampleRate() const noexcept
Sample rate.
AnimationClipEditor(const AnimationClipEditor &)=delete
AnimationClipEditor & operator=(const AnimationClipEditor &)=delete
float layoutWidth() const noexcept
Layout width.
bool hasSelectedKey() const noexcept
True when selected key.
const animation_editing::AnimationClipDocumentTarget & target() const noexcept
Borrow the authoritative clip document.
bool isPlaying() const noexcept
True when playing.
Composition model shared by project-specific developer and runtime editors.
Renderer-neutral wire primitive for authoring viewport overlays.
Immutable revision-tagged overlay snapshot consumed by any viewport renderer.