2015-04-29 03:50:25 -05:00
# include "RimView.h"
# include "cafPdmObjectFactory.h"
2015-04-29 15:19:49 -05:00
# include "RiaApplication.h"
# include "RiaPreferences.h"
# include "Rim3dOverlayInfoConfig.h"
# include "RiuViewer.h"
2015-04-30 03:34:15 -05:00
# include "RiuMainWindow.h"
# include "cvfCamera.h"
2015-06-11 06:44:21 -05:00
# include "cvfModel.h"
# include "cvfModelBasicList.h"
# include "cvfPart.h"
# include "cvfScene.h"
2015-04-30 03:34:15 -05:00
# include "cvfViewport.h"
2015-05-08 03:38:10 -05:00
# include "cafFrameAnimationControl.h"
2015-04-29 15:19:49 -05:00
2015-05-11 02:48:55 -05:00
# include <limits.h>
2015-05-13 15:42:11 -05:00
# include "RimOilField.h"
# include "RimWellPathCollection.h"
# include "RimProject.h"
# include "RivWellPathCollectionPartMgr.h"
2015-05-11 02:48:55 -05:00
2015-05-08 07:13:26 -05: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 11:51:49 -05:00
# include "cafPdmAbstractClassSourceInit.h"
2015-05-08 07:13:26 -05:00
2015-04-29 15:19:49 -05:00
CAF_PDM_ABSTRACT_SOURCE_INIT ( RimView , " GenericView " ) ; // Do not use. Abstract class
2015-04-29 03:50:25 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimView : : RimView ( void )
{
2015-04-29 15:19:49 -05: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 " , " " , " " , " " ) ;
2015-07-31 11:58:23 -05:00
showWindow . capability < caf : : PdmUiFieldHandle > ( ) - > setUiHidden ( true ) ;
2015-04-29 15:19:49 -05:00
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 " , " " , " " , " " ) ;
2015-07-31 11:58:23 -05:00
maximumFrameRate . capability < caf : : PdmUiFieldHandle > ( ) - > setUiHidden ( true ) ;
2015-06-09 09:18:11 -05:00
CAF_PDM_InitField ( & hasUserRequestedAnimation , " AnimationMode " , false , " Animation Mode " , " " , " " , " " ) ;
2015-07-31 11:58:23 -05:00
hasUserRequestedAnimation . capability < caf : : PdmUiFieldHandle > ( ) - > setUiHidden ( true ) ;
2015-04-29 15:19:49 -05:00
CAF_PDM_InitField ( & m_currentTimeStep , " CurrentTimeStep " , 0 , " Current Time Step " , " " , " " , " " ) ;
2015-07-31 11:58:23 -05:00
m_currentTimeStep . capability < caf : : PdmUiFieldHandle > ( ) - > setUiHidden ( true ) ;
2015-04-29 15:19:49 -05:00
CAF_PDM_InitFieldNoDefault ( & overlayInfoConfig , " OverlayInfoConfig " , " Info Box " , " " , " " , " " ) ;
overlayInfoConfig = new Rim3dOverlayInfoConfig ( ) ;
overlayInfoConfig - > setReservoirView ( this ) ;
2015-05-08 07:13:26 -05: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 03:50:25 -05:00
2015-06-18 06:20:54 -05:00
CAF_PDM_InitField ( & m_disableLighting , " DisableLighting " , false , " Disable Results Lighting " , " " , " Disable light model for scalar result colors " , " " ) ;
2015-06-17 08:04:55 -05:00
2015-05-08 07:13:26 -05:00
m_previousGridModeMeshLinesWasFaults = false ;
2015-04-29 03:50:25 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimView : : ~ RimView ( void )
{
2015-04-30 03:34:15 -05:00
delete this - > overlayInfoConfig ( ) ;
if ( m_viewer )
{
RiuMainWindow : : instance ( ) - > removeViewer ( m_viewer ) ;
}
delete m_viewer ;
2015-04-29 03:50:25 -05:00
}
2015-04-29 15:19:49 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiuViewer * RimView : : viewer ( )
{
return m_viewer ;
}
2015-04-30 03:34:15 -05: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 ( ) ;
2015-07-02 05:44:57 -05:00
m_viewer - > updateNavigationPolicy ( ) ;
2015-04-30 03:34:15 -05:00
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 03:38:10 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : setCurrentTimeStep ( int frameIndex )
{
m_currentTimeStep = frameIndex ;
2015-06-09 09:18:11 -05:00
this - > hasUserRequestedAnimation = true ;
2015-05-08 03:38:10 -05:00
this - > updateCurrentTimeStep ( ) ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : updateCurrentTimeStepAndRedraw ( )
{
this - > updateCurrentTimeStep ( ) ;
if ( m_viewer ) m_viewer - > update ( ) ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : createDisplayModelAndRedraw ( )
{
if ( m_viewer )
{
this - > clampCurrentTimestep ( ) ;
createDisplayModel ( ) ;
updateDisplayModelVisibility ( ) ;
}
2015-06-17 08:04:55 -05:00
RiuMainWindow : : instance ( ) - > refreshAnimationActions ( ) ;
2015-05-08 03:38:10 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : setDefaultView ( )
{
if ( m_viewer )
{
m_viewer - > setDefaultView ( ) ;
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : endAnimation ( )
{
2015-06-09 09:18:11 -05:00
this - > hasUserRequestedAnimation = false ;
2015-05-08 03:38:10 -05:00
this - > updateStaticCellColors ( ) ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : setupBeforeSave ( )
{
if ( m_viewer )
{
2015-06-09 09:18:11 -05: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 03:38:10 -05:00
cameraPosition = m_viewer - > mainCamera ( ) - > viewMatrix ( ) ;
}
}
2015-04-30 03:34:15 -05:00
2015-05-08 07:13:26 -05: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 ( ) )
{
2015-07-31 11:58:23 -05:00
uiField ( & meshMode ) - > setValueFromUi ( FULL_MESH ) ;
2015-05-08 07:13:26 -05:00
}
else
{
2015-07-31 11:58:23 -05:00
uiField ( & meshMode ) - > setValueFromUi ( FAULTS_MESH ) ;
2015-05-08 07:13:26 -05:00
}
2015-07-31 11:58:23 -05:00
uiField ( & surfaceMode ) - > setValueFromUi ( NO_SURFACE ) ;
2015-05-08 07:13:26 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : setMeshSurfDrawstyle ( )
{
if ( isGridVisualizationMode ( ) )
{
2015-07-31 11:58:23 -05:00
uiField ( & surfaceMode ) - > setValueFromUi ( SURFACE ) ;
uiField ( & meshMode ) - > setValueFromUi ( FULL_MESH ) ;
2015-05-08 07:13:26 -05:00
}
else
{
2015-07-31 11:58:23 -05:00
uiField ( & surfaceMode ) - > setValueFromUi ( FAULTS ) ;
uiField ( & meshMode ) - > setValueFromUi ( FAULTS_MESH ) ;
2015-05-08 07:13:26 -05:00
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : setFaultMeshSurfDrawstyle ( )
{
// Surf: No Fault Surf
// Mesh -------------
// No FF FF SF
// Fault FF FF SF
// Mesh SF SF SF
if ( this - > isGridVisualizationMode ( ) )
{
2015-07-31 11:58:23 -05:00
uiField ( & surfaceMode ) - > setValueFromUi ( SURFACE ) ;
2015-05-08 07:13:26 -05:00
}
else
{
2015-07-31 11:58:23 -05:00
uiField ( & surfaceMode ) - > setValueFromUi ( FAULTS ) ;
2015-05-08 07:13:26 -05:00
}
2015-07-31 11:58:23 -05:00
uiField ( & meshMode ) - > setValueFromUi ( FAULTS_MESH ) ;
2015-05-08 07:13:26 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : setSurfOnlyDrawstyle ( )
{
if ( isGridVisualizationMode ( ) )
{
2015-07-31 11:58:23 -05:00
uiField ( & surfaceMode ) - > setValueFromUi ( SURFACE ) ;
2015-05-08 07:13:26 -05:00
}
else
{
2015-07-31 11:58:23 -05:00
uiField ( & surfaceMode ) - > setValueFromUi ( FAULTS ) ;
2015-05-08 07:13:26 -05:00
}
2015-07-31 11:58:23 -05:00
uiField ( & meshMode ) - > setValueFromUi ( NO_MESH ) ;
2015-05-08 07:13:26 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : setShowFaultsOnly ( bool showFaults )
{
if ( showFaults )
{
m_previousGridModeMeshLinesWasFaults = meshMode ( ) = = FAULTS_MESH ;
2015-07-31 11:58:23 -05:00
if ( surfaceMode ( ) ! = NO_SURFACE ) uiField ( & surfaceMode ) - > setValueFromUi ( FAULTS ) ;
if ( meshMode ( ) ! = NO_MESH ) uiField ( & meshMode ) - > setValueFromUi ( FAULTS_MESH ) ;
2015-05-08 07:13:26 -05:00
}
else
{
2015-07-31 11:58:23 -05:00
if ( surfaceMode ( ) ! = NO_SURFACE ) uiField ( & surfaceMode ) - > setValueFromUi ( SURFACE ) ;
if ( meshMode ( ) ! = NO_MESH ) uiField ( & meshMode ) - > setValueFromUi ( m_previousGridModeMeshLinesWasFaults ? FAULTS_MESH : FULL_MESH ) ;
2015-05-08 07:13:26 -05:00
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : setSurfaceDrawstyle ( )
{
2015-07-31 11:58:23 -05:00
if ( surfaceMode ( ) ! = NO_SURFACE ) uiField ( & surfaceMode ) - > setValueFromUi ( SURFACE ) ;
2015-05-08 07:13:26 -05:00
}
2015-06-17 08:04:55 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : disableLighting ( bool disable )
{
m_disableLighting = disable ;
updateCurrentTimeStepAndRedraw ( ) ;
updateConnectedEditors ( ) ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimView : : isLightingDisabled ( ) const
{
return m_disableLighting ( ) ;
}
2015-05-08 07:13:26 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView : : fieldChangedByUi ( const caf : : PdmFieldHandle * changedField , const QVariant & oldValue , const QVariant & newValue )
{
if ( changedField = = & meshMode )
{
createDisplayModel ( ) ;
updateDisplayModelVisibility ( ) ;
RiuMainWindow : : instance ( ) - > refreshDrawStyleActions ( ) ;
}
2015-05-13 15:42:11 -05: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 07:13:26 -05:00
else if ( changedField = = & surfaceMode )
{
createDisplayModel ( ) ;
updateDisplayModelVisibility ( ) ;
RiuMainWindow : : instance ( ) - > refreshDrawStyleActions ( ) ;
}
2015-06-17 08:04:55 -05:00
else if ( changedField = = & m_disableLighting )
{
createDisplayModel ( ) ;
RiuMainWindow : : instance ( ) - > refreshDrawStyleActions ( ) ;
}
2015-05-08 07:13:26 -05:00
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 06:44:21 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2015-06-22 02:09:33 -05:00
void RimView : : addWellPathsToModel ( cvf : : ModelBasicList * wellPathModelBasicList ,
const cvf : : Vec3d & displayModelOffset ,
double characteristicCellSize ,
const cvf : : BoundingBox & wellPathClipBoundingBox ,
2015-06-12 02:25:09 -05:00
cvf : : Transform * scaleTransform )
2015-06-11 06:44:21 -05:00
{
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-22 02:09:33 -05:00
wellPathCollectionPartMgr - > appendStaticGeometryPartsToModel ( wellPathModelBasicList ,
displayModelOffset ,
scaleTransform ,
characteristicCellSize ,
wellPathClipBoundingBox ) ;
2015-06-11 06:44:21 -05:00
}
wellPathModelBasicList - > updateBoundingBoxesRecursive ( ) ;
}