mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Merge pull request #8376 from OPM/fault_visibilityupdates
Faults: Add Visibiliy mode for overlapping area
This commit is contained in:
@@ -29,16 +29,20 @@
|
||||
#include "cvfScalarMapper.h"
|
||||
|
||||
#include "RigFault.h"
|
||||
#include "RigNNCData.h"
|
||||
#include "RigNncConnection.h"
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RivFaultGeometryGenerator::RivFaultGeometryGenerator( const cvf::StructGridInterface* grid,
|
||||
const RigFault* fault,
|
||||
RigNNCData* nncData,
|
||||
bool computeNativeFaultFaces )
|
||||
: m_grid( grid )
|
||||
, m_fault( fault )
|
||||
, m_computeNativeFaultFaces( computeNativeFaultFaces )
|
||||
, m_nncData( nncData )
|
||||
{
|
||||
m_quadMapper = new cvf::StructGridQuadToCellFaceMapper;
|
||||
m_triangleMapper = new cvf::StuctGridTriangleToCellFaceMapper( m_quadMapper.p() );
|
||||
@@ -54,9 +58,9 @@ RivFaultGeometryGenerator::~RivFaultGeometryGenerator()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// Generate surface drawable geo from the specified region
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
cvf::ref<cvf::DrawableGeo> RivFaultGeometryGenerator::generateSurface()
|
||||
cvf::ref<cvf::DrawableGeo> RivFaultGeometryGenerator::generateSurface( bool onlyShowFacesWithDefinedNeighbors )
|
||||
{
|
||||
computeArrays();
|
||||
computeArrays( onlyShowFacesWithDefinedNeighbors );
|
||||
|
||||
CVF_ASSERT( m_vertices.notNull() );
|
||||
|
||||
@@ -119,7 +123,28 @@ cvf::ref<cvf::DrawableGeo> RivFaultGeometryGenerator::createOutlineMeshDrawable(
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RivFaultGeometryGenerator::computeArrays()
|
||||
bool RivFaultGeometryGenerator::hasConnection( size_t cellIdx,
|
||||
cvf::StructGridInterface::FaceType face,
|
||||
RigConnectionContainer& conns )
|
||||
{
|
||||
cvf::StructGridInterface::FaceType oppositeFace = cvf::StructGridInterface::oppositeFace( face );
|
||||
|
||||
for ( size_t i = 0; i < conns.size(); i++ )
|
||||
{
|
||||
auto& r = conns[i];
|
||||
|
||||
if ( ( r.c1GlobIdx() == cellIdx ) && ( r.face() == face ) && r.hasCommonArea() ) return true;
|
||||
|
||||
if ( ( r.c2GlobIdx() == cellIdx ) && ( r.face() == oppositeFace ) && r.hasCommonArea() ) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RivFaultGeometryGenerator::computeArrays( bool onlyShowFacesWithDefinedNeighbors )
|
||||
{
|
||||
std::vector<cvf::Vec3f> vertices;
|
||||
m_quadMapper->quadToCellIndexMap().clear();
|
||||
@@ -127,6 +152,8 @@ void RivFaultGeometryGenerator::computeArrays()
|
||||
|
||||
cvf::Vec3d offset = m_grid->displayModelOffset();
|
||||
|
||||
auto& connections = m_nncData->connections();
|
||||
|
||||
const std::vector<RigFault::FaultFace>& faultFaces = m_fault->faultFaces();
|
||||
|
||||
#pragma omp parallel for
|
||||
@@ -135,23 +162,25 @@ void RivFaultGeometryGenerator::computeArrays()
|
||||
size_t cellIndex = faultFaces[fIdx].m_nativeReservoirCellIndex;
|
||||
cvf::StructGridInterface::FaceType face = faultFaces[fIdx].m_nativeFace;
|
||||
|
||||
if ( cellIndex >= m_cellVisibility->size() ) continue;
|
||||
|
||||
if ( !m_computeNativeFaultFaces )
|
||||
{
|
||||
cellIndex = faultFaces[fIdx].m_oppositeReservoirCellIndex;
|
||||
face = cvf::StructGridInterface::oppositeFace( faultFaces[fIdx].m_nativeFace );
|
||||
face = cvf::StructGridInterface::oppositeFace( face );
|
||||
}
|
||||
|
||||
if ( cellIndex >= m_cellVisibility->size() ) continue;
|
||||
|
||||
if ( !( *m_cellVisibility )[cellIndex] ) continue;
|
||||
|
||||
if ( onlyShowFacesWithDefinedNeighbors && !hasConnection( cellIndex, face, connections ) ) continue;
|
||||
|
||||
cvf::Vec3d cornerVerts[8];
|
||||
m_grid->cellCornerVertices( cellIndex, cornerVerts );
|
||||
|
||||
cvf::ubyte faceConn[4];
|
||||
m_grid->cellFaceVertexIndices( face, faceConn );
|
||||
|
||||
// Critical section to avoid two threads accessing the arrays at the same time.
|
||||
// Critical section to avoid two threads accessing the arrays at the same time.
|
||||
#pragma omp critical( critical_section_RivFaultGeometryGenerator_computeArrays )
|
||||
{
|
||||
int n;
|
||||
|
@@ -32,6 +32,8 @@ class Transform;
|
||||
class Part;
|
||||
} // namespace cvf
|
||||
|
||||
class RigNNCData;
|
||||
class RigConnectionContainer;
|
||||
class RigFault;
|
||||
|
||||
//==================================================================================================
|
||||
@@ -42,7 +44,10 @@ class RigFault;
|
||||
class RivFaultGeometryGenerator : public cvf::Object
|
||||
{
|
||||
public:
|
||||
RivFaultGeometryGenerator( const cvf::StructGridInterface* grid, const RigFault* fault, bool computeNativeFaultFaces );
|
||||
RivFaultGeometryGenerator( const cvf::StructGridInterface* grid,
|
||||
const RigFault* fault,
|
||||
RigNNCData* nncData,
|
||||
bool computeNativeFaultFaces );
|
||||
~RivFaultGeometryGenerator() override;
|
||||
|
||||
void setCellVisibility( const cvf::UByteArray* cellVisibilities );
|
||||
@@ -53,18 +58,21 @@ public:
|
||||
const cvf::StuctGridTriangleToCellFaceMapper* triangleToCellFaceMapper() { return m_triangleMapper.p(); }
|
||||
|
||||
// Generated geometry
|
||||
cvf::ref<cvf::DrawableGeo> generateSurface();
|
||||
cvf::ref<cvf::DrawableGeo> generateSurface( bool onlyShowFacesWithDefinedNeighbors );
|
||||
cvf::ref<cvf::DrawableGeo> createMeshDrawable();
|
||||
cvf::ref<cvf::DrawableGeo> createOutlineMeshDrawable( double creaseAngle );
|
||||
|
||||
private:
|
||||
void computeArrays();
|
||||
void computeArrays( bool onlyShowFacesWithDefinedNeighbors );
|
||||
|
||||
bool hasConnection( size_t cellIdx, cvf::StructGridInterface::FaceType face, RigConnectionContainer& conns );
|
||||
|
||||
private:
|
||||
// Input
|
||||
cvf::cref<cvf::StructGridInterface> m_grid;
|
||||
cvf::cref<RigFault> m_fault;
|
||||
cvf::cref<cvf::UByteArray> m_cellVisibility;
|
||||
cvf::ref<RigNNCData> m_nncData;
|
||||
|
||||
bool m_computeNativeFaultFaces;
|
||||
|
||||
|
@@ -24,6 +24,7 @@
|
||||
|
||||
#include "RigCaseCellResultsData.h"
|
||||
#include "RigMainGrid.h"
|
||||
#include "RigNNCData.h"
|
||||
#include "RigResultAccessor.h"
|
||||
|
||||
#include "RimEclipseCase.h"
|
||||
@@ -74,8 +75,11 @@ RivFaultPartMgr::RivFaultPartMgr( const RigGridBase* grid,
|
||||
cvf::ref<cvf::Array<size_t>> connIdxes = new cvf::Array<size_t>;
|
||||
connIdxes->assign( rimFault->faultGeometry()->connectionIndices() );
|
||||
|
||||
m_nativeFaultGenerator = new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), true );
|
||||
m_oppositeFaultGenerator = new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), false );
|
||||
m_nativeFaultGenerator =
|
||||
new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), grid->mainGrid()->nncData(), true );
|
||||
|
||||
m_oppositeFaultGenerator =
|
||||
new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), grid->mainGrid()->nncData(), false );
|
||||
|
||||
m_nativeFaultFacesTextureCoords = new cvf::Vec2fArray;
|
||||
m_oppositeFaultFacesTextureCoords = new cvf::Vec2fArray;
|
||||
@@ -280,7 +284,8 @@ void RivFaultPartMgr::generatePartGeometry()
|
||||
bool useBufferObjects = true;
|
||||
// Surface geometry
|
||||
{
|
||||
cvf::ref<cvf::DrawableGeo> geo = m_nativeFaultGenerator->generateSurface();
|
||||
cvf::ref<cvf::DrawableGeo> geo =
|
||||
m_nativeFaultGenerator->generateSurface( m_rimFaultCollection->onlyShowFacesWithDefinedNeighbor() );
|
||||
if ( geo.notNull() )
|
||||
{
|
||||
geo->computeNormals();
|
||||
@@ -333,7 +338,8 @@ void RivFaultPartMgr::generatePartGeometry()
|
||||
|
||||
// Surface geometry
|
||||
{
|
||||
cvf::ref<cvf::DrawableGeo> geo = m_oppositeFaultGenerator->generateSurface();
|
||||
cvf::ref<cvf::DrawableGeo> geo =
|
||||
m_oppositeFaultGenerator->generateSurface( m_rimFaultCollection->onlyShowFacesWithDefinedNeighbor() );
|
||||
if ( geo.notNull() )
|
||||
{
|
||||
geo->computeNormals();
|
||||
|
@@ -37,6 +37,7 @@ class RimEclipseCellColors;
|
||||
class RimCellEdgeColors;
|
||||
class RimFaultInViewCollection;
|
||||
class RigGridBase;
|
||||
|
||||
class RimFaultInViewCollection;
|
||||
class RimFaultInView;
|
||||
class RivFaultGeometryGenerator;
|
||||
|
@@ -118,8 +118,6 @@ void RivReservoirFaultsPartMgr::appendPartsToModel( cvf::ModelBasicList* model )
|
||||
forceDisplayOfFault = true;
|
||||
}
|
||||
|
||||
// qDebug() << forceDisplayOfFault;
|
||||
|
||||
cvf::ModelBasicList parts;
|
||||
|
||||
for ( size_t i = 0; i < faultCollection->faults.size(); i++ )
|
||||
|
Reference in New Issue
Block a user