X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsky%2Fcloud.cxx;h=e6d02c5c7c6ee72989c36a986eca7b0a3c85dc4f;hb=0468b315d4188f610d86ae3e4ec4e3ff3dd924bd;hp=147f80788a2f87dd88cef678e24102f0e15769fe;hpb=487bee35ab43fd676a10660799722ea454e2e7e5;p=simgear.git diff --git a/simgear/sky/cloud.cxx b/simgear/sky/cloud.cxx index 147f8078..e6d02c5c 100644 --- a/simgear/sky/cloud.cxx +++ b/simgear/sky/cloud.cxx @@ -26,6 +26,9 @@ #include #include +#include +#include +#include #include "cloud.hxx" @@ -41,9 +44,17 @@ SGCloudLayer::~SGCloudLayer( void ) { // build the moon object -ssgBranch * SGCloudLayer::build( FGPath path, double size, double asl ) { +void SGCloudLayer::build( FGPath path, double s, double asl, double thickness, + double transition ) +{ + scale = 4000.0; layer_asl = asl; + layer_thickness = thickness; + layer_transition = transition; + + size = s; + last_lon = last_lat = -999.0f; // set up the cloud state path.append( "cloud.rgba" ); @@ -72,25 +83,27 @@ ssgBranch * SGCloudLayer::build( FGPath path, double size, double asl ) { sgSetVec4( color, 1.0f, 1.0f, 1.0f, 1.0f ); sgSetVec3( vertex, -size, -size, 0.0f ); - sgSetVec2( tc, 0.0f, 0.0f ); + sgVec2 base; + sgSetVec2( base, fg_random(), fg_random() ); + sgSetVec2( tc, base[0], base[1] ); cl->add( color ); vl->add( vertex ); tl->add( tc ); sgSetVec3( vertex, size, -size, 0.0f ); - sgSetVec2( tc, size / 1000.0f, 0.0f ); + sgSetVec2( tc, base[0] + size / scale, base[1] ); cl->add( color ); vl->add( vertex ); tl->add( tc ); sgSetVec3( vertex, -size, size, 0.0f ); - sgSetVec2( tc, 0.0f, size / 1000.0f ); + sgSetVec2( tc, base[0], base[1] + size / scale ); cl->add( color ); vl->add( vertex ); tl->add( tc ); sgSetVec3( vertex, size, size, 0.0f ); - sgSetVec2( tc, size / 1000.0f, size / 1000.0f ); + sgSetVec2( tc, base[0] + size / scale, base[1] + size / scale ); cl->add( color ); vl->add( vertex ); tl->add( tc ); @@ -109,7 +122,8 @@ ssgBranch * SGCloudLayer::build( FGPath path, double size, double asl ) { // moon_transform->addKid( halo ); layer_transform->addKid( layer ); - return layer_transform; + layer_root = new ssgRoot; + layer_root->addKid( layer_transform ); } @@ -131,7 +145,9 @@ bool SGCloudLayer::repaint( sgVec3 fog_color ) { // lat specifies a rotation about the new Y axis // spin specifies a rotation about the new Z axis (and orients the // sunrise/set effects -bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double lon, double lat ) { +bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double lon, double lat, + double alt ) +{ sgMat4 T1, LON, LAT; sgVec3 axis; @@ -139,7 +155,11 @@ bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double lon, double lat ) { sgVec3 asl_offset; sgCopyVec3( asl_offset, up ); sgNormalizeVec3( asl_offset ); - sgScaleVec3( asl_offset, layer_asl ); + if ( alt <= layer_asl ) { + sgScaleVec3( asl_offset, layer_asl ); + } else { + sgScaleVec3( asl_offset, layer_asl + layer_thickness ); + } // cout << "asl_offset = " << asl_offset[0] << "," << asl_offset[1] // << "," << asl_offset[2] << endl; sgAddVec3( asl_offset, p ); @@ -176,5 +196,54 @@ bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double lon, double lat ) { layer_transform->setTransform( &layerpos ); + // now calculate update texture coordinates + if ( last_lon < -900 ) { + last_lon = lon; + last_lat = lat; + } + + if ( lon != last_lon || lat != last_lat ) { + Point3D start( last_lon, last_lat, 0.0 ); + Point3D dest( lon, lat, 0.0 ); + double course, dist; + calc_gc_course_dist( dest, start, &course, &dist ); + // cout << "course = " << course << ", dist = " << dist << endl; + + double xoff = cos( course ) * dist / (2 * scale); + double yoff = sin( course ) * dist / (2 * scale); + + // cout << "xoff = " << xoff << ", yoff = " << yoff << endl; + + float *base, *tc; + base = tl->get( 0 ); + + base[0] += xoff; + while ( base[0] > 1.0 ) { base[0] -= 1.0; } + while ( base[0] < 0.0 ) { base[0] += 1.0; } + + base[1] += yoff; + while ( base[1] > 1.0 ) { base[1] -= 1.0; } + while ( base[1] < 0.0 ) { base[1] += 1.0; } + + // cout << "base = " << base[0] << "," << base[1] << endl; + + tc = tl->get( 1 ); + sgSetVec2( tc, base[0] + size / scale, base[1] ); + + tc = tl->get( 2 ); + sgSetVec2( tc, base[0], base[1] + size / scale ); + + tc = tl->get( 3 ); + sgSetVec2( tc, base[0] + size / scale, base[1] + size / scale ); + + last_lon = lon; + last_lat = lat; + } + return true; } + + +void SGCloudLayer::draw() { + ssgCullAndDraw( layer_root ); +}