X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fsky%2Fcloudfield.cxx;h=8d83037d918d1d9a7b5565e408bb6b7aacca1cbb;hb=ccbc5abec63e508261b6d4bdbd5b1f780d233fc8;hp=37ff89107a27fe3ea0ea669c0f9d09afc97f09b6;hpb=75ab8e697b9b429fe03a1b8479c1d85c60ac4b5e;p=simgear.git diff --git a/simgear/scene/sky/cloudfield.cxx b/simgear/scene/sky/cloudfield.cxx index 37ff8910..8d83037d 100644 --- a/simgear/scene/sky/cloudfield.cxx +++ b/simgear/scene/sky/cloudfield.cxx @@ -16,7 +16,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // @@ -27,7 +27,6 @@ #include #include -#include #include #include #include @@ -42,7 +41,22 @@ SG_USING_STD(vector); #include "newcloud.hxx" #include "cloudfield.hxx" -extern SGSky *thesky; +#if defined(__MINGW32__) +#define isnan(x) _isnan(x) +#endif + +#if defined (__FreeBSD__) +# if __FreeBSD_version < 500000 + extern "C" { + inline int isnan(double r) { return !(r <= 0 || r >= 0); } + } +# endif +#endif + + +#if defined (__CYGWIN__) +#include +#endif static list_of_culledCloud inViewClouds; @@ -61,10 +75,14 @@ static int cacheResolution = 64; static sgVec3 last_sunlight={0.0f, 0.0f, 0.0f}; int SGCloudField::get_CacheResolution(void) { +#if 0 return cacheResolution; +#endif + return 0; } void SGCloudField::set_CacheResolution(int resolutionPixels) { +#if 0 if(cacheResolution == resolutionPixels) return; cacheResolution = resolutionPixels; @@ -74,13 +92,18 @@ void SGCloudField::set_CacheResolution(int resolutionPixels) { count = 1; SGNewCloud::cldCache->setCacheSize(count, cacheResolution); } +#endif } int SGCloudField::get_CacheSize(void) { +#if 0 return SGNewCloud::cldCache->queryCacheSize(); +#endif + return 0; } void SGCloudField::set_CacheSize(int sizeKb) { +#if 0 // apply in rendering option dialog if(last_cache_size == sizeKb) return; @@ -94,15 +117,21 @@ void SGCloudField::set_CacheSize(int sizeKb) { count = 1; SGNewCloud::cldCache->setCacheSize(count, cacheResolution); } +#endif } void SGCloudField::set_CloudVis(float distance) { +#if 0 if( distance <= fieldSize ) SGCloudField::CloudVis = distance; +#endif } void SGCloudField::set_density(float density) { +#if 0 SGCloudField::density = density; +#endif } void SGCloudField::set_enable3dClouds(bool enable) { +#if 0 if(enable3D == enable) return; enable3D = enable; @@ -114,10 +143,12 @@ void SGCloudField::set_enable3dClouds(bool enable) { } else { SGNewCloud::cldCache->setCacheSize(0); } +#endif } // reposition the cloud layer at the specified origin and orientation void SGCloudField::reposition( sgVec3 p, sgVec3 up, double lon, double lat, double alt, double dt, float direction, float speed) { +#if 0 sgMat4 T1, LON, LAT; sgVec3 axis; @@ -194,31 +225,39 @@ void SGCloudField::reposition( sgVec3 p, sgVec3 up, double lon, double lat, doub frustum.setFOV( w, h ); frustum.setNearFar(1.0, CloudVis); timer_dt = dt; +#endif } SGCloudField::SGCloudField() : - draw_in_3d(true), - last_density(0.0), deltax(0.0), deltay(0.0), - last_course(0.0) + last_course(0.0), + last_density(0.0), + draw_in_3d(true) { +#if 0 sgSetVec3( relative_position, 0,0,0); theField.reserve(200); inViewClouds.reserve(200); sg_srandom_time_10(); +#else + draw_in_3d = false; +#endif } SGCloudField::~SGCloudField() { +#if 0 list_of_Cloud::iterator iCloud; for( iCloud = theField.begin() ; iCloud != theField.end() ; iCloud++ ) { delete iCloud->aCloud; } theField.clear(); +#endif } void SGCloudField::clear(void) { +#if 0 list_of_Cloud::iterator iCloud; for( iCloud = theField.begin() ; iCloud != theField.end() ; iCloud++ ) { delete iCloud->aCloud; @@ -228,6 +267,7 @@ void SGCloudField::clear(void) { last_density = 0.0; // true to come back in set density after layer is built draw_in_3d = true; +#endif } // use a table or else we see poping when moving the slider... @@ -247,29 +287,42 @@ static int densTable[][10] = { // set the visible flag depending on density void SGCloudField::applyDensity(void) { +#if 0 int row = (int) (density / 10.0); int col = 0; + sgBox fieldBox; + list_of_Cloud::iterator iCloud; for( iCloud = theField.begin() ; iCloud != theField.end() ; iCloud++ ) { if(++col > 9) col = 0; if( densTable[row][col] ) { iCloud->visible = true; + fieldBox.extend( *iCloud->aCloud->getCenter() ); } else iCloud->visible = false; } last_density = density; draw_in_3d = ( theField.size() != 0); + sgVec3 center; + sgSubVec3( center, fieldBox.getMax(), fieldBox.getMin() ); + sgScaleVec3( center, 0.5f ); + center[1] = 0.0f; + field_sphere.setCenter( center ); + field_sphere.setRadius( fieldSize * 0.5f * 1.414f ); +#endif } // add one cloud, data is not copied, ownership given void SGCloudField::addCloud( sgVec3 pos, SGNewCloud *cloud) { +#if 0 Cloud cl; cl.aCloud = cloud; cl.visible = true; cloud->SetPos( pos ); sgCopyVec3( cl.pos, *cloud->getCenter() ); theField.push_back( cl ); +#endif } @@ -280,7 +333,7 @@ static float Rnd(float n) { // for debug only // build a field of cloud of size 25x25 km, its a grid of 11x11 clouds void SGCloudField::buildTestLayer(void) { - +#if 0 const float s = 2250.0f; for( int z = -5 ; z <= 5 ; z++) { @@ -292,13 +345,23 @@ void SGCloudField::buildTestLayer(void) { } } applyDensity(); +#endif } // cull all clouds of a tiled field void SGCloudField::cullClouds(sgVec3 eyePos, sgMat4 mat) { +#if 0 list_of_Cloud::iterator iCloud; - // TODO:cull the field before culling the clouds in the field (should eliminate 3 fields) + sgSphere tile_sphere; + tile_sphere.setRadius( field_sphere.getRadius() ); + sgVec3 tile_center; + sgSubVec3( tile_center, field_sphere.getCenter(), eyePos ); + tile_sphere.setCenter( tile_center ); + tile_sphere.orthoXform(mat); + if( frustum.contains( & tile_sphere ) == SG_OUTSIDE ) + return; + for( iCloud = theField.begin() ; iCloud != theField.end() ; iCloud++ ) { sgVec3 dist; sgSphere sphere; @@ -323,7 +386,7 @@ void SGCloudField::cullClouds(sgVec3 eyePos, sgMat4 mat) { sgEnviro.set_view_in_cloud(true); } } - +#endif } @@ -331,7 +394,14 @@ void SGCloudField::cullClouds(sgVec3 eyePos, sgMat4 mat) { // because no field can have an infinite size (and we don't want to reach his border) // we draw this field and adjacent fields. // adjacent fields are not real, its the same field displaced by some offset -void SGCloudField::Render(void) { +void SGCloudField::Render(float *sun_color) { + // sun_color used to depend on an extern SGSky *thesky definition + // above. However, this is bad form for a library and it's much + // more clean to just pass in the needed value. For reference, here is + // the old way that sun_color was fetched ... + // float *sun_color = thesky->get_sun_color(); + +#if 0 sgVec3 eyePos; double relx, rely; @@ -371,7 +441,6 @@ void SGCloudField::Render(void) { sgScaleVec3 ( SGNewCloud::ambLight, ambient , 1.1f); // trying something else : clouds are more yellow/red at dawn/dusk // and added a bit of blue ambient - float *sun_color = thesky->get_sun_color(); sgScaleVec3 ( SGNewCloud::sunlight, sun_color , 0.4f); SGNewCloud::ambLight[2] += 0.1f; @@ -459,6 +528,5 @@ void SGCloudField::Render(void) { ssgLoadModelviewMatrix( modelview ); glPopMatrix(); - +#endif } -