moidyf render

This commit is contained in:
jiegeaiai 2025-01-18 22:36:28 +08:00
parent 32ed1bf037
commit ad02144014
23 changed files with 256 additions and 324 deletions

View File

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

View File

@ -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"); earthRootNode_ = osgDB::readNodeFile("triton.earth");
if (!earthRootNode_) { if (!earthRootNode_) {
LOG_ERROR("read earth node(triton.earth) failed"); LOG_ERROR("read earth node(triton.earth) failed");

View File

@ -7,6 +7,7 @@
#include <osgEarth/ModelNode> #include <osgEarth/ModelNode>
#include <osgEarth/Sky> #include <osgEarth/Sky>
#include <osgEarth/LogarithmicDepthBuffer> #include <osgEarth/LogarithmicDepthBuffer>
#include <osgViewer/Viewer>
//#include "scene/SkyDome.h" //#include "scene/SkyDome.h"
@ -22,7 +23,7 @@ public:
void InitEventHandle(OsgView* view); void InitEventHandle(OsgView* view);
void InitEventHandle(osgViewer::View* view); void InitEventHandle(osgViewer::View* view);
void AttachView(OsgView* view); void AttachView(OsgView* view);
void AttachView(osgViewer::View* view); void AttachView(osgViewer::Viewer* view);
void DetachView(OsgView* view); void DetachView(OsgView* view);
osg::ref_ptr<osg::TextureCubeMap> LoadCubeMapTextures(const std::string& dir); osg::ref_ptr<osg::TextureCubeMap> LoadCubeMapTextures(const std::string& dir);

View File

@ -1254,18 +1254,12 @@
<context> <context>
<name>QtOsgViewWidget</name> <name>QtOsgViewWidget</name>
<message> <message>
<location filename="../viewer/QtOsgViewWidget.cpp" line="369"/> <location filename="../viewer/QtOsgViewWidget.cpp" line="273"/>
<location filename="../viewer/QtOsgViewWidget.cpp" line="377"/>
<source>warning</source> <source>warning</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../viewer/QtOsgViewWidget.cpp" line="369"/> <location filename="../viewer/QtOsgViewWidget.cpp" line="273"/>
<source>default workspace failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../viewer/QtOsgViewWidget.cpp" line="377"/>
<source>open dyt file failed</source> <source>open dyt file failed</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -83,8 +83,8 @@ void MainWindow::InitUI() {
connect(modelBrowser_, &ModelBrowser::WorkSpaceChange, propertyBrowser_, &PropertyBrowser::OnWorkSpaceChange); connect(modelBrowser_, &ModelBrowser::WorkSpaceChange, propertyBrowser_, &PropertyBrowser::OnWorkSpaceChange);
connect(modelBrowser_, &ModelBrowser::EntityChange, propertyBrowser_, &PropertyBrowser::OnEntityChange); connect(modelBrowser_, &ModelBrowser::EntityChange, propertyBrowser_, &PropertyBrowser::OnEntityChange);
//qtOsgViewWidget_ = new ViewWidget; qtOsgViewWidget_ = new ViewWidget;
qtOsgViewWidget_ = new OsgOpenGLWindow; //qtOsgViewWidget_ = new OsgOpenGLWindow;
//qtOsgViewWidget_->Initialize(); //qtOsgViewWidget_->Initialize();
m_mapDockWidget.insert("PropertyBrowser", attribte); m_mapDockWidget.insert("PropertyBrowser", attribte);
@ -212,8 +212,7 @@ void MainWindow::InitUI() {
//ui->viewWidget->layout()->addWidget(qtOsgViewWidget_); //ui->viewWidget->layout()->addWidget(qtOsgViewWidget_);
//qtOsgViewWidget_->LoadDefaultScene(); //qtOsgViewWidget_->LoadDefaultScene();
//OsgViewer::Get().Initialize();
//OsgViewer::Get().OnFrame();
#if 0 #if 0
MatlabObject* mtlb = new MatlabObject; MatlabObject* mtlb = new MatlabObject;
@ -237,8 +236,8 @@ void MainWindow::InitDockLayout() {
tabWidget_->insertTab(i, mainWindow_, strTabName); tabWidget_->insertTab(i, mainWindow_, strTabName);
if (listDocArea[0].toList().size() > 0) { if (listDocArea[0].toList().size() > 0) {
//mainWindow_->setCentralWidget(qtOsgViewWidget_); mainWindow_->setCentralWidget(qtOsgViewWidget_);
mainWindow_->setCentralWidget(qtOsgViewWidget_->AsWidget()); //mainWindow_->setCentralWidget(qtOsgViewWidget_->AsWidget());
//OsgViewer::Get().Initialize(); //OsgViewer::Get().Initialize();
//OsgViewer::Get().OnFrame(); //OsgViewer::Get().OnFrame();
} else { } else {

View File

@ -55,8 +55,8 @@ private:
class ModelBrowser* modelBrowser_{ nullptr }; class ModelBrowser* modelBrowser_{ nullptr };
class PropertyBrowser* propertyBrowser_{ nullptr }; class PropertyBrowser* propertyBrowser_{ nullptr };
class QWebEngineView* webEngineView_{ nullptr }; class QWebEngineView* webEngineView_{ nullptr };
//class ViewWidget* qtOsgViewWidget_{ nullptr }; class ViewWidget* qtOsgViewWidget_{ nullptr };
class OsgOpenGLWindow* qtOsgViewWidget_{ nullptr }; //class OsgOpenGLWindow* qtOsgViewWidget_{ nullptr };
class FitCurveDialog* fitCurveDlg_{ nullptr }; class FitCurveDialog* fitCurveDlg_{ nullptr };
class FitCurveDialog* fitYLgCurveDlg_{ nullptr }; class FitCurveDialog* fitYLgCurveDlg_{ nullptr };

View File

@ -107,6 +107,12 @@ namespace {
} // 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) GraphicsWindowEx::GraphicsWindowEx(int x, int y, int width, int height)
: osgViewer::GraphicsWindowEmbedded(x, y, width == 0 ? 1 : width, height == 0 ? 1 : height) { : osgViewer::GraphicsWindowEmbedded(x, y, width == 0 ? 1 : width, height == 0 ? 1 : height) {
LOG_INFO("actor, self={}", spdlog::fmt_lib::ptr(this)); LOG_INFO("actor, self={}", spdlog::fmt_lib::ptr(this));
@ -118,75 +124,76 @@ GraphicsWindowEx::~GraphicsWindowEx() {
} }
bool GraphicsWindowEx::realizeImplementation() { bool GraphicsWindowEx::realizeImplementation() {
LOG_INFO("realizeImplementation, isRealized_:{}, self={}", isRealized_, spdlog::fmt_lib::ptr(this)); //LOG_INFO("realizeImplementation, isRealized_:{}, self={}", isRealized_, spdlog::fmt_lib::ptr(this));
if (isRealized_) { //if (isRealized_) {
return true; // return true;
} //}
dyt_check(nullptr != _state); //dyt_check(nullptr != _state);
_state->resetVertexAttributeAlias(false); //_state->resetVertexAttributeAlias(false);
_state->setModeValidity(GL_LIGHTING, false); //_state->setModeValidity(GL_LIGHTING, false);
_state->setModeValidity(GL_NORMALIZE, false); //_state->setModeValidity(GL_NORMALIZE, false);
_state->setModeValidity(GL_RESCALE_NORMAL, false); //_state->setModeValidity(GL_RESCALE_NORMAL, false);
_state->setModeValidity(GL_LINE_STIPPLE, false); //_state->setModeValidity(GL_LINE_STIPPLE, false);
_state->setModeValidity(GL_LINE_SMOOTH, false); //_state->setModeValidity(GL_LINE_SMOOTH, false);
isRealized_ = true; //isRealized_ = true;
return true; return true;
} }
bool GraphicsWindowEx::makeCurrentImplementation() { bool GraphicsWindowEx::makeCurrentImplementation() {
LOG_INFO("makeCurrentImplementation, isRealized_:{}, self={}", isRealized_, spdlog::fmt_lib::ptr(this)); //LOG_INFO("makeCurrentImplementation, isRealized_:{}, self={}", isRealized_, spdlog::fmt_lib::ptr(this));
//
//if (nullptr != offScreenContext_) {
// offScreenContext_->makeCurrent(offScreenSurface_.get());
//}
InitOffScreenContext(); //InitFrameBuffer();
if (nullptr != offScreenContext_) {
offScreenContext_->makeCurrent(offScreenSurface_.get());
}
InitFrameBuffer();
setDefaultFboId(renderFramebuffer_->handle());
renderFramebuffer_->bind();
//setDefaultFboId(renderFramebuffer_->handle());
//renderFramebuffer_->bind();
//
return true; return true;
} }
void GraphicsWindowEx::closeImplementation() { void GraphicsWindowEx::closeImplementation() {
if (!isSharedContextSet_) { //if (!isSharedContextSet_) {
return; // return;
} //}
if (isFrameBufferInitialized_) { //if (isFrameBufferInitialized_) {
offScreenContext_->makeCurrent(offScreenSurface_.get()); // offScreenContext_->makeCurrent(offScreenSurface_.get());
renderFramebuffer_.reset(); // renderFramebuffer_.reset();
sharedFrameBuffer_.reset(); // sharedFrameBuffer_.reset();
offScreenContext_->doneCurrent(); // offScreenContext_->doneCurrent();
} //}
offScreenContext_.reset(); //offScreenContext_.reset();
offScreenSurface_.reset(); //offScreenSurface_.reset();
} }
bool GraphicsWindowEx::releaseContextImplementation() { bool GraphicsWindowEx::releaseContextImplementation() {
LOG_INFO("releaseContextImplementation, self={}", spdlog::fmt_lib::ptr(this)); //LOG_INFO("releaseContextImplementation, self={}", spdlog::fmt_lib::ptr(this));
QOpenGLFramebufferObject::bindDefault();
offScreenContext_->doneCurrent(); //QOpenGLFramebufferObject::bindDefault();
//offScreenContext_->doneCurrent();
return true; return true;
} }
void GraphicsWindowEx::swapBuffersImplementation() { void GraphicsWindowEx::swapBuffersImplementation() {
offScreenContext_->functions()->glFinish(); //offScreenContext_->functions()->glFinish();
frameBufferId_ = renderFramebuffer_->texture(); //frameBufferId_ = renderFramebuffer_->texture();
if (!isRenderDonwn_) { //if (!isRenderDonwn_) {
return; // return;
} //}
qSwap(renderFramebuffer_, sharedFrameBuffer_); //qSwap(renderFramebuffer_, sharedFrameBuffer_);
isRenderDonwn_ = false; //isRenderDonwn_ = false;
} }
bool GraphicsWindowEx::SetSharedContext(QOpenGLContext* sharedContext) { bool GraphicsWindowEx::SetSharedContext(QOpenGLContext* sharedContext) {
sharedContext_ = sharedContext; sharedContext_ = sharedContext;
InitOffScreenContext();
return true; return true;
} }

View File

@ -13,6 +13,7 @@
class GraphicsWindowEx : public osgViewer::GraphicsWindowEmbedded { class GraphicsWindowEx : public osgViewer::GraphicsWindowEmbedded {
public: public:
GraphicsWindowEx(osg::GraphicsContext::Traits* traits);
GraphicsWindowEx(int x, int y, int width, int height); GraphicsWindowEx(int x, int y, int width, int height);
~GraphicsWindowEx() override; ~GraphicsWindowEx() override;

View File

@ -12,7 +12,7 @@ bool s_gBChecked = false;
bool OSGEnv::init() { bool OSGEnv::init() {
osgEarth::initialize(); osgEarth::initialize();
const osgEarth::Capabilities& csCapabilities = osgEarth::Registry::instance()->getCapabilities(); /*const osgEarth::Capabilities& csCapabilities = osgEarth::Registry::instance()->getCapabilities();
s_gBChecked = csCapabilities.supportsGLSL(); s_gBChecked = csCapabilities.supportsGLSL();
if (!s_gBChecked) { if (!s_gBChecked) {
return(s_gBChecked); return(s_gBChecked);
@ -45,7 +45,7 @@ bool OSGEnv::init() {
format.setSwapInterval(traits.vsync ? 1 : 0); format.setSwapInterval(traits.vsync ? 1 : 0);
format.setStereo(traits.quadBufferStereo ? 1 : 0); format.setStereo(traits.quadBufferStereo ? 1 : 0);
QSurfaceFormat::setDefaultFormat(format); QSurfaceFormat::setDefaultFormat(format);*/
osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image"); osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image");
return true; return true;

View File

@ -33,14 +33,18 @@
#include <QWheelEvent> #include <QWheelEvent>
#include <osgViewer/GraphicsWindow> #include <osgViewer/GraphicsWindow>
#include <osgEarth/GLUtils>
#include "config.h" #include "config.h"
#include "common/SpdLogger.h" #include "common/SpdLogger.h"
#include "workspace/WorkSpaceManager.h"
OSGRenderer::OSGRenderer(QObject* parent) OSGRenderer::OSGRenderer(QObject* parent)
: QObject(parent), osgViewer::Viewer() { : QObject(parent), osgViewer::Viewer() {
setThreadingModel(osgViewer::Viewer::SingleThreaded);
connect(this, &OSGRenderer::Initialized, &WorkSpaceManager::Get(), &WorkSpaceManager::OnRendererLoaded);
setRealizeOperation(new osgEarth::GL3RealizeOperation());
} }
OSGRenderer::~OSGRenderer() OSGRenderer::~OSGRenderer()
@ -63,15 +67,16 @@ void OSGRenderer::Init(osg::GraphicsContext* gc) {
getCamera()->setReadBuffer(GL_BACK); getCamera()->setReadBuffer(GL_BACK);
getCamera()->setProjectionMatrixAsPerspective(45, 1.0, 0.01, 100.); getCamera()->setProjectionMatrixAsPerspective(45, 1.0, 0.01, 100.);
isInited_ = true; isInited_ = true;
emit Initialized(this);
} }
void OSGRenderer::Resize(GraphicsWindowEx* 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));
dyt_check(nullptr != gc);
if (!isInited_) { if (!isInited_) {
return; return;
} }
LOG_INFO("OSGRenderer::Resize {}, gc:{}", isInited_, spdlog::fmt_lib::ptr(gc));
dyt_check(nullptr != gc);
gc->ReizeWindow(width, height); gc->ReizeWindow(width, height);
} }

View File

@ -65,6 +65,7 @@ public:
bool event(QEvent* event) override; bool event(QEvent* event) override;
Q_SIGNALS: Q_SIGNALS:
void Initialized(OSGRenderer* viewer);
void RenderFlush(); void RenderFlush();
private: private:

View File

@ -49,6 +49,11 @@ static const char* fragmentShaderSource =
OsgOpenGLWindow::OsgOpenGLWindow(QWidget* parent) OsgOpenGLWindow::OsgOpenGLWindow(QWidget* parent)
: QOpenGLWindow(QOpenGLWindow::NoPartialUpdate, nullptr) { : QOpenGLWindow(QOpenGLWindow::NoPartialUpdate, nullptr) {
widget_ = QWidget::createWindowContainer(this); 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()); gw_ = new GraphicsWindowEx(0, 0, width(), height());
renderer_ = new OSGRenderer(this); renderer_ = new OSGRenderer(this);
connect(renderer_, &OSGRenderer::RenderFlush, this, &OsgOpenGLWindow::OnRenderFlush, Qt::QueuedConnection); connect(renderer_, &OSGRenderer::RenderFlush, this, &OsgOpenGLWindow::OnRenderFlush, Qt::QueuedConnection);

View File

@ -35,18 +35,25 @@
OsgViewWidget::OsgViewWidget(QWidget* parent /*= nullptr*/) OsgViewWidget::OsgViewWidget(QWidget* parent /*= nullptr*/)
: QGLWidget(parent) { : QGLWidget(parent) {
osgEarth::initialize(); //osgEarth::initialize();
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; osg::ref_ptr<osg::DisplaySettings> ds = osg::DisplaySettings::instance();
osg::ref_ptr<osg::GraphicsContext::Traits> traits
= new osg::GraphicsContext::Traits(ds);
traits->x = 0; traits->x = 0;
traits->y = 0; traits->y = 0;
traits->width = width(); traits->width = width();
traits->height = height(); traits->height = height();
traits->doubleBuffer = true; traits->alpha = ds->getMinimumNumAlphaBits();
//traits->depth = 32; traits->stencil = ds->getMinimumNumStencilBits();
//traits->samples = 16; traits->sampleBuffers = 2/*ds->getMultiSamples()*/;//_numMultiSamples osg default was 0
traits->sharedContext = nullptr; traits->samples = 4/*ds->getNumMultiSamples()*/;//_numMultiSamples osg default was 0
traits->setInheritedWindowPixelFormat = true; gw_ = new GraphicsWindowEx(traits);
//gw_ = new GraphicsWindowEx(traits.get());
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); 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) { void OsgViewWidget::resizeGL(int width, int height) {
gw_->getEventQueue()->windowResize(0, 0, width, height); gw_->getEventQueue()->windowResize(0, 0, width, height);
gw_->resized(0, 0, width, height); gw_->resized(0, 0, width, height);

View File

@ -50,7 +50,7 @@ signals:
void signalScaleInfo(const QString&); void signalScaleInfo(const QString&);
protected: protected:
void init(); void initializeGL();
void resizeGL(int width, int height) override; void resizeGL(int width, int height) override;
void keyPressEvent(QKeyEvent* event) override; void keyPressEvent(QKeyEvent* event) override;
void keyReleaseEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override;

View File

@ -4,7 +4,7 @@
#include <QApplication> #include <QApplication>
#include <osg/BlendFunc> #include <osg/BlendFunc>
#include <osgEarth/GLUtils> //#include <osgEarth/GLUtils>
#include <osgDB/Registry> #include <osgDB/Registry>
#include "common/SpdLogger.h" #include "common/SpdLogger.h"
@ -18,18 +18,17 @@ constexpr QEvent::Type sOsgViewUpdateEvent{ QEvent::Type(QEvent::User + 1) };
OsgViewer::OsgViewer(QObject* parent) noexcept OsgViewer::OsgViewer(QObject* parent) noexcept
: QObject(parent) : QObject(parent)
, compositeViewer_(new osgViewer::CompositeViewer) { , viewer_(new osgViewer::Viewer) {
LOG_INFO("actor, self={}", fmt::ptr(this)); LOG_INFO("actor, self={}", fmt::ptr(this));
compositeViewer_->setKeyEventSetsDone(0); viewer_->setKeyEventSetsDone(0);
//compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false); //compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false);
osgEarth::initialize();
osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image"); osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image");
compositeViewer_->setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded); viewer_->setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded);
} }
OsgViewer::~OsgViewer() { OsgViewer::~OsgViewer() {
compositeViewer_ = nullptr; viewer_ = nullptr;
LOG_INFO("dctor, self={}", fmt::ptr(this)); 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) { void OsgViewer::OnFrame(void) {
return; assert(nullptr != viewer_);
assert(nullptr != compositeViewer_);
WorkSpaceManager::Get().OnFrame(); WorkSpaceManager::Get().OnFrame();
if (IsDone()) { if (IsDone()) {
RenderUpdate(); RenderUpdate();
compositeViewer_->frame(); viewer_->frame();
} }
qApp->postEvent(this, new QEvent(sOsgViewUpdateEvent)); 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<WId>(winHandle), "dytView"); view->InitGraphiceWindow(x, y, width, height, reinterpret_cast<WId>(winHandle), "dytView");
OnAddView(view, x, y, width, height); //OnAddView(view, x, y, width, height);
//compositeViewer_->setRealizeOperation(new osgEarth::GL3RealizeOperation()); //compositeViewer_->setRealizeOperation(new osgEarth::GL3RealizeOperation());
return view; return view;
} }
@ -70,12 +72,12 @@ void OsgViewer::DestroyView(OsgView* osgView) {
return; return;
} }
OnRemoveView(osgView); //OnRemoveView(osgView);
} }
bool OsgViewer::IsDone() const { bool OsgViewer::IsDone() const {
assert(nullptr != compositeViewer_); assert(nullptr != viewer_);
bool done = compositeViewer_->done(); bool done = viewer_->done();
return !done && initalized_; return !done && initalized_;
} }
@ -92,7 +94,7 @@ bool OsgViewer::Initialize(void) {
return initalized_; return initalized_;
} }
initalized_ = true; initalized_ = true;
compositeViewer_->setRealizeOperation(new osgEarth::GL3RealizeOperation()); //compositeViewer_->setRealizeOperation(new osgEarth::GL3RealizeOperation());
return initalized_; return initalized_;
} }
@ -138,29 +140,29 @@ void OsgViewer::customEvent(QEvent* event) {
} }
void OsgViewer::OnStartPlay() { void OsgViewer::OnStartPlay() {
compositeViewer_->setStartTick(0); viewer_->setStartTick(0);
} }
void OsgViewer::OnAddView(OsgView* osgView, int x, int y, int width, int height) { //void OsgViewer::OnAddView(OsgView* osgView, int x, int y, int width, int height) {
osgViewer::View* view = new osgViewer::View; // osgViewer::View* view = new osgViewer::View;
osgView->InitView(view); // osgView->InitView(view);
//
compositeViewer_->addView(view); // viewer_->addView(view);
osgViews_.insert(osgView); // osgViews_.insert(osgView);
} //}
//
void OsgViewer::OnRemoveView(OsgView* osgView) { //void OsgViewer::OnRemoveView(OsgView* osgView) {
if (nullptr == osgView || nullptr == osgView->GetView()) { // if (nullptr == osgView || nullptr == osgView->GetView()) {
LOG_WARN("osgview is nullptr or getview is nullptr"); // LOG_WARN("osgview is nullptr or getview is nullptr");
return; // return;
} // }
//
osgViews_.erase(osgView); // osgViews_.erase(osgView);
compositeViewer_->removeView(osgView->GetView()); // compositeViewer_->removeView(osgView->GetView());
} //}
void OsgViewer::RenderUpdate() { void OsgViewer::RenderUpdate() {
osg::FrameStamp* frameStamp = compositeViewer_->getFrameStamp(); osg::FrameStamp* frameStamp = viewer_->getFrameStamp();
double dt = frameStamp->getSimulationTime(); double dt = frameStamp->getSimulationTime();
for (auto render : updateRenderList_) { for (auto render : updateRenderList_) {
render->Render(dt); render->Render(dt);

View File

@ -4,7 +4,7 @@
#include <QObject> #include <QObject>
#include <osgViewer/CompositeViewer> #include <osgViewer/Viewer>
#include <osgViewer/GraphicsWindow> #include <osgViewer/GraphicsWindow>
#include "app/Singleton.h" #include "app/Singleton.h"
@ -20,6 +20,7 @@ public:
~OsgViewer() override; ~OsgViewer() override;
void OnDestory(); void OnDestory();
osgViewer::Viewer* GetViewer(void) const;
void OnFrame(void); void OnFrame(void);
class OsgView* CreateView(int x, int y, int width, int height, void* winHandle); class OsgView* CreateView(int x, int y, int width, int height, void* winHandle);
void DestroyView(OsgView* view); void DestroyView(OsgView* view);
@ -38,12 +39,12 @@ protected:
void OnStartPlay(); void OnStartPlay();
void OnAddView(OsgView* view, int x, int y, int width, int height); //void OnAddView(OsgView* view, int x, int y, int width, int height);
void OnRemoveView(OsgView* view); //void OnRemoveView(OsgView* view);
void RenderUpdate(); void RenderUpdate();
private: private:
osg::ref_ptr<osgViewer::CompositeViewer> compositeViewer_; osg::ref_ptr<osgViewer::Viewer> viewer_;
bool initalized_{ false }; bool initalized_{ false };
using OsgViewSet = std::set<OsgView*>; using OsgViewSet = std::set<OsgView*>;

View File

@ -196,108 +196,6 @@ void QtOsgViewWidget::keyReleaseEvent(QKeyEvent* event) {
view_->KeyRelease(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) { void QtOsgViewWidget::Initialize(void) {
if (view_) { if (view_) {
LOG_INFO("view is created"); LOG_INFO("view is created");
@ -314,40 +212,38 @@ void QtOsgViewWidget::Initialize(void) {
setMouseTracking(true); 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<osgEarth::Util::EarthManipulator*>(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<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); //OsgCameraManipulator* cameraManipulator = new OsgCameraManipulator(manipulator, this);
view_->Initialize(cameraManipulator); //view_->Initialize(cameraManipulator);
OsgViewUI* viewUI = view_->GetViewUI(); //OsgViewUI* viewUI = view_->GetViewUI();
dyt_check(nullptr != viewUI); //dyt_check(nullptr != viewUI);
viewUI->AddUI(activeScene_->GetOrCreateSceneUI()); //viewUI->AddUI(activeScene_->GetOrCreateSceneUI());
} }
void QtOsgViewWidget::Uninitialize(void) { void QtOsgViewWidget::Uninitialize(void) {
@ -362,13 +258,13 @@ void QtOsgViewWidget::Uninitialize(void) {
} }
} }
void QtOsgViewWidget::LoadDefaultScene(void) { //void QtOsgViewWidget::LoadDefaultScene(void) {
dyt_check(nullptr != activeScene_); // dyt_check(nullptr != activeScene_);
if (nullptr == WorkSpaceManager::Get().LoadDefaultWorkspace(activeScene_)) { // if (nullptr == WorkSpaceManager::Get().LoadDefaultWorkspace(activeScene_)) {
LOG_ERROR("load default workspace failed"); // LOG_ERROR("load default workspace failed");
QMessageBox::warning(this, tr("warning"), tr("default workspace failed")); // QMessageBox::warning(this, tr("warning"), tr("default workspace failed"));
} // }
} //}
void QtOsgViewWidget::OnLoadDyt(const QString& path) { void QtOsgViewWidget::OnLoadDyt(const QString& path) {
LOG_INFO("load dyt path:{}", path.toStdString()); LOG_INFO("load dyt path:{}", path.toStdString());

View File

@ -3,9 +3,6 @@
// #include <QGLWidget> // #include <QGLWidget>
#include <QWidget> #include <QWidget>
#include "scene/OEScene.h"
#include "scene/ScaleBarHandler.h"
class QMouseEvent; class QMouseEvent;
class QWheelEvent; class QWheelEvent;
@ -13,7 +10,7 @@ class QKeyEvent;
class QInputEvent; class QInputEvent;
class QResizeEvent; class QResizeEvent;
class QtOsgViewWidget : public QWidget, public ScaleBarHandler::Delegate { class QtOsgViewWidget : public QWidget {
Q_OBJECT Q_OBJECT
public: public:
explicit QtOsgViewWidget(QWidget* parent = nullptr); explicit QtOsgViewWidget(QWidget* parent = nullptr);
@ -24,12 +21,10 @@ public:
return nullptr; return nullptr;
} }
void OnComputeScale() override;
void Initialize(void); void Initialize(void);
void Uninitialize(void); void Uninitialize(void);
void LoadDefaultScene(void); //void LoadDefaultScene(void);
void OnLoadDyt(const QString& path); void OnLoadDyt(const QString& path);
//void setKeyboardModifiers(QInputEvent* event); //void setKeyboardModifiers(QInputEvent* event);
@ -47,8 +42,6 @@ protected:
private: private:
class OsgView* view_{ nullptr }; class OsgView* view_{ nullptr };
osg::ref_ptr<OEScene> activeScene_;
class WorkSpace* workspace_{ nullptr }; class WorkSpace* workspace_{ nullptr };
ScaleBarHandler::Delegate::Units scaleUnits_{ ScaleBarHandler::Delegate::Units::UNITS_METERS };
float devicePixelRatio_{ 1.0f }; float devicePixelRatio_{ 1.0f };
}; };

View File

@ -36,70 +36,65 @@
ViewWidget::ViewWidget(QWidget* parent /*= nullptr*/) ViewWidget::ViewWidget(QWidget* parent /*= nullptr*/)
: OsgViewWidget(parent) { : OsgViewWidget(parent) {
//osg::DisplaySettings::instance()->setNumMultiSamples(16); //osg::DisplaySettings::instance()->setNumMultiSamples(16);
setKeyEventSetsDone(0); //setKeyEventSetsDone(0);
//
////osg::ref_ptr<osg::Viewport> viewPort = new osg::Viewport(0, 0, width(), height());
////getCamera()->setViewport(viewPort);
osg::ref_ptr<osg::Viewport> viewPort = new osg::Viewport(0, 0, width(), height()); //getCamera()->setProjectionMatrixAsPerspective(30.0f,
getCamera()->setViewport(viewPort); // static_cast<double>(width()) / static_cast<double>(height()), 1.0f, 10000.0f);
//getCamera()->setGraphicsContext(getGraphicsWindow());
getCamera()->setProjectionMatrixAsPerspective(30.0f, //setRealizeOperation(new osgEarth::GL3RealizeOperation());
static_cast<double>(width()) / static_cast<double>(height()), 1.0f, 10000.0f);
getCamera()->setGraphicsContext(getGraphicsWindow());
setRealizeOperation(new osgEarth::GL3RealizeOperation());
//setThreadingModel(osgViewer::ViewerBase::SingleThreaded); //setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
//getCamera()->setNearFarRatio(0.0000001); //getCamera()->setNearFarRatio(0.0000001);
//getCamera()->setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES);//); //getCamera()->setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES);//);
} }
void ViewWidget::Initialize(void) { void ViewWidget::Initialize(void) {
OEScene* activeScene_ = new OEScene; // OEScene* activeScene_ = new OEScene;
activeScene_->AttachView(this); // activeScene_->AttachView(this);
activeScene_->InitEventHandle(this); // activeScene_->InitEventHandle(this);
const osg::Viewport* viewport = getCamera()->getViewport(); // const osg::Viewport* viewport = getCamera()->getViewport();
osg::Viewport::value_type width = viewport->width(); // osg::Viewport::value_type width = viewport->width();
osg::Viewport::value_type height = viewport->height(); // osg::Viewport::value_type height = viewport->height();
viewUI_ = new OsgViewUI(this, width, height); // viewUI_ = new OsgViewUI(this, width, height);
osg::Group* root = getSceneData()->asGroup(); // osg::Group* root = getSceneData()->asGroup();
dyt_check(nullptr != root); // dyt_check(nullptr != root);
root->addChild(viewUI_.get()); // root->addChild(viewUI_.get());
osgEarth::Util::EarthManipulator* manipulator = new osgEarth::Util::EarthManipulator; // osgEarth::Util::EarthManipulator* manipulator = new osgEarth::Util::EarthManipulator;
/* connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, [](WorkSpace* workspace) { ///* connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, [](WorkSpace* workspace) {
LOG_INFO("WorkSpaceChanged"); // LOG_INFO("WorkSpaceChanged");
if (nullptr == workspace) { // if (nullptr == workspace) {
return; // return;
} // }
OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator(); // OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator();
if (nullptr == manipulator) { // if (nullptr == manipulator) {
LOG_WARN("manipulator is nullptr"); // LOG_WARN("manipulator is nullptr");
return; // return;
} // }
osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator(); // osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator();
osgEarth::Util::EarthManipulator* ccm = dynamic_cast<osgEarth::Util::EarthManipulator*>(gaManipulator); // osgEarth::Util::EarthManipulator* ccm = dynamic_cast<osgEarth::Util::EarthManipulator*>(gaManipulator);
if (nullptr == ccm) { // if (nullptr == ccm) {
LOG_WARN("ccm is nullptr"); // LOG_WARN("ccm is nullptr");
return; // return;
} // }
ccm->setViewpoint(workspace->GetHomeViewpoint(), 3.0); // ccm->setViewpoint(workspace->GetHomeViewpoint(), 3.0);
} // }
); // );
OsgCameraManipulator* cameraManipulator = new OsgCameraManipulator(manipulator, this); // OsgCameraManipulator* cameraManipulator = new OsgCameraManipulator(manipulator, this);
view_->Initialize(cameraManipulator);*/ // view_->Initialize(cameraManipulator);*/
setCameraManipulator(manipulator); // setCameraManipulator(manipulator);
//
viewUI_->AddUI(activeScene_->GetOrCreateSceneUI()); // viewUI_->AddUI(activeScene_->GetOrCreateSceneUI());
} }
void ViewWidget::Uninitialize(void) { void ViewWidget::Uninitialize(void) {
} }
void ViewWidget::paintGL() {
frame();
update();
}

View File

@ -6,7 +6,7 @@
#include "viewer/OsgViewWidget.h" #include "viewer/OsgViewWidget.h"
class ViewWidget : public OsgViewWidget, public osgViewer::Viewer { class ViewWidget : public OsgViewWidget {
Q_OBJECT Q_OBJECT
public: public:
explicit ViewWidget(QWidget* parent = nullptr); explicit ViewWidget(QWidget* parent = nullptr);
@ -14,10 +14,4 @@ public:
void Initialize(void) override; void Initialize(void) override;
void Uninitialize(void) override; void Uninitialize(void) override;
protected:
void paintGL() override;
private:
osg::ref_ptr<class OsgViewUI> viewUI_;
}; };

View File

@ -1,5 +1,6 @@
#ifndef OSGQOPENGLWIDGET_H #pragma once
#define OSGQOPENGLWIDGET_H
#if 0
#ifdef __APPLE__ #ifdef __APPLE__
# define __glext_h_ # define __glext_h_
@ -22,7 +23,6 @@
#include <QReadWriteLock> #include <QReadWriteLock>
class OSGRenderer; class OSGRenderer;
#if 0
namespace osgViewer namespace osgViewer
{ {
@ -86,5 +86,3 @@ protected:
private: private:
}; };
#endif #endif
#endif // OSGQOPENGLWIDGET_H

View File

@ -169,6 +169,18 @@ void WorkSpaceManager::OnFrame() {
lastTime_ = t; 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() { QString WorkSpaceManager::GetDefaultWorkSpaceName() {
#if _DEBUG #if _DEBUG
const QString iniFile = QString("%1workspace/config.ini").arg(QString(CONFIG_PATH)).arg(skin); const QString iniFile = QString("%1workspace/config.ini").arg(QString(CONFIG_PATH)).arg(skin);

View File

@ -5,7 +5,8 @@
#include <QObject> #include <QObject>
#include "app/Singleton.h" #include "app/Singleton.h"
#include "scene/OEScene.h"
#include "viewer/OSGRenderer.h"
#include "ui/chartPlot/DYTChart.h" #include "ui/chartPlot/DYTChart.h"
#include "ui/Table/targetlistwgt.h" #include "ui/Table/targetlistwgt.h"
@ -31,6 +32,8 @@ public:
void OnFrame(); void OnFrame();
void OnRendererLoaded(OSGRenderer* renderer);
signals: signals:
void WorkSpaceChanged(WorkSpace*); void WorkSpaceChanged(WorkSpace*);
@ -38,8 +41,9 @@ private:
QString GetDefaultWorkSpaceName(); QString GetDefaultWorkSpaceName();
private: private:
osg::ref_ptr<class OEScene> scene_;
osg::observer_ptr<OSGRenderer> renderer_;
std::unordered_map<QString, WorkSpace*> workSpaces_; std::unordered_map<QString, WorkSpace*> workSpaces_;
class OEScene* scene_{ nullptr };
WorkSpace* current_{ nullptr }; WorkSpace* current_{ nullptr };
int64_t lastTime_{ 0 }; int64_t lastTime_{ 0 };
}; };