-// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
#include "SVTK_Recorder.h"
#include "SVTK_RecorderDlg.h"
-#include "vtkPVAxesWidget.h"
-#include "vtkPVAxesActor.h"
+#include "salomevtkPVAxesWidget.h"
+#include "salomevtkPVAxesActor.h"
-#include "SALOME_ListIteratorOfListIO.hxx"
+#include "SALOME_ListIO.hxx"
#include "VTKViewer_Algorithm.h"
#include "SVTK_Functor.h"
#include <OpenGLUtils_FrameBuffer.h>
+#include <GL/gl.h>
namespace SVTK
{
}
}
-
-
-
-
/*!
Constructor
*/
aRenderer->Delete();
aSelector->Delete();
- myToolBar = toolMgr()->createToolBar( tr("LBL_TOOLBAR_LABEL"), false, Qt::AllToolBarAreas, -1, this );
- myRecordingToolBar = toolMgr()->createToolBar( tr("LBL_TOOLBAR_RECORD_LABEL"), false, Qt::AllToolBarAreas, -1, this );
+ myToolBar = toolMgr()->createToolBar( tr("LBL_TOOLBAR_LABEL"), // title (language-dependant)
+ QString( "VTKViewerViewOperations" ), // name (language-independant)
+ false ); // disable floatable toolbar
+
+ myRecordingToolBar = toolMgr()->createToolBar( tr("LBL_TOOLBAR_RECORD_LABEL"), // title (language-dependant)
+ QString( "VTKRecordingOperations" ), // name (language-independant)
+ false ); // disable floatable toolbar
createActions( SUIT_Session::session()->resourceMgr() );
createToolBar();
myInteractor->setBackgroundRole( QPalette::NoRole );//NoBackground
myInteractor->setFocusPolicy(Qt::StrongFocus);
myInteractor->setFocus();
+ bool isSupportQuadBuffer = SUIT_Session::session()->resourceMgr()->
+ booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
+ myInteractor->getRenderWindow()->SetStereoCapableWindow((int)isSupportQuadBuffer);
setFocusProxy(myInteractor);
myUpdateRateDlg = new SVTK_UpdateRateDlg( getAction( UpdateRate ), this, "SVTK_UpdateRateDlg" );
setCentralWidget(myInteractor);
- myAxesWidget = vtkPVAxesWidget::New();
+ myAxesWidget = salomevtk::vtkPVAxesWidget::New();
myAxesWidget->SetParentRenderer(aRenderer->GetDevice());
myAxesWidget->SetViewport(0, 0, 0.25, 0.25);
myAxesWidget->SetInteractor(myInteractor->GetDevice());
myAxesWidget->SetEnabled(1);
myAxesWidget->SetInteractive(0);
- vtkPVAxesActor* anAxesActor = myAxesWidget->GetAxesActor();
+ salomevtk::vtkPVAxesActor* anAxesActor = myAxesWidget->GetAxesActor();
anAxesActor->GetXAxisTipProperty()->SetColor( 1.0, 0.0, 0.0 );
anAxesActor->GetXAxisShaftProperty()->SetColor( 1.0, 0.0, 0.0 );
anAxesActor->GetXAxisLabelProperty()->SetColor( 1.0, 0.0, 0.0 );
emit transformed( this );
}
+/*!
+ Processes transformation "fit selection"
+*/
+void SVTK_ViewWindow::onFitSelection()
+{
+ GetRenderer()->onFitSelection();
+ Repaint();
+ emit transformed( this );
+}
+
/*!
SLOT: called if selection is changed
*/
/*!
Redirect the request to #SVTK_Renderer::OnViewTrihedron
*/
-void SVTK_ViewWindow::onViewTrihedron()
+void SVTK_ViewWindow::onViewTrihedron(bool show)
{
- GetRenderer()->OnViewTrihedron();
+ GetRenderer()->SetTrihedronVisibility(show);
Repaint();
}
/*!
Sets projection mode
- \param theMode - projection mode ( 0 - orthogonal, 1 - perspective )
+ \param theMode - projection mode ( 0 - orthogonal, 1 - perspective, 2 - stereo )
*/
void SVTK_ViewWindow::SetProjectionMode(const int theMode)
{
- activateProjectionMode( theMode );
+ QtxAction* aParallelAction = dynamic_cast<QtxAction*>( toolMgr()->action( ParallelModeId ) );
+ QtxAction* aProjectionAction = dynamic_cast<QtxAction*>( toolMgr()->action( ProjectionModeId ) );
+ QtxAction* aStereoAction = dynamic_cast<QtxAction*>( toolMgr()->action( StereoModeId ) );
+
+ switch ( theMode ) {
+ case Parallel:
+ onProjectionMode( aParallelAction );
+ break;
+ case Projection:
+ onProjectionMode( aProjectionAction );
+ break;
+ case Stereo:
+ onStereoMode( true );
+ break;
+ }
+
+ // update action state if method is called outside
+ SVTK_Viewer* aViewer = dynamic_cast<SVTK_Viewer*>(myModel);
+ QtxAction* aSwitchZoomingStyle = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchZoomingStyleId ) );
+ if ( theMode == Parallel && !aParallelAction->isChecked() ) {
+ aParallelAction->setChecked( true );
+ aSwitchZoomingStyle->setEnabled(true);
+ aStereoAction->setChecked( false );
+ }
+ if ( theMode == Projection && !aProjectionAction->isChecked() ) {
+ aProjectionAction->setChecked( true );
+ aSwitchZoomingStyle->setEnabled(false);
+ }
+ if ( theMode == Stereo ) {
+ aStereoAction->setChecked( true );
+ if ( aParallelAction->isEnabled() ) {
+ aParallelAction->setEnabled( false );
+ aParallelAction->setChecked( false );
+ aStereoAction->setChecked( false );
+ }
+ else {
+ aParallelAction->setEnabled( true );
+ aStereoAction->setChecked( false );
+ aParallelAction->setChecked( aViewer->projectionMode() == Parallel );
+ }
+ if ( aProjectionAction->isEnabled() ) {
+ aProjectionAction->setEnabled( false );
+ aProjectionAction->setChecked( true );
+ if ( getRenderWindow()->GetStereoCapableWindow() == 1 && !isOpenGlStereoSupport() &&
+ strcmp( "CrystalEyes", getRenderWindow()->GetStereoTypeAsString() ) == 0 &&
+ toolMgr()->action( StereoModeId )->isChecked() ) {
+ SUIT_MessageBox::warning( 0, tr( "WRN_WARNING" ), tr( "WRN_SUPPORT_QUAD_BUFFER" ) );
+ }
+ }
+ else {
+ aProjectionAction->setEnabled( true );
+ aStereoAction->setChecked( false );
+ aProjectionAction->setChecked( aViewer->projectionMode() == Projection );
+ onProjectionMode();
+ }
+ }
+ else {
+ if ( !aParallelAction->isEnabled() )
+ aParallelAction->setEnabled( true );
+ if ( !aProjectionAction->isEnabled() )
+ aProjectionAction->setEnabled( true );
+ }
+}
+
+/*!
+ Sets stereo type
+ \param theType - stereo type
+*/
+void SVTK_ViewWindow::SetStereoType(const int theType)
+{
+ vtkRenderWindow* aWindow = getRenderWindow();
+ switch (theType ) {
+ case CrystalEyes:
+ aWindow->SetStereoTypeToCrystalEyes();
+ break;
+ case RedBlue:
+ aWindow->SetStereoTypeToRedBlue();
+ break;
+ case Interlaced:
+ aWindow->SetStereoTypeToInterlaced();
+ break;
+ case Left:
+ aWindow->SetStereoTypeToLeft();
+ break;
+ case Right:
+ aWindow->SetStereoTypeToRight();
+ break;
+ case Dresden:
+ aWindow->SetStereoTypeToDresden();
+ break;
+ case Anaglyph:
+ aWindow->SetStereoTypeToAnaglyph();
+ break;
+ case Checkerboard:
+ aWindow->SetStereoTypeToCheckerboard();
+ break;
+ case SplitViewPortHorizontal:
+ aWindow->SetStereoTypeToSplitViewportHorizontal();
+ break;
+ }
+}
+
+/*!
+ Sets anaglyph filter
+ \param theFilter - anaglyph filter
+*/
+void SVTK_ViewWindow::SetAnaglyphFilter(const int theFilter)
+{
+ vtkRenderWindow* aWindow = getRenderWindow();
+ switch (theFilter ) {
+ case RedCyan:
+ aWindow->SetAnaglyphColorMask(4,3);
+ break;
+ case YellowBlue:
+ aWindow->SetAnaglyphColorMask(6,1);
+ break;
+ case GreenMagenta:
+ aWindow->SetAnaglyphColorMask(2,5);
+ break;
+ }
}
+/*!
+ Set support quad-buffered stereo
+ \param theEnable - enable/disable support quad-buffered stereo
+*/
+void SVTK_ViewWindow::SetQuadBufferSupport(const bool theEnable)
+{
+ vtkRenderWindow* aWindow = getRenderWindow();
+ aWindow->SetStereoCapableWindow((int)theEnable);
+}
+
+/*!
+ \return OpenGl stereo support
+*/
+bool SVTK_ViewWindow::isOpenGlStereoSupport() const
+{
+ GLboolean support[1];
+ glGetBooleanv (GL_STEREO, support);
+ if ( support[0] )
+ return true;
+ return false;
+}
/*!
Set the gravity center as a focal point
void SVTK_ViewWindow::activateProjectionMode(int theMode)
{
+ QtxAction* aParallelAction = dynamic_cast<QtxAction*>( toolMgr()->action( ParallelModeId ) );
+ QtxAction* aProjectionAction = dynamic_cast<QtxAction*>( toolMgr()->action( ProjectionModeId ) );
if (theMode)
- toolMgr()->action( ProjectionModeId )->setChecked( true );
+ aParallelAction->setChecked( true );
else
- toolMgr()->action( ParallelModeId )->setChecked( true );
+ aProjectionAction->setChecked( true );
+
+ if ( !aParallelAction->isEnabled() )
+ aParallelAction->setEnabled( true );
+ if ( !aProjectionAction->isEnabled() )
+ aProjectionAction->setEnabled( true );
}
/*!
int aWidth = aSize[0];
int aHeight = aSize[1];
+#ifndef DISABLE_GLVIEWER
OpenGLUtils_FrameBuffer aFrameBuffer;
if( aFrameBuffer.init( aWidth, aHeight ) )
{
anImage = anImage.mirrored();
return anImage;
}
+#endif
// if frame buffers are unsupported, use old functionality
unsigned char *aData =
}
/*!
- Set the view projection mode: orthogonal or perspective
+ \brief Set the given projection mode.
+
+ Set the given projection mode: Orthographic or Perspective.
*/
-void SVTK_ViewWindow::onPerspectiveMode()
+void SVTK_ViewWindow::onProjectionMode( QAction* theAction )
{
- bool anIsParallelMode = toolMgr()->action( ParallelModeId )->isChecked();
-
- // advanced zooming is not available in perspective mode
- if( QtxAction* anAction = getAction( SwitchZoomingStyleId ) )
- anAction->setEnabled( anIsParallelMode );
-
+ int aMode = Parallel;
+ if (theAction == toolMgr()->action( ProjectionModeId ))
+ aMode = Projection;
+ SVTK_Viewer* aViewer = dynamic_cast<SVTK_Viewer*>(myModel);
+ aViewer->setProjectionMode(aMode);
+ bool anIsParallelMode = (aMode == Parallel);
vtkCamera* aCamera = getRenderer()->GetActiveCamera();
aCamera->SetParallelProjection(anIsParallelMode);
GetInteractor()->GetDevice()->CreateTimer(VTKI_TIMER_FIRST);
+ getRenderWindow()->SetStereoRender(0);
+ Repaint();
+}
+/*!
+ \brief Sets Stereo projection mode.
+
+ Sets Stereo projection mode.
+*/
+void SVTK_ViewWindow::onStereoMode( bool activate )
+{
+ if (activate) {
+ toolMgr()->action( ProjectionModeId )->setChecked(true);
+ vtkCamera* aCamera = getRenderer()->GetActiveCamera();
+ aCamera->SetParallelProjection(false);
+ toolMgr()->action( ProjectionModeId )->actionGroup()->setEnabled(false);
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+ SetStereoType( aResMgr->integerValue( "VTKViewer", "stereo_type", 0 ) );
+ getRenderWindow()->SetStereoRender(1);
+ Repaint();
+ }
+ else {
+ toolMgr()->action( ProjectionModeId )->actionGroup()->setEnabled(true);
+ SVTK_Viewer* aViewer = dynamic_cast<SVTK_Viewer*>(myModel);
+ if (aViewer->projectionMode() == Parallel) {
+ toolMgr()->action( ParallelModeId )->setChecked(true);
+ onProjectionMode(toolMgr()->action( ParallelModeId ));
+ }
+ else if (aViewer->projectionMode() == Projection) {
+ toolMgr()->action( ProjectionModeId )->setChecked(true);
+ onProjectionMode(toolMgr()->action( ProjectionModeId ));
+ }
+ }
+ if ( getRenderWindow()->GetStereoCapableWindow() == 1 && !isOpenGlStereoSupport() &&
+ strcmp( "CrystalEyes", getRenderWindow()->GetStereoTypeAsString() ) == 0 &&
+ toolMgr()->action( StereoModeId )->isChecked() )
+ SUIT_MessageBox::warning( 0, tr( "WRN_WARNING" ), tr( "WRN_SUPPORT_QUAD_BUFFER" ) );
+}
+
+/*!
+ Set the view projection mode: orthogonal or perspective
+*/
+void SVTK_ViewWindow::onProjectionMode()
+{
+ if (toolMgr()->action( ParallelModeId )->isChecked())
+ SetProjectionMode( Parallel);
+ if (toolMgr()->action( ProjectionModeId )->isChecked())
+ SetProjectionMode( Projection);
+ if (toolMgr()->action( StereoModeId )->isChecked())
+ SetProjectionMode( Stereo);
emit transformed( this );
}
connect(anAction, SIGNAL(activated()), this, SLOT(activateWindowFit()));
mgr->registerAction( anAction, FitRectId );
+ // FitSelection
+ anAction = new QtxAction(tr("MNU_FITSELECTION"),
+ theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_FITSELECTION" ) ),
+ tr( "MNU_FITSELECTION" ), 0, this);
+ anAction->setStatusTip(tr("DSC_FITSELECTION"));
+ connect(anAction, SIGNAL(activated()), this, SLOT(onFitSelection()));
+ mgr->registerAction( anAction, FitSelectionId );
+
// Zoom
anAction = new QtxAction(tr("MNU_ZOOM_VIEW"),
theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_ZOOM" ) ),
anAction = new QtxAction(tr("MNU_SHOW_TRIHEDRON"),
theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_TRIHEDRON" ) ),
tr( "MNU_SHOW_TRIHEDRON" ), 0, this);
+ anAction->setCheckable( true );
+ anAction->setChecked( true );
+
anAction->setStatusTip(tr("DSC_SHOW_TRIHEDRON"));
- connect(anAction, SIGNAL(activated()), this, SLOT(onViewTrihedron()));
+ connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onViewTrihedron(bool)));
mgr->registerAction( anAction, ViewTrihedronId );
// onNonIsometric: Manage non-isometric params
tr( "MNU_SVTK_PARALLEL_MODE" ), 0, this);
anAction->setStatusTip(tr("DSC_SVTK_PARALLEL_MODE"));
anAction->setCheckable(true);
- connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onPerspectiveMode()));
mgr->registerAction( anAction, ParallelModeId );
anAction = new QtxAction(tr("MNU_SVTK_PERSPECTIVE_MODE"),
tr( "MNU_SVTK_PERSPECTIVE_MODE" ), 0, this);
anAction->setStatusTip(tr("DSC_SVTK_PERSPECTIVE_MODE"));
anAction->setCheckable(true);
- connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onPerspectiveMode()));
mgr->registerAction( anAction, ProjectionModeId );
+ anAction = new QtxAction(tr("MNU_SVTK_STEREO_MODE"),
+ theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_VIEW_STEREO" ) ),
+ tr( "MNU_SVTK_STEREO_MODE" ), 0, this);
+ anAction->setStatusTip(tr("DSC_SVTK_STEREO_MODE"));
+ anAction->setCheckable(true);
+ connect(anAction, SIGNAL(triggered(bool)), this, SLOT(onStereoMode(bool)));
+ mgr->registerAction( anAction, StereoModeId );
+
QActionGroup* aPerspectiveGroup = new QActionGroup( this );
aPerspectiveGroup->addAction( mgr->action( ParallelModeId ) );
aPerspectiveGroup->addAction( mgr->action( ProjectionModeId ) );
+ connect(aPerspectiveGroup, SIGNAL(triggered(QAction*)), this, SLOT(onProjectionMode(QAction*)));
// View Parameters
anAction = new QtxAction(tr("MNU_VIEWPARAMETERS_VIEW"),
QtxMultiAction* aScaleAction = new QtxMultiAction( this );
aScaleAction->insertAction( getAction( FitAllId ) );
aScaleAction->insertAction( getAction( FitRectId ) );
+ aScaleAction->insertAction( getAction( FitSelectionId ) );
aScaleAction->insertAction( getAction( ZoomId ) );
mgr->append( aScaleAction, myToolBar );
mgr->append( ParallelModeId, myToolBar );
mgr->append( ProjectionModeId, myToolBar );
+ mgr->append( StereoModeId, myToolBar );
mgr->append( StartRecordingId, myRecordingToolBar );
mgr->append( PlayRecordingId, myRecordingToolBar );