Thanks Don, build fix merged and submitted to SVN. In future could you post to osg-submissions to avoid the possibility of such a fix dropping through the cracks. Thanks Robert.
On Wed, Dec 24, 2008 at 7:12 PM, Don Leich <[email protected]> wrote: > I've found a patch that Julian Scheid posted along with the thread > > Re: [osg-users] Shadows in osgviewerQT ? (solved / patch) > > is needed to run this standard example on my Mac with OS X 10.5.2 : > > osgviewerQT cow.osg --QOSGWidget > > > At minimum, these changes are required: > > diff QOSGWidget.cpp.O QOSGWidget.cpp > 53c53 > < #elif defined(__APPLE__) && defined(APPLE_PRE_10_3) > --- >> #elif defined(__APPLE__) > 148a149,151 >> #if defined(__APPLE__) >> traits->inheritedWindowData = new >> WindowData(HIViewGetWindow((HIViewRef)winId())); >> #else > 149a153 >> #endif > > It also assumes the build has specified OSG_WINDOWING_SYSTEM="Carbon". > Julian had some other useful if not essential changes. > > > There is still a problem with combining these switches: > > osgviewerQT cow.osg --QOSGWidget --MTCompositeViewer > > > Only one view appears correctly rendered and the other views are filled with > frame buffer garbage. > > Julian - thanks for the gift! > > > -Don Leich > > >> >>>>>>> The osgviewerQT example with the --QOSGWidget option has exposed some >>>>>>> problems at the juction of OSG and the windowing system. I was aware >>>>>>> of a >>>>>>> problem running this on Mac OS X for a couple of weeks, but didn't >>>>>>> pay much >>>>>>> attention to it. I spent some time testing on a variey of Linux >>>>>>> systems and >>>>>>> found a problem there too. Please note I'm running OSG version >>>>>>> 2.6.0. >>>>>>> >>>>>>> On Mac OS X osgviewerQT crashes after getting a BadWindow error from >>>>>>> XGetWindowAttributes when called by >>>>>>> osgViewer::GraphicsWindowX11::setWindow. >>>>>>> The window attributes are garbage values. >> > > /* OpenSceneGraph example, osganimate. > * > * Permission is hereby granted, free of charge, to any person obtaining a > copy > * of this software and associated documentation files (the "Software"), to > deal > * in the Software without restriction, including without limitation the > rights > * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > * copies of the Software, and to permit persons to whom the Software is > * furnished to do so, subject to the following conditions: > * > * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS > OR > * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > THE > * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > FROM, > * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > * THE SOFTWARE. > */ > > #if USE_QT4 > > #include <QtCore/QString> > #include <QtCore/QTimer> > #include <QtGui/QKeyEvent> > #include <QtGui/QApplication> > #include <QtOpenGL/QGLWidget> > #include <QtGui/QtGui> > #include <QtGui/QWidget> > using Qt::WindowFlags; > > #else > > class QWidget; > #include <qtimer.h> > #include <qgl.h> > #include <qapplication.h> > > #define WindowFlags WFlags > > #endif > > > #include <osgViewer/Viewer> > #include <osgViewer/CompositeViewer> > #include <osgViewer/ViewerEventHandlers> > #include <osgViewer/GraphicsWindow> > > #include <osgViewer/ViewerEventHandlers> > > #if defined(WIN32) && !defined(__CYGWIN__) > #include <osgViewer/api/Win32/GraphicsWindowWin32> > typedef HWND WindowHandle; > typedef osgViewer::GraphicsWindowWin32::WindowData WindowData; > #elif defined(__APPLE__) > #include <osgViewer/api/Carbon/GraphicsWindowCarbon> > typedef WindowRef WindowHandle; > typedef osgViewer::GraphicsWindowCarbon::WindowData WindowData; > #else // all other unix > #include <osgViewer/api/X11/GraphicsWindowX11> > typedef Window WindowHandle; > typedef osgViewer::GraphicsWindowX11::WindowData WindowData; > #endif > > > #include <osgGA/TrackballManipulator> > #include <osgGA/FlightManipulator> > #include <osgGA/DriveManipulator> > #include <osgGA/KeySwitchMatrixManipulator> > #include <osgGA/StateSetManipulator> > #include <osgGA/AnimationPathManipulator> > #include <osgGA/TerrainManipulator> > > #include <osgDB/ReadFile> > > #include <iostream> > #include <sstream> > > class QOSGWidget : public QWidget > { > public: > > QOSGWidget( QWidget * parent = 0, const char * name = 0, WindowFlags > f = 0, bool overrideTraits = false); > > virtual ~QOSGWidget() {} > > osgViewer::GraphicsWindow* getGraphicsWindow() { return _gw.get(); } > const osgViewer::GraphicsWindow* getGraphicsWindow() const { return > _gw.get(); } > > protected: > > void init(); > void createContext(); > > virtual void mouseDoubleClickEvent ( QMouseEvent * event ); > virtual void closeEvent( QCloseEvent * event ); > virtual void destroyEvent( bool destroyWindow = true, bool > destroySubWindows = true); > virtual void resizeEvent( QResizeEvent * event ); > virtual void keyPressEvent( QKeyEvent* event ); > virtual void keyReleaseEvent( QKeyEvent* event ); > virtual void mousePressEvent( QMouseEvent* event ); > virtual void mouseReleaseEvent( QMouseEvent* event ); > virtual void mouseMoveEvent( QMouseEvent* event ); > > osg::ref_ptr<osgViewer::GraphicsWindow> _gw; > bool _overrideTraits; > }; > > QOSGWidget::QOSGWidget( QWidget * parent, const char * name, WindowFlags f, > bool overrideTraits): > #if USE_QT4 > QWidget(parent, f), _overrideTraits (overrideTraits) > #else > QWidget(parent, name, f), _overrideTraits (overrideTraits) > #endif > { > createContext(); > > > #if USE_QT4 > setAttribute(Qt::WA_PaintOnScreen); > setAttribute(Qt::WA_NoSystemBackground); > setFocusPolicy(Qt::ClickFocus); > #else > setBackgroundMode(Qt::NoBackground); > #endif > } > > void QOSGWidget::createContext() > { > osg::DisplaySettings* ds = osg::DisplaySettings::instance(); > > osg::ref_ptr<osg::GraphicsContext::Traits> traits = new > osg::GraphicsContext::Traits; > > traits->readDISPLAY(); > if (traits->displayNum<0) traits->displayNum = 0; > > traits->windowName = "osgViewerQt"; > traits->screenNum = 0; > traits->x = x(); > traits->y = y(); > traits->width = width(); > traits->height = height(); > traits->alpha = ds->getMinimumNumAlphaBits(); > traits->stencil = ds->getMinimumNumStencilBits(); > traits->windowDecoration = false; > traits->doubleBuffer = true; > traits->sharedContext = 0; > traits->sampleBuffers = ds->getMultiSamples(); > traits->samples = ds->getNumMultiSamples(); > > #if defined(__APPLE__) > traits->inheritedWindowData = new > WindowData(HIViewGetWindow((HIViewRef)winId())); > #else > traits->inheritedWindowData = new WindowData(winId()); > #endif > > if (ds->getStereo()) > { > switch(ds->getStereoMode()) > { > case(osg::DisplaySettings::QUAD_BUFFER): traits->quadBufferStereo > = true; break; > case(osg::DisplaySettings::VERTICAL_INTERLACE): > case(osg::DisplaySettings::CHECKERBOARD): > case(osg::DisplaySettings::HORIZONTAL_INTERLACE): traits->stencil > = 8; break; > default: break; > } > } > > osg::ref_ptr<osg::GraphicsContext> gc = > osg::GraphicsContext::createGraphicsContext(traits.get()); > _gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc.get()); > > // get around dearanged traits on X11 (MTCompositeViewer only) > if (_overrideTraits) > { > traits->x = x(); > traits->y = y(); > traits->width = width(); > traits->height = height(); > } > > } > void QOSGWidget::destroyEvent(bool destroyWindow, bool destroySubWindows) > { > _gw->getEventQueue()->closeWindow(); > } > > > void QOSGWidget::closeEvent( QCloseEvent * event ) > { > #ifndef USE_QT4 > event->accept(); > #endif > > _gw->getEventQueue()->closeWindow(); > } > > > void QOSGWidget::resizeEvent( QResizeEvent * event ) > { > const QSize & size = event->size(); > _gw->getEventQueue()->windowResize(0, 0, size.width(), size.height() ); > _gw->resized(0, 0, size.width(), size.height()); > } > > void QOSGWidget::keyPressEvent( QKeyEvent* event ) > { > #if USE_QT4 > _gw->getEventQueue()->keyPress( (osgGA::GUIEventAdapter::KeySymbol) > *(event->text().toAscii().data() ) ); > #else > _gw->getEventQueue()->keyPress( (osgGA::GUIEventAdapter::KeySymbol) > event->ascii() ); > #endif > } > > void QOSGWidget::keyReleaseEvent( QKeyEvent* event ) > { > #if USE_QT4 > int c = *event->text().toAscii().data(); > #else > int c = event->ascii(); > #endif > > _gw->getEventQueue()->keyRelease( (osgGA::GUIEventAdapter::KeySymbol) (c) > ); > } > > void QOSGWidget::mousePressEvent( QMouseEvent* event ) > { > int button = 0; > switch(event->button()) > { > case(Qt::LeftButton): button = 1; break; > case(Qt::MidButton): button = 2; break; > case(Qt::RightButton): button = 3; break; > case(Qt::NoButton): button = 0; break; > default: button = 0; break; > } > _gw->getEventQueue()->mouseButtonPress(event->x(), event->y(), button); > } > void QOSGWidget::mouseDoubleClickEvent ( QMouseEvent * event ) > { > int button = 0; > switch(event->button()) > { > case(Qt::LeftButton): button = 1; break; > case(Qt::MidButton): button = 2; break; > case(Qt::RightButton): button = 3; break; > case(Qt::NoButton): button = 0; break; > default: button = 0; break; > } > _gw->getEventQueue()->mouseDoubleButtonPress(event->x(), event->y(), > button); > } > void QOSGWidget::mouseReleaseEvent( QMouseEvent* event ) > { > int button = 0; > switch(event->button()) > { > case(Qt::LeftButton): button = 1; break; > case(Qt::MidButton): button = 2; break; > case(Qt::RightButton): button = 3; break; > case(Qt::NoButton): button = 0; break; > default: button = 0; break; > } > _gw->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button); > } > > void QOSGWidget::mouseMoveEvent( QMouseEvent* event ) > { > _gw->getEventQueue()->mouseMotion(event->x(), event->y()); > } > > > > > > > > > class ViewerQOSG : public osgViewer::Viewer, public QOSGWidget > { > public: > > ViewerQOSG(QWidget * parent = 0, const char * name = 0, WindowFlags f > = 0): > QOSGWidget( parent, name, f ) > { > getCamera()->setViewport(new > osg::Viewport(0,0,width(),height())); > getCamera()->setProjectionMatrixAsPerspective(30.0f, > static_cast<double>(width())/static_cast<double>(height()), 1.0f, 10000.0f); > getCamera()->setGraphicsContext(getGraphicsWindow()); > > setThreadingModel(osgViewer::Viewer::SingleThreaded); > > connect(&_timer, SIGNAL(timeout()), this, SLOT(update())); > _timer.start(10); > } > > virtual void paintEvent( QPaintEvent * event ) { frame(); } > > protected: > > QTimer _timer; > }; > > > > class CompositeViewerQOSG : public osgViewer::CompositeViewer, public > QOSGWidget > { > public: > > CompositeViewerQOSG(QWidget * parent = 0, const char * name = 0, > WindowFlags f = 0): > QOSGWidget( parent, name, f ) > { > setThreadingModel(osgViewer::CompositeViewer::SingleThreaded); > > connect(&_timer, SIGNAL(timeout()), this, SLOT(repaint())); > _timer.start(1); > } > > virtual void paintEvent( QPaintEvent * event ) { frame(); } > > protected: > > QTimer _timer; > }; > > > > #if USE_QT4 > // we use this wrapper for CompositeViewer ONLY because of the timer > // NOTE: this is a workaround because we're not using QT's moc precompiler > here. > // > class QViewerTimer : public QWidget > { > > public: > > QViewerTimer (QWidget * parent = 0, WindowFlags f = 0): > QWidget (parent, f) > { > _viewer = new osgViewer::CompositeViewer (); > > _viewer->setThreadingModel(osgViewer::CompositeViewer::DrawThreadPerContext); > connect(&_timer, SIGNAL(timeout()), this, SLOT(repaint())); > _timer.start(10); > } > > ~QViewerTimer () > { > _timer.stop (); > } > > virtual void paintEvent (QPaintEvent * event) { _viewer->frame(); } > > osg::ref_ptr <osgViewer::CompositeViewer> _viewer; > QTimer _timer; > > }; > #endif > > void setupManipulatorAndHandler(osgViewer::View & viewer, > osg::ArgumentParser & arguments) > { > // set up the camera manipulators. > { > osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator > = new osgGA::KeySwitchMatrixManipulator; > > keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new > osgGA::TrackballManipulator() ); > keyswitchManipulator->addMatrixManipulator( '2', "Flight", new > osgGA::FlightManipulator() ); > keyswitchManipulator->addMatrixManipulator( '3', "Drive", new > osgGA::DriveManipulator() ); > keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new > osgGA::TerrainManipulator() ); > > viewer.setCameraManipulator( keyswitchManipulator.get() ); > } > > // add the state manipulator > viewer.addEventHandler( new > osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) ); > > // add the thread model handler > viewer.addEventHandler(new osgViewer::ThreadingHandler); > > // add the window size toggle handler > viewer.addEventHandler(new osgViewer::WindowSizeHandler); > > // add the stats handler > viewer.addEventHandler(new osgViewer::StatsHandler); > > // add the help handler > viewer.addEventHandler(new > osgViewer::HelpHandler(arguments.getApplicationUsage())); > } > > int mainQOSGWidget(QApplication& a, osg::ArgumentParser& arguments) > { > // load the scene. > osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments); > if (!loadedModel) > { > std::cout << arguments[0] <<": No data loaded." << std::endl; > return 1; > } > > std::cout<<"Using QOSGWidget - QWidget + osgViewer creating the graphics > context."<<std::endl; > > if (arguments.read("--CompositeViewer")) > { > osg::ref_ptr<CompositeViewerQOSG> viewerWindow(new > CompositeViewerQOSG); > viewerWindow->setGeometry(0,0,640,480); > > unsigned int width = viewerWindow->width(); > unsigned int height = viewerWindow->height(); > > { > osgViewer::View* view1 = new osgViewer::View; > > view1->getCamera()->setGraphicsContext(viewerWindow->getGraphicsWindow()); > view1->getCamera()->setProjectionMatrixAsPerspective(30.0f, > static_cast<double>(width)/static_cast<double>(height/2), 1.0, 1000.0); > view1->getCamera()->setViewport(new > osg::Viewport(0,0,width,height/2)); > view1->setSceneData(loadedModel.get()); > > setupManipulatorAndHandler(*view1, arguments); > > viewerWindow->addView(view1); > } > > { > osgViewer::View* view2 = new osgViewer::View; > > view2->getCamera()->setGraphicsContext(viewerWindow->getGraphicsWindow()); > view2->getCamera()->setProjectionMatrixAsPerspective(30.0f, > static_cast<double>(width)/static_cast<double>(height/2), 1.0, 1000.0); > view2->getCamera()->setViewport(new > osg::Viewport(0,height/2,width,height/2)); > view2->setSceneData(loadedModel.get()); > > setupManipulatorAndHandler(*view2, arguments); > > viewerWindow->addView(view2); > } > > viewerWindow->show(); > > a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) ); > > return a.exec(); > } > #if USE_QT4 > else if (arguments.read("--MTCompositeViewer")) > { > > std::cout <<" + using standard CompositeViewer with seperate contexts > (Multithreaded mode / EXPERIMENTAL !)" <<std::endl; > > int nbCowsX = 3; > int nbCowsY = 2; > int size = 300; > unsigned int width = nbCowsX * size; > unsigned int height = nbCowsY * size; > > QGridLayout *uiLayout = new QGridLayout (); > QWidget *wy = new QWidget (); > > // the timer holds an instance of osgViewer::CompositeViewer > // NOTE: this is a workaround since we're not using QT's moc > precompiler here.. > QViewerTimer *ctimer = new QViewerTimer (); > > for (int x=0;x<nbCowsX; x++) > for (int y=0;y<nbCowsY; y++) > { > > // embed the QOSGWidget into QGroupBox to demonstrate that we > // really use QT's Widgets > // > std::stringstream widgetname; widgetname << "View (" << x << > "," << y << ")"; > QGroupBox *w= new QGroupBox (QString (widgetname.str ().c_str > ()), wy); > QGridLayout *tmpl = new QGridLayout (); > QOSGWidget *gw = new QOSGWidget (w, 0, 0, true); > tmpl->addWidget (gw); > w->setLayout(tmpl); > uiLayout->addWidget (w, y, x); > > // setup views as usual > osgViewer::View* view = new osgViewer::View; > view->getCamera()->setGraphicsContext(gw->getGraphicsWindow > ()); > view->getCamera()->setProjectionMatrixAsPerspective > (30.0f, > static_cast<double>(width*2)/static_cast<double>(height), 1.0, 1000.0); > view->getCamera()->setViewport(new > osg::Viewport(0,0,size,size)); > view->addEventHandler(new osgViewer::StatsHandler); > view->setCameraManipulator(new osgGA::TrackballManipulator); > view->setSceneData(loadedModel.get ()); > ctimer->_viewer->addView(view); > } > > //uiLayout->addWidget (ctimer); > wy->setLayout (uiLayout); > wy->resize (width, height); > wy->show (); > > // we need the timer to be visible for repaints > // NOTE: this is a workaround since we're not using QT's moc > precompiler here.. > ctimer->resize (1,1); > ctimer->show (); > > a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) ); > > return a.exec(); > } > #endif > else > { > osg::ref_ptr<ViewerQOSG> viewerWindow(new ViewerQOSG); > viewerWindow->setGeometry(0,0,640,480); > > viewerWindow->setCameraManipulator(new osgGA::TrackballManipulator); > viewerWindow->setSceneData(loadedModel.get()); > > viewerWindow->show(); > > setupManipulatorAndHandler(*viewerWindow.get(), arguments); > > a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) ); > > return a.exec(); > } > } > > _______________________________________________ > 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

