226 lines
5.9 KiB
C++
226 lines
5.9 KiB
C++
#include "viewer/osgQOpenGLWidget.h"
|
|
#include "viewer/OSGRenderer.h"
|
|
|
|
#include <osgViewer/Viewer>
|
|
#include <osg/GL>
|
|
|
|
#include <QApplication>
|
|
#include <QKeyEvent>
|
|
#include <QInputDialog>
|
|
#include <QLayout>
|
|
#include <QMainWindow>
|
|
#include <QScreen>
|
|
#include <QWindow>
|
|
|
|
#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<QMainWindow*>(parent());
|
|
|
|
if(_mainwindow)
|
|
{
|
|
g = size();
|
|
|
|
if(layout())
|
|
sMargins = layout()->contentsMargins();
|
|
|
|
bool ok = true;
|
|
|
|
// select screen
|
|
if(qApp->screens().size() > 1)
|
|
{
|
|
QMap<QString, QScreen*> 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<QMainWindow*>(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
|