add pingpong support

This commit is contained in:
David Rose 2001-06-28 00:59:11 +00:00
parent 30988dfcb1
commit 6a75a90cec
2 changed files with 53 additions and 0 deletions

View File

@ -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<int, Action>(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<int, Action>(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**";
}

View File

@ -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);