float CEnvModifier::sum (CEnvModifier& M, Fvector3& view) { float _dist_sq = view.distance_to_sqr(M.position); if (_dist_sq>=(M.radius*M.radius)) return 0; float _att = 1-_sqrt(_dist_sq)/M.radius; //[0..1]; float _power = M.power*_att; far_plane += M.far_plane*_power; fog_color.mad (M.fog_color,_power); fog_density += M.fog_density*_power; ambient.mad (M.ambient,_power); // lmap_color.mad (M.lmap_color,_power); sky_color.mad (M.sky_color,_power); hemi_color.mad (M.hemi_color,_power); return _power; }
float CEnvModifier::sum(CEnvModifier& M, Fvector3& view) { float _dist_sq = view.distance_to_sqr(M.position); if (_dist_sq >= (M.radius*M.radius)) return 0; float _att = 1 - _sqrt(_dist_sq) / M.radius; //[0..1]; float _power = M.power*_att; if (M.use_flags.test(eViewDist)) { far_plane += M.far_plane*_power; use_flags.set(eViewDist, TRUE); } if (M.use_flags.test(eFogColor)) { fog_color.mad(M.fog_color, _power); use_flags.set(eFogColor, TRUE); } if (M.use_flags.test(eFogDensity)) { fog_density += M.fog_density*_power; use_flags.set(eFogDensity, TRUE); } if (M.use_flags.test(eAmbientColor)) { ambient.mad(M.ambient, _power); use_flags.set(eAmbientColor, TRUE); } if (M.use_flags.test(eSkyColor)) { sky_color.mad(M.sky_color, _power); use_flags.set(eSkyColor, TRUE); } if (M.use_flags.test(eHemiColor)) { hemi_color.mad(M.hemi_color, _power); use_flags.set(eHemiColor, TRUE); } return _power; }
void dx103DFluidRenderer::CalculateLighting(const dx103DFluidData &FluidData, FogLighting &LightData) { m_lstRenderables.clear_not_free(); LightData.Reset(); const dx103DFluidData::Settings &VolumeSettings = FluidData.GetSettings(); Fvector4 hemi_color = g_pGamePersistent->Environment().CurrentEnv->hemi_color; //hemi_color.mul(0.2f); hemi_color.mul(VolumeSettings.m_fHemi); LightData.m_vLightIntencity.set(hemi_color.x, hemi_color.y, hemi_color.z); LightData.m_vLightIntencity.add(g_pGamePersistent->Environment().CurrentEnv->ambient); const Fmatrix &Transform = FluidData.GetTransform(); Fbox box; box.min = Fvector3().set(-0.5f, -0.5f, -0.5f); box.max = Fvector3().set( 0.5f, 0.5f, 0.5f); box.xform(Transform); Fvector3 center; Fvector3 size; box.getcenter(center); box.getradius(size); // Traverse object database g_SpatialSpace->q_box ( m_lstRenderables, 0, //ISpatial_DB::O_ORDERED, STYPE_LIGHTSOURCE, center, size ); u32 iNumRenderables = m_lstRenderables.size(); // Determine visibility for dynamic part of scene for (u32 i=0; i<iNumRenderables; ++i) { ISpatial* spatial = m_lstRenderables[i]; // Light light* pLight = (light*) spatial->dcast_Light(); VERIFY(pLight); if (pLight->flags.bStatic) continue; float d = pLight->position.distance_to(Transform.c); float R = pLight->range + _max( size.x, _max( size.y, size.z ) ); if ( d >= R ) continue; Fvector3 LightIntencity; LightIntencity.set(pLight->color.r, pLight->color.g, pLight->color.b); //LightIntencity.mul(0.5f); //if (!pLight->flags.bStatic) // LightIntencity.mul(0.5f); float r = pLight->range; float a = clampr(1.f - d/(r+EPS),0.f,1.f)*(pLight->flags.bStatic?1.f:2.f); LightIntencity.mul(a); LightData.m_vLightIntencity.add(LightIntencity); } //LightData.m_vLightIntencity.set( 1.0f, 0.5f, 0.0f); //LightData.m_vLightIntencity.set( 1.0f, 1.0f, 1.0f); }