forked from farbrausch/fr_public
-
Notifications
You must be signed in to change notification settings - Fork 0
/
animbase.h
240 lines (177 loc) · 6.01 KB
/
animbase.h
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
// This code is in the public domain. See LICENSE for details.
#ifndef __animbase_h_
#define __animbase_h_
#include "types.h"
#include "curve.h"
#include "tool.h"
#include <list>
#include <vector>
#include <map>
namespace fr
{
class streamWrapper;
}
class frCurveContainer
{
public:
class opCurves
{
public:
opCurves();
opCurves(sU32 opID);
sU32 addCurve(sInt param);
fr::fCurveGroup *getCurve(sU32 curveID);
sInt getAnimIndex(sU32 curveID);
void deleteCurve(sU32 curveID);
void evaluate(sU32 curveID, sF32 time);
void ref(sU32 curveID);
void unRef(sU32 curveID);
void applyBasePoses() const;
void updateBasePose(sInt param);
private:
struct curve
{
curve()
: param(0), refs(1)
{
}
curve(sInt parm, sInt nChannels);
fr::sharedPtr<fr::fCurveGroup> grp;
sInt param;
sUInt refs;
};
typedef std::map<sU32, curve> curveMap;
typedef curveMap::const_iterator curveMapCIt;
typedef curveMap::iterator curveMapIt;
sU32 m_opID;
sU32 m_curveNdx;
curveMap m_curves;
friend fr::streamWrapper &operator << (fr::streamWrapper &strm, frCurveContainer &cont);
friend class frCurveContainer;
};
frCurveContainer();
void clear();
opCurves &getOperatorCurves(sU32 opID);
void deleteOperatorCurves(sU32 opID);
void applyBasePoses(sU32 opID) const;
void applyAllBasePoses() const;
void fixOldAnimIndices();
void updateBasePose(sU32 opID, sInt param);
private:
typedef std::map<sU32, opCurves> opCurveMap;
typedef opCurveMap::const_iterator opCurveMapCIt;
typedef opCurveMap::iterator opCurveMapIt;
opCurveMap m_opCurves;
friend fr::streamWrapper &operator << (fr::streamWrapper &strm, frCurveContainer &cont);
};
fr::streamWrapper &operator << (fr::streamWrapper &strm, frCurveContainer &cont);
class frAnimationClip
{
public:
frAnimationClip(sU32 id=0);
frAnimationClip(const frAnimationClip &x);
~frAnimationClip();
// access
inline const fr::string &getName() const { return m_name; }
sBool setName(const fr::string &name);
void setID(const sU32 ID);
// elements
void addElement(sInt start, sU32 opID, sU32 curveID); // add (fcurve) element
void addElement(sInt start, sU32 trackID, const fr::string &clipName); // add subclip
void deleteElement(sInt ind);
void deleteElementsReferringClip(sU32 clipID);
void cleanup();
// evaluate
void evaluate(sF32 time) const;
void evaluateRange(sF32 start, sF32 end) const;
void applyBasePoses() const;
// length
sInt getLength() const { return m_length; }
sU32 getID() const { return m_ID; }
sF32 getStart() const { return m_start; }
void setStart(sF32 start) { m_start=start; }
sBool isSimple() const { return m_elements.size() == 1 && m_elements.front().type==0; }
void updateLength();
struct element
{
sInt relStart; // relative start (ms)
sInt len; // length (ms); this is just a cache
sInt type; // 0=fcurve 1=clip
sU32 id; // op/clip ID
sU32 curveID; // curve ID (fcurve only)
sInt trackID; // track ID (this is symbolic)
bool operator < (const element &x) const
{
if (trackID<x.trackID)
return true;
else if (trackID>x.trackID)
return false;
if (relStart<x.relStart)
return true;
return false;
}
bool operator == (const element &x) const
{
return (relStart==x.relStart && type==x.type && id==x.id && curveID==x.curveID && trackID==x.trackID);
}
bool operator != (const element &x) const
{
return !(*this==x);
}
element();
element(const element &x);
~element();
element &operator =(const element &x);
void updateLen();
};
typedef std::vector<element> elementList;
typedef elementList::const_iterator elementListCIt;
typedef elementList::iterator elementListIt;
elementList m_elements;
private:
fr::string m_name;
sU32 m_ID;
sInt m_length;
sF32 m_start; // start offset (edit only)
friend fr::streamWrapper &operator << (fr::streamWrapper &strm, frAnimationClip &clip);
};
fr::streamWrapper &operator << (fr::streamWrapper &strm, frAnimationClip &clip);
class frClipContainer
{
public:
frClipContainer();
// clip management
frAnimationClip *findClipByName(const fr::string &name);
const frAnimationClip *findClipByName(const fr::string &name) const;
void clear();
sU32 addClip();
sU32 addSimpleClip(sU32 op, sInt param);
void deleteOperatorClips(sU32 opID);
void deleteClip(sU32 clipID);
frAnimationClip *getClip(sU32 id);
const frAnimationClip *getClip(sU32 id) const;
void updateClipLength(sU32 id);
private:
class strCompare
{
public:
bool operator ()(const fr::string &s1, const fr::string &s2) const
{
return s1.compare(s2, sTRUE)<0;
}
};
typedef std::map<sU32, frAnimationClip> clipMap;
typedef clipMap::const_iterator clipMapCIt;
typedef clipMap::iterator clipMapIt;
clipMap m_clips;
sU32 m_clipIDCounter;
void operator =(const frAnimationClip &x) {}
friend fr::streamWrapper &operator << (fr::streamWrapper &strm, frClipContainer &cont);
public:
typedef std::map<fr::string, sU32, strCompare> nameMap;
typedef nameMap::const_iterator nameMapCIt;
typedef nameMap::iterator nameMapIt;
nameMap m_names;
};
fr::streamWrapper &operator << (fr::streamWrapper &strm, frClipContainer &cont);
#endif