[Gameplay] Reduce loom cost
[0ad.git] / source / graphics / SkeletonAnimDef.h
blob9c43ab840524a8c0b7f96774a47b596cc6bc420b
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"
29 #include <memory>
30 #include <vector>
32 ////////////////////////////////////////////////////////////////////////////////////////
33 // CBoneState: structure describing state of a bone at some point
34 class CBoneState
36 public:
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
46 // a skeleton
47 class CSkeletonAnimDef
49 public:
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 };
56 public:
57 // Key: description of a single key in a skeleton animation
58 typedef CBoneState Key;
60 public:
61 // CSkeletonAnimDef constructor + destructor
62 CSkeletonAnimDef();
63 ~CSkeletonAnimDef();
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;
83 // anim I/O functions
84 static std::unique_ptr<CSkeletonAnimDef> Load(const VfsPath& filename);
85 static void Save(const VfsPath& pathname, const CSkeletonAnimDef& anim);
87 public:
88 // frame time - time between successive frames, in ms
89 float m_FrameTime;
90 // number of keys in each frame - should match number of bones in the skeleton
91 size_t m_NumKeys;
92 // number of frames in the animation
93 size_t m_NumFrames;
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).
98 u32 m_UID;
101 #endif