Esempio n. 1
0
void Lighting::UpdateLights()
{

	Matrix3			Mat;
	int				i;
	ObjectState		Os;
	LightObject		*LightObj;
	LightState		Ls;
	RenderLight		Light;	
	TimeValue		Time = GetCOREInterface()->GetTime();
	Interval		valid;
	Point3			Pos,Target;

	m_Lights.clear();

	for(i=0;i<sceneLights.Count();i++)
	{

		INode * Node = sceneLights[i];
		Os   = Node->EvalWorldState(Time);
			
		if(Os.obj ) 
		{
			LightObj = (LightObject *)Os.obj;
			LightObj->EvalLightState(Time,valid,&Ls);

			Mat				= Node->GetNodeTM(Time);			
			Pos				= Mat.GetTrans();
			Light.m_Angle   = Ls.hotsize;

			if(Light.m_Angle < 2.0f)
			{
				Light.m_Angle = 2.0f;
			}

			Mat = Node->GetNodeTM(Time);
			Light.m_Dir = Mat.GetRow(2);

			Light.m_Type	= (RenderLightType)Ls.type;
			Light.m_Pos		= Pos;
			Light.m_Dir		= Light.m_Dir.Normalize();
			Light.m_Color	= Ls.color * Ls.intens;

			if(Ls.useAtten)
			{
				Light.m_Atten = true;

				if(Ls.attenStart <= 0.0f)
				{
					Light.m_InnerRange	= 1.0f;
				}
				else
				{
					Light.m_InnerRange	= 1.0f / (Ls.attenStart * 2.0f);
				}

				if(Ls.attenEnd <= 0.0f)
				{
					Light.m_OuterRange	= 0.0f;
				}
				else
				{	
					Light.m_OuterRange	= 1.0f / (Ls.attenEnd * 2.0f);
				}	
			}
			else
			{
				Light.m_Atten		= false;
				Light.m_InnerRange	= 0.1f;
				Light.m_OuterRange	= 0.00001f;
			}
			m_Lights.push_back(Light);
		}	
	}
}