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;
}
}