From kde-commits Tue Jan 27 23:44:14 2009 From: Torsten Rahn Date: Tue, 27 Jan 2009 23:44:14 +0000 To: kde-commits Subject: KDE/kdeedu/marble/src/lib Message-Id: <1233099854.398483.18713.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=123309989330693 SVN commit 917520 by rahn: - Getting rid of the staircase effect for the terminator. M +67 -44 MergedLayerDecorator.cpp M +5 -3 SunLocator.cpp --- trunk/KDE/kdeedu/marble/src/lib/MergedLayerDecorator.cpp #917519:917520 @@ -204,7 +204,6 @@ // First we determine the supporting point interval for the interpolation. const int n = maxDivisor( 30, tileWidth ); - const qreal nInverse = 1.0 / (qreal)(n); const int ipRight = n * (int)( tileWidth / n ); if ( m_sunLocator->getCitylights() ) { @@ -215,48 +214,61 @@ qreal lat = lat_scale * ( m_y * tileHeight + cur_y ) - 0.5*M_PI; QRgb* scanline = (QRgb*)m_tile->scanLine( cur_y ); QRgb* nscanline = (QRgb*)nighttile.scanLine( cur_y ); - qreal lastShade = 0.0; - for ( int cur_x = 0; cur_x < tileWidth; ++cur_x) { + qreal shade = 0; + qreal lastShade = -10.0; - bool interpolate = ( cur_x != 0 && cur_x < ipRight ); + int cur_x = 0; - if ( interpolate == true ) cur_x+= n - 1; + while ( cur_x < tileWidth ) { - qreal lon = lon_scale * (m_x * tileWidth + cur_x); - qreal shade = m_sunLocator->shading( lon, lat ); + bool interpolate = ( cur_x != 0 && cur_x < ipRight && cur_x + n < tileWidth ); if ( interpolate == true ) { + int check = cur_x + n; + qreal checklon = lon_scale * ( m_x * tileWidth + check ); + shade = m_sunLocator->shading(checklon, lat); // if the shading didn't change across the interpolation // interval move on and don't change anything. if ( shade == lastShade && shade == 1.0 ) { scanline += n; nscanline += n; + cur_x += n; continue; } - else { - qreal interpolatedShade = lastShade; - const qreal shadeDiff = ( shade - lastShade ) * nInverse; - - // Now we do linear interpolation across the tile width - for ( int t = 1; t < n; ++t ) + if ( shade == lastShade && shade == 0.0 ) { + for ( int t = 0; t < n; ++t ) { - interpolatedShade += shadeDiff; - m_sunLocator->shadePixelComposite( *scanline, *nscanline, interpolatedShade ); - scanline++; - nscanline++; + m_sunLocator->shadePixelComposite( *scanline, *nscanline, shade ); + ++scanline; + ++nscanline; } + cur_x += n; + continue; } + for ( int t = 0; t < n ; ++t ) + { + qreal lon = lon_scale * ( m_x * tileWidth + cur_x ); + shade = m_sunLocator->shading(lon, lat); + m_sunLocator->shadePixelComposite( *scanline, *nscanline, shade ); + ++scanline; + ++nscanline; + ++cur_x; + } } - // Make sure we don't exceed the image memory - if ( cur_x < tileWidth ) { - m_sunLocator->shadePixelComposite( *scanline, *nscanline, shade ); - scanline++; - nscanline++; + else { + // Make sure we don't exceed the image memory + if ( cur_x < tileWidth ) { + qreal lon = lon_scale * ( m_x * tileWidth + cur_x ); + shade = m_sunLocator->shading(lon, lat); + m_sunLocator->shadePixelComposite( *scanline, *nscanline, shade ); + ++scanline; + ++nscanline; + ++cur_x; + } } - lastShade = shade; } } @@ -265,45 +277,56 @@ qreal lat = lat_scale * (m_y * tileHeight + cur_y) - 0.5*M_PI; QRgb* scanline = (QRgb*)m_tile->scanLine( cur_y ); - qreal lastShade = 0.0; + qreal shade = 0; + qreal lastShade = -10.0; - for ( int cur_x = 0; cur_x <= tileWidth; ++cur_x ) { + int cur_x = 0; - bool interpolate = ( cur_x != 0 && cur_x < ipRight ); + while ( cur_x < tileWidth ) { - if ( interpolate == true ) cur_x+= n - 1; + bool interpolate = ( cur_x != 0 && cur_x < ipRight && cur_x + n < tileWidth ); - qreal lon = lon_scale * ( m_x * tileWidth + cur_x ); - qreal shade = m_sunLocator->shading(lon, lat); - if ( interpolate == true ) { + int check = cur_x + n; + qreal checklon = lon_scale * ( m_x * tileWidth + check ); + shade = m_sunLocator->shading(checklon, lat); // if the shading didn't change across the interpolation // interval move on and don't change anything. if ( shade == lastShade && shade == 1.0 ) { scanline += n; + cur_x += n; continue; } - else { - qreal interpolatedShade = lastShade; - const qreal shadeDiff = ( shade - lastShade ) * nInverse; - - // Now we do linear interpolation across the tile width - for ( int t = 1; t < n; ++t ) + if ( shade == lastShade && shade == 0.0 ) { + for ( int t = 0; t < n; ++t ) { - interpolatedShade += shadeDiff; - m_sunLocator->shadePixel( *scanline, interpolatedShade ); - scanline++; + m_sunLocator->shadePixel( *scanline, shade ); + ++scanline; } + cur_x += n; + continue; } + for ( int t = 0; t < n ; ++t ) + { + qreal lon = lon_scale * ( m_x * tileWidth + cur_x ); + shade = m_sunLocator->shading(lon, lat); + m_sunLocator->shadePixel( *scanline, shade ); + ++scanline; + ++cur_x; + } } - // Make sure we don't exceed the image memory - if ( cur_x < tileWidth ) { - m_sunLocator->shadePixel( *scanline, shade ); - scanline++; + else { + // Make sure we don't exceed the image memory + if ( cur_x < tileWidth ) { + qreal lon = lon_scale * ( m_x * tileWidth + cur_x ); + shade = m_sunLocator->shading(lon, lat); + m_sunLocator->shadePixel( *scanline, shade ); + ++scanline; + ++cur_x; + } } - lastShade = shade; } } --- trunk/KDE/kdeedu/marble/src/lib/SunLocator.cpp #917519:917520 @@ -17,7 +17,8 @@ #include "SunLocator.h" #include "ExtDateTime.h" #include "PlanetaryConstants.h" - +#include "MarbleMath.h" + #include using namespace Marble; @@ -113,11 +114,12 @@ qreal SunLocator::shading(qreal lon, qreal lat) { + // haversine formula qreal a = sin((lat-m_lat)/2.0); qreal b = sin((lon-m_lon)/2.0); - qreal h = (a*a)+cos(lat)*cos(m_lat)*(b*b); - + qreal h = (a*a)+cos(lat)*cos(m_lat)*(b*b); + /* h = 0.0 // directly beneath sun h = 0.5 // sunrise/sunset line