import java.awt.*;
import java.lang.Math;

public class sortaHyperGear extends BufferedApplet {
	int wid_, hei_;
	long T0 = -1;
	double tlast_ = 0.;
	Vector3D mouse_ = new Vector3D();
	boolean pressing_ = false;
	Matrix3D view_ = new Matrix3D(),
		screen_ = new Matrix3D(),
		shebang_ = new Matrix3D();
	Color backg_ = Color.white;
	final double F = -10;

	enum WhichGears {First,Second,Third}
	WhichGears currentGears_ = WhichGears.First;
	double speed_ = 1.0;
	
	Gear gear_ = new Gear(16);

	public void init() {
		super.init();
		wid_ = getBounds().width;
		hei_ = getBounds().height;
		animating=true;
		int smdim = Math.min(hei_,wid_);
		screen_.identity();
		screen_.scale(smdim/2.,-smdim/2.,0);
		screen_.translate(wid_/2.,hei_/2.,0);
		
		view_.perspectivator(F);
		//view_.translate(0,0,-10);
		//view_.multiply(screen_,shebang_);
		
		//shebang_.copy(screen_);
		gear_.Smallify = 1.;
		gear_.build();
	}
	double ry_ = 0,rz_ = 0;
	public void render(Graphics g) {
		long T = System.currentTimeMillis();
		if(T0<0) {
			T0 = T;
			return; // in case zero time is bad
		}
		double t = (T-T0) / 1000.,
			dt = t - tlast_;
		Graphics2D g2 = (Graphics2D)g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
	    g.setColor(backg_);
     	g.fillRect(0,0,wid_,hei_);
     	
     	ry_ += dt*speed_/20.;
     	gear_.setRotationY(ry_);
     	rz_ += dt*speed_/15.;
     	gear_.setRotationZ(rz_);
     	
     	gear_.render(view_,screen_,t,dt);
     	gear_.draw(g);
     	
		tlast_ = t;
	}
	public boolean mouseMove(Event e, int wx, int wy) {
		mouse_.set(0,wx);
		mouse_.set(1,wy);
		return true;
	}
	public boolean mouseDown(Event e, int wx, int wy) {
		pressing_ = true;
		return true;
	}
	public boolean mouseUp(Event e, int wx, int wy) {
		pressing_ = false;
		return true;
	}
	public boolean keyDown(Event e, int key) {
		switch(key) {
		case Event.UP:
			speed_ *= 1.05;
			break;
		case Event.DOWN:
			speed_ /= 1.05;
			break;
		case 'z':
			break;
		case Event.RIGHT:
			break;
		case Event.LEFT:
			break;
		}			
		return true;
	}	
}
