Hi Todd and Robert, On 4/09/10 0:21 , Todd J. Furlong wrote: > I made a couple of changes to the osgFX::Outline class (SVN patch attached). > I had a > couple of issues with it that I was trying to resolve: > > 1. When an outline object was occluded by another object, the backfacing > wireframe was > exposed. To fix that, I removed the disabling of GL_DEPTH_TEST.
I've modified the osgoutline example to expose the issue and have verified your patch and it works as advertised. It still is a bit odd, since the depth_test=off seems to bleed from the FX into other parts of the scene. The modified files (and the patch) is attached. Cheers, /ulrich
Index: src/osgFX/Outline.cpp
===================================================================
--- src/osgFX/Outline.cpp (revision 11730)
+++ src/osgFX/Outline.cpp (working copy)
@@ -30,7 +30,8 @@
#include <osg/Texture1D>
-namespace {
+namespace
+{
const unsigned int Override_On =
osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE;
const unsigned int Override_Off =
osg::StateAttribute::OFF|osg::StateAttribute::OVERRIDE;
}
@@ -71,8 +72,9 @@
_color = color;
if (_material.valid()) {
const osg::Material::Face face = osg::Material::FRONT_AND_BACK;
- _material->setAmbient(face, color);
- _material->setDiffuse(face, color);
+ _material->setAmbient(face, osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
+ _material->setDiffuse(face, osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
+ _material->setSpecular(face, osg::Vec4(0.0f, 0.0f, 0.0f,
1.0f));
_material->setEmission(face, color);
}
}
@@ -119,14 +121,14 @@
state->setAttributeAndModes(stencil, Override_On);
// cull front-facing polys
- osg::CullFace* cf = new osg::CullFace;
- cf->setMode(osg::CullFace::FRONT);
- state->setAttributeAndModes(cf, Override_On);
+ osg::CullFace* cullFace = new osg::CullFace;
+ cullFace->setMode(osg::CullFace::FRONT);
+ state->setAttributeAndModes(cullFace, Override_On);
// draw back-facing polygon lines
- osg::PolygonMode* pm = new osg::PolygonMode;
- pm->setMode(osg::PolygonMode::BACK, osg::PolygonMode::LINE);
- state->setAttributeAndModes(pm, Override_On);
+ osg::PolygonMode* polyMode = new osg::PolygonMode;
+ polyMode->setMode(osg::PolygonMode::BACK,
osg::PolygonMode::LINE);
+ state->setAttributeAndModes(polyMode, Override_On);
// outline width
_lineWidth = new osg::LineWidth;
@@ -135,13 +137,13 @@
// outline color/material
_material = new osg::Material;
- _material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
+ _material->setColorMode(osg::Material::OFF);
setColor(_color);
state->setAttributeAndModes(_material.get(), Override_On);
// disable modes
state->setMode(GL_BLEND, Override_Off);
- state->setMode(GL_DEPTH_TEST, Override_Off);
+ //state->setMode(GL_DEPTH_TEST, Override_Off);
state->setTextureMode(0, GL_TEXTURE_1D, Override_Off);
state->setTextureMode(0, GL_TEXTURE_2D, Override_Off);
state->setTextureMode(0, GL_TEXTURE_3D, Override_Off);
Index: examples/osgoutline/osgoutline.cpp
===================================================================
--- examples/osgoutline/osgoutline.cpp (revision 11730)
+++ examples/osgoutline/osgoutline.cpp (working copy)
@@ -5,6 +5,7 @@
*/
#include <osg/Group>
+#include <osg/PositionAttitudeTransform>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
@@ -18,18 +19,59 @@
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+"
[options] <file>");
arguments.getApplicationUsage()->addCommandLineOption("-h or
--help","Display this information");
- // create outline effect
- osg::ref_ptr<osgFX::Outline> outline = new osgFX::Outline;
- outline->setWidth(8);
- outline->setColor(osg::Vec4(1,1,0,1));
+ // load outlined object
+ std::string modelFilename = arguments.argc() > 1 ? arguments[1] :
"dumptruck.osg";
+ osg::ref_ptr<osg::Node> outlineModel = osgDB::readNodeFile(modelFilename);
+ if (!outlineModel)
+ {
+ osg::notify(osg::FATAL) << "Unable to load model '" << modelFilename
<< "'\n";
+ return -1;
+ }
+ // load occluded object
+ std::string occludedModelFilename = "cow.osg";
+ osg::ref_ptr<osg::Node> occludedModel =
osgDB::readNodeFile(occludedModelFilename);
+ if (!occludedModel)
+ {
+ osg::notify(osg::FATAL) << "Unable to load model '" <<
occludedModelFilename << "'\n";
+ return -1;
+ }
+
// create scene
osg::ref_ptr<osg::Group> root = new osg::Group;
- root->addChild(outline.get());
- osg::ref_ptr<osg::Node> model0 = osgDB::readNodeFile(arguments.argc() > 1
? arguments[1] : "al.obj");
- outline->addChild(model0.get());
+ {
+ // occluder behind outlined model
+ osg::ref_ptr<osg::PositionAttitudeTransform> modelTransform = new
osg::PositionAttitudeTransform;
+ root->addChild(modelTransform.get());
+ // offset from outlined object
+ const osg::BoundingSphere& bsphere = outlineModel->getBound();
+ modelTransform->setPosition(bsphere.center() + osg::Vec3(0,1,0) *
bsphere.radius() * -1.2f);
+ modelTransform->addChild(occludedModel.get());
+ }
+
+ {
+ // create outline effect
+ osg::ref_ptr<osgFX::Outline> outline = new osgFX::Outline;
+ root->addChild(outline.get());
+
+ outline->setWidth(8);
+ outline->setColor(osg::Vec4(1,1,0,1));
+ outline->addChild(outlineModel.get());
+ }
+
+ {
+ // occluder in front of outlined model
+ osg::ref_ptr<osg::PositionAttitudeTransform> modelTransform = new
osg::PositionAttitudeTransform;
+ root->addChild(modelTransform.get());
+
+ // offset from outlined object
+ const osg::BoundingSphere& bsphere = outlineModel->getBound();
+ modelTransform->setPosition(bsphere.center() + osg::Vec3(0,1,0) *
bsphere.radius() * 1.2f);
+ modelTransform->addChild(occludedModel.get());
+ }
+
// must have stencil buffer...
osg::DisplaySettings::instance()->setMinimumNumStencilBits(1);
Outline.tar.gz
Description: GNU Zip compressed data
_______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

