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 = FGTime::cur_time_params;
103 //double x_2, x_4, x_8, x_10;*/
108 glDisable(GL_LIGHTING);
110 // Step 1: update all the positions
111 ourSun->updatePosition(t);
112 earthsMoon->updatePosition(t, ourSun);
113 mercury->updatePosition(t, ourSun);
114 venus->updatePosition(t, ourSun);
115 mars->updatePosition(t, ourSun);
116 jupiter->updatePosition(t, ourSun);
117 saturn->updatePosition(t, ourSun);
118 uranus->updatePosition(t, ourSun);
119 neptune->updatePosition(t, ourSun);
121 fgUpdateSunPos(); // get the right sun angle (especially important when
122 // running for the first time).
126 xglDeleteLists(displayList, 1);
128 displayList = xglGenLists(1);
130 FG_LOG( FG_ASTRO, FG_INFO, "Rebuilding astro display list" );
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...
138 // Euhh, actually the ecplise doesn't work...
140 earthsMoon->newImage();
141 // Step 2b: Add the sun
143 // Step 2c: Add the planets
145 mercury->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
146 venus ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
147 mars ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
148 jupiter->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
149 saturn ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
150 uranus ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
151 neptune->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
153 xglEnable(GL_LIGHTING);
158 /*****************************************************************************
159 * double SolarSystem::scaleMagnitude(double magn)
160 * This private member function rescales the original magnitude, as used in the
161 * astronomical sense of the word, into a value used by OpenGL to draw a
162 * convincing Star or planet
164 * Argument: the astronomical magnitude
166 * return value: the rescaled magnitude
167 ****************************************************************************/
168 double SolarSystem::scaleMagnitude(double magn)
170 double magnitude = (0.0 - magn) / 5.0 + 1.0;
171 magnitude = magnitude * 0.7 + (3 * 0.1);
172 if (magnitude > 1.0) magnitude = 1.0;
173 if (magnitude < 0.0) magnitude = 0.0;
177 /***************************************************************************
178 * void SolarSytem::addPlanetToList(double ra, double dec, double magn);
180 * This private member function first causes the magnitude to be properly
181 * rescaled, and then adds the planet to the display list.
183 * arguments: Right Ascension, declination, and magnitude
186 **************************************************************************/
187 void SolarSystem::addPlanetToList(double ra, double dec, double magn)
190 magnitude = scaleMagnitude ( magn );
192 fgLIGHT *l = &cur_light_params;
194 if ((double) (l->sun_angle - FG_PI_2) >
195 ((magnitude - 1.0) * - 20 * DEG_TO_RAD))
197 xglColor3f (magnitude, magnitude, magnitude);
198 xglVertex3f( 50000.0 * cos (ra) * cos (dec),
199 50000.0 * sin (ra) * cos (dec),
200 50000.0 * sin (dec));
205 SolarSystem* SolarSystem::theSolarSystem = 0;
207 /******************************************************************************
208 * void solarSystemRebuild()
209 * this a just a wrapper function, provided for use as an interface to the
211 *****************************************************************************/
212 void solarSystemRebuild()
214 SolarSystem::theSolarSystem->rebuild();