package framework.RWT;

import java.util.Enumeration;

import javax.media.j3d.AmbientLight;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

import framework.model3D.BaseObject3D;
import framework.model3D.Position3D;
import framework.model3D.Universe;
import framework.view3D.Camera3D;

public class RWTSelectionCanvas3D extends RWTCanvas3D {
	Universe universe = null;
	BranchGroup objRoot = null;
	
	public RWTSelectionCanvas3D() {
		this(0.0, 0.0, 12.0);
	}

	public RWTSelectionCanvas3D(double cameraX, double cameraY, double cameraZ) {
		universe = new Universe();
		objRoot = new BranchGroup();
		objRoot.setCapability(BranchGroup.ALLOW_DETACH);
		objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
		objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
		objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
		universe.getRoot().addChild(objRoot);
		createLight(universe);
		setCamera(universe, cameraX, cameraY, cameraZ);
		universe.compile();
	}

	private void setCamera(Universe universe, double cameraX, double cameraY, double cameraZ) {
		Camera3D camera = new Camera3D(universe);
		camera.setViewPoint(new Position3D(cameraX, cameraY, cameraZ));
		camera.addTarget(new Position3D(0.0, 0.0, 0.0));
		camera.adjust(0L);
		attachCamera(camera);
	}

	void createLight(Universe universe) {
		// 環境光
		AmbientLight amblight = new AmbientLight(new Color3f(0.5f, 0.5f, 0.5f));
		amblight
				.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0));
		universe.placeLight(amblight);
		// 平行光源
		DirectionalLight dirlight = new DirectionalLight(true, // 光のON/OFF
				new Color3f(1.0f, 1.0f, 1.0f), // 光の色
				new Vector3f(0.0f, -1.0f, -0.5f) // 光の方向ベクトル
		);
		dirlight
				.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0));
		universe.placeLight(dirlight);
	}

	public void setObject(BaseObject3D obj) {
		BranchGroup newObj = new BranchGroup();
		newObj.setCapability(BranchGroup.ALLOW_DETACH);
		newObj.addChild(obj.getTransformGroupToPlace());
		objRoot.removeAllChildren();
		objRoot.addChild(newObj);
	}
}
