rev |
line source |
nuclear@1
|
1 #include <assert.h>
|
nuclear@1
|
2 #include <algorithm>
|
nuclear@1
|
3 #include "xform_node.h"
|
nuclear@47
|
4 #include "anim/anim.h"
|
nuclear@47
|
5 #include "anim/track.h"
|
nuclear@47
|
6
|
nuclear@47
|
7 using namespace g3dimpl;
|
nuclear@1
|
8
|
nuclear@1
|
9 static inline anm_interpolator track_interpolator(Interp in);
|
nuclear@1
|
10 static inline anm_extrapolator track_extrapolator(Extrap ex);
|
nuclear@1
|
11
|
nuclear@1
|
12 XFormNode::XFormNode()
|
nuclear@1
|
13 {
|
nuclear@1
|
14 anm = new anm_node;
|
nuclear@1
|
15 anm_init_node(anm);
|
nuclear@47
|
16 parent = 0;
|
nuclear@30
|
17
|
nuclear@47
|
18 // TODO read them from anm to get the correct initial values
|
nuclear@47
|
19 interp = INTERP_LINEAR;
|
nuclear@47
|
20 extrap = EXTRAP_EXTEND;
|
nuclear@1
|
21 }
|
nuclear@1
|
22
|
nuclear@1
|
23 XFormNode::~XFormNode()
|
nuclear@1
|
24 {
|
nuclear@1
|
25 anm_destroy_node(anm);
|
nuclear@1
|
26 delete anm;
|
nuclear@1
|
27 }
|
nuclear@1
|
28
|
nuclear@47
|
29 struct anm_node *XFormNode::get_libanim_node() const
|
nuclear@47
|
30 {
|
nuclear@47
|
31 return anm;
|
nuclear@47
|
32 }
|
nuclear@47
|
33
|
nuclear@1
|
34 void XFormNode::set_name(const char *name)
|
nuclear@1
|
35 {
|
nuclear@1
|
36 anm_set_node_name(anm, name);
|
nuclear@1
|
37 }
|
nuclear@1
|
38
|
nuclear@1
|
39 const char *XFormNode::get_name() const
|
nuclear@1
|
40 {
|
nuclear@1
|
41 return anm_get_node_name(anm);
|
nuclear@1
|
42 }
|
nuclear@1
|
43
|
nuclear@1
|
44 void XFormNode::set_interpolator(Interp in)
|
nuclear@1
|
45 {
|
nuclear@1
|
46 anm_set_interpolator(anm, track_interpolator(in));
|
nuclear@1
|
47 interp = in;
|
nuclear@1
|
48 }
|
nuclear@1
|
49
|
nuclear@1
|
50 Interp XFormNode::get_interpolator() const
|
nuclear@1
|
51 {
|
nuclear@1
|
52 return interp;
|
nuclear@1
|
53 }
|
nuclear@1
|
54
|
nuclear@1
|
55 void XFormNode::set_extrapolator(Extrap ex)
|
nuclear@1
|
56 {
|
nuclear@1
|
57 anm_set_extrapolator(anm, track_extrapolator(ex));
|
nuclear@1
|
58 extrap = ex;
|
nuclear@1
|
59 }
|
nuclear@1
|
60
|
nuclear@1
|
61 Extrap XFormNode::get_extrapolator() const
|
nuclear@1
|
62 {
|
nuclear@1
|
63 return extrap;
|
nuclear@1
|
64 }
|
nuclear@1
|
65
|
nuclear@47
|
66 XFormNode *XFormNode::get_parent()
|
nuclear@47
|
67 {
|
nuclear@47
|
68 return parent;
|
nuclear@47
|
69 }
|
nuclear@47
|
70
|
nuclear@47
|
71 const XFormNode *XFormNode::get_parent() const
|
nuclear@47
|
72 {
|
nuclear@47
|
73 return parent;
|
nuclear@47
|
74 }
|
nuclear@47
|
75
|
nuclear@1
|
76 void XFormNode::add_child(XFormNode *child)
|
nuclear@1
|
77 {
|
nuclear@66
|
78 if(!child || child == this) return;
|
nuclear@66
|
79
|
nuclear@1
|
80 children.push_back(child);
|
nuclear@1
|
81 anm_link_node(anm, child->anm);
|
nuclear@30
|
82 child->parent = this;
|
nuclear@1
|
83 }
|
nuclear@1
|
84
|
nuclear@1
|
85 void XFormNode::remove_child(XFormNode *child)
|
nuclear@1
|
86 {
|
nuclear@1
|
87 std::vector<XFormNode*>::iterator it;
|
nuclear@1
|
88 it = std::find(children.begin(), children.end(), child);
|
nuclear@1
|
89 if(it != children.end()) {
|
nuclear@1
|
90 children.erase(it);
|
nuclear@1
|
91 anm_unlink_node(anm, child->anm);
|
nuclear@47
|
92
|
nuclear@47
|
93 if(child->parent == this) {
|
nuclear@47
|
94 child->parent = 0;
|
nuclear@47
|
95 }
|
nuclear@1
|
96 }
|
nuclear@1
|
97 }
|
nuclear@1
|
98
|
nuclear@1
|
99 int XFormNode::get_children_count() const
|
nuclear@1
|
100 {
|
nuclear@1
|
101 return (int)children.size();
|
nuclear@1
|
102 }
|
nuclear@1
|
103
|
nuclear@1
|
104 XFormNode *XFormNode::get_child(int idx)
|
nuclear@1
|
105 {
|
nuclear@1
|
106 if(idx >= 0 && idx < get_children_count()) {
|
nuclear@1
|
107 return children[idx];
|
nuclear@1
|
108 }
|
nuclear@1
|
109 return 0;
|
nuclear@1
|
110 }
|
nuclear@1
|
111
|
nuclear@1
|
112 const XFormNode *XFormNode::get_child(int idx) const
|
nuclear@1
|
113 {
|
nuclear@1
|
114 if(idx >= 0 && idx < get_children_count()) {
|
nuclear@1
|
115 return children[idx];
|
nuclear@1
|
116 }
|
nuclear@1
|
117 return 0;
|
nuclear@1
|
118 }
|
nuclear@1
|
119
|
nuclear@47
|
120
|
nuclear@47
|
121 void XFormNode::use_animation(int idx)
|
nuclear@30
|
122 {
|
nuclear@47
|
123 if(idx >= 0) {
|
nuclear@47
|
124 anm_use_animation(anm, idx);
|
nuclear@47
|
125 }
|
nuclear@30
|
126 }
|
nuclear@30
|
127
|
nuclear@47
|
128 void XFormNode::use_animation(const char *name)
|
nuclear@47
|
129 {
|
nuclear@47
|
130 anm_use_animation(anm, anm_find_animation(anm, name));
|
nuclear@47
|
131 }
|
nuclear@47
|
132
|
nuclear@47
|
133 void XFormNode::use_animation(int aidx, int bidx, float t)
|
nuclear@47
|
134 {
|
nuclear@47
|
135 anm_use_animations(anm, aidx, bidx, t);
|
nuclear@47
|
136 }
|
nuclear@47
|
137
|
nuclear@47
|
138 void XFormNode::use_animation(const char *aname, const char *bname, float t)
|
nuclear@47
|
139 {
|
nuclear@47
|
140 int aidx = anm_find_animation(anm, aname);
|
nuclear@47
|
141 int bidx = anm_find_animation(anm, bname);
|
nuclear@47
|
142
|
nuclear@47
|
143 if(aidx == -1) {
|
nuclear@47
|
144 use_animation(bidx);
|
nuclear@47
|
145 }
|
nuclear@47
|
146 if(bidx == -1) {
|
nuclear@47
|
147 use_animation(aidx);
|
nuclear@47
|
148 }
|
nuclear@47
|
149 anm_use_animations(anm, aidx, bidx, t);
|
nuclear@47
|
150 }
|
nuclear@47
|
151
|
nuclear@47
|
152 int XFormNode::get_active_animation_index(int which) const
|
nuclear@47
|
153 {
|
nuclear@47
|
154 return anm_get_active_animation_index(anm, which);
|
nuclear@47
|
155 }
|
nuclear@47
|
156
|
nuclear@47
|
157 float XFormNode::get_active_animation_mix() const
|
nuclear@47
|
158 {
|
nuclear@47
|
159 return anm_get_active_animation_mix(anm);
|
nuclear@47
|
160 }
|
nuclear@47
|
161
|
nuclear@47
|
162 int XFormNode::get_animation_count() const
|
nuclear@47
|
163 {
|
nuclear@47
|
164 return anm_get_animation_count(anm);
|
nuclear@47
|
165 }
|
nuclear@47
|
166
|
nuclear@47
|
167 void XFormNode::add_animation(const char *name)
|
nuclear@47
|
168 {
|
nuclear@47
|
169 int idx = get_animation_count();
|
nuclear@47
|
170
|
nuclear@47
|
171 anm_add_animation(anm);
|
nuclear@47
|
172 use_animation(idx);
|
nuclear@47
|
173
|
nuclear@47
|
174 if(name) {
|
nuclear@47
|
175 set_animation_name(name);
|
nuclear@47
|
176 }
|
nuclear@47
|
177 }
|
nuclear@47
|
178
|
nuclear@47
|
179 void XFormNode::set_animation_name(const char *name)
|
nuclear@47
|
180 {
|
nuclear@47
|
181 anm_set_active_animation_name(anm, name);
|
nuclear@47
|
182 }
|
nuclear@47
|
183
|
nuclear@47
|
184 const char *XFormNode::get_animation_name() const
|
nuclear@47
|
185 {
|
nuclear@47
|
186 return anm_get_active_animation_name(anm);
|
nuclear@47
|
187 }
|
nuclear@47
|
188
|
nuclear@48
|
189 static const int track_type_base[] = {ANM_TRACK_POS_X, ANM_TRACK_ROT_X, ANM_TRACK_SCL_X};
|
nuclear@48
|
190 static const int track_type_nelem[] = {3, 4, 3};
|
nuclear@47
|
191
|
nuclear@48
|
192 int XFormNode::get_key_count(int trackid) const
|
nuclear@48
|
193 {
|
nuclear@48
|
194 struct anm_animation *anim = anm_get_active_animation(anm, 0);
|
nuclear@48
|
195 return anim->tracks[track_type_base[trackid]].count;
|
nuclear@48
|
196 }
|
nuclear@48
|
197
|
nuclear@48
|
198 int XFormNode::get_position_key_count() const
|
nuclear@48
|
199 {
|
nuclear@48
|
200 return get_key_count(POSITION_TRACK);
|
nuclear@48
|
201 }
|
nuclear@48
|
202
|
nuclear@48
|
203 int XFormNode::get_rotation_key_count() const
|
nuclear@48
|
204 {
|
nuclear@48
|
205 return get_key_count(ROTATION_TRACK);
|
nuclear@48
|
206 }
|
nuclear@48
|
207
|
nuclear@48
|
208 int XFormNode::get_scaling_key_count() const
|
nuclear@48
|
209 {
|
nuclear@48
|
210 return get_key_count(SCALING_TRACK);
|
nuclear@48
|
211 }
|
nuclear@48
|
212
|
nuclear@48
|
213 long XFormNode::get_key_time(int trackid, int idx) const
|
nuclear@48
|
214 {
|
nuclear@48
|
215 struct anm_animation *anim = anm_get_active_animation(anm, 0);
|
nuclear@48
|
216 struct anm_keyframe *key = anm_get_keyframe(anim->tracks + track_type_base[trackid], idx);
|
nuclear@48
|
217 return ANM_TM2MSEC(key->time);
|
nuclear@48
|
218 }
|
nuclear@48
|
219
|
nuclear@48
|
220 long XFormNode::get_position_key_time(int idx) const
|
nuclear@48
|
221 {
|
nuclear@48
|
222 return get_key_time(POSITION_TRACK, idx);
|
nuclear@48
|
223 }
|
nuclear@48
|
224
|
nuclear@48
|
225 long XFormNode::get_rotation_key_time(int idx) const
|
nuclear@48
|
226 {
|
nuclear@48
|
227 return get_key_time(ROTATION_TRACK, idx);
|
nuclear@48
|
228 }
|
nuclear@48
|
229
|
nuclear@48
|
230 long XFormNode::get_scaling_key_time(int idx) const
|
nuclear@48
|
231 {
|
nuclear@48
|
232 return get_key_time(SCALING_TRACK, idx);
|
nuclear@48
|
233 }
|
nuclear@48
|
234
|
nuclear@48
|
235 int XFormNode::get_key_value(int trackid, int idx, float *val) const
|
nuclear@48
|
236 {
|
nuclear@48
|
237 struct anm_animation *anim = anm_get_active_animation(anm, 0);
|
nuclear@48
|
238
|
nuclear@48
|
239 int nelem = track_type_nelem[trackid];
|
nuclear@48
|
240 for(int i=0; i<nelem; i++) {
|
nuclear@48
|
241 struct anm_keyframe *key = anm_get_keyframe(anim->tracks + track_type_base[trackid] + i, idx);
|
nuclear@48
|
242 val[i] = key->val;
|
nuclear@48
|
243 }
|
nuclear@48
|
244 return nelem;
|
nuclear@48
|
245 }
|
nuclear@48
|
246
|
nuclear@48
|
247 Vector3 XFormNode::get_position_key_value(int idx) const
|
nuclear@48
|
248 {
|
nuclear@48
|
249 float val[3];
|
nuclear@48
|
250 get_key_value(POSITION_TRACK, idx, val);
|
nuclear@48
|
251 return Vector3(val[0], val[1], val[2]);
|
nuclear@48
|
252 }
|
nuclear@48
|
253
|
nuclear@48
|
254 Quaternion XFormNode::get_rotation_key_value(int idx) const
|
nuclear@48
|
255 {
|
nuclear@48
|
256 float val[4];
|
nuclear@48
|
257 get_key_value(ROTATION_TRACK, idx, val);
|
nuclear@48
|
258 return Quaternion(val[3], val[0], val[1], val[2]);
|
nuclear@48
|
259 }
|
nuclear@48
|
260
|
nuclear@48
|
261 Vector3 XFormNode::get_scaling_key_value(int idx) const
|
nuclear@48
|
262 {
|
nuclear@48
|
263 float val[3];
|
nuclear@48
|
264 get_key_value(SCALING_TRACK, idx, val);
|
nuclear@48
|
265 return Vector3(val[0], val[1], val[2]);
|
nuclear@48
|
266 }
|
nuclear@47
|
267
|
nuclear@1
|
268 void XFormNode::set_position(const Vector3 &pos, long tmsec)
|
nuclear@1
|
269 {
|
nuclear@1
|
270 anm_set_position(anm, v3_cons(pos.x, pos.y, pos.z), ANM_MSEC2TM(tmsec));
|
nuclear@1
|
271 }
|
nuclear@1
|
272
|
nuclear@1
|
273 Vector3 XFormNode::get_node_position(long tmsec) const
|
nuclear@1
|
274 {
|
nuclear@1
|
275 vec3_t p = anm_get_node_position(anm, ANM_MSEC2TM(tmsec));
|
nuclear@1
|
276 return Vector3(p.x, p.y, p.z);
|
nuclear@1
|
277 }
|
nuclear@1
|
278
|
nuclear@1
|
279 void XFormNode::set_rotation(const Quaternion &quat, long tmsec)
|
nuclear@1
|
280 {
|
nuclear@1
|
281 anm_set_rotation(anm, quat_cons(quat.s, quat.v.x, quat.v.y, quat.v.z), ANM_MSEC2TM(tmsec));
|
nuclear@1
|
282 }
|
nuclear@1
|
283
|
nuclear@1
|
284 Quaternion XFormNode::get_node_rotation(long tmsec) const
|
nuclear@1
|
285 {
|
nuclear@1
|
286 quat_t q = anm_get_node_rotation(anm, ANM_MSEC2TM(tmsec));
|
nuclear@1
|
287 return Quaternion(q.w, q.x, q.y, q.z);
|
nuclear@1
|
288 }
|
nuclear@1
|
289
|
nuclear@1
|
290 void XFormNode::set_scaling(const Vector3 &pos, long tmsec)
|
nuclear@1
|
291 {
|
nuclear@1
|
292 anm_set_scaling(anm, v3_cons(pos.x, pos.y, pos.z), ANM_MSEC2TM(tmsec));
|
nuclear@1
|
293 }
|
nuclear@1
|
294
|
nuclear@1
|
295 Vector3 XFormNode::get_node_scaling(long tmsec) const
|
nuclear@1
|
296 {
|
nuclear@1
|
297 vec3_t s = anm_get_node_scaling(anm, ANM_MSEC2TM(tmsec));
|
nuclear@1
|
298 return Vector3(s.x, s.y, s.z);
|
nuclear@1
|
299 }
|
nuclear@1
|
300
|
nuclear@1
|
301 // these take hierarchy into account
|
nuclear@1
|
302 Vector3 XFormNode::get_position(long tmsec) const
|
nuclear@1
|
303 {
|
nuclear@1
|
304 vec3_t v = anm_get_position(anm, ANM_MSEC2TM(tmsec));
|
nuclear@1
|
305 return Vector3(v.x, v.y, v.z);
|
nuclear@1
|
306 }
|
nuclear@1
|
307
|
nuclear@1
|
308 Quaternion XFormNode::get_rotation(long tmsec) const
|
nuclear@1
|
309 {
|
nuclear@1
|
310 quat_t q = anm_get_rotation(anm, tmsec);
|
nuclear@1
|
311 return Quaternion(q.w, q.x, q.y, q.z);
|
nuclear@1
|
312 }
|
nuclear@1
|
313
|
nuclear@1
|
314 Vector3 XFormNode::get_scaling(long tmsec) const
|
nuclear@1
|
315 {
|
nuclear@1
|
316 vec3_t v = anm_get_scaling(anm, ANM_MSEC2TM(tmsec));
|
nuclear@1
|
317 return Vector3(v.x, v.y, v.z);
|
nuclear@1
|
318 }
|
nuclear@1
|
319
|
nuclear@1
|
320 void XFormNode::set_pivot(const Vector3 &pivot)
|
nuclear@1
|
321 {
|
nuclear@1
|
322 anm_set_pivot(anm, v3_cons(pivot.x, pivot.y, pivot.z));
|
nuclear@1
|
323 }
|
nuclear@1
|
324
|
nuclear@1
|
325 Vector3 XFormNode::get_pivot() const
|
nuclear@1
|
326 {
|
nuclear@1
|
327 vec3_t p = anm_get_pivot(anm);
|
nuclear@1
|
328 return Vector3(p.x, p.y, p.z);
|
nuclear@1
|
329 }
|
nuclear@1
|
330
|
nuclear@1
|
331 void XFormNode::set_local_matrix(const Matrix4x4 &mat)
|
nuclear@1
|
332 {
|
nuclear@1
|
333 local_matrix = mat;
|
nuclear@1
|
334 }
|
nuclear@1
|
335
|
nuclear@1
|
336 const Matrix4x4 &XFormNode::get_local_matrix() const
|
nuclear@1
|
337 {
|
nuclear@1
|
338 return local_matrix;
|
nuclear@1
|
339 }
|
nuclear@1
|
340
|
nuclear@1
|
341 void XFormNode::set_bone_matrix(const Matrix4x4 &bmat)
|
nuclear@1
|
342 {
|
nuclear@1
|
343 bone_matrix = bmat;
|
nuclear@1
|
344 }
|
nuclear@1
|
345
|
nuclear@1
|
346 const Matrix4x4 &XFormNode::get_bone_matrix() const
|
nuclear@1
|
347 {
|
nuclear@1
|
348 return bone_matrix;
|
nuclear@1
|
349 }
|
nuclear@1
|
350
|
nuclear@1
|
351 #define FOO
|
nuclear@1
|
352
|
nuclear@1
|
353 void XFormNode::get_node_xform(long tmsec, Matrix4x4 *mat, Matrix4x4 *inv_mat) const
|
nuclear@1
|
354 {
|
nuclear@1
|
355 anm_time_t tm = ANM_MSEC2TM(tmsec);
|
nuclear@1
|
356
|
nuclear@1
|
357 if(mat) {
|
nuclear@1
|
358 anm_get_node_matrix(anm, (scalar_t(*)[4])mat, tm);
|
nuclear@1
|
359 #ifdef FOO
|
nuclear@1
|
360 *mat = local_matrix * *mat;
|
nuclear@1
|
361 #else
|
nuclear@1
|
362 *mat = *mat * local_matrix;
|
nuclear@1
|
363 #endif
|
nuclear@1
|
364 }
|
nuclear@1
|
365 if(inv_mat) {
|
nuclear@1
|
366 anm_get_inv_matrix(anm, (scalar_t(*)[4])inv_mat, tm);
|
nuclear@1
|
367 }
|
nuclear@1
|
368 }
|
nuclear@1
|
369
|
nuclear@1
|
370 void XFormNode::get_xform(long tmsec, Matrix4x4 *mat, Matrix4x4 *inv_mat) const
|
nuclear@1
|
371 {
|
nuclear@1
|
372 anm_time_t tm = ANM_MSEC2TM(tmsec);
|
nuclear@1
|
373
|
nuclear@1
|
374 if(mat) {
|
nuclear@1
|
375 anm_get_matrix(anm, (scalar_t(*)[4])mat, tm);
|
nuclear@1
|
376 #ifdef FOO
|
nuclear@1
|
377 *mat = local_matrix * *mat;
|
nuclear@1
|
378 #else
|
nuclear@1
|
379 *mat = *mat * local_matrix;
|
nuclear@1
|
380 #endif
|
nuclear@1
|
381 }
|
nuclear@1
|
382 if(inv_mat) {
|
nuclear@1
|
383 anm_get_inv_matrix(anm, (scalar_t(*)[4])inv_mat, tm);
|
nuclear@1
|
384 }
|
nuclear@1
|
385 }
|
nuclear@1
|
386
|
nuclear@1
|
387
|
nuclear@1
|
388 // ---- Track ----
|
nuclear@1
|
389
|
nuclear@1
|
390 Track::Track()
|
nuclear@1
|
391 {
|
nuclear@1
|
392 trk = new anm_track;
|
nuclear@1
|
393 anm_init_track(trk);
|
nuclear@1
|
394 }
|
nuclear@1
|
395
|
nuclear@1
|
396 Track::~Track()
|
nuclear@1
|
397 {
|
nuclear@1
|
398 anm_destroy_track(trk);
|
nuclear@1
|
399 delete trk;
|
nuclear@1
|
400 }
|
nuclear@1
|
401
|
nuclear@1
|
402 Track::Track(const Track &rhs)
|
nuclear@1
|
403 {
|
nuclear@1
|
404 trk = new anm_track;
|
nuclear@1
|
405 anm_init_track(trk);
|
nuclear@1
|
406 anm_copy_track(trk, rhs.trk);
|
nuclear@1
|
407 interp = rhs.interp;
|
nuclear@1
|
408 extrap = rhs.extrap;
|
nuclear@1
|
409 }
|
nuclear@1
|
410
|
nuclear@1
|
411 Track &Track::operator =(const Track &rhs)
|
nuclear@1
|
412 {
|
nuclear@1
|
413 if(&rhs == this) {
|
nuclear@1
|
414 return *this;
|
nuclear@1
|
415 }
|
nuclear@1
|
416
|
nuclear@1
|
417 anm_copy_track(trk, rhs.trk);
|
nuclear@1
|
418 interp = rhs.interp;
|
nuclear@1
|
419 extrap = rhs.extrap;
|
nuclear@1
|
420 return *this;
|
nuclear@1
|
421 }
|
nuclear@1
|
422
|
nuclear@1
|
423
|
nuclear@1
|
424 void Track::set_interpolator(Interp in)
|
nuclear@1
|
425 {
|
nuclear@1
|
426 anm_set_track_interpolator(trk, track_interpolator(in));
|
nuclear@1
|
427 interp = in;
|
nuclear@1
|
428 }
|
nuclear@1
|
429
|
nuclear@1
|
430 Interp Track::get_interpolator() const
|
nuclear@1
|
431 {
|
nuclear@1
|
432 return interp;
|
nuclear@1
|
433 }
|
nuclear@1
|
434
|
nuclear@1
|
435 void Track::set_extrapolator(Extrap ex)
|
nuclear@1
|
436 {
|
nuclear@1
|
437 anm_set_track_extrapolator(trk, track_extrapolator(ex));
|
nuclear@1
|
438 extrap = ex;
|
nuclear@1
|
439 }
|
nuclear@1
|
440
|
nuclear@1
|
441 Extrap Track::get_extrapolator() const
|
nuclear@1
|
442 {
|
nuclear@1
|
443 return extrap;
|
nuclear@1
|
444 }
|
nuclear@1
|
445
|
nuclear@1
|
446 void Track::set_default(double def)
|
nuclear@1
|
447 {
|
nuclear@1
|
448 anm_set_track_default(trk, def);
|
nuclear@1
|
449 }
|
nuclear@1
|
450
|
nuclear@1
|
451 void Track::set_value(float val, long tmsec)
|
nuclear@1
|
452 {
|
nuclear@1
|
453 anm_set_value(trk, ANM_MSEC2TM(tmsec), val);
|
nuclear@1
|
454 }
|
nuclear@1
|
455
|
nuclear@1
|
456 float Track::get_value(long tmsec) const
|
nuclear@1
|
457 {
|
nuclear@1
|
458 return anm_get_value(trk, ANM_MSEC2TM(tmsec));
|
nuclear@1
|
459 }
|
nuclear@1
|
460
|
nuclear@1
|
461 float Track::operator ()(long tmsec) const
|
nuclear@1
|
462 {
|
nuclear@1
|
463 return anm_get_value(trk, ANM_MSEC2TM(tmsec));
|
nuclear@1
|
464 }
|
nuclear@1
|
465
|
nuclear@1
|
466
|
nuclear@1
|
467 // ---- Track3 ----
|
nuclear@1
|
468
|
nuclear@1
|
469 void Track3::set_interpolator(Interp in)
|
nuclear@1
|
470 {
|
nuclear@1
|
471 for(int i=0; i<3; i++) {
|
nuclear@1
|
472 track[i].set_interpolator(in);
|
nuclear@1
|
473 }
|
nuclear@1
|
474 }
|
nuclear@1
|
475
|
nuclear@1
|
476 Interp Track3::get_interpolator() const
|
nuclear@1
|
477 {
|
nuclear@1
|
478 return track[0].get_interpolator();
|
nuclear@1
|
479 }
|
nuclear@1
|
480
|
nuclear@1
|
481 void Track3::set_extrapolator(Extrap ex)
|
nuclear@1
|
482 {
|
nuclear@1
|
483 for(int i=0; i<3; i++) {
|
nuclear@1
|
484 track[i].set_extrapolator(ex);
|
nuclear@1
|
485 }
|
nuclear@1
|
486 }
|
nuclear@1
|
487
|
nuclear@1
|
488 Extrap Track3::get_extrapolator() const
|
nuclear@1
|
489 {
|
nuclear@1
|
490 return track[0].get_extrapolator();
|
nuclear@1
|
491 }
|
nuclear@1
|
492
|
nuclear@1
|
493 void Track3::set_default(const Vector3 &def)
|
nuclear@1
|
494 {
|
nuclear@1
|
495 for(int i=0; i<3; i++) {
|
nuclear@1
|
496 track[i].set_default(def[i]);
|
nuclear@1
|
497 }
|
nuclear@1
|
498 }
|
nuclear@1
|
499
|
nuclear@1
|
500 void Track3::set_value(const Vector3 &val, long tmsec)
|
nuclear@1
|
501 {
|
nuclear@1
|
502 for(int i=0; i<3; i++) {
|
nuclear@1
|
503 track[i].set_value(val[i], tmsec);
|
nuclear@1
|
504 }
|
nuclear@1
|
505 }
|
nuclear@1
|
506
|
nuclear@1
|
507 Vector3 Track3::get_value(long tmsec) const
|
nuclear@1
|
508 {
|
nuclear@1
|
509 return Vector3(track[0](tmsec), track[1](tmsec), track[2](tmsec));
|
nuclear@1
|
510 }
|
nuclear@1
|
511
|
nuclear@1
|
512 Vector3 Track3::operator ()(long tmsec) const
|
nuclear@1
|
513 {
|
nuclear@1
|
514 return Vector3(track[0](tmsec), track[1](tmsec), track[2](tmsec));
|
nuclear@1
|
515 }
|
nuclear@1
|
516
|
nuclear@1
|
517
|
nuclear@1
|
518 static inline anm_interpolator track_interpolator(Interp in)
|
nuclear@1
|
519 {
|
nuclear@1
|
520 switch(in) {
|
nuclear@1
|
521 case INTERP_STEP:
|
nuclear@1
|
522 return ANM_INTERP_STEP;
|
nuclear@1
|
523 case INTERP_LINEAR:
|
nuclear@1
|
524 return ANM_INTERP_LINEAR;
|
nuclear@1
|
525 case INTERP_CUBIC:
|
nuclear@1
|
526 return ANM_INTERP_CUBIC;
|
nuclear@1
|
527 }
|
nuclear@1
|
528
|
nuclear@1
|
529 assert(0);
|
nuclear@1
|
530 return ANM_INTERP_STEP;
|
nuclear@1
|
531 }
|
nuclear@1
|
532
|
nuclear@1
|
533 static inline anm_extrapolator track_extrapolator(Extrap ex)
|
nuclear@1
|
534 {
|
nuclear@1
|
535 switch(ex) {
|
nuclear@1
|
536 case EXTRAP_EXTEND:
|
nuclear@1
|
537 return ANM_EXTRAP_EXTEND;
|
nuclear@1
|
538 case EXTRAP_CLAMP:
|
nuclear@1
|
539 return ANM_EXTRAP_CLAMP;
|
nuclear@1
|
540 case EXTRAP_REPEAT:
|
nuclear@1
|
541 return ANM_EXTRAP_REPEAT;
|
nuclear@1
|
542 }
|
nuclear@1
|
543
|
nuclear@1
|
544 assert(0);
|
nuclear@1
|
545 return ANM_EXTRAP_EXTEND;
|
nuclear@1
|
546 }
|
nuclear@1
|
547
|