]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/sky/dome.cxx
accomodate changes to osgDB::DatabasePager interface
[simgear.git] / simgear / scene / sky / dome.cxx
index 1e3fbdc3b8518ae7f1f606b35ce6db4e04220752..def2c85cc5d6e8178fc0ad5e531860fe01c9142f 100644 (file)
@@ -24,6 +24,7 @@
 #endif
 
 #include <math.h>
+#include <iterator>
 
 #include <simgear/compiler.h>
 
@@ -63,6 +64,7 @@ struct DomeParam
 
 const int numRings = sizeof(domeParams) / sizeof(domeParams[0]);
 const int numBands = 12;
+const int halfBands = numBands/2;
 }
 
 static const float upper_radius = 0.9701; // (.6, 0.15)
@@ -189,7 +191,7 @@ SGSkyDome::build( double hscale, double vscale ) {
     geom->addPrimitiveSet(domeElements);
     geode->addDrawable(geom);
     // force a repaint of the sky colors with ugly defaults
-    repaint(SGVec3f(1, 1, 1), SGVec3f(1, 1, 1), 0.0, 5000.0 );
+    repaint(SGVec3f(1, 1, 1), SGVec3f(1, 1, 1), SGVec3f(1, 1, 1), 0.0, 5000.0 );
     dome_transform = new osg::MatrixTransform;
     dome_transform->addChild(geode);
 
@@ -217,8 +219,8 @@ inline void clampColor(osg::Vec3& color)
 // 90 degrees = sun rise/set
 // 180 degrees = darkest midnight
 bool
-SGSkyDome::repaint( const SGVec3f& sky_color, const SGVec3f& fog_color,
-                    double sun_angle, double vis )
+SGSkyDome::repaint( const SGVec3f& sun_color, const SGVec3f& sky_color,
+                    const SGVec3f& fog_color, double sun_angle, double vis )
 {
     SGVec3f outer_param, outer_diff;
     SGVec3f middle_param, middle_diff;
@@ -257,33 +259,33 @@ SGSkyDome::repaint( const SGVec3f& sky_color, const SGVec3f& fog_color,
     const float upperVisFactor = 1.0 - vis_factor * (0.7 + 0.3 * cvf/45000);
     const float middleVisFactor = 1.0 - vis_factor * (0.1 + 0.85 * cvf/45000);
 
-    (*dome_cl)[0] = sky_color.osg();
+    (*dome_cl)[0] = toOsg(sky_color);
     simgear::VectorArrayAdapter<Vec3Array> colors(*dome_cl, numBands, 1);
     const double saif = sun_angle/SG_PI;
     static const SGVec3f blueShift(0.8, 1.0, 1.2);
     const SGVec3f skyFogDelta = sky_color - fog_color;
+    const SGVec3f sunSkyDelta = sun_color - sky_color;
     // For now the colors of the upper two rings are linearly
     // interpolated between the zenith color and the first horizon
     // ring color.
     
-    for (int i = 0; i < 7; i++) {
+    for (int i = 0; i < halfBands+1; i++) {
         SGVec3f diff = mult(skyFogDelta, blueShift);
-        diff *= (0.8 + saif - ((6-i)/10));
-        colors(2, i) = (sky_color - upperVisFactor * diff).osg();
-        colors(3, i) = (sky_color - middleVisFactor * diff + middle_amt).osg();
-        colors(4, i) = (fog_color + outer_amt).osg();
-        // Interpolate using distance along dome segment
-        colors(0, i) = simgear::math::lerp(sky_color.osg(), colors(2, i), .3942);
-        colors(1, i) = simgear::math::lerp(sky_color.osg(), colors(2, i), .7885);
+        diff *= (0.8 + saif - ((halfBands-i)/10));
+        colors(2, i) = toOsg(sky_color - upperVisFactor * diff);
+        colors(3, i) = toOsg(sky_color - middleVisFactor * diff + middle_amt);
+        colors(4, i) = toOsg(fog_color + outer_amt);
+        colors(0, i) = simgear::math::lerp(toOsg(sky_color), colors(2, i), .3942);
+        colors(1, i) = simgear::math::lerp(toOsg(sky_color), colors(2, i), .7885);
         for (int j = 0; j < numRings - 1; ++j)
             clampColor(colors(j, i));
         outer_amt -= outer_diff;
         middle_amt -= middle_diff;
     }
 
-    for (int i = 7; i < 12; ++i)
+    for (int i = halfBands+1; i < numBands; ++i)
         for (int j = 0; j < 5; ++j)
-            colors(j, i) = colors(j, 12 - i);
+            colors(j, i) = colors(j, numBands - i);
 
     fade_to_black(&(*dome_cl)[0], asl * center_elev, 1);
     for (int i = 0; i < numRings - 1; ++i)
@@ -291,7 +293,7 @@ SGSkyDome::repaint( const SGVec3f& sky_color, const SGVec3f& fog_color,
                       numBands);
 
     for ( int i = 0; i < numBands; i++ )
-        colors(numRings - 1, i) = fog_color.osg();
+        colors(numRings - 1, i) = toOsg(fog_color);
     dome_cl->dirty();
     return true;
 }
@@ -312,7 +314,7 @@ SGSkyDome::reposition( const SGVec3f& p, double _asl,
     // Translate to view position
     // Point3D zero_elev = current_view.get_cur_zero_elev();
     // xglTranslatef( zero_elev.x(), zero_elev.y(), zero_elev.z() );
-    T.makeTranslate( p.osg() );
+    T.makeTranslate( toOsg(p) );
 
     // printf("  Translated to %.2f %.2f %.2f\n", 
     //        zero_elev.x, zero_elev.y, zero_elev.z );