From 32ed1bf03750df17096110f531a7e749a902528c Mon Sep 17 00:00:00 2001 From: jiegeaiai Date: Fri, 17 Jan 2025 02:33:15 +0800 Subject: [PATCH] modify render --- src/CMakeLists.txt | 3 +- src/main.cpp | 7 +++ src/translations/Dyt_zh_CN.ts | 86 +++++++++++++------------- src/ui/MainWindow.cpp | 11 ++-- src/ui/MainWindow.h | 7 ++- src/viewer/GraphicsWindowEx.cpp | 104 +++++++++++++++++++++----------- src/viewer/GraphicsWindowEx.h | 11 +++- src/viewer/OSGEnv.cpp | 56 +++++++++++++++++ src/viewer/OSGEnv.h | 7 +++ src/viewer/OSGRenderer.cpp | 17 +++--- src/viewer/OSGRenderer.h | 8 ++- src/viewer/OsgOpenGLWindow.cpp | 85 ++++++++++---------------- src/viewer/OsgOpenGLWindow.h | 20 ++---- src/viewer/OsgViewWidget.h | 1 - 14 files changed, 252 insertions(+), 171 deletions(-) create mode 100644 src/viewer/OSGEnv.cpp create mode 100644 src/viewer/OSGEnv.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 23046735..c6c77bba 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,7 +9,7 @@ SET(CMAKE_CXX_STANDARD_REQUIRED ON) SET(CMAKE_INCLUDE_CURRENT_DIR ON) find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets LinguistTools REQUIRED) -find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets LinguistTools OpenGL REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Gui Widgets LinguistTools OpenGL REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Widgets LinguistTools DataVisualization Charts Network REQUIRED) message("qt VERSION " ${QT_VERSION_MAJOR}) @@ -146,6 +146,7 @@ target_link_libraries( ${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Charts Qt${QT_VERSION_MAJOR}::DataVisualization diff --git a/src/main.cpp b/src/main.cpp index 83b6e276..432197f0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,10 +6,16 @@ #include "common/CrashHandler.h" #include "ui/MainFrame.h" +#include "viewer/OSGEnv.h" int main(int argc, char* argv[]) { SpdLogger logger("logs/log.txt", 5); + if (!OSGEnv::init()) { + LOG_ERROR("OSGEnv::init() failed!"); + return 1; + } + Application::setAttribute(Qt::AA_EnableHighDpiScaling); Application app(argc, argv); @@ -24,6 +30,7 @@ int main(int argc, char* argv[]) { mainWindow.showMaximized(); ret = app.exec(); + OSGEnv::destroy(); return ret; } #else diff --git a/src/translations/Dyt_zh_CN.ts b/src/translations/Dyt_zh_CN.ts index ca96e8d9..84bbf962 100644 --- a/src/translations/Dyt_zh_CN.ts +++ b/src/translations/Dyt_zh_CN.ts @@ -479,153 +479,153 @@ - + model elements - + attribte - + Wave Curve - + Speed Curve - + 3D Curve - - + + Target number - - + + Signal-to-noise ratio - - + + Azimuth line of sight - - + + Pitch gaze angle - - + + azimuth - - + + Pitch angle - - + + attribute - - + + Doppler - - + + course - - + + Speed - - + + longitude - - + + latitude - - + + distance - - + + velocity - - + + Radial dimensions - - + + Target RCS - + Report Table - + Report - + Signal Indicator Lamp - + ParamSetting - + Matlab File - + name: 5year 0412 diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index c239e4da..f92c0a74 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -14,6 +14,7 @@ #include "DockWidget.h" #include "viewer/ViewWidget.h" +#include "viewer/OsgOpenGLWindow.h" #include "viewer/OsgViewer.h" #include "chartPlot/FitCurveDialog.h" @@ -82,8 +83,9 @@ void MainWindow::InitUI() { connect(modelBrowser_, &ModelBrowser::WorkSpaceChange, propertyBrowser_, &PropertyBrowser::OnWorkSpaceChange); connect(modelBrowser_, &ModelBrowser::EntityChange, propertyBrowser_, &PropertyBrowser::OnEntityChange); - qtOsgViewWidget_ = new ViewWidget; - qtOsgViewWidget_->Initialize(); + //qtOsgViewWidget_ = new ViewWidget; + qtOsgViewWidget_ = new OsgOpenGLWindow; + //qtOsgViewWidget_->Initialize(); m_mapDockWidget.insert("PropertyBrowser", attribte); QString wavePath ="", speedPath = "", rdPath = "", matlabParam=""; @@ -209,7 +211,7 @@ void MainWindow::InitUI() { InitDockLayout(); //ui->viewWidget->layout()->addWidget(qtOsgViewWidget_); - qtOsgViewWidget_->LoadDefaultScene(); + //qtOsgViewWidget_->LoadDefaultScene(); //OsgViewer::Get().Initialize(); //OsgViewer::Get().OnFrame(); @@ -235,7 +237,8 @@ void MainWindow::InitDockLayout() { tabWidget_->insertTab(i, mainWindow_, strTabName); if (listDocArea[0].toList().size() > 0) { - mainWindow_->setCentralWidget(qtOsgViewWidget_); + //mainWindow_->setCentralWidget(qtOsgViewWidget_); + mainWindow_->setCentralWidget(qtOsgViewWidget_->AsWidget()); //OsgViewer::Get().Initialize(); //OsgViewer::Get().OnFrame(); } else { diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index c8f8d71e..4d7c9328 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -21,9 +21,9 @@ public: class ModelBrowser* GetModelBrowser() const { return modelBrowser_; } - class ViewWidget* GetViewWidget() const { + /*class ViewWidget* GetViewWidget() const { return qtOsgViewWidget_; - } + }*/ class FitCurveDialog* GetFitCurveDlg() const { return fitCurveDlg_; @@ -55,7 +55,8 @@ private: class ModelBrowser* modelBrowser_{ nullptr }; class PropertyBrowser* propertyBrowser_{ nullptr }; class QWebEngineView* webEngineView_{ nullptr }; - class ViewWidget* qtOsgViewWidget_{ nullptr }; + //class ViewWidget* qtOsgViewWidget_{ nullptr }; + class OsgOpenGLWindow* qtOsgViewWidget_{ nullptr }; class FitCurveDialog* fitCurveDlg_{ nullptr }; class FitCurveDialog* fitYLgCurveDlg_{ nullptr }; diff --git a/src/viewer/GraphicsWindowEx.cpp b/src/viewer/GraphicsWindowEx.cpp index 10a813cb..615c9fbc 100644 --- a/src/viewer/GraphicsWindowEx.cpp +++ b/src/viewer/GraphicsWindowEx.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -107,28 +108,13 @@ namespace { GraphicsWindowEx::GraphicsWindowEx(int x, int y, int width, int height) - : osgViewer::GraphicsWindowEmbedded(x, y, width, height) - , offScreenSurface_(new QOffscreenSurface) - , offScreenContext_(new QOpenGLContext) -{ + : osgViewer::GraphicsWindowEmbedded(x, y, width == 0 ? 1 : width, height == 0 ? 1 : height) { LOG_INFO("actor, self={}", spdlog::fmt_lib::ptr(this)); } GraphicsWindowEx::~GraphicsWindowEx() { LOG_INFO("dctor isSharedContextSet_:{}, self={}", isSharedContextSet_, spdlog::fmt_lib::ptr(this)); - if (!isSharedContextSet_) { - return; - } - - if (isFrameBufferInitialized_) { - offScreenContext_->makeCurrent(offScreenSurface_.get()); - renderFramebuffer_.reset(); - sharedFrameBuffer_.reset(); - offScreenContext_->doneCurrent(); - } - - offScreenContext_.reset(); - offScreenSurface_.reset(); + } bool GraphicsWindowEx::realizeImplementation() { @@ -152,17 +138,39 @@ bool GraphicsWindowEx::realizeImplementation() { bool GraphicsWindowEx::makeCurrentImplementation() { LOG_INFO("makeCurrentImplementation, isRealized_:{}, self={}", isRealized_, spdlog::fmt_lib::ptr(this)); - dyt_check(nullptr != offScreenContext_); - offScreenContext_->makeCurrent(offScreenSurface_.get()); + + InitOffScreenContext(); + if (nullptr != offScreenContext_) { + offScreenContext_->makeCurrent(offScreenSurface_.get()); + } + InitFrameBuffer(); setDefaultFboId(renderFramebuffer_->handle()); renderFramebuffer_->bind(); + return true; } +void GraphicsWindowEx::closeImplementation() { + if (!isSharedContextSet_) { + return; + } + + if (isFrameBufferInitialized_) { + offScreenContext_->makeCurrent(offScreenSurface_.get()); + renderFramebuffer_.reset(); + sharedFrameBuffer_.reset(); + offScreenContext_->doneCurrent(); + } + + offScreenContext_.reset(); + offScreenSurface_.reset(); +} + bool GraphicsWindowEx::releaseContextImplementation() { LOG_INFO("releaseContextImplementation, self={}", spdlog::fmt_lib::ptr(this)); + QOpenGLFramebufferObject::bindDefault(); offScreenContext_->doneCurrent(); return true; } @@ -178,25 +186,20 @@ void GraphicsWindowEx::swapBuffersImplementation() { } bool GraphicsWindowEx::SetSharedContext(QOpenGLContext* sharedContext) { - LOG_INFO("Set shared context, {}", isSharedContextSet_); - if (isSharedContextSet_) { - return true; - } - - offScreenContext_->setFormat(sharedContext->format()); - offScreenContext_->setShareContext(sharedContext); - - isSharedContextSet_ = offScreenContext_->create(); - if (!isSharedContextSet_) { - LOG_ERROR("Failed to create offscreen context"); - return false; - } - - offScreenSurface_->setFormat(offScreenContext_->format()); - offScreenSurface_->create(); + sharedContext_ = sharedContext; + return true; } +void GraphicsWindowEx::ReizeWindow(int width, int height) { + if (width == _traits->width && height == _traits->height) { + return; + } + getEventQueue()->windowResize(0, 0, width, height); + resized(0, 0, width, height); + isFrameBufferInitialized_ = false; +} + void GraphicsWindowEx::keyPressEvent(QKeyEvent* event) { setKeyboardModifiers(getEventQueue(), event); int value = s_QtKeyboardMap.remapKey(event); @@ -321,6 +324,36 @@ void GraphicsWindowEx::wheelEvent(QWheelEvent* event) { osgGA::GUIEventAdapter::SCROLL_RIGHT)); } +void GraphicsWindowEx::InitOffScreenContext() { + if (isSharedContextSet_) { + return; + } + + if (!offScreenSurface_) { + offScreenSurface_.reset(new QOffscreenSurface); + } + if (!offScreenContext_) { + offScreenContext_.reset(new QOpenGLContext); + } + + LOG_INFO("Set shared context"); + + dyt_check(nullptr != sharedContext_); + + offScreenContext_->setFormat(sharedContext_->format()); + offScreenContext_->setShareContext(sharedContext_); + + isSharedContextSet_ = offScreenContext_->create(); + if (!isSharedContextSet_) { + LOG_ERROR("Failed to create offscreen context"); + return; + } + + offScreenSurface_->setFormat(offScreenContext_->format()); + offScreenSurface_->create(); + +} + void GraphicsWindowEx::InitFrameBuffer() { if (isFrameBufferInitialized_) { return; @@ -335,4 +368,3 @@ void GraphicsWindowEx::InitFrameBuffer() { isFrameBufferInitialized_ = true; } - diff --git a/src/viewer/GraphicsWindowEx.h b/src/viewer/GraphicsWindowEx.h index 2cb4d5d7..832a460b 100644 --- a/src/viewer/GraphicsWindowEx.h +++ b/src/viewer/GraphicsWindowEx.h @@ -1,6 +1,7 @@ #ifndef GRAPHICSWINDOWEX_H #define GRAPHICSWINDOWEX_H +#include #include #include @@ -38,7 +39,7 @@ public: } bool realizeImplementation() override; bool makeCurrentImplementation() override; - void closeImplementation() override {} + void closeImplementation() override; bool releaseContextImplementation() override; void swapBuffersImplementation() override; @@ -46,10 +47,13 @@ public: void UpdateWindowScale(float scale) { windowScale_ = scale; } - unsigned int GetFrameBufferId() const { + unsigned int GetFrameBufferId() { + isRenderDonwn_ = true; return frameBufferId_; } + void ReizeWindow(int width, int height); + public: void keyPressEvent(class QKeyEvent* event); void keyReleaseEvent(class QKeyEvent* event); @@ -60,6 +64,7 @@ public: void wheelEvent(class QWheelEvent* event); protected: + void InitOffScreenContext(); void InitFrameBuffer(); private: @@ -68,6 +73,8 @@ private: std::unique_ptr renderFramebuffer_{ nullptr }; std::unique_ptr sharedFrameBuffer_{ nullptr }; + QOpenGLContext* sharedContext_{ nullptr }; + bool isSharedContextSet_{ false }; bool isRealized_{ false }; bool isFrameBufferInitialized_{ false }; diff --git a/src/viewer/OSGEnv.cpp b/src/viewer/OSGEnv.cpp new file mode 100644 index 00000000..1ffc8532 --- /dev/null +++ b/src/viewer/OSGEnv.cpp @@ -0,0 +1,56 @@ +#include "viewer/OSGEnv.h" + +#include + +#include +#include +#include + + + +bool s_gBChecked = false; + +bool OSGEnv::init() { + osgEarth::initialize(); + const osgEarth::Capabilities& csCapabilities = osgEarth::Registry::instance()->getCapabilities(); + s_gBChecked = csCapabilities.supportsGLSL(); + if (!s_gBChecked) { + return(s_gBChecked); + } + + int nMax, nMin; + sscanf(csCapabilities.getVersion().data(), "%d.%d", &nMax, &nMin); + QSurfaceFormat format = QSurfaceFormat::defaultFormat(); + osg::GraphicsContext::Traits traits(osg::DisplaySettings::instance().get()); + + int nHttpThreads = osg::DisplaySettings::instance()->getNumOfDatabaseThreadsHint(); + nHttpThreads = nHttpThreads < 1 ? 1 : nHttpThreads; + osg::DisplaySettings::instance()->setNumOfHttpDatabaseThreadsHint(nHttpThreads); + format.setAlphaBufferSize(traits.alpha); + format.setRedBufferSize(traits.red); + format.setGreenBufferSize(traits.green); + format.setBlueBufferSize(traits.blue); + format.setDepthBufferSize(traits.depth); + format.setStencilBufferSize(traits.stencil); + format.setSamples(traits.samples); + format.setVersion(nMax, nMin); + + /// 判断是否支持核心模式 + if (csCapabilities.isCoreProfile()) { + format.setProfile(QSurfaceFormat::CoreProfile); + } else { + format.setProfile(QSurfaceFormat::CompatibilityProfile); + } + + format.setSwapInterval(traits.vsync ? 1 : 0); + format.setStereo(traits.quadBufferStereo ? 1 : 0); + + QSurfaceFormat::setDefaultFormat(format); + osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image"); + + return true; +} + +void OSGEnv::destroy() { + +} diff --git a/src/viewer/OSGEnv.h b/src/viewer/OSGEnv.h new file mode 100644 index 00000000..799e8b51 --- /dev/null +++ b/src/viewer/OSGEnv.h @@ -0,0 +1,7 @@ +#pragma once + +class OSGEnv { +public: + static bool init(); + static void destroy(); +}; diff --git a/src/viewer/OSGRenderer.cpp b/src/viewer/OSGRenderer.cpp index f457c6f2..bcf8fa2b 100644 --- a/src/viewer/OSGRenderer.cpp +++ b/src/viewer/OSGRenderer.cpp @@ -59,23 +59,20 @@ void OSGRenderer::Init(osg::GraphicsContext* gc) { getCamera()->setGraphicsContext(gc); getCamera()->setViewport(new osg::Viewport(0, 0, gc->getTraits()->width, gc->getTraits()->height)); + getCamera()->setDrawBuffer(GL_BACK); + getCamera()->setReadBuffer(GL_BACK); + getCamera()->setProjectionMatrixAsPerspective(45, 1.0, 0.01, 100.); isInited_ = true; } -void OSGRenderer::Resize(osg::GraphicsContext* gc, int width, int height) { +void OSGRenderer::Resize(GraphicsWindowEx* gc, int width, int height) { LOG_INFO("OSGRenderer::Resize {}, gc:{}", isInited_, spdlog::fmt_lib::ptr(gc)); - if (!gc) { + dyt_check(nullptr != gc); + if (!isInited_) { return; } - if (isInited_) { - return; - } - - osgViewer::GraphicsWindow* window = dynamic_cast(gc); - dyt_check(nullptr != window); - window->getEventQueue()->windowResize(0, 0, width, height); - window->resized(0, 0, width, height); + gc->ReizeWindow(width, height); } void OSGRenderer::Render() { diff --git a/src/viewer/OSGRenderer.h b/src/viewer/OSGRenderer.h index fcc4cb9e..534d4b86 100644 --- a/src/viewer/OSGRenderer.h +++ b/src/viewer/OSGRenderer.h @@ -22,6 +22,8 @@ #include +#include "GraphicsWindowEx.h" + namespace { enum RenderEvent { INIT = QEvent::Type(QEvent::User + 1), @@ -39,13 +41,13 @@ namespace { }; struct GraphicsWindowResizeEvent : public QEvent { - GraphicsWindowResizeEvent(osg::GraphicsContext* gc, int width, int height) + GraphicsWindowResizeEvent(GraphicsWindowEx* gc, int width, int height) : QEvent(QEvent::Type(RESIZE)) , gc_(gc) , width_(width) , height_(height) {} - osg::observer_ptr gc_; + osg::observer_ptr gc_; int width_; int height_; }; @@ -67,7 +69,7 @@ Q_SIGNALS: private: void Init(osg::GraphicsContext* gc); - void Resize(osg::GraphicsContext* gc, int width, int height); + void Resize(GraphicsWindowEx* gc, int width, int height); void Render(); void Destoy(); diff --git a/src/viewer/OsgOpenGLWindow.cpp b/src/viewer/OsgOpenGLWindow.cpp index 1731290b..0fe0a360 100644 --- a/src/viewer/OsgOpenGLWindow.cpp +++ b/src/viewer/OsgOpenGLWindow.cpp @@ -47,38 +47,33 @@ static const char* fragmentShaderSource = OsgOpenGLWindow::OsgOpenGLWindow(QWidget* parent) - : QOpenGLWindow(QOpenGLWindow::NoPartialUpdate, nullptr) -{ + : QOpenGLWindow(QOpenGLWindow::NoPartialUpdate, nullptr) { widget_ = QWidget::createWindowContainer(this); + gw_ = new GraphicsWindowEx(0, 0, width(), height()); renderer_ = new OSGRenderer(this); - connect(renderer_, &OSGRenderer::RenderFlush, this, &OsgOpenGLWindow::OnRenderFlush); + connect(renderer_, &OSGRenderer::RenderFlush, this, &OsgOpenGLWindow::OnRenderFlush, Qt::QueuedConnection); + connect(&timer_, &QTimer::timeout, this, &OsgOpenGLWindow::OnRender); } -OsgOpenGLWindow::~OsgOpenGLWindow() -{ +OsgOpenGLWindow::~OsgOpenGLWindow() {} + +osgViewer::Viewer* OsgOpenGLWindow::getOsgViewer() { + return renderer_; } -osgViewer::Viewer* OsgOpenGLWindow::getOsgViewer() -{ - return m_renderer; -} - -OpenThreads::ReadWriteMutex* OsgOpenGLWindow::mutex() -{ - return &_osgMutex; -} - - -void OsgOpenGLWindow::initializeGL() -{ +void OsgOpenGLWindow::initializeGL() { //// Initializes OpenGL function resolution for the current context. //initializeOpenGLFunctions(); //createRenderer(); //emit initialized(); - context()->doneCurrent(); + QOpenGLContext* ctx = context(); + dyt_check(nullptr != ctx); + ctx->doneCurrent(); gw_->SetSharedContext(context()); QApplication::postEvent(renderer_, new RenderBindGraphicsContextEvent(gw_)); + setDefaultDisplaySettings(); + double pixelRatio = screen()->devicePixelRatio(); gw_->UpdateWindowScale(pixelRatio); QApplication::postEvent(renderer_, new GraphicsWindowResizeEvent(gw_, width() * pixelRatio, height() * pixelRatio)); @@ -90,28 +85,28 @@ void OsgOpenGLWindow::initializeGL() shaderProgram_ = new QOpenGLShaderProgram(this); vao_ = new QOpenGLVertexArrayObject(this); if (!vao_->create()) { - LOG_ERROR( "Failed to create VAO"); + LOG_ERROR("Failed to create VAO"); return; } if (!shaderProgram_->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource)) { - LOG_ERROR( "Failed to add vertex shader"); + LOG_ERROR("Failed to add vertex shader"); return; } if (!shaderProgram_->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource)) { - LOG_ERROR( "Failed to add fragment shader"); + LOG_ERROR("Failed to add fragment shader"); return; } if (!shaderProgram_->link()) { - LOG_ERROR( "Failed to link shader program, {}", shaderProgram_->log().toLocal8Bit().constData()); + LOG_ERROR("Failed to link shader program, {}", shaderProgram_->log().toLocal8Bit().constData()); return; } + + timer_.start(1000 / 60); } -void OsgOpenGLWindow::resizeGL(int w, int h) -{ - Q_ASSERT(m_renderer); +void OsgOpenGLWindow::resizeGL(int w, int h) { double pixelRatio = screen()->devicePixelRatio(); gw_->UpdateWindowScale(pixelRatio); QApplication::postEvent(renderer_, new GraphicsWindowResizeEvent(gw_, w * pixelRatio, h * pixelRatio)); @@ -137,73 +132,59 @@ void OsgOpenGLWindow::paintUnderGL() { } } -void OsgOpenGLWindow::keyPressEvent(QKeyEvent* event) -{ +void OsgOpenGLWindow::keyPressEvent(QKeyEvent* event) { Q_ASSERT(gw_); // forward event to renderer gw_->keyPressEvent(event); } -void OsgOpenGLWindow::keyReleaseEvent(QKeyEvent* event) -{ +void OsgOpenGLWindow::keyReleaseEvent(QKeyEvent* event) { Q_ASSERT(gw_); // forward event to renderer gw_->keyReleaseEvent(event); } -void OsgOpenGLWindow::mousePressEvent(QMouseEvent* event) -{ +void OsgOpenGLWindow::mousePressEvent(QMouseEvent* event) { Q_ASSERT(gw_); // forward event to renderer gw_->mousePressEvent(event); } -void OsgOpenGLWindow::mouseReleaseEvent(QMouseEvent* event) -{ +void OsgOpenGLWindow::mouseReleaseEvent(QMouseEvent* event) { Q_ASSERT(gw_); // forward event to renderer gw_->mouseReleaseEvent(event); } -void OsgOpenGLWindow::mouseDoubleClickEvent(QMouseEvent* event) -{ +void OsgOpenGLWindow::mouseDoubleClickEvent(QMouseEvent* event) { Q_ASSERT(gw_); // forward event to renderer gw_->mouseDoubleClickEvent(event); } -void OsgOpenGLWindow::mouseMoveEvent(QMouseEvent* event) -{ +void OsgOpenGLWindow::mouseMoveEvent(QMouseEvent* event) { Q_ASSERT(gw_); // forward event to renderer gw_->mouseMoveEvent(event); } -void OsgOpenGLWindow::wheelEvent(QWheelEvent* event) -{ +void OsgOpenGLWindow::wheelEvent(QWheelEvent* event) { Q_ASSERT(gw_); // forward event to renderer gw_->wheelEvent(event); } -void OsgOpenGLWindow::setDefaultDisplaySettings() -{ +void OsgOpenGLWindow::setDefaultDisplaySettings() { osg::DisplaySettings* ds = osg::DisplaySettings::instance().get(); ds->setNvOptimusEnablement(1); ds->setStereo(false); } -void OsgOpenGLWindow::createRenderer() -{ - // call this before creating a View... - setDefaultDisplaySettings(); - - /*m_renderer = new OSGRenderer(this); - double pixelRatio = screen()->devicePixelRatio(); - m_renderer->setupOSG(width(), height(), pixelRatio);*/ -} - void OsgOpenGLWindow::OnRenderFlush() { shaderTextureId_ = gw_->GetFrameBufferId(); updateTexture_ = true; } + +void OsgOpenGLWindow::OnRender() { + requestUpdate(); +} diff --git a/src/viewer/OsgOpenGLWindow.h b/src/viewer/OsgOpenGLWindow.h index d4dac79e..8ecc0005 100644 --- a/src/viewer/OsgOpenGLWindow.h +++ b/src/viewer/OsgOpenGLWindow.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include @@ -32,15 +32,6 @@ namespace osgViewer class OsgOpenGLWindow : public QOpenGLWindow { Q_OBJECT -protected: - OSGRenderer* m_renderer {nullptr}; - bool _osgWantsToRenderFrame{true}; - OpenThreads::ReadWriteMutex _osgMutex; - bool _isFirstFrame {true}; - friend class OSGRenderer; - - - public: OsgOpenGLWindow(QWidget* parent = nullptr); ~OsgOpenGLWindow() override; @@ -48,8 +39,6 @@ public: /** Get osgViewer View */ virtual osgViewer::Viewer* getOsgViewer(); - //! get mutex - virtual OpenThreads::ReadWriteMutex* mutex(); QWidget* AsWidget() { @@ -65,8 +54,7 @@ protected: void resizeGL(int w, int h) override; void paintUnderGL() override; - //! called before creating renderer - virtual void setDefaultDisplaySettings(); + void setDefaultDisplaySettings(); void keyPressEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override; @@ -76,10 +64,9 @@ protected: void mouseMoveEvent(QMouseEvent* event) override; void wheelEvent(QWheelEvent* event) override; - void createRenderer(); - private: void OnRenderFlush(); + void OnRender(); private: QWidget* widget_{ nullptr }; @@ -89,6 +76,7 @@ private: class QOpenGLVertexArrayObject* vao_{ nullptr }; uint32_t shaderTextureId_{ 0 }; bool updateTexture_{ false }; + QTimer timer_; }; #endif // OSGQOPENGLWINDOW_H diff --git a/src/viewer/OsgViewWidget.h b/src/viewer/OsgViewWidget.h index 8bd13d06..afa4fbcf 100644 --- a/src/viewer/OsgViewWidget.h +++ b/src/viewer/OsgViewWidget.h @@ -4,7 +4,6 @@ #include #include "scene/OEScene.h" -#include "viewer/OsgViewWidget.h" #include "viewer/GraphicsWindowEx.h"