//
// 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.
//
//
#include <simgear/compiler.h>
#include <plib/sg.h>
-#include <plib/ssg.h>
#include <simgear/math/sg_random.h>
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/math/polar3d.hxx>
#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 <ieeefp.h>
+#endif
static list_of_culledCloud inViewClouds;
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;
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;
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;
} 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;
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;
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...
// 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
}
// 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++) {
}
}
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;
sgEnviro.set_view_in_cloud(true);
}
}
-
+#endif
}
// 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;
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;
ssgLoadModelviewMatrix( modelview );
glPopMatrix();
-
+#endif
}
-