1 /**************************************************************************
3 * Written by Durk Talsma. Originally started October 1997, for distribution
4 * with the FlightGear project. Version 2 was written in August and
5 * September 1998. This code is based upon algorithms and data kindly
6 * provided by Mr. Paul Schlyter. (pausch@saaf.se).
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.
23 **************************************************************************/
34 # define exception c_exception
40 #include <Debug/logstream.hxx>
41 #include <Time/sunpos.hxx>
42 #include <Time/moonpos.hxx>
43 #include "solarsystem.hxx"
45 /***************************************************************************
46 * default constructor for class SolarSystem:
47 * or course there can only be one way to create an entire solar system -:) )
48 * the fgTIME argument is needed to properly initialize the the current orbital
50 *************************************************************************/
51 SolarSystem::SolarSystem(fgTIME *t)
55 FG_LOG( FG_GENERAL, FG_ALERT, "Error: only one solarsystem allowed" );
58 theSolarSystem = this;
60 earthsMoon = new Moon(t);
61 mercury = new Mercury(t);
64 jupiter = new Jupiter(t);
65 saturn = new Saturn(t);
66 uranus = new Uranus(t);
67 neptune = new Neptune(t);
72 /**************************************************************************
73 * the destructor for class SolarSystem;
74 **************************************************************************/
75 SolarSystem::~SolarSystem()
87 /****************************************************************************
88 * void SolarSystem::rebuild()
90 * this member function updates the positions for the sun, moon, and planets,
91 * and then rebuilds the display list.
95 ***************************************************************************/
96 void SolarSystem::rebuild()
98 //fgLIGHT *l = &cur_light_params;
99 fgTIME *t = &cur_time_params;
103 //double x_2, x_4, x_8, x_10;*/
109 glDisable(GL_LIGHTING);
112 // Step 1: update all the positions
113 ourSun->updatePosition(t);
114 earthsMoon->updatePosition(t, ourSun);
115 mercury->updatePosition(t, ourSun);
116 venus->updatePosition(t, ourSun);
117 mars->updatePosition(t, ourSun);
118 jupiter->updatePosition(t, ourSun);
119 saturn->updatePosition(t, ourSun);
120 uranus->updatePosition(t, ourSun);
121 neptune->updatePosition(t, ourSun);
123 fgUpdateSunPos(); // get the right sun angle (especially important when
124 // running for the first time).
128 xglDeleteLists(displayList, 1);
130 displayList = xglGenLists(1);
132 // Step 2: rebuild the display list
133 xglNewList( displayList, GL_COMPILE);
135 // Step 2a: Add the moon...
136 // Not that it is preferred to draw the moon first, and the sun next, in order to mime a
137 // solar eclipse. This is yet untested though...
139 earthsMoon->newImage();
140 // Step 2b: Add the sun
146 // Step 2c: Add the planets
148 mercury->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
149 venus ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
150 mars ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
151 jupiter->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
152 saturn ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
153 uranus ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
154 neptune->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
156 xglEnable(GL_LIGHTING);
161 /*****************************************************************************
162 * double SolarSystem::scaleMagnitude(double magn)
163 * This private member function rescales the original magnitude, as used in the
164 * astronomical sense of the word, into a value used by OpenGL to draw a
165 * convincing Star or planet
167 * Argument: the astronomical magnitude
169 * return value: the rescaled magnitude
170 ****************************************************************************/
171 double SolarSystem::scaleMagnitude(double magn)
173 double magnitude = (0.0 - magn) / 5.0 + 1.0;
174 magnitude = magnitude * 0.7 + (3 * 0.1);
175 if (magnitude > 1.0) magnitude = 1.0;
176 if (magnitude < 0.0) magnitude = 0.0;
180 /***************************************************************************
181 * void SolarSytem::addPlanetToList(double ra, double dec, double magn);
183 * This private member function first causes the magnitude to be properly
184 * rescaled, and then adds the planet to the display list.
186 * arguments: Right Ascension, declination, and magnitude
189 **************************************************************************/
190 void SolarSystem::addPlanetToList(double ra, double dec, double magn)
193 magnitude = scaleMagnitude ( magn );
195 fgLIGHT *l = &cur_light_params;
197 if ((double) (l->sun_angle - FG_PI_2) >
198 ((magnitude - 1.0) * - 20 * DEG_TO_RAD))
200 xglColor3f (magnitude, magnitude, magnitude);
201 xglVertex3f( 50000.0 * cos (ra) * cos (dec),
202 50000.0 * sin (ra) * cos (dec),
203 50000.0 * sin (dec));
208 SolarSystem* SolarSystem::theSolarSystem = 0;
210 /******************************************************************************
211 * void solarSystemRebuild()
212 * this a just a wrapper function, provided for use as an interface to the
214 *****************************************************************************/
215 void solarSystemRebuild()
217 SolarSystem::theSolarSystem->rebuild();