// Filename: partBundle.I // Created by: drose (22Feb99) // //////////////////////////////////////////////////////////////////// // // PANDA 3D SOFTWARE // Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved // // All use of this software is subject to the terms of the Panda 3d // Software license. You should have received a copy of this license // along with this source code; you will also find a current copy of // the license at http://etc.cmu.edu/panda3d/docs/license/ . // // To contact the maintainers of this program write to // panda3d-general@lists.sourceforge.net . // //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // Function: PartBundle::set_blend_type // Access: Published // Description: Defines the algorithm that is used when blending // multiple frames or multiple animations together, when // either anim_blend_flag or frame_blend_flag is set // to true. // // See partBundle.h for a description of the meaning of // each of the BlendType values. //////////////////////////////////////////////////////////////////// INLINE void PartBundle:: set_blend_type(PartBundle::BlendType bt) { nassertv(Thread::get_current_pipeline_stage() == 0); CDWriter cdata(_cycler); cdata->_blend_type = bt; } //////////////////////////////////////////////////////////////////// // Function: PartBundle::get_blend_type // Access: Published // Description: Returns the algorithm that is used when blending // multiple frames or multiple animations together, when // either anim_blend_flag or frame_blend_flag is set // to true. //////////////////////////////////////////////////////////////////// INLINE PartBundle::BlendType PartBundle:: get_blend_type() const { CDReader cdata(_cycler); return cdata->_blend_type; } //////////////////////////////////////////////////////////////////// // Function: PartBundle::get_anim_blend_flag // Access: Published // Description: Returns whether the character allows multiple // different animations to be bound simultaneously. See // set_anim_blend_flag(). //////////////////////////////////////////////////////////////////// INLINE bool PartBundle:: get_anim_blend_flag() const { CDReader cdata(_cycler); return cdata->_anim_blend_flag; } //////////////////////////////////////////////////////////////////// // Function: PartBundle::set_frame_blend_flag // Access: Published // Description: Specifies whether the character interpolates (blends) // between two sequential frames of an active animation, // showing a smooth intra-frame motion, or whether it // holds each frame until the next frame is ready, // showing precisely the specified animation. // // When this value is false, the character holds each // frame until the next is ready. When this is true, // the character will interpolate between two // consecutive frames of animation for each frame the // animation is onscreen, according to the amount of // time elapsed between the frames. // // The default value of this flag is determined by the // interpolate-frames Config.prc variable. // // Use set_blend_type() to change the algorithm that the // character uses to interpolate matrix positions. //////////////////////////////////////////////////////////////////// INLINE void PartBundle:: set_frame_blend_flag(bool frame_blend_flag) { nassertv(Thread::get_current_pipeline_stage() == 0); CDWriter cdata(_cycler); cdata->_frame_blend_flag = frame_blend_flag; } //////////////////////////////////////////////////////////////////// // Function: PartBundle::get_frame_blend_flag // Access: Published // Description: Returns whether the character interpolates (blends) // between two sequential animation frames, or whether // it holds the current frame until the next one is // ready. See set_frame_blend_flag(). //////////////////////////////////////////////////////////////////// INLINE bool PartBundle:: get_frame_blend_flag() const { CDReader cdata(_cycler); return cdata->_frame_blend_flag; } //////////////////////////////////////////////////////////////////// // Function: PartBundle::set_root_xform // Access: Published // Description: Specifies the transform matrix which is implicitly // applied at the root of the animated hierarchy. //////////////////////////////////////////////////////////////////// INLINE void PartBundle:: set_root_xform(const LMatrix4f &root_xform) { nassertv(Thread::get_current_pipeline_stage() == 0); CDWriter cdata(_cycler); cdata->_root_xform = root_xform; cdata->_anim_changed = true; } //////////////////////////////////////////////////////////////////// // Function: PartBundle::xform // Access: Published // Description: Applies the indicated transform to the root of the // animated hierarchy. //////////////////////////////////////////////////////////////////// INLINE void PartBundle:: xform(const LMatrix4f &mat) { nassertv(Thread::get_current_pipeline_stage() == 0); CDWriter cdata(_cycler); cdata->_root_xform = cdata->_root_xform * mat; do_xform(mat, invert(mat)); cdata->_anim_changed = true; } //////////////////////////////////////////////////////////////////// // Function: PartBundle::get_root_xform // Access: Published // Description: Returns the transform matrix which is implicitly // applied at the root of the animated hierarchy. //////////////////////////////////////////////////////////////////// INLINE const LMatrix4f &PartBundle:: get_root_xform() const { CDReader cdata(_cycler); return cdata->_root_xform; } //////////////////////////////////////////////////////////////////// // Function: PartBundle::get_num_nodes // Access: Published // Description: Returns the number of PartBundleNodes that contain a // pointer to this PartBundle. //////////////////////////////////////////////////////////////////// INLINE int PartBundle:: get_num_nodes() const { return _nodes.size(); } //////////////////////////////////////////////////////////////////// // Function: PartBundle::get_node // Access: Published // Description: Returns the nth PartBundleNode associated with // this PartBundle. //////////////////////////////////////////////////////////////////// INLINE PartBundleNode *PartBundle:: get_node(int n) const { nassertr(n >= 0 && n < (int)_nodes.size(), NULL); return _nodes[n]; } //////////////////////////////////////////////////////////////////// // Function: PartBundle::set_control_effect // Access: Published // Description: Sets the amount by which the character is affected by // the indicated AnimControl (and its associated // animation). Normally, this will only be zero or one. // Zero indicates the animation does not affect the // character, and one means it does. // // If the _anim_blend_flag is not false (see // set_anim_blend_flag()), it is possible to have // multiple AnimControls in effect simultaneously. In // this case, the effect is a weight that indicates the // relative importance of each AnimControl to the final // animation. //////////////////////////////////////////////////////////////////// void PartBundle:: set_control_effect(AnimControl *control, float effect) { nassertv(Thread::get_current_pipeline_stage() == 0); CDWriter cdata(_cycler); do_set_control_effect(control, effect, cdata); } //////////////////////////////////////////////////////////////////// // Function: PartBundle::get_control_effect // Access: Published // Description: Returns the amount by which the character is affected // by the indicated AnimControl and its associated // animation. See set_control_effect(). //////////////////////////////////////////////////////////////////// INLINE float PartBundle:: get_control_effect(AnimControl *control) const { CDReader cdata(_cycler); return do_get_control_effect(control, cdata); }