package framework.model3D;

import java.util.ArrayList;

import framework.gameMain.Actor;
import framework.gameMain.Movable;
import framework.physics.Ground;
import java3d.BranchGroup;
import java3d.Group;
import java3d.Leaf;
import java3d.Light;
import java3d.Node;
import java3d.Primitive;
import java3d.Shape3D;
import java3d.Transform3D;
import java3d.TransformGroup;

public class Universe {
	private BranchGroup root = null;
	private ArrayList<Light> lights = new ArrayList<Light>();
	private BackgroundBox skyBox = null;
	private Ground ground = null;
	private ArrayList<Movable> movableList = new ArrayList<Movable>();
	
	public Universe() {
		root = new BranchGroup();
	}
	
	
	public void update(long interval){
		for(int i = 0; i < movableList.size(); i++){
			Movable movable = movableList.get(i);
			movable.motion(interval,ground);			
		}
	}

	/**
	 * オブジェクトを配置する
	 * 
	 * @param obj
	 *            配置するオブジェクト
	 */
	public void place(Placeable obj) {
		if(obj instanceof Ground){
			ground = (Ground)obj;
		}
		if(obj instanceof Movable){
			movableList.add((Movable)obj);
		}			
		place(obj.getTransformGroupToPlace());
	}

	private void place(Node node) {
		root.addChild(node);
	}

	/**
	 * 後で取り除けるようにオブジェクトを配置する
	 * 
	 * @param obj
	 *            配置するオブジェクト
	 */
	public void placeDisplacable(Placeable obj) {
		placeDisplacable(obj.getTransformGroupToPlace());
	}

	private void placeDisplacable(Node node) {
		root.addChild(node);
	}

	/**
	 * 光源の追加
	 * 
	 * @param light
	 *            追加する光源
	 */
	public void placeLight(Light light) {
		getLights().add(light);
	}
	
	/**
	 * スカイボックスの追加
	 * @param skyBox 追加するスカイボックス
	 */
	public void placeSkyBox(BackgroundBox skyBox) {
		root.addChild(skyBox);		
		this.skyBox = skyBox;
	}

	/**
	 * オブジェクトを可能ならば取り除く
	 * 
	 * @param obj
	 *            取り除くオブジェクト
	 */
	public void displace(Placeable obj) {
		displace(obj.getTransformGroupToPlace());
	}

	private void displace(Node node) {
		root.removeChild(node);
	}

	public ArrayList<Light> getLights() {
		return lights;
	}

}
