载入中...
搜索中...
未找到
AnimationRootMotionPreviewSource.cpp
浏览该文件的文档.
2
6#include "common/Diagnostic.h"
7#include "common/Exception.h"
8
9#include <limits>
10#include <string>
11
12namespace eve::editor {
13namespace {
14
15Result<std::vector<action::ActionPreviewPoint3>> sampleError(DiagnosticCode code, std::string message,
16 std::string path = {}) {
17 return Result<std::vector<action::ActionPreviewPoint3>>::failure(
19}
20
21} // namespace
22
24 std::string_view animationUri, Duration duration, std::uint32_t sampleCount) const {
25 if (animationUri.empty())
26 return sampleError(DiagnosticCode::InvalidArgument, "Animation URI must not be empty", "animationUri");
28 return sampleError(DiagnosticCode::InvalidArgument, "Preview duration must be non-negative", "duration");
29 if (sampleCount < 2 || sampleCount > 1024)
30 return sampleError(DiagnosticCode::InvalidArgument, "Root-motion sample count must be between 2 and 1024",
31 "sampleCount");
32 if (rootBone_ > static_cast<std::uint32_t>(std::numeric_limits<int>::max()))
33 return sampleError(DiagnosticCode::InvalidArgument, "Root-bone index exceeds the animation API range",
34 "rootBone");
35
36 const std::string uri(animationUri);
38 if (clips.empty())
39 return sampleError(DiagnosticCode::NotFound, "No registered animation clip matches the preview URI", uri);
40 if (clips.size() != 1)
41 return sampleError(DiagnosticCode::Conflict, "Preview URI resolves to more than one animation clip", uri);
42
43 animation::AnimClip* clip = clips.front();
44 if (!clip) return sampleError(DiagnosticCode::StaleHandle, "Animation registry returned a stale clip", uri);
45 const int rootBone = static_cast<int>(rootBone_);
46 if (rootBone >= clip->getTrackCount())
47 return sampleError(DiagnosticCode::InvalidArgument, "Root-bone track is not present in the animation clip",
48 "rootBone");
49
50 std::vector<action::ActionPreviewPoint3> path;
51 path.reserve(sampleCount);
53 try {
54 for (std::uint32_t index = 0; index < sampleCount; ++index) {
55 const double alpha = static_cast<double>(index) / static_cast<double>(sampleCount - 1);
56 const float sampleTime = static_cast<float>(duration.seconds() * alpha);
57 clip->sample(sampleTime, &pose);
58 const auto& root = pose.local(rootBone);
59 path.push_back({root.px, root.py, root.pz});
60 }
61 } catch (const Exception&) {
62 return sampleError(DiagnosticCode::Failed, "Animation clip failed while sampling root motion", uri);
63 }
64 return Result<std::vector<action::ActionPreviewPoint3>>::success(std::move(path));
65}
66
67} // namespace eve::editor
float duration
int root
Definition AnimSmr.cpp:119
Optional AnimClip-backed root-motion preview adapter.
eve::EntitySpatialPose pose
Stable, structured diagnostics shared by engine modules.
std::string message
DiagnosticCode code
glm::vec4 clip
std::string path
Definition PlayHost.cpp:110
std::string uri
uint32_t index
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Signed, fixed-resolution simulation duration in nanoseconds.
Definition Time.h:43
static constexpr Duration zero() noexcept
Return zero duration.
Definition Time.h:60
EVENGINE_API_FOUNDATION public API.
Definition Exception.h:13
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static std::vector< AnimClip * > findByPath(const std::string &path)
Clips registered under a path; may be empty.
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
Result< std::vector< action::ActionPreviewPoint3 > > sampleRootMotion(std::string_view animationUri, Duration duration, std::uint32_t sampleCount) const override
Resolve one registered clip and sample its root track across the requested action duration.
DiagnosticCode
Stable machine-readable diagnostic codes.
Definition Diagnostic.h:47