From 7cc2d90725b75a19d73b7484935607c39851e6a5 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 17 Sep 2010 11:20:11 +0000 Subject: [PATCH] From Ulrich Hertlein, "I've added a command line switch '--testOcclusion' that enables display of other models in front and behind the outlined object." --- examples/osgoutline/osgoutline.cpp | 59 ++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/examples/osgoutline/osgoutline.cpp b/examples/osgoutline/osgoutline.cpp index bd7811e91..e8055880b 100644 --- a/examples/osgoutline/osgoutline.cpp +++ b/examples/osgoutline/osgoutline.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include @@ -16,19 +17,61 @@ int main(int argc, char** argv) { osg::ArgumentParser arguments(&argc,argv); arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] "); + arguments.getApplicationUsage()->addCommandLineOption("--testOcclusion","Test occlusion by other objects"); arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information"); - - // create outline effect - osg::ref_ptr outline = new osgFX::Outline; - outline->setWidth(8); - outline->setColor(osg::Vec4(1,1,0,1)); + + bool testOcclusion = false; + while (arguments.read("--testOcclusion")) { testOcclusion = true; } + + // load outlined object + std::string modelFilename = arguments.argc() > 1 ? arguments[1] : "dumptruck.osg"; + osg::ref_ptr outlineModel = osgDB::readNodeFile(modelFilename); + if (!outlineModel) + { + osg::notify(osg::FATAL) << "Unable to load model '" << modelFilename << "'\n"; + return -1; + } // create scene osg::ref_ptr root = new osg::Group; - root->addChild(outline.get()); - osg::ref_ptr model0 = osgDB::readNodeFile(arguments.argc() > 1 ? arguments[1] : "al.obj"); - outline->addChild(model0.get()); + { + // create outline effect + osg::ref_ptr outline = new osgFX::Outline; + root->addChild(outline.get()); + + outline->setWidth(8); + outline->setColor(osg::Vec4(1,1,0,1)); + outline->addChild(outlineModel.get()); + } + + if (testOcclusion) + { + // load occluder + std::string occludedModelFilename = "cow.osg"; + osg::ref_ptr occludedModel = osgDB::readNodeFile(occludedModelFilename); + if (!occludedModel) + { + osg::notify(osg::FATAL) << "Unable to load model '" << occludedModelFilename << "'\n"; + return -1; + } + + // occluder offset + const osg::BoundingSphere& bsphere = outlineModel->getBound(); + const osg::Vec3 occluderOffset = osg::Vec3(0,1,0) * bsphere.radius() * 1.2f; + + // occluder behind outlined model + osg::ref_ptr modelTransform0 = new osg::PositionAttitudeTransform; + modelTransform0->setPosition(bsphere.center() + occluderOffset); + modelTransform0->addChild(occludedModel.get()); + root->addChild(modelTransform0.get()); + + // occluder in front of outlined model + osg::ref_ptr modelTransform1 = new osg::PositionAttitudeTransform; + modelTransform1->setPosition(bsphere.center() - occluderOffset); + modelTransform1->addChild(occludedModel.get()); + root->addChild(modelTransform1.get()); + } // must have stencil buffer... osg::DisplaySettings::instance()->setMinimumNumStencilBits(1);