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()); } }
void cGameLamp::SetFlicker(bool abX) { mbFlickering = abX; for(size_t i=0; i<mvLights.size(); ++i) { mvLights[i]->SetFlickerActive(mbFlickering); SetUpFlicker((int)i); } }
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); } }
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); } } }