Exemple #1
0
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);

	

}