X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fsky%2Fcloud.cxx;h=e1f65de314e33e65190eb7ab563011e3502c472e;hb=c2149f9ea6458c7ba8668626f64d1d39aef0b28a;hp=e64d8648ad4332f402c2f8423402c6de5aa7cde5;hpb=1fce27f0c3d363dae413071c5e154ce029305fe9;p=simgear.git diff --git a/simgear/scene/sky/cloud.cxx b/simgear/scene/sky/cloud.cxx index e64d8648..e1f65de3 100644 --- a/simgear/scene/sky/cloud.cxx +++ b/simgear/scene/sky/cloud.cxx @@ -32,8 +32,9 @@ #include "cloud.hxx" -ssgSimpleState * -SGCloudLayer::layer_states[SGCloudLayer::SG_MAX_CLOUD_COVERAGES]; + +static ssgSimpleState *layer_states[SGCloudLayer::SG_MAX_CLOUD_COVERAGES]; +static bool state_initialized = false; // Constructor @@ -47,6 +48,8 @@ SGCloudLayer::SGCloudLayer( const string &tex_path ) : layer_transition(0.0), layer_coverage(SG_CLOUD_CLEAR), scale(4000.0), + speed(0.0), + direction(0.0), last_lon(0.0), last_lat(0.0) { @@ -55,9 +58,6 @@ SGCloudLayer::SGCloudLayer( const string &tex_path ) : tl[0] = tl[1] = tl[2] = tl[3] = NULL; layer[0] = layer[1] = layer[2] = layer[3] = NULL; - for ( int i = 0; i < SG_MAX_CLOUD_COVERAGES; ++i ) { - layer_states[i] = NULL; - } layer_root->addKid(layer_transform); rebuild(); } @@ -139,33 +139,37 @@ SGCloudLayer::setCoverage (Coverage coverage) void SGCloudLayer::rebuild() { - // Initialize states and sizes if necessary. - if ( layer_states[0] == NULL ) { + // Initialize states and sizes if necessary. + if ( !state_initialized ) { + state_initialized = true; + + cout << "initializing cloud layers" << endl; + SGPath cloud_path; cloud_path.set(texture_path.str()); cloud_path.append("overcast.rgb"); - layer_states[SG_CLOUD_OVERCAST] = SGCloudMakeState(cloud_path.str()); + layer_states[SG_CLOUD_OVERCAST] = sgCloudMakeState(cloud_path.str()); cloud_path.set(texture_path.str()); cloud_path.append("broken.rgba"); layer_states[SG_CLOUD_BROKEN] - = SGCloudMakeState(cloud_path.str()); + = sgCloudMakeState(cloud_path.str()); cloud_path.set(texture_path.str()); cloud_path.append("scattered.rgba"); layer_states[SG_CLOUD_SCATTERED] - = SGCloudMakeState(cloud_path.str()); + = sgCloudMakeState(cloud_path.str()); cloud_path.set(texture_path.str()); cloud_path.append("few.rgba"); layer_states[SG_CLOUD_FEW] - = SGCloudMakeState(cloud_path.str()); + = sgCloudMakeState(cloud_path.str()); cloud_path.set(texture_path.str()); cloud_path.append("cirrus.rgba"); layer_states[SG_CLOUD_CIRRUS] - = SGCloudMakeState(cloud_path.str()); + = sgCloudMakeState(cloud_path.str()); layer_states[SG_CLOUD_CLEAR] = 0; } @@ -283,7 +287,7 @@ bool SGCloudLayer::repaint( sgVec3 fog_color ) { // 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, - double alt ) + double alt, double dt ) { sgMat4 T1, LON, LAT; sgVec3 axis; @@ -341,15 +345,35 @@ bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double lon, double lat, last_lat = lat; } - if ( lon != last_lon || lat != last_lat ) { + double sp_dist = speed*dt; + + if ( lon != last_lon || lat != last_lat || sp_dist != 0 ) { 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 ); + double course = 0.0, dist = 0.0; + + if (dest != start) { + 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); + + // calculate cloud movement due to external forces + double ax = 0.0, ay = 0.0, bx = 0.0, by = 0.0; + + if (dist > 0.0) { + ax = cos(course) * dist; + ay = sin(course) * dist; + } + + if (sp_dist > 0) { + bx = cos(-direction * SGD_DEGREES_TO_RADIANS) * sp_dist; + by = sin(-direction * SGD_DEGREES_TO_RADIANS) * sp_dist; + } + + + double xoff = (ax + bx) / (2 * scale); + double yoff = (ay + by) / (2 * scale); const float layer_scale = layer_span / scale; @@ -424,9 +448,11 @@ void SGCloudLayer::draw() { // make an ssgSimpleState for a cloud layer given the named texture -ssgSimpleState *SGCloudMakeState( const string &path ) { +ssgSimpleState *sgCloudMakeState( const string &path ) { ssgSimpleState *state = new ssgSimpleState(); + cout << " texture = " << path << endl; + state->setTexture( (char *)path.c_str() ); state->setShadeModel( GL_SMOOTH ); state->disable( GL_LIGHTING );