From fb54386f8d904477333af424a5cbedc6e09ede25 Mon Sep 17 00:00:00 2001 From: James Turner Date: Thu, 19 Dec 2013 17:20:06 +0000 Subject: [PATCH] Bugfix: remove SGSky minimum distance check. Without this, various sky rendering modes exhibit artefacts in low- visibility conditions. The cost of always rendering the dome is negligible. (And Rembrandt already had to work this way) --- simgear/scene/sky/sky.cxx | 30 ++++++++---------------------- simgear/scene/sky/sky.hxx | 27 ++------------------------- 2 files changed, 10 insertions(+), 47 deletions(-) diff --git a/simgear/scene/sky/sky.cxx b/simgear/scene/sky/sky.cxx index 77a491b7..ed7b13e0 100644 --- a/simgear/scene/sky/sky.cxx +++ b/simgear/scene/sky/sky.cxx @@ -39,7 +39,6 @@ // Constructor SGSky::SGSky( void ) { effective_visibility = visibility = 10000.0; - minimum_sky_visibility = 1000; // near cloud visibility state variables in_puff = false; @@ -62,10 +61,8 @@ SGSky::SGSky( void ) { cloud_root = new osg::Group; cloud_root->setNodeMask(simgear::MODEL_BIT); cloud_root->setName("SGSky-cloud-root"); - pre_selector = new osg::Switch; pre_transform = new osg::Group; - _ephTransform = new osg::MatrixTransform; // Set up a RNG that is repeatable within 10 minutes to ensure that clouds @@ -103,9 +100,7 @@ void SGSky::build( double h_radius_m, double v_radius_m, oursun = new SGSun; _ephTransform->addChild( oursun->build(tex_path, sun_size, property_tree_node ) ); - pre_selector->addChild( pre_transform.get() ); - - pre_root->addChild( pre_selector.get() ); + pre_root->addChild( pre_transform.get() ); } @@ -118,8 +113,6 @@ void SGSky::build( double h_radius_m, double v_radius_m, // 180 degrees = darkest midnight bool SGSky::repaint( const SGSkyColor &sc, const SGEphemeris& eph ) { - if ( effective_visibility > minimum_sky_visibility ) { - enable(); dome->repaint( sc.adj_sky_color, sc.sky_color, sc.fog_color, sc.sun_angle, effective_visibility ); @@ -133,10 +126,7 @@ bool SGSky::repaint( const SGSkyColor &sc, const SGEphemeris& eph ) cloud_layers[i]->repaint( sc.cloud_color ); } } - } else { - // turn off sky - disable(); - } + SGCloudField::updateFog((double)effective_visibility, osg::Vec4f(toOsg(sc.fog_color), 1.0f)); return true; @@ -195,6 +185,12 @@ bool SGSky::reposition( const SGSkyState &st, const SGEphemeris& eph, double dt return true; } +void +SGSky::set_visibility( float v ) +{ + visibility = std::max(v, 25.0f); +} + void SGSky::add_cloud_layer( SGCloudLayer * layer ) { @@ -297,16 +293,6 @@ void SGSky::set_3dCloudUseImpostors(bool imp) SGCloudField::setUseImpostors(imp); } -float SGSky::get_minimum_sky_visibility() const -{ - return minimum_sky_visibility; -} - -void SGSky::set_minimum_sky_visibility( float value ) -{ - minimum_sky_visibility = value; -} - void SGSky::texture_path( const string& path ) { tex_path = SGPath( path ); } diff --git a/simgear/scene/sky/sky.hxx b/simgear/scene/sky/sky.hxx index df325884..caf1f0fb 100644 --- a/simgear/scene/sky/sky.hxx +++ b/simgear/scene/sky/sky.hxx @@ -43,7 +43,6 @@ #include #include #include -#include #include #include @@ -224,7 +223,6 @@ private: layer_list_type cloud_layers; osg::ref_ptr pre_root, cloud_root; - osg::ref_ptr pre_selector; osg::ref_ptr pre_transform; osg::ref_ptr _ephTransform; @@ -234,7 +232,6 @@ private: // visibility float visibility; float effective_visibility; - float minimum_sky_visibility; int in_cloud; @@ -357,19 +354,6 @@ public: */ void texture_path( const string& path ); - /** Enable drawing of the sky. */ - inline void enable() { - pre_selector->setValue(0, 1); - } - - /** - * Disable drawing of the sky in the scene graph. The leaf node is still - * there, how ever it won't be traversed on by ssgCullandRender() - */ - inline void disable() { - pre_selector->setValue(0, 0); - } - /** * Get the current sun color */ @@ -421,14 +405,12 @@ public: /** @return current effective visibility */ - inline float get_visibility() const { return effective_visibility; } + float get_visibility() const { return effective_visibility; } /** Set desired clear air visibility. * @param v visibility in meters */ - inline void set_visibility( float v ) { - effective_visibility = visibility = (v <= 25.0) ? 25.0 : v; - } + void set_visibility( float v ); /** Get 3D cloud density */ double get_3dCloudDensity() const; @@ -487,10 +469,5 @@ public: void set_3dCloudWrap(bool wrap); - /** Get minimum sky visibility */ - float get_minimum_sky_visibility() const; - - /** Set minimum sky visibility */ - void set_minimum_sky_visibility( float value ); }; #endif // _SG_SKY_HXX -- 2.39.5