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

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

View File

@ -7,6 +7,7 @@
#include <osgEarth/ModelNode>
#include <osgEarth/Sky>
#include <osgEarth/LogarithmicDepthBuffer>
#include <osgViewer/Viewer>
//#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<osg::TextureCubeMap> LoadCubeMapTextures(const std::string& dir);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -33,14 +33,18 @@
#include <QWheelEvent>
#include <osgViewer/GraphicsWindow>
#include <osgEarth/GLUtils>
#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);
}

View File

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

View File

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

View File

@ -35,18 +35,25 @@
OsgViewWidget::OsgViewWidget(QWidget* parent /*= nullptr*/)
: QGLWidget(parent) {
osgEarth::initialize();
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
//osgEarth::initialize();
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->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);

View File

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

View File

@ -4,7 +4,7 @@
#include <QApplication>
#include <osg/BlendFunc>
#include <osgEarth/GLUtils>
//#include <osgEarth/GLUtils>
#include <osgDB/Registry>
#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<WId>(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);

View File

@ -4,7 +4,7 @@
#include <QObject>
#include <osgViewer/CompositeViewer>
#include <osgViewer/Viewer>
#include <osgViewer/GraphicsWindow>
#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<osgViewer::CompositeViewer> compositeViewer_;
osg::ref_ptr<osgViewer::Viewer> viewer_;
bool initalized_{ false };
using OsgViewSet = std::set<OsgView*>;

View File

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

View File

@ -3,9 +3,6 @@
// #include <QGLWidget>
#include <QWidget>
#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<OEScene> activeScene_;
class WorkSpace* workspace_{ nullptr };
ScaleBarHandler::Delegate::Units scaleUnits_{ ScaleBarHandler::Delegate::Units::UNITS_METERS };
float devicePixelRatio_{ 1.0f };
};

View File

@ -36,70 +36,65 @@
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);
//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());
//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);
// 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<osgEarth::Util::EarthManipulator*>(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<osgEarth::Util::EarthManipulator*>(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();
}

View File

@ -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<class OsgViewUI> viewUI_;
};

View File

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

View File

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

View File

@ -5,7 +5,8 @@
#include <QObject>
#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<class OEScene> scene_;
osg::observer_ptr<OSGRenderer> renderer_;
std::unordered_map<QString, WorkSpace*> workSpaces_;
class OEScene* scene_{ nullptr };
WorkSpace* current_{ nullptr };
int64_t lastTime_{ 0 };
};