]> git.mxchange.org Git - flightgear.git/blob - Scenery/moon.c
Add xgl wrappers for debugging.
[flightgear.git] / Scenery / moon.c
1 /**************************************************************************
2  * moon.c
3  * Written by Durk Talsma. Started October 1997, for the flight gear project.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of the
8  * License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  *
19  * $Id$
20  * (Log is kept at end of this file)
21  **************************************************************************/
22
23
24 #include <math.h>
25 #include <GL/glut.h>
26 #include "../XGL/xgl.h"
27
28 #include "orbits.h"
29 #include "moon.h"
30
31 #include "../Include/general.h"
32 #include "../Main/views.h"
33 #include "../Time/fg_time.h"
34
35 struct CelestialCoord moonPos;
36
37 float xMoon, yMoon, zMoon;
38 GLint moon;
39
40 /*
41 static GLfloat vdata[12][3] =
42 {
43    {-X, 0.0, Z }, { X, 0.0, Z }, {-X, 0.0, -Z}, {X, 0.0, -Z },
44    { 0.0, Z, X }, { 0.0, Z, -X}, {0.0, -Z, -X}, {0.0, -Z, -X},
45    { Z, X, 0.0 }, { -Z, X, 0.0}, {Z, -X, 0.0 }, {-Z, -X, 0.0}
46 };
47
48 static GLuint tindices[20][3] =
49 {
50    {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},
51    {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},
52    {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},
53    {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11}
54 };*/
55
56 /* -------------------------------------------------------------
57       This section contains the code that generates a yellow
58       Icosahedron. It's under development... (of Course)
59 ______________________________________________________________*/
60 /*
61 void NormalizeVector(float v[3])
62 {
63    GLfloat d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
64    if (d == 0.0)
65    {
66       printf("zero length vector\n");
67       return;
68    }
69    v[0] /= d;
70    v[1] /= d;
71    v[2] /= d;
72 }
73
74 void drawTriangle(float *v1, float *v2, float *v3)
75 {
76    xglBegin(GL_POLYGON);
77    //xglBegin(GL_POINTS);
78       xglNormal3fv(v1);
79       xglVertex3fv(v1);
80       xglNormal3fv(v2);
81       xglVertex3fv(v2);
82       xglNormal3fv(v3);
83       xglVertex3fv(v3);
84    xglEnd();
85 }
86
87 void subdivide(float *v1, float *v2, float *v3, long depth)
88 {
89    GLfloat v12[3], v23[3], v31[3];
90    GLint i;
91
92    if (!depth)
93    {
94      drawTriangle(v1, v2, v3);
95      return;
96    }
97    for (i = 0; i < 3; i++)
98    {
99        v12[i] = (v1[i] + v2[i]);
100        v23[i] = (v2[i] + v3[i]);
101        v31[i] = (v3[i] + v1[i]);
102    }
103    NormalizeVector(v12);
104    NormalizeVector(v23);
105    NormalizeVector(v31);
106    subdivide(v1, v12, v31, depth - 1);
107    subdivide(v2, v23, v12, depth - 1);
108    subdivide(v3, v31, v23, depth - 1);
109    subdivide(v12, v23, v31,depth - 1);
110
111 } */
112 /*
113 void display(void)
114 {
115    int i;
116    xglClear(GL_COLOR_BUFFER_BIT);
117    xglPushMatrix();
118    xglRotatef(spin, 0.0, 0.0, 0.0);
119    xglColor3f(1.0, 1.0, 0.0);
120 //   xglBegin(GL_LINE_LOOP);
121    for (i = 0; i < 20; i++)
122    {
123
124        //xglVertex3fv(&vdata[tindices[i][0]][0]);
125        //xglVertex3fv(&vdata[tindices[i][1]][0]);
126        //xglVertex3fv(&vdata[tindices[i][2]][0]);
127
128        subdivide(&vdata[tindices[i][0]][0],
129                  &vdata[tindices[i][1]][0],
130                  &vdata[tindices[i][2]][0], 3);
131
132
133    }
134 //   xglEnd();
135   // xglFlush();
136   xglPopMatrix();
137   glutSwapBuffers();
138 } */
139
140 /* --------------------------------------------------------------
141
142       This section contains the code that calculates the actual
143       position of the moon in the night sky.
144
145 ----------------------------------------------------------------*/
146
147 struct CelestialCoord fgCalculateMoon(struct OrbElements params,
148                                       struct OrbElements sunParams,
149                                       struct fgTIME t)
150 {
151     struct CelestialCoord
152         result;
153     
154     double
155         eccAnom, ecl, lonecl, latecl, actTime,
156         xv, yv, v, r, xh, yh, zh, xg, yg, zg, xe, ye, ze,
157         Ls, Lm, D, F;
158
159     /* calculate the angle between ecliptic and equatorial coordinate system */
160     actTime = fgCalcActTime(t);
161     ecl = fgDegToRad(23.4393 - 3.563E-7 * actTime);  // in radians of course
162
163     /* calculate the eccentric anomaly */
164     eccAnom = fgCalcEccAnom(params.M, params.e);
165
166     /* calculate the moon's distance (d) and  true anomaly (v) */
167          xv = params.a * ( cos(eccAnom) - params.e);
168     yv = params.a * ( sqrt(1.0 - params.e*params.e) * sin(eccAnom));
169     v =atan2(yv, xv);
170     r = sqrt(xv*xv + yv*yv);
171
172     /* estimate the geocentric rectangular coordinates here */
173     xh = r * (cos(params.N) * cos(v + params.w) - sin(params.N) * sin(v + params.w) * cos(params.i));
174     yh = r * (sin(params.N) * cos(v + params.w) + cos(params.N) * sin(v + params.w) * cos(params.i));
175     zh = r * (sin(v + params.w) * sin(params.i));
176
177     /* calculate the ecliptic latitude and longitude here */
178     lonecl = atan2( yh, xh);
179     latecl = atan2( zh, sqrt( xh*xh + yh*yh));
180
181     /* calculate a number of perturbations */
182     Ls = sunParams.M + sunParams.w;
183     Lm =    params.M +    params.w + params.N;
184     D = Lm - Ls;
185     F = Lm - params.N;
186
187     lonecl += fgDegToRad(
188                             - 1.274 * sin (params.M - 2*D)                      // the Evection
189                 + 0.658 * sin (2 * D)                                                   // the Variation
190                 - 0.186 * sin (sunParams.M)                                     // the yearly variation
191                 - 0.059 * sin (2*params.M - 2*D)
192                 - 0.057 * sin (params.M - 2*D + sunParams.M)
193                 + 0.053 * sin (params.M + 2*D)
194                 + 0.046 * sin (2*D - sunParams.M)
195                 + 0.041 * sin (params.M - sunParams.M)
196                 - 0.035 * sin (D)                             // the Parallactic Equation
197                 - 0.031 * sin (params.M + sunParams.M)
198                 - 0.015 * sin (2*F - 2*D)
199                 + 0.011 * sin (params.M - 4*D)
200               ); /* Pheeuuwwww */
201     latecl += fgDegToRad(
202                 - 0.173 * sin (F - 2*D)
203                 - 0.055 * sin (params.M - F - 2*D)
204                 - 0.046 * sin (params.M + F - 2*D)
205                 + 0.033 * sin (F + 2*D)
206                 + 0.017 * sin (2 * params.M + F)
207               );  /* Yep */
208
209     r += (
210                      - 0.58 * cos(params.M - 2*D)
211               - 0.46 * cos(2*D)
212           ); /* Ok! */
213
214     xg = r * cos(lonecl) * cos(latecl);
215     yg = r * sin(lonecl) * cos(latecl);
216     zg = r *               sin(latecl);
217
218     xe  = xg;
219     ye = yg * cos(ecl) - zg * sin(ecl);
220     ze = yg * sin(ecl) + zg * cos(ecl);
221
222          result.RightAscension = atan2(ye, xe);
223     result.Declination = atan2(ze, sqrt(xe*xe + ye*ye));
224     return result;
225 }
226
227
228 void fgMoonInit() {
229     struct fgLIGHT *l;
230 //   int i;
231
232     l = &cur_light_params;
233
234     moon = xglGenLists(1);
235     xglNewList(moon, GL_COMPILE );
236
237     /* xglMaterialfv(GL_FRONT, GL_AMBIENT, l->scene_clear);
238     xglMaterialfv(GL_FRONT, GL_DIFFUSE, moon_color); */
239
240     fgSolarSystemUpdate(&(pltOrbElements[1]), cur_time_params);
241     moonPos = fgCalculateMoon(pltOrbElements[1], pltOrbElements[0], 
242                               cur_time_params);
243 #ifdef DEBUG
244     printf("Moon found at %f (ra), %f (dec)\n", moonPos.RightAscension, 
245            moonPos.Declination);
246 #endif
247
248     /* xMoon = 90000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination);
249        yMoon = 90000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination);
250        zMoon = 90000.0 * sin(moonPos.Declination); */
251
252     xMoon = 60000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination);
253     yMoon = 60000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination);
254     zMoon = 60000.0 * sin(moonPos.Declination);
255
256     glutSolidSphere(1.0, 15, 15);
257
258     xglEndList();
259 }
260
261
262 /* Draw the moon */
263 void fgMoonRender() {
264     struct fgLIGHT *l;
265     GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
266     GLfloat moon_color[4] = { 1.0, 1.0, 1.0, 1.0 };
267
268     l = &cur_light_params;
269
270     /* set lighting parameters */
271     xglLightfv(GL_LIGHT0, GL_AMBIENT, l->scene_clear );
272     xglLightfv(GL_LIGHT0, GL_DIFFUSE, moon_color );
273
274     xglMaterialfv(GL_FRONT, GL_AMBIENT, l->scene_clear );
275     xglMaterialfv(GL_FRONT, GL_AMBIENT, moon_color );
276     xglMaterialfv(GL_FRONT, GL_DIFFUSE, moon_color);
277
278     xglPushMatrix();
279     xglTranslatef(xMoon, yMoon, zMoon);
280     xglScalef(1400, 1400, 1400);
281
282     xglColor3fv(moon_color);
283     /* glutSolidSphere(1.0, 25, 25); */
284     xglCallList(moon);
285
286     xglPopMatrix();
287 }
288