]> git.mxchange.org Git - flightgear.git/blobdiff - Time/sunpos.c
Incorporated Paul Bleisch's <bleisch@chromatic.com> new debug message
[flightgear.git] / Time / sunpos.c
index 186e6cfa99b716a70cd4c183d516c8eb3eb0b8f1..3f4c4e5cde8325fa4cae41170073508d089e5e21 100644 (file)
 #include <stdio.h>
 #include <time.h>
 
-#include "sunpos.h"
-#include "fg_time.h"
-#include "../constants.h"
-#include "../GLUT/views.h"
-#include "../Math/fg_geodesy.h"
-#include "../Math/mat3.h"
-#include "../Math/polar.h"
+#include <Time/sunpos.h>
+#include <Time/fg_time.h>
+#include <Include/fg_constants.h>
+#include <Main/views.h>
+#include <Math/fg_geodesy.h>
+#include <Math/mat3.h>
+#include <Math/polar.h>
+
 
 #undef E
 
@@ -260,52 +261,180 @@ void fgSunPosition(time_t ssue, double *lon, double *lat) {
 
 
 /* update the cur_time_params structure with the current sun position */
-void fgUpdateSunPos(struct fgCartesianPoint scenery_center) {
+void fgUpdateSunPos( void ) {
+    struct fgLIGHT *l;
     struct fgTIME *t;
-    struct VIEW *v;
+    struct fgVIEW *v;
     MAT3vec nup, nsun;
+    /* if the 4th field is 0.0, this specifies a direction ... */
+    GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
+    /* base sky color */
+    GLfloat base_sky_color[4] =        {0.60, 0.60, 0.90, 1.0};
+    /* base fog color */
+    GLfloat base_fog_color[4] = {0.70, 0.70, 0.70, 1.0};
     double sun_gd_lat, sl_radius, temp;
+    double x_2, x_4, x_8, x_10;
+    double light, ambient, diffuse, sky_brightness;
     static int time_warp = 0;
 
+    l = &cur_light_params;
     t = &cur_time_params;
     v = &current_view;
 
-    time_warp += 200; /* increase this to make the world spin real fast */
+    printf("  Updating Sun position\n");
+
+    time_warp += 0; /* increase this to make the world spin real fast */
 
-    fgSunPosition(time(NULL) + time_warp, &t->sun_lon, &sun_gd_lat);
+    fgSunPosition(t->cur_time + time_warp, &l->sun_lon, &sun_gd_lat);
 
-    fgGeodToGeoc(sun_gd_lat, 0.0, &sl_radius, &t->sun_gc_lat);
+    fgGeodToGeoc(sun_gd_lat, 0.0, &sl_radius, &l->sun_gc_lat);
 
-    t->fg_sunpos = fgPolarToCart(t->sun_lon, t->sun_gc_lat, sl_radius);
+    l->fg_sunpos = fgPolarToCart(l->sun_lon, l->sun_gc_lat, sl_radius);
 
-    /* printf("Geodetic lat = %.5f Geocentric lat = %.5f\n", sun_gd_lat,
+    /* printf("  Geodetic lat = %.5f Geocentric lat = %.5f\n", sun_gd_lat,
        t->sun_gc_lat); */
 
-    /* the sun position has to be translated just like everything else */
-    t->sun_vec[0] = t->fg_sunpos.x - scenery_center.x; 
-    t->sun_vec[1] = t->fg_sunpos.y - scenery_center.y;
-    t->sun_vec[2] = t->fg_sunpos.z - scenery_center.z;
-    /* make this a directional light source only */
-    t->sun_vec[3] = 0.0;
+    /* FALSE! (?> the sun position has to be translated just like
+     * everything else */
+    /* l->sun_vec_inv[0] = l->fg_sunpos.x - scenery_center.x;  */
+    /* l->sun_vec_inv[1] = l->fg_sunpos.y - scenery_center.y; */
+    /* l->sun_vec_inv[2] = l->fg_sunpos.z - scenery_center.z; */
+    /* MAT3_SCALE_VEC(l->sun_vec, l->sun_vec_inv, -1.0); */
+
+    /* I think this will work better for generating the sun light vector */
+    l->sun_vec[0] = l->fg_sunpos.x;
+    l->sun_vec[1] = l->fg_sunpos.y;
+    l->sun_vec[2] = l->fg_sunpos.z;
+    MAT3_NORMALIZE_VEC(l->sun_vec, temp);
+    MAT3_SCALE_VEC(l->sun_vec_inv, l->sun_vec, -1.0);
+
+    /* make these are directional light sources only */
+    l->sun_vec[3] = 0.0;
+    l->sun_vec_inv[3] = 0.0;
+
+    printf("  l->sun_vec = %.2f %.2f %.2f\n", l->sun_vec[0], l->sun_vec[1],
+          l->sun_vec[2]);
 
-    /* calculate thesun's relative angle to local up */
+    /* calculate the sun's relative angle to local up */
     MAT3_COPY_VEC(nup, v->local_up);
-    nsun[0] = t->fg_sunpos.x; 
-    nsun[1] = t->fg_sunpos.y;
-    nsun[2] = t->fg_sunpos.z;
+    nsun[0] = l->fg_sunpos.x; 
+    nsun[1] = l->fg_sunpos.y;
+    nsun[2] = l->fg_sunpos.z;
     MAT3_NORMALIZE_VEC(nup, temp);
     MAT3_NORMALIZE_VEC(nsun, temp);
 
-    t->sun_angle = acos(MAT3_DOT_PRODUCT(nup, nsun));
-    printf("SUN ANGLE relative to current location = %.3f rads.\n", 
-          t->sun_angle);
+    l->sun_angle = acos(MAT3_DOT_PRODUCT(nup, nsun));
+    printf("  SUN ANGLE relative to current location = %.3f rads.\n", 
+          l->sun_angle);
+
+    /* calculate lighting parameters based on sun's relative angle to
+     * local up */
+    /* ya kind'a have to plot this to see how it works */
+
+    /* x = t->sun_angle^8 */
+    x_2 = l->sun_angle * l->sun_angle;
+    x_4 = x_2 * x_2;
+    x_8 = x_4 * x_4;
+    x_10 = x_8 * x_2;
+
+    light = pow(1.1, -x_10 / 30.0);
+    ambient = 0.2 * light;
+    diffuse = 0.9 * light;
+
+    sky_brightness = 0.85 * pow(1.2, -x_8 / 20.0) + 0.15;
+
+    /* sky_brightness = 0.15; */ /* to force a dark sky (for testing) */
+
+    if ( ambient < 0.02 ) { ambient = 0.02; }
+    if ( diffuse < 0.0 ) { diffuse = 0.0; }
+
+    if ( sky_brightness < 0.1 ) { sky_brightness = 0.1; }
+
+    l->scene_ambient[0] = white[0] * ambient;
+    l->scene_ambient[1] = white[1] * ambient;
+    l->scene_ambient[2] = white[2] * ambient;
+
+    l->scene_diffuse[0] = white[0] * diffuse;
+    l->scene_diffuse[1] = white[1] * diffuse;
+    l->scene_diffuse[2] = white[2] * diffuse;
+
+    /* set fog color */
+    l->fog_color[0] = base_fog_color[0] * (ambient + diffuse);
+    l->fog_color[1] = base_fog_color[1] * (ambient + diffuse);
+    l->fog_color[2] = base_fog_color[2] * (ambient + diffuse);
+    l->fog_color[3] = base_fog_color[3];
+
+    /* set sky color */
+    l->sky_color[0] = base_sky_color[0] * sky_brightness;
+    l->sky_color[1] = base_sky_color[1] * sky_brightness;
+    l->sky_color[2] = base_sky_color[2] * sky_brightness;
+    l->sky_color[3] = base_sky_color[3];
 }
 
 
 /* $Log$
-/* Revision 1.7  1997/09/04 02:17:40  curt
-/* Shufflin' stuff.
+/* Revision 1.24  1998/01/27 00:48:07  curt
+/* Incorporated Paul Bleisch's <bleisch@chromatic.com> new debug message
+/* system and commandline/config file processing code.
 /*
+ * Revision 1.23  1998/01/19 19:27:21  curt
+ * Merged in make system changes from Bob Kuehne <rpk@sgi.com>
+ * This should simplify things tremendously.
+ *
+ * Revision 1.22  1998/01/19 18:40:40  curt
+ * Tons of little changes to clean up the code and to remove fatal errors
+ * when building with the c++ compiler.
+ *
+ * Revision 1.21  1997/12/30 23:10:19  curt
+ * Calculate lighting parameters here.
+ *
+ * Revision 1.20  1997/12/30 22:22:43  curt
+ * Further integration of event manager.
+ *
+ * Revision 1.19  1997/12/30 20:47:59  curt
+ * Integrated new event manager with subsystem initializations.
+ *
+ * Revision 1.18  1997/12/23 04:58:40  curt
+ * Tweaked the sky coloring a bit to build in structures to allow finer rgb
+ * control.
+ *
+ * Revision 1.17  1997/12/15 23:55:08  curt
+ * Add xgl wrappers for debugging.
+ * Generate terrain normals on the fly.
+ *
+ * Revision 1.16  1997/12/11 04:43:57  curt
+ * Fixed sun vector and lighting problems.  I thing the moon is now lit
+ * correctly.
+ *
+ * Revision 1.15  1997/12/10 22:37:55  curt
+ * Prepended "fg" on the name of all global structures that didn't have it yet.
+ * i.e. "struct WEATHER {}" became "struct fgWEATHER {}"
+ *
+ * Revision 1.14  1997/12/09 04:25:39  curt
+ * Working on adding a global lighting params structure.
+ *
+ * Revision 1.13  1997/11/25 19:25:42  curt
+ * Changes to integrate Durk's moon/sun code updates + clean up.
+ *
+ * Revision 1.12  1997/11/15 18:15:39  curt
+ * Reverse direction of sun vector, so object normals can be more normal.
+ *
+ * Revision 1.11  1997/10/28 21:07:21  curt
+ * Changed GLUT/ -> Main/
+ *
+ * Revision 1.10  1997/09/13 02:00:09  curt
+ * Mostly working on stars and generating sidereal time for accurate star
+ * placement.
+ *
+ * Revision 1.9  1997/09/05 14:17:31  curt
+ * More tweaking with stars.
+ *
+ * Revision 1.8  1997/09/05 01:36:04  curt
+ * Working on getting stars right.
+ *
+ * Revision 1.7  1997/09/04 02:17:40  curt
+ * Shufflin' stuff.
+ *
  * Revision 1.6  1997/08/27 03:30:37  curt
  * Changed naming scheme of basic shared structures.
  *