vrshoot
diff src/xform_node.cc @ 0:b2f14e535253
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 01 Feb 2014 19:58:19 +0200 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/xform_node.cc Sat Feb 01 19:58:19 2014 +0200 1.3 @@ -0,0 +1,442 @@ 1.4 +#include <assert.h> 1.5 +#include <algorithm> 1.6 +#include "xform_node.h" 1.7 +#include "anim/anim.h" 1.8 +#include "anim/track.h" 1.9 + 1.10 +static inline anm_interpolator track_interpolator(Interp in); 1.11 +static inline anm_extrapolator track_extrapolator(Extrap ex); 1.12 + 1.13 +XFormNode::XFormNode() 1.14 +{ 1.15 + type = NODE_NULL; 1.16 + 1.17 + anm = new anm_node; 1.18 + anm_init_node(anm); 1.19 + 1.20 + parent = 0; 1.21 +} 1.22 + 1.23 +XFormNode::~XFormNode() 1.24 +{ 1.25 + anm_destroy_node(anm); 1.26 + delete anm; 1.27 +} 1.28 + 1.29 +void XFormNode::set_name(const char *name) 1.30 +{ 1.31 + anm_set_node_name(anm, name); 1.32 +} 1.33 + 1.34 +const char *XFormNode::get_name() const 1.35 +{ 1.36 + return anm_get_node_name(anm); 1.37 +} 1.38 + 1.39 +unsigned int XFormNode::get_type() const 1.40 +{ 1.41 + return type; 1.42 +} 1.43 + 1.44 +void XFormNode::set_interpolator(Interp in) 1.45 +{ 1.46 + anm_set_interpolator(anm, track_interpolator(in)); 1.47 + interp = in; 1.48 +} 1.49 + 1.50 +Interp XFormNode::get_interpolator() const 1.51 +{ 1.52 + return interp; 1.53 +} 1.54 + 1.55 +void XFormNode::set_extrapolator(Extrap ex) 1.56 +{ 1.57 + anm_set_extrapolator(anm, track_extrapolator(ex)); 1.58 + extrap = ex; 1.59 +} 1.60 + 1.61 +Extrap XFormNode::get_extrapolator() const 1.62 +{ 1.63 + return extrap; 1.64 +} 1.65 + 1.66 +void XFormNode::add_child(XFormNode *child) 1.67 +{ 1.68 + children.push_back(child); 1.69 + anm_link_node(anm, child->anm); 1.70 + 1.71 + child->parent = this; 1.72 +} 1.73 + 1.74 +void XFormNode::remove_child(XFormNode *child) 1.75 +{ 1.76 + std::vector<XFormNode*>::iterator it; 1.77 + it = std::find(children.begin(), children.end(), child); 1.78 + if(it != children.end()) { 1.79 + children.erase(it); 1.80 + anm_unlink_node(anm, child->anm); 1.81 + 1.82 + if(child->parent == this) { 1.83 + child->parent = 0; 1.84 + } 1.85 + } 1.86 +} 1.87 + 1.88 +int XFormNode::get_children_count() const 1.89 +{ 1.90 + return (int)children.size(); 1.91 +} 1.92 + 1.93 +XFormNode *XFormNode::get_child(int idx) 1.94 +{ 1.95 + if(idx >= 0 && idx < get_children_count()) { 1.96 + return children[idx]; 1.97 + } 1.98 + return 0; 1.99 +} 1.100 + 1.101 +const XFormNode *XFormNode::get_child(int idx) const 1.102 +{ 1.103 + if(idx >= 0 && idx < get_children_count()) { 1.104 + return children[idx]; 1.105 + } 1.106 + return 0; 1.107 +} 1.108 + 1.109 +XFormNode *XFormNode::get_parent() 1.110 +{ 1.111 + return parent; 1.112 +} 1.113 + 1.114 +const XFormNode *XFormNode::get_parent() const 1.115 +{ 1.116 + return parent; 1.117 +} 1.118 + 1.119 +void XFormNode::clear_xform() 1.120 +{ 1.121 + anm_clear(anm); 1.122 +} 1.123 + 1.124 +void XFormNode::set_position(const Vector3 &pos, long tmsec) 1.125 +{ 1.126 + anm_set_position(anm, v3_cons(pos.x, pos.y, pos.z), ANM_MSEC2TM(tmsec)); 1.127 +} 1.128 + 1.129 +Vector3 XFormNode::get_node_position(long tmsec) const 1.130 +{ 1.131 + vec3_t p = anm_get_node_position(anm, ANM_MSEC2TM(tmsec)); 1.132 + return Vector3(p.x, p.y, p.z); 1.133 +} 1.134 + 1.135 +void XFormNode::set_rotation(const Quaternion &quat, long tmsec) 1.136 +{ 1.137 + anm_set_rotation(anm, quat_cons(quat.s, quat.v.x, quat.v.y, quat.v.z), ANM_MSEC2TM(tmsec)); 1.138 +} 1.139 + 1.140 +Quaternion XFormNode::get_node_rotation(long tmsec) const 1.141 +{ 1.142 + quat_t q = anm_get_node_rotation(anm, ANM_MSEC2TM(tmsec)); 1.143 + return Quaternion(q.w, q.x, q.y, q.z); 1.144 +} 1.145 + 1.146 +void XFormNode::set_scaling(const Vector3 &pos, long tmsec) 1.147 +{ 1.148 + anm_set_scaling(anm, v3_cons(pos.x, pos.y, pos.z), ANM_MSEC2TM(tmsec)); 1.149 +} 1.150 + 1.151 +Vector3 XFormNode::get_node_scaling(long tmsec) const 1.152 +{ 1.153 + vec3_t s = anm_get_node_scaling(anm, ANM_MSEC2TM(tmsec)); 1.154 + return Vector3(s.x, s.y, s.z); 1.155 +} 1.156 + 1.157 +// these take hierarchy into account 1.158 +Vector3 XFormNode::get_position(long tmsec) const 1.159 +{ 1.160 + vec3_t v = anm_get_position(anm, ANM_MSEC2TM(tmsec)); 1.161 + return Vector3(v.x, v.y, v.z); 1.162 +} 1.163 + 1.164 +Quaternion XFormNode::get_rotation(long tmsec) const 1.165 +{ 1.166 + quat_t q = anm_get_rotation(anm, tmsec); 1.167 + return Quaternion(q.w, q.x, q.y, q.z); 1.168 +} 1.169 + 1.170 +Vector3 XFormNode::get_scaling(long tmsec) const 1.171 +{ 1.172 + vec3_t v = anm_get_scaling(anm, ANM_MSEC2TM(tmsec)); 1.173 + return Vector3(v.x, v.y, v.z); 1.174 +} 1.175 + 1.176 +void XFormNode::set_pivot(const Vector3 &pivot) 1.177 +{ 1.178 + anm_set_pivot(anm, v3_cons(pivot.x, pivot.y, pivot.z)); 1.179 +} 1.180 + 1.181 +Vector3 XFormNode::get_pivot() const 1.182 +{ 1.183 + vec3_t p = anm_get_pivot(anm); 1.184 + return Vector3(p.x, p.y, p.z); 1.185 +} 1.186 + 1.187 +void XFormNode::set_local_matrix(const Matrix4x4 &mat) 1.188 +{ 1.189 + local_matrix = mat; 1.190 +} 1.191 + 1.192 +const Matrix4x4 &XFormNode::get_local_matrix() const 1.193 +{ 1.194 + return local_matrix; 1.195 +} 1.196 + 1.197 +void XFormNode::set_bone_matrix(const Matrix4x4 &bmat) 1.198 +{ 1.199 + bone_matrix = bmat; 1.200 +} 1.201 + 1.202 +const Matrix4x4 &XFormNode::get_bone_matrix() const 1.203 +{ 1.204 + return bone_matrix; 1.205 +} 1.206 + 1.207 +#define FOO 1.208 + 1.209 +void XFormNode::get_node_xform(long tmsec, Matrix4x4 *mat, Matrix4x4 *inv_mat) const 1.210 +{ 1.211 + anm_time_t tm = ANM_MSEC2TM(tmsec); 1.212 + 1.213 + if(mat) { 1.214 + anm_get_node_matrix(anm, (scalar_t(*)[4])mat, tm); 1.215 +#ifdef FOO 1.216 + *mat = local_matrix * *mat; 1.217 +#else 1.218 + *mat = *mat * local_matrix; 1.219 +#endif 1.220 + } 1.221 + if(inv_mat) { 1.222 + anm_get_inv_matrix(anm, (scalar_t(*)[4])inv_mat, tm); 1.223 + } 1.224 +} 1.225 + 1.226 +void XFormNode::get_xform(long tmsec, Matrix4x4 *mat, Matrix4x4 *inv_mat) const 1.227 +{ 1.228 + anm_time_t tm = ANM_MSEC2TM(tmsec); 1.229 + 1.230 + if(mat) { 1.231 + anm_get_matrix(anm, (scalar_t(*)[4])mat, tm); 1.232 +#ifdef FOO 1.233 + *mat = local_matrix * *mat; 1.234 +#else 1.235 + *mat = *mat * local_matrix; 1.236 +#endif 1.237 + } 1.238 + if(inv_mat) { 1.239 + anm_get_inv_matrix(anm, (scalar_t(*)[4])inv_mat, tm); 1.240 + } 1.241 +} 1.242 + 1.243 + 1.244 +std::list<XFormNode*> XFormNode::get_all_nodes(unsigned int type_mask) 1.245 +{ 1.246 + std::list<XFormNode*> res; 1.247 + 1.248 + if(type & type_mask) { 1.249 + res.push_back(this); 1.250 + } 1.251 + 1.252 + int nchildren = get_children_count(); 1.253 + for(int i=0; i<nchildren; i++) { 1.254 + std::list<XFormNode*> sublist = get_child(i)->get_all_nodes(type_mask); 1.255 + res.splice(res.end(), sublist); 1.256 + } 1.257 + 1.258 + return res; 1.259 +} 1.260 + 1.261 +std::list<const XFormNode*> XFormNode::get_all_nodes(unsigned int type_mask) const 1.262 +{ 1.263 + std::list<const XFormNode*> res; 1.264 + 1.265 + if(type & type_mask) { 1.266 + res.push_back(this); 1.267 + } 1.268 + 1.269 + int nchildren = get_children_count(); 1.270 + for(int i=0; i<nchildren; i++) { 1.271 + std::list<const XFormNode*> sublist = get_child(i)->get_all_nodes(type_mask); 1.272 + res.splice(res.end(), sublist); 1.273 + } 1.274 + 1.275 + return res; 1.276 +} 1.277 + 1.278 +void XFormNode::draw(long msec) const 1.279 +{ 1.280 + int nchild = get_children_count(); 1.281 + for(int i=0; i<nchild; i++) { 1.282 + get_child(i)->draw(msec); 1.283 + } 1.284 +} 1.285 + 1.286 +// ---- Track ---- 1.287 + 1.288 +Track::Track() 1.289 +{ 1.290 + trk = new anm_track; 1.291 + anm_init_track(trk); 1.292 +} 1.293 + 1.294 +Track::~Track() 1.295 +{ 1.296 + anm_destroy_track(trk); 1.297 + delete trk; 1.298 +} 1.299 + 1.300 +Track::Track(const Track &rhs) 1.301 +{ 1.302 + trk = new anm_track; 1.303 + anm_init_track(trk); 1.304 + anm_copy_track(trk, rhs.trk); 1.305 + interp = rhs.interp; 1.306 + extrap = rhs.extrap; 1.307 +} 1.308 + 1.309 +Track &Track::operator =(const Track &rhs) 1.310 +{ 1.311 + if(&rhs == this) { 1.312 + return *this; 1.313 + } 1.314 + 1.315 + anm_copy_track(trk, rhs.trk); 1.316 + interp = rhs.interp; 1.317 + extrap = rhs.extrap; 1.318 + return *this; 1.319 +} 1.320 + 1.321 + 1.322 +void Track::set_interpolator(Interp in) 1.323 +{ 1.324 + anm_set_track_interpolator(trk, track_interpolator(in)); 1.325 + interp = in; 1.326 +} 1.327 + 1.328 +Interp Track::get_interpolator() const 1.329 +{ 1.330 + return interp; 1.331 +} 1.332 + 1.333 +void Track::set_extrapolator(Extrap ex) 1.334 +{ 1.335 + anm_set_track_extrapolator(trk, track_extrapolator(ex)); 1.336 + extrap = ex; 1.337 +} 1.338 + 1.339 +Extrap Track::get_extrapolator() const 1.340 +{ 1.341 + return extrap; 1.342 +} 1.343 + 1.344 +void Track::set_default(double def) 1.345 +{ 1.346 + anm_set_track_default(trk, def); 1.347 +} 1.348 + 1.349 +void Track::set_value(float val, long tmsec) 1.350 +{ 1.351 + anm_set_value(trk, ANM_MSEC2TM(tmsec), val); 1.352 +} 1.353 + 1.354 +float Track::get_value(long tmsec) const 1.355 +{ 1.356 + return anm_get_value(trk, ANM_MSEC2TM(tmsec)); 1.357 +} 1.358 + 1.359 +float Track::operator ()(long tmsec) const 1.360 +{ 1.361 + return anm_get_value(trk, ANM_MSEC2TM(tmsec)); 1.362 +} 1.363 + 1.364 + 1.365 +// ---- Track3 ---- 1.366 + 1.367 +void Track3::set_interpolator(Interp in) 1.368 +{ 1.369 + for(int i=0; i<3; i++) { 1.370 + track[i].set_interpolator(in); 1.371 + } 1.372 +} 1.373 + 1.374 +Interp Track3::get_interpolator() const 1.375 +{ 1.376 + return track[0].get_interpolator(); 1.377 +} 1.378 + 1.379 +void Track3::set_extrapolator(Extrap ex) 1.380 +{ 1.381 + for(int i=0; i<3; i++) { 1.382 + track[i].set_extrapolator(ex); 1.383 + } 1.384 +} 1.385 + 1.386 +Extrap Track3::get_extrapolator() const 1.387 +{ 1.388 + return track[0].get_extrapolator(); 1.389 +} 1.390 + 1.391 +void Track3::set_default(const Vector3 &def) 1.392 +{ 1.393 + for(int i=0; i<3; i++) { 1.394 + track[i].set_default(def[i]); 1.395 + } 1.396 +} 1.397 + 1.398 +void Track3::set_value(const Vector3 &val, long tmsec) 1.399 +{ 1.400 + for(int i=0; i<3; i++) { 1.401 + track[i].set_value(val[i], tmsec); 1.402 + } 1.403 +} 1.404 + 1.405 +Vector3 Track3::get_value(long tmsec) const 1.406 +{ 1.407 + return Vector3(track[0](tmsec), track[1](tmsec), track[2](tmsec)); 1.408 +} 1.409 + 1.410 +Vector3 Track3::operator ()(long tmsec) const 1.411 +{ 1.412 + return Vector3(track[0](tmsec), track[1](tmsec), track[2](tmsec)); 1.413 +} 1.414 + 1.415 + 1.416 +static inline anm_interpolator track_interpolator(Interp in) 1.417 +{ 1.418 + switch(in) { 1.419 + case INTERP_STEP: 1.420 + return ANM_INTERP_STEP; 1.421 + case INTERP_LINEAR: 1.422 + return ANM_INTERP_LINEAR; 1.423 + case INTERP_CUBIC: 1.424 + return ANM_INTERP_CUBIC; 1.425 + } 1.426 + 1.427 + assert(0); 1.428 + return ANM_INTERP_STEP; 1.429 +} 1.430 + 1.431 +static inline anm_extrapolator track_extrapolator(Extrap ex) 1.432 +{ 1.433 + switch(ex) { 1.434 + case EXTRAP_EXTEND: 1.435 + return ANM_EXTRAP_EXTEND; 1.436 + case EXTRAP_CLAMP: 1.437 + return ANM_EXTRAP_CLAMP; 1.438 + case EXTRAP_REPEAT: 1.439 + return ANM_EXTRAP_REPEAT; 1.440 + } 1.441 + 1.442 + assert(0); 1.443 + return ANM_EXTRAP_EXTEND; 1.444 +} 1.445 +