package framework.model3D; import java.util.ArrayList; import java3d.Transform3D; /** * オブジェクトの階層構造をトラバースするビジター * @author 新田直也 * */ public abstract class ObjectVisitor { /** * 根から訪問節点までのパス上に存在する変換行列 */ protected ArrayList<Transform3D> stackList = new ArrayList<Transform3D>(); /* * 節点(オブジェクト)を訪問する直前に呼ばれるメソッド * @param obj 訪問節点 */ public abstract void preVisit(Object3D obj); /** * 節点(オブジェクトを訪問した直後に呼ばれるメソッド) * @param obj 訪問節点 */ public abstract void postVisit(Object3D obj); /** * 1階層潜ったときに変換行列を増やす * @param obj 新しく訪問した節点 */ protected void pushTransform(Object3D obj) { Transform3D transPos = new Transform3D(); obj.pos.getTransform(transPos); stackList.add(transPos); Transform3D transRot = new Transform3D(); obj.rot.getTransform(transRot); stackList.add(transRot); Transform3D transScale = new Transform3D(); obj.scale.getTransform(transScale); stackList.add(transScale); Transform3D transCenter = new Transform3D(); obj.center.getTransform(transCenter); stackList.add(transCenter); } /** * 1階層復帰したときに変換行列を 減らす */ protected void popTransform() { for (int i = 0; i < 4; i++) { stackList.remove(stackList.size() - 1); } } }