/*
 * $Id: CalcRayTrIC.java,v 1.3 2000/06/15 13:55:51 yamauchi Exp $
 *     (M\pi)^2 : Intensity Calcurator of Ray-Tracer 
 *	Copyright 1999 By YAMAUCHI Hitoshi 山内 斉 
 *	@author YAMAUCHI Hitoshi 山内 斉
 *	
 * original source calcRayTrIC.cc
 *
 *	レイトレーシング法での輝度計算
 * 
 *-- Mapping の実装はどこでやろうか
 *
 * 1999年8月27日(金)
 */


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

import	java.util.*;

import	jp.ac.tohoku.is.archi.mpi2.common.*;
import	jp.ac.tohoku.is.archi.mpi2.dda.*;
import	jp.ac.tohoku.is.archi.mpi2.net.*;
import	jp.ac.tohoku.is.archi.mpi2.obj.*;
import	jp.ac.tohoku.is.archi.mpi2.host.*;
import	jp.ac.tohoku.is.archi.mpi2.sysparam.*;
import	jp.ac.tohoku.is.archi.mpi2.util.*;


/*
 * NO_OUT_SHADE_ERROR が定義されていない場合には shading の計算に失敗
 * するとエラーメッセージを出力する 
 */

public final class CalcRayTrIC implements Mpi2Enum {

    /**
     * calculate Intensity 
     * 	輝度を計算し、それを ray に加えていく
     */
    public static void calcNsetIntensityRayTr(Ray ray, ObjectPrimitive hitobj,
					      int shadingScheme)
    {
	Assert.out(hitobj != null, "Error!: no ojbect calcNsetIntensityRayTr");

	// 輝度計算 計算済みの物体の拡散輝度を求める 
	// 拡散反射は計算されているとし、ここでは物体の拡散反射係数は掛けない
	Vector3 intensity = new Vector3(ray.peekColor());
	Vector3 rayCoeff  = new Vector3(ray.peekRefCoeff());	
	Vector3 shadedColor = new Vector3();
	
	// swich in most deep location, can I improve? IMPROVEME
	switch(shadingScheme)
	{
	case FlatShading:
	    // intensity += (ray.getRefCoeff()) * 
	    //		    (hitobj.getFlatRadiosityColor(ray.getHitPos()))
	    shadedColor.set(hitobj.newFlatRadiosityColor(ray.peekHitPos()));
	    break;
	case GouroudShading:
	    // intensity = intensity + (ray.getRefCoeff()) * 
	    //             (hitobj.getShadedRadiosityColor(ray.getHitPos()));
	    shadedColor.set(hitobj.newShadedRadiosityColor(ray.peekHitPos()));
	    break;
	default:
	    String s = "Internal Error!:illegal shading scheme"
		+ " in CalcRayTrIC.calcNsetIntensityRayTr";
	    throw new RuntimeException(s);
	}

	rayCoeff.mulVecHere(shadedColor);
	intensity.plusHere(rayCoeff);

	ray.setColor(intensity);

	//-- ray.incReflectedNum();	// 当たった回数を増加させる
	//-- 新たに new されることで増加するのではないだろうか FIXME

	//-- この面に反射したために減衰係数が変化するがそれは二次光の発生部
	//-- 分で行う 
    }
}
