2015-04-29 10:50:25 +02:00
#include "RimView.h"
#include "cafPdmObjectFactory.h"
2015-04-29 22:19:49 +02:00
#include "RiaApplication.h"
#include "RiaPreferences.h"
#include "Rim3dOverlayInfoConfig.h"
#include "RiuViewer.h"
2015-04-30 10:34:15 +02:00
#include "RiuMainWindow.h"
#include "cafCeetronPlusNavigation.h"
#include "cafCadNavigation.h"
#include "cvfCamera.h"
2015-06-11 13:44:21 +02:00
#include "cvfModel.h"
#include "cvfModelBasicList.h"
#include "cvfPart.h"
#include "cvfScene.h"
2015-04-30 10:34:15 +02:00
#include "cvfViewport.h"
2015-05-08 10:38:10 +02:00
#include "cafFrameAnimationControl.h"
2015-04-29 22:19:49 +02:00
2015-05-11 09:48:55 +02:00
#include <limits.h>
2015-05-13 22:42:11 +02:00
#include "RimOilField.h"
#include "RimWellPathCollection.h"
#include "RimProject.h"
#include "RivWellPathCollectionPartMgr.h"
2015-05-11 09:48:55 +02:00
2015-05-08 14:13:26 +02:00
namespace caf {
template <>
void caf :: AppEnum < RimView :: MeshModeType >:: setUp ()
{
addItem ( RimView :: FULL_MESH , "FULL_MESH" , "All" );
addItem ( RimView :: FAULTS_MESH , "FAULTS_MESH" , "Faults only" );
addItem ( RimView :: NO_MESH , "NO_MESH" , "None" );
setDefault ( RimView :: FULL_MESH );
}
template <>
void caf :: AppEnum < RimView :: SurfaceModeType >:: setUp ()
{
addItem ( RimView :: SURFACE , "SURFACE" , "All" );
addItem ( RimView :: FAULTS , "FAULTS" , "Faults only" );
addItem ( RimView :: NO_SURFACE , "NO_SURFACE" , "None" );
setDefault ( RimView :: SURFACE );
}
} // End namespace caf
2015-05-15 18:51:49 +02:00
#include "cafPdmAbstractClassSourceInit.h"
2015-05-08 14:13:26 +02:00
2015-04-29 22:19:49 +02:00
CAF_PDM_ABSTRACT_SOURCE_INIT ( RimView , "GenericView" ); // Do not use. Abstract class
2015-04-29 10:50:25 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimView :: RimView ( void )
{
2015-04-29 22:19:49 +02:00
RiaApplication * app = RiaApplication :: instance ();
RiaPreferences * preferences = app -> preferences ();
CVF_ASSERT ( preferences );
CAF_PDM_InitField ( & name , "UserDescription" , QString ( "" ), "Name" , "" , "" , "" );
CAF_PDM_InitField ( & showWindow , "ShowWindow" , true , "Show 3D viewer" , "" , "" , "" );
showWindow . setUiHidden ( true );
CAF_PDM_InitField ( & cameraPosition , "CameraPosition" , cvf :: Mat4d :: IDENTITY , "" , "" , "" , "" );
double defaultScaleFactor = 1.0 ;
if ( preferences ) defaultScaleFactor = preferences -> defaultScaleFactorZ ;
CAF_PDM_InitField ( & scaleZ , "GridZScale" , defaultScaleFactor , "Z Scale" , "" , "Scales the scene in the Z direction" , "" );
cvf :: Color3f defBackgColor = preferences -> defaultViewerBackgroundColor ();
CAF_PDM_InitField ( & backgroundColor , "ViewBackgroundColor" , defBackgColor , "Background" , "" , "" , "" );
CAF_PDM_InitField ( & maximumFrameRate , "MaximumFrameRate" , 10 , "Maximum frame rate" , "" , "" , "" );
maximumFrameRate . setUiHidden ( true );
2015-06-09 16:18:11 +02:00
CAF_PDM_InitField ( & hasUserRequestedAnimation , "AnimationMode" , false , "Animation Mode" , "" , "" , "" );
hasUserRequestedAnimation . setUiHidden ( true );
2015-04-29 22:19:49 +02:00
CAF_PDM_InitField ( & m_currentTimeStep , "CurrentTimeStep" , 0 , "Current Time Step" , "" , "" , "" );
m_currentTimeStep . setUiHidden ( true );
CAF_PDM_InitFieldNoDefault ( & overlayInfoConfig , "OverlayInfoConfig" , "Info Box" , "" , "" , "" );
overlayInfoConfig = new Rim3dOverlayInfoConfig ();
overlayInfoConfig -> setReservoirView ( this );
2015-05-08 14:13:26 +02:00
caf :: AppEnum < RimView :: MeshModeType > defaultMeshType = NO_MESH ;
if ( preferences -> defaultGridLines ) defaultMeshType = FULL_MESH ;
CAF_PDM_InitField ( & meshMode , "MeshMode" , defaultMeshType , "Grid lines" , "" , "" , "" );
CAF_PDM_InitFieldNoDefault ( & surfaceMode , "SurfaceMode" , "Grid surface" , "" , "" , "" );
2015-04-29 10:50:25 +02:00
2015-05-08 14:13:26 +02:00
m_previousGridModeMeshLinesWasFaults = false ;
2015-04-29 10:50:25 +02:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimView ::~ RimView ( void )
{
2015-04-30 10:34:15 +02:00
delete this -> overlayInfoConfig ();
if ( m_viewer )
{
RiuMainWindow :: instance () -> removeViewer ( m_viewer );
}
delete m_viewer ;
2015-04-29 10:50:25 +02:00
}
2015-04-29 22:19:49 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiuViewer * RimView :: viewer ()
{
return m_viewer ;
}
2015-04-30 10:34:15 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: updateViewerWidget ()
{
if ( showWindow ())
{
bool isViewerCreated = false ;
if ( ! m_viewer )
{
QGLFormat glFormat ;
glFormat . setDirectRendering ( RiaApplication :: instance () -> useShaders ());
m_viewer = new RiuViewer ( glFormat , NULL );
m_viewer -> setOwnerReservoirView ( this );
RiuMainWindow :: instance () -> addViewer ( m_viewer );
m_viewer -> setMinNearPlaneDistance ( 10 );
this -> resetLegendsInViewer ();
if ( RiaApplication :: instance () -> navigationPolicy () == RiaApplication :: NAVIGATION_POLICY_CEETRON )
{
m_viewer -> setNavigationPolicy ( new caf :: CeetronPlusNavigation );
}
else
{
m_viewer -> setNavigationPolicy ( new caf :: CadNavigation );
}
m_viewer -> enablePerfInfoHud ( RiaApplication :: instance () -> showPerformanceInfo ());
isViewerCreated = true ;
}
RiuMainWindow :: instance () -> setActiveViewer ( m_viewer );
if ( isViewerCreated ) m_viewer -> mainCamera () -> setViewMatrix ( cameraPosition );
m_viewer -> mainCamera () -> viewport () -> setClearColor ( cvf :: Color4f ( backgroundColor ()));
m_viewer -> update ();
}
else
{
if ( m_viewer )
{
if ( m_viewer -> layoutWidget () -> parentWidget ())
{
m_viewer -> layoutWidget () -> parentWidget () -> hide ();
}
else
{
m_viewer -> layoutWidget () -> hide ();
}
}
}
updateViewerWidgetWindowTitle ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: scheduleCreateDisplayModelAndRedraw ()
{
RiaApplication :: instance () -> scheduleDisplayModelUpdateAndRedraw ( this );
}
2015-05-08 10:38:10 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: setCurrentTimeStep ( int frameIndex )
{
m_currentTimeStep = frameIndex ;
2015-06-09 16:18:11 +02:00
this -> hasUserRequestedAnimation = true ;
2015-05-08 10:38:10 +02:00
this -> updateCurrentTimeStep ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: updateCurrentTimeStepAndRedraw ()
{
this -> updateCurrentTimeStep ();
if ( m_viewer ) m_viewer -> update ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: createDisplayModelAndRedraw ()
{
if ( m_viewer )
{
this -> clampCurrentTimestep ();
createDisplayModel ();
updateDisplayModelVisibility ();
}
RiuMainWindow :: instance () -> refreshAnimationActions ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: setDefaultView ()
{
if ( m_viewer )
{
m_viewer -> setDefaultView ();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: endAnimation ()
{
2015-06-09 16:18:11 +02:00
this -> hasUserRequestedAnimation = false ;
2015-05-08 10:38:10 +02:00
this -> updateStaticCellColors ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: setupBeforeSave ()
{
if ( m_viewer )
{
2015-06-09 16:18:11 +02:00
hasUserRequestedAnimation = m_viewer -> isAnimationActive (); // JJS: This is not conceptually correct. The variable is updated as we go, and store the user intentions. But I guess that in practice...
2015-05-08 10:38:10 +02:00
cameraPosition = m_viewer -> mainCamera () -> viewMatrix ();
}
}
2015-04-30 10:34:15 +02:00
2015-05-08 14:13:26 +02:00
//--------------------------------------------------------------------------------------------------
///
// Surf: No Fault Surf
// Mesh -------------
// No F F G
// Fault F F G
// Mesh G G G
//
//--------------------------------------------------------------------------------------------------
bool RimView :: isGridVisualizationMode () const
{
return ( this -> surfaceMode () == SURFACE
|| this -> meshMode () == FULL_MESH );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: setMeshOnlyDrawstyle ()
{
if ( isGridVisualizationMode ())
{
meshMode . setValueFromUi ( FULL_MESH );
}
else
{
meshMode . setValueFromUi ( FAULTS_MESH );
}
surfaceMode . setValueFromUi ( NO_SURFACE );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: setMeshSurfDrawstyle ()
{
if ( isGridVisualizationMode ())
{
surfaceMode . setValueFromUi ( SURFACE );
meshMode . setValueFromUi ( FULL_MESH );
}
else
{
surfaceMode . setValueFromUi ( FAULTS );
meshMode . setValueFromUi ( FAULTS_MESH );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: setFaultMeshSurfDrawstyle ()
{
// Surf: No Fault Surf
// Mesh -------------
// No FF FF SF
// Fault FF FF SF
// Mesh SF SF SF
if ( this -> isGridVisualizationMode ())
{
surfaceMode . setValueFromUi ( SURFACE );
}
else
{
surfaceMode . setValueFromUi ( FAULTS );
}
meshMode . setValueFromUi ( FAULTS_MESH );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: setSurfOnlyDrawstyle ()
{
if ( isGridVisualizationMode ())
{
surfaceMode . setValueFromUi ( SURFACE );
}
else
{
surfaceMode . setValueFromUi ( FAULTS );
}
meshMode . setValueFromUi ( NO_MESH );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: setShowFaultsOnly ( bool showFaults )
{
if ( showFaults )
{
m_previousGridModeMeshLinesWasFaults = meshMode () == FAULTS_MESH ;
if ( surfaceMode () != NO_SURFACE ) surfaceMode . setValueFromUi ( FAULTS );
if ( meshMode () != NO_MESH ) meshMode . setValueFromUi ( FAULTS_MESH );
}
else
{
if ( surfaceMode () != NO_SURFACE ) surfaceMode . setValueFromUi ( SURFACE );
if ( meshMode () != NO_MESH ) meshMode . setValueFromUi ( m_previousGridModeMeshLinesWasFaults ? FAULTS_MESH : FULL_MESH );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: setSurfaceDrawstyle ()
{
if ( surfaceMode () != NO_SURFACE ) surfaceMode . setValueFromUi ( SURFACE );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView :: fieldChangedByUi ( const caf :: PdmFieldHandle * changedField , const QVariant & oldValue , const QVariant & newValue )
{
if ( changedField == & meshMode )
{
createDisplayModel ();
updateDisplayModelVisibility ();
RiuMainWindow :: instance () -> refreshDrawStyleActions ();
}
2015-05-13 22:42:11 +02:00
else if ( changedField == & scaleZ )
{
if ( scaleZ < 1 ) scaleZ = 1 ;
// Regenerate well paths
RimOilField * oilFields = RiaApplication :: instance () -> project () ? RiaApplication :: instance () -> project () -> activeOilField () : NULL ;
RimWellPathCollection * wellPathCollection = ( oilFields ) ? oilFields -> wellPathCollection () : NULL ;
if ( wellPathCollection ) wellPathCollection -> wellPathCollectionPartMgr () -> scheduleGeometryRegen ();
if ( m_viewer )
{
cvf :: Vec3d poi = m_viewer -> pointOfInterest ();
cvf :: Vec3d eye , dir , up ;
eye = m_viewer -> mainCamera () -> position ();
dir = m_viewer -> mainCamera () -> direction ();
up = m_viewer -> mainCamera () -> up ();
eye [ 2 ] = poi [ 2 ] * scaleZ () / this -> scaleTransform () -> worldTransform ()( 2 , 2 ) + ( eye [ 2 ] - poi [ 2 ]);
poi [ 2 ] = poi [ 2 ] * scaleZ () / this -> scaleTransform () -> worldTransform ()( 2 , 2 );
m_viewer -> mainCamera () -> setFromLookAt ( eye , eye + dir , up );
m_viewer -> setPointOfInterest ( poi );
updateScaleTransform ();
createDisplayModelAndRedraw ();
m_viewer -> update ();
}
RiuMainWindow :: instance () -> updateScaleValue ();
}
2015-05-08 14:13:26 +02:00
else if ( changedField == & surfaceMode )
{
createDisplayModel ();
updateDisplayModelVisibility ();
RiuMainWindow :: instance () -> refreshDrawStyleActions ();
}
else if ( changedField == & name )
{
updateViewerWidgetWindowTitle ();
}
else if ( changedField == & m_currentTimeStep )
{
if ( m_viewer )
{
m_viewer -> update ();
}
}
else if ( changedField == & backgroundColor )
{
if ( viewer () != NULL )
{
updateViewerWidget ();
}
}
else if ( changedField == & maximumFrameRate )
{
// !! Use cvf::UNDEFINED_INT or something if we end up with frame rate 0?
// !! Should be able to specify legal range for number properties
if ( m_viewer )
{
m_viewer -> animationControl () -> setTimeout ( maximumFrameRate != 0 ? 1000 / maximumFrameRate : INT_MAX );
}
}
}
2015-06-11 13:44:21 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2015-06-12 09:25:09 +02:00
void RimView :: addWellPathsToScene ( cvf :: Scene * scene , const cvf :: Vec3d & displayModelOffset ,
double characteristicCellSize , const cvf :: BoundingBox & wellPathClipBoundingBox ,
cvf :: Transform * scaleTransform )
2015-06-11 13:44:21 +02:00
{
CVF_ASSERT ( scene );
CVF_ASSERT ( scaleTransform );
2015-04-29 10:50:25 +02:00
2015-06-11 13:44:21 +02:00
cvf :: String wellPathModelName = "WellPathModel" ;
std :: vector < cvf :: Model *> wellPathModels ;
for ( cvf :: uint i = 0 ; i < scene -> modelCount (); i ++ )
{
if ( scene -> model ( i ) -> name () == wellPathModelName )
{
wellPathModels . push_back ( scene -> model ( i ));
}
}
2015-04-29 10:50:25 +02:00
2015-06-11 13:44:21 +02:00
for ( size_t i = 0 ; i < wellPathModels . size (); i ++ )
{
scene -> removeModel ( wellPathModels [ i ]);
}
// Append static Well Paths to model
cvf :: ref < cvf :: ModelBasicList > wellPathModelBasicList = new cvf :: ModelBasicList ;
wellPathModelBasicList -> setName ( wellPathModelName );
RimOilField * oilFields = RiaApplication :: instance () -> project () ? RiaApplication :: instance () -> project () -> activeOilField () : NULL ;
RimWellPathCollection * wellPathCollection = oilFields ? oilFields -> wellPathCollection () : NULL ;
RivWellPathCollectionPartMgr * wellPathCollectionPartMgr = wellPathCollection ? wellPathCollection -> wellPathCollectionPartMgr () : NULL ;
if ( wellPathCollectionPartMgr )
{
2015-06-12 09:25:09 +02:00
wellPathCollectionPartMgr -> appendStaticGeometryPartsToModel ( wellPathModelBasicList . p (), displayModelOffset ,
scaleTransform , characteristicCellSize , wellPathClipBoundingBox );
2015-06-11 13:44:21 +02:00
}
wellPathModelBasicList -> updateBoundingBoxesRecursive ();
scene -> addModel ( wellPathModelBasicList . p ());
}