Foundation
Loading...
Searching...
No Matches
Animation.hpp
Go to the documentation of this file.
1#pragma once
2#include <Core/Container.hpp>
3#include <Math/Math.hpp>
4#include "Mesh.hpp"
5
6using namespace Foundation;
7using namespace Core;
8using namespace Math;
9
10// Flat, topologically sorted joint hierarchy (parent < self): one forward pass yields world matrices.
11struct FJoint
12{
13 int32_t parent{-1};
15 quat restRotation{0, 0, 0, 1};
16 float3 restScale{1, 1, 1};
17 mat4 inverseBind{1.0f}; // identity for pure articulation nodes
18};
19
21{
22 FUUID id{};
24 explicit FSkeleton(Allocator* alloc = GLOBAL_ALLOC) : joints(alloc) {}
25 [[nodiscard]] uint32_t Count() const { return static_cast<uint32_t>(joints.size()); }
26};
27
28enum class FAnimPath : uint8_t { Translation, Rotation, Scale };
29enum class FAnimInterp : uint8_t { Step, Linear, CubicSpline };
30
31// Component-major keyframes: Translation/Scale = 3 floats/key, Rotation = 4 (xyzw). Cubic = [in,value,out]*comp.
41
42// TRS channels driving one skeleton; @ref skeleton is kNilUUID for a degenerate (no-op) clip.
52
53// Per-skeleton evaluation scratch: seeded from rest, overwritten by clips, accumulated into globals.
54struct FPose
55{
60 explicit FPose(Allocator* alloc = GLOBAL_ALLOC)
61 : translations(alloc), rotations(alloc), scales(alloc), globals(alloc)
62 {
63 }
64 void Resize(uint32_t jointCount);
65};
66
67[[nodiscard]] mat4 JointLocalMatrix(float3 const& t, quat const& r, float3 const& s);
68void ResetToRest(FSkeleton const& skel, FPose& pose);
69void SampleClip(FAnimationClip const& clip, float t, FPose& pose);
70void BlendClip(FAnimationClip const& clip, float t, float weight, FPose& pose);
71void ComputeGlobals(FSkeleton const& skel, FPose& pose);
72void ComputeSkinningMatrices(FSkeleton const& skel, FPose const& pose, Span<mat4> outPalette);
73
74// CPU LBS fallback / validation path; GPU skinning is the primary deformation route.
76 Span<FQVertex> out, FSerializedBounds* outBounds = nullptr);
#define GLOBAL_ALLOC
Definition Allocator.hpp:240
FAnimInterp
Definition Animation.hpp:29
FAnimPath
Definition Animation.hpp:28
void SampleClip(FAnimationClip const &clip, float t, FPose &pose)
Definition Animation.cpp:102
void ResetToRest(FSkeleton const &skel, FPose &pose)
Definition Animation.cpp:91
void SkinVertices(Span< const FVertex > bind, Span< const FSkinBinding > binding, Span< const mat4 > palette, Span< FQVertex > out, FSerializedBounds *outBounds=nullptr)
Definition Animation.cpp:169
void ComputeSkinningMatrices(FSkeleton const &skel, FPose const &pose, Span< mat4 > outPalette)
Definition Animation.cpp:161
mat4 JointLocalMatrix(float3 const &t, quat const &r, float3 const &s)
Definition Animation.cpp:78
void BlendClip(FAnimationClip const &clip, float t, float weight, FPose &pose)
Definition Animation.cpp:118
void ComputeGlobals(FSkeleton const &skel, FPose &pose)
Definition Animation.cpp:148
Allocator interface (noexcept)
Definition Allocator.hpp:29
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::span< T > Span
Alias for std::span
Definition Container.hpp:62
vec3 float3
Definition Math.hpp:26
Definition Allocator.hpp:6
Definition Animation.hpp:33
Vector< float > times
Definition Animation.hpp:37
FAnimPath path
Definition Animation.hpp:35
FAnimChannel(Allocator *alloc=GLOBAL_ALLOC)
Definition Animation.hpp:39
uint32_t joint
Definition Animation.hpp:34
FAnimInterp interp
Definition Animation.hpp:36
Vector< float > values
Definition Animation.hpp:38
Definition Animation.hpp:44
FUUID name
Definition Animation.hpp:46
FAnimationClip(Allocator *alloc=GLOBAL_ALLOC)
Definition Animation.hpp:50
FUUID skeleton
Definition Animation.hpp:49
float duration
Definition Animation.hpp:48
Vector< FAnimChannel > channels
Definition Animation.hpp:47
Definition Animation.hpp:12
int32_t parent
Definition Animation.hpp:13
float3 restTranslation
Definition Animation.hpp:14
float3 restScale
Definition Animation.hpp:16
quat restRotation
Definition Animation.hpp:15
mat4 inverseBind
Definition Animation.hpp:17
Definition Animation.hpp:55
Vector< mat4 > globals
Definition Animation.hpp:59
FPose(Allocator *alloc=GLOBAL_ALLOC)
Definition Animation.hpp:60
Vector< quat > rotations
Definition Animation.hpp:57
Vector< float3 > scales
Definition Animation.hpp:58
Vector< float3 > translations
Definition Animation.hpp:56
void Resize(uint32_t jointCount)
Definition Animation.cpp:83
Definition Metadata.hpp:14
Definition Animation.hpp:21
FSkeleton(Allocator *alloc=GLOBAL_ALLOC)
Definition Animation.hpp:24
Vector< FJoint > joints
Definition Animation.hpp:23
uint32_t Count() const
Definition Animation.hpp:25
128-bit identifier. Two flavors, both well-formed per RFC 9562:
Definition UUID.hpp:35