载入中...
搜索中...
未找到
AnimationClipEditor.cpp
浏览该文件的文档.
21animation_editing::Result<T> editorError(animation_editing::EditorStatus status, std::string rule,
23 return eve::editing::failed<T>(status, animation_editing::RuleId(std::move(rule)), std::move(message));
26animation_editing::EditorValue keyValue(const char* id, double time, double px, double py, double pz) {
52animation_editing::Result<void> AnimationClipEditor::loadRuntimeClip(const animation::AnimSkeleton& skeleton,
65 for (int key = 0; key < clip.getPositionKeyCount(bone); ++key) times.insert(clip.getPositionKeyTime(bone, key));
66 for (int key = 0; key < clip.getRotationKeyCount(bone); ++key) times.insert(clip.getRotationKeyTime(bone, key));
67 for (int key = 0; key < clip.getScaleKeyCount(bone); ++key) times.insert(clip.getScaleKeyTime(bone, key));
74 {"id", "runtime-key:" + std::to_string(bone) + ":" + std::to_string(keyIndex++)}, {"time", time},
75 {"px", static_cast<double>(pose.getLocalPositionX(bone))}, {"py", static_cast<double>(pose.getLocalPositionY(bone))},
76 {"pz", static_cast<double>(pose.getLocalPositionZ(bone))}, {"rx", static_cast<double>(pose.getLocalRotationX(bone))},
77 {"ry", static_cast<double>(pose.getLocalRotationY(bone))}, {"rz", static_cast<double>(pose.getLocalRotationZ(bone))},
78 {"rw", static_cast<double>(pose.getLocalRotationW(bone))}, {"sx", static_cast<double>(pose.getLocalScaleX(bone))},
79 {"sy", static_cast<double>(pose.getLocalScaleY(bone))}, {"sz", static_cast<double>(pose.getLocalScaleZ(bone))}});
81 tracks.push_back(trackValue(("runtime-track:" + std::to_string(bone)).c_str(), name.c_str(), std::move(keys)));
85 root["settings"] = animation_editing::EditorValue::Object{{"duration", static_cast<double>(clip.getDuration())},
117 tracks.push_back(trackValue("chest-track", "Chest", {keyValue("chest-start", 0.0, 0.0, 1.7, 0.0), keyValue("chest-end", 2.0, 2.0, 1.8, 0.0)}));
118 tracks.push_back(trackValue("head-track", "Head", {keyValue("head-start", 0.0, 0.0, 2.25, 0.0), keyValue("head-end", 2.0, 2.0, 2.3, 0.0)}));
119 tracks.push_back(trackValue("left-arm-track", "LeftArm", {keyValue("left-arm-start", 0.0, -0.55, 1.75, 0.0), keyValue("left-arm-end", 2.0, 1.45, 1.65, 0.0)}));
120 tracks.push_back(trackValue("right-arm-track", "RightArm", {keyValue("right-arm-start", 0.0, 0.55, 1.75, 0.0), keyValue("right-arm-end", 2.0, 2.55, 1.85, 0.0)}));
127 masks.push_back(animation_editing::EditorValue::Object{{"bone", std::string("Hips")}, {"weight", 1.0}});
128 masks.push_back(animation_editing::EditorValue::Object{{"bone", std::string("Spine")}, {"weight", 1.0}});
132 animation_editing::EditorValue::Object{{"duration", 2.0}, {"sampleRate", 30.0}, {"loop", true}};
172 return editorError(animation_editing::EditorStatus::Rejected, "editor.animation.workspace-conflict",
225 const float dy = y - (static_cast<float>(keys[static_cast<std::size_t>(i)].row) * rowHeight_ + rowHeight_ * 0.5f);
256 return commit(target_.makeSetSettings(duration, target_.sampleRate(), target_.isLooping()), "Set clip duration");
260 return commit(target_.makeSetSettings(target_.duration(), sampleRate, target_.isLooping()), "Set clip sample rate");
264 return commit(target_.makeSetSettings(target_.duration(), target_.sampleRate(), loop), "Set clip loop");
292 result.positionX = bone.positionX; result.positionY = bone.positionY; result.positionZ = bone.positionZ;
293 result.rotationX = bone.rotationX; result.rotationY = bone.rotationY; result.rotationZ = bone.rotationZ; result.rotationW = bone.rotationW;
309 inserted.id = animation_editing::StableId("key." + selectedBone_ + "." + std::to_string(++txSequence_));
324 return editorError(animation_editing::EditorStatus::NotFound, "editor.animation.no-selected-key", "No key is selected");
347 inserted.id = animation_editing::StableId("key." + selectedBone_ + "." + std::to_string(++txSequence_));
352 auto replacement = value; replacement.id = key->id; replacement.time = key->time; *key = replacement;
358 return editorError(animation_editing::EditorStatus::NotFound, "editor.animation.track-missing", "Selected bone has no editable transform track");
361animation_editing::Result<void> AnimationClipEditor::setSelectedPosition(double x, double y, double z) {
363 return editorError(animation_editing::EditorStatus::Rejected, "editor.animation.position", "Position must be finite");
368animation_editing::Result<void> AnimationClipEditor::setSelectedRotation(double xd, double yd, double zd) {
370 return editorError(animation_editing::EditorStatus::Rejected, "editor.animation.rotation", "Rotation must be finite");
379animation_editing::Result<void> AnimationClipEditor::setSelectedScale(double x, double y, double z) {
380 if (!std::isfinite(x) || !std::isfinite(y) || !std::isfinite(z) || x <= 0.0 || y <= 0.0 || z <= 0.0)
397 return editorError(begun.code(), "editor.animation.begin", "Could not begin the animation clip transaction");
462 return editorError(sampled.status, "editor.animation.preview", "Could not sample the animation clip pose");
481 auto overlay = overlayBuilder_.build(target_.targetId().value(), animation_editing::Revision(target_.revision()),
508double AnimationClipEditor::selectedPositionX() const { return sampledSelectedTransform().positionX; }
509double AnimationClipEditor::selectedPositionY() const { return sampledSelectedTransform().positionY; }
510double AnimationClipEditor::selectedPositionZ() const { return sampledSelectedTransform().positionZ; }
514double AnimationClipEditor::selectedRotationX() const { const auto q=sampledSelectedTransform(); return std::atan2(2*(q.rotationW*q.rotationX+q.rotationY*q.rotationZ),1-2*(q.rotationX*q.rotationX+q.rotationY*q.rotationY))*180/std::numbers::pi; }
515double AnimationClipEditor::selectedRotationY() const { const auto q=sampledSelectedTransform(); return std::asin(std::clamp(2*(q.rotationW*q.rotationY-q.rotationZ*q.rotationX),-1.0,1.0))*180/std::numbers::pi; }
516double AnimationClipEditor::selectedRotationZ() const { const auto q=sampledSelectedTransform(); return std::atan2(2*(q.rotationW*q.rotationZ+q.rotationX*q.rotationY),1-2*(q.rotationY*q.rotationY+q.rotationZ*q.rotationZ))*180/std::numbers::pi; }
517int AnimationClipEditor::boneCount() const noexcept { return static_cast<int>(skeletonBones().size()); }
518std::string AnimationClipEditor::boneName(int index) const { const auto bones=skeletonBones(); return index >= 0 && static_cast<std::size_t>(index) < bones.size() ? bones[static_cast<std::size_t>(index)] : std::string{}; }
519std::string AnimationClipEditor::boneParent(int index) const { return skeletonParent(boneName(index)); }
521int AnimationClipEditor::trackCount() const { return static_cast<int>(target_.tracks().size()); }
535bool AnimationClipEditor::isTrackSelected(int index) const { return trackBone(index) == selectedBone_; }
548 return static_cast<float>(keys[static_cast<std::size_t>(index)].row) * rowHeight_ + rowHeight_ * 0.5f;
559int AnimationClipEditor::eventCount() const { return static_cast<int>(target_.events().size()); }
573int AnimationClipEditor::primitiveCount() const { return static_cast<int>(overlay_.primitives.size()); }
UI-neutral animation clip editor: workspace, pose scrub, dope sheet, undo.
void ignore(std::string_view reason={}) const noexcept
Explicitly discard this result after documenting the reason.
Definition Result.h:537
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
bool empty() const noexcept
True when no compatibility spelling has been assigned.
Definition Identity.h:374
Keyframed skeletal animation clip (local TRS tracks per bone). Script type: AnimClip.
Definition AnimClip.h:145
Evaluated local (and optional world) pose for an AnimSkeleton. Script type: AnimPose.
Definition AnimPose.h:17
3D bone hierarchy + bind-pose local TRS for skeletal animation. Independent of ik::Skeleton3D (FABRIK...
Definition AnimSkeleton.h:16
Result< DomainOperation > makeSetSettings(double duration, double sampleRate, bool loop) const override
Make set settings.
Definition AnimationClip.cpp:243
Result< DomainOperation > makeSetMask(const AnimationMaskEntry &mask) const override
Make set mask.
Definition AnimationClip.cpp:299
AnimationClipPreview preview(double time, const std::vector< std::string > &skeletonBones={}) const
Sample the authored clip without mutating a runtime asset.
Definition AnimationClip.cpp:328
std::vector< AnimationEventRecord > events() const
Return event markers ordered by time then stable id.
Definition AnimationClip.cpp:312
Result< void > loadSnapshot(const EditorValue &snapshot)
Atomically load deterministic schema-version-one clip data.
Definition AnimationClip.cpp:372
std::vector< AnimationBoneTrack > tracks() const
Return tracks ordered by stable id.
Definition AnimationClip.cpp:308
Result< DomainOperation > makeSetTrack(const AnimationBoneTrack &track) const override
Make set track.
Definition AnimationClip.cpp:263
editing::GizmoSnapshot build(std::string target, Revision revision, const std::vector< SkeletonOverlayBone > &bones, const SkeletonOverlayOptions &options={}) const
Build a deterministic overlay or structured hierarchy/value diagnostics.
Definition SkeletonOverlay.cpp:57
animation_editing::Result< void > setDuration(double duration)
Commit clip duration through the document transaction path.
Definition AnimationClipEditor.cpp:255
animation_editing::Result< void > update(double deltaSeconds)
Advance playhead by injected dt and refresh pose/overlay.
Definition AnimationClipEditor.cpp:435
animation_editing::Result< void > setMaskWeight(double weight)
Definition AnimationClipEditor.cpp:251
void play() noexcept
Definition AnimationClipEditor.cpp:428
bool isTrackSelected(int index) const
True when track selected.
Definition AnimationClipEditor.cpp:535
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.
animation_editing::Result< void > setSelectedScale(double x, double y, double z)
Replace the selected bone scale at the playhead and create a key when needed.
Definition AnimationClipEditor.cpp:379
animation_editing::Result< void > setSelectedRotation(double xDegrees, double yDegrees, double zDegrees)
Replace the selected bone Euler rotation in degrees and create a key when needed.
Definition AnimationClipEditor.cpp:368
AnimationClipEditor(std::string targetId)
Construct a seeded two-bone preview clip.
Definition AnimationClipEditor.cpp:41
animation_editing::Result< void > seekSeconds(double seconds)
Definition AnimationClipEditor.cpp:194
animation_editing::Result< void > writeRuntimeClip(animation::AnimClip &clip, const animation::AnimSkeleton &skeleton) const
Replace a runtime clip with the current authoritative editor document.
animation_editing::Result< void > deleteSelectedKey()
Delete the selected transform key.
Definition AnimationClipEditor.cpp:322
animation_editing::Result< void > moveSelectedKey(double time)
Definition AnimationClipEditor.cpp:267
animation_editing::Result< void > seekX(float x)
Definition AnimationClipEditor.cpp:203
animation_editing::Result< void > selectBone(std::string bone)
Definition AnimationClipEditor.cpp:243
animation_editing::Result< editor::TransactionReceipt > undo()
Definition AnimationClipEditor.cpp:410
animation_editing::Result< void > setLoop(bool loop)
Commit looping through the document transaction path.
Definition AnimationClipEditor.cpp:263
animation_editing::Result< void > setSampleRate(double sampleRate)
Commit authored sample rate through the document transaction path.
Definition AnimationClipEditor.cpp:259
animation_editing::Result< void > keySelectedBone()
Insert or replace a transform key for the selected bone at the playhead.
Definition AnimationClipEditor.cpp:300
animation_editing::Result< void > configureWorkspace(editor::EditorWorkspace &workspace) const
Install Skeleton / Pose Preview / Inspector / Dope panels.
Definition AnimationClipEditor.cpp:152
animation_editing::Result< void > setViewport(float width, float rowHeight, float labelWidth)
Configure dope-sheet pixel layout.
Definition AnimationClipEditor.cpp:182
animation_editing::Result< void > setSelectedPosition(double x, double y, double z)
Replace the selected bone position at the playhead and create a key when needed.
Definition AnimationClipEditor.cpp:361
animation_editing::Result< void > pointerDown(float x, float y)
Definition AnimationClipEditor.cpp:210
animation_editing::Result< editor::TransactionReceipt > redo()
Definition AnimationClipEditor.cpp:419
Deterministic owning value tree shared by authoring hosts.
Definition EditingValue.h:19
Composition model shared by project-specific developer and runtime editors.
Definition EditorWorkspace.h:43
bool setPanelContext(const std::string &id, const std::string &context)
Attach a semantic input context such as scene, graph, or timeline.
Definition EditorWorkspace.cpp:137
Result< WorkspacePanelDescriptor > registerPanel(WorkspacePanelDescriptor descriptor)
Register a checked owning panel descriptor.
Definition EditorWorkspace.cpp:48
Result< WorkspacePanelDescriptor > activatePanel(const StableId &id)
Activate a visible panel with structured not-found/rejected results.
Definition EditorWorkspace.cpp:169
bool setPanelCapability(const std::string &id, const std::string &capability)
Attach a capability requirement used by the host when filtering panels.
Definition EditorWorkspace.cpp:128
Result< TransactionReceipt > commit() override
Preflight and commit all active operations through the authority.
Definition EditorTransactionService.cpp:74
Result< TransactionId > begin(TransactionSpec specification) override
Begin a transaction with a stable id and base revision.
Definition EditorTransactionService.cpp:60
Result< TransactionReceipt > undo() override
Compensate the most recent committed transaction.
Definition EditorTransactionService.cpp:82
Result< void > discard() override
Discard the active, not-yet-committed operation list.
Definition EditorTransactionService.cpp:76
Result< TransactionReceipt > redo() override
Reapply the most recently compensated transaction.
Definition EditorTransactionService.cpp:84
Result< void > append(DomainOperation operation) override
Append an operation to the active transaction without applying it.
Definition EditorTransactionService.cpp:68
WidgetDesc row(std::vector< WidgetDesc > children, std::string id)
Horizontal elastic layout row.
Definition Widget.cpp:679
Definition Container.h:602
std::vector< AnimationSampledBone > bones
Definition AnimationClip.h:63
One stable transform key used by the animation timeline.
Definition AnimationClip.h:20
double rotationY
Definition AnimationClip.h:24
double positionX
Definition AnimationClip.h:23
double rotationZ
Definition AnimationClip.h:24
double positionY
Definition AnimationClip.h:23
double rotationX
Definition AnimationClip.h:24
double positionZ
Definition AnimationClip.h:23
double rotationW
Definition AnimationClip.h:24
Immutable renderer-neutral world-space bone snapshot.
Definition SkeletonOverlay.h:25
Renderer-neutral wire primitive for authoring viewport overlays.
Definition EditingGizmo.h:12
std::vector< GizmoPrimitive > primitives
Definition EditingGizmo.h:31