1 // sky.cxx -- ssg based sky model
3 // Written by Curtis Olson, started December 1997.
4 // SSG-ified by Curtis Olson, February 2000.
6 // Copyright (C) 1997-2000 Curtis L. Olson - curt@flightgear.org
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License as
10 // published by the Free Software Foundation; either version 2 of the
11 // License, or (at your option) any later version.
13 // This program is distributed in the hope that it will be useful, but
14 // WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 #include <plib/ssg.h> // plib include
35 SGSky::SGSky( void ) {
40 SGSky::~SGSky( void ) {
44 // initialize the sky and connect the components to the scene graph at
45 // the provided branch
46 ssgBranch * SGSky::build( double sun_size, double moon_size,
47 int nplanets, sgdVec3 *planet_data,
49 int nstars, sgdVec3 *star_data, double star_dist )
51 sky_selector = new ssgSelector;
52 sky_transform = new ssgTransform;
55 sky_transform -> addKid( dome->build() );
57 planets = new SGStars;
58 sky_transform -> addKid( planets->build(nplanets, planet_data,
63 sky_transform -> addKid( stars->build(nstars, star_data, star_dist) );
66 sky_transform -> addKid( moon->build(tex_path, moon_size) );
69 sky_transform -> addKid( oursun->build(tex_path, sun_size) );
71 sky_selector->addKid( sky_transform );
72 sky_selector->clrTraversalMaskBits( SSGTRAV_HOT );
78 // repaint the sky components based on current value of sun_angle,
79 // sky, and fog colors.
81 // sun angle in degrees relative to verticle
82 // 0 degrees = high noon
83 // 90 degrees = sun rise/set
84 // 180 degrees = darkest midnight
85 bool SGSky::repaint( sgVec4 sky_color, sgVec4 fog_color,
86 double sun_angle, double moon_angle,
87 int nplanets, sgdVec3 *planet_data,
88 int nstars, sgdVec3 *star_data )
90 dome->repaint( sky_color, fog_color, sun_angle );
91 oursun->repaint( sun_angle );
92 moon->repaint( moon_angle );
93 planets->repaint( sun_angle, nplanets, planet_data );
94 stars->repaint( sun_angle, nstars, star_data );
100 // reposition the sky at the specified origin and orientation
102 // lon specifies a rotation about the Z axis
103 // lat specifies a rotation about the new Y axis
104 // spin specifies a rotation about the new Z axis (this allows
105 // additional orientation for the sunrise/set effects and is used by
106 // the skydome and perhaps clouds.
107 bool SGSky::reposition( sgVec3 view_pos, sgVec3 zero_elev,
108 double lon, double lat, double spin,
110 double sun_ra, double sun_dec, double sun_dist,
111 double moon_ra, double moon_dec, double moon_dist )
113 double angle = gst * 15; // degrees
114 dome->reposition( zero_elev, lon, lat, spin );
115 oursun->reposition( view_pos, angle, sun_ra, sun_dec, sun_dist );
116 moon->reposition( view_pos, angle, moon_ra, moon_dec, moon_dist );
117 planets->reposition( view_pos, angle );
118 stars->reposition( view_pos, angle );