Пример #1
0
void cGameLamp::Init()
{	
	//////////////////////
	//Set up lights
	for(size_t i=0; i<mvLights.size(); ++i) 
	{
		mvLightColors.push_back(mvLights[i]->GetDiffuseColor());

		//Log("Setting lamp %s color to: %s\n",msName.c_str(),mvLights[i]->GetDiffuseColor().ToString().c_str());

		mvLights[i]->SetFlickerActive(mbFlickering);
		if(mbFlickering)
		{
			SetUpFlicker((int)i);	
		}

	}
	
	//////////////////////
	//Billboards
	for(size_t i=0; i<mvBillboards.size(); ++i) 
	{
		mvBBColors.push_back(mvBillboards[i]->GetColor());
	}
	
	//////////////////////
	//Set up Particle Systems
	mvParticleSystemNames.resize(mvParticleSystems.size());
	for(size_t i=0; i<mvParticleSystems.size(); ++i) 
	{
		mvParticleSystemNames[i].msName = mvParticleSystems[i]->GetName();
		mvParticleSystemNames[i].msDataName = mvParticleSystems[i]->GetDataName();
		mvParticleSystemNames[i].m_mtxTransform = mvParticleSystems[i]->GetLocalMatrix();
	}
	
	//////////////////////
	//Set up Materials
	if(msOffSubMesh == "" || mpMeshEntity->GetSubMeshEntityNum()==1)
	{
		mpSubMesh = mpMeshEntity->GetSubMeshEntity(0);
	}
	else
	{
		mpSubMesh = mpMeshEntity->GetSubMeshEntityName(msOffSubMesh);
	}
	if(mpSubMesh)
	{
		mpOffMaterial = mpInit->mpGame->GetResources()->GetMaterialManager()->CreateMaterial(msOffMaterialName);
		if(mpOffMaterial==NULL){
			Warning("Could not load material '%s'\n",msOffMaterialName.c_str());
			return;
		}
		
		mpOnMaterial = mpSubMesh->GetCustomMaterial();
	}
	else
	{
		Warning("Couldn't find sub mesh '%s' for lamp\n",msOffSubMesh.c_str());
	}
}
Пример #2
0
void cGameLamp::SetFlicker(bool abX)
{
	mbFlickering = abX;
	for(size_t i=0; i<mvLights.size(); ++i) 
	{
		mvLights[i]->SetFlickerActive(mbFlickering);
		SetUpFlicker((int)i);
	}
}
Пример #3
0
void cGameLamp::SetFlicker(bool abX)
{
	Log("cGameLamp::SetFlicker --> %s\n", msName.c_str());

	mbFlickering = abX;
	for(size_t i=0; i<mvLights.size(); ++i) 
	{
		mvLights[i]->SetFlickerActive(mbFlickering);
		SetUpFlicker((int)i);
	}
}
Пример #4
0
void cGameLamp::Update(float afTimeStep)
{
	Log("cGameLamp::Update -->%s\n", msName.c_str());

	////////////////////////////////
	//Update alpha
	if(mbFlickering && mbLit)
	{
		for(size_t i=0; i<mvLights.size(); ++i) 
		{
			if(	mvLights[i]->GetFlickerActive()==false &&
				mvLights[i]->IsFading()==false)
			{
				mvLights[i]->SetFlickerActive(true);
				SetUpFlicker((int)i);
			}

			// Play lights in openil
		}
	}

	////////////////////////////////
	//Check if material should be off because of flickering
	if(mbLit && mbFlickering && mpSubMesh && mpOffMaterial)
	{
		bool bHasLight = true;
		for(size_t i=0; i<mvLights.size(); ++i) 
		{
			iLight3D *pLight = mvLights[i];
			if(pLight->GetDiffuseColor() == cColor(0,0,0,0) ||
				pLight->GetFarAttenuation() <=0)
			{
				bHasLight = false;
				break;
			}
		}

		if(bHasLight)
		{
			if(mpOnMaterial)
				mpSubMesh->SetCustomMaterial(mpOnMaterial,false);
			else
				mpSubMesh->SetCustomMaterial(NULL,false);
		}
		else
		{
			mpSubMesh->SetCustomMaterial(mpOffMaterial,false);
		}
	}

	////////////////////////////////
	//Update alpha
	bool bChanged = false;
	if(mbLit && mfAlpha < 1)
	{
		mfAlpha += (1/mfTurnOnTime)*afTimeStep;
		if(mfAlpha > 1.0f) mfAlpha = 1.0f;
		bChanged = true;
	}
	else if(mbLit==false && mfAlpha>0)
	{
		mfAlpha -= (1/mfTurnOffTime)*afTimeStep;
		if(mfAlpha < 0) mfAlpha = 0;
		bChanged = true;
	}
	
	////////////////////////////////
	//Update billboards
    if(bChanged)
	{
		for(size_t i=0; i<mvBillboards.size(); ++i) 
		{
			mvBillboards[i]->SetColor(mvBBColors[i] * mfAlpha);
			
			if(mfAlpha ==0) 
				mvBillboards[i]->SetVisible(false);
			else if(mvBillboards[i]->IsVisible()==false)
				mvBillboards[i]->SetVisible(true);
		}
	}
}