]> git.mxchange.org Git - simgear.git/blobdiff - Astro/sun.c
Incorporated Durk's Astro/ tweaks. Includes unifying the sun position
[simgear.git] / Astro / sun.c
index 2c89ae3c1c58d22d10ec50bf6c8f9ed1078cc43c..2a04057bb450674941319e1bd2e5342d65df6127 100644 (file)
  **************************************************************************/
 
 #include <GL/glut.h>
-#include "../XGL/xgl.h"
+#include <XGL/xgl.h>
 
-#include "../Time/fg_time.h"
-#include "../Main/views.h"
-#include "orbits.h"
-#include "sun.h"
+#include <Astro/orbits.h>
+#include <Astro/sun.h>
+#include <Include/fg_constants.h>
+#include <Main/fg_debug.h>
+#include <Main/views.h>
+#include <Time/fg_time.h>
+#include <Time/sunpos.h>
 
-GLint sun_obj;
+GLint sun_obj = 0;
 
 static struct CelestialCoord sunPos;
 
-float xSun, ySun, zSun;
+fgSUNPOS solarPosition;
 
-struct SunPos fgCalcSunPos(struct OrbElements params)
+void fgCalcSunPos(struct OrbElements params)
 {
-    double
-       EccAnom, lonSun,
-        xv, yv, v, r;
-    struct SunPos
-       solarPosition;
+    double EccAnom, xv, yv, v, r;
 
     /* calculate the eccentric anomaly */
     EccAnom = fgCalcEccAnom(params.M, params.e);
@@ -54,37 +53,31 @@ struct SunPos fgCalcSunPos(struct OrbElements params)
     r = sqrt(xv*xv + yv*yv);
 
     /* calculate the the Sun's true longitude (lonsun) */
-    lonSun = v + params.w;
+    solarPosition.lonSun = v + params.w;
 
-       /* convert true longitude and distance to ecliptic rectangular geocentric
-      coordinates (xs, ys) */
-    solarPosition.xs = r * cos(lonSun);
-    solarPosition.ys = r * sin(lonSun);
+    /* convert true longitude and distance to ecliptic rectangular
+      geocentric coordinates (xs, ys) */
+    solarPosition.xs = r * cos (solarPosition.lonSun);
+    solarPosition.ys = r * sin (solarPosition.lonSun);
     solarPosition.dist = r;
-    return solarPosition;
+    /* return solarPosition; */
 }
 
 
 struct CelestialCoord fgCalculateSun(struct OrbElements params, struct fgTIME t)
 {
-       struct CelestialCoord
-               result;
-    struct SunPos
-       SolarPosition;
-    double
-       xe, ye, ze, ecl, actTime;
+    struct CelestialCoord result;
+    double xe, ye, ze, ecl, actTime;
 
     /* calculate the angle between ecliptic and equatorial coordinate system */
     actTime = fgCalcActTime(t);
-    ecl = fgDegToRad(23.4393 - 3.563E-7 * actTime);                    // Angle now in Rads
+    ecl = DEG_TO_RAD * (23.4393 - 3.563E-7 * actTime); // Angle now in Rads
 
-    /* calculate the sun's ecliptic position */
-    SolarPosition = fgCalcSunPos(params);
-
-       /* convert ecliptic coordinates to equatorial rectangular geocentric coordinates */
-    xe = SolarPosition.xs;
-    ye = SolarPosition.ys * cos(ecl);
-    ze = SolarPosition.ys * sin(ecl);
+    /* convert ecliptic coordinates to equatorial rectangular
+       geocentric coordinates */
+    xe = solarPosition.xs;
+    ye = solarPosition.ys * cos (ecl);
+    ze = solarPosition.ys * sin (ecl);
 
     /* and finally... Calulate Right Ascention and Declination */
     result.RightAscension = atan2( ye, xe);
@@ -95,46 +88,47 @@ struct CelestialCoord fgCalculateSun(struct OrbElements params, struct fgTIME t)
 
 /* Initialize the Sun */
 void fgSunInit( void ) {
-    static int dl_exists = 0;
+    struct fgLIGHT *l;
+    struct fgTIME *t;
+    struct fgVIEW *v;  
+    float xSun, ySun, zSun;
+
+    /* GLfloat color[4] = { 1.00, 1.00, 1.00, 1.00 }; */
+    double x_2, x_4, x_8, x_10;
+    GLfloat ambient;
+    GLfloat amb[4];
+
+    l = &cur_light_params;
+    t = &cur_time_params;
+    v = &current_view;
 
-    printf("  Initializing the Sun\n");
+    fgPrintf( FG_ASTRO, FG_INFO, "  Initializing the Sun\n");
 
+    // Calculate basic sun position
     fgSolarSystemUpdate(&(pltOrbElements[0]), cur_time_params);
     sunPos = fgCalculateSun(pltOrbElements[0], cur_time_params);
-#ifdef DEBUG
-    printf("Sun found at %f (ra), %f (dec)\n", sunPos.RightAscension, 
-          sunPos.Declination);
-#endif
+
+    // Calculate additional sun position parameters based on the above
+    // position that are needed by other parts of FG
+    fgUpdateSunPos();
+
+    fgPrintf( FG_ASTRO, FG_INFO,
+             "Sun found at %f (ra), %f (dec)\n",
+             sunPos.RightAscension, sunPos.Declination);
 
     xSun = 60000.0 * cos(sunPos.RightAscension) * cos(sunPos.Declination);
     ySun = 60000.0 * sin(sunPos.RightAscension) * cos(sunPos.Declination);
     zSun = 60000.0 * sin(sunPos.Declination);
 
-    if ( !dl_exists ) {
-       dl_exists = 1;
-
-       /* printf("First time through, creating sun display list\n"); */
-
-       sun_obj = xglGenLists(1);
-       xglNewList(sun_obj, GL_COMPILE );
 
-       glutSolidSphere(1.0, 10, 10);
-
-       xglEndList();
+    if (sun_obj) {
+       xglDeleteLists(sun_obj, 1);
     }
-}
 
+    /* printf("First time through, creating sun display list\n"); */
 
-/* Draw the Sun */
-void fgSunRender( void ) {
-    struct fgVIEW *v;
-    struct fgTIME *t;
-    struct fgLIGHT *l;
-    /* GLfloat color[4] = { 0.85, 0.65, 0.05, 1.0 }; */
-    GLfloat color[4] = { 1.00, 1.00, 1.00, 1.00 };
-    double x_2, x_4, x_8, x_10;
-    GLfloat ambient;
-    GLfloat amb[3], diff[3];
+    sun_obj = xglGenLists(1);
+    xglNewList(sun_obj, GL_COMPILE );
 
 
     t = &cur_time_params;
@@ -150,50 +144,62 @@ void fgSunRender( void ) {
     if ( ambient < 0.3 ) ambient = 0.3;
     if ( ambient > 1.0 ) ambient = 1.0;
 
-    amb[0] = 0.50 + ((ambient * 6.66) - 1.6);
-    amb[1] = 0.00 + ((ambient * 6.66) - 1.6);
-    amb[2] = 0.00 + ((ambient * 6.66) - 1.6);
-    amb[3] = 0.00;
-#ifdef DEBUG
-    printf("Color of the sun: %f, %f, %f\n"
-          "Ambient value   : %f\n"
-          "Sun Angle       : %f\n" , amb[0], amb[1], amb[2], ambient, t->sun_angle);
-#endif
-    diff[0] = 0.0;
-    diff[1] = 0.0;
-    diff[2] = 0.0;
-    diff[3] = 1.0;
-
-    /* set lighting parameters */
-    xglLightfv(GL_LIGHT0, GL_AMBIENT, color );
-    xglLightfv(GL_LIGHT0, GL_DIFFUSE, color );
-    xglMaterialfv(GL_FRONT, GL_AMBIENT, amb);
-    xglMaterialfv(GL_FRONT, GL_DIFFUSE, diff); 
-    xglMaterialfv(GL_FRONT, GL_SHININESS, diff);
-    xglMaterialfv(GL_FRONT, GL_EMISSION, diff);
-    xglMaterialfv(GL_FRONT, GL_SPECULAR, diff);
-
-    /* xglDisable( GL_LIGHTING ); */
+    amb[0] = 0.00 + ((ambient * 6.0) - 1.0);     /* minimum val = 0.8 */
+    amb[1] = 0.00 + ((ambient * 11.0) - 3.0);     /* minimum val = 0.3 */ 
+    amb[2] = 0.00 + ((ambient * 12.0) - 3.6);    /* minimum val = 0.0 */ 
+    amb[3] = 1.00;   
+
+    if (amb[0] > 1.0) amb[0] = 1.0;
+    if (amb[1] > 1.0) amb[1] = 1.0;
+    if (amb[2] > 1.0) amb[2] = 1.0;
+
+    fgPrintf( FG_ASTRO, FG_DEBUG,
+              "Color of the sun: %f, %f, %f\n"
+              "Ambient value   : %f\n"
+              "Sun Angle       : %f\n" ,
+              amb[0], amb[1], amb[2], ambient, l->sun_angle);
 
     xglPushMatrix();
     xglTranslatef(xSun, ySun, zSun);
     xglScalef(1400, 1400, 1400);
+    xglColor3f(amb[0], amb[1], amb[2]); 
+    glutSolidSphere(1.0, 10, 10);
+    xglPopMatrix();
+    xglEndList();
+}
 
-    xglColor3f(0.85, 0.65, 0.05);
 
+/* Draw the Sun */
+void fgSunRender( void ) {
     xglCallList(sun_obj);
-
-    xglPopMatrix();
-
-    /* xglEnable( GL_LIGHTING ); */
 }
 
 
 /* $Log$
-/* Revision 1.2  1998/01/19 18:40:18  curt
-/* Tons of little changes to clean up the code and to remove fatal errors
-/* when building with the c++ compiler.
+/* Revision 1.7  1998/02/23 19:07:56  curt
+/* Incorporated Durk's Astro/ tweaks.  Includes unifying the sun position
+/* calculation code between sun display, and other FG sections that use this
+/* for things like lighting.
 /*
+ * Revision 1.6  1998/02/12 21:59:39  curt
+ * Incorporated code changes contributed by Charlie Hotchkiss
+ * <chotchkiss@namg.us.anritsu.com>
+ *
+ * Revision 1.5  1998/02/02 20:53:24  curt
+ * To version 0.29
+ *
+ * Revision 1.4  1998/01/27 00:47:50  curt
+ * Incorporated Paul Bleisch's <bleisch@chromatic.com> new debug message
+ * system and commandline/config file processing code.
+ *
+ * Revision 1.3  1998/01/19 19:27:00  curt
+ * Merged in make system changes from Bob Kuehne <rpk@sgi.com>
+ * This should simplify things tremendously.
+ *
+ * Revision 1.2  1998/01/19 18:40:18  curt
+ * Tons of little changes to clean up the code and to remove fatal errors
+ * when building with the c++ compiler.
+ *
  * Revision 1.1  1998/01/07 03:16:20  curt
  * Moved from .../Src/Scenery/ to .../Src/Astro/
  *