From cdcbf3f9af42407fb8b661d4242fba3dc83b98b5 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 30 Nov 2006 10:29:03 +0000 Subject: [PATCH] Added movement of the light source to test performance of update the shadow volumes --- examples/osgshadow/osgshadow.cpp | 74 ++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/examples/osgshadow/osgshadow.cpp b/examples/osgshadow/osgshadow.cpp index 2bd201283..fd02475f4 100644 --- a/examples/osgshadow/osgshadow.cpp +++ b/examples/osgshadow/osgshadow.cpp @@ -132,6 +132,15 @@ int main(int argc, char** argv) return 1; } + bool postionalLight = false; + while (arguments.read("--positionalLight")) postionalLight = true; + while (arguments.read("--directionalLight")) postionalLight = false; + + bool addOccluderToScene = false; + while (arguments.read("addOccluderToScene")) addOccluderToScene = true; + + bool updateLightPosition = true; + // any option left unread are converted into errors to write out later. arguments.reportRemainingOptionsAsUnrecognized(); @@ -149,34 +158,49 @@ int main(int argc, char** argv) osg::notify(osg::NOTICE)<<"No model loaded, please specify a model to load."< geode = new osg::Geode; - - osg::ref_ptr occluder = new osgShadow::OccluderGeometry; - occluder->computeOccluderGeometry(model.get()); + // get the bounds of the model. ComputeBoundingBoxVisitor cbbv; model->accept(cbbv); - cbbv.getPolytope(occluder->getBoundingPolytope(),0.001); osg::BoundingBox bb = cbbv.getBoundingBox(); + + osg::ref_ptr group = new osg::Group; + group->addChild(model.get()); - //geode->addDrawable(occluder.get()); + // set up the occluder + osg::ref_ptr occluder = new osgShadow::OccluderGeometry; + occluder->computeOccluderGeometry(model.get()); + cbbv.getPolytope(occluder->getBoundingPolytope(),0.001); + + if (addOccluderToScene) + { + osg::ref_ptr geode = new osg::Geode; + geode->addDrawable(occluder.get()); + group->addChild(geode.get()); + } osg::ref_ptr shadowVolume = new osgShadow::ShadowVolumeGeometry; -#if 1 -// occluder->comptueShadowVolumeGeometry(osg::Vec4(bb.xMin()+ bb.radius(), bb.yMin()+ bb.radius(), bb.zMax() + bb.radius() ,1.0f), *shadowVolume); - occluder->comptueShadowVolumeGeometry(osg::Vec4(bb.center().x(), bb.center().y(), bb.zMax() + bb.radius() ,1.0f), *shadowVolume); -#else - occluder->comptueShadowVolumeGeometry(osg::Vec4(0.5f,.25f,0.2f,0.0f), *shadowVolume); -#endif - geode->addDrawable(shadowVolume.get()); + shadowVolume->setUseDisplayList(!updateLightPosition); + osg::Vec4 lightpos; + + if (postionalLight) + { + lightpos.set(bb.center().x(), bb.center().y(), bb.zMax() + bb.radius() ,1.0f); + } + else + { + lightpos.set(0.5f,0.25f,-0.8f,0.0f); + } + + { + osg::ref_ptr geode = new osg::Geode; + occluder->comptueShadowVolumeGeometry(lightpos, *shadowVolume); + geode->addDrawable(shadowVolume.get()); + group->addChild(geode.get()); + } - osg::ref_ptr group = new osg::Group; - group->addChild(model.get()); - group->addChild(geode.get()); viewer.setSceneData(group.get()); @@ -189,6 +213,20 @@ int main(int argc, char** argv) // wait for all cull and draw threads to complete. viewer.sync(); + if (updateLightPosition) + { + float t = viewer.getFrameStamp()->getReferenceTime(); + if (postionalLight) + { + lightpos.set(bb.center().x()+sinf(t)*bb.radius(), bb.center().y() + cosf(t)*bb.radius(), bb.zMax() + bb.radius() ,1.0f); + } + else + { + lightpos.set(sinf(t),cosf(t),-0.8f,0.0f); + } + occluder->comptueShadowVolumeGeometry(lightpos, *shadowVolume); + } + // update the scene by traversing it with the the update visitor which will // call all node update callbacks and animations. viewer.update();