package org.ntlab.radishforandroidstudio.framework.model3D;

import org.ntlab.radishforandroidstudio.java3d.Transform3D;

import java.util.ArrayList;

/**
 * オブジェクトの階層構造をトラバースするビジター
 * @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);
		}
	}

}
