#include "viewer/osgQOpenGLWidget.h" #include "viewer/OSGRenderer.h" #include #include #include #include #include #include #include #include #include #if 0 osgQOpenGLWidget::osgQOpenGLWidget(QWidget* parent) : QOpenGLWidget(parent) { } osgQOpenGLWidget::osgQOpenGLWidget(osg::ArgumentParser* arguments, QWidget* parent) : QOpenGLWidget(parent), _arguments(arguments) { } osgQOpenGLWidget::~osgQOpenGLWidget() { } osgViewer::Viewer* osgQOpenGLWidget::getOsgViewer() { return m_renderer; } OpenThreads::ReadWriteMutex* osgQOpenGLWidget::mutex() { return &_osgMutex; } void osgQOpenGLWidget::initializeGL() { // Initializes OpenGL function resolution for the current context. initializeOpenGLFunctions(); createRenderer(); emit initialized(); } void osgQOpenGLWidget::resizeGL(int w, int h) { Q_ASSERT(m_renderer); QScreen* screen = windowHandle() && windowHandle()->screen() ? windowHandle()->screen() : qApp->screens().front(); m_renderer->resize(w, h, screen->devicePixelRatio()); } void osgQOpenGLWidget::paintGL() { OpenThreads::ScopedReadLock locker(_osgMutex); if (_isFirstFrame) { _isFirstFrame = false; m_renderer->getCamera()->getGraphicsContext()->setDefaultFboId(defaultFramebufferObject()); } m_renderer->frame(); } void osgQOpenGLWidget::keyPressEvent(QKeyEvent* event) { Q_ASSERT(m_renderer); if(event->key() == Qt::Key_F) { static QSize g; static QMargins sMargins; if(parent() && parent()->isWidgetType()) { QMainWindow* _mainwindow = dynamic_cast(parent()); if(_mainwindow) { g = size(); if(layout()) sMargins = layout()->contentsMargins(); bool ok = true; // select screen if(qApp->screens().size() > 1) { QMap screens; int screenNumber = 0; for(QScreen* screen : qApp->screens()) { QString name = screen->name(); if(name.isEmpty()) { name = tr("Screen %1").arg(screenNumber); } name += " (" + QString::number(screen->size().width()) + "x" + QString::number( screen->size().height()) + ")"; screens[name] = screen; ++screenNumber; } QString selected = QInputDialog::getItem(this, tr("Choose fullscreen target screen"), tr("Screen"), screens.keys(), 0, false, &ok); if(ok && !selected.isEmpty()) { context()->setScreen(screens[selected]); move(screens[selected]->geometry().x(), screens[selected]->geometry().y()); resize(screens[selected]->geometry().width(), screens[selected]->geometry().height()); } } if(ok) { // in fullscreen mode, a thiner (1px) border around // viewer widget if(layout()) layout()->setContentsMargins(1, 1, 1, 1); setParent(0); showFullScreen(); } } } else { showNormal(); setMinimumSize(g); QMainWindow* _mainwindow = dynamic_cast(parent()); if(_mainwindow){ _mainwindow->setCentralWidget(this); } if(layout()) layout()->setContentsMargins(sMargins); qApp->processEvents(); setMinimumSize(QSize(1, 1)); } } else // not 'F' key { // forward event to renderer m_renderer->keyPressEvent(event); } } void osgQOpenGLWidget::keyReleaseEvent(QKeyEvent* event) { Q_ASSERT(m_renderer); // forward event to renderer m_renderer->keyReleaseEvent(event); } void osgQOpenGLWidget::mousePressEvent(QMouseEvent* event) { Q_ASSERT(m_renderer); // forward event to renderer m_renderer->mousePressEvent(event); } void osgQOpenGLWidget::mouseReleaseEvent(QMouseEvent* event) { Q_ASSERT(m_renderer); // forward event to renderer m_renderer->mouseReleaseEvent(event); } void osgQOpenGLWidget::mouseDoubleClickEvent(QMouseEvent* event) { Q_ASSERT(m_renderer); // forward event to renderer m_renderer->mouseDoubleClickEvent(event); } void osgQOpenGLWidget::mouseMoveEvent(QMouseEvent* event) { Q_ASSERT(m_renderer); // forward event to renderer m_renderer->mouseMoveEvent(event); } void osgQOpenGLWidget::wheelEvent(QWheelEvent* event) { Q_ASSERT(m_renderer); // forward event to renderer m_renderer->wheelEvent(event); } void osgQOpenGLWidget::setDefaultDisplaySettings() { osg::DisplaySettings* ds = osg::DisplaySettings::instance().get(); ds->setNvOptimusEnablement(1); ds->setStereo(false); } void osgQOpenGLWidget::createRenderer() { // call this before creating a View... setDefaultDisplaySettings(); if (!_arguments) { m_renderer = new OSGRenderer(this); } else { m_renderer = new OSGRenderer(_arguments, this); } QScreen* screen = windowHandle() && windowHandle()->screen() ? windowHandle()->screen() : qApp->screens().front(); m_renderer->setupOSG(width(), height(), screen->devicePixelRatio()); } #endif