//
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];
}