From cc47d33b320b910f7a93417db9a4ea567c8852a3 Mon Sep 17 00:00:00 2001 From: Stuart Buchanan Date: Mon, 2 Jan 2012 23:10:20 +0000 Subject: [PATCH] Adjust LoD ranges for 3D clouds so that they become visible at maximum range, taking into account the current cloud visibility range, and the possible size of the clouds themselves. --- simgear/scene/sky/cloudfield.cxx | 10 ++++++---- simgear/scene/sky/cloudfield.hxx | 4 ++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/simgear/scene/sky/cloudfield.cxx b/simgear/scene/sky/cloudfield.cxx index 1a801909..0ff07144 100644 --- a/simgear/scene/sky/cloudfield.cxx +++ b/simgear/scene/sky/cloudfield.cxx @@ -69,7 +69,8 @@ double SGCloudField::timer_dt = 0.0; float SGCloudField::view_distance = 20000.0f; bool SGCloudField::wrap = true; float SGCloudField::RADIUS_LEVEL_1 = 5000.0f; -float SGCloudField::RADIUS_LEVEL_2 = 1000.0f; +float SGCloudField::RADIUS_LEVEL_2 = 2000.0f; +float SGCloudField::MAX_CLOUD_DEPTH = 2000.0f; SGVec3f SGCloudField::view_vec, SGCloudField::view_X, SGCloudField::view_Y; @@ -186,9 +187,10 @@ void SGCloudField::applyVisRange(void) for (unsigned int i = 0; i < placed_root->getNumChildren(); i++) { osg::ref_ptr lodnode1 = (osg::LOD*) placed_root->getChild(i); for (unsigned int j = 0; j < lodnode1->getNumChildren(); j++) { + lodnode1->setRange(j, 0.0f, view_distance + RADIUS_LEVEL_1 + RADIUS_LEVEL_2 + MAX_CLOUD_DEPTH); osg::ref_ptr lodnode2 = (osg::LOD*) lodnode1->getChild(j); for (unsigned int k = 0; k < lodnode2->getNumChildren(); k++) { - lodnode2->setRange(k, 0.0f, view_distance); + lodnode2->setRange(k, 0.0f, view_distance + MAX_CLOUD_DEPTH); } } } @@ -317,11 +319,11 @@ void SGCloudField::addCloudToTree(osg::ref_ptr t if (!found) { // No suitable leave node was found, so we need to add one. lodnode = new osg::LOD(); - lodnode1->addChild(lodnode, 0.0f, 4*RADIUS_LEVEL_1); + lodnode1->addChild(lodnode, 0.0f, view_distance + RADIUS_LEVEL_1 + RADIUS_LEVEL_2 + MAX_CLOUD_DEPTH); } transform->setPosition(pos); - lodnode->addChild(transform.get(), 0.0f, view_distance); + lodnode->addChild(transform.get(), 0.0f, view_distance + MAX_CLOUD_DEPTH); lodnode->dirtyBound(); lodnode1->dirtyBound(); diff --git a/simgear/scene/sky/cloudfield.hxx b/simgear/scene/sky/cloudfield.hxx index 1de2fce3..1199c9c5 100644 --- a/simgear/scene/sky/cloudfield.hxx +++ b/simgear/scene/sky/cloudfield.hxx @@ -76,6 +76,10 @@ private: static float RADIUS_LEVEL_1; static float RADIUS_LEVEL_2; + // Theoretical maximum cloud depth, used for fudging the LoD + // ranges to ensure that clouds become visible at maximum range + static float MAX_CLOUD_DEPTH; + // this is a relative position only, with that we can move all clouds at once SGVec3f relative_position; -- 2.39.5