float SGCloudField::view_distance = 20000.0f;
bool SGCloudField::wrap = true;
float SGCloudField::MAX_CLOUD_DEPTH = 2000.0f;
-bool SGCloudField::use_impostors = true;
-float SGCloudField::lod1_range = 10000.0f;
-float SGCloudField::lod2_range = 5000.0f;
-float SGCloudField::impostor_distance = 10000.0f;
+bool SGCloudField::use_impostors = false;
+float SGCloudField::lod1_range = 8000.0f;
+float SGCloudField::lod2_range = 4000.0f;
+float SGCloudField::impostor_distance = 15000.0f;
int impostorcount = 0;
int lodcount = 0;
++itr) {
osg::ref_ptr<osg::PositionAttitudeTransform> pat = itr->second;
+
+ if (pat == 0) {
+ continue;
+ }
+
osg::Vec3f currpos = field_transform->getPosition() + fta * pat->getPosition();
// Determine the vector from the new position to the cloud in cloud-space.
}
SGCloudField::~SGCloudField() {
- }
+}
void SGCloudField::clear(void) {
for (unsigned int i = 0; i < placed_root->getNumChildren(); i++) {
osg::ref_ptr<osg::LOD> lodnode1 = (osg::LOD*) placed_root->getChild(i);
for (unsigned int j = 0; j < lodnode1->getNumChildren(); j++) {
- lodnode1->setRange(j, 0.0f, lod1_range + view_distance + MAX_CLOUD_DEPTH);
+ lodnode1->setRange(j, 0.0f, lod1_range + lod2_range + view_distance + MAX_CLOUD_DEPTH);
osg::ref_ptr<osg::LOD> lodnode2 = (osg::LOD*) lodnode1->getChild(j);
for (unsigned int k = 0; k < lodnode2->getNumChildren(); k++) {
lodnode2->setRange(k, 0.0f, view_distance + MAX_CLOUD_DEPTH);
bool SGCloudField::addCloud(float lon, float lat, float alt, int index, osg::ref_ptr<EffectGeode> geode) {
return addCloud(lon, lat, alt, 0.0f, 0.0f, index, geode);
- }
+}
bool SGCloudField::addCloud(float lon, float lat, float alt, float x, float y, int index, osg::ref_ptr<EffectGeode> geode) {
// If this cloud index already exists, don't replace it.
addCloudToTree(transform, lon, lat, alt, x, y);
cloud_hash[index] = transform;
return true;
- }
-
+}
+
// Remove a give cloud from inside the tree, without removing it from the cloud hash
void SGCloudField::removeCloudFromTree(osg::ref_ptr<osg::PositionAttitudeTransform> transform)
{
+ if (transform == 0)
+ {
+ // Ooops!
+ return;
+ }
osg::ref_ptr<osg::Group> lodnode = transform->getParent(0);
lodnode->removeChild(transform);
cloudcount--;
lodnode1->removeChild(lodnode);
lodcount--;
- if (lodnode1->getNumChildren() == 0) {
- impostornode->removeChild(lodnode1);
+ if (lodnode1->getNumChildren() == 0) {
+ impostornode->removeChild(lodnode1);
placed_root->removeChild(impostornode);
impostorcount--;
}
if (!found) {
// No suitable leaf node was found, so we need to add one.
lodnode = new osg::LOD();
- lodnode1->addChild(lodnode, 0.0f, lod1_range + view_distance + MAX_CLOUD_DEPTH);
+ lodnode1->addChild(lodnode, 0.0f, lod1_range + lod2_range + view_distance + MAX_CLOUD_DEPTH);
lodcount++;
}
transform->setPosition(pos);
- lodnode->addChild(transform.get(), 0.0f, view_distance);
+ lodnode->addChild(transform.get(), 0.0f, view_distance + MAX_CLOUD_DEPTH);
cloudcount++;
SG_LOG(SG_ENVIRONMENT, SG_DEBUG, "Impostors: " << impostorcount <<
" LoD: " << lodcount <<
bool SGCloudField::deleteCloud(int identifier) {
osg::ref_ptr<osg::PositionAttitudeTransform> transform = cloud_hash[identifier];
- if (transform == NULL) return false;
+ if (transform == 0) return false;
removeCloudFromTree(transform);
cloud_hash.erase(identifier);
}
bool SGCloudField::isDefined3D(void) {
- return (cloud_hash.size() > 0);
+ return (! cloud_hash.empty());
}
SGCloudField::CloudFog::CloudFog() {