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
> >> >> > > [email protected]
> >> >> > > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> >> >> > >
> >> >> > _______________________________________________
> >> >> > osg-users mailing list
> >> >> > [email protected]
> >> >> > 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
> >> >> [email protected]
> >> >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> >> >
> >> > _______________________________________________
> >> > osg-users mailing list
> >> > [email protected]
> >> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> >> >
> >> _______________________________________________
> >> osg-users mailing list
> >> [email protected]
> >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> > _______________________________________________
> > osg-users mailing list
> > [email protected]
> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> >
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org