From ad02144014cb37957b5490430159cb22e8e6998c Mon Sep 17 00:00:00 2001 From: jiegeaiai Date: Sat, 18 Jan 2025 22:36:28 +0800 Subject: [PATCH] moidyf render --- src/app/Application.cpp | 4 +- src/scene/OEScene.cpp | 4 +- src/scene/OEScene.h | 3 +- src/translations/Dyt_zh_CN.ts | 10 +- src/ui/MainWindow.cpp | 11 +- src/ui/MainWindow.h | 4 +- src/viewer/GraphicsWindowEx.cpp | 93 ++++++++-------- src/viewer/GraphicsWindowEx.h | 1 + src/viewer/OSGEnv.cpp | 4 +- src/viewer/OSGRenderer.cpp | 13 ++- src/viewer/OSGRenderer.h | 1 + src/viewer/OsgOpenGLWindow.cpp | 5 + src/viewer/OsgViewWidget.cpp | 40 +++++-- src/viewer/OsgViewWidget.h | 2 +- src/viewer/OsgViewer.cpp | 68 ++++++------ src/viewer/OsgViewer.h | 9 +- src/viewer/QtOsgViewWidget.cpp | 170 ++++++----------------------- src/viewer/QtOsgViewWidget.h | 11 +- src/viewer/ViewWidget.cpp | 91 ++++++++------- src/viewer/ViewWidget.h | 8 +- src/viewer/osgQOpenGLWidget.h | 8 +- src/workspace/WorkSpaceManager.cpp | 12 ++ src/workspace/WorkSpaceManager.h | 8 +- 23 files changed, 256 insertions(+), 324 deletions(-) diff --git a/src/app/Application.cpp b/src/app/Application.cpp index 8557120e..11ce89c2 100644 --- a/src/app/Application.cpp +++ b/src/app/Application.cpp @@ -26,7 +26,7 @@ QString Application::GetWorkSpacePath() { void Application::Init() { Singleton::Create(this); - //Singleton::Create(this); + Singleton::Create(this); Singleton::Create(this); Singleton::Create(this); Singleton::Create(this); @@ -40,6 +40,6 @@ void Application::Uninit() { Singleton::Destory(); Singleton::Destory(); Singleton::Destory(); - //Singleton::Destory(); + Singleton::Destory(); Singleton::Destory(); } diff --git a/src/scene/OEScene.cpp b/src/scene/OEScene.cpp index 1d3995e4..72088764 100644 --- a/src/scene/OEScene.cpp +++ b/src/scene/OEScene.cpp @@ -55,10 +55,10 @@ void OEScene::AttachView(OsgView* view) { } - AttachView(view->GetView()); + //AttachView(view->GetView()); } -void OEScene::AttachView(osgViewer::View* view) { +void OEScene::AttachView(osgViewer::Viewer* view) { earthRootNode_ = osgDB::readNodeFile("triton.earth"); if (!earthRootNode_) { LOG_ERROR("read earth node(triton.earth) failed"); diff --git a/src/scene/OEScene.h b/src/scene/OEScene.h index 6c7d1845..b87ba5f8 100644 --- a/src/scene/OEScene.h +++ b/src/scene/OEScene.h @@ -7,6 +7,7 @@ #include #include #include +#include //#include "scene/SkyDome.h" @@ -22,7 +23,7 @@ public: void InitEventHandle(OsgView* view); void InitEventHandle(osgViewer::View* view); void AttachView(OsgView* view); - void AttachView(osgViewer::View* view); + void AttachView(osgViewer::Viewer* view); void DetachView(OsgView* view); osg::ref_ptr LoadCubeMapTextures(const std::string& dir); diff --git a/src/translations/Dyt_zh_CN.ts b/src/translations/Dyt_zh_CN.ts index 84bbf962..063e10aa 100644 --- a/src/translations/Dyt_zh_CN.ts +++ b/src/translations/Dyt_zh_CN.ts @@ -1254,18 +1254,12 @@ QtOsgViewWidget - - + warning - - default workspace failed - - - - + open dyt file failed diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index f92c0a74..4c27a433 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -83,8 +83,8 @@ void MainWindow::InitUI() { connect(modelBrowser_, &ModelBrowser::WorkSpaceChange, propertyBrowser_, &PropertyBrowser::OnWorkSpaceChange); connect(modelBrowser_, &ModelBrowser::EntityChange, propertyBrowser_, &PropertyBrowser::OnEntityChange); - //qtOsgViewWidget_ = new ViewWidget; - qtOsgViewWidget_ = new OsgOpenGLWindow; + qtOsgViewWidget_ = new ViewWidget; + //qtOsgViewWidget_ = new OsgOpenGLWindow; //qtOsgViewWidget_->Initialize(); m_mapDockWidget.insert("PropertyBrowser", attribte); @@ -212,8 +212,7 @@ void MainWindow::InitUI() { //ui->viewWidget->layout()->addWidget(qtOsgViewWidget_); //qtOsgViewWidget_->LoadDefaultScene(); - //OsgViewer::Get().Initialize(); - //OsgViewer::Get().OnFrame(); + #if 0 MatlabObject* mtlb = new MatlabObject; @@ -237,8 +236,8 @@ void MainWindow::InitDockLayout() { tabWidget_->insertTab(i, mainWindow_, strTabName); if (listDocArea[0].toList().size() > 0) { - //mainWindow_->setCentralWidget(qtOsgViewWidget_); - mainWindow_->setCentralWidget(qtOsgViewWidget_->AsWidget()); + 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 4d7c9328..332c42dc 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -55,8 +55,8 @@ private: class ModelBrowser* modelBrowser_{ nullptr }; class PropertyBrowser* propertyBrowser_{ nullptr }; class QWebEngineView* webEngineView_{ nullptr }; - //class ViewWidget* qtOsgViewWidget_{ nullptr }; - class OsgOpenGLWindow* 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 615c9fbc..b0a289f8 100644 --- a/src/viewer/GraphicsWindowEx.cpp +++ b/src/viewer/GraphicsWindowEx.cpp @@ -107,6 +107,12 @@ namespace { } // namespace + +GraphicsWindowEx::GraphicsWindowEx(osg::GraphicsContext::Traits* traits) + : osgViewer::GraphicsWindowEmbedded(traits) { + LOG_INFO("actor, self={}", spdlog::fmt_lib::ptr(this)); +} + GraphicsWindowEx::GraphicsWindowEx(int x, int y, int width, int height) : osgViewer::GraphicsWindowEmbedded(x, y, width == 0 ? 1 : width, height == 0 ? 1 : height) { LOG_INFO("actor, self={}", spdlog::fmt_lib::ptr(this)); @@ -118,75 +124,76 @@ GraphicsWindowEx::~GraphicsWindowEx() { } bool GraphicsWindowEx::realizeImplementation() { - LOG_INFO("realizeImplementation, isRealized_:{}, self={}", isRealized_, spdlog::fmt_lib::ptr(this)); - if (isRealized_) { - return true; - } + //LOG_INFO("realizeImplementation, isRealized_:{}, self={}", isRealized_, spdlog::fmt_lib::ptr(this)); + //if (isRealized_) { + // return true; + //} - dyt_check(nullptr != _state); - _state->resetVertexAttributeAlias(false); + //dyt_check(nullptr != _state); + //_state->resetVertexAttributeAlias(false); - _state->setModeValidity(GL_LIGHTING, false); - _state->setModeValidity(GL_NORMALIZE, false); - _state->setModeValidity(GL_RESCALE_NORMAL, false); - _state->setModeValidity(GL_LINE_STIPPLE, false); - _state->setModeValidity(GL_LINE_SMOOTH, false); + //_state->setModeValidity(GL_LIGHTING, false); + //_state->setModeValidity(GL_NORMALIZE, false); + //_state->setModeValidity(GL_RESCALE_NORMAL, false); + //_state->setModeValidity(GL_LINE_STIPPLE, false); + //_state->setModeValidity(GL_LINE_SMOOTH, false); - isRealized_ = true; + //isRealized_ = true; return true; } bool GraphicsWindowEx::makeCurrentImplementation() { - LOG_INFO("makeCurrentImplementation, isRealized_:{}, self={}", isRealized_, spdlog::fmt_lib::ptr(this)); - - InitOffScreenContext(); - if (nullptr != offScreenContext_) { - offScreenContext_->makeCurrent(offScreenSurface_.get()); - } + //LOG_INFO("makeCurrentImplementation, isRealized_:{}, self={}", isRealized_, spdlog::fmt_lib::ptr(this)); + // + //if (nullptr != offScreenContext_) { + // offScreenContext_->makeCurrent(offScreenSurface_.get()); + //} - InitFrameBuffer(); + //InitFrameBuffer(); - setDefaultFboId(renderFramebuffer_->handle()); - renderFramebuffer_->bind(); - + //setDefaultFboId(renderFramebuffer_->handle()); + //renderFramebuffer_->bind(); + // return true; } void GraphicsWindowEx::closeImplementation() { - if (!isSharedContextSet_) { - return; - } + //if (!isSharedContextSet_) { + // return; + //} - if (isFrameBufferInitialized_) { - offScreenContext_->makeCurrent(offScreenSurface_.get()); - renderFramebuffer_.reset(); - sharedFrameBuffer_.reset(); - offScreenContext_->doneCurrent(); - } + //if (isFrameBufferInitialized_) { + // offScreenContext_->makeCurrent(offScreenSurface_.get()); + // renderFramebuffer_.reset(); + // sharedFrameBuffer_.reset(); + // offScreenContext_->doneCurrent(); + //} - offScreenContext_.reset(); - offScreenSurface_.reset(); + //offScreenContext_.reset(); + //offScreenSurface_.reset(); } bool GraphicsWindowEx::releaseContextImplementation() { - LOG_INFO("releaseContextImplementation, self={}", spdlog::fmt_lib::ptr(this)); - QOpenGLFramebufferObject::bindDefault(); - offScreenContext_->doneCurrent(); + //LOG_INFO("releaseContextImplementation, self={}", spdlog::fmt_lib::ptr(this)); + + //QOpenGLFramebufferObject::bindDefault(); + //offScreenContext_->doneCurrent(); return true; } void GraphicsWindowEx::swapBuffersImplementation() { - offScreenContext_->functions()->glFinish(); - frameBufferId_ = renderFramebuffer_->texture(); - if (!isRenderDonwn_) { - return; - } - qSwap(renderFramebuffer_, sharedFrameBuffer_); - isRenderDonwn_ = false; + //offScreenContext_->functions()->glFinish(); + //frameBufferId_ = renderFramebuffer_->texture(); + //if (!isRenderDonwn_) { + // return; + //} + //qSwap(renderFramebuffer_, sharedFrameBuffer_); + //isRenderDonwn_ = false; } bool GraphicsWindowEx::SetSharedContext(QOpenGLContext* sharedContext) { sharedContext_ = sharedContext; + InitOffScreenContext(); return true; } diff --git a/src/viewer/GraphicsWindowEx.h b/src/viewer/GraphicsWindowEx.h index 832a460b..2dc8c53e 100644 --- a/src/viewer/GraphicsWindowEx.h +++ b/src/viewer/GraphicsWindowEx.h @@ -13,6 +13,7 @@ class GraphicsWindowEx : public osgViewer::GraphicsWindowEmbedded { public: + GraphicsWindowEx(osg::GraphicsContext::Traits* traits); GraphicsWindowEx(int x, int y, int width, int height); ~GraphicsWindowEx() override; diff --git a/src/viewer/OSGEnv.cpp b/src/viewer/OSGEnv.cpp index 1ffc8532..8c1460e5 100644 --- a/src/viewer/OSGEnv.cpp +++ b/src/viewer/OSGEnv.cpp @@ -12,7 +12,7 @@ bool s_gBChecked = false; bool OSGEnv::init() { osgEarth::initialize(); - const osgEarth::Capabilities& csCapabilities = osgEarth::Registry::instance()->getCapabilities(); + /*const osgEarth::Capabilities& csCapabilities = osgEarth::Registry::instance()->getCapabilities(); s_gBChecked = csCapabilities.supportsGLSL(); if (!s_gBChecked) { return(s_gBChecked); @@ -45,7 +45,7 @@ bool OSGEnv::init() { format.setSwapInterval(traits.vsync ? 1 : 0); format.setStereo(traits.quadBufferStereo ? 1 : 0); - QSurfaceFormat::setDefaultFormat(format); + QSurfaceFormat::setDefaultFormat(format);*/ osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image"); return true; diff --git a/src/viewer/OSGRenderer.cpp b/src/viewer/OSGRenderer.cpp index bcf8fa2b..a7578f4e 100644 --- a/src/viewer/OSGRenderer.cpp +++ b/src/viewer/OSGRenderer.cpp @@ -33,14 +33,18 @@ #include #include +#include #include "config.h" #include "common/SpdLogger.h" - +#include "workspace/WorkSpaceManager.h" OSGRenderer::OSGRenderer(QObject* parent) : QObject(parent), osgViewer::Viewer() { + setThreadingModel(osgViewer::Viewer::SingleThreaded); + connect(this, &OSGRenderer::Initialized, &WorkSpaceManager::Get(), &WorkSpaceManager::OnRendererLoaded); + setRealizeOperation(new osgEarth::GL3RealizeOperation()); } OSGRenderer::~OSGRenderer() @@ -63,15 +67,16 @@ void OSGRenderer::Init(osg::GraphicsContext* gc) { getCamera()->setReadBuffer(GL_BACK); getCamera()->setProjectionMatrixAsPerspective(45, 1.0, 0.01, 100.); isInited_ = true; + + emit Initialized(this); } void OSGRenderer::Resize(GraphicsWindowEx* gc, int width, int height) { - LOG_INFO("OSGRenderer::Resize {}, gc:{}", isInited_, spdlog::fmt_lib::ptr(gc)); - dyt_check(nullptr != gc); if (!isInited_) { return; } - + LOG_INFO("OSGRenderer::Resize {}, gc:{}", isInited_, spdlog::fmt_lib::ptr(gc)); + dyt_check(nullptr != gc); gc->ReizeWindow(width, height); } diff --git a/src/viewer/OSGRenderer.h b/src/viewer/OSGRenderer.h index 534d4b86..03b965f5 100644 --- a/src/viewer/OSGRenderer.h +++ b/src/viewer/OSGRenderer.h @@ -65,6 +65,7 @@ public: bool event(QEvent* event) override; Q_SIGNALS: + void Initialized(OSGRenderer* viewer); void RenderFlush(); private: diff --git a/src/viewer/OsgOpenGLWindow.cpp b/src/viewer/OsgOpenGLWindow.cpp index 0fe0a360..ef2d5713 100644 --- a/src/viewer/OsgOpenGLWindow.cpp +++ b/src/viewer/OsgOpenGLWindow.cpp @@ -49,6 +49,11 @@ static const char* fragmentShaderSource = OsgOpenGLWindow::OsgOpenGLWindow(QWidget* parent) : QOpenGLWindow(QOpenGLWindow::NoPartialUpdate, nullptr) { widget_ = QWidget::createWindowContainer(this); + widget_->setAttribute(Qt::WA_PaintOnScreen, true); + widget_->setAttribute(Qt::WA_StaticContents, true); + widget_->setAttribute(Qt::WA_NoSystemBackground, true); + widget_->setAttribute(Qt::WA_OpaquePaintEvent, true); + widget_->setAttribute(Qt::WA_DontCreateNativeAncestors, false); gw_ = new GraphicsWindowEx(0, 0, width(), height()); renderer_ = new OSGRenderer(this); connect(renderer_, &OSGRenderer::RenderFlush, this, &OsgOpenGLWindow::OnRenderFlush, Qt::QueuedConnection); diff --git a/src/viewer/OsgViewWidget.cpp b/src/viewer/OsgViewWidget.cpp index bd4ffc7c..e6d0ddb9 100644 --- a/src/viewer/OsgViewWidget.cpp +++ b/src/viewer/OsgViewWidget.cpp @@ -35,18 +35,25 @@ OsgViewWidget::OsgViewWidget(QWidget* parent /*= nullptr*/) : QGLWidget(parent) { - osgEarth::initialize(); - osg::ref_ptr traits = new osg::GraphicsContext::Traits; + //osgEarth::initialize(); + osg::ref_ptr ds = osg::DisplaySettings::instance(); + osg::ref_ptr traits + = new osg::GraphicsContext::Traits(ds); traits->x = 0; traits->y = 0; traits->width = width(); traits->height = height(); - traits->doubleBuffer = true; - //traits->depth = 32; - //traits->samples = 16; - traits->sharedContext = nullptr; - traits->setInheritedWindowPixelFormat = true; - //gw_ = new GraphicsWindowEx(traits.get()); + traits->alpha = ds->getMinimumNumAlphaBits(); + traits->stencil = ds->getMinimumNumStencilBits(); + traits->sampleBuffers = 2/*ds->getMultiSamples()*/;//_numMultiSamples osg default was 0 + traits->samples = 4/*ds->getNumMultiSamples()*/;//_numMultiSamples osg default was 0 + gw_ = new GraphicsWindowEx(traits); + + setAttribute(Qt::WA_PaintOnScreen, true); + setAttribute(Qt::WA_StaticContents, true); + setAttribute(Qt::WA_NoSystemBackground, true); + setAttribute(Qt::WA_OpaquePaintEvent, true); + setAttribute(Qt::WA_DontCreateNativeAncestors, false); setFocusPolicy(Qt::ClickFocus); } @@ -67,6 +74,23 @@ void OsgViewWidget::OnLoadDyt(const QString& path) { } +void OsgViewWidget::initializeGL() { + QGLWidget::initializeGL(); + + osgViewer::Viewer* viewer = OsgViewer::Get().GetViewer(); + dyt_check(nullptr != viewer); + + osg::Camera* camera = viewer->getCamera(); + camera->setGraphicsContext(gw_); + camera->setViewport(new osg::Viewport(0, 0, width(), height())); + camera->setDrawBuffer(GL_BACK); + camera->setReadBuffer(GL_BACK); + camera->setProjectionMatrixAsPerspective(45, 1.0, 0.01, 100.); + + OsgViewer::Get().Initialize(); + OsgViewer::Get().OnFrame(); +} + void OsgViewWidget::resizeGL(int width, int height) { gw_->getEventQueue()->windowResize(0, 0, width, height); gw_->resized(0, 0, width, height); diff --git a/src/viewer/OsgViewWidget.h b/src/viewer/OsgViewWidget.h index afa4fbcf..d4347153 100644 --- a/src/viewer/OsgViewWidget.h +++ b/src/viewer/OsgViewWidget.h @@ -50,7 +50,7 @@ signals: void signalScaleInfo(const QString&); protected: - void init(); + void initializeGL(); void resizeGL(int width, int height) override; void keyPressEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override; diff --git a/src/viewer/OsgViewer.cpp b/src/viewer/OsgViewer.cpp index 88b4e025..8e28226c 100644 --- a/src/viewer/OsgViewer.cpp +++ b/src/viewer/OsgViewer.cpp @@ -4,7 +4,7 @@ #include #include -#include +//#include #include #include "common/SpdLogger.h" @@ -18,18 +18,17 @@ constexpr QEvent::Type sOsgViewUpdateEvent{ QEvent::Type(QEvent::User + 1) }; OsgViewer::OsgViewer(QObject* parent) noexcept : QObject(parent) - , compositeViewer_(new osgViewer::CompositeViewer) { + , viewer_(new osgViewer::Viewer) { LOG_INFO("actor, self={}", fmt::ptr(this)); - compositeViewer_->setKeyEventSetsDone(0); + viewer_->setKeyEventSetsDone(0); //compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false); - osgEarth::initialize(); osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image"); - compositeViewer_->setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded); + viewer_->setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded); } OsgViewer::~OsgViewer() { - compositeViewer_ = nullptr; + viewer_ = nullptr; LOG_INFO("dctor, self={}", fmt::ptr(this)); } @@ -37,16 +36,19 @@ void OsgViewer::OnDestory() { } +osgViewer::Viewer* OsgViewer::GetViewer(void) const { + return viewer_; +} + void OsgViewer::OnFrame(void) { - return; - assert(nullptr != compositeViewer_); + assert(nullptr != viewer_); WorkSpaceManager::Get().OnFrame(); if (IsDone()) { RenderUpdate(); - compositeViewer_->frame(); + viewer_->frame(); } qApp->postEvent(this, new QEvent(sOsgViewUpdateEvent)); @@ -60,7 +62,7 @@ OsgView* OsgViewer::CreateView(int x, int y, int width, int height, void* winHan view->InitGraphiceWindow(x, y, width, height, reinterpret_cast(winHandle), "dytView"); - OnAddView(view, x, y, width, height); + //OnAddView(view, x, y, width, height); //compositeViewer_->setRealizeOperation(new osgEarth::GL3RealizeOperation()); return view; } @@ -70,12 +72,12 @@ void OsgViewer::DestroyView(OsgView* osgView) { return; } - OnRemoveView(osgView); + //OnRemoveView(osgView); } bool OsgViewer::IsDone() const { - assert(nullptr != compositeViewer_); - bool done = compositeViewer_->done(); + assert(nullptr != viewer_); + bool done = viewer_->done(); return !done && initalized_; } @@ -92,7 +94,7 @@ bool OsgViewer::Initialize(void) { return initalized_; } initalized_ = true; - compositeViewer_->setRealizeOperation(new osgEarth::GL3RealizeOperation()); + //compositeViewer_->setRealizeOperation(new osgEarth::GL3RealizeOperation()); return initalized_; } @@ -138,29 +140,29 @@ void OsgViewer::customEvent(QEvent* event) { } void OsgViewer::OnStartPlay() { - compositeViewer_->setStartTick(0); + viewer_->setStartTick(0); } -void OsgViewer::OnAddView(OsgView* osgView, int x, int y, int width, int height) { - osgViewer::View* view = new osgViewer::View; - osgView->InitView(view); - - compositeViewer_->addView(view); - osgViews_.insert(osgView); -} - -void OsgViewer::OnRemoveView(OsgView* osgView) { - if (nullptr == osgView || nullptr == osgView->GetView()) { - LOG_WARN("osgview is nullptr or getview is nullptr"); - return; - } - - osgViews_.erase(osgView); - compositeViewer_->removeView(osgView->GetView()); -} +//void OsgViewer::OnAddView(OsgView* osgView, int x, int y, int width, int height) { +// osgViewer::View* view = new osgViewer::View; +// osgView->InitView(view); +// +// viewer_->addView(view); +// osgViews_.insert(osgView); +//} +// +//void OsgViewer::OnRemoveView(OsgView* osgView) { +// if (nullptr == osgView || nullptr == osgView->GetView()) { +// LOG_WARN("osgview is nullptr or getview is nullptr"); +// return; +// } +// +// osgViews_.erase(osgView); +// compositeViewer_->removeView(osgView->GetView()); +//} void OsgViewer::RenderUpdate() { - osg::FrameStamp* frameStamp = compositeViewer_->getFrameStamp(); + osg::FrameStamp* frameStamp = viewer_->getFrameStamp(); double dt = frameStamp->getSimulationTime(); for (auto render : updateRenderList_) { render->Render(dt); diff --git a/src/viewer/OsgViewer.h b/src/viewer/OsgViewer.h index 05a88c2b..de5ead16 100644 --- a/src/viewer/OsgViewer.h +++ b/src/viewer/OsgViewer.h @@ -4,7 +4,7 @@ #include -#include +#include #include #include "app/Singleton.h" @@ -20,6 +20,7 @@ public: ~OsgViewer() override; void OnDestory(); + osgViewer::Viewer* GetViewer(void) const; void OnFrame(void); class OsgView* CreateView(int x, int y, int width, int height, void* winHandle); void DestroyView(OsgView* view); @@ -38,12 +39,12 @@ protected: void OnStartPlay(); - void OnAddView(OsgView* view, int x, int y, int width, int height); - void OnRemoveView(OsgView* view); + //void OnAddView(OsgView* view, int x, int y, int width, int height); + //void OnRemoveView(OsgView* view); void RenderUpdate(); private: - osg::ref_ptr compositeViewer_; + osg::ref_ptr viewer_; bool initalized_{ false }; using OsgViewSet = std::set; diff --git a/src/viewer/QtOsgViewWidget.cpp b/src/viewer/QtOsgViewWidget.cpp index afd9caad..242b7a38 100644 --- a/src/viewer/QtOsgViewWidget.cpp +++ b/src/viewer/QtOsgViewWidget.cpp @@ -196,108 +196,6 @@ void QtOsgViewWidget::keyReleaseEvent(QKeyEvent* event) { view_->KeyRelease(event); } -void QtOsgViewWidget::OnComputeScale() { - osgEarth::MapNode* mapNode = activeScene_->GetMapNode(); - if (nullptr == mapNode || nullptr == mapNode->getTerrain()) { - return; - } - dyt_check(nullptr != view_); - - float x = 0.0f, y = 0.0f; - osg::Vec3d world1, world2; - if (!mapNode->getTerrain()->getWorldCoordsUnderMouse(view_->GetView(), x, y, world1)) { - emit signalScaleInfo(""); - return; - } - x += devicePixelRatio_; - if (!mapNode->getTerrain()->getWorldCoordsUnderMouse(view_->GetView(), x, y, world2)) { - emit signalScaleInfo(""); - return; - } - -#if 0 - TRACE("w1: %g %g %g w2: %g %g %g", - world1.x(), world1.y(), world1.z(), - world2.x(), world2.y(), world2.z()); -#endif - - double meters; - double radius = 6378137.0; - dyt_check(nullptr != g_srs_); - radius = g_srs_->getEllipsoid().getRadiusEquator(); - - if (!g_srs_->isGeocentric() ) { - // TRACE("Map is geographic"); - // World cords are already lat/long - // Compute great circle distance - meters = osgEarth::GeoMath::distance(world1, world2, g_srs_); - } else { - osgEarth::GeoPoint mapPoint1, mapPoint2; - mapPoint1.fromWorld(g_srs_, world1); - mapPoint1.makeGeographic(); - mapPoint2.fromWorld(g_srs_, world2); - mapPoint2.makeGeographic(); - // Compute great circle distance - meters = osgEarth::GeoMath::distance(osg::DegreesToRadians(mapPoint1.y()), - osg::DegreesToRadians(mapPoint1.x()), - osg::DegreesToRadians(mapPoint2.y()), - osg::DegreesToRadians(mapPoint2.x()), - radius); - } - - double scale = meters / devicePixelRatio_; - double pixelWidth = devicePixelRatio_ * 2.0; - // 1mi = 5280 feet - //double scaleMiles = scale / 1609.344; // International mile = 1609.344m - //double scaleNauticalMiles = scale / 1852.0; // nautical mile = 1852m - //double scaleUSSurveyMiles = scale / 1609.347218694; // US survey mile = 5280 US survey feet - //double scaleUSSurveyFeet = scale * 3937.0/1200.0; // US survey foot = 1200/3937 m -#if 0 - TRACE("m: %g px: %g m/px: %g", meters, pixelWidth, scale); -#endif - switch (scaleUnits_) { - case ScaleBarHandler::Delegate::Units::UNITS_NAUTICAL_MILES: { - double nmi = meters / 1852.0; - scale = nmi / devicePixelRatio_; - nmi = normalizeScaleNauticalMiles(nmi); - pixelWidth = nmi / scale; - emit signalScaleInfo(QString("%1 nmi").arg(nmi)); - } break; - case ScaleBarHandler::Delegate::Units::UNITS_US_SURVEY_FEET: { - double feet = meters * 3937.0 / 1200.0; - scale = feet / pixelWidth; - feet = normalizeScaleFeet(feet); - pixelWidth = feet / scale; - if (feet >= 5280) { - emit signalScaleInfo(QString("%1 miUS").arg(feet / 5280.0)); - } else { - emit signalScaleInfo(QString("%1 ftUS").arg(feet)); - } - } break; - case ScaleBarHandler::Delegate::Units::UNITS_INTL_FEET: { - double feet = 5280.0 * meters / 1609.344; - scale = feet / pixelWidth; - feet = normalizeScaleFeet(feet); - pixelWidth = feet / scale; - if (feet >= 5280) { - emit signalScaleInfo(QString("%1 mi").arg(feet / 5280.0)); - } else { - emit signalScaleInfo(QString("%1 ft").arg(feet)); - } - } break; - case ScaleBarHandler::Delegate::Units::UNITS_METERS: - default: { - meters = normalizeScaleMeters(meters); - pixelWidth = meters / scale; - if (meters >= 1000) { - emit signalScaleInfo(QString("%1 km").arg(meters * 0.001)); - } else { - emit signalScaleInfo(QString("%1 m").arg(meters)); - } - } break; - } -} - void QtOsgViewWidget::Initialize(void) { if (view_) { LOG_INFO("view is created"); @@ -314,40 +212,38 @@ void QtOsgViewWidget::Initialize(void) { setMouseTracking(true); - activeScene_ = new OEScene; - activeScene_->AttachView(view_); - activeScene_->InitEventHandle(view_); - osgEarth::Util::EarthManipulator* manipulator = new osgEarth::Util::EarthManipulator; - connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, [](WorkSpace* workspace) { - LOG_INFO("WorkSpaceChanged"); - if (nullptr == workspace) { - return; - } - OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator(); - if (nullptr == manipulator) { - LOG_WARN("manipulator is nullptr"); - return; - } - osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator(); - osgEarth::Util::EarthManipulator* ccm = dynamic_cast(gaManipulator); - if (nullptr == ccm) { - LOG_WARN("ccm is nullptr"); - return; - } - ccm->setViewpoint(workspace->GetHomeViewpoint(), 3.0); - } - ); + //osgEarth::Util::EarthManipulator* manipulator = new osgEarth::Util::EarthManipulator; + //connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, [](WorkSpace* workspace) { + // LOG_INFO("WorkSpaceChanged"); + // if (nullptr == workspace) { + // return; + // } + // OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator(); + // if (nullptr == manipulator) { + // LOG_WARN("manipulator is nullptr"); + // return; + // } + // osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator(); + // osgEarth::Util::EarthManipulator* ccm = dynamic_cast(gaManipulator); + // if (nullptr == ccm) { + // LOG_WARN("ccm is nullptr"); + // return; + // } + + // ccm->setViewpoint(workspace->GetHomeViewpoint(), 3.0); + // } + //); - OsgCameraManipulator* cameraManipulator = new OsgCameraManipulator(manipulator, this); - view_->Initialize(cameraManipulator); + //OsgCameraManipulator* cameraManipulator = new OsgCameraManipulator(manipulator, this); + //view_->Initialize(cameraManipulator); - OsgViewUI* viewUI = view_->GetViewUI(); - dyt_check(nullptr != viewUI); - viewUI->AddUI(activeScene_->GetOrCreateSceneUI()); + //OsgViewUI* viewUI = view_->GetViewUI(); + //dyt_check(nullptr != viewUI); + //viewUI->AddUI(activeScene_->GetOrCreateSceneUI()); } void QtOsgViewWidget::Uninitialize(void) { @@ -362,13 +258,13 @@ void QtOsgViewWidget::Uninitialize(void) { } } -void QtOsgViewWidget::LoadDefaultScene(void) { - dyt_check(nullptr != activeScene_); - if (nullptr == WorkSpaceManager::Get().LoadDefaultWorkspace(activeScene_)) { - LOG_ERROR("load default workspace failed"); - QMessageBox::warning(this, tr("warning"), tr("default workspace failed")); - } -} +//void QtOsgViewWidget::LoadDefaultScene(void) { +// dyt_check(nullptr != activeScene_); +// if (nullptr == WorkSpaceManager::Get().LoadDefaultWorkspace(activeScene_)) { +// LOG_ERROR("load default workspace failed"); +// QMessageBox::warning(this, tr("warning"), tr("default workspace failed")); +// } +//} void QtOsgViewWidget::OnLoadDyt(const QString& path) { LOG_INFO("load dyt path:{}", path.toStdString()); diff --git a/src/viewer/QtOsgViewWidget.h b/src/viewer/QtOsgViewWidget.h index 9c2031f6..b88429d6 100644 --- a/src/viewer/QtOsgViewWidget.h +++ b/src/viewer/QtOsgViewWidget.h @@ -3,9 +3,6 @@ // #include #include -#include "scene/OEScene.h" -#include "scene/ScaleBarHandler.h" - class QMouseEvent; class QWheelEvent; @@ -13,7 +10,7 @@ class QKeyEvent; class QInputEvent; class QResizeEvent; -class QtOsgViewWidget : public QWidget, public ScaleBarHandler::Delegate { +class QtOsgViewWidget : public QWidget { Q_OBJECT public: explicit QtOsgViewWidget(QWidget* parent = nullptr); @@ -24,12 +21,10 @@ public: return nullptr; } - void OnComputeScale() override; - void Initialize(void); void Uninitialize(void); - void LoadDefaultScene(void); + //void LoadDefaultScene(void); void OnLoadDyt(const QString& path); //void setKeyboardModifiers(QInputEvent* event); @@ -47,8 +42,6 @@ protected: private: class OsgView* view_{ nullptr }; - osg::ref_ptr activeScene_; class WorkSpace* workspace_{ nullptr }; - ScaleBarHandler::Delegate::Units scaleUnits_{ ScaleBarHandler::Delegate::Units::UNITS_METERS }; float devicePixelRatio_{ 1.0f }; }; \ No newline at end of file diff --git a/src/viewer/ViewWidget.cpp b/src/viewer/ViewWidget.cpp index 4c63a5c3..7f602258 100644 --- a/src/viewer/ViewWidget.cpp +++ b/src/viewer/ViewWidget.cpp @@ -36,70 +36,65 @@ ViewWidget::ViewWidget(QWidget* parent /*= nullptr*/) : OsgViewWidget(parent) { //osg::DisplaySettings::instance()->setNumMultiSamples(16); - setKeyEventSetsDone(0); - - osg::ref_ptr viewPort = new osg::Viewport(0, 0, width(), height()); - getCamera()->setViewport(viewPort); + //setKeyEventSetsDone(0); + // + ////osg::ref_ptr viewPort = new osg::Viewport(0, 0, width(), height()); + ////getCamera()->setViewport(viewPort); - getCamera()->setProjectionMatrixAsPerspective(30.0f, - static_cast(width()) / static_cast(height()), 1.0f, 10000.0f); - getCamera()->setGraphicsContext(getGraphicsWindow()); - setRealizeOperation(new osgEarth::GL3RealizeOperation()); + //getCamera()->setProjectionMatrixAsPerspective(30.0f, + // static_cast(width()) / static_cast(height()), 1.0f, 10000.0f); + //getCamera()->setGraphicsContext(getGraphicsWindow()); + //setRealizeOperation(new osgEarth::GL3RealizeOperation()); //setThreadingModel(osgViewer::ViewerBase::SingleThreaded); //getCamera()->setNearFarRatio(0.0000001); //getCamera()->setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES);//); } void ViewWidget::Initialize(void) { - OEScene* activeScene_ = new OEScene; - activeScene_->AttachView(this); - activeScene_->InitEventHandle(this); + // OEScene* activeScene_ = new OEScene; + // activeScene_->AttachView(this); + // activeScene_->InitEventHandle(this); - const osg::Viewport* viewport = getCamera()->getViewport(); - osg::Viewport::value_type width = viewport->width(); - osg::Viewport::value_type height = viewport->height(); - viewUI_ = new OsgViewUI(this, width, height); - osg::Group* root = getSceneData()->asGroup(); - dyt_check(nullptr != root); - root->addChild(viewUI_.get()); + // const osg::Viewport* viewport = getCamera()->getViewport(); + // osg::Viewport::value_type width = viewport->width(); + // osg::Viewport::value_type height = viewport->height(); + // viewUI_ = new OsgViewUI(this, width, height); + // osg::Group* root = getSceneData()->asGroup(); + // dyt_check(nullptr != root); + // root->addChild(viewUI_.get()); - osgEarth::Util::EarthManipulator* manipulator = new osgEarth::Util::EarthManipulator; - /* connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, [](WorkSpace* workspace) { - LOG_INFO("WorkSpaceChanged"); - if (nullptr == workspace) { - return; - } - OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator(); - if (nullptr == manipulator) { - LOG_WARN("manipulator is nullptr"); - return; - } - osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator(); - osgEarth::Util::EarthManipulator* ccm = dynamic_cast(gaManipulator); - if (nullptr == ccm) { - LOG_WARN("ccm is nullptr"); - return; - } + // osgEarth::Util::EarthManipulator* manipulator = new osgEarth::Util::EarthManipulator; + ///* connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, [](WorkSpace* workspace) { + // LOG_INFO("WorkSpaceChanged"); + // if (nullptr == workspace) { + // return; + // } + // OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator(); + // if (nullptr == manipulator) { + // LOG_WARN("manipulator is nullptr"); + // return; + // } + // osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator(); + // osgEarth::Util::EarthManipulator* ccm = dynamic_cast(gaManipulator); + // if (nullptr == ccm) { + // LOG_WARN("ccm is nullptr"); + // return; + // } - ccm->setViewpoint(workspace->GetHomeViewpoint(), 3.0); - } - ); + // ccm->setViewpoint(workspace->GetHomeViewpoint(), 3.0); + // } + // ); - OsgCameraManipulator* cameraManipulator = new OsgCameraManipulator(manipulator, this); - view_->Initialize(cameraManipulator);*/ - setCameraManipulator(manipulator); + // OsgCameraManipulator* cameraManipulator = new OsgCameraManipulator(manipulator, this); + // view_->Initialize(cameraManipulator);*/ + // setCameraManipulator(manipulator); - - viewUI_->AddUI(activeScene_->GetOrCreateSceneUI()); + // + // viewUI_->AddUI(activeScene_->GetOrCreateSceneUI()); } void ViewWidget::Uninitialize(void) { } - -void ViewWidget::paintGL() { - frame(); - update(); -} diff --git a/src/viewer/ViewWidget.h b/src/viewer/ViewWidget.h index 239fe32a..c9a38671 100644 --- a/src/viewer/ViewWidget.h +++ b/src/viewer/ViewWidget.h @@ -6,7 +6,7 @@ #include "viewer/OsgViewWidget.h" -class ViewWidget : public OsgViewWidget, public osgViewer::Viewer { +class ViewWidget : public OsgViewWidget { Q_OBJECT public: explicit ViewWidget(QWidget* parent = nullptr); @@ -14,10 +14,4 @@ public: void Initialize(void) override; void Uninitialize(void) override; - -protected: - void paintGL() override; - -private: - osg::ref_ptr viewUI_; }; \ No newline at end of file diff --git a/src/viewer/osgQOpenGLWidget.h b/src/viewer/osgQOpenGLWidget.h index 76c54d74..8981ac0f 100644 --- a/src/viewer/osgQOpenGLWidget.h +++ b/src/viewer/osgQOpenGLWidget.h @@ -1,5 +1,6 @@ -#ifndef OSGQOPENGLWIDGET_H -#define OSGQOPENGLWIDGET_H +#pragma once + +#if 0 #ifdef __APPLE__ # define __glext_h_ @@ -22,7 +23,6 @@ #include class OSGRenderer; -#if 0 namespace osgViewer { @@ -86,5 +86,3 @@ protected: private: }; #endif - -#endif // OSGQOPENGLWIDGET_H \ No newline at end of file diff --git a/src/workspace/WorkSpaceManager.cpp b/src/workspace/WorkSpaceManager.cpp index fc3b1a22..6c60ad48 100644 --- a/src/workspace/WorkSpaceManager.cpp +++ b/src/workspace/WorkSpaceManager.cpp @@ -169,6 +169,18 @@ void WorkSpaceManager::OnFrame() { lastTime_ = t; } +void WorkSpaceManager::OnRendererLoaded(OSGRenderer* renderer) { + if (scene_) { + LOG_INFO("activeScene_ loaded"); + return; + } + + renderer_ = renderer; + scene_ = new OEScene; + scene_->AttachView(renderer); + scene_->InitEventHandle(renderer); +} + QString WorkSpaceManager::GetDefaultWorkSpaceName() { #if _DEBUG const QString iniFile = QString("%1workspace/config.ini").arg(QString(CONFIG_PATH)).arg(skin); diff --git a/src/workspace/WorkSpaceManager.h b/src/workspace/WorkSpaceManager.h index b88366f2..006aa123 100644 --- a/src/workspace/WorkSpaceManager.h +++ b/src/workspace/WorkSpaceManager.h @@ -5,7 +5,8 @@ #include #include "app/Singleton.h" - +#include "scene/OEScene.h" +#include "viewer/OSGRenderer.h" #include "ui/chartPlot/DYTChart.h" #include "ui/Table/targetlistwgt.h" @@ -31,6 +32,8 @@ public: void OnFrame(); + void OnRendererLoaded(OSGRenderer* renderer); + signals: void WorkSpaceChanged(WorkSpace*); @@ -38,8 +41,9 @@ private: QString GetDefaultWorkSpaceName(); private: + osg::ref_ptr scene_; + osg::observer_ptr renderer_; std::unordered_map workSpaces_; - class OEScene* scene_{ nullptr }; WorkSpace* current_{ nullptr }; int64_t lastTime_{ 0 }; }; \ No newline at end of file