]> git.mxchange.org Git - simgear.git/commitdiff
John W:
authorcurt <curt>
Fri, 4 Oct 2002 16:44:23 +0000 (16:44 +0000)
committercurt <curt>
Fri, 4 Oct 2002 16:44:23 +0000 (16:44 +0000)
Attached is the new, improved SkyCloud.cpp. Tested on west coast @ KSFO and
east @ KJFK. Don't have any southern hemisphere or other airports to test
against, but you might give it a go and see what happens

Probably a good idea to add some user options to set cloud altitude, startup
position, etc, but for now this should suffice.

simgear/scene/sky/clouds3d/SkyCloud.cpp
simgear/scene/sky/clouds3d/SkyRenderableInstanceCloud.cpp

index e682030ced5c67813bfac9b9820869cfbe187561..de4f5afa0ed80e3b11143408434dd369674f67c9 100644 (file)
@@ -1,8 +1,9 @@
 //------------------------------------------------------------------------------
 // File : SkyCloud.cpp
 //------------------------------------------------------------------------------
-// SkyWorks : Copyright 2002 Mark J. Harris and
+// SkyWorks : Adapted from skyworks program writen by Mark J. Harris and
 //                                             The University of North Carolina at Chapel Hill
+//                                     : by J. Wojnaroski Sep 2002
 //------------------------------------------------------------------------------
 // Permission to use, copy, modify, distribute and sell this software and its 
 // documentation for any purpose is hereby granted without fee, provided that 
@@ -622,8 +623,8 @@ SkyMinMaxBox* SkyCloud::CopyBoundingVolume() const
 }
 
 SKYRESULT SkyCloud::Load(const SkyArchive &archive, 
-                         float rScale /* = 1.0f */, 
-                         double latitude, double longitude)
+                         float rScale, /* = 1.0f */ 
+                         double latitude, double longitude )
 {
   unsigned int iNumParticles;
   Vec3f vecCenter = Vec3f::ZERO;
@@ -638,7 +639,7 @@ SKYRESULT SkyCloud::Load(const SkyArchive &archive,
   archive.FindUInt32("CldNumParticles", &iNumParticles);
   //if (!bLocal)
     archive.FindVec3f("CldCenter", &vecCenter);
-  
+
   Vec3f *pParticlePositions = new Vec3f[iNumParticles];
   float *pParticleRadii     = new float[iNumParticles];
   Vec4f *pParticleColors    = new Vec4f[iNumParticles];
@@ -657,21 +658,23 @@ SKYRESULT SkyCloud::Load(const SkyArchive &archive,
     
     _particles.push_back(pParticle);
   }
-  
-// This is an interim solution to transform clouds specified in SkyWorks files that are loaded relative to the fgfs
-// earth-centered Cartesian system to new fgfs coordinates that place and orient the cloud field for proper
-// viewing based on the center of the local tile center and local vertical specified at init time.
+  // this is just a bad hack to align cloud field from skyworks with local horizon at KSFO
+  // this "almost" works not quite the right solution okay to get some up and running
+  // we need to develop our own scheme for loading and positioning clouds
   Mat33f R;
   Vec3f  moveit;
-  // invert cloud height vector
-  R.Set( 1, 0, 0, 0, -1, 0, 0, 0, 1 );
-  Rotate( R );
+
+  R.Set( 0, 1, 0,
+                        1, 0, 0,
+                        0, 0, 1);
+  // clouds sit in the y-z plane and x-axis is the vertical cloud height
+  Rotate( R ); 
   
-float ex = 1.0;
+// rotate the cloud field about the fgfs z-axis based on initial longitude
+float ex = 0.0;
 float ey = 0.0;
-float ez = 0.0;
-float phi = -latitude / 57.29578;
+float ez = 1.0;
+float phi = longitude / 57.29578;
 float one_min_cos = 1 - cos(phi);
   
 R.Set(
@@ -681,10 +684,12 @@ one_min_cos*ex*ez - ey*sin(phi), one_min_cos*ey*ez + ex*sin(phi), cos(phi) + one
                        
 Rotate( R );
 
-ex = 0.0;
-ey = sin( latitude );
-ez = cos( latitude );
-phi = (longitude + 90.0)/ 57.29578;
+// okay now that let's rotate about a vector for latitude where longitude forms the 
+// components of a unit vector in the x-y plane
+ex = sin( longitude  / 57.29578 );
+ey = -cos( longitude  / 57.29578 );
+ez = 0.0;
+phi = latitude / 57.29578;
 one_min_cos = 1 - cos(phi);
 
 R.Set(
@@ -693,11 +698,18 @@ one_min_cos*ex*ey + ez*sin(phi), cos(phi) + one_min_cos*ey*ey, one_min_cos*ey*ez
 one_min_cos*ex*ez - ey*sin(phi), one_min_cos*ey*ez + ex*sin(phi), cos(phi) + one_min_cos*ez*ez );
                        
 Rotate( R );
-// this sets the cloud height to around 3500 feet MSL @ KSFO   
-moveit.Set( 13000.0, 0.0, 10500.0  );
+// need to calculate an offset to place the clouds at ~3000 feet MSL  ATM this is an approximation 
+// to move the clouds to some altitude above sea level. At some locations this could be underground
+// will need a better scheme to position clouds per user preferences
+float cloud_level_msl = 3000.0f;
+
+float x_offset = ex * cloud_level_msl;
+float y_offset = ey * cloud_level_msl; 
+float z_offset = cloud_level_msl * 0.5;
+moveit.Set( x_offset, y_offset, z_offset  );
+  
+  Translate( moveit );
   
-Translate( moveit ); 
-
   return SKYRESULT_OK;
 }
 
index 6abe46506f6d4cfade0e756025610d3bfbdd152f..aded8c050ee032fc8e0dc13fce17c2d389aad536 100644 (file)
@@ -240,7 +240,7 @@ SKYRESULT SkyRenderableInstanceCloud::Display(bool bDisplayFrontOfSplit /* = fal
   else
   {//cout << "Using impostor image\n";
       if (!_pBackTexture || (bDisplayFrontOfSplit && !_pFrontTexture)) {
-          cout << "texture id failure" << endl;
+          // cout << "texture id failure" << endl;
           FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyRenderableInstanceCloud::Display(): missing texture!");
       }