#5865 Fault and NNC performance : Build NNC geometry when needed

This commit is contained in:
Magne Sjaastad 2020-05-04 15:00:14 +02:00
parent 943d977298
commit 6d9985d2ef
2 changed files with 120 additions and 62 deletions

View File

@ -64,6 +64,11 @@ RivFaultPartMgr::RivFaultPartMgr( const RigGridBase* grid,
, m_rimFault( rimFault )
, m_opacityLevel( 1.0f )
, m_defaultColor( cvf::Color3::WHITE )
, m_isNativeFaultsGenerated( false )
, m_isOppositeFaultsGenerated( false )
, m_isNativeNncsGenerated( false )
, m_isAllNncsGenerated( false )
{
CVF_ASSERT( rimFault->faultGeometry() );
cvf::ref<cvf::Array<size_t>> connIdxes = new cvf::Array<size_t>;
@ -100,7 +105,7 @@ void RivFaultPartMgr::setCellVisibility( cvf::UByteArray* cellVisibilities )
m_NNCGenerator->setCellVisibility( cellVisibilities, m_grid.p() );
m_allenNNCGenerator->setCellVisibility( cellVisibilities, m_grid.p() );
generatePartGeometry();
clearFlags();
}
//--------------------------------------------------------------------------------------------------
@ -379,73 +384,96 @@ void RivFaultPartMgr::generatePartGeometry()
}
}
{
cvf::ref<cvf::DrawableGeo> geo = m_NNCGenerator->generateSurface();
if ( geo.notNull() )
{
geo->computeNormals();
if ( useBufferObjects )
{
geo->setRenderMode( cvf::DrawableGeo::BUFFER_OBJECT );
}
cvf::ref<cvf::Part> part = new cvf::Part;
part->setName( "NNC in Fault. Grid " + cvf::String( static_cast<int>( m_grid->gridIndex() ) ) );
part->setDrawable( geo.p() );
// Set mapping from triangle face index to cell index
cvf::ref<RivSourceInfo> si = new RivSourceInfo( m_rimFault, m_grid->gridIndex() );
si->m_NNCIndices = m_NNCGenerator->triangleToNNCIndex().p();
part->setSourceInfo( si.p() );
part->updateBoundingBox();
part->setEnableMask( faultBit );
part->setPriority( RivPartPriority::PartType::Nnc );
cvf::ref<cvf::Effect> eff = new cvf::Effect;
part->setEffect( eff.p() );
m_NNCFaces = part;
}
}
{
cvf::ref<cvf::DrawableGeo> geo = m_allenNNCGenerator->generateSurface();
if ( geo.notNull() )
{
geo->computeNormals();
if ( useBufferObjects )
{
geo->setRenderMode( cvf::DrawableGeo::BUFFER_OBJECT );
}
cvf::ref<cvf::Part> part = new cvf::Part;
part->setName( "Allen NNC in Fault. Grid " + cvf::String( static_cast<int>( m_grid->gridIndex() ) ) );
part->setDrawable( geo.p() );
// Set mapping from triangle face index to cell index
cvf::ref<RivSourceInfo> 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 );
cvf::ref<cvf::Effect> eff = new cvf::Effect;
part->setEffect( eff.p() );
m_allenNNCFaces = part;
}
}
m_isNativeFaultsGenerated = true;
m_isOppositeFaultsGenerated = true;
createLabelWithAnchorLine( m_nativeFaultFaces.p() );
updatePartEffect();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RivFaultPartMgr::generateNativeNncPartGeometry()
{
cvf::ref<cvf::DrawableGeo> geo = m_NNCGenerator->generateSurface();
if ( geo.notNull() )
{
geo->computeNormals();
geo->setRenderMode( cvf::DrawableGeo::BUFFER_OBJECT );
cvf::ref<cvf::Part> part = new cvf::Part;
part->setName( "NNC in Fault. Grid " + cvf::String( static_cast<int>( m_grid->gridIndex() ) ) );
part->setDrawable( geo.p() );
// Set mapping from triangle face index to cell index
cvf::ref<RivSourceInfo> si = new RivSourceInfo( m_rimFault, m_grid->gridIndex() );
si->m_NNCIndices = m_NNCGenerator->triangleToNNCIndex().p();
part->setSourceInfo( si.p() );
part->updateBoundingBox();
part->setEnableMask( faultBit );
part->setPriority( RivPartPriority::PartType::Nnc );
cvf::ref<cvf::Effect> eff = new cvf::Effect;
part->setEffect( eff.p() );
m_NNCFaces = part;
updatePartEffect();
}
m_isNativeNncsGenerated = true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RivFaultPartMgr::generateAllNncPartGeometry()
{
cvf::ref<cvf::DrawableGeo> geo = m_allenNNCGenerator->generateSurface();
if ( geo.notNull() )
{
geo->computeNormals();
geo->setRenderMode( cvf::DrawableGeo::BUFFER_OBJECT );
cvf::ref<cvf::Part> part = new cvf::Part;
part->setName( "Allen NNC in Fault. Grid " + cvf::String( static_cast<int>( m_grid->gridIndex() ) ) );
part->setDrawable( geo.p() );
// Set mapping from triangle face index to cell index
cvf::ref<RivSourceInfo> 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 );
cvf::ref<cvf::Effect> eff = new cvf::Effect;
part->setEffect( eff.p() );
m_allenNNCFaces = part;
updatePartEffect();
}
m_isAllNncsGenerated = true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RivFaultPartMgr::clearFlags()
{
m_isNativeFaultsGenerated = false;
m_isOppositeFaultsGenerated = false;
m_isNativeNncsGenerated = false;
m_isAllNncsGenerated = false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -651,6 +679,11 @@ cvf::Vec3f RivFaultPartMgr::findClosestVertex( const cvf::Vec3f& point, const cv
//--------------------------------------------------------------------------------------------------
void RivFaultPartMgr::appendNativeFaultFacesToModel( cvf::ModelBasicList* model )
{
if ( !m_isNativeFaultsGenerated )
{
generatePartGeometry();
}
if ( m_nativeFaultFaces.notNull() )
{
model->addPart( m_nativeFaultFaces.p() );
@ -662,6 +695,11 @@ void RivFaultPartMgr::appendNativeFaultFacesToModel( cvf::ModelBasicList* model
//--------------------------------------------------------------------------------------------------
void RivFaultPartMgr::appendOppositeFaultFacesToModel( cvf::ModelBasicList* model )
{
if ( !m_isOppositeFaultsGenerated )
{
generatePartGeometry();
}
if ( m_oppositeFaultFaces.notNull() )
{
model->addPart( m_oppositeFaultFaces.p() );
@ -691,6 +729,11 @@ void RivFaultPartMgr::appendMeshLinePartsToModel( cvf::ModelBasicList* model )
//--------------------------------------------------------------------------------------------------
void RivFaultPartMgr::appendCompleteNNCFacesToModel( cvf::ModelBasicList* model )
{
if ( !m_isAllNncsGenerated )
{
generateAllNncPartGeometry();
}
if ( m_allenNNCFaces.notNull() ) model->addPart( m_allenNNCFaces.p() );
}
@ -699,6 +742,11 @@ void RivFaultPartMgr::appendCompleteNNCFacesToModel( cvf::ModelBasicList* model
//--------------------------------------------------------------------------------------------------
void RivFaultPartMgr::appendNativeNNCFacesToModel( cvf::ModelBasicList* model )
{
if ( !m_isNativeNncsGenerated )
{
generateNativeNncPartGeometry();
}
if ( m_NNCFaces.notNull() ) model->addPart( m_NNCFaces.p() );
}

View File

@ -71,6 +71,12 @@ public:
private:
void generatePartGeometry();
void generateNativeNncPartGeometry();
void generateAllNncPartGeometry();
void clearFlags();
void updatePartEffect();
void updateNNCColors( size_t timeStepIndex, RimEclipseCellColors* cellResultColors );
@ -91,20 +97,24 @@ private:
cvf::ref<cvf::UByteArray> m_cellVisibility;
bool m_isNativeFaultsGenerated;
cvf::ref<RivFaultGeometryGenerator> m_nativeFaultGenerator;
cvf::ref<cvf::Part> m_nativeFaultFaces;
cvf::ref<cvf::Part> m_nativeFaultGridLines;
cvf::ref<cvf::Vec2fArray> m_nativeFaultFacesTextureCoords;
bool m_isOppositeFaultsGenerated;
cvf::ref<RivFaultGeometryGenerator> m_oppositeFaultGenerator;
cvf::ref<cvf::Part> m_oppositeFaultFaces;
cvf::ref<cvf::Part> m_oppositeFaultGridLines;
cvf::ref<cvf::Vec2fArray> m_oppositeFaultFacesTextureCoords;
bool m_isNativeNncsGenerated;
cvf::ref<RivNNCGeometryGenerator> m_NNCGenerator;
cvf::ref<cvf::Part> m_NNCFaces;
cvf::ref<cvf::Vec2fArray> m_NNCTextureCoords;
bool m_isAllNncsGenerated;
cvf::ref<RivNNCGeometryGenerator> m_allenNNCGenerator;
cvf::ref<cvf::Part> m_allenNNCFaces;
cvf::ref<cvf::Vec2fArray> m_allenNNCTextureCoords;