add new render mode

This commit is contained in:
jiegeaiai 2025-01-14 01:33:51 +08:00
parent b900683dbe
commit 7237c650a3
15 changed files with 568 additions and 95 deletions

View File

@ -26,7 +26,7 @@ QString Application::GetWorkSpacePath() {
void Application::Init() {
Singleton<MeshManager>::Create(this);
Singleton<OsgViewer>::Create(this);
//Singleton<OsgViewer>::Create(this);
Singleton<RecourceHelper>::Create(this);
Singleton<EntitiesManager>::Create(this);
Singleton<WorkSpaceManager>::Create(this);
@ -40,6 +40,6 @@ void Application::Uninit() {
Singleton<WorkSpaceManager>::Destory();
Singleton<EntitiesManager>::Destory();
Singleton<RecourceHelper>::Destory();
Singleton<OsgViewer>::Destory();
//Singleton<OsgViewer>::Destory();
Singleton<MeshManager>::Destory();
}

View File

@ -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 <osgDB/ReadFile>
#include <osgWidget/Util>
#include <osgWidget/WindowManager>
#include <osgWidget/Frame>
#include <osgWidget/Box>
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<osgWidget::Frame*>(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<osgWidget::Window::EmbeddedWindow*>(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<osgWidget::Frame*>(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

View File

@ -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) {

View File

@ -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<osg::TextureCubeMap> LoadCubeMapTextures(const std::string& dir);

View File

@ -479,153 +479,153 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="71"/>
<location filename="../ui/MainWindow.cpp" line="70"/>
<source>model elements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="77"/>
<location filename="../ui/MainWindow.cpp" line="76"/>
<source>attribte</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="114"/>
<location filename="../ui/MainWindow.cpp" line="113"/>
<source>Wave Curve</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="122"/>
<location filename="../ui/MainWindow.cpp" line="121"/>
<source>Speed Curve</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="131"/>
<location filename="../ui/MainWindow.cpp" line="130"/>
<source>3D Curve</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="143"/>
<location filename="../ui/MainWindow.cpp" line="168"/>
<location filename="../ui/MainWindow.cpp" line="142"/>
<location filename="../ui/MainWindow.cpp" line="167"/>
<source>Target number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="143"/>
<location filename="../ui/MainWindow.cpp" line="168"/>
<location filename="../ui/MainWindow.cpp" line="142"/>
<location filename="../ui/MainWindow.cpp" line="167"/>
<source>Signal-to-noise ratio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="144"/>
<location filename="../ui/MainWindow.cpp" line="169"/>
<location filename="../ui/MainWindow.cpp" line="143"/>
<location filename="../ui/MainWindow.cpp" line="168"/>
<source>Azimuth line of sight</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="144"/>
<location filename="../ui/MainWindow.cpp" line="169"/>
<location filename="../ui/MainWindow.cpp" line="143"/>
<location filename="../ui/MainWindow.cpp" line="168"/>
<source>Pitch gaze angle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="145"/>
<location filename="../ui/MainWindow.cpp" line="170"/>
<location filename="../ui/MainWindow.cpp" line="144"/>
<location filename="../ui/MainWindow.cpp" line="169"/>
<source>azimuth</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="145"/>
<location filename="../ui/MainWindow.cpp" line="170"/>
<location filename="../ui/MainWindow.cpp" line="144"/>
<location filename="../ui/MainWindow.cpp" line="169"/>
<source>Pitch angle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="146"/>
<location filename="../ui/MainWindow.cpp" line="171"/>
<location filename="../ui/MainWindow.cpp" line="145"/>
<location filename="../ui/MainWindow.cpp" line="170"/>
<source>attribute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="146"/>
<location filename="../ui/MainWindow.cpp" line="171"/>
<location filename="../ui/MainWindow.cpp" line="145"/>
<location filename="../ui/MainWindow.cpp" line="170"/>
<source>Doppler</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="147"/>
<location filename="../ui/MainWindow.cpp" line="172"/>
<location filename="../ui/MainWindow.cpp" line="146"/>
<location filename="../ui/MainWindow.cpp" line="171"/>
<source>course</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="147"/>
<location filename="../ui/MainWindow.cpp" line="172"/>
<location filename="../ui/MainWindow.cpp" line="146"/>
<location filename="../ui/MainWindow.cpp" line="171"/>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="148"/>
<location filename="../ui/MainWindow.cpp" line="173"/>
<location filename="../ui/MainWindow.cpp" line="147"/>
<location filename="../ui/MainWindow.cpp" line="172"/>
<source>longitude</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="148"/>
<location filename="../ui/MainWindow.cpp" line="173"/>
<location filename="../ui/MainWindow.cpp" line="147"/>
<location filename="../ui/MainWindow.cpp" line="172"/>
<source>latitude</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="149"/>
<location filename="../ui/MainWindow.cpp" line="174"/>
<location filename="../ui/MainWindow.cpp" line="148"/>
<location filename="../ui/MainWindow.cpp" line="173"/>
<source>distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="149"/>
<location filename="../ui/MainWindow.cpp" line="174"/>
<location filename="../ui/MainWindow.cpp" line="148"/>
<location filename="../ui/MainWindow.cpp" line="173"/>
<source>velocity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="150"/>
<location filename="../ui/MainWindow.cpp" line="175"/>
<location filename="../ui/MainWindow.cpp" line="149"/>
<location filename="../ui/MainWindow.cpp" line="174"/>
<source>Radial dimensions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="150"/>
<location filename="../ui/MainWindow.cpp" line="175"/>
<location filename="../ui/MainWindow.cpp" line="149"/>
<location filename="../ui/MainWindow.cpp" line="174"/>
<source>Target RCS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="156"/>
<location filename="../ui/MainWindow.cpp" line="155"/>
<source>Report Table</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="181"/>
<location filename="../ui/MainWindow.cpp" line="180"/>
<source>Report</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="190"/>
<location filename="../ui/MainWindow.cpp" line="189"/>
<source>Signal Indicator Lamp</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="197"/>
<location filename="../ui/MainWindow.cpp" line="196"/>
<source>ParamSetting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="202"/>
<location filename="../ui/MainWindow.cpp" line="201"/>
<source>Matlab File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/MainWindow.cpp" line="207"/>
<location filename="../ui/MainWindow.cpp" line="206"/>
<source>name: 5year 0412</source>
<translation type="unfinished"></translation>
</message>

View File

@ -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);

View File

@ -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();
}

View File

@ -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 };

View File

@ -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());
}
}
}

View File

@ -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<const GraphicsWindowEx*>(object) != 0;

View File

@ -0,0 +1,154 @@
#include "viewer/OsgViewWidget.h"
#include <QWheelEvent>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QOpenGLContext>
#include <QOpenGLFunctions>
#include <QGridLayout>
#include <QDebug>
#include <QPainter>
#include <QResizeEvent>
#include <QMessageBox>
#include <QScreen>
#include <QWindow>
#include <osgEarth/EarthManipulator>
#include <osgEarth/Viewpoint>
#include <osgEarth/GeoMath>
#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<osg::GraphicsContext::Traits> 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<QGraphicsItem*> 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);
}

View File

@ -0,0 +1,70 @@
#pragma once
#include <QGLWidget>
#include <QWidget>
#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<GraphicsWindowEx> gw_;
osg::ref_ptr<osg::GraphicsContext> gc_;
};

View File

@ -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();

105
src/viewer/ViewWidget.cpp Normal file
View File

@ -0,0 +1,105 @@
#include "viewer/ViewWidget.h"
#include <QWheelEvent>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QOpenGLContext>
#include <QOpenGLFunctions>
#include <QGridLayout>
#include <QDebug>
#include <QPainter>
#include <QResizeEvent>
#include <QMessageBox>
#include <QScreen>
#include <QWindow>
#include <osgEarth/EarthManipulator>
#include <osgEarth/Viewpoint>
#include <osgEarth/GeoMath>
#include <osgEarth/GLUtils>
#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<osg::Viewport> viewPort = new osg::Viewport(0, 0, width(), height());
getCamera()->setViewport(viewPort);
getCamera()->setProjectionMatrixAsPerspective(30.0f,
static_cast<double>(width()) / static_cast<double>(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<osgEarth::Util::EarthManipulator*>(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();
}

23
src/viewer/ViewWidget.h Normal file
View File

@ -0,0 +1,23 @@
#pragma once
#include <osgViewer/Viewer>
#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<class OsgViewUI> viewUI_;
};