X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsky%2Fcloud.cxx;h=78bde43cad524ff33a5940be86013e514a9a0fc8;hb=f1ab6e2533a1bf07439b3d5918430f496158d8f3;hp=20215a188877fd849b04ae20e5808759c7a974fd;hpb=7db73cd2150b69aa7ae38fa8a46862c8d12231b9;p=simgear.git diff --git a/simgear/sky/cloud.cxx b/simgear/sky/cloud.cxx index 20215a18..78bde43c 100644 --- a/simgear/sky/cloud.cxx +++ b/simgear/sky/cloud.cxx @@ -20,14 +20,17 @@ # include #endif +#include + #include -#include +#include STL_IOSTREAM +#include #include -#include #include #include +#include #include "cloud.hxx" @@ -43,27 +46,19 @@ SGCloudLayer::~SGCloudLayer( void ) { // build the moon object -ssgBranch * SGCloudLayer::build( FGPath path, double s, double asl ) { +void SGCloudLayer::build( double s, double asl, double thickness, + double transition, ssgSimpleState *state ) +{ + 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" ); - layer_state = new ssgSimpleState(); - layer_state->setTexture( (char *)path.c_str() ); - layer_state->setShadeModel( GL_SMOOTH ); - layer_state->disable( GL_LIGHTING ); - layer_state->disable( GL_CULL_FACE ); - layer_state->enable( GL_TEXTURE_2D ); - layer_state->enable( GL_COLOR_MATERIAL ); - layer_state->setColourMaterial( GL_AMBIENT_AND_DIFFUSE ); - layer_state->setMaterial( GL_EMISSION, 0, 0, 0, 1 ); - layer_state->setMaterial( GL_SPECULAR, 0, 0, 0, 1 ); - layer_state->enable( GL_BLEND ); - layer_state->enable( GL_ALPHA_TEST ); - layer_state->setAlphaClamp( 0.01 ); + layer_state = state; cl = new ssgColourArray( 4 ); vl = new ssgVertexArray( 4 ); @@ -76,25 +71,27 @@ ssgBranch * SGCloudLayer::build( FGPath path, double s, 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, sg_random(), sg_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 ); @@ -113,7 +110,8 @@ ssgBranch * SGCloudLayer::build( FGPath path, double s, double asl ) { // moon_transform->addKid( halo ); layer_transform->addKid( layer ); - return layer_transform; + layer_root = new ssgRoot; + layer_root->addKid( layer_transform ); } @@ -135,7 +133,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; @@ -143,7 +143,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 ); @@ -159,15 +163,17 @@ bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double lon, double lat ) { // zero_elev.x, zero_elev.y, zero_elev.z ); // Rotate to proper orientation - // printf(" lon = %.2f lat = %.2f\n", FG_Longitude * RAD_TO_DEG, - // FG_Latitude * RAD_TO_DEG); - // xglRotatef( f->get_Longitude() * RAD_TO_DEG, 0.0, 0.0, 1.0 ); + // printf(" lon = %.2f lat = %.2f\n", + // lon * SGD_RADIANS_TO_DEGREES, + // lat * SGD_RADIANS_TO_DEGREES); + // xglRotatef( lon * SGD_RADIANS_TO_DEGREES, 0.0, 0.0, 1.0 ); sgSetVec3( axis, 0.0, 0.0, 1.0 ); - sgMakeRotMat4( LON, lon * RAD_TO_DEG, axis ); + sgMakeRotMat4( LON, lon * SGD_RADIANS_TO_DEGREES, axis ); - // xglRotatef( 90.0 - f->get_Latitude() * RAD_TO_DEG, 0.0, 1.0, 0.0 ); + // xglRotatef( 90.0 - f->get_Latitude() * SGD_RADIANS_TO_DEGREES, + // 0.0, 1.0, 0.0 ); sgSetVec3( axis, 0.0, 1.0, 0.0 ); - sgMakeRotMat4( LAT, 90.0 - lat * RAD_TO_DEG, axis ); + sgMakeRotMat4( LAT, 90.0 - lat * SGD_RADIANS_TO_DEGREES, axis ); sgMat4 TRANSFORM; @@ -193,8 +199,8 @@ bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double lon, double lat ) { calc_gc_course_dist( dest, start, &course, &dist ); // cout << "course = " << course << ", dist = " << dist << endl; - double xoff = cos( course ) * dist / 500.0; - double yoff = sin( course ) * dist / 500.0; + double xoff = cos( course ) * dist / (2 * scale); + double yoff = sin( course ) * dist / (2 * scale); // cout << "xoff = " << xoff << ", yoff = " << yoff << endl; @@ -212,13 +218,13 @@ bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double lon, double lat ) { // cout << "base = " << base[0] << "," << base[1] << endl; tc = tl->get( 1 ); - sgSetVec2( tc, base[0] + size / 1000.0f, base[1] ); + sgSetVec2( tc, base[0] + size / scale, base[1] ); tc = tl->get( 2 ); - sgSetVec2( tc, base[0], base[1] + size / 1000.0f ); + sgSetVec2( tc, base[0], base[1] + size / scale ); tc = tl->get( 3 ); - sgSetVec2( tc, base[0] + size / 1000.0f, base[1] + size / 1000.0f ); + sgSetVec2( tc, base[0] + size / scale, base[1] + size / scale ); last_lon = lon; last_lat = lat; @@ -226,3 +232,29 @@ bool SGCloudLayer::reposition( sgVec3 p, sgVec3 up, double lon, double lat ) { return true; } + + +void SGCloudLayer::draw() { + ssgCullAndDraw( layer_root ); +} + + +// make an ssgSimpleState for a cloud layer given the named texture +ssgSimpleState *SGCloudMakeState( const string &path ) { + ssgSimpleState *state = new ssgSimpleState(); + + state->setTexture( (char *)path.c_str() ); + state->setShadeModel( GL_SMOOTH ); + state->disable( GL_LIGHTING ); + state->disable( GL_CULL_FACE ); + state->enable( GL_TEXTURE_2D ); + state->enable( GL_COLOR_MATERIAL ); + state->setColourMaterial( GL_AMBIENT_AND_DIFFUSE ); + state->setMaterial( GL_EMISSION, 0, 0, 0, 1 ); + state->setMaterial( GL_SPECULAR, 0, 0, 0, 1 ); + state->enable( GL_BLEND ); + state->enable( GL_ALPHA_TEST ); + state->setAlphaClamp( 0.01 ); + + return state; +}