From 6a75a90cec88cb1046ac14ddc8acfa5126ba9719 Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 28 Jun 2001 00:59:11 +0000 Subject: [PATCH] add pingpong support --- panda/src/chan/animControl.cxx | 50 ++++++++++++++++++++++++++++++++++ panda/src/chan/animControl.h | 3 ++ 2 files changed, 53 insertions(+) diff --git a/panda/src/chan/animControl.cxx b/panda/src/chan/animControl.cxx index 94b5a7364b..b96b7d7443 100644 --- a/panda/src/chan/animControl.cxx +++ b/panda/src/chan/animControl.cxx @@ -190,6 +190,33 @@ loop(bool restart, int from, int to) { } } +//////////////////////////////////////////////////////////////////// +// Function: AnimControl::pingpong +// Access: Public +// Description: Loops the animation from the frame "from" to and +// including the frame "to", and then back in the +// opposite direction, indefinitely. +//////////////////////////////////////////////////////////////////// +void AnimControl:: +pingpong(bool restart, int from, int to) { + nassertv(get_num_frames() > 0); + + nassertv(from >= 0 && from < get_num_frames()); + nassertv(to >= 0 && to < get_num_frames()); + _as_of_time = ClockObject::get_global_clock()->get_frame_time(); + _playing = true; + + _actions = _user_actions; + + insert_reverse_action(_actions, (to-1+get_num_frames())%get_num_frames()); + insert_reverse_action(_actions, (to+1)%get_num_frames()); + + get_part()->control_activated(this); + if (restart) { + set_frame(from); + } +} + //////////////////////////////////////////////////////////////////// // Function: AnimControl::stop // Access: Public @@ -466,6 +493,20 @@ insert_jump_action(Actions &actions, int frame, int jump_to) { actions.insert(pair(frame, new_action)); } +//////////////////////////////////////////////////////////////////// +// Function: AnimControl::insert_reverse_action +// Access: Private, Static +// Description: Inserts a "reverse" action at the indicated frame +// number. The animation will stop and go back the +// other direction when it reaches the indicated frame. +//////////////////////////////////////////////////////////////////// +void AnimControl:: +insert_reverse_action(Actions &actions, int frame) { + Action new_action; + new_action._type = AT_reverse; + actions.insert(pair(frame, new_action)); +} + //////////////////////////////////////////////////////////////////// // Function: AnimControl::set_frame @@ -596,6 +637,7 @@ do_action(int frame, const Action &action, switch (action._type) { case AT_stop: case AT_jump: + case AT_reverse: sequence_frame = frame; sequence_action = &action; break; @@ -630,6 +672,10 @@ do_sequence_action(int, const Action &action) { set_frame(action._jump_to); break; + case AT_reverse: + _play_rate = -_play_rate; + break; + case AT_event: default: chan_cat.error() << "Invalid sequence action!\n"; @@ -657,6 +703,10 @@ output(ostream &out) const { out << "jump to " << _jump_to; break; + case AT_reverse: + out << "reverse"; + break; + default: out << "**error**"; } diff --git a/panda/src/chan/animControl.h b/panda/src/chan/animControl.h index 3e674909ca..6edefe850b 100644 --- a/panda/src/chan/animControl.h +++ b/panda/src/chan/animControl.h @@ -53,6 +53,7 @@ PUBLISHED: void play(int from, int to, const CPT_Event &stop_event = NULL); void loop(bool restart); void loop(bool restart, int from, int to); + void pingpong(bool restart, int from, int to); void stop(); void pose(int frame); @@ -92,6 +93,7 @@ private: AT_event, AT_stop, AT_jump, + AT_reverse, }; #ifdef WIN32_VC @@ -113,6 +115,7 @@ private: static void insert_event_action(Actions &actions, int frame, const CPT_Event &event); static void insert_stop_action(Actions &actions, int frame); static void insert_jump_action(Actions &actions, int frame, int jump_to); + static void insert_reverse_action(Actions &actions, int frame); void set_frame(double frame);