void CEnvironment::lerp (float& current_weight) { if (bWFX&&(wfx_time<=0.f)) StopWFX(); SelectEnvs (fGameTime); VERIFY (Current[0]&&Current[1]); current_weight = TimeWeight(fGameTime,Current[0]->exec_time,Current[1]->exec_time); // modifiers CEnvModifier EM; EM.far_plane = 0; EM.fog_color.set ( 0,0,0 ); EM.fog_density = 0; EM.ambient.set ( 0,0,0 ); EM.sky_color.set ( 0,0,0 ); EM.hemi_color.set ( 0,0,0 ); EM.use_flags.zero (); Fvector view = Device.vCameraPosition; float mpower = 0; for (xr_vector<CEnvModifier>::iterator mit=Modifiers.begin(); mit!=Modifiers.end(); mit++) mpower += EM.sum(*mit,view); // final lerp CurrentEnv->lerp (this,*Current[0],*Current[1],current_weight,EM,mpower); }
void CEnvironment::SetWeather(shared_str name, bool forced) { //. static BOOL bAlready = FALSE; //. if(bAlready) return; if (name.size()) { //. bAlready = TRUE; EnvsMapIt it = WeatherCycles.find(name); if (it == WeatherCycles.end()) { Msg("! Invalid weather name: %s", name.c_str()); return; } R_ASSERT3 (it!=WeatherCycles.end(),"Invalid weather name.",*name); CurrentCycleName = it->first; if (forced) {Invalidate(); } if (!bWFX){ CurrentWeather = &it->second; CurrentWeatherName = it->first; } if (forced) {SelectEnvs(fGameTime); } #ifdef WEATHER_LOGGING Msg ("Starting Cycle: %s [%s]",*name,forced?"forced":"deferred"); #endif }else{ #ifndef _EDITOR FATAL ("! Empty weather name"); #endif } }
void CEnvironment::SelectEnvs(float gt) { VERIFY(CurrentWeather); if ((Current[0] == Current[1]) && (Current[0] == 0)) { VERIFY(!bWFX); // first or forced start SelectEnvs(CurrentWeather, Current[0], Current[1], gt); } else { bool bSelect = false; if (Current[0]->exec_time > Current[1]->exec_time) { // terminator bSelect = (gt > Current[1]->exec_time) && (gt < Current[0]->exec_time); } else { bSelect = (gt > Current[1]->exec_time); } if (bSelect) { Current[0] = Current[1]; SelectEnv(CurrentWeather, Current[1], gt); #ifdef WEATHER_LOGGING Msg("Weather: '%s' Desc: '%s' Time: %3.2f/%3.2f", CurrentWeatherName.c_str(), Current[1]->m_identifier.c_str(), Current[1]->exec_time, fGameTime); #endif } } }
void CEnvironment::OnFrame() { #ifdef _EDITOR SetGameTime (fGameTime+Device.fTimeDelta*fTimeFactor,fTimeFactor); if (fsimilar(ed_to_time,DAY_LENGTH)&&fsimilar(ed_from_time,0.f)){ if (fGameTime>DAY_LENGTH) fGameTime-=DAY_LENGTH; }else{ if (fGameTime>ed_to_time){ fGameTime=fGameTime-ed_to_time+ed_from_time; Current[0]=Current[1]=0; } if (fGameTime<ed_from_time){ fGameTime=ed_from_time; Current[0]=Current[1]=0; } } if (!psDeviceFlags.is(rsEnvironment)) return; #else if (!g_pGameLevel) return; #endif // if (pInput->iGetAsyncKeyState(DIK_O)) SetWeatherFX("surge_day"); if (bWFX&&(wfx_time<=0.f)) StopWFX(); SelectEnvs (fGameTime); VERIFY (Current[0]&&Current[1]); float current_weight = TimeWeight(fGameTime,Current[0]->exec_time,Current[1]->exec_time); // modifiers CEnvModifier EM; EM.far_plane = 0; EM.fog_color.set ( 0,0,0 ); EM.fog_density = 0; EM.ambient.set ( 0,0,0 ); EM.sky_color.set ( 0,0,0 ); EM.hemi_color.set ( 0,0,0 ); Fvector view = Device.vCameraPosition; float mpower = 0; for (xr_vector<CEnvModifier>::iterator mit=Modifiers.begin(); mit!=Modifiers.end(); mit++) mpower += EM.sum(*mit,view); // final lerp CurrentEnv.lerp (this,*Current[0],*Current[1],current_weight,EM,mpower); #ifndef SUN_DIR_NOT_DEBUG if(CurrentEnv.sun_dir.y>0) { Log("CurrentEnv.sun_dir", CurrentEnv.sun_dir); Log("current_weight", current_weight); Log("mpower", mpower); Log("Current[0]->sun_dir", Current[0]->sun_dir); Log("Current[1]->sun_dir", Current[1]->sun_dir); } #endif VERIFY2 (CurrentEnv.sun_dir.y<0,"Invalid sun direction settings in lerp"); if (::Render->get_generation()==IRender_interface::GENERATION_R2){ //. very very ugly hack if (HW.Caps.raster_major >= 3 && HW.Caps.geometry.bVTF){ // tonemapping in VS CurrentEnv.sky_r_textures.push_back (mk_pair(u32(D3DVERTEXTEXTURESAMPLER0),tonemap)); //. hack CurrentEnv.sky_r_textures_env.push_back (mk_pair(u32(D3DVERTEXTEXTURESAMPLER0),tonemap)); //. hack CurrentEnv.clouds_r_textures.push_back (mk_pair(u32(D3DVERTEXTEXTURESAMPLER0),tonemap)); //. hack } else { // tonemapping in PS CurrentEnv.sky_r_textures.push_back (mk_pair(2,tonemap)); //. hack CurrentEnv.sky_r_textures_env.push_back (mk_pair(2,tonemap)); //. hack CurrentEnv.clouds_r_textures.push_back (mk_pair(2,tonemap)); //. hack } } //. Setup skybox textures, somewhat ugly IDirect3DBaseTexture9* e0 = CurrentEnv.sky_r_textures[0].second->surface_get(); IDirect3DBaseTexture9* e1 = CurrentEnv.sky_r_textures[1].second->surface_get(); tsky0->surface_set (e0); _RELEASE(e0); tsky1->surface_set (e1); _RELEASE(e1); PerlinNoise1D->SetFrequency (wind_gust_factor*MAX_NOISE_FREQ); wind_strength_factor = clampr(PerlinNoise1D->GetContinious(Device.fTimeGlobal)+0.5f,0.f,1.f); int l_id = (current_weight<0.5f)?Current[0]->lens_flare_id:Current[1]->lens_flare_id; eff_LensFlare->OnFrame (l_id); int t_id = (current_weight<0.5f)?Current[0]->tb_id:Current[1]->tb_id; eff_Thunderbolt->OnFrame (t_id,CurrentEnv.bolt_period,CurrentEnv.bolt_duration); eff_Rain->OnFrame (); // ******************** Environment params (setting) CHK_DX(HW.pDevice->SetRenderState( D3DRS_FOGCOLOR, color_rgba_f(CurrentEnv.fog_color.x,CurrentEnv.fog_color.y,CurrentEnv.fog_color.z,0) )); CHK_DX(HW.pDevice->SetRenderState( D3DRS_FOGSTART, *(u32 *)(&CurrentEnv.fog_near) )); CHK_DX(HW.pDevice->SetRenderState( D3DRS_FOGEND, *(u32 *)(&CurrentEnv.fog_far) )); }