Hi,

does the osgviewerGTK example work?

jp

Natasha Westland wrote:
Hello,

I am having difficulties upgrading from OSG 1.0 to 2.8.2 (on CentOS) and was hoping to tap into this wealth of knowledge after failing miserably poking around the source code and attempting to retrofit the example applications into my own.

Using OSG 1.0, I have an application which used an osgProducer to embed a viewer in another (GTK+ based) application. Using the below approach, I am able to successfully render images in the external application. In my attempt to port to OSG 2.8.2, I am able to embed the viewer in the external application but I can't seem to render any images. (I've tried simply changing the background color and that doesn't work either.) Based on observations in the debugger, it appears that my viewer may not be integrated properly with the gtk redrawing thread of the external application due to the fact that the visible (black) view is overdrawn by the external application at random times, and it is never seen again. Any pointers would be greatly appreciated. Thanks!

Natasha
[email protected]

_**** Initialization of osgProducer viewer using OSG 1.0:  ****_

   osgProducer::Viewer viewer (BuildConfig());
   viewer.setUpViewer (osgProducer::Viewer::SKY_LIGHT_SOURCE |
osgProducer::Viewer::HEAD_LIGHT_SOURCE | osgProducer::Viewer::STATE_MANIPULATOR | osgProducer::Viewer::STATS_MANIPULATOR | osgProducer::Viewer::VIEWER_MANIPULATOR );
     gtk_init (&argc, &argv);

     // set the xid of the GtkSocket and connect the GtkPlug
     guint32 xid = wGtkPlug;    // gtksocket of external application
     GtkWidget *plug = gtk_plug_new(xid);
gtk_signal_connect(GTK_OBJECT(plug), "destroy-event", GTK_SIGNAL_FUNC(destroy_event), &viewer);

     // set the viewer to display in the plug
viewer.getCamera(0)->getRenderSurface()->setWindow(gtk_plug_get_id(GTK_PLUG(plug)));

    // create a new thread to handle GTK events
     pthread_create(&gtk_thread, NULL, gtk_thread_loop, NULL);

   // create the windows and run the threads.
   viewer.realize();

   while( !viewer.done() ) {
       viewer.sync();
       viewer.update();
            // fire off the cull and draw traversals of the scene.
        viewer.frame();
        usleep(500000);
    }

   Producer::CameraConfig*
   BuildConfig(void) {
       Producer::RenderSurface *rs1 = new Producer::RenderSurface;
       rs1->setScreenNum(0);
       rs1->setWindowName("external-app");
       rs1->setWindowRectangle (0,0,640,480);
       Producer::Camera *camera1 = new Producer::Camera;
       camera1->setRenderSurface(rs1);
       camera1->setOffset( 0.0, 0.0 );
rs1->setInputRectangle (Producer::RenderSurface::InputRectangle(0.0,1.0,0.0,1.0));
       Producer::InputArea *ia = new Producer::InputArea;
       ia->addRenderSurface(rs1);
       Producer::CameraConfig *cfg = new Producer::CameraConfig;
       cfg->addCamera("Camera 1",camera1);
       cfg->setInputArea(ia);
       return cfg;
   }

 void *gtk_thread_loop(void *arg) {
     gtk_main();
     return NULL;
  }


_**** Rendering the images in OSG 1.0 is implemented as follows (same for OSG 2.8.2): ****_

   _loadedModel = osgDB::readNodeFile(sName);
   if (!_loadedModel) {
     viewer.setClearColor( osg::Vec4( 0.9f, 0.9f, 0.9f, 1.0) );
     return 1;
   }
viewer.setClearColor( osg::Vec4( 0.701961f, 0.862745f, 0.949020f, 1.0) );

   // optimize the scene graph, remove rendundent nodes and state etc.
   osgUtil::Optimizer optimizer;
   optimizer.optimize(_loadedModel.get());
     //add the model to the transform.
   _modelTransform.get()->addChild(_loadedModel.get());

   // set the scene to render
   viewer.setSceneData(_rootNode.get());

_**** Initialization in OSG 2.8.2 is below: HELP - what am I doing wrong? ****_

   osgViewer::Viewer viewer;

osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
   traits->screenNum = 0;
   traits->x = 0;
   traits->y = 0;
   traits->width = 640;
   traits->height = 480;
   traits->red = 8;
   traits->blue = 8;
   traits->green = 8;
   traits->alpha = 0;
   traits->windowDecoration = false;
   traits->pbuffer = false;
   traits->doubleBuffer = true;
   traits->sharedContext = 0;
   traits->windowName = "external-app";

      gtk_init (&argc, &argv);

     // set the xid of the GtkSocket and connect the GtkPlug
     guint32 xid = wGtkPlug;
     GtkWidget *plug = gtk_plug_new(xid);
gtk_signal_connect(GTK_OBJECT(plug), "destroy-event", GTK_SIGNAL_FUNC(destroy_event), &viewer);

     // Hike logging up
     osg::setNotifyLevel (osg::NOTICE);

     // set the viewer to display in the plug
traits->inheritedWindowData = new osgViewer::GraphicsWindowX11::WindowData(gtk_plug_get_id(GTK_PLUG(plug))); viewer.getCamera()->setGraphicsContext (osg::GraphicsContext::createGraphicsContext(traits.get())); viewer.getCamera()->setViewport (new osg::Viewport(0,0,traits->width, traits->height));
     viewer.setCameraManipulator (new osgGA::TrackballManipulator());

     pthread_create(&gtk_thread, NULL, gtk_thread_loop, NULL);
        // create the windows and run the threads.
     viewer.realize();
     while( !viewer.done() ) {
       viewer.frame();
       usleep (50000);
   }
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


--
This message is subject to the CSIR's copyright terms and conditions, e-mail legal notice, and implemented Open Document Format (ODF) standard. The full disclaimer details can be found at http://www.csir.co.za/disclaimer.html.

This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. MailScanner thanks Transtec Computers for their support.

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

Reply via email to