载入中...
搜索中...
未找到
AnimationPlayerBindings.cpp
浏览该文件的文档.
1#include <cstdint>
2#include <functional>
3#include <simplesquirrel/simplesquirrel.hpp>
4#include <string>
5
11
12namespace eve::animation {
13namespace {
14
15std::string formatLockAxes(RootMotionLockAxes mask) {
16 const auto bits = static_cast<std::uint8_t>(mask);
17 if (bits == 0) return "none";
18 if (bits == static_cast<std::uint8_t>(RootMotionLockAxes::All)) return "xyz";
19 if (bits == static_cast<std::uint8_t>(RootMotionLockAxes::HorizontalXZ)) return "xz";
20 if (bits == static_cast<std::uint8_t>(RootMotionLockAxes::VerticalY)) return "y";
21 if (bits == static_cast<std::uint8_t>(RootMotionLockAxes::X)) return "x";
22 if (bits == static_cast<std::uint8_t>(RootMotionLockAxes::Z)) return "z";
23 if (bits == static_cast<std::uint8_t>(RootMotionLockAxes::X | RootMotionLockAxes::Y)) return "xy";
24 if (bits == static_cast<std::uint8_t>(RootMotionLockAxes::Y | RootMotionLockAxes::Z)) return "yz";
25 return "xyz";
26}
27
28std::string formatApplySpace(RootMotionApplySpace space) {
29 return space == RootMotionApplySpace::CharacterFacing ? "characterFacing" : "boneLocal";
30}
31
32ssq::Table applyPolicy(HSQUIRRELVM vm, AnimPlayer* self, const RootMotionPolicy& policy) {
33 return script::projectResult(vm, self->setRootMotionPolicy(policy));
34}
35
36} // namespace
37
38void exposeAnimPlayerBindings(ssq::Table& table) {
39 auto player = table.addClass<AnimPlayer>(
40 "AnimPlayer", std::function<AnimPlayer*()>([]() -> AnimPlayer* { return nullptr; }), true);
41 player.addFunc("play", &AnimPlayer::play);
42 player.addFunc("crossFade", &AnimPlayer::crossFade);
43 player.addFunc("stop", &AnimPlayer::stop);
44 player.addFunc("pause", &AnimPlayer::pause);
45 player.addFunc("resume", &AnimPlayer::resume);
46 player.addFunc("setSpeed", &AnimPlayer::setSpeed);
47 player.addFunc("getSpeed", &AnimPlayer::getSpeed);
48 player.addFunc("setTime", &AnimPlayer::setTime);
49 player.addFunc("getTime", &AnimPlayer::getTime);
50 player.addFunc("setLoop", &AnimPlayer::setLoop);
51 player.addFunc("getLoop", &AnimPlayer::getLoop);
52 player.addFunc("isPlaying", &AnimPlayer::isPlaying);
53 player.addFunc("isPaused", &AnimPlayer::isPaused);
54 player.addFunc("getPose", &AnimPlayer::getPose);
55 player.addFunc("getClip", &AnimPlayer::getClip);
56 player.addFunc("setRootMotionBone", &AnimPlayer::setRootMotionBone);
57 player.addFunc("getRootMotionBone", &AnimPlayer::getRootMotionBone);
58 player.addFunc("setRootMotionLockAxes", [vm = table.getHandle()](AnimPlayer* self, const std::string& axes) {
59 auto parsed = parseRootMotionLockAxes(axes);
60 if (!parsed) return script::projectStatusResult(vm, parsed.status());
61 RootMotionPolicy policy = self->getRootMotionPolicy();
62 policy.lockAxes = parsed.value();
63 return applyPolicy(vm, self, policy);
64 });
65 player.addFunc("setRootMotionApplySpace", [vm = table.getHandle()](AnimPlayer* self, const std::string& space) {
66 auto parsed = parseRootMotionApplySpace(space);
67 if (!parsed) return script::projectStatusResult(vm, parsed.status());
68 RootMotionPolicy policy = self->getRootMotionPolicy();
69 policy.applySpace = parsed.value();
70 return applyPolicy(vm, self, policy);
71 });
72 player.addFunc("setBakeRootTranslationIntoPose", [vm = table.getHandle()](AnimPlayer* self, bool enabled) {
73 RootMotionPolicy policy = self->getRootMotionPolicy();
74 policy.bakeTranslationIntoPose = enabled;
75 return applyPolicy(vm, self, policy);
76 });
77 player.addFunc("setBakeRootRotationIntoPose", [vm = table.getHandle()](AnimPlayer* self, bool enabled) {
78 RootMotionPolicy policy = self->getRootMotionPolicy();
79 policy.bakeRotationIntoPose = enabled;
80 return applyPolicy(vm, self, policy);
81 });
82 player.addFunc("setRootMotionLockRotation", [vm = table.getHandle()](AnimPlayer* self, bool enabled) {
83 RootMotionPolicy policy = self->getRootMotionPolicy();
84 policy.lockRotation = enabled;
85 return applyPolicy(vm, self, policy);
86 });
87 player.addFunc("getRootMotionPolicy", [vm = table.getHandle()](AnimPlayer* self) {
88 const RootMotionPolicy policy = self->getRootMotionPolicy();
89 ssq::Table tableOut(vm);
90 tableOut.set("lockAxes", formatLockAxes(policy.lockAxes));
91 tableOut.set("applySpace", formatApplySpace(policy.applySpace));
92 tableOut.set("bakeTranslationIntoPose", policy.bakeTranslationIntoPose);
93 tableOut.set("bakeRotationIntoPose", policy.bakeRotationIntoPose);
94 tableOut.set("lockRotation", policy.lockRotation);
95 tableOut.set("characterYaw", policy.characterYaw);
96 return tableOut;
97 });
98 player.addFunc("setRootMotionCharacterYaw", [vm = table.getHandle()](AnimPlayer* self, float yaw) {
99 return script::projectResult(vm, self->setRootMotionCharacterYaw(yaw));
100 });
101 player.addFunc("getRootMotionX", &AnimPlayer::getRootMotionX);
102 player.addFunc("getRootMotionY", &AnimPlayer::getRootMotionY);
103 player.addFunc("getRootMotionZ", &AnimPlayer::getRootMotionZ);
104 player.addFunc("getRootMotionRotationX", &AnimPlayer::getRootMotionRotationX);
105 player.addFunc("getRootMotionRotationY", &AnimPlayer::getRootMotionRotationY);
106 player.addFunc("getRootMotionRotationZ", &AnimPlayer::getRootMotionRotationZ);
107 player.addFunc("getRootMotionRotationW", &AnimPlayer::getRootMotionRotationW);
108 player.addFunc("consumeEvent", &AnimPlayer::consumeEvent);
109 player.addFunc("setUpdateRate", &AnimPlayer::setUpdateRate);
110 player.addFunc("getUpdateRate", &AnimPlayer::getUpdateRate);
111 player.addFunc("update", &AnimPlayer::update);
112
113 player.addFunc("getEventCount", &AnimPlayer::getEventCount);
114 player.addFunc("getEventName", &AnimPlayer::getEventName);
115 player.addFunc("getEventPayload", &AnimPlayer::getEventPayload);
116 player.addFunc("clearEvents", &AnimPlayer::clearEvents);
117}
118} // namespace eve::animation
int mask
struct SQVM * HSQUIRRELVM
HSQUIRRELVM vm
Definition ECS.cpp:20
The single Squirrel projection for common Result, Status and Value.
Single-clip (or cross-fading) 3D animation player. Script type: AnimPlayer.
Definition AnimPlayer.h:30
void setSpeed(float speed)
Sets the speed.
float getRootMotionRotationW() const
Returns the root motion rotation w.
Definition AnimPlayer.h:124
std::string getEventName(int index) const override
Name of a dispatched event, or empty for invalid index.
void setTime(float seconds)
Sets the time.
float getRootMotionRotationY() const
Returns the root motion rotation y.
Definition AnimPlayer.h:120
void setRootMotionBone(int boneIndex)
Select the bone whose per-frame motion is extracted (default 0).
float getTime() const
Returns the time.
Definition AnimPlayer.h:67
float getSpeed() const
Returns the speed.
Definition AnimPlayer.h:63
void clearEvents()
Clear currently dispatched events. update() also clears them at frame start.
Definition AnimPlayer.h:139
float getRootMotionY() const
Returns the root motion y.
Definition AnimPlayer.h:114
std::string consumeEvent()
Pop the oldest notify crossed since the previous update.
void setLoop(bool loop)
Sets the loop.
Definition AnimPlayer.h:69
void update(float dt)
Legacy seconds facade retained for scripts and old callers.
float getUpdateRate() const
Returns the update rate.
Definition AnimPlayer.h:130
void crossFade(AnimClip *clip, float blendSeconds)
Cross-fade to clip over blendSeconds (keeps sampling previous until done).
bool isPaused() const
True when paused.
Definition AnimPlayer.h:79
int getRootMotionBone() const
Returns the root motion bone.
Definition AnimPlayer.h:95
std::string getEventPayload(int index) const override
Payload of a dispatched event, or empty for invalid index.
int getEventCount() const override
Number of events crossed by the most recent play/update call.
Definition AnimPlayer.h:133
float getRootMotionX() const
Controller-facing translation X after policy filtering (BoneLocal or CharacterFacing).
Definition AnimPlayer.h:112
float getRootMotionRotationX() const
Returns the root motion rotation x.
Definition AnimPlayer.h:118
bool getLoop() const
Returns the loop.
float getRootMotionRotationZ() const
Returns the root motion rotation z.
Definition AnimPlayer.h:122
AnimPose * getPose() override
Borrowed pointer accessor. @ownership Borrowed @lifetime Valid while the owning animation object rema...
void setUpdateRate(float hz)
Limit pose evaluation frequency for animation LOD; 0 updates every call.
bool isPlaying() const
True when playing.
Definition AnimPlayer.h:77
AnimClip * getClip() const
Borrow the selected clip, or null if none is selected. The caller owns the clip and must keep it aliv...
Definition AnimPlayer.h:86
float getRootMotionZ() const
Returns the root motion z.
Definition AnimPlayer.h:116
void play(AnimClip *clip)
Play.
RootMotionLockAxes
Per-axis translation locks for extracted root-motion deltas.
void exposeAnimPlayerBindings(ssq::Table &table)
Register playback, sampling and event inspection for AnimPlayer.
RootMotionApplySpace
Coordinate space used when publishing root-motion translation.
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
bool enabled