package framework.physics;
import java3d.BranchGroup;
import java3d.TransformGroup;

import framework.model3D.BaseObject3D;
import framework.model3D.BoundingSurface;
import framework.model3D.Object3D;
import framework.model3D.Placeable;


/**
 * 地面などの（基本的に動かない）構造物を表すオブジェクト
 * @author 新田直也
 *
 */
public class Ground implements Placeable {
	private BaseObject3D groundObj = null;
	private BoundingSurface boundingSurface = null;		// 衝突判定用ボリュームのキャッシュ
	
	public Ground(BaseObject3D obj) {
		groundObj = obj;
	}
	
	public BaseObject3D getBody() {
		return groundObj;
	}
	
	public void updateBody(BaseObject3D obj) {
		groundObj = obj;
		boundingSurface = null;
	}

	@Override
	public TransformGroup getTransformGroupToPlace() {
		return groundObj.getTransformGroupToPlace();
	}

	/**
	 * 衝突判定用のボリュームを取得する
	 * @return 衝突判定用ボリューム（階層化されている場合がある）
	 */
	BoundingSurface getBoundingSurface() {
		if (boundingSurface == null) {
			// キャッシュに何も積まれていない場合のみ計算する
			BoundingSurfaceVisitor surfaceVisitor = new BoundingSurfaceVisitor();
			if (groundObj instanceof Object3D) {
				// Object3Dの場合階層構造をたどる
				((Object3D)groundObj).accept(surfaceVisitor);
			} else {
				// BaseObject3dの場合階層構造がない
				surfaceVisitor.baseVisit(groundObj);
			}
			boundingSurface = surfaceVisitor.getBoundingSurface();
		}
		return boundingSurface;
	}
}
