// initialize lighting tables
void FGLight::init () {
SG_LOG( SG_EVENT, SG_INFO,
- "Initializing Lighting interpolation tables." );
+ "Initializing Lighting interpolation tables." );
// build the path names of the lookup tables
SGPath path( globals->get_fg_root() );
SGPropertyNode *prop = globals->get_props();
// Write Only
- prop->tie("/rendering/scene/saturation",SGRawValuePointer<float>(&_saturation));
- prop->tie("/rendering/scene/scattering",SGRawValuePointer<float>(&_scattering));
- prop->tie("/rendering/scene/overcast",SGRawValuePointer<float>(&_overcast));
+ tie(prop,"/rendering/scene/saturation", SGRawValuePointer<float>(&_saturation));
+ tie(prop,"/rendering/scene/scattering", SGRawValuePointer<float>(&_scattering));
+ tie(prop,"/rendering/scene/overcast", SGRawValuePointer<float>(&_overcast));
_sunAngleRad = prop->getNode("/sim/time/sun-angle-rad", true);
_sunAngleRad->setDoubleValue(_sun_angle);
-
+
// Read Only
- prop->tie("/rendering/scene/ambient/red",SGRawValuePointer<float>(&_scene_ambient[0]));
- prop->tie("/rendering/scene/ambient/green",SGRawValuePointer<float>(&_scene_ambient[1]));
- prop->tie("/rendering/scene/ambient/blue",SGRawValuePointer<float>(&_scene_ambient[2]));
- prop->tie("/rendering/scene/diffuse/red",SGRawValuePointer<float>(&_scene_diffuse[0]));
- prop->tie("/rendering/scene/diffuse/green",SGRawValuePointer<float>(&_scene_diffuse[1]));
- prop->tie("/rendering/scene/diffuse/blue",SGRawValuePointer<float>(&_scene_diffuse[2]));
- prop->tie("/rendering/scene/specular/red",SGRawValuePointer<float>(&_scene_specular[0]));
- prop->tie("/rendering/scene/specular/green",SGRawValuePointer<float>(&_scene_specular[1]));
- prop->tie("/rendering/scene/specular/blue",SGRawValuePointer<float>(&_scene_specular[2]));
- prop->tie("/rendering/dome/sun/red",SGRawValuePointer<float>(&_sun_color[0]));
- prop->tie("/rendering/dome/sun/green",SGRawValuePointer<float>(&_sun_color[1]));
- prop->tie("/rendering/dome/sun/blue",SGRawValuePointer<float>(&_sun_color[2]));
- prop->tie("/rendering/dome/sky/red",SGRawValuePointer<float>(&_sky_color[0]));
- prop->tie("/rendering/dome/sky/green",SGRawValuePointer<float>(&_sky_color[1]));
- prop->tie("/rendering/dome/sky/blue",SGRawValuePointer<float>(&_sky_color[2]));
- prop->tie("/rendering/dome/cloud/red",SGRawValuePointer<float>(&_cloud_color[0]));
- prop->tie("/rendering/dome/cloud/green",SGRawValuePointer<float>(&_cloud_color[1]));
- prop->tie("/rendering/dome/cloud/blue",SGRawValuePointer<float>(&_cloud_color[2]));
- prop->tie("/rendering/dome/fog/red",SGRawValuePointer<float>(&_fog_color[0]));
- prop->tie("/rendering/dome/fog/green",SGRawValuePointer<float>(&_fog_color[1]));
- prop->tie("/rendering/dome/fog/blue",SGRawValuePointer<float>(&_fog_color[2]));
+ tie(prop,"/rendering/scene/ambient/red", SGRawValuePointer<float>(&_scene_ambient[0]));
+ tie(prop,"/rendering/scene/ambient/green", SGRawValuePointer<float>(&_scene_ambient[1]));
+ tie(prop,"/rendering/scene/ambient/blue", SGRawValuePointer<float>(&_scene_ambient[2]));
+ tie(prop,"/rendering/scene/diffuse/red", SGRawValuePointer<float>(&_scene_diffuse[0]));
+ tie(prop,"/rendering/scene/diffuse/green", SGRawValuePointer<float>(&_scene_diffuse[1]));
+ tie(prop,"/rendering/scene/diffuse/blue", SGRawValuePointer<float>(&_scene_diffuse[2]));
+ tie(prop,"/rendering/scene/specular/red", SGRawValuePointer<float>(&_scene_specular[0]));
+ tie(prop,"/rendering/scene/specular/green", SGRawValuePointer<float>(&_scene_specular[1]));
+ tie(prop,"/rendering/scene/specular/blue", SGRawValuePointer<float>(&_scene_specular[2]));
+ tie(prop,"/rendering/dome/sun/red", SGRawValuePointer<float>(&_sun_color[0]));
+ tie(prop,"/rendering/dome/sun/green", SGRawValuePointer<float>(&_sun_color[1]));
+ tie(prop,"/rendering/dome/sun/blue", SGRawValuePointer<float>(&_sun_color[2]));
+ tie(prop,"/rendering/dome/sky/red", SGRawValuePointer<float>(&_sky_color[0]));
+ tie(prop,"/rendering/dome/sky/green", SGRawValuePointer<float>(&_sky_color[1]));
+ tie(prop,"/rendering/dome/sky/blue", SGRawValuePointer<float>(&_sky_color[2]));
+ tie(prop,"/rendering/dome/cloud/red", SGRawValuePointer<float>(&_cloud_color[0]));
+ tie(prop,"/rendering/dome/cloud/green", SGRawValuePointer<float>(&_cloud_color[1]));
+ tie(prop,"/rendering/dome/cloud/blue", SGRawValuePointer<float>(&_cloud_color[2]));
+ tie(prop,"/rendering/dome/fog/red", SGRawValuePointer<float>(&_fog_color[0]));
+ tie(prop,"/rendering/dome/fog/green", SGRawValuePointer<float>(&_fog_color[1]));
+ tie(prop,"/rendering/dome/fog/blue", SGRawValuePointer<float>(&_fog_color[2]));
+
// Properties used directly by effects
_chromeProps[0] = prop->getNode("/rendering/scene/chrome-light/red", true);
_chromeProps[1] = prop->getNode("/rendering/scene/chrome-light/green",
}
void FGLight::unbind () {
- SGPropertyNode *prop = globals->get_props();
- prop->untie("/rendering/scene/saturation");
- prop->untie("/rendering/scene/scattering");
- prop->untie("/rendering/scene/overcast");
- prop->untie("/rendering/scene/ambient/red");
- prop->untie("/rendering/scene/ambient/green");
- prop->untie("/rendering/scene/ambient/blue");
- prop->untie("/rendering/scene/diffuse/red");
- prop->untie("/rendering/scene/diffuse/green");
- prop->untie("/rendering/scene/diffuse/blue");
- prop->untie("/rendering/scene/specular/red");
- prop->untie("/rendering/scene/specular/green");
- prop->untie("/rendering/scene/specular/blue");
- prop->untie("/rendering/dome/sun/red");
- prop->untie("/rendering/dome/sun/green");
- prop->untie("/rendering/dome/sun/blue");
- prop->untie("/rendering/dome/sky/red");
- prop->untie("/rendering/dome/sky/green");
- prop->untie("/rendering/dome/sky/blue");
- prop->untie("/rendering/dome/cloud/red");
- prop->untie("/rendering/dome/cloud/green");
- prop->untie("/rendering/dome/cloud/blue");
- prop->untie("/rendering/dome/fog/red");
- prop->untie("/rendering/dome/fog/green");
- prop->untie("/rendering/dome/fog/blue");
+ _tiedProperties.Untie();
}
sky_brightness *= _saturation;
SG_LOG( SG_EVENT, SG_DEBUG,
- " ambient = " << ambient << " diffuse = " << diffuse
- << " specular = " << specular << " sky = " << sky_brightness );
+ " ambient = " << ambient << " diffuse = " << diffuse
+ << " specular = " << specular << " sky = " << sky_brightness );
// sky_brightness = 0.15; // used to force a dark sky (when testing)
// Do some sanity checking ...
if ( _sun_rotation < -2.0 * SGD_2PI || _sun_rotation > 2.0 * SGD_2PI ) {
- SG_LOG( SG_EVENT, SG_ALERT, "Sun rotation bad = " << _sun_rotation );
- return;
+ SG_LOG( SG_EVENT, SG_ALERT, "Sun rotation bad = " << _sun_rotation );
+ return;
}
if ( heading < -2.0 * SGD_2PI || heading > 2.0 * SGD_2PI ) {
- SG_LOG( SG_EVENT, SG_ALERT, "Heading rotation bad = " << heading );
- return;
+ SG_LOG( SG_EVENT, SG_ALERT, "Heading rotation bad = " << heading );
+ return;
}
if ( heading_offset < -2.0 * SGD_2PI || heading_offset > 2.0 * SGD_2PI ) {
- SG_LOG( SG_EVENT, SG_ALERT, "Heading offset bad = " << heading_offset );
- return;
+ SG_LOG( SG_EVENT, SG_ALERT, "Heading offset bad = " << heading_offset );
+ return;
}
static float gamma = system_gamma;
// direction to the sun
//double vert_rotation = pitch + pitch_offset;
- double hor_rotation = -_sun_rotation + SGD_PI - heading + heading_offset;
-
// revert to unmodified values before using them.
//
SGSky* thesky = globals->get_renderer()->getSky();
if (sif < 1e-4)
sif = 1e-4;
- float rf1 = fabs(fmod(hor_rotation, SGD_2PI) - SGD_PI) / SGD_PI;
- float rf2 = avf * pow(rf1*rf1, 1/sif) * 1.0639 * _saturation * _scattering;
-
- // HACK: clamp rf2 to 1.0.
- // Somehow, rf2 is huge at certain sun angles (around midnight), which results in
- // rf3 being negative and hence negative fog colors and weird display issues...
- // Something more fundamental may be wrong with the formulas here...
- if (rf2>1.0) rf2 = 1.0;
+ // determine horizontal angle between current view direction and sun
+ double hor_rotation = -_sun_rotation - SGD_PI_2 - heading + heading_offset;
+ if (hor_rotation < 0 )
+ hor_rotation = fmod(hor_rotation, SGD_2PI) + SGD_2PI;
+ else
+ hor_rotation = fmod(hor_rotation, SGD_2PI);
+ float rf1 = fabs((hor_rotation - SGD_PI) / SGD_PI); // 0.0 .. 1.0
+ float rf2 = avf * pow(rf1*rf1, 1/sif) * 1.0639 * _saturation * _scattering;
float rf3 = 1.0 - rf2;
gamma = system_gamma * (0.9 - sif*avf);