//

import render.*;

public class Snitch extends Actor
{
   public Snitch() {

      m = new Matrix();
      m.identity();
      for (int i = 0 ; i < stack.length ; i++)
         stack[i] = new Matrix();

      Material gold = new Material();
      gold.setColor(.4,.3,.12, .8*1.5,.6*1.5,.24*1.5,12, .3*1.5,.225*1.5,.09*1.5);
      add().ball(10).setMaterial(gold);

      Material white = new Material();
      white.setColor(.5,.5,.5, 0,0,0,1, .5,.5,.5).setTransparency(.1);

      add().cylinder(10).setMaterial(white);
      add().cylinder(10).setMaterial(white);
      add().ball(10).setMaterial(white);
      add().cylinder(10).setMaterial(white);
      add().cylinder(10).setMaterial(white);
      add().ball(10).setMaterial(white);

      Material aura1 = new Material();
      aura1.setColor(0,0,0, 0,0,0,1, 4,2,1.2).setTransparency(.75);
      add().ball(10).setMaterial(aura1);

      Material aura2 = new Material();
      aura2.setColor(0,0,0, 0,0,0,1, 4,2,1.2).setTransparency(.9);
      add().ball(10).setMaterial(aura2);
      add().ball(10).setMaterial(aura2);
   }

   double y=0, phase=0, rate=1, bounce=1;

   public void setRate(double r) {
      rate = r;
   }

   public void animate(double time) {
      super.animate(time);

      phase += rate * elapsed;
      y = 1 - (.3 + .5/rate) * Math.sin(phase);

      push();
         translate(x, y, z);
	 rotateY(theta);
	 scale(.2,.2,.2);
	 transform(this);
      pop();

      double flap1 = Math.cos(phase);
      double flap2 = Math.sin(phase) - flap1;

      double r = .6, w = .5, t = .2;

      push();
	 translate(0,0,-r);
	 rotateX(.5*flap1);
	 translate(0,0,-r);
	 push();
	    scale(w,t,r);
	    transform(child[1]);
         pop();
	 translate(0,0,-r);
	 rotateX(.5*flap2);
	 translate(0,0,-r);
	 push();
	    scale(w,t,r);
	    transform(child[2]);
	 pop();
	 translate(0,0,-r);
	 push();
	    rotateX(Math.PI/2);
	    scale(w,w,t);
	    transform(child[3]);
	 pop();
      pop();

      push();
	 translate(0,0,r);
	 rotateX(-.5*flap1);
	 translate(0,0,r);
	 push();
	    scale(w,t,r);
	    transform(child[4]);
         pop();
	 translate(0,0,r);
	 rotateX(-.5*flap2);
	 translate(0,0,r);
	 push();
	    scale(w,t,r);
	    transform(child[5]);
         pop();
	 translate(0,0,r);
	 push();
	    rotateX(Math.PI/2);
	    scale(w,w,t);
	    transform(child[6]);
	 pop();
      pop();

      push();
         scale(1.14,1.14,1.14);
	 transform(child[7]);
         scale(1.14,1.14,1.14);
	 transform(child[8]);
         scale(1.14,1.14,1.14);
	 transform(child[9]);
      pop();
   }

   void push() { stack[top++].copy(m); }
   void pop() { m.copy(stack[--top]); }
   void translate(double x,double y,double z) { m.translate(x,y,z); }
   void scale(double x,double y,double z) { m.scale(x,y,z); }
   void rotateX(double t) { m.rotateX(t); }
   void rotateY(double t) { m.rotateY(t); }
   void rotateZ(double t) { m.rotateZ(t); }
   void transform(Geometry g) { g.matrix.copy(m); }
   
   int top = 0;
   Matrix m, stack[] = new Matrix[20];
}