// <pre>

package actor;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;

import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;

import render.Material;
import render.RenderApplet;
import render.RenderableContext;

public class PollyTrack extends RenderApplet implements RenderableContext
{
  Polly polly, polly2;
  Material clearPlastic =
    new Material().setDiffuse(1, 1, 1).setTransparency(.5).setDoubleSided(
      true);

  public PollyTrack()
  {
    super();
    addKeyListener(pollyBehaviorDemoKeyListener);
    addMouseListener(pollyBehaviorDemoMouseListener);
    addMouseMotionListener(pollyBehaviorDemoMouseListener);
  }

  public void initialize()
  {

    addLight(1, 1, 1, 1, 1, 1); // LIGHTS
    addLight(0, -1, 0, 1, 1, 1);
    setBgColor(.2, .2, .8); // BACKGROUND COLOR
    setFL(6); // CAMERA FOCAL LENGTH
    renderer.setCamera(9 * Math.PI / 8, Math.PI / 6);

    // MAKE THE TRANSPARENT FLOOR
    world.add().setMaterial(clearPlastic);
    world.child[0].disk(50);
    push(); 
      scale(3.5, 1.0, 3.5);
      rotateX(Math.PI / 2);
      transform(world.child[0]);
    pop();

    polly2 = new Polly();
    polly2.setColor(0.1, 0.9, 0.1);
    polly2.setSize(new Point3D(0.7, 0.7, 0.7));
    world.add(polly2.getGeometry());
    TravelBehavior tb = new TravelBehavior();
    polly2.addBehavior(tb);
    polly2.setDirection(new Point3D(0.0, 0.0, -1.0));
    polly2.setAnimation("hotfeet");

    polly = new Polly();
    polly.setSize(new Point3D(0.7, 0.7, 0.7));
    world.add(polly.getGeometry());
    SpiralActorBehavior sab = new SpiralActorBehavior(polly2, 2.5, 1.0);
    polly.addBehavior(sab);
    polly.setPosition(
      Point3D.add(new Point3D(polly2.getPosition()), new Point3D(-3.0, 0.0, 0.0)));
    polly.setAnimation("sprint");

  }

  public void animate(double time)
  {
    polly.update(WorldState.getInstance(this));
    polly2.update(WorldState.getInstance(this));
  }

  public KeyListener pollyBehaviorDemoKeyListener = new KeyAdapter()
  {
    public void keyPressed(KeyEvent arg0)
    {
      if (Character.isLowerCase(arg0.getKeyChar()) == true)
      {
        if (arg0.getKeyCode() >= KeyEvent.VK_A
          && arg0.getKeyCode() <= KeyEvent.VK_M)
        {
          polly.setAnimation(arg0.getKeyCode() - KeyEvent.VK_A);
        }
      }
      else if (Character.isUpperCase(arg0.getKeyChar()) == true)
      {
        if (arg0.getKeyCode() >= KeyEvent.VK_A
          && arg0.getKeyCode() <= KeyEvent.VK_M)
        {
          polly2.setAnimation(arg0.getKeyCode() - KeyEvent.VK_A);
        }
      }
    }
    
    public void keyReleased(KeyEvent arg0)
    {
      keyUp(null, arg0.getKeyChar());
    }
  };

  public MouseInputListener pollyBehaviorDemoMouseListener =
    new MouseInputAdapter()
  {
    public void mouseMoved(MouseEvent me)
    {
      mouseMove(null, me.getX(), me.getY());
    }

    public void mousePressed(MouseEvent me)
    {
      mouseDown(null, me.getX(), me.getY());
    }

    public void mouseDragged(MouseEvent me)
    {
      mouseDrag(null, me.getX(), me.getY());
    }

    public void mouseReleased(MouseEvent me)
    {
      mouseUp(null, me.getX(), me.getY());
    }
  };

}