VisuTwin Canvas
C++ 3D Engine — Metal Backend
Loading...
Searching...
No Matches
animTrack.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2025-2026 Arnis Lektauers
3#pragma once
4
5#include <cstdint>
6#include <string>
7#include <unordered_map>
8#include <vector>
9
11#include "core/math/vector3.h"
12
13namespace visutwin::canvas
14{
16 {
18 Quaternion rotation = Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
20 bool hasPosition = false;
21 bool hasRotation = false;
22 bool hasScale = false;
23 };
24
25 // AnimData wraps a flat float array + component count.
26 //
27 struct AnimData
28 {
29 int components = 1; // values per element (1=scalar, 3=vec3, 4=quat)
30 std::vector<float> data; // flat float array
31
32 size_t count() const { return components > 0 ? data.size() / static_cast<size_t>(components) : 0; }
33 };
34
35 //
36 enum class AnimInterpolation : uint8_t
37 {
38 STEP = 0, // ANIM_INTERPOLATION_STEP
39 LINEAR = 1, // ANIM_INTERPOLATION_LINEAR
40 CUBIC = 2 // ANIM_INTERPOLATION_CUBIC
41 };
42
43 // AnimCurve links input times → output values for one property of one node.
44 struct AnimCurve
45 {
46 std::string nodeName; // target node name (used by AnimBinder)
47 std::string propertyPath; // "localPosition", "localRotation", "localScale"
48 size_t inputIndex = 0; // index into AnimTrack::_inputs
49 size_t outputIndex = 0; // index into AnimTrack::_outputs
51 };
52
54 {
55 public:
56 AnimTrack() = default;
57 AnimTrack(std::string name, float duration);
58
59 const std::string& name() const { return _name; }
60 void setName(const std::string& value) { _name = value; }
61
62 float duration() const { return _duration; }
63 void setDuration(float value) { _duration = value; }
64
65 // Curve-based API
66 void addCurve(const AnimCurve& curve) { _curves.push_back(curve); }
67 void addInput(const AnimData& input) { _inputs.push_back(input); }
68 void addOutput(const AnimData& output) { _outputs.push_back(output); }
69
70 const std::vector<AnimCurve>& curves() const { return _curves; }
71 const std::vector<AnimData>& inputs() const { return _inputs; }
72 const std::vector<AnimData>& outputs() const { return _outputs; }
73
74 // eval() signature unchanged — AnimClip/AnimEvaluator don't change.
75 void eval(float time, std::unordered_map<std::string, AnimTransform>& transforms) const;
76
77 private:
78 static Vector3 lerpVec3(const Vector3& a, const Vector3& b, float alpha);
79 static Quaternion slerpQuat(const Quaternion& a, const Quaternion& b, float alpha);
80 static float hermite(float t, float p0, float m0, float p1, float m1);
81
82 std::string _name;
83 float _duration = 0.0f;
84 std::vector<AnimCurve> _curves;
85 std::vector<AnimData> _inputs; // keyframe time arrays (shared across curves)
86 std::vector<AnimData> _outputs; // value arrays
87 };
88}
const std::vector< AnimData > & outputs() const
Definition animTrack.h:72
const std::string & name() const
Definition animTrack.h:59
void setDuration(float value)
Definition animTrack.h:63
void setName(const std::string &value)
Definition animTrack.h:60
void addInput(const AnimData &input)
Definition animTrack.h:67
void addCurve(const AnimCurve &curve)
Definition animTrack.h:66
const std::vector< AnimCurve > & curves() const
Definition animTrack.h:70
const std::vector< AnimData > & inputs() const
Definition animTrack.h:71
void eval(float time, std::unordered_map< std::string, AnimTransform > &transforms) const
Definition animTrack.cpp:68
void addOutput(const AnimData &output)
Definition animTrack.h:68
AnimInterpolation interpolation
Definition animTrack.h:50
std::vector< float > data
Definition animTrack.h:30
Unit quaternion for rotation representation with SIMD-accelerated slerp and multiply.
Definition quaternion.h:20
3D vector for positions, directions, and normals with multi-backend SIMD acceleration.
Definition vector3.h:29