package game;

import framework.model3D.BaseObject3D;
import framework.model3D.GeometryUtility;
import framework.model3D.Object3D;
import framework.model3D.Placeable;
import framework.model3D.Position3D;
import framework.model3D.Quaternion3D;
import framework.physics.Solid3D;
import java3d.AxisAngle4d;
import java3d.Transform3D;
import java3d.TransformGroup;
import java3d.Vector3d;

public class Entity implements Placeable {
protected Object3D body;
protected Vector3d direction = new Vector3d(1.0, 0.0, 0.0);

	@Override
	public TransformGroup getTransformGroupToPlace() {
		// TODO Auto-generated method stub
		return body.getTransformGroupToPlace();
	}

	@Override
	public BaseObject3D getBody() {
		// TODO Auto-generated method stub
		return body;
	}
	
	public Position3D getPosition() {
		return body.getPosition3D();
	}
	
	public void setPosition(Position3D p) {
		body.apply(p, false);
	}

	public Vector3d getDirection() {
		Vector3d dir = new Vector3d(direction);
		Transform3D trans = new Transform3D();
		trans.set(((Solid3D)body).getQuaternion().getAxisAngle());
		trans.transform(dir);
		return dir;
	}	
	
	public void setDirection(Vector3d vec) {
		Vector3d v1 = new Vector3d();
		Vector3d v2 = new Vector3d();
		v1.cross(direction, GeometryUtility.Y_AXIS);
		v2.cross(vec, GeometryUtility.Y_AXIS);
		if (v2.length() < GeometryUtility.TOLERANCE) return;
		v1.normalize();
		v2.normalize();
		double cos = v1.dot(v2);
		v1.cross(v1, v2);
		double sin = v1.dot(GeometryUtility.Y_AXIS);
		double angle = Math.atan2(sin, cos);
		AxisAngle4d axisAngle = new AxisAngle4d(GeometryUtility.Y_AXIS, angle); 
		Quaternion3D quat = new Quaternion3D(axisAngle);
		((Solid3D)body).apply(quat, false);
	}
	
	public void setInitialDirection(Vector3d dir) {
		direction = dir;
	}
	
}
