summaryrefslogtreecommitdiff
path: root/src/animation.h
blob: 08ee92aa8de038b11a2531cbff5f6b44e1733a9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#pragma once

#include "darray.h"
#include "defines.h"
#include "maths_types.h"
#include "mem.h"

typedef enum Interpolation {
  INTERPOLATION_STEP,
  INTERPOLATION_LINEAR,
  INTERPOLATION_CUBIC, /** @brief Cubic spline interpolation */
  INTERPOLATION_COUNT
} Interpolation;

typedef enum KeyframeKind {
  KEYFRAME_ROTATION,
  KEYFRAME_TRANSLATION,
  KEYFRAME_SCALE,
  KEYFRAME_WEIGHTS,
} KeyframeKind;

typedef union Keyframe {
  Quat rotation;
  Vec3 translation;
  Vec3 scale;
  f32 weights[4];
} Keyframe;

typedef struct Keyframes {
  KeyframeKind kind;
  Keyframe* values;
  size_t count;
} Keyframes;

typedef struct Joint {
  char* debug_label;  // optional
  Mat4 inverse_bind_matrix;
  Mat4 local_transform;
  Transform transform_components;
} Joint;
#ifndef TYPED_JOINT_ARRAY
KITC_DECL_TYPED_ARRAY(Joint);
#define TYPED_JOINT_ARRAY
#endif

typedef u32 JointIdx;

typedef struct Armature {
  char* label;
  arena arena;
  Joint_darray* joints;
} Armature;

// NOTE: I think we will need to topologically sort the joints to store them in array if we want to
// do linear array traversal
//       when calculating transforms.

typedef struct AnimationSpline {
  f32* timestamps;
  size_t n_timestamps;
  Keyframes values;
  Interpolation interpolation;
} AnimationSpline;

typedef struct AnimationSampler {
  int current_index;
  f32 min;
  f32 max;
  AnimationSpline animation;
} AnimationSampler;

/** @brief Sample an animation at a given time `t` returning an interpolated keyframe */
Keyframe Animation_Sample(AnimationSampler* sampler, f32 t);

typedef struct AnimationClip {
  // A clip contains one or more animation curves
  // for now I think we can just enumerate all of the properties (assuming *only* one per type is in
  // a clip) NULL = this property is not animated in this clip
  AnimationSampler* rotation;
  AnimationSampler* translation;
  AnimationSampler* scale;
  AnimationSampler* weights;
} AnimationClip;
#ifndef TYPED_ANIM_CLIP_ARRAY
KITC_DECL_TYPED_ARRAY(AnimationClip);
#define TYPED_ANIM_CLIP_ARRAY
#endif

typedef struct SkinnedAnimation {
  Mat4* joint_matrices;
  size_t n_joints;
} SkinnedAnimation;

void animation_play(AnimationClip* clip);