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(>k_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(>k_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