diff --git a/src/app/Application.cpp b/src/app/Application.cpp index 11ce89c2..8557120e 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/main.cpp b/src/main.cpp index 66651a6a..83b6e276 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,3 +1,4 @@ +#if 1 #include "app/Application.h" #include "common/SpdLogger.h" @@ -25,3 +26,140 @@ int main(int argc, char* argv[]) { ret = app.exec(); return ret; } +#else + +#include + +#include +#include +#include +#include + +const unsigned int MASK_2D = 0xF0000000; + +// NOTE: THIS IS JUST A TEMPORARY HACK! :) This functionality will all eventually be +// encapsulate into another class in osgWidget proper. +bool scrollWindow(osgWidget::Event& ev) { + // The first thing we need to do is make sure we have a Frame object... + osgWidget::Frame* frame = dynamic_cast(ev.getWindow()); + + if (!frame) return false; + + // And now we need to make sure our Frame has a valid internal EmbeddedWindow widget. + osgWidget::Window::EmbeddedWindow* ew = + dynamic_cast(frame->getEmbeddedWindow()) + ; + + if (!ew) return false; + + // Lets get the visible area so that we can use it to make sure our scrolling action + // is necessary in the first place. + const osgWidget::Quad& va = ew->getWindow()->getVisibleArea(); + + // The user wants to scroll up; make sure that the visible area's Y origin isn't already + // at 0.0f, 0.0f. + if (ev.getWindowManager()->isMouseScrollingUp() && va[1] != 0.0f) + ew->getWindow()->addVisibleArea(0, -20) + ; + + else if (va[1] <= (ew->getWindow()->getHeight() - ew->getHeight())) + ew->getWindow()->addVisibleArea(0, 20) + ; + + // We need to manually call update to make sure the visible area scissoring is done + // properly. + frame->update(); + + return true; +} + +bool changeTheme(osgWidget::Event& ev) { + std::string theme; + + if (ev.key == osgGA::GUIEventAdapter::KEY_Right) + theme = "osgWidget/theme-1.png" + ; + + else if (ev.key == osgGA::GUIEventAdapter::KEY_Left) + theme = "osgWidget/theme-2.png" + ; + + else return false; + + osgWidget::Frame* frame = dynamic_cast(ev.getWindow()); + + if (!frame) return false; + + // This is just one way to access all our Widgets; we could just as well have used: + // + // for(osgWidget::Frame::Iterator i = frame.begin(); i != frame.end() i++) {} + // + // ...and it have worked, too. + for (unsigned int row = 0; row < 3; row++) { + for (unsigned int col = 0; col < 3; col++) { + frame->getByRowCol(row, col)->setImage(theme); + } + } + + return true; +} + +int main(int, char**) { + osgViewer::Viewer viewer; + + osgWidget::WindowManager* wm = new osgWidget::WindowManager( + &viewer, + 1280.0f, + 1024.0f, + MASK_2D, + osgWidget::WindowManager::WM_PICK_DEBUG + //osgWidget::WindowManager::WM_NO_INVERT_Y + ); + + std::string baes("D:/Project/DYTSrouce/bin/Release/data/"); + osgWidget::Frame* frame = osgWidget::Frame::createSimpleFrameFromTheme( + "frame", + osgDB::readRefImageFile(baes + "osgWidget/theme.png"), + 40.0f, + 40.0f, + osgWidget::Frame::FRAME_ALL + ); + + frame->getBackground()->setColor(0.0f, 0.0f, 0.0f, 0.0f); + + // This is our Transformers box. :) + osgWidget::Box* box = new osgWidget::Box("images", osgWidget::Box::VERTICAL); + osgWidget::Widget* img1 = new osgWidget::Widget("im1", 512.0f, 512.0f); + osgWidget::Widget* img2 = new osgWidget::Widget("im2", 512.0f, 512.0f); + osgWidget::Widget* img3 = new osgWidget::Widget("im3", 512.0f, 512.0f); + osgWidget::Widget* img4 = new osgWidget::Widget("im4", 512.0f, 512.0f); + + const std::string image1 = "D:/Project/DYTSrouce/bin/Release/resources/northarrow/_n.png"; + img1->setImage(image1, true); + img2->setImage(baes + "osgWidget/scrolled2.jpg", true); + img3->setImage(baes + "osgWidget/scrolled3.jpg", true); + img4->setImage(baes + "osgWidget/scrolled4.jpg", true); + + img1->setMinimumSize(10.0f, 10.0f); + img2->setMinimumSize(10.0f, 10.0f); + img3->setMinimumSize(10.0f, 10.0f); + img4->setMinimumSize(10.0f, 10.0f); + + box->addWidget(img1); + box->addWidget(img2); + box->addWidget(img3); + box->addWidget(img4); + box->setEventMask(osgWidget::EVENT_NONE); + + //frame->getEmbeddedWindow()->setWindow(box); + frame->setWindow(box); + frame->getEmbeddedWindow()->setColor(1.0f, 1.0f, 1.0f, 1.0f); + frame->resize(300.0f, 300.0f); + frame->addCallback(new osgWidget::Callback(&scrollWindow, osgWidget::EVENT_MOUSE_SCROLL)); + frame->addCallback(new osgWidget::Callback(&changeTheme, osgWidget::EVENT_KEY_DOWN)); + + wm->addChild(frame); + + return osgWidget::createExample(viewer, wm); +} +#endif diff --git a/src/scene/OEScene.cpp b/src/scene/OEScene.cpp index 903a76b3..1d3995e4 100644 --- a/src/scene/OEScene.cpp +++ b/src/scene/OEScene.cpp @@ -40,8 +40,12 @@ void OEScene::InitEventHandle(class OsgView* view) { //view->GetView()->addEventHandler(new osgEarth::Util::EarthManipulator()); - view->GetView()->addEventHandler(new osgViewer::HelpHandler); - view->GetView()->addEventHandler(new osgViewer::StatsHandler); + InitEventHandle(view->GetView()); +} + +void OEScene::InitEventHandle(osgViewer::View* view) { + view->addEventHandler(new osgViewer::HelpHandler); + view->addEventHandler(new osgViewer::StatsHandler); } void OEScene::AttachView(OsgView* view) { @@ -50,6 +54,11 @@ void OEScene::AttachView(OsgView* view) { return; } + + AttachView(view->GetView()); +} + +void OEScene::AttachView(osgViewer::View* view) { earthRootNode_ = osgDB::readNodeFile("triton.earth"); if (!earthRootNode_) { LOG_ERROR("read earth node(triton.earth) failed"); @@ -75,10 +84,10 @@ void OEScene::AttachView(OsgView* view) { skyDome_->addChild(earthMapNode_); - osg::Node* node = view->GetView()->getSceneData(); + osg::Node* node = view->getSceneData(); if (nullptr == node) { LOG_INFO("view scene data is nullptr, root valid:{}", skyDome_.valid()); - view->GetView()->setSceneData(skyDome_); + view->setSceneData(skyDome_); } else { osg::Group* group = node->asGroup(); if (nullptr != group) { @@ -88,8 +97,8 @@ void OEScene::AttachView(OsgView* view) { LOG_INFO("node is not group"); } } - - skyDome_->attach(view->GetView()); + + skyDome_->attach(view); skyDome_->setAtmosphereVisible(true); skyDome_->setSunVisible(true); @@ -99,8 +108,7 @@ void OEScene::AttachView(OsgView* view) { skyDome_->setDateTime(osgEarth::DateTime(2024, 12, 24, 3)); skyDome_->setSimulationTimeTracksDateTime(true); - logarithmicDepthBuffer_->install(view->GetView()->getCamera()); - + logarithmicDepthBuffer_->install(view->getCamera()); } void OEScene::DetachView(OsgView* view) { diff --git a/src/scene/OEScene.h b/src/scene/OEScene.h index 0f00b87e..6c7d1845 100644 --- a/src/scene/OEScene.h +++ b/src/scene/OEScene.h @@ -20,7 +20,9 @@ class OEScene : public osg::Referenced { public: OEScene(); void InitEventHandle(OsgView* view); + void InitEventHandle(osgViewer::View* view); void AttachView(OsgView* view); + void AttachView(osgViewer::View* 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 38757366..02b3d9db 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/MainFrame.cpp b/src/ui/MainFrame.cpp index cedba96a..188f241f 100644 --- a/src/ui/MainFrame.cpp +++ b/src/ui/MainFrame.cpp @@ -113,9 +113,9 @@ void MainFrame::InitUI() { MainWindow* mainWindow = new MainWindow(this); layout->addWidget(mainWindow); - QtOsgViewWidget* viewWidget = mainWindow->GetViewWidget(); + /* QtOsgViewWidget* viewWidget = mainWindow->GetViewWidget(); connect(fileMenu, &FileManagerMenu::LoadDyt, viewWidget, &QtOsgViewWidget::OnLoadDyt); - connect(viewWidget, &QtOsgViewWidget::signalResetWorkSpace, mainWindow, &MainWindow::slotResetWorkSpace); + connect(viewWidget, &QtOsgViewWidget::signalResetWorkSpace, mainWindow, &MainWindow::slotResetWorkSpace);*/ connect(system_, &SystemManagerMenu::signalShowUISetting, mainWindow, &MainWindow::slotShowUISetting); diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index 3b5e1d34..c239e4da 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -13,7 +13,7 @@ #include "ModelBrowser.h" #include "DockWidget.h" -#include "viewer/QtOsgViewWidget.h" +#include "viewer/ViewWidget.h" #include "viewer/OsgViewer.h" #include "chartPlot/FitCurveDialog.h" @@ -44,7 +44,6 @@ MainWindow::MainWindow(QWidget* parent) } MainWindow::~MainWindow() { - OsgViewer::Get().Uninitialize(); delete ui; } @@ -83,7 +82,7 @@ void MainWindow::InitUI() { connect(modelBrowser_, &ModelBrowser::WorkSpaceChange, propertyBrowser_, &PropertyBrowser::OnWorkSpaceChange); connect(modelBrowser_, &ModelBrowser::EntityChange, propertyBrowser_, &PropertyBrowser::OnEntityChange); - qtOsgViewWidget_ = new QtOsgViewWidget; + qtOsgViewWidget_ = new ViewWidget; qtOsgViewWidget_->Initialize(); m_mapDockWidget.insert("PropertyBrowser", attribte); @@ -211,8 +210,8 @@ void MainWindow::InitUI() { //ui->viewWidget->layout()->addWidget(qtOsgViewWidget_); qtOsgViewWidget_->LoadDefaultScene(); - OsgViewer::Get().Initialize(); - OsgViewer::Get().OnFrame(); + //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_); - OsgViewer::Get().Initialize(); - OsgViewer::Get().OnFrame(); + //OsgViewer::Get().Initialize(); + //OsgViewer::Get().OnFrame(); } else { mainWindow_->takeCentralWidget(); } diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 3b221341..c8f8d71e 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -21,7 +21,7 @@ public: class ModelBrowser* GetModelBrowser() const { return modelBrowser_; } - class QtOsgViewWidget* GetViewWidget() const { + class ViewWidget* GetViewWidget() const { return qtOsgViewWidget_; } @@ -55,7 +55,7 @@ private: class ModelBrowser* modelBrowser_{ nullptr }; class PropertyBrowser* propertyBrowser_{ nullptr }; class QWebEngineView* webEngineView_{ nullptr }; - class QtOsgViewWidget* qtOsgViewWidget_{ nullptr }; + class ViewWidget* qtOsgViewWidget_{ nullptr }; class FitCurveDialog* fitCurveDlg_{ nullptr }; class FitCurveDialog* fitYLgCurveDlg_{ nullptr }; diff --git a/src/viewer/GraphicsWindowEx.cpp b/src/viewer/GraphicsWindowEx.cpp index 520cdea7..3f20fd9a 100644 --- a/src/viewer/GraphicsWindowEx.cpp +++ b/src/viewer/GraphicsWindowEx.cpp @@ -2,39 +2,14 @@ #include "viewer/StateEx.h" GraphicsWindowEx::GraphicsWindowEx(osg::GraphicsContext::Traits* traits) -{ + : osgViewer::GraphicsWindowEmbedded(traits) { _traits = traits; init(); } GraphicsWindowEx::GraphicsWindowEx(int x, int y, int width, int height) + : osgViewer::GraphicsWindowEmbedded(x, y, width, height) { - _traits = new osg::GraphicsContext::Traits(); - _traits->x = x; - _traits->x = y; - _traits->width = width; - _traits->height = height; - - init(); } -void GraphicsWindowEx::init() -{ - if(valid()) - { - // inject our "extended" state - setState(new StateEx()); - getState()->setGraphicsContext(this); - - if(_traits.valid() && _traits->sharedContext.valid()) - { - getState()->setContextID(_traits->sharedContext->getState()->getContextID()); - incrementContextIDUsageCount(getState()->getContextID()); - } - else - { - getState()->setContextID(osg::GraphicsContext::createNewContextID()); - } - } -} diff --git a/src/viewer/GraphicsWindowEx.h b/src/viewer/GraphicsWindowEx.h index 268b2c7c..ad2a0bb1 100644 --- a/src/viewer/GraphicsWindowEx.h +++ b/src/viewer/GraphicsWindowEx.h @@ -9,11 +9,9 @@ class GraphicsWindowEx : public osgViewer::GraphicsWindowEmbedded { public: - GraphicsWindowEx(osg::GraphicsContext::Traits* traits); + GraphicsWindowEx(osg::GraphicsContext::Traits* traits = 0); GraphicsWindowEx(int x, int y, int width, int height); - void init(); - virtual bool isSameKindAs(const osg::Object* object) const { return dynamic_cast(object) != 0; diff --git a/src/viewer/OsgViewWidget.cpp b/src/viewer/OsgViewWidget.cpp new file mode 100644 index 00000000..e94ebfbc --- /dev/null +++ b/src/viewer/OsgViewWidget.cpp @@ -0,0 +1,154 @@ +#include "viewer/OsgViewWidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "config.h" +#include "app/Application.h" +#include "common/SpdLogger.h" +#include "viewer/OsgView.h" +#include "viewer/OsgViewer.h" +#include "viewer/OsgCameraManipulator.h" +#include "viewer/CameraControlManipulator.h" +#include "viewer/OsgViewUI.h" +#include "scene/OsgScene.h" +#include "workspace/WorkSpace.h" +#include "workspace/WorkSpaceManager.h" +#include "scene/SceneContent.h" +#include "scene/ui/OESceneUI.h" +#include "ui/MainFrame.h" + + +OsgViewWidget::OsgViewWidget(QWidget* parent /*= nullptr*/) + : QGLWidget(parent) { + osgEarth::initialize(); + osg::ref_ptr traits = new osg::GraphicsContext::Traits; + traits->x = 0; + traits->y = 0; + traits->width = width(); + traits->height = height(); + traits->doubleBuffer = true; + traits->depth = 32; + traits->samples = 16; + gw_ = new GraphicsWindowEx(traits.get()); + setFocusPolicy(Qt::ClickFocus); +} + + +void OsgViewWidget::Initialize(void) { + +} + +void OsgViewWidget::Uninitialize(void) { + +} + +void OsgViewWidget::LoadDefaultScene(void) { + +} + +void OsgViewWidget::OnLoadDyt(const QString& path) { + +} + +void OsgViewWidget::resizeGL(int width, int height) { + gw_->getEventQueue()->windowResize(0, 0, width, height); + gw_->resized(0, 0, width, height); +} + +void OsgViewWidget::keyPressEvent(QKeyEvent* event) { + switch (event->key()) { + case Qt::Key_Escape: + //emit quitFullScreen(); //for operation + break; + default: + gw_->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol) * (event->text().toLatin1().data())); + } +} + +void OsgViewWidget::keyReleaseEvent(QKeyEvent* event) { + gw_->getEventQueue()->keyRelease((osgGA::GUIEventAdapter::KeySymbol) * (event->text()./*toAscii()*/toLatin1().data())); +} + +void OsgViewWidget::mouseMoveEvent(QMouseEvent* event) { + gw_->getEventQueue()->mouseMotion(event->x(), event->y()); +} + +void OsgViewWidget::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 OsgViewWidget::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 OsgViewWidget::mouseDoubleClickEvent(QMouseEvent* event) { + QPoint pos = QCursor::pos(); + // QList listItems = items(mapToScene(pos.x(), pos.y()).toPoint()); + // if (listItems.size() > 0) + // { + // return; + // } + 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; + } + setKeyboardModifiers(event); + gw_->getEventQueue()->mouseDoubleButtonPress(event->x(), event->y(), button); + + QGLWidget::mouseDoubleClickEvent(event); +} + +void OsgViewWidget::wheelEvent(QWheelEvent* event) { + setKeyboardModifiers(event); + gw_->getEventQueue()->mouseScroll( + event->orientation() == Qt::Vertical ? + (event->delta() > 0 ? osgGA::GUIEventAdapter::SCROLL_UP : osgGA::GUIEventAdapter::SCROLL_DOWN) : + (event->delta() > 0 ? osgGA::GUIEventAdapter::SCROLL_LEFT : osgGA::GUIEventAdapter::SCROLL_RIGHT)); + QGLWidget::wheelEvent(event); +} + +void OsgViewWidget::setKeyboardModifiers(QInputEvent* event) { + int modkey = event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier); + unsigned int mask = 0; + if (modkey & Qt::ShiftModifier) mask |= osgGA::GUIEventAdapter::MODKEY_SHIFT; + if (modkey & Qt::ControlModifier) mask |= osgGA::GUIEventAdapter::MODKEY_CTRL; + if (modkey & Qt::AltModifier) mask |= osgGA::GUIEventAdapter::MODKEY_ALT; + + gw_->getEventQueue()->getCurrentEventState()->setModKeyMask(mask); +} + diff --git a/src/viewer/OsgViewWidget.h b/src/viewer/OsgViewWidget.h new file mode 100644 index 00000000..8bd13d06 --- /dev/null +++ b/src/viewer/OsgViewWidget.h @@ -0,0 +1,70 @@ +#pragma once + + #include +#include + +#include "scene/OEScene.h" +#include "viewer/OsgViewWidget.h" +#include "viewer/GraphicsWindowEx.h" + + +class QMouseEvent; +class QWheelEvent; +class QKeyEvent; +class QInputEvent; +class QResizeEvent; + +class OsgViewWidget : public QGLWidget { + Q_OBJECT +public: + explicit OsgViewWidget(QWidget* parent = nullptr); + ~OsgViewWidget() override = default; + + //void setKeyboardModifiers(QInputEvent* event) override; + QPaintEngine* paintEngine() const override { + return nullptr; + } + + GraphicsWindowEx* getGraphicsWindow() { + return gw_.get(); + } + const GraphicsWindowEx* getGraphicsWindow() const { + return gw_.get(); + } + osg::GraphicsContext* getGraphicsContext() { + return gc_.get(); + } + const osg::GraphicsContext* getGraphicsContext() const { + return gc_.get(); + } + + virtual void Initialize(void); + virtual void Uninitialize(void); + + void LoadDefaultScene(void); + + void OnLoadDyt(const QString& path); + //void setKeyboardModifiers(QInputEvent* event); + +signals: + void signalResetWorkSpace(); + void signalScaleInfo(const QString&); + +protected: + void init(); + void resizeGL(int width, int height) override; + void keyPressEvent(QKeyEvent* event) override; + void keyReleaseEvent(QKeyEvent* event) override; + void mousePressEvent(QMouseEvent* event) override; + void mouseReleaseEvent(QMouseEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; + void mouseDoubleClickEvent(QMouseEvent* event) override; + void wheelEvent(QWheelEvent* event) override; + +private: + void setKeyboardModifiers(QInputEvent* event); + +private: + osg::ref_ptr gw_; + osg::ref_ptr gc_; +}; diff --git a/src/viewer/OsgViewer.cpp b/src/viewer/OsgViewer.cpp index 72227684..88b4e025 100644 --- a/src/viewer/OsgViewer.cpp +++ b/src/viewer/OsgViewer.cpp @@ -21,7 +21,7 @@ OsgViewer::OsgViewer(QObject* parent) noexcept , compositeViewer_(new osgViewer::CompositeViewer) { LOG_INFO("actor, self={}", fmt::ptr(this)); compositeViewer_->setKeyEventSetsDone(0); - compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false); + //compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false); osgEarth::initialize(); osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image"); compositeViewer_->setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded); @@ -38,6 +38,7 @@ void OsgViewer::OnDestory() { } void OsgViewer::OnFrame(void) { + return; assert(nullptr != compositeViewer_); WorkSpaceManager::Get().OnFrame(); diff --git a/src/viewer/ViewWidget.cpp b/src/viewer/ViewWidget.cpp new file mode 100644 index 00000000..4c63a5c3 --- /dev/null +++ b/src/viewer/ViewWidget.cpp @@ -0,0 +1,105 @@ +#include "viewer/ViewWidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "config.h" +#include "app/Application.h" +#include "common/SpdLogger.h" +#include "viewer/OsgView.h" +#include "viewer/OsgViewer.h" +#include "viewer/OsgCameraManipulator.h" +#include "viewer/CameraControlManipulator.h" +#include "viewer/OsgViewUI.h" +#include "scene/OsgScene.h" +#include "workspace/WorkSpace.h" +#include "workspace/WorkSpaceManager.h" +#include "scene/SceneContent.h" +#include "scene/ui/OESceneUI.h" +#include "ui/MainFrame.h" + +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); + + 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); + + 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; + } + + ccm->setViewpoint(workspace->GetHomeViewpoint(), 3.0); + } + ); + + + OsgCameraManipulator* cameraManipulator = new OsgCameraManipulator(manipulator, this); + view_->Initialize(cameraManipulator);*/ + setCameraManipulator(manipulator); + + + 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 new file mode 100644 index 00000000..239fe32a --- /dev/null +++ b/src/viewer/ViewWidget.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +#include "scene/OEScene.h" +#include "viewer/OsgViewWidget.h" + + +class ViewWidget : public OsgViewWidget, public osgViewer::Viewer { + Q_OBJECT +public: + explicit ViewWidget(QWidget* parent = nullptr); + ~ViewWidget() override = default; + + void Initialize(void) override; + void Uninitialize(void) override; + +protected: + void paintGL() override; + +private: + osg::ref_ptr viewUI_; +}; \ No newline at end of file