1 /* Copyright (C) 2021 Wildfire Games.
2 * This file is part of 0 A.D.
4 * 0 A.D. is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
9 * 0 A.D. is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
19 * Raw description of a skeleton animation
22 #ifndef INCLUDED_SKELETONANIMDEF
23 #define INCLUDED_SKELETONANIMDEF
25 #include "maths/Vector3D.h"
26 #include "maths/Quaternion.h"
27 #include "lib/file/vfs/vfs_path.h"
32 ////////////////////////////////////////////////////////////////////////////////////////
33 // CBoneState: structure describing state of a bone at some point
37 // translation of bone relative to root
38 CVector3D m_Translation
;
39 // rotation of bone relative to root
40 CQuaternion m_Rotation
;
44 ////////////////////////////////////////////////////////////////////////////////////////
45 // CSkeletonAnimDef: raw description - eg bonestates - of an animation that plays upon
47 class CSkeletonAnimDef
50 // current file version given to saved animations
51 enum { FILE_VERSION
= 1 };
52 // supported file read version - files with a version less than this will be rejected
53 enum { FILE_READ_VERSION
= 1 };
57 // Key: description of a single key in a skeleton animation
58 typedef CBoneState Key
;
61 // CSkeletonAnimDef constructor + destructor
65 // return the number of keys in this animation
66 size_t GetNumKeys() const { return (size_t)m_NumKeys
; }
68 // accessors: get a key for given bone at given time
69 Key
& GetKey(size_t frame
, size_t bone
) { return m_Keys
[frame
*m_NumKeys
+bone
]; }
70 const Key
& GetKey(size_t frame
, size_t bone
) const { return m_Keys
[frame
*m_NumKeys
+bone
]; }
72 // get duration of this anim, in ms
73 float GetDuration() const { return m_NumFrames
*m_FrameTime
; }
75 // return length of each frame, in ms
76 float GetFrameTime() const { return m_FrameTime
; }
77 // return number of frames in animation
78 size_t GetNumFrames() const { return (size_t)m_NumFrames
; }
80 // build matrices for all bones at the given time (in MS) in this animation
81 void BuildBoneMatrices(float time
, CMatrix3D
* matrices
, bool loop
) const;
84 static std::unique_ptr
<CSkeletonAnimDef
> Load(const VfsPath
& filename
);
85 static void Save(const VfsPath
& pathname
, const CSkeletonAnimDef
& anim
);
88 // frame time - time between successive frames, in ms
90 // number of keys in each frame - should match number of bones in the skeleton
92 // number of frames in the animation
94 // animation data - m_NumKeys*m_NumFrames total keys
95 std::vector
<Key
> m_Keys
;
96 // Unique identifier - used by CModelDef to cache bounds per-animDef.
97 // (hopefully we won't run into the u32 limit too soon).