]> git.mxchange.org Git - simgear.git/blob - Astro/sun.c
Updated fgGENERAL to a "type" of struct.
[simgear.git] / Astro / sun.c
1 /**************************************************************************
2  * sun.c
3  *
4  * Written 1997 by Durk Talsma, started October, 1997.  For the flight gear
5  * project.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  *
21  * $Id$
22  * (Log is kept at end of this file)
23  **************************************************************************/
24
25 #include <GL/glut.h>
26 #include <XGL/xgl.h>
27
28 #include <Astro/orbits.h>
29 #include <Astro/sun.h>
30 #include <Include/fg_constants.h>
31 #include <Main/fg_debug.h>
32 #include <Main/views.h>
33 #include <Time/fg_time.h>
34 #include <Time/sunpos.h>
35
36 GLint sun_obj = 0;
37
38 static struct CelestialCoord sunPos;
39
40 fgSUNPOS solarPosition;
41
42 void fgCalcSunPos(struct OrbElements params)
43 {
44     double EccAnom, xv, yv, v, r;
45
46     /* calculate the eccentric anomaly */
47     EccAnom = fgCalcEccAnom(params.M, params.e);
48
49     /* calculate the Suns distance (r) and its true anomaly (v) */
50     xv = cos(EccAnom) - params.e;
51     yv = sqrt(1.0 - params.e*params.e) * sin(EccAnom);
52     v = atan2(yv, xv);
53     r = sqrt(xv*xv + yv*yv);
54
55     /* calculate the the Sun's true longitude (lonsun) */
56     solarPosition.lonSun = v + params.w;
57
58     /* convert true longitude and distance to ecliptic rectangular
59       geocentric coordinates (xs, ys) */
60     solarPosition.xs = r * cos (solarPosition.lonSun);
61     solarPosition.ys = r * sin (solarPosition.lonSun);
62     solarPosition.dist = r;
63     /* return solarPosition; */
64 }
65
66
67 struct CelestialCoord fgCalculateSun (struct OrbElements params, 
68                                       struct fgTIME t)
69 {
70     struct CelestialCoord result;
71     double xe, ye, ze, ecl, actTime;
72
73     /* calculate the angle between ecliptic and equatorial coordinate
74      * system */
75     actTime = fgCalcActTime (t);
76     ecl = DEG_TO_RAD * (23.4393 - 3.563E-7 * actTime);  // Angle now in Rads
77
78     /* calculate the sun's ecliptic position */
79     fgCalcSunPos (params);
80
81     /* convert ecliptic coordinates to equatorial rectangular
82      * geocentric coordinates */
83     xe = solarPosition.xs;
84     ye = solarPosition.ys * cos (ecl);
85     ze = solarPosition.ys * sin (ecl);
86
87     /* and finally... Calulate Right Ascention and Declination */
88     result.RightAscension = atan2 (ye, xe);
89     result.Declination = atan2 (ze, sqrt (xe * xe + ye * ye));
90     return result;
91 }
92
93
94 /* Initialize the Sun */
95 void fgSunInit( void ) {
96     struct fgLIGHT *l;
97     struct fgTIME *t;
98     struct fgVIEW *v;  
99     float xSun, ySun, zSun;
100
101     /* GLfloat color[4] = { 1.00, 1.00, 1.00, 1.00 }; */
102     double x_2, x_4, x_8, x_10;
103     GLfloat ambient;
104     GLfloat amb[4];
105
106     l = &cur_light_params;
107     t = &cur_time_params;
108     v = &current_view;
109
110     fgPrintf( FG_ASTRO, FG_INFO, "  Initializing the Sun\n");
111
112     // Calculate basic sun position
113     fgSolarSystemUpdate(&(pltOrbElements[0]), cur_time_params);
114     sunPos = fgCalculateSun(pltOrbElements[0], cur_time_params);
115
116     // Calculate additional sun position parameters based on the above
117     // position that are needed by other parts of FG
118     fgUpdateSunPos();
119
120     fgPrintf( FG_ASTRO, FG_INFO,
121               "Sun found at %f (ra), %f (dec)\n",
122               sunPos.RightAscension, sunPos.Declination);
123
124     xSun = 60000.0 * cos(sunPos.RightAscension) * cos(sunPos.Declination);
125     ySun = 60000.0 * sin(sunPos.RightAscension) * cos(sunPos.Declination);
126     zSun = 60000.0 * sin(sunPos.Declination);
127
128
129     if (sun_obj) {
130         xglDeleteLists(sun_obj, 1);
131     }
132
133     /* printf("First time through, creating sun display list\n"); */
134
135     sun_obj = xglGenLists(1);
136     xglNewList(sun_obj, GL_COMPILE );
137
138
139     t = &cur_time_params;
140     v = &current_view;
141     l = &cur_light_params;
142
143     x_2 = l->sun_angle * l->sun_angle;
144     x_4 = x_2 * x_2;
145     x_8 = x_4 * x_4;
146     x_10 = x_8 * x_2;
147
148     ambient = (0.4 * pow(1.1, -x_10 / 30.0));
149     if ( ambient < 0.3 ) ambient = 0.3;
150     if ( ambient > 1.0 ) ambient = 1.0;
151
152     amb[0] = 0.00 + ((ambient * 6.0) - 1.0);     /* minimum val = 0.8 */
153     amb[1] = 0.00 + ((ambient * 11.0) - 3.0);     /* minimum val = 0.3 */ 
154     amb[2] = 0.00 + ((ambient * 12.0) - 3.6);    /* minimum val = 0.0 */ 
155     amb[3] = 1.00;   
156
157     if (amb[0] > 1.0) amb[0] = 1.0;
158     if (amb[1] > 1.0) amb[1] = 1.0;
159     if (amb[2] > 1.0) amb[2] = 1.0;
160
161     fgPrintf( FG_ASTRO, FG_DEBUG,
162               "Color of the sun: %f, %f, %f\n"
163               "Ambient value   : %f\n"
164               "Sun Angle       : %f\n" ,
165               amb[0], amb[1], amb[2], ambient, l->sun_angle);
166
167     xglPushMatrix();
168     xglTranslatef(xSun, ySun, zSun);
169     xglScalef(1400, 1400, 1400);
170     xglColor3f(amb[0], amb[1], amb[2]); 
171     glutSolidSphere(1.0, 10, 10);
172     xglPopMatrix();
173     xglEndList();
174 }
175
176
177 /* Draw the Sun */
178 void fgSunRender( void ) {
179     xglCallList(sun_obj);
180 }
181
182
183 /* $Log$
184 /* Revision 1.8  1998/03/09 22:47:25  curt
185 /* Incorporated Durk's updates.
186 /*
187  * Revision 1.7  1998/02/23 19:07:56  curt
188  * Incorporated Durk's Astro/ tweaks.  Includes unifying the sun position
189  * calculation code between sun display, and other FG sections that use this
190  * for things like lighting.
191  *
192  * Revision 1.6  1998/02/12 21:59:39  curt
193  * Incorporated code changes contributed by Charlie Hotchkiss
194  * <chotchkiss@namg.us.anritsu.com>
195  *
196  * Revision 1.5  1998/02/02 20:53:24  curt
197  * To version 0.29
198  *
199  * Revision 1.4  1998/01/27 00:47:50  curt
200  * Incorporated Paul Bleisch's <bleisch@chromatic.com> new debug message
201  * system and commandline/config file processing code.
202  *
203  * Revision 1.3  1998/01/19 19:27:00  curt
204  * Merged in make system changes from Bob Kuehne <rpk@sgi.com>
205  * This should simplify things tremendously.
206  *
207  * Revision 1.2  1998/01/19 18:40:18  curt
208  * Tons of little changes to clean up the code and to remove fatal errors
209  * when building with the c++ compiler.
210  *
211  * Revision 1.1  1998/01/07 03:16:20  curt
212  * Moved from .../Src/Scenery/ to .../Src/Astro/
213  *
214  * Revision 1.12  1998/01/05 18:44:36  curt
215  * Add an option to advance/decrease time from keyboard.
216  *
217  * Revision 1.11  1997/12/30 23:09:40  curt
218  * Worked on winding problem without luck, so back to calling glFrontFace()
219  * 3 times for each scenery area.
220  *
221  * Revision 1.10  1997/12/30 20:47:54  curt
222  * Integrated new event manager with subsystem initializations.
223  *
224  * Revision 1.9  1997/12/30 16:36:54  curt
225  * Merged in Durk's changes ...
226  *
227  * Revision 1.8  1997/12/19 23:35:00  curt
228  * Lot's of tweaking with sky rendering and lighting.
229  *
230  * Revision 1.7  1997/12/17 23:12:16  curt
231  * Fixed so moon and sun display lists aren't recreate periodically.
232  *
233  * Revision 1.6  1997/12/15 23:55:04  curt
234  * Add xgl wrappers for debugging.
235  * Generate terrain normals on the fly.
236  *
237  * Revision 1.5  1997/12/12 21:41:31  curt
238  * More light/material property tweaking ... still a ways off.
239  *
240  * Revision 1.4  1997/12/10 22:37:53  curt
241  * Prepended "fg" on the name of all global structures that didn't have it yet.
242  * i.e. "struct WEATHER {}" became "struct fgWEATHER {}"
243  *
244  * Revision 1.3  1997/12/09 05:11:56  curt
245  * Working on tweaking lighting.
246  *
247  * Revision 1.2  1997/11/25 19:25:39  curt
248  * Changes to integrate Durk's moon/sun code updates + clean up.
249  *
250  * Revision 1.1  1997/10/25 03:16:11  curt
251  * Initial revision of code contributed by Durk Talsma.
252  *
253  */
254
255
256
257
258