From 71b118e7fb2874cf2405df3b71038e2c04e63071 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 17 Jan 2020 14:44:36 +0100 Subject: [PATCH] #5273 Allen Diagrams: Create special geometry for Allen NNC results --- .../ModelVisualization/RivFaultPartMgr.cpp | 77 +++++++++++++++++-- .../ModelVisualization/RivFaultPartMgr.h | 8 +- .../RivNNCGeometryGenerator.cpp | 11 ++- .../RivNNCGeometryGenerator.h | 8 +- .../RivReservoirFaultsPartMgr.cpp | 18 ++++- .../ReservoirDataModel/RigNNCData.cpp | 8 ++ .../ReservoirDataModel/RigNNCData.h | 3 +- 7 files changed, 119 insertions(+), 14 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp b/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp index efd6ea40bf..93fa4a2058 100644 --- a/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp @@ -72,13 +72,22 @@ RivFaultPartMgr::RivFaultPartMgr( const RigGridBase* grid, m_nativeFaultGenerator = new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), true ); m_oppositeFaultGenerator = new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), false ); - m_NNCGenerator = new RivNNCGeometryGenerator( grid->mainGrid()->nncData(), + m_nativeFaultFacesTextureCoords = new cvf::Vec2fArray; + m_oppositeFaultFacesTextureCoords = new cvf::Vec2fArray; + + m_NNCGenerator = new RivNNCGeometryGenerator( false, + grid->mainGrid()->nncData(), grid->mainGrid()->displayModelOffset(), connIdxes.p() ); - m_nativeFaultFacesTextureCoords = new cvf::Vec2fArray; - m_oppositeFaultFacesTextureCoords = new cvf::Vec2fArray; - m_NNCTextureCoords = new cvf::Vec2fArray; + m_NNCTextureCoords = new cvf::Vec2fArray; + + m_allenNNCGenerator = new RivNNCGeometryGenerator( true, + grid->mainGrid()->nncData(), + grid->mainGrid()->displayModelOffset(), + connIdxes.p() ); + + m_allenNNCTextureCoords = new cvf::Vec2fArray; } //-------------------------------------------------------------------------------------------------- @@ -89,6 +98,7 @@ void RivFaultPartMgr::setCellVisibility( cvf::UByteArray* cellVisibilities ) m_nativeFaultGenerator->setCellVisibility( cellVisibilities ); m_oppositeFaultGenerator->setCellVisibility( cellVisibilities ); m_NNCGenerator->setCellVisibility( cellVisibilities, m_grid.p() ); + m_allenNNCGenerator->setCellVisibility( cellVisibilities, m_grid.p() ); generatePartGeometry(); } @@ -397,6 +407,34 @@ void RivFaultPartMgr::generatePartGeometry() } } + { + cvf::ref geo = m_allenNNCGenerator->generateSurface(); + if ( geo.notNull() ) + { + geo->computeNormals(); + + if ( useBufferObjects ) + { + geo->setRenderMode( cvf::DrawableGeo::BUFFER_OBJECT ); + } + + cvf::ref part = new cvf::Part; + part->setName( "Allen NNC in Fault. Grid " + cvf::String( static_cast( m_grid->gridIndex() ) ) ); + part->setDrawable( geo.p() ); + + // Set mapping from triangle face index to cell index + cvf::ref si = new RivSourceInfo( m_rimFault, m_grid->gridIndex() ); + si->m_NNCIndices = m_allenNNCGenerator->triangleToNNCIndex().p(); + part->setSourceInfo( si.p() ); + + part->updateBoundingBox(); + part->setEnableMask( faultBit ); + part->setPriority( RivPartPriority::PartType::Nnc ); + + m_allenNNCFaces = part; + } + } + createLabelWithAnchorLine( m_nativeFaultFaces.p() ); updatePartEffect(); @@ -449,7 +487,9 @@ void RivFaultPartMgr::updatePartEffect() m_nativeFaultFaces->setPriority( RivPartPriority::PartType::TransparentFault ); if ( m_oppositeFaultFaces.notNull() ) m_oppositeFaultFaces->setPriority( RivPartPriority::PartType::TransparentFault ); + if ( m_NNCFaces.notNull() ) m_NNCFaces->setPriority( RivPartPriority::PartType::TransparentNnc ); + if ( m_allenNNCFaces.notNull() ) m_allenNNCFaces->setPriority( RivPartPriority::PartType::TransparentNnc ); if ( m_nativeFaultGridLines.notNull() ) { @@ -643,7 +683,15 @@ void RivFaultPartMgr::appendMeshLinePartsToModel( cvf::ModelBasicList* model ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RivFaultPartMgr::appendNNCFacesToModel( cvf::ModelBasicList* model ) +void RivFaultPartMgr::appendCompleteNNCFacesToModel( cvf::ModelBasicList* model ) +{ + if ( m_allenNNCFaces.notNull() ) model->addPart( m_allenNNCFaces.p() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivFaultPartMgr::appendNativeNNCFacesToModel( cvf::ModelBasicList* model ) { if ( m_NNCFaces.notNull() ) model->addPart( m_NNCFaces.p() ); } @@ -730,6 +778,12 @@ void RivFaultPartMgr::updateNNCColors( size_t timeStepIndex, RimEclipseCellColor resultType, eclResAddr, nativeTimeStepIndex ); + + m_allenNNCGenerator->textureCoordinates( m_allenNNCTextureCoords.p(), + mapper, + resultType, + eclResAddr, + nativeTimeStepIndex ); } } @@ -750,10 +804,18 @@ void RivFaultPartMgr::updateNNCColors( size_t timeStepIndex, RimEclipseCellColor nncEffect = nncEffgen.generateCachedEffect(); } - cvf::DrawableGeo* dg = dynamic_cast( m_NNCFaces->drawable() ); - if ( dg ) dg->setTextureCoordArray( m_NNCTextureCoords.p() ); + { + cvf::DrawableGeo* dg = dynamic_cast( m_NNCFaces->drawable() ); + if ( dg ) dg->setTextureCoordArray( m_NNCTextureCoords.p() ); + } + + { + cvf::DrawableGeo* dg = dynamic_cast( m_allenNNCFaces->drawable() ); + if ( dg ) dg->setTextureCoordArray( m_allenNNCTextureCoords.p() ); + } m_NNCFaces->setEffect( nncEffect.p() ); + m_allenNNCFaces->setEffect( nncEffect.p() ); } else { @@ -780,5 +842,6 @@ void RivFaultPartMgr::updateNNCColors( size_t timeStepIndex, RimEclipseCellColor } m_NNCFaces->setEffect( nncEffect.p() ); + m_allenNNCFaces->setEffect( nncEffect.p() ); } } diff --git a/ApplicationCode/ModelVisualization/RivFaultPartMgr.h b/ApplicationCode/ModelVisualization/RivFaultPartMgr.h index d7b7cd57a5..c39a6d2759 100644 --- a/ApplicationCode/ModelVisualization/RivFaultPartMgr.h +++ b/ApplicationCode/ModelVisualization/RivFaultPartMgr.h @@ -68,10 +68,12 @@ public: void appendNativeFaultFacesToModel( cvf::ModelBasicList* model ); void appendOppositeFaultFacesToModel( cvf::ModelBasicList* model ); - void appendNNCFacesToModel( cvf::ModelBasicList* model ); void appendLabelPartsToModel( cvf::ModelBasicList* model ); void appendMeshLinePartsToModel( cvf::ModelBasicList* model ); + void appendNativeNNCFacesToModel( cvf::ModelBasicList* model ); + void appendCompleteNNCFacesToModel( cvf::ModelBasicList* model ); + private: void generatePartGeometry(); void updatePartEffect(); @@ -108,6 +110,10 @@ private: cvf::ref m_NNCFaces; cvf::ref m_NNCTextureCoords; + cvf::ref m_allenNNCGenerator; + cvf::ref m_allenNNCFaces; + cvf::ref m_allenNNCTextureCoords; + cvf::ref m_faultLabelPart; cvf::ref m_faultLabelLinePart; }; diff --git a/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.cpp b/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.cpp index bb6557a1b2..b9e9b633e5 100644 --- a/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.cpp +++ b/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.cpp @@ -31,10 +31,12 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RivNNCGeometryGenerator::RivNNCGeometryGenerator( const RigNNCData* nncData, +RivNNCGeometryGenerator::RivNNCGeometryGenerator( bool includeAllen, + const RigNNCData* nncData, const cvf::Vec3d& offset, const cvf::Array* nncIndexes ) - : m_nncData( nncData ) + : m_includeAllenDiagramGeometry( includeAllen ) + , m_nncData( nncData ) , m_nncIndexes( nncIndexes ) , m_offset( offset ) { @@ -86,6 +88,11 @@ void RivNNCGeometryGenerator::computeArrays() { size_t conIdx = m_nncIndexes.isNull() ? nIdx : ( *m_nncIndexes )[nIdx]; + if ( !m_includeAllenDiagramGeometry && conIdx >= m_nncData->nativeConnectionCount() ) + { + continue; + } + const RigConnection& conn = m_nncData->connections()[conIdx]; if ( conn.m_polygon.size() ) diff --git a/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.h b/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.h index dcf611763a..d0c254b67a 100644 --- a/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.h +++ b/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.h @@ -42,7 +42,11 @@ class RigEclipseResultAddress; class RivNNCGeometryGenerator : public cvf::Object { public: - RivNNCGeometryGenerator( const RigNNCData* nncData, const cvf::Vec3d& offset, const cvf::Array* nncIndexes ); + RivNNCGeometryGenerator( bool includeAllen, + const RigNNCData* nncData, + const cvf::Vec3d& offset, + const cvf::Array* nncIndexes ); + ~RivNNCGeometryGenerator() override; void setCellVisibility( const cvf::UByteArray* cellVisibilities, const RigGridBase* grid ); @@ -63,6 +67,8 @@ private: void computeArrays(); private: + bool m_includeAllenDiagramGeometry; + // Input cvf::cref m_nncData; cvf::cref> m_nncIndexes; diff --git a/ApplicationCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp b/ApplicationCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp index b262418706..4618f32454 100644 --- a/ApplicationCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp @@ -154,7 +154,9 @@ void RivReservoirFaultsPartMgr::appendPartsToModel( cvf::ModelBasicList* model ) { if ( faultCollection->showNNCs() ) { - bool showNncs = true; + bool showNncs = true; + bool showAllenNncGeometry = false; + if ( faultCollection->hideNncsWhenNoResultIsAvailable() ) { RigEclipseResultAddress eclipseResultAddress; @@ -167,6 +169,11 @@ void RivReservoirFaultsPartMgr::appendPartsToModel( cvf::ModelBasicList* model ) eclipseResultAddress = cellResultColors->eclipseResultAddress(); } + if ( eclipseResultAddress.m_resultCatType == RiaDefines::ALLEN_DIAGRAMS ) + { + showAllenNncGeometry = true; + } + RigMainGrid* mainGrid = m_reservoirView->mainGrid(); if ( !( mainGrid && mainGrid->nncData()->hasScalarValues( eclipseResultAddress ) ) ) { @@ -176,7 +183,14 @@ void RivReservoirFaultsPartMgr::appendPartsToModel( cvf::ModelBasicList* model ) if ( showNncs ) { - rivFaultPart->appendNNCFacesToModel( &parts ); + if ( showAllenNncGeometry ) + { + rivFaultPart->appendCompleteNNCFacesToModel( &parts ); + } + else + { + rivFaultPart->appendNativeNNCFacesToModel( &parts ); + } } } } diff --git a/ApplicationCode/ReservoirDataModel/RigNNCData.cpp b/ApplicationCode/ReservoirDataModel/RigNNCData.cpp index 4e71d558e7..d48771aa18 100644 --- a/ApplicationCode/ReservoirDataModel/RigNNCData.cpp +++ b/ApplicationCode/ReservoirDataModel/RigNNCData.cpp @@ -94,6 +94,14 @@ void RigNNCData::setConnections( std::vector& connections ) m_connections = connections; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RigNNCData::nativeConnectionCount() const +{ + return m_nativeConnectionCount; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigNNCData.h b/ApplicationCode/ReservoirDataModel/RigNNCData.h index fceecd086a..b92b6b277a 100644 --- a/ApplicationCode/ReservoirDataModel/RigNNCData.h +++ b/ApplicationCode/ReservoirDataModel/RigNNCData.h @@ -50,7 +50,8 @@ public: void processNativeConnections( const RigMainGrid& mainGrid ); void computeCompleteSetOfNncs( const RigMainGrid* mainGrid ); - void setConnections( std::vector& connections ); + void setConnections( std::vector& connections ); + size_t nativeConnectionCount() const; const std::vector& connections() const;