using System;
using UnityEngine;
namespace Framework.Cameras {
  /// Controls a camera in a 2.5D platformer
  public class PlatformerCameraController : CameraController {
    /// Height adjustment of the camera
    public float ExtraHeight = 1.0f;
    /// Distance from which the camera observes the target
    public float Distance = 8.0f;
    /// Called once per physics frame
    protected void FixedUpdate() {
      if(base.Target != null) {
        this.targetPosition = base.Target.position;
      }
      Vector3 adjustedTargetPosition = this.targetPosition;
      adjustedTargetPosition.y += this.ExtraHeight;
      adjustedTargetPosition.z -= this.Distance;
      Vector3 newPosition = transform.position;
      {
        float elapsedTime = Time.fixedDeltaTime;
        while(elapsedTime > 0.01f) { // Poor man's integration
          newPosition += (adjustedTargetPosition - newPosition) / 8.0f;
          elapsedTime -= 0.01f;
        }
        newPosition += (adjustedTargetPosition - newPosition) / 8.0f * (elapsedTime * 100.0f);
      }
      transform.position = newPosition;
    }
    /// Position of the camera's current or latest valid target
    protected Vector3 TargetPosition {
      get { return this.targetPosition; }
    }
    /// Current position of the camera's target
    private Vector3 targetPosition;
  }
} // namespace Framework.Cameras