void AnimationPlayer::_animation_process_data(PlaybackData &cd, float p_delta, float p_blend) { float delta = p_delta * speed_scale * cd.speed_scale; bool backwards = delta < 0; float next_pos = cd.pos + delta; float len = cd.from->animation->get_length(); bool loop = cd.from->animation->has_loop(); if (!loop) { if (next_pos < 0) next_pos = 0; else if (next_pos > len) next_pos = len; // fix delta delta = next_pos - cd.pos; if (&cd == &playback.current) { if (!backwards && cd.pos <= len && next_pos == len /*&& playback.blend.empty()*/) { //playback finished end_reached = true; end_notify = cd.pos < len; // Notify only if not already at the end } if (backwards && cd.pos >= 0 && next_pos == 0 /*&& playback.blend.empty()*/) { //playback finished end_reached = true; end_notify = cd.pos > 0; // Notify only if not already at the beginning } } } else { float looped_next_pos = Math::fposmod(next_pos, len); if (looped_next_pos == 0 && next_pos != 0) { // Loop multiples of the length to it, rather than 0 // so state at time=length is previewable in the editor next_pos = len; } else { next_pos = looped_next_pos; } } cd.pos = next_pos; _animation_process_animation(cd.from, cd.pos, delta, p_blend, &cd == &playback.current); }
void AnimationPlayer::_animation_process_data(PlaybackData &cd,float p_delta,float p_blend) { float delta=p_delta*speed_scale*cd.speed_scale; bool backwards=delta<0; float next_pos=cd.pos+delta; float len=cd.from->animation->get_length(); bool loop=cd.from->animation->has_loop(); if (!loop) { if (next_pos<0) next_pos=0; else if (next_pos>len) next_pos=len; // fix delta delta=next_pos-cd.pos; if (&cd == &playback.current) { if (!backwards && cd.pos < len && next_pos==len /*&& playback.blend.empty()*/) { //playback finished end_notify=true; } if (backwards && cd.pos > 0 && next_pos==0 /*&& playback.blend.empty()*/) { //playback finished end_notify=true; } } } else { next_pos=Math::fposmod(next_pos,len); } cd.pos=next_pos; _animation_process_animation(cd.from,cd.pos,delta,p_blend,&cd == &playback.current); }