OpenMoHAA 0.82.0
Loading...
Searching...
No Matches
skeletor_internal.h
1/*
2===========================================================================
3Copyright (C) 2023 the OpenMoHAA team
4
5This file is part of OpenMoHAA source code.
6
7OpenMoHAA source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12OpenMoHAA source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OpenMoHAA source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22
23// skeletor_internal.h : General skeletor internal structures
24
25#pragma once
26
27#ifdef __cplusplus
28
29class skelAnimStoreFrameList_c;
30
31class skelBone_Base
32{
33public:
34 qboolean m_isDirty;
35
36protected:
37 skelBone_Base *m_parent;
38 SkelMat4 m_cachedValue;
39
40public:
41 float *m_controller;
42
43public:
44 skelBone_Base();
45 virtual ~skelBone_Base();
46
47 SkelMat4 & GetTransform(const skelAnimStoreFrameList_c *frames);
48 virtual SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) = 0;
49 void SetParent(skelBone_Base *parent);
50 virtual void SetBaseValue(boneData_t *boneData);
51 virtual int GetChannelIndex(int num);
52 virtual skelBone_Base *GetBoneRef(int num);
53 static int GetNumChannels(boneType_t boneType);
54 static int GetNumBoneRefs(boneType_t boneType);
55 skelBone_Base *Parent() const;
56 bool OnGround(const skelAnimStoreFrameList_c *frames, float threshold);
57};
58
59class skelBone_World : public skelBone_Base
60{
61public:
62 skelBone_World();
63
64private:
65 SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
66 void SetBaseValue(boneData_t *boneData) override;
67 int GetChannelIndex(int num) override;
68 skelBone_Base *GetBoneRef(int num) override;
69};
70
71class skelBone_Zero : public skelBone_Base
72{
73private:
74 SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
75 void SetBaseValue(boneData_t *boneData) override;
76 int GetChannelIndex(int num) override;
77 skelBone_Base *GetBoneRef(int num) override;
78};
79
80class skelBone_Rotation : public skelBone_Base
81{
82protected:
83 SkelVec3 m_baseValue;
84 int m_quatChannel;
85
86protected:
87 SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
88
89public:
90 void SetChannels(int num);
91 void SetBaseValue(boneData_t *data) override;
92 int GetChannelIndex(int num) override;
93 skelBone_Base *GetBoneRef(int num) override;
94};
95
96class skelBone_PosRot : public skelBone_Base
97{
98protected:
99 int m_quatChannel;
100 int m_offsetChannel;
101
102public:
103
104protected:
105 SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
106
107public:
108 void SetChannels(int quatChannel, int offsetChannel);
109 void SetBaseValue(boneData_t *boneData) override;
110 int GetChannelIndex(int num) override;
111 skelBone_Base *GetBoneRef(int num) override;
112};
113
114class skelBone_Root : public skelBone_PosRot
115{
116public:
117 SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
118};
119
120class skelBone_IKshoulder : public skelBone_Base
121{
122public:
123 class skelBone_IKwrist *m_wrist;
124 float m_upperLength;
125 float m_lowerLength;
126 SkelVec3 m_baseValue;
127 float m_cosElbowAngle;
128 SkelVec3 m_wristPos;
129 SkelQuat m_wristAngle;
130
131 skelBone_IKshoulder();
132
133 SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
134 void SetBaseValue(boneData_t *boneData) override;
135 int GetChannelIndex(int num) override;
136 skelBone_Base *GetBoneRef(int num) override;
137 void SetElbowValue(float elbowOffset);
138 void SetWristValue(float wristOffset);
139 void SetWristBone(skelBone_IKwrist *wrist);
140 float GetUpperLength();
141 float GetLowerLength();
142};
143
144class skelBone_IKelbow : public skelBone_Base
145{
146public:
147 skelBone_IKshoulder *m_shoulder;
148
149public:
150 SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
151 void SetBoneRefs(skelBone_IKshoulder *shoulder);
152 void SetBaseValue(boneData_t *boneData) override;
153 int GetChannelIndex(int num) override;
154 skelBone_Base *GetBoneRef(int num) override;
155};
156
157class skelBone_IKwrist : public skelBone_Base
158{
159public:
160 skelBone_IKshoulder *m_shoulder;
161 int m_quatChannel;
162 int m_offsetChannel;
163
164public:
165 SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frame) override;
166 void SetChannels(int quatChannel, int offsetChannel);
167 void SetBoneRefs(skelBone_IKshoulder *shoulder);
168 void SetBaseValue(boneData_t *boneData) override;
169 int GetChannelIndex(int num) override;
170 skelBone_Base *GetBoneRef(int num) override;
171};
172
173class skelBone_AvRot : public skelBone_Base
174{
175public:
176 SkelVec3 m_basePos;
177 SkelQuat m_cachedQuat;
178 skelBone_Base *m_reference1;
179 skelBone_Base *m_reference2;
180 float m_bone2weight;
181
182public:
183 skelBone_AvRot();
184
185 SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
186 void SetBoneRefs(skelBone_Base *ref1, skelBone_Base *ref2);
187 void SetBaseValue(boneData_t *boneData) override;
188 int GetChannelIndex(int num) override;
189 skelBone_Base *GetBoneRef(int num) override;
190};
191
192class skelBone_HoseRot : public skelBone_Base
193{
194public:
195 SkelVec3 m_basePos;
196 SkelQuat m_cachedQuat;
197 skelBone_Base *m_target;
198 float m_bendRatio;
199 float m_bendMax;
200 float m_spinRatio;
201
202public:
203 SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
204 SkelMat4 & GetDirtyTransform(SkelMat4 &myParentTM, SkelMat4 &targetTM);
205 void SetBoneRefs(skelBone_Base *ref);
206 void SetBaseValue(boneData_t *boneData) override;
207 int GetChannelIndex(int num) override;
208 skelBone_Base *GetBoneRef(int num) override;
209};
210
211class skelBone_HoseRotBoth : public skelBone_HoseRot
212{
213public:
214 SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
215 void SetBaseValue(boneData_t *boneData) override;
216};
217
218class skelBone_HoseRotParent : public skelBone_HoseRot
219{
220public:
221 SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
222 void SetBaseValue(boneData_t *boneData) override;
223};
224
225#else
226
227typedef void *skelBone_Base;
228
229#endif
230
231typedef char skelChannelName_t[32];