//pre 

package actor;

import render.Matrix;

/**
 * $Id: CircleBehavior.java,v 1.18 2004/03/04 02:59:47 robbins Exp $
 */
public class CircleBehavior extends AbstractBehavior
{
  private Point3D center;
  private double radius; 
  private Matrix rotationMatrix = new Matrix();
  private MotionChange returnValue = new MotionChange();

     
  // Constructors   =====================================  
  
  public CircleBehavior()
  {
    this(new Point3D(0,0,0), 2.5);
  }

  public CircleBehavior(Point3D center, double radius)
  {
    this.center = center;
    this.radius = radius;
  }
  
  // Public Methods =====================================
  
  public MotionChange doBehavior(WorldState world, InvariantActor actor)
  {
    double currentRadius = Point3D.subtract(actor.getPosition() , center).norm();
    
    double newActorYRotation =
      actor.getDirection().getYRotation()
        + actor.getSize().y * (actor.getAnimationTravel() / radius);
    
    rotationMatrix.identity();
    rotationMatrix.rotateY(newActorYRotation);

    Point3D actorRotation = Point3D.createDirectionVector(rotationMatrix);
    Point3D actorPosition =
      Point3D.add(center, Point3D.matrixTransform(rotationMatrix, -radius, 0, 0));

    returnValue.setOldValues(actor);
    returnValue.setNewDirection(actorRotation);
    returnValue.setNewPosition(actorPosition);

    return returnValue;
  }
  
}// end