X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fsky%2Fcloudfield.cxx;h=8d83037d918d1d9a7b5565e408bb6b7aacca1cbb;hb=ccbc5abec63e508261b6d4bdbd5b1f780d233fc8;hp=725f8876784748e1c78b481c63bf7a904d03b78e;hpb=7b5d49ef60733314a280b766a34f9ca448b956f6;p=simgear.git diff --git a/simgear/scene/sky/cloudfield.cxx b/simgear/scene/sky/cloudfield.cxx index 725f8876..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,20 +345,30 @@ 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; if( ! iCloud->visible ) continue; sgSubVec3( dist, iCloud->pos, eyePos ); - sphere.setCenter(dist[0], dist[2], dist[1]); + sphere.setCenter(dist[0], dist[2], dist[1] + eyePos[1]); float radius = iCloud->aCloud->getRadius(); sphere.setRadius(radius); sphere.orthoXform(mat); @@ -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; @@ -390,19 +459,17 @@ void SGCloudField::Render(void) { // cloud fields are tiled on the flat earth // compute the position in the tile - relx = fmod( deltax + relative_position[SG_X] + tmp[3][0], fieldSize ); - rely = fmod( deltay + relative_position[SG_Y] + tmp[3][1], fieldSize ); + relx = fmod( deltax + relative_position[SG_X], fieldSize ); + rely = fmod( deltay + relative_position[SG_Y], fieldSize ); relx = fmod( relx + fieldSize, fieldSize ); rely = fmod( rely + fieldSize, fieldSize ); sgSetVec3( eyePos, relx, alt, rely); - sgCopyVec3( view_vec, tmp[1] ); - sgCopyVec3( view_X, tmp[0] ); - sgCopyVec3( view_Y, tmp[2] ); - tmp[3][2] = 0; - tmp[3][0] = 0; - tmp[3][1] = 0; + sgSetVec3( view_X, tmp[0][0], tmp[1][0], tmp[2][0] ); + sgSetVec3( view_Y, tmp[0][1], tmp[1][1], tmp[2][1] ); + sgSetVec3( view_vec, tmp[0][2], tmp[1][2], tmp[2][2] ); + ssgLoadModelviewMatrix( tmp ); /* flat earth @@ -449,7 +516,7 @@ void SGCloudField::Render(void) { // iCloud->aCloud->drawContainers(); iCloud->aCloud->Render(iCloud->eyePos); sgEnviro.callback_cloud(iCloud->heading, iCloud->alt, - iCloud->aCloud->getRadius(), iCloud->aCloud->getFamilly(), - iCloud->dist); + iCloud->aCloud->getRadius(), iCloud->aCloud->getFamilly(), - iCloud->dist, iCloud->aCloud->getId()); } glBindTexture(GL_TEXTURE_2D, 0); @@ -461,6 +528,5 @@ void SGCloudField::Render(void) { ssgLoadModelviewMatrix( modelview ); glPopMatrix(); - +#endif } -