I have commented out those lines in svn revision: 9171. The problem with 2D scenes I reported is gone and everything else seems to work as it did before.
If you would like, I would be happy to write a regression test. Frank On Sun, Nov 16, 2008 at 11:41:10AM +0000, Robert Osfield wrote: > Hi Frank, > > Good detective work. I hadn't thought about this tiny little > "optimization" in the updateCalculatedNearFar. This optimization only > makes sense of perspective projections, and if fact could probably be > safely removed completely for all types of projection matrices. > > Could you comment out the lines: > > if (d_far<0.0) > { > // whole object behind the eye point so discard > return false; > } > > >From CullVisitor::updateCalculatedNearFar and see how you get on. If > that works fine then we'll need to look at a fix in svn. > > Robert. > > On Fri, Nov 14, 2008 at 9:05 PM, <[EMAIL PROTECTED]> wrote: > > osgUtil/CullVisitor.cpp line 644-645: > > > > // whole object behind the eye point so discard > > return false; > > > > Perhaps its not called "culling" in this case but my code hits this return > > statement and as a result, the drawable is not added to the StateGraphList > > in > > RenderBin. OpenGL is never given a chance to clip. > > > > Frank > > > > On Fri, Nov 14, 2008 at 08:22:31PM +0000, Robert Osfield wrote: > >> Hi Frank, > >> > >> If culling is switched off then culling is off, the eye point will > >> make no difference. > >> > >> What difference you moving the eye point will be in the clipping due > >> to the position of near/far plane. > >> > >> Robert. > >> > >> On Fri, Nov 14, 2008 at 8:09 PM, <[EMAIL PROTECTED]> wrote: > >> > I think I figured it out. It looks like even with culling turned off, > >> > nodes that are behind the "eye point" are culled. See > >> > osgUtil/CullVisitor.cpp line 645. > >> > > >> > I now calculate the view matrix as follows. > >> > > >> > osg::Matrixd matrix = osg::Matrixd::translate( -center ); > >> > matrix.postMultRotate( osg::Quat( PI, osg::Vec3d( 1.0, 0.0, 0.0 ) ) ); > >> > matrix.postMultTranslate( osg::Vec3d( 0.0, 0.0, -0.5 ) ); > >> > > >> > Adding the last translation transform to push the nodes away from the > >> > "eye point" made the problem go away. > >> > > >> > Is this a bug? > >> > > >> > Frank > >> > > >> > On Thu, Nov 13, 2008 at 11:38:14AM -0500, [EMAIL PROTECTED] wrote: > >> >> Hi Robert, > >> >> > >> >> Thanks for the quick response. That was a good suggestion. However it > >> >> looks like that is not the problem. All of my nodes live on the z=0.0 > >> >> plane and my projection matrix is > >> >> > >> >> osg::Matrixd::ortho( -aspectRatio, aspectRatio, -1.0, 1.0, -1.0, 1.0 ) > >> >> > >> >> I have attached a small code sample that exhibits the problem. > >> >> > >> >> Frank > >> >> > >> >> On Thu, Nov 13, 2008 at 04:24:37PM +0000, Robert Osfield wrote: > >> >> > Hi Frank, > >> >> > > >> >> > My best guess is that your projection matrix isn't wide enough to > >> >> > encompass your scene and near/far clipping is clipping out the > >> >> > fragments. This may well look like culling, often users do mistake > >> >> > clipping with culling so chase up the wrong part of the pipeline. > >> >> > > >> >> > Robert. > >> >> > > >> >> > On Thu, Nov 13, 2008 at 4:18 PM, <[EMAIL PROTECTED]> wrote: > >> >> > > Greetings osg community, > >> >> > > > >> >> > > I'm have written a custom MatrixManipulator for a 2D scene and I am > >> >> > > experiencing a strange problem. As I pan and zoom around, some of > >> >> > > the > >> >> > > nodes in the scene disappear abruptly as if they are being culled > >> >> > > inappropriately. However, disabling culling has no effect. > >> >> > > > >> >> > > The behavior is erratic and unpredictable which smells to me like > >> >> > > I'm on > >> >> > > the border of a floating point inequality. I have discovered two > >> >> > > ways > >> >> > > that seem to make the problem go away. > >> >> > > > >> >> > > One: > >> >> > > > >> >> > > One of the transformations I use to construct the view matrix is > >> >> > > > >> >> > > osg::Matrixd::rotate( osg::Quat( PI, osg::Vec3d( 1.0, 0.0, 0.0 ) > >> >> > > ) ) > >> >> > > > >> >> > > If I replace that with > >> >> > > > >> >> > > osg::Matrixd::scale( osg::Vec3d( 1.0, -1.0, 1.0 ) ) > >> >> > > > >> >> > > the problem seems to go away. > >> >> > > > >> >> > > Two: > >> >> > > > >> >> > > All of the nodes in my seen that exhibit this problem have a 2D > >> >> > > bounding box. i.e. > >> >> > > > >> >> > > osg::BoundingBox const & bb = pGeode->getBoundingBox(); > >> >> > > assert( bb.zMax() - bb.zMin() < 1e-5 ); > >> >> > > > >> >> > > If I give the nodes some depth so that the above assert would fail, > >> >> > > the problem seems to go away. > >> >> > > > >> >> > > I suspect that these are not actual solutions. In any case, I would > >> >> > > like > >> >> > > to understand what is happening under the covers. Any ideas? > >> >> > > > >> >> > > Frank > >> >> > > > >> >> > > _______________________________________________ > >> >> > > osg-users mailing list > >> >> > > osg-users@lists.openscenegraph.org > >> >> > > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >> >> > > > >> >> > _______________________________________________ > >> >> > osg-users mailing list > >> >> > osg-users@lists.openscenegraph.org > >> >> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >> > > >> >> > >> >> #include <osg/Geode> > >> >> #include <osg/Geometry> > >> >> #include <osgViewer/Viewer> > >> >> > >> >> #include <iostream> > >> >> #include <cassert> > >> >> > >> >> osg::ref_ptr< osg::Node > CreateGraph() > >> >> { > >> >> osg::ref_ptr< osg::Geode > pGeode = new osg::Geode(); > >> >> osg::ref_ptr< osg::Geometry > pGeometry = new osg::Geometry(); > >> >> pGeode->addDrawable( pGeometry.get() ); > >> >> > >> >> // Vertices > >> >> osg::ref_ptr< osg::Vec3Array > pVerts = new osg::Vec3Array( 4 ); > >> >> (*pVerts)[ 0 ] = osg::Vec3( 0.0, 0.0, 0.0 ); > >> >> (*pVerts)[ 1 ] = osg::Vec3( 1.0, 0.0, 0.0 ); > >> >> (*pVerts)[ 2 ] = osg::Vec3( 1.0, 1.0, 0.0 ); > >> >> (*pVerts)[ 3 ] = osg::Vec3( 0.0, 1.0, 0.0 ); // dosen't work > >> >> //(*pVerts)[ 3 ] = osg::Vec3( 0.0, 1.0, 0.1 ); // works as expected > >> >> pGeometry->setVertexArray( pVerts.get() ); > >> >> > >> >> pGeometry->addPrimitiveSet( new osg::DrawArrays( > >> >> osg::PrimitiveSet::QUADS, 0, 4 ) ); > >> >> > >> >> osg::ref_ptr< osg::Vec4Array > pColors = new osg::Vec4Array( 4 ); > >> >> (*pColors)[ 0 ] = osg::Vec4( 1.0f, 1.0f, 1.0f, 1.0f ); > >> >> (*pColors)[ 1 ] = osg::Vec4( 1.0f, 0.0f, 0.0f, 1.0f ); > >> >> (*pColors)[ 2 ] = osg::Vec4( 0.0f, 1.0f, 0.0f, 1.0f ); > >> >> (*pColors)[ 3 ] = osg::Vec4( 0.0f, 0.0f, 1.0f, 1.0f ); > >> >> pGeometry->setColorArray( pColors.get() ); > >> >> pGeometry->setColorBinding( osg::Geometry::BIND_PER_VERTEX ); > >> >> > >> >> osg::ref_ptr< osg::StateSet > pState = pGeode->getOrCreateStateSet(); > >> >> pState->setMode( GL_LIGHTING, osg::StateAttribute::OFF ); > >> >> > >> >> osg::BoundingBox const & bb = pGeode->getBoundingBox(); > >> >> std::cout > >> >> << "BoundingBox = (" > >> >> << bb.xMin() << "," > >> >> << bb.yMin() << "," > >> >> << bb.zMin() << "," > >> >> << bb.xMax() << "," > >> >> << bb.yMax() << "," > >> >> << bb.zMax() << ")" > >> >> << std::endl; > >> >> > >> >> return pGeode.get(); > >> >> } > >> >> > >> >> int main( int argc, char * argv[] ) > >> >> { > >> >> int const x = 100; > >> >> int const y = 100; > >> >> int const w = 800; > >> >> int const h = 800; > >> >> > >> >> osg::ref_ptr< osg::GraphicsContext::Traits > pTraits = new > >> >> osg::GraphicsContext::Traits(); > >> >> pTraits->x = x; > >> >> pTraits->y = y; > >> >> pTraits->width = w; > >> >> pTraits->height = h; > >> >> pTraits->windowDecoration = true; > >> >> pTraits->doubleBuffer = true; > >> >> pTraits->sharedContext = 0; > >> >> > >> >> osg::ref_ptr< osg::GraphicsContext > pContext = > >> >> osg::GraphicsContext::createGraphicsContext( pTraits.get() ); > >> >> assert( pContext.valid() ); > >> >> > >> >> osgViewer::Viewer viewer; > >> >> > >> >> viewer.getCamera()->setGraphicsContext( pContext.get() ); > >> >> viewer.getCamera()->setClearColor( osg::Vec4( 0.0, 0.0, 0.0, 1.0 ) ); > >> >> viewer.getCamera()->setViewport( new osg::Viewport( 0, 0, w, h ) ); > >> >> viewer.getCamera()->setGraphicsContext( pContext.get() ); > >> >> viewer.getCamera()->setCullingMode( osg::CullSettings::NO_CULLING ); > >> >> > >> >> double const aspectRatio = double(w)/double(h); > >> >> //osg::Matrixd ortho = osg::Matrixd::ortho2D( -aspectRatio, > >> >> aspectRatio, -1.0, 1.0 ); > >> >> osg::Matrixd ortho = osg::Matrixd::ortho( -aspectRatio, aspectRatio, > >> >> -1.0, 1.0, -1.0, 1.0 ); > >> >> viewer.getCamera()->setProjectionMatrix( ortho ); > >> >> > >> >> osg::ref_ptr< osg::Node > pGraph = CreateGraph(); > >> >> > >> >> viewer.setSceneData( pGraph ); > >> >> > >> >> viewer.realize(); > >> >> > >> >> int n = 0; > >> >> int const N = 4000; // adjust for your computer speed > >> >> osg::Vec3d const initialCenter( 0.5, 0.5, 0.0 ); > >> >> > >> >> while ( !viewer.done() ) > >> >> { > >> >> n = ( n + 1 ) % N; > >> >> double d = -double(n)/double(N); > >> >> > >> >> osg::Vec3d center = initialCenter + osg::Vec3d( 0.0, d, 0.0 ); > >> >> //std::cout > >> >> // << "center = (" > >> >> // << center[0] << "," > >> >> // << center[1] << "," > >> >> // << center[2] << ")" > >> >> // << std::endl; > >> >> > >> >> osg::Matrixd matrix = osg::Matrixd::translate( -center ); > >> >> > >> >> // doesn't work > >> >> double const PI = 3.14159265; > >> >> matrix.postMultRotate( osg::Quat( PI, osg::Vec3d( 1.0, 0.0, 0.0 ) ) > >> >> ); > >> >> > >> >> // works as expected, but left handed coordinate system is not > >> >> desired > >> >> //matrix.postMultScale( osg::Vec3d( 1.0, -1.0, 1.0 ) ); > >> >> > >> >> viewer.getCamera()->setViewMatrix( matrix ); > >> >> > >> >> viewer.frame(); > >> >> } > >> >> > >> >> return 0; > >> >> } > >> >> > >> > > >> >> _______________________________________________ > >> >> osg-users mailing list > >> >> osg-users@lists.openscenegraph.org > >> >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >> > > >> > _______________________________________________ > >> > osg-users mailing list > >> > osg-users@lists.openscenegraph.org > >> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >> > > >> _______________________________________________ > >> osg-users mailing list > >> osg-users@lists.openscenegraph.org > >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > _______________________________________________ > > osg-users mailing list > > osg-users@lists.openscenegraph.org > > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org