I am running into some difficulties setting this up... I am trying to set up a 
regular, i.e. non-RTT camera in the left view and the RTT camera in the right 
view...  The left view renders fine, but the right view is just black... 
running the app through gDEBugger it looks like the texture is empty... It 
isn't obvious to me what hte problem is... can anyone provide help?  


Code:


// use an ArgumentParser object to manage the program arguments.
osg::ArgumentParser arguments( &argc, argv );

arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+"
 rttCompositeViewer ");
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+"
 [options] filename ...");

osg::ref_ptr<osg::Node> scene = osgDB::readNodeFiles( arguments );
if ( !scene ) scene = osgDB::readNodeFile("cessna.osg");


unsigned int windowX = 10;
unsigned int windowY = 10;
unsigned int windowWidth = 1024;
unsigned int windowHeight = 512;

osg::ref_ptr<osg::GraphicsContext::Traits> traits = new 
osg::GraphicsContext::Traits;
traits->x = windowX;
traits->y = windowY;
traits->width = windowWidth;
traits->height = windowHeight;
traits->windowDecoration = true;
traits->doubleBuffer = true;
traits->sharedContext = 0;

osg::ref_ptr<osg::GraphicsContext> gc = 
osg::GraphicsContext::createGraphicsContext(traits.get());
osgViewer::GraphicsWindow* gw = 
dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
if (!gw)
{
osg::notify(osg::NOTICE)<<"Error: unable to create graphics window."<<std::endl;
return 1;
}

osgViewer::CompositeViewer viewer(arguments);

//////////////////////////////////////////////////////////////////
// Left View
osgViewer::View *leftView = new osgViewer::View;
leftView->setName("Left View");

osg::ref_ptr<osg::Camera> leftCamera = new osg::Camera;
leftCamera->setCullMask(1);
leftCamera->setName("Left");
leftCamera->setGraphicsContext(gc.get());
leftCamera->setViewport(new osg::Viewport(0, 0, windowWidth/2, windowHeight));
leftCamera->setClearColor(osg::Vec4(0.0f,0.0f,1.0f,1.0f));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
leftCamera->setDrawBuffer(buffer);
leftCamera->setReadBuffer(buffer);

leftView->addSlave(leftCamera.get(), osg::Matrixd(), osg::Matrixd());
leftView->setSceneData(scene.get());

viewer.addView(leftView);

//////////////////////////////////////////////////////////////////
// Right View
osgViewer::View *rightView = new osgViewer::View;
rightView->setName("Right View");

// Create Texture
osg::ref_ptr<osg::Texture2D> tex2D = new osg::Texture2D;
tex2D->setTextureSize( 512, 512 );
tex2D->setInternalFormat( GL_RGBA8 );
tex2D->setSourceFormat( GL_RGBA );
tex2D->setSourceType( GL_UNSIGNED_BYTE );

// Create RTT Camera
osg::ref_ptr<osg::Camera> rttCamera = new osg::Camera;
rttCamera->setGraphicsContext(gc.get());
rttCamera->setName("RTT Camera");
rttCamera->setClearColor( osg::Vec4() );
rttCamera->setClearMask( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
rttCamera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
rttCamera->setRenderOrder( osg::Camera::PRE_RENDER);
tex2D->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR );
tex2D->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR );
rttCamera->setViewport( 0, 0, tex2D->getTextureWidth(), 
tex2D->getTextureHeight() );
rttCamera->attach( osg::Camera::COLOR_BUFFER, tex2D );
rttCamera->addChild( scene.get() );
rightView->addSlave(rttCamera, osg::Matrixd(), osg::Matrixd());

// Create HUD Camera
osg::ref_ptr<osg::Camera> hudCamera = new osg::Camera;
hudCamera->setGraphicsContext(gc.get());
hudCamera->setName("HUD Camera");
hudCamera->setReferenceFrame( osg::Transform::ABSOLUTE_RF );
hudCamera->setClearMask( GL_DEPTH_BUFFER_BIT );
hudCamera->setRenderOrder( osg::Camera::POST_RENDER );
hudCamera->setAllowEventFocus( false );
hudCamera->setProjectionMatrix( osg::Matrix::ortho2D(0.0, 1.0, 0.0, 1.0) );
hudCamera->getOrCreateStateSet()->setMode( GL_LIGHTING, 
osg::StateAttribute::OFF );

osg::Geometry* geom = osg::createTexturedQuadGeometry(osg::Vec3(), 
osg::Vec3(1.0f,0.0f,0.0f), osg::Vec3(0.0f,1.0f,0.0f),0.0f, 0.0f, 1.0f, 1.0f );
osg::ref_ptr<osg::Geode> quad = new osg::Geode;
quad->addDrawable( geom );

int values = osg::StateAttribute::OFF|osg::StateAttribute::PROTECTED;
quad->getOrCreateStateSet()->setAttribute(new 
osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::FILL), 
values );
quad->getOrCreateStateSet()->setMode( GL_LIGHTING, values );

hudCamera->addChild( quad );
hudCamera->getOrCreateStateSet()->setTextureAttributeAndModes( 0, tex2D.get() );

rightView->addSlave(hudCamera, osg::Matrixd(), osg::Matrixd());

viewer.addView(rightView);


return viewer.run();








robertosfield wrote:
> Hi Conan,
> On 23 January 2014 12:58, Conan < ()> wrote:
> 
> > I thought the prefered method to handle multiple independent views was with 
> > a composite viewer.  Can I add slave cameras to a composite viewer
> > 
> 
> 
> Yes, this is why I was referring to View rather than View(er) in my previous 
> reply.  osgViewer is deliberately designed so that each View "has a" master 
> Camera that controls the overall view, and an optional set of slave Camera's 
> that are used to render that view.  The osgViewer::CompsoiteViewer composes a 
> set of View objects, while osgViewer::Viewer for ease of use just inherits 
> from View but can't handle multiple views obvious as it's just a single View 
> under the hood.
> 
> 
> You can mix and match multiple View, multiple Scenes, multiple Contexts, 
> multiple slave Camera in any way that you choose.
> 
> 
> Robert.
> 
>  ------------------
> Post generated by Mail2Forum

Code:




------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=57974#57974





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to