nuclear@54: /* nuclear@54: goat3d - 3D scene, character, and animation file format library. nuclear@54: Copyright (C) 2013-2014 John Tsiombikas nuclear@54: nuclear@54: This program is free software: you can redistribute it and/or modify nuclear@54: it under the terms of the GNU Lesser General Public License as published by nuclear@54: the Free Software Foundation, either version 3 of the License, or nuclear@54: (at your option) any later version. nuclear@54: nuclear@54: This program is distributed in the hope that it will be useful, nuclear@54: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@54: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@54: GNU Lesser General Public License for more details. nuclear@54: nuclear@54: You should have received a copy of the GNU Lesser General Public License nuclear@54: along with this program. If not, see . nuclear@54: */ nuclear@1: #ifndef XFORM_NODE_H_ nuclear@1: #define XFORM_NODE_H_ nuclear@1: nuclear@1: #include nuclear@1: #include "vmath/vector.h" nuclear@1: #include "vmath/quat.h" nuclear@1: #include "vmath/matrix.h" nuclear@1: nuclear@1: nuclear@1: struct anm_node; nuclear@1: struct anm_track; nuclear@1: nuclear@47: namespace g3dimpl { nuclear@47: nuclear@47: enum Interp { INTERP_STEP, INTERP_LINEAR, INTERP_CUBIC }; nuclear@47: enum Extrap { EXTRAP_EXTEND, EXTRAP_CLAMP, EXTRAP_REPEAT }; nuclear@47: nuclear@47: // NOTE: all time arguments are milliseconds nuclear@1: nuclear@1: class XFormNode { nuclear@1: private: nuclear@1: struct anm_node *anm; nuclear@1: std::vector children; nuclear@30: XFormNode *parent; nuclear@1: nuclear@1: Interp interp; nuclear@1: Extrap extrap; nuclear@1: nuclear@1: Matrix4x4 local_matrix; nuclear@1: Matrix4x4 bone_matrix; nuclear@1: nuclear@1: XFormNode(const XFormNode &node) {} nuclear@1: XFormNode &operator =(const XFormNode &node) { return *this; } nuclear@1: nuclear@1: public: nuclear@48: enum { POSITION_TRACK, ROTATION_TRACK, SCALING_TRACK }; nuclear@48: nuclear@1: XFormNode(); nuclear@1: virtual ~XFormNode(); nuclear@1: nuclear@47: // retrieve the pointer to the underlying libanim data structure nuclear@47: virtual struct anm_node *get_libanim_node() const; nuclear@47: nuclear@8: virtual void set_name(const char *name); nuclear@8: virtual const char *get_name() const; nuclear@1: nuclear@8: virtual void set_interpolator(Interp in); nuclear@8: virtual Interp get_interpolator() const; nuclear@8: virtual void set_extrapolator(Extrap ex); nuclear@8: virtual Extrap get_extrapolator() const; nuclear@1: nuclear@47: virtual XFormNode *get_parent(); nuclear@47: virtual const XFormNode *get_parent() const; nuclear@47: nuclear@1: // children management nuclear@8: virtual void add_child(XFormNode *child); nuclear@8: virtual void remove_child(XFormNode *child); nuclear@1: nuclear@8: virtual int get_children_count() const; nuclear@8: virtual XFormNode *get_child(int idx); nuclear@8: virtual const XFormNode *get_child(int idx) const; nuclear@1: nuclear@47: nuclear@47: virtual void use_animation(int idx); nuclear@47: virtual void use_animation(const char *name); nuclear@47: virtual void use_animation(int aidx, int bidx, float t); nuclear@47: virtual void use_animation(const char *aname, const char *bname, float t); nuclear@47: nuclear@47: virtual int get_active_animation_index(int which = 0) const; nuclear@47: virtual float get_active_animation_mix() const; nuclear@47: nuclear@47: virtual int get_animation_count() const; nuclear@47: nuclear@47: // add a new empty animation slot (recursive) nuclear@47: virtual void add_animation(const char *name = 0); nuclear@47: nuclear@47: // set/get the current animation name (set is recursive) nuclear@47: virtual void set_animation_name(const char *name); nuclear@47: virtual const char *get_animation_name() const; nuclear@47: nuclear@48: // raw keyframe retrieval without interpolation nuclear@48: // NOTE: trackid parameters correspond to the values of the unnamed enumeration at the top nuclear@48: nuclear@48: virtual int get_key_count(int trackid) const; nuclear@48: virtual int get_position_key_count() const; nuclear@48: virtual int get_rotation_key_count() const; nuclear@48: virtual int get_scaling_key_count() const; nuclear@48: nuclear@48: virtual long get_key_time(int trackid, int idx) const; nuclear@48: virtual long get_position_key_time(int idx) const; nuclear@48: virtual long get_rotation_key_time(int idx) const; nuclear@48: virtual long get_scaling_key_time(int idx) const; nuclear@48: nuclear@48: /* writes the key value through the val pointer, and returns the number nuclear@48: * of elements in that value (3 for pos/scale, 4 for rotation). nuclear@48: */ nuclear@48: virtual int get_key_value(int trackid, int idx, float *val) const; nuclear@48: virtual Vector3 get_position_key_value(int idx) const; nuclear@48: virtual Quaternion get_rotation_key_value(int idx) const; nuclear@48: virtual Vector3 get_scaling_key_value(int idx) const; nuclear@48: nuclear@1: nuclear@8: virtual void set_position(const Vector3 &pos, long tmsec = 0); nuclear@8: virtual Vector3 get_node_position(long tmsec = 0) const; nuclear@1: nuclear@8: virtual void set_rotation(const Quaternion &quat, long tmsec = 0); nuclear@8: virtual Quaternion get_node_rotation(long tmsec = 0) const; nuclear@1: nuclear@8: virtual void set_scaling(const Vector3 &pos, long tmsec = 0); nuclear@8: virtual Vector3 get_node_scaling(long tmsec = 0) const; nuclear@1: nuclear@1: // these take hierarchy into account nuclear@8: virtual Vector3 get_position(long tmsec = 0) const; nuclear@8: virtual Quaternion get_rotation(long tmsec = 0) const; nuclear@8: virtual Vector3 get_scaling(long tmsec = 0) const; nuclear@1: nuclear@8: virtual void set_pivot(const Vector3 &pivot); nuclear@8: virtual Vector3 get_pivot() const; nuclear@1: nuclear@1: // the local matrix is concatenated with the regular node/anim matrix nuclear@8: virtual void set_local_matrix(const Matrix4x4 &mat); nuclear@8: virtual const Matrix4x4 &get_local_matrix() const; nuclear@1: nuclear@1: // for bone nodes, the transformation of the bone in bind position nuclear@8: virtual void set_bone_matrix(const Matrix4x4 &bmat); nuclear@8: virtual const Matrix4x4 &get_bone_matrix() const; nuclear@1: nuclear@1: // node transformation alone nuclear@8: virtual void get_node_xform(long tmsec, Matrix4x4 *mat, Matrix4x4 *inv_mat = 0) const; nuclear@1: nuclear@1: // node transformation taking hierarchy into account nuclear@8: virtual void get_xform(long tmsec, Matrix4x4 *mat, Matrix4x4 *inv_mat = 0) const; nuclear@1: }; nuclear@1: nuclear@1: nuclear@1: class Track { nuclear@1: private: nuclear@1: struct anm_track *trk; nuclear@1: Interp interp; nuclear@1: Extrap extrap; nuclear@1: nuclear@1: public: nuclear@1: Track(); nuclear@1: ~Track(); nuclear@1: nuclear@1: Track(const Track &trk); nuclear@1: Track &operator =(const Track &trk); nuclear@1: nuclear@1: void set_interpolator(Interp in); nuclear@1: Interp get_interpolator() const; nuclear@1: void set_extrapolator(Extrap ex); nuclear@1: Extrap get_extrapolator() const; nuclear@1: nuclear@1: void set_default(double def); nuclear@1: nuclear@1: void set_value(float val, long tmsec = 0); nuclear@1: float get_value(long tmsec = 0) const; nuclear@1: nuclear@1: // the same as get_value nuclear@1: float operator ()(long tmsec = 0) const; nuclear@1: }; nuclear@1: nuclear@1: class Track3 { nuclear@1: private: nuclear@1: Track track[3]; nuclear@1: nuclear@1: public: nuclear@1: void set_interpolator(Interp in); nuclear@1: Interp get_interpolator() const; nuclear@1: void set_extrapolator(Extrap ex); nuclear@1: Extrap get_extrapolator() const; nuclear@1: nuclear@1: void set_default(const Vector3 &def); nuclear@1: nuclear@1: void set_value(const Vector3 &val, long tmsec = 0); nuclear@1: Vector3 get_value(long tmsec = 0) const; nuclear@1: nuclear@1: // the same as get_value nuclear@1: Vector3 operator ()(long tmsec = 0) const; nuclear@1: }; nuclear@1: nuclear@47: } // namespace g3dimpl nuclear@47: nuclear@1: #endif /* XFORM_NODE_H_ */