//<pre>

package actor;

import java.util.*;

public class Polly extends AbstractActor
{
  // INSTANCE DATA
  private List keyFrameAnimations;
  private KeyFrameAnimation currentAnimation;
  
  public Polly() 
  {
    model = new PollyGeometry();
    // add appropriate Arbitrator as default
    setArbitrator(new ActorArbitrator(this));
    keyFrameAnimations = addStockAnimations(); 
    Iterator keyFrameAnimationsIter = keyFrameAnimations.iterator();  
    currentAnimation = getAnimationByName("idle");
    
    getArbitrator().getAnimationManager().changeAnimation(currentAnimation);    
    setDirection(new Point3D(0,0,1));
  }
  
  
  public void setAnimation(KeyFrameAnimation kFA) 
  {   
    getArbitrator().getAnimationManager().changeAnimation(kFA);
    currentAnimation = kFA;
  }

  public void setAnimation(int animationIndex) 
  {
    KeyFrameAnimation kFA = getAnimationByIndex(animationIndex);
    setAnimation(kFA);
  }
  
  public void setAnimation(String animationName) 
  {
    KeyFrameAnimation kFA = getAnimationByName(animationName);
    setAnimation(kFA);
  }
  
    
  public KeyFrameAnimation getAnimationByIndex(int animationIndex)
  {
    return (KeyFrameAnimation)keyFrameAnimations.get(animationIndex);
  }
  
  public KeyFrameAnimation getAnimationByName(String name)
  {
    Iterator keyFrameIter = keyFrameAnimations.iterator();
    while (keyFrameIter.hasNext())
    {
      KeyFrameAnimation kFA = (KeyFrameAnimation)keyFrameIter.next();
      if (name.compareToIgnoreCase(kFA.getName()) == 0)
      {
        return getAnimationByIndex(keyFrameAnimations.indexOf(kFA));
      }
    }
    return null;
  }
    
  public void update(WorldState world) 
  {
    getCurrentArbitrator().arbitrate(world, this);
    world.push();
      world.translate(position);
      world.rotateY(Math.PI + direction.getYRotation());
      world.scale(size);
      model.setMatrix(world.getTopMatrix());
    world.pop();    
  }
  
  public List addStockAnimations()
  {
    List animations = new ArrayList();
    for(int i = 0; i < AnimationFactory.getStockAnimationCount(); i++)
      animations.add(AnimationFactory.getAnimationByIndex(i));
    return animations;
  }

  public void updateMotion(MotionChange p)
  {
    if (p != null)
    {
      if (p.getNewDirection() != null)
        direction = p.getNewDirection();

      if (p.getNewPosition() != null)
        position = p.getNewPosition();

      if (p.getNewVelocity() != null)
        velocity = p.getNewVelocity();
    }
  }
  
  public void setColor(double r, double g, double b)
  {
    PollyGeometry pG = (PollyGeometry)this.getModel();
    pG.setColor(r, g, b);
  }
  
}// end