载入中...
搜索中...
未找到
MotionRuntime.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
10#include "common/Time.h"
11
12#include <cstdint>
13#include <functional>
14#include <string>
15#include <vector>
16
17namespace eve::animation {
18
28public:
29 using FloatCallback = std::function<void(float)>;
30 using Vec2Callback = std::function<void(MotionVec2)>;
31 using Vec3Callback = std::function<void(MotionVec3)>;
32 using ColorCallback = std::function<void(MotionColor)>;
33 using QuatCallback = std::function<void(MotionQuat)>;
34 using VoidCallback = std::function<void()>;
35
37 struct FloatDesc {
38 float from = 0.f;
39 float to = 0.f;
40 float duration = 0.f;
41 float delay = 0.f;
42 int loops = 1;
43 MotionLoopMode loopMode = MotionLoopMode::Restart;
44 std::string ease = "linear";
45 IMotionFloatSink *sink = nullptr;
49 bool cancelOnError = true;
50 MotionStyle style = MotionStyle::Tween;
51 int frequency = 10;
52 float dampingRatio = 1.f;
53 std::uint32_t seed = 0;
54
55 };
56
57 struct Vec2Desc {
60 float duration = 0.f;
61 float delay = 0.f;
62 int loops = 1;
63 MotionLoopMode loopMode = MotionLoopMode::Restart;
64 std::string ease = "linear";
65 IMotionVec2Sink *sink = nullptr;
69 bool cancelOnError = true;
70 MotionStyle style = MotionStyle::Tween;
71 int frequency = 10;
72 float dampingRatio = 1.f;
73 std::uint32_t seed = 0;
74
75 };
76
77 struct Vec3Desc {
80 float duration = 0.f;
81 float delay = 0.f;
82 int loops = 1;
83 MotionLoopMode loopMode = MotionLoopMode::Restart;
84 std::string ease = "linear";
85 IMotionVec3Sink *sink = nullptr;
89 bool cancelOnError = true;
90 MotionStyle style = MotionStyle::Tween;
91 int frequency = 10;
92 float dampingRatio = 1.f;
93 std::uint32_t seed = 0;
94
95 };
96
97 struct ColorDesc {
100 float duration = 0.f;
101 float delay = 0.f;
102 int loops = 1;
103 MotionLoopMode loopMode = MotionLoopMode::Restart;
104 std::string ease = "linear";
105 IMotionColorSink *sink = nullptr;
109 bool cancelOnError = true;
110 };
111
112 struct QuatDesc {
115 float duration = 0.f;
116 float delay = 0.f;
117 int loops = 1;
118 MotionLoopMode loopMode = MotionLoopMode::Restart;
119 std::string ease = "linear";
120 IMotionQuatSink *sink = nullptr;
124 bool cancelOnError = true;
125 };
126
127
128 MotionRuntime() = default;
129 ~MotionRuntime() = default;
130
131 MotionRuntime(const MotionRuntime &) = delete;
133
138 void ensureFloatCapacity(std::size_t count);
139 void ensureVec2Capacity(std::size_t count);
140 void ensureVec3Capacity(std::size_t count);
141 void ensureColorCapacity(std::size_t count);
142 void ensureQuatCapacity(std::size_t count);
143
145 void ensureCapacity(std::size_t floatCount) { ensureFloatCapacity(floatCount); }
146
147 [[nodiscard]] std::size_t floatCapacity() const noexcept { return floats_.size(); }
148 [[nodiscard]] std::size_t floatFreeCount() const noexcept { return freeFloats_.size(); }
149 [[nodiscard]] std::size_t vec2Capacity() const noexcept { return vec2s_.size(); }
150 [[nodiscard]] std::size_t vec3Capacity() const noexcept { return vec3s_.size(); }
151 [[nodiscard]] std::size_t colorCapacity() const noexcept { return colors_.size(); }
152 [[nodiscard]] std::size_t quatCapacity() const noexcept { return quats_.size(); }
153
154 [[nodiscard]] eve::Result<MotionHandle> spawnFloat(const FloatDesc &desc);
155 [[nodiscard]] eve::Result<MotionHandle> spawnVec2(const Vec2Desc &desc);
156 [[nodiscard]] eve::Result<MotionHandle> spawnVec3(const Vec3Desc &desc);
157 [[nodiscard]] eve::Result<MotionHandle> spawnColor(const ColorDesc &desc);
158 [[nodiscard]] eve::Result<MotionHandle> spawnQuat(const QuatDesc &desc);
159
160 [[nodiscard]] bool isActive(MotionHandle handle) const noexcept;
161 [[nodiscard]] eve::Result<float> floatValue(MotionHandle handle) const;
162 [[nodiscard]] eve::Result<MotionVec2> vec2Value(MotionHandle handle) const;
163 [[nodiscard]] eve::Result<MotionVec3> vec3Value(MotionHandle handle) const;
164 [[nodiscard]] eve::Result<MotionColor> colorValue(MotionHandle handle) const;
165 [[nodiscard]] eve::Result<MotionQuat> quatValue(MotionHandle handle) const;
166
167 [[nodiscard]] eve::Result<void> complete(MotionHandle handle);
168 [[nodiscard]] eve::Result<void> cancel(MotionHandle handle);
169
170 [[nodiscard]] int activeCount() const noexcept;
171 [[nodiscard]] int floatSlotCount() const noexcept { return static_cast<int>(floats_.size()); }
172
173 [[nodiscard]] eve::Result<void> advance(const eve::SimulationStep &step);
174
175 [[nodiscard]] bool hasCurrentTick() const noexcept { return hasLastTick_; }
176 [[nodiscard]] eve::SimulationTick currentTick() const noexcept { return lastTick_; }
177
178private:
179 enum class Phase : std::uint8_t { Inactive, Delayed, Running, Completed, Cancelled };
180
181 template <class Value, class Sink>
182 struct Slot {
183 std::uint32_t generation = 1;
184 Phase phase = Phase::Inactive;
185 Value from{};
186 Value to{};
187 Value current{};
188 float duration = 0.f;
189 float delayLeft = 0.f;
190 float elapsed = 0.f;
191 int loops = 1;
192 int played = 0;
193 MotionLoopMode loopMode = MotionLoopMode::Restart;
194 bool reverse = false;
195 bool cancelOnError = true;
196 MotionStyle style = MotionStyle::Tween;
197 int frequency = 10;
198 float dampingRatio = 1.f;
199 std::uint32_t seed = 0;
200 std::string ease = "linear";
201 Sink *sink = nullptr;
203 std::function<void(Value)> onUpdate;
204 VoidCallback onComplete;
205 VoidCallback onCancel;
206 };
207
208 using FloatSlot = Slot<float, IMotionFloatSink>;
209 using Vec2Slot = Slot<MotionVec2, IMotionVec2Sink>;
210 using Vec3Slot = Slot<MotionVec3, IMotionVec3Sink>;
211 using ColorSlot = Slot<MotionColor, IMotionColorSink>;
212 using QuatSlot = Slot<MotionQuat, IMotionQuatSink>;
213
214 static float lerpFloat(float a, float b, float t) { return a + (b - a) * t; }
215 static MotionVec2 lerpVec2(MotionVec2 a, MotionVec2 b, float t) {
216 return MotionVec2{lerpFloat(a.x, b.x, t), lerpFloat(a.y, b.y, t)};
217 }
218 static MotionVec3 lerpVec3(MotionVec3 a, MotionVec3 b, float t) {
219 return MotionVec3{lerpFloat(a.x, b.x, t), lerpFloat(a.y, b.y, t), lerpFloat(a.z, b.z, t)};
220 }
221
222 static void bumpGeneration(std::uint32_t &generation) {
223 generation = generation == UINT32_MAX ? 1u : generation + 1u;
224 }
225
226 [[nodiscard]] static eve::Diagnostic staleDiag() {
227 return eve::Diagnostic::error(eve::DiagnosticCode::StaleHandle, "MotionHandle is inactive or stale");
228 }
229
230 [[nodiscard]] eve::Result<void> applyFloat(FloatSlot &slot, float linearT, bool fireUpdate);
231 [[nodiscard]] eve::Result<void> applyVec2(Vec2Slot &slot, float linearT, bool fireUpdate);
232 [[nodiscard]] eve::Result<void> applyVec3(Vec3Slot &slot, float linearT, bool fireUpdate);
233 [[nodiscard]] eve::Result<void> applyColor(ColorSlot &slot, float linearT, bool fireUpdate);
234 [[nodiscard]] eve::Result<void> applyQuat(QuatSlot &slot, float linearT, bool fireUpdate);
235
236 [[nodiscard]] eve::Result<void> finishFloat(FloatSlot &slot);
237 [[nodiscard]] eve::Result<void> finishVec2(Vec2Slot &slot);
238 [[nodiscard]] eve::Result<void> finishVec3(Vec3Slot &slot);
239 [[nodiscard]] eve::Result<void> finishColor(ColorSlot &slot);
240 [[nodiscard]] eve::Result<void> finishQuat(QuatSlot &slot);
241
242 [[nodiscard]] eve::Result<void> stepFloat(FloatSlot &slot, float dt);
243 [[nodiscard]] eve::Result<void> stepVec2(Vec2Slot &slot, float dt);
244 [[nodiscard]] eve::Result<void> stepVec3(Vec3Slot &slot, float dt);
245 [[nodiscard]] eve::Result<void> stepColor(ColorSlot &slot, float dt);
246 [[nodiscard]] eve::Result<void> stepQuat(QuatSlot &slot, float dt);
247
254 [[nodiscard]] const FloatSlot *resolveFloat(MotionHandle handle) const;
261 [[nodiscard]] const Vec2Slot *resolveVec2(MotionHandle handle) const;
268 [[nodiscard]] const Vec3Slot *resolveVec3(MotionHandle handle) const;
269
276 [[nodiscard]] const ColorSlot *resolveColor(MotionHandle handle) const;
283 [[nodiscard]] const QuatSlot *resolveQuat(MotionHandle handle) const;
284
285 [[nodiscard]] eve::Result<MotionHandle> occupyFloat(FloatSlot slot);
286 [[nodiscard]] eve::Result<MotionHandle> occupyVec2(Vec2Slot slot);
287 [[nodiscard]] eve::Result<MotionHandle> occupyVec3(Vec3Slot slot);
288 [[nodiscard]] eve::Result<MotionHandle> occupyColor(ColorSlot slot);
289 [[nodiscard]] eve::Result<MotionHandle> occupyQuat(QuatSlot slot);
290
291 void recycleFloat(FloatSlot &slot);
292 void recycleVec2(Vec2Slot &slot);
293 void recycleVec3(Vec3Slot &slot);
294 void recycleColor(ColorSlot &slot);
295 void recycleQuat(QuatSlot &slot);
296
297 [[nodiscard]] static eve::Result<void> validateDesc(float duration, float delay, int loops,
298 const std::string &ease);
299 [[nodiscard]] static eve::Result<void> validateStyle(MotionStyle style, int frequency,
300 float dampingRatio);
301
302 std::vector<FloatSlot> floats_;
303 std::vector<Vec2Slot> vec2s_;
304 std::vector<Vec3Slot> vec3s_;
305 std::vector<ColorSlot> colors_;
306 std::vector<QuatSlot> quats_;
307 std::vector<std::uint32_t> freeFloats_;
308 std::vector<std::uint32_t> freeVec2s_;
309 std::vector<std::uint32_t> freeVec3s_;
310 std::vector<std::uint32_t> freeColors_;
311 std::vector<std::uint32_t> freeQuats_;
313 bool hasLastTick_ = false;
314};
315
316} // namespace eve::animation
float duration
std::string from
float phase
Definition CaveMesh.cpp:58
scene::NodeDesc desc
#define EVENGINE_API_WORLD
Definition Export.h:109
HexCoordinates to
Cell the unit walks towards on this segment.
Definition HexUnits.cpp:64
JobFunc onComplete
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
LitMotion-style typed motion handles, values, and sink interfaces.
std::uint32_t seed
Definition PointSet.cpp:807
std::uint32_t generation
PrimitiveHandle handle
float t
double current
std::uint32_t count
Common time values and an injectable deterministic simulation clock.
float step
Definition TreeMesh.cpp:314
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
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
Move-only operation result carrying either a value or Status.
Definition Result.h:155
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
Push target for a MotionColor motion.
Push target for a float motion. Lifetime is borrowed by MotionRuntime.
Definition MotionTypes.h:84
Push target for a MotionQuat motion.
Push target for a MotionVec2 motion.
Definition MotionTypes.h:96
Push target for a MotionVec3 motion.
Owns typed motion slots and applies SimulationStep updates.
std::function< void(MotionColor)> ColorCallback
std::size_t floatCapacity() const noexcept
std::size_t vec2Capacity() const noexcept
std::function< void(float)> FloatCallback
void ensureCapacity(std::size_t floatCount)
Convenience: ensure float pool capacity (primary hot path).
MotionRuntime & operator=(const MotionRuntime &)=delete
std::function< void(MotionQuat)> QuatCallback
std::size_t quatCapacity() const noexcept
std::size_t floatFreeCount() const noexcept
std::size_t vec3Capacity() const noexcept
eve::SimulationTick currentTick() const noexcept
bool hasCurrentTick() const noexcept
MotionRuntime(const MotionRuntime &)=delete
std::function< void()> VoidCallback
std::function< void(MotionVec2)> Vec2Callback
std::size_t colorCapacity() const noexcept
std::function< void(MotionVec3)> Vec3Callback
static constexpr StrongUint64 zero() noexcept
Returns the zero value for this strong type.
MotionLoopMode
Loop behaviour after a cycle completes.
Definition MotionTypes.h:68
MotionStyle
Evaluation style for a motion slot.
Definition MotionTypes.h:77
std::variant< std::monostate, std::int64_t, double, std::string, bool > Value
Definition Database.h:26
One deterministic fixed-step emitted by SimulationClock.
Definition Time.h:158
Compact RGBA color used by motion adapters.
Definition MotionTypes.h:52
Generation-checked slot identity for a live motion.
Definition MotionTypes.h:20
Compact quaternion used by motion adapters (xyzw).
Definition MotionTypes.h:60
Compact float2 used by motion adapters (avoids graphics math deps).
Definition MotionTypes.h:39
Compact float3 used by motion adapters.
Definition MotionTypes.h:45