//------------------------------------------------------------
// $Id: calcRadioIC.cc,v 1.2.2.1 2000/06/14 15:00:10 yamauchi Exp $
//------------------------------------------------------------
//	calcRadioIC.cc
//	calculation of Intensity Calcuration unit for radiosity 
//	1996/9/8, 1997/3/25
//	(C) 1995-1998 Copyright by Yamauchi Hitoshi
//
//	radiosity の輝度計算  
//------------------------------------------------------------
#include "mpi2_funcs.h"
#include "Option.h"
#include "PE.h"

//------------------------------------------------------------
// radiosity intensity の計算
//------------------------------------------------------------
void PEClass::
calcNsetIntensityRadio(Ray *pRay, const materialClass *const pMat,
		       objBaseClass * pHitPat)
{
    assert(pHitPat != NULL);
    assert(pHitPat->who() == TRIANGLE_OBJ_E);

    double   dAj      	    = pHitPat->getArea(); // 受けたパッチの面積
    const Vector3 Rho_j     = pMat->getDiffRef(); // 反射率
    // dBi*Fie*Ai(ref.Ray.h)
    const Vector3 dBiFieAi  = pRay->getColor(); 
    
    // ラジオシティ増加量 dRad = 
    // 反射率 * ラジオシティ * フォームファクタ * 放射パッチ面積 / 受け面積
    Vector3 dRad = (Rho_j * dBiFieAi) / dAj; 

    pHitPat->addUnshotRadiosity(dRad); // ラジオシティ値の増加

    // HemiCube::initialize にて既にパッチから放射分は引かれている
    // 放射可 && FRGのキューにない
    if((pHitPat->getNonRadEnergy() > this->mViewData.getMinRadEnergy()) && 
       (pHitPat->isInRadiationQueue() == NO)) 
    {
        pHitPat->setInRadiationQueue(); // lock する
	this->mRadPatchQueue.append((objBaseClass *)pHitPat);//放射キューに入る

	if(Option::getInstance()->getVerboseMode() == YES)
	{
	    cout << genHd(VERBOSEHEAD, this->getMyRank()) << 
		    "enqueue radiation patch : patch non rad enetgy = " << 
		    pHitPat->getNonRadEnergy() << endl;
	}
    }
}



