using UnityEngine;
using System.Collections;
namespace RootMotion.Demos {
	/// 
	/// The base abstract class for all character animation controllers.
	/// 
	public abstract class CharacterAnimationBase: MonoBehaviour {
		public bool smoothFollow = true;
		public float smoothFollowSpeed = 20f;
		protected bool animatePhysics;
		private Vector3 lastPosition;
		private Vector3 localPosition;
		private Quaternion localRotation;
		private Quaternion lastRotation;
		// Gets the rotation pivot of the character
		public virtual Vector3 GetPivotPoint() {
			return transform.position;
		}
		// Is the animator playing the grounded state?
		public virtual bool animationGrounded { 
			get {
				return true;
			}
		}
		// Gets angle around y axis from a world space direction
		public float GetAngleFromForward(Vector3 worldDirection) {
			Vector3 local = transform.InverseTransformDirection(worldDirection);
			return Mathf.Atan2 (local.x, local.z) * Mathf.Rad2Deg;
		}
		protected virtual void Start() {
			if (transform.parent.GetComponent() == null) {
				Debug.LogWarning("Animation controllers should be parented to character controllers!", transform);
			}
			lastPosition = transform.position;
			localPosition = transform.localPosition;
			lastRotation = transform.rotation;
			localRotation = transform.localRotation;
		}
		protected virtual void LateUpdate() {
			if (animatePhysics) return;
			SmoothFollow();
		}
		// Smooth interpolation of character position. Helps to smooth out hectic rigidbody motion
		protected virtual void FixedUpdate() {
			if (!animatePhysics) return;
			SmoothFollow();
		}
		private void SmoothFollow() {
			if (smoothFollow) {
				transform.position = Vector3.Lerp(lastPosition, transform.parent.TransformPoint(localPosition), Time.deltaTime * smoothFollowSpeed);
				transform.rotation = Quaternion.Lerp(lastRotation, transform.parent.rotation * localRotation, Time.deltaTime * smoothFollowSpeed);
			} else
            {
                transform.localPosition = localPosition;
                transform.localRotation = localRotation;
            }
			lastPosition = transform.position;
			lastRotation = transform.rotation;
		}
	}
}