From d72861f929df24ce8a2b62dea5775f141d89e5de Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 16 Nov 2015 10:01:50 +0100 Subject: [PATCH] (#266) Show highlight viz models in overlay rendering --- .../ProjectDataModel/RimEclipseView.cpp | 82 +++++++++++-------- .../ProjectDataModel/RimEclipseView.h | 1 + ApplicationCode/UserInterface/RiuViewer.cpp | 77 +++++++++++++++-- ApplicationCode/UserInterface/RiuViewer.h | 13 ++- 4 files changed, 127 insertions(+), 46 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp index 718d4cbce6..9901e407da 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp @@ -483,9 +483,55 @@ void RimEclipseView::createDisplayModel() m_overlayInfoConfig()->update3DInfo(); updateLegends(); } + + createOverlayDisplayModel(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseView::createOverlayDisplayModel() +{ + cvf::ref overlayScene = new cvf::Scene; + + { + cvf::String highlightModelName = "HighLightModel"; + + cvf::ref highlightModelBasicList = new cvf::ModelBasicList; + highlightModelBasicList->setName(highlightModelName); + + RiuSelectionManager* riuSelManager = RiuSelectionManager::instance(); + std::vector items; + riuSelManager->selectedItems(items); + for (size_t i = 0; i < items.size(); i++) + { + if (items[i]->type() == RiuSelectionItem::ECLIPSE_SELECTION_OBJECT) + { + RiuEclipseSelectionItem* eclipseSelItem = static_cast(items[i]); + if (eclipseSelItem && + eclipseSelItem->m_view) + { + CVF_ASSERT(eclipseSelItem->m_view->eclipseCase()); + CVF_ASSERT(eclipseSelItem->m_view->eclipseCase()->reservoirData()); + + RivSingleCellPartGenerator partGen(eclipseSelItem->m_view->eclipseCase()->reservoirData(), eclipseSelItem->m_gridIndex, eclipseSelItem->m_cellIndex); + + cvf::ref part = partGen.createPart(eclipseSelItem->m_color); + part->setTransform(this->scaleTransform()); + + highlightModelBasicList->addPart(part.p()); + } + } + } + + highlightModelBasicList->updateBoundingBoxesRecursive(); + overlayScene->addModel(highlightModelBasicList.p()); + } + + m_viewer->setOverlayScene(overlayScene.p()); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -678,42 +724,6 @@ void RimEclipseView::updateCurrentTimeStep() currentActiveCellInfo()->geometryBoundingBox(), m_reservoirGridPartManager->scaleTransform()); - - { - cvf::String highlightModelName = "HighLightModel"; - - this->removeModelByName(frameScene, highlightModelName); - - cvf::ref highlightModelBasicList = new cvf::ModelBasicList; - highlightModelBasicList->setName(highlightModelName); - - RiuSelectionManager* riuSelManager = RiuSelectionManager::instance(); - std::vector items; - riuSelManager->selectedItems(items); - for (size_t i = 0; i < items.size(); i++) - { - if (items[i]->type() == RiuSelectionItem::ECLIPSE_SELECTION_OBJECT) - { - RiuEclipseSelectionItem* eclipseSelItem = static_cast(items[i]); - if (eclipseSelItem && - eclipseSelItem->m_view) - { - CVF_ASSERT(eclipseSelItem->m_view->eclipseCase()); - CVF_ASSERT(eclipseSelItem->m_view->eclipseCase()->reservoirData()); - - RivSingleCellPartGenerator partGen(eclipseSelItem->m_view->eclipseCase()->reservoirData(), eclipseSelItem->m_gridIndex, eclipseSelItem->m_cellIndex); - - cvf::ref part = partGen.createPart(eclipseSelItem->m_color); - part->setTransform(this->scaleTransform()); - - highlightModelBasicList->addPart(part.p()); - } - } - } - - highlightModelBasicList->updateBoundingBoxesRecursive(); - frameScene->addModel(highlightModelBasicList.p()); - } } } diff --git a/ApplicationCode/ProjectDataModel/RimEclipseView.h b/ApplicationCode/ProjectDataModel/RimEclipseView.h index fd523f5f9e..0c35cef774 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseView.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseView.h @@ -142,6 +142,7 @@ protected: private: void createDisplayModel(); + void createOverlayDisplayModel(); void updateDisplayModelVisibility(); virtual void updateCurrentTimeStep(); diff --git a/ApplicationCode/UserInterface/RiuViewer.cpp b/ApplicationCode/UserInterface/RiuViewer.cpp index 57b991b9ad..25554260fe 100644 --- a/ApplicationCode/UserInterface/RiuViewer.cpp +++ b/ApplicationCode/UserInterface/RiuViewer.cpp @@ -41,6 +41,7 @@ #include "cvfCamera.h" #include "cvfFont.h" #include "cvfOverlayAxisCross.h" +#include "cvfRenderQueueSorter.h" #include "cvfRenderSequence.h" #include "cvfRendering.h" #include "cvfScene.h" @@ -164,6 +165,8 @@ RiuViewer::RiuViewer(const QGLFormat& format, QWidget* parent) setContextMenuPolicy(Qt::PreventContextMenu); m_gridBoxGenerator = new RivGridBoxGenerator; + + setupRenderingSequence(); } @@ -192,21 +195,13 @@ RiuViewer::~RiuViewer() //-------------------------------------------------------------------------------------------------- void RiuViewer::setDefaultView() { - cvf::BoundingBox bb; - - cvf::Scene* scene = m_renderingSequence->firstRendering()->scene(); - if (scene) - { - bb = scene->boundingBox(); - } - + cvf::BoundingBox bb = m_renderingSequence->boundingBox(); if (!bb.isValid()) { bb.add(cvf::Vec3d(-1, -1, -1)); bb.add(cvf::Vec3d( 1, 1, 1)); } - if (m_mainCamera->projection() == cvf::Camera::PERSPECTIVE) { m_mainCamera->setProjectionAsPerspective(40.0, RI_MIN_NEARPLANE_DISTANCE, 1000); @@ -540,3 +535,67 @@ RivGridBoxGenerator* RiuViewer::gridBoxGenerator() const { return m_gridBoxGenerator; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuViewer::setupRenderingSequence() +{ + m_overlayRendering = new cvf::Rendering; + m_overlayRendering->setCamera(new cvf::Camera); + m_overlayRendering->setRenderQueueSorter(new cvf::RenderQueueSorterBasic(cvf::RenderQueueSorterBasic::EFFECT_ONLY)); + m_overlayRendering->setClearMode(cvf::Viewport::DO_NOT_CLEAR); + + // Set fixed function rendering if QGLFormat does not support directRendering + if (!this->format().directRendering()) + { + m_overlayRendering->renderEngine()->enableForcedImmediateMode(true); + } + + m_renderingSequence->addRendering(m_overlayRendering.p()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuViewer::setOverlayScene(cvf::Scene* scene) +{ + m_overlayRendering->setScene(scene); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuViewer::copyCameraView(cvf::Camera* srcCamera, cvf::Camera* dstCamera) +{ + if (srcCamera->projection() == cvf::Camera::PERSPECTIVE) + { + dstCamera->setProjectionAsPerspective(srcCamera->fieldOfViewYDeg(), srcCamera->nearPlane(), srcCamera->farPlane()); + } + else + { + dstCamera->setProjectionAsOrtho(srcCamera->frontPlaneFrustumHeight(), srcCamera->nearPlane(), srcCamera->farPlane()); + } + + dstCamera->setViewMatrix(srcCamera->viewMatrix()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuViewer::optimizeClippingPlanes() +{ + caf::Viewer::optimizeClippingPlanes(); + + copyCameraView(m_mainCamera.p(), m_overlayRendering->camera()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuViewer::resizeGL(int width, int height) +{ + caf::Viewer::resizeGL(width, height); + + m_overlayRendering->camera()->viewport()->set(0, 0, width, height); +} diff --git a/ApplicationCode/UserInterface/RiuViewer.h b/ApplicationCode/UserInterface/RiuViewer.h index a9bec34b4b..b9ca85bb5e 100644 --- a/ApplicationCode/UserInterface/RiuViewer.h +++ b/ApplicationCode/UserInterface/RiuViewer.h @@ -56,6 +56,8 @@ public: RiuViewer(const QGLFormat& format, QWidget* parent); ~RiuViewer(); + void setOverlayScene(cvf::Scene* scene); + void setDefaultView(); cvf::Vec3d pointOfInterest(); void setPointOfInterest(cvf::Vec3d poi); @@ -86,12 +88,20 @@ public slots: virtual void slotSetCurrentFrame(int frameIndex); virtual void slotEndAnimation(); +protected: + virtual void optimizeClippingPlanes(); + virtual void resizeGL(int width, int height); + private: void paintOverlayItems(QPainter* painter); void mouseReleaseEvent(QMouseEvent* event); void mousePressEvent(QMouseEvent* event); + void setupRenderingSequence(); + static void copyCameraView(cvf::Camera* srcCamera, cvf::Camera* dstCamera); + +private: QLabel* m_InfoLabel; QLabel* m_versionInfoLabel; bool m_showInfoText; @@ -103,7 +113,6 @@ private: QCDEStyle* m_progressBarStyle; - cvf::Collection m_visibleLegends; caf::PdmPointer m_rimView; @@ -112,5 +121,7 @@ private: RiuViewerCommands* m_viewerCommands; RivGridBoxGenerator* m_gridBoxGenerator; + + cvf::ref m_overlayRendering; };