HI Karl,

To do the graphics work you should do all the ops from the thread that
the graphics context has.  The easist way to this by adding in pre or
post draw callback to the camera.  Alternatively you can add an custom
osg::Operation to the GraphicsWindow and this will be called during
the standard frame.

In the SVN version of the OSG you also have the option of using a
CompileContext, which is a pbuffer created per main graphics context
and is shared with this context.  This CompileContext can have its own
GaphicsThread that you can pass a custom osg::Operation to do the
compile.  Its effectively the same approach as adding it to the main
GraphicsWindow except its done in a separate thread.

The src/applications/osgviewer.cpp has some code in place that
illustrates how to create the compile contexts.

Another things you might consider is using the OSG standard database
paging support, this way you won't need to do any tricky stuff
yourself, it'll all be done for you.

Robert.

On 7/13/07, Karl Heijdenberg <[EMAIL PROTECTED]> wrote:
Hello,

I have a tricky problem with composite viewer. I will try to explain it.

We are developing an application for flight simulation with both terrain and
texture paging.
The problem occurs for the texture paging in a callback that loads textures
to the graphics card.

First of all I create two contexts and using one camera per context.
For each camera I add an update callback, for texture loading.

The callback class, that is called, holds a pointer to the graphics context.
Upon a callback call I
only get filled black polygons, when textures are loaded (for both
contexts). If I add a call to makeCurrent()
on the graphics context in the called method, my textures are shown for the
first
context as expected. However in the second context the textures are still
black.

// Setup composite viewer
  viewer_ = new CompositeViewer;

viewer_->setThreadingModel(osgViewer::CompositeViewer::ThreadPerContext);

  osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
  traits->x = 0;
  traits->y = 0;
  traits->width =  1280;
  traits->height = 480;
  traits->windowDecoration = false;
  traits->doubleBuffer = true;
  traits->sharedContext = 0;

  traits->screenNum = 0;


//Create first context and add first View to the composite viewer
 {
    osg::ref_ptr<osg::GraphicsContext> gc =
osg::GraphicsContext::createGraphicsContext(traits.get ());
    gc->createNewContextID();

    if(gc.valid())
      {
    osgViewer::View* view = new osgViewer::View;
    viewer_->addView(view);

    //std::cout << "gc->createNewContextID();" << gc->createNewContextID()
<< std::endl;
    view->addEventHandler(keyboardHandler_.get());
    view->setSceneData(getSceneRoot());
    view->addEventHandler(MouseFly::Instance());
    view->getCamera()->setViewport(new osg::Viewport(0,0,
traits->width, traits->height));
    view->getCamera()->setProjectionMatrixAsPerspective(45,
traits->width/traits->height, 10, 1000000);
    view->getCamera()->setGraphicsContext(gc.get());
    view->getCamera()->setNearFarRatio( 0.5/30000.0);

    osg::ref_ptr<UpdateTRAMCallback> TRAMupdateCallback =
new UpdateTRAMCallback();
    osg::ref_ptr<SubloadTRAMCallback> TRAMsubloadCallback =
new SubloadTRAMCallback(gc.get());

    osg::ref_ptr<osg::NodeCallback> nc = new
osg::NodeCallback;
    nc->addNestedCallback(TRAMsubloadCallback.get()); // once every
graphical context
    nc->addNestedCallback(TRAMupdateCallback.get());

    view->getCamera()->setUpdateCallback(nc.get());

      }
  }

  traits->x = 0;
  traits->y = 800;

//Create second context and add second View to the composite viewer
   {
    osg::ref_ptr<osg::GraphicsContext> gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
    gc->createNewContextID();
    if(gc.valid())
      {
    osgViewer::View* view = new osgViewer::View;
    viewer_->addView(view);

    view->addEventHandler(keyboardHandler_.get());
    view->setSceneData(getSceneRoot());
    view->addEventHandler(MouseFly::Instance());
    view->getCamera()->setViewport(new osg::Viewport(0,0,
traits->width, traits->height));
    view->getCamera()->setProjectionMatrixAsPerspective(45,
traits->width/traits->height, 10, 1000000);
    view->getCamera()->setGraphicsContext(gc.get());
    view->getCamera()->setNearFarRatio( 0.5/30000.0);

    osg::ref_ptr<UpdateTRAMCallback> TRAMupdateCallback =
new UpdateTRAMCallback();
    osg::ref_ptr<SubloadTRAMCallback> TRAMsubloadCallback =
new SubloadTRAMCallback(gc.get());

    osg::ref_ptr<osg::NodeCallback> nc = new
osg::NodeCallback;
    nc->addNestedCallback(TRAMsubloadCallback.get()); // once every
graphical context
    nc->addNestedCallback(TRAMupdateCallback.get());

    view->getCamera()->setUpdateCallback(nc.get());
      }
  }

  viewer_->realize();



//Callback class methods
  void SubloadTRAMCallback::operator()( osg::Node *node,
osg::NodeVisitor *nv )
  {
    // gc_->makeCurrent(); //If this is called we get a desired behaviour
for the first context.
    TextureController::Instance()->subload((gc_.valid() ?
gc_->getState() : 0));
    traverse(node,nv);

  }


When using a shared context instead of separate contexts the textures are
loaded correctly for both views.
Still the call to gc_->makeCurrent() is required.

For any other models with mapped textures everything works as expected in
both contexts. These models
are below one group node and the terrains (with textures loaded by the
callback) below another group node
in the scene.

Before we tried to use composite viewer we used producer and the
scenehandler from producerOSG. We used corresponding
callbacks for the prodcuer cameras. In this case the texures were drawn in
the same manner. When we used only one context
the textures were drawn as expected, but with two contexts all terrain
textures were drawn black. In producer we did not make
a call to makeCurrent().

OSG 2.0 / RHEL 5

Any ideas?

Thanks in advance!

//Karl
_______________________________________________
osg-users mailing list
osg-users@openscenegraph.net
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/

_______________________________________________
osg-users mailing list
osg-users@openscenegraph.net
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/

Reply via email to