/*
 * $Id: ObjectPrimitive.java,v 1.10 2000/06/15 13:55:51 yamauchi Exp $
 *     (M\pi)^2 : ObjectPrimitive
 *	Copyright 1999 By YAMAUCHI Hitoshi 山内 斉 
 *	@author YAMAUCHI Hitoshi 山内 斉
 *	
 * original source object.h
 * 
 *-- 1999年7月28日(水) 本日より前田さんがこの研究に加わった．
 * 元のクラス名が object なのでそのまま利用できない．
 * 物体については丁度良い機会なのである程度書き直してみる．
 * 
 * 本来はパッケージも primitive などにして違うディレクトリに生成すべき
 * であろうが，とにかく今は Java へのそのままの変換を重要視する． 
 *
 * 物体 ID を追加したが，これは TriangleObject でしか使用しないかもし
 * れない．1999年12月 8日(水)
 */

package jp.ac.tohoku.is.archi.mpi2.obj;

import java.lang.String;
import jp.ac.tohoku.is.archi.mpi2.util.Vector3;
import jp.ac.tohoku.is.archi.mpi2.util.IntVec3;
import java.io.Serializable;

/**
 * <code>ObjectPrimitive<code> interface represents object behavior.
 *
 * @author 	YAMAUCHI Hitoshi (山内斉)
 */
public abstract class ObjectPrimitive 
implements Serializable
{
    /*
     * object identifier 
     */
    public final static int OBJ_TRIANGLE 	= 0;
    public final static int OBJ_SPHERE 		= 1;
    public final static int OBJ_NULL		= 2;

    //
    private int  	mObjectID;	// この物体の ID (Shading 用)
    private int  	mMaterialID;	// この物体の material の ID
    private IntVec3	mSpcPos;   	// 部分空間の位置
    

    /**
     * constructor
     */
    public ObjectPrimitive(int objID, int matID, IntVec3 spcpos)
    {
     	this.mObjectID 	  = objID;
     	this.mMaterialID  = matID;
	this.mSpcPos 	  = new IntVec3(spcpos);
    }

    /**
     * object ID の取り出し．これは三角形にしか不要か?
     */
    public final int getObjectID()
    {
	return(this.mObjectID);	
    }

    /**
     * material の取り出し．この material は通常共有している．
     */
    public final int getMaterialID()
    {
	return(this.mMaterialID);	
    }

    /**
     * 分割空間位置
     */
    public final IntVec3 peekSpcPos()
    {
	return(this.mSpcPos);	
    }

    /**
     * 物体までの距離を求める(if ret PlusInfty =  not hit)
     *  @param  ray 		テストする ray 
     *  @param  hitPositionRef 	交差点があればこの Vector3 に返る
     * 	@return 物体までの距離
     */
    public abstract double getDistance(Ray aRay, Vector3 hitPositionRef);
    
    // shading のための輝度を返す(flat and shaded color)
    public abstract Vector3 newFlatRadiosityColor(Vector3 hitPos);
    public abstract Vector3 newShadedRadiosityColor(Vector3 hitPos);

    // 物体の法線ベクトルを返す arg = void の方は利用できない object あり
    // public abstract Vector3 peekNormal();
    public abstract Vector3 peekNormal(Vector3 hitpos);

    // identifier
    public abstract String toStringWithHead(String headder);
    public abstract String getMgfForm(int type);
    public abstract int who();

    /**
     * 正しい部分空間に存在しているのか 
     * @return 正しい空間にいれば true 
     */
    public abstract boolean isAtValidSpcPos(Vector3 partmin, 
					    Vector3 subSpcSize, 
					    int subduvnum);
}
