//<pre>

import java.awt.*;

public class Ship {

	World world;
	
	double x, y, z;
	double vx, vy, vz;
	double ax, ay, az;
	double hx, hy, hz;
	double gravity = 0.098;
	
	Camera myCamera;
	
	// array for all objects in world
	Shape3D myShapes[];
	int numShapes = 0;	

	Shape3D hull;
	Shape3D leftWing;
	Shape3D rightWing;
	Shape3D rutter;
	Shape3D rearTail;
	Shape3D rightEngine;
	Shape3D leftEngine;
	
	// Transformation stack
	MatrixStack S;	
	
	public Ship(World w) {

		world = w;

		x = 0;
		y = 0;
		z = 0;

 		myShapes = new Shape3D[10];

		myShapes[numShapes++] = new Sphere(world, 10);		
		hull = myShapes[numShapes-1];
		hull.setColor(Color.yellow);

		myShapes[numShapes++] = new Sphere(world, 10);		
		leftWing = myShapes[numShapes-1];
		leftWing.setColor(Color.yellow);
		
		myShapes[numShapes++] = new Sphere(world, 10);		
		rightWing = myShapes[numShapes-1];
		rightWing.setColor(Color.yellow);

		myShapes[numShapes++] = new Sphere(world, 10);		
		rutter = myShapes[numShapes-1];
		rutter.setColor(Color.yellow);

		myShapes[numShapes++] = new Sphere(world, 10);		
		rearTail = myShapes[numShapes-1];
		rearTail.setColor(Color.yellow);
		
		S = new MatrixStack();

	}
	
	public void forward() {
		vz += -0.1;
	}

	public void reverse() {
		vz += 0.1;
	}

	public void left() {
		hy += 0.1;
	}

	public void right() {
		hy += -0.1;
	}
	
	public void jump() {
		if (y == 0) {
			vy += -1;
		}
	}
	
	public void step() {
		vz = vz/1.2;
		
		x += vx;
		y += vy;

		z += vz;
			
		if (y > 0) {
			vy -= gravity;
		}
		if (y <= 0) {				
			y = 0;
			vy = 0;
		}
	}
	
	
	public void drawOn() {
			
		// render every triangle of each shape to viewport
		for (int k = 0; k < numShapes; k++) {
			world.drawShape(myShapes[k]);
		}

	}

	public void animate(Matrix3D I) {
	
		step();
		
		double time = System.currentTimeMillis() / 1000.0;
		S.initialize();
 		
 		double hullRadius = 1.0;
		double hullLength = 5.0;
		double wingLength = 3.0;
		double followingDistance = 1.5;
		double worldSize = 1000;
		
		S.m().copy(I);
		
		S.m().translate(x,y,z);
		
		S.m().translate(0.0,0.0,-2*hullLength);
		S.m().rotateX(hx);
		S.m().rotateY(hy);
		S.m().rotateZ(hz);
		// hull
		S.push();
			S.m().scale(hullRadius,hullRadius,hullLength);
			hull.update(S.m());
		S.pop();
		
		// leftWing
		S.push();
			S.m().translate(-wingLength,0,0.0);
			S.m().scale(wingLength,0.1,1.0);
			leftWing.update(S.m());
		S.pop();

		// leftWing
		S.push();
			S.m().translate(wingLength,0,0.0);
			S.m().scale(wingLength,0.1,1.0);
			rightWing.update(S.m());
		S.pop();
		
		S.push();
			S.m().translate(0.0,1.0,6*hullLength/7);
			S.m().rotateX(-Math.PI/6);
			// rutter
			S.push();
				S.m().scale(0.1,1.2,0.5);
				rutter.update(S.m());
			S.pop();
		
			// rearTail
			S.push();
				S.m().translate(0.0,1.2,0.0);
				S.m().rotateZ(Math.PI/2);
				S.m().scale(0.3,1.0,0.25);
				rearTail.update(S.m());
			S.pop();
		S.pop();
		
	}

}
