package framework.model3D;
import java.util.ArrayList;
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 render(IViewer3D viewer) {
viewer.update(lights, skyBox);
render(viewer, root);
}
private void render(IViewer3D viewer, Node node) {
if (node instanceof Group) {
if (node instanceof Primitive) {
viewer.draw((Primitive) node);
} else {
if (node instanceof TransformGroup) {
Transform3D transform = new Transform3D();
((TransformGroup) node).getTransform(transform);
//
// Vector3d vec = new Vector3d(1.0, 1.1, 1.0);
// transform.setScale(vec);
// AxisAngle4d aa = new AxisAngle4d(0.0, 0.0, 1.0, 1.0);
// transform.setRotation(aa);
//
viewer.pushTransform(transform);
for (int i = 0; i < ((Group) node).numChildren(); i++) {
Node node2 = ((Group) node).getChild(i);
render(viewer, node2);
}
viewer.popTransform();
} else {
for (int i = 0; i < ((Group) node).numChildren(); i++) {
Node node2 = ((Group) node).getChild(i);
render(viewer, node2);
}
}
}
} else if (node instanceof Leaf) {
viewer.draw(node);
}
}
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());
}
public 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) {
root.addChild(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;
}
}