From c2b84db5a20e3876a49367486fcd9ac7d3dcbe94 Mon Sep 17 00:00:00 2001 From: curt Date: Tue, 20 Jun 2000 00:30:30 +0000 Subject: [PATCH] Moving cloud functionality to sky section. --- simgear/sky/Makefile.am | 1 + simgear/sky/sky.cxx | 67 ++++++++++++++++++++++++++++++++--------- simgear/sky/sky.hxx | 54 +++++++++++++++++++++++++++------ 3 files changed, 98 insertions(+), 24 deletions(-) diff --git a/simgear/sky/Makefile.am b/simgear/sky/Makefile.am index d71c6201..1b809b91 100644 --- a/simgear/sky/Makefile.am +++ b/simgear/sky/Makefile.am @@ -1,6 +1,7 @@ noinst_LIBRARIES = libSky.a libSky_a_SOURCES = \ + cloud.cxx cloud.hxx \ dome.cxx dome.hxx \ moon.cxx moon.hxx \ oursun.cxx oursun.hxx \ diff --git a/simgear/sky/sky.cxx b/simgear/sky/sky.cxx index eb86def9..beff38a8 100644 --- a/simgear/sky/sky.cxx +++ b/simgear/sky/sky.cxx @@ -43,35 +43,45 @@ SGSky::~SGSky( void ) { // initialize the sky and connect the components to the scene graph at // the provided branch -ssgBranch * SGSky::build( double sun_size, double moon_size, - int nplanets, sgdVec3 *planet_data, - double planet_dist, - int nstars, sgdVec3 *star_data, double star_dist ) +void SGSky::build( double sun_size, double moon_size, + int nplanets, sgdVec3 *planet_data, + double planet_dist, + int nstars, sgdVec3 *star_data, double star_dist ) { - sky_selector = new ssgSelector; - sky_transform = new ssgTransform; + pre_root = new ssgRoot; + post_root = new ssgRoot; + + pre_selector = new ssgSelector; + post_selector = new ssgSelector; + + pre_transform = new ssgTransform; + post_transform = new ssgTransform; dome = new SGSkyDome; - sky_transform -> addKid( dome->build() ); + pre_transform -> addKid( dome->build() ); planets = new SGStars; - sky_transform -> addKid( planets->build(nplanets, planet_data, + pre_transform -> addKid( planets->build(nplanets, planet_data, planet_dist) ); stars = new SGStars; - sky_transform -> addKid( stars->build(nstars, star_data, star_dist) ); + pre_transform -> addKid( stars->build(nstars, star_data, star_dist) ); moon = new SGMoon; - sky_transform -> addKid( moon->build(tex_path, moon_size) ); + pre_transform -> addKid( moon->build(tex_path, moon_size) ); oursun = new SGSun; - sky_transform -> addKid( oursun->build(tex_path, sun_size) ); + pre_transform -> addKid( oursun->build(tex_path, sun_size) ); - sky_selector->addKid( sky_transform ); - sky_selector->clrTraversalMaskBits( SSGTRAV_HOT ); + pre_selector->addKid( pre_transform ); + pre_selector->clrTraversalMaskBits( SSGTRAV_HOT ); - return sky_selector; + post_selector->addKid( post_transform ); + post_selector->clrTraversalMaskBits( SSGTRAV_HOT ); + + pre_root->addKid( pre_selector ); + post_root->addKid( post_selector ); } @@ -93,6 +103,10 @@ bool SGSky::repaint( sgVec4 sky_color, sgVec4 fog_color, planets->repaint( sun_angle, nplanets, planet_data ); stars->repaint( sun_angle, nstars, star_data ); + for ( int i = 0; i < (int)cloud_layers.size(); ++i ) { + cloud_layers[i]->repaint( fog_color ); + } + return true; } @@ -104,7 +118,7 @@ bool SGSky::repaint( sgVec4 sky_color, sgVec4 fog_color, // spin specifies a rotation about the new Z axis (this allows // additional orientation for the sunrise/set effects and is used by // the skydome and perhaps clouds. -bool SGSky::reposition( sgVec3 view_pos, sgVec3 zero_elev, +bool SGSky::reposition( sgVec3 view_pos, sgVec3 zero_elev, sgVec3 view_up, double lon, double lat, double spin, double gst, double sun_ra, double sun_dec, double sun_dist, @@ -117,5 +131,28 @@ bool SGSky::reposition( sgVec3 view_pos, sgVec3 zero_elev, planets->reposition( view_pos, angle ); stars->reposition( view_pos, angle ); + for ( int i = 0; i < (int)cloud_layers.size(); ++i ) { + cloud_layers[i]->reposition( zero_elev, view_up, lon, lat ); + } + return true; } + + +// draw background portions of the sky +void SGSky::draw_background() { + ssgCullAndDraw( pre_root ); +} + + +// draw scenery elements of the sky +void SGSky::draw_scene() { + ssgCullAndDraw( post_root ); +} + + +void SGSky::add_cloud_layer( double asl ) { + SGCloudLayer *layer = new SGCloudLayer; + post_transform -> addKid( layer->build(tex_path, 20000.0f, asl) ); + cloud_layers.push_back( layer ); +} diff --git a/simgear/sky/sky.hxx b/simgear/sky/sky.hxx index 355fe14b..677ff6e4 100644 --- a/simgear/sky/sky.hxx +++ b/simgear/sky/sky.hxx @@ -33,25 +33,41 @@ #include // plib include +#include #include +#include + +#include "cloud.hxx" #include "dome.hxx" #include "moon.hxx" #include "oursun.hxx" #include "stars.hxx" +FG_USING_STD(vector); + + +typedef vector < SGCloudLayer* > layer_list_type; +typedef layer_list_type::iterator layer_list_iterator; +typedef layer_list_type::const_iterator layer_list_const_iterator; + class SGSky { +private: + // components of the sky SGSkyDome *dome; SGSun *oursun; SGMoon *moon; SGStars *planets; SGStars *stars; + layer_list_type cloud_layers; + + ssgRoot *pre_root, *post_root; - ssgSelector *sky_selector; - ssgTransform *sky_transform; + ssgSelector *pre_selector, *post_selector; + ssgTransform *pre_transform, *post_transform; FGPath tex_path; @@ -65,9 +81,9 @@ public: // initialize the sky and connect the components to the scene // graph at the provided branch - ssgBranch *build( double sun_size, double moon_size, - int nplanets, sgdVec3 *planet_data, double planet_dist, - int nstars, sgdVec3 *star_data, double star_dist ); + void build( double sun_size, double moon_size, + int nplanets, sgdVec3 *planet_data, double planet_dist, + int nstars, sgdVec3 *star_data, double star_dist ); // repaint the sky components based on current value of sun_angle, // sky, and fog colors. @@ -88,23 +104,43 @@ public: // spin specifies a rotation about the new Z axis (this allows // additional orientation for the sunrise/set effects and is used // by the skydome and perhaps clouds. - bool reposition( sgVec3 view_pos, sgVec3 zero_elev, + bool reposition( sgVec3 view_pos, sgVec3 zero_elev, sgVec3 view_up, double lon, double lat, double spin, double gst, double sun_ra, double sun_dec, double sun_dist, double moon_ra, double moon_dec, double moon_dist ); + // draw background portions of the sky + void draw_background(); + + // draw scenery elements of the sky + void draw_scene(); + // specify the texture path (optional, defaults to current directory) inline void texture_path( const string& path ) { tex_path = FGPath( path ); } - // enable the sky in the scene graph (default) - inline void enable() { sky_selector->select( 1 ); } + // enable the sky + inline void enable() { + pre_selector->select( 1 ); + post_selector->select( 1 ); + } // disable 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() { sky_selector->select( 0 ); } + inline void disable() { + pre_selector->select( 0 ); + post_selector->select( 0 ); + } + + // add a cloud layer (above see level in meters) + void add_cloud_layer( double asl ); + + inline int get_num_layers() const { return cloud_layers.size(); } + inline SGCloudLayer *get_cloud_layer( int i ) const { + return cloud_layers[i]; + } }; -- 2.39.2