]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
0023083: [CEA 1400] Be able to active stereo in OCC view and to choose which kind... imn/23083
authorimn <imn@opencascade.com>
Mon, 13 Jul 2015 13:04:14 +0000 (16:04 +0300)
committerimn <imn@opencascade.com>
Mon, 13 Jul 2015 13:04:14 +0000 (16:04 +0300)
29 files changed:
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h
src/LightApp/LightApp_FullScreenHelper.cxx
src/LightApp/LightApp_FullScreenHelper.h
src/LightApp/resources/LightApp.xml
src/LightApp/resources/LightApp_msg_en.ts
src/LightApp/resources/LightApp_msg_fr.ts
src/LightApp/resources/LightApp_msg_ja.ts
src/OCCViewer/CMakeLists.txt
src/OCCViewer/OCCViewer_ViewFrame.cxx
src/OCCViewer/OCCViewer_ViewFrame.h
src/OCCViewer/OCCViewer_ViewModel.cxx
src/OCCViewer/OCCViewer_ViewModel.h
src/OCCViewer/OCCViewer_ViewPort3d.cxx
src/OCCViewer/OCCViewer_ViewPort3d.h
src/OCCViewer/OCCViewer_ViewWindow.cxx
src/OCCViewer/OCCViewer_ViewWindow.h
src/OCCViewer/resources/OCCViewer_images.ts
src/OCCViewer/resources/OCCViewer_msg_en.ts
src/OCCViewer/resources/OCCViewer_msg_fr.ts
src/OCCViewer/resources/OCCViewer_msg_ja.ts
src/OCCViewer/resources/occ_view_stereo.png [new file with mode: 0644]
src/Qtx/Qtx.cxx
src/Qtx/QtxWorkstack.cxx
src/Qtx/QtxWorkstack.h
src/SUIT/SUIT_Application.cxx
src/SUIT/SUIT_Application.h
src/SUIT/SUIT_Desktop.cxx
src/SUIT/SUIT_Desktop.h

index ab27384ed9fee212d4c4351dc8c0c3ef61800b20..4dfb2b7b0776b93e648b77b72f716f9ad777696c 100644 (file)
 #ifndef DISABLE_OCCVIEWER
   #include <OCCViewer_ViewManager.h>
   #include <OCCViewer_ViewFrame.h>
+  #include <OCCViewer_ViewPort3d.h>
 #ifndef DISABLE_SALOMEOBJECT
   #include <SOCC_ViewModel.h>
 #else
@@ -317,6 +318,8 @@ LightApp_Application::LightApp_Application()
   myAutoSaveTimer->setSingleShot( true );
   connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
 
+  //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
+
   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
   QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
 
@@ -1535,6 +1538,16 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
                            resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
     vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
     vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
+    vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_mode", vm->stereoType() ) );
+    vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
+    vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
+                               resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
+    vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
+                                resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
+
+    vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
+    vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
+    vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
     vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
     vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
     vm->enableSelection(    resMgr->booleanValue( "OCCViewer", "enable_selection",    vm->isSelectionEnabled() ) );
@@ -1837,6 +1850,22 @@ void LightApp_Application::onRenamed()
   updateActions();
 }
 
+// IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
+// To prevent reversion the window should be either aligned during movement and resize.
+/*!Private SLOT. Update actions after rename object.*/
+/*void LightApp_Application::onMoved()
+{
+  OCCViewer_ViewManager* viewMgr = 0;
+  viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
+  if (viewMgr) {
+    OCCViewer_ViewWindow* view = 0;
+    view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
+    if (view) {
+      view->getViewPort()->repaintViewAfterMove();
+    }
+  }
+}
+*/
 /*!Private SLOT. Support drag-and-drop operation.*/
 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
 {
@@ -2258,6 +2287,15 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "strings", aValuesList,   mruLinkType );
   pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
   // ... "MRU" preferences group <<end>>
+
+  // ... "Full-screen" group <<start>>
+  int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
+  pref->setItemProperty( "columns", 2, fullScreenGroup );
+  // .... -> automatic hiding toolbars
+  pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
+                      LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
+  // ... "Full-screen" group <<end>>
+
   // .. "General" preferences tab <<end>>
 
   // .. "3D viewer" group <<start>>
@@ -2301,7 +2339,7 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   // .. "OCC viewer" group <<start>>
   int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
 
-  // .... -> projection mode
+  // .... -> Projection mode
   int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
                                          LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
   aValuesList.clear();
@@ -2310,6 +2348,77 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   anIndicesList << 0                       << 1;
   pref->setItemProperty( "strings", aValuesList,   occProjMode );
   pref->setItemProperty( "indexes", anIndicesList, occProjMode );
+
+  // .... -> Stereo group
+  int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
+  pref->setItemProperty( "columns", 2, stereoGroup );
+  // .... -> Stereo type
+  int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
+                                            LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  OCCViewer_Viewer::stereoData( aValuesList, idList);
+  foreach( int gid, idList ) anIndicesList << gid;
+  pref->setItemProperty( "strings", aValuesList,   stereoType );
+  pref->setItemProperty( "indexes", anIndicesList, stereoType );
+
+  // .... -> Anaglyph filter
+  int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
+                                            LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
+  anIndicesList << 0                            << 1                               << 2;
+
+  pref->setItemProperty( "strings", aValuesList,   anaglyphFilter );
+  pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
+
+  // .... -> Convergence distance type
+  int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
+                                           LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
+  anIndicesList << 0                   << 1;
+  pref->setItemProperty( "strings", aValuesList,   occFocusType );
+  pref->setItemProperty( "indexes", anIndicesList, occFocusType );
+
+  // .... -> Stereographic focus value
+  int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
+               LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
+  pref->setItemProperty( "precision", 3, focusValue );
+  pref->setItemProperty( "min", 1.0E-03, focusValue );
+  pref->setItemProperty( "max", 1.0E03, focusValue );
+  pref->setItemProperty( "step", 0.05, focusValue );
+
+  // .... -> IOD type
+  int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
+                                           LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
+  anIndicesList << 0                   << 1;
+  pref->setItemProperty( "strings", aValuesList,   occIODType );
+  pref->setItemProperty( "indexes", anIndicesList, occIODType );
+
+  // .... -> Interocular distance (IOD) value
+  int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
+                                      LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
+  pref->setItemProperty( "precision", 3, IODValue );
+  pref->setItemProperty( "min", 1.0E-03, IODValue );
+  pref->setItemProperty( "max", 1.0E03, IODValue );
+  pref->setItemProperty( "step", 0.05, IODValue );
+
+  // .... -> Reverse stereo
+  pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
+                      LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
+  // .... -> Enable V-Sync
+  pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
+                      LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
+  // .... -> Enable quad-buffer support
+  pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
+                      LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
+
   // ... "Background" group <<start>>
   int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
   //  pref->setItemProperty( "columns", 2, bgGroup );
@@ -2407,6 +2516,7 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "margin",  0, occGen );
   pref->setItemProperty( "columns", 2, occGen );
   // ... -> empty frame (for layout) <<end>>
+
   // .. "OCC viewer" group <<end>>
 #endif
 
@@ -2983,6 +3093,143 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
 #endif
 
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
+  {
+    int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setStereoType( mode );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
+  {
+    int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setAnaglyphFilter( mode );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
+                                          param == QString( "focus_value" ) ) )
+  {
+    int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
+    double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setStereographicFocus( aType, aValue );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
+                                          param == QString( "iod_value" ) ) )
+  {
+    int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
+    double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setInterocularDistance( aType, aValue );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
+  {
+    bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setReverseStereo( reverse );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
+  {
+    bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setVSync( enable );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
+  {
+    bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setQuadBufferSupport( enable );
+    }
+  }
+#endif
+
   if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
   {
     int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
@@ -3848,6 +4095,8 @@ void LightApp_Application::setDesktop( SUIT_Desktop* desk )
              this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
     connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
              this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
+    /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
+             this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
   }
 }
 
index 24d59fbcbfcb4aa3f0b61b1080163c35c8ee063d..3d7080d6bc5363bd32257c1f2c17a288d1c82766 100644 (file)
@@ -276,6 +276,7 @@ private slots:
   void                                onCloseAllWindow();
   void                                onGroupAllWindow();
   void                                onRenamed();
+  //void                                onMoved();
 
 protected:
   void                                updateWindows();
index 2960e4edba3f7170cd8b822aa6b183a0a892e402..7ddce9822a53dbbeeb38439ef3de07f933c47baa 100644 (file)
 #include <QAction>
 #include <QMenuBar>
 #include <QStatusBar>
+#include <QToolBar>
+
+#include <QtxWorkstack.h>
 
 #include <STD_Application.h>
+#include <STD_TabDesktop.h>
 
 #include <SUIT_Session.h>
 #include <SUIT_Desktop.h>
 #include <SUIT_DataBrowser.h>
+#include <SUIT_ViewWindow.h>
+#include <SUIT_ResourceMgr.h>
 
 #include "LightApp_FullScreenHelper.h"
 #include "LightApp_Application.h"
@@ -74,6 +80,35 @@ void LightApp_FullScreenHelper::switchToFullScreen() {
   if(!desktop)
     return;
   
+  STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop );
+
+  QtxWorkstack* wgStack = desk->workstack();
+  wgStack->showActiveTabBar(false);
+  myWindowsList.clear();
+  bool isHidding = false;
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+  if ( resMgr )
+    isHidding = resMgr->booleanValue( "OCCViewer", "automatic_hiding", true );
+  //Hide all toolbars and inactive window
+  QList<SUIT_ViewWindow*> aWindowList = desk->windows();
+  SUIT_ViewWindow* anActiveWindow = desk->activeWindow();
+  QList<SUIT_ViewWindow*>::const_iterator it = aWindowList.begin();
+  for ( ; it!=aWindowList.end(); it++ ) {
+    QList<QToolBar*> lst = (*it)->findChildren<QToolBar*>();
+    if ( *it ) {
+      myWindowsList.push_back(*it);
+      ( *it )->hide();
+    }
+    if ( isHidding ) {
+      QList<QToolBar*>::const_iterator iter = lst.begin();
+      for ( ; iter!=lst.end(); iter++ ) {
+        (*iter)->hide();
+      }
+    }
+  }
+  if (anActiveWindow)
+    anActiveWindow->show();
+
   desktop->setWindowState(desktop->windowState() ^ Qt::WindowFullScreen);
 
   if(desktop->menuBar())
@@ -92,7 +127,7 @@ void LightApp_FullScreenHelper::switchToFullScreen() {
   myDocWidgetMap.clear();
 
   QWidget* ob = app->objectBrowser();
-  QObject* obParent = ob ? ob->parent() : 0;
+  QObject* obParent = (ob && !isHidding)? ob->parent() : 0;
 
   foreach(QDockWidget* aWidget, aDocWidgets) {
     if(aWidget && aWidget->parent() == desktop) {
@@ -153,6 +188,28 @@ void LightApp_FullScreenHelper::switchToNormalScreen() {
   
   desktop->setWindowState(desktop->windowState() ^ Qt::WindowFullScreen);
 
+  STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop );
+
+  QtxWorkstack* wgStack = desk->workstack();
+  wgStack->showActiveTabBar(true);
+
+  bool isHidding = false;
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+  if ( resMgr )
+    isHidding = resMgr->booleanValue( "OCCViewer", "automatic_hiding", true );
+  //Show all toolbars and windows
+  QList<SUIT_ViewWindow*>::const_iterator itr = myWindowsList.begin();
+  for ( ; itr!=myWindowsList.end(); itr++ ) {
+    QList<QToolBar*> lst = (*itr)->findChildren<QToolBar*>();
+    if (*itr && !(*itr)->isVisible())
+      (*itr)->show();
+    if ( isHidding ) {
+      QList<QToolBar*>::const_iterator iter = lst.begin();
+      for ( ; iter!=lst.end(); iter++ ) {
+        (*iter)->show();
+      }
+    }
+  }
 
   DocWidgetMap::iterator it = myDocWidgetMap.begin();
   for( ;it != myDocWidgetMap.end() ; it++ ) {
index 7cc44351451a1d718f014a1286f62f46994f7ccc..e5f4dedf45e7faed7fc94753e94811eb2a284960 100644 (file)
@@ -46,10 +46,9 @@ class LIGHTAPP_EXPORT LightApp_FullScreenHelper {
  private:
   typedef QMap<QDockWidget*,bool> DocWidgetMap;
   DocWidgetMap myDocWidgetMap;
-
   typedef QMap<QToolBar*, bool> ToolBarMap;
   ToolBarMap myToolBarMap;
-
+  QList<SUIT_ViewWindow*> myWindowsList;
 
   bool myStatusBarVisibility;
 
index c8034c4bcf412ea2996a52b318235140d0c25c6b..694487ec30929a19e62b2cdcd05d8ba7ebb1108d 100644 (file)
   </section>
   <section name="OCCViewer" >
     <!-- OCC viewer preferences -->
+    <parameter name="projection_mode"     value="0"/>
+    <parameter name="stereo_type"         value="0"/>
+    <parameter name="anaglyph_filter"     value="0"/>
+    <parameter name="focus_type"          value="1"/>
+    <parameter name="focus_value"         value="1.0"/>
+    <parameter name="iod_type"            value="1"/>
+    <parameter name="iod_value"           value="0.05"/>
+    <parameter name="reverse_stereo"      value="false"/>
+    <parameter name="enable_vsync"        value="true"/>
+    <parameter name="enable_quad_buffer_support" value="false"/>
     <parameter name="enable_preselection" value="true"/>
     <parameter name="enable_selection"    value="true"/>
     <parameter name="clipping_color"      value="50, 50, 50"/>
     <!-- VTK viewer preferences -->
     <parameter name="background"                       value="0, 0, 0"/>
     <parameter name="projection_mode"                  value="0"/>
+    <parameter name="stereo_type"                      value="0"/>
+    <parameter name="anaglyph_filter"                  value="0"/>
+    <parameter name="reverse_stereo"                   value="false"/>
+    <parameter name="enable_vsync"                     value="true"/>
     <parameter name="preselection"                     value="0"/>
     <parameter name="enable_selection"                 value="true"/>
     <parameter name="speed_value"                      value="10"/>
index e146f865467d68e474991b38941e322c7c104d35..9876572466807af52a3c7475865ce77ffb80aee1 100644 (file)
@@ -627,6 +627,66 @@ The changes will be applied on the next application session.</translation>
         <source>PREF_GROUP_OCCVIEWER</source>
         <translation>OCC 3D Viewer</translation>
     </message>
+    <message>
+        <source>PREF_GROUP_STEREO</source>
+        <translation>Stereo render</translation>
+    </message>
+    <message>
+        <source>PREF_STEREO_TYPE</source>
+        <translation>Stereo type</translation>
+    </message>
+    <message>
+        <source>PREF_ANAGLYPH_FILTER</source>
+        <translation>Anaglyph filter</translation>
+    </message>
+    <message>
+        <source>PREF_ANAGLYPH_RED_CYAN</source>
+        <translation>Red-Cyan</translation>
+    </message>
+    <message>
+        <source>PREF_ANAGLYPH_YELLOW_BLUE</source>
+        <translation>Yellow-Blue</translation>
+    </message>
+    <message>
+        <source>PREF_ANAGLYPH_GREEN_MAGENTA</source>
+        <translation>Green-Magenta</translation>
+    </message>
+    <message>
+        <source>PREF_FOCUS_TYPE</source>
+        <translation>Convergence distance type</translation>
+    </message>
+    <message>
+        <source>PREF_FOCUS_VALUE</source>
+        <translation>Stereographic focus value</translation>
+    </message>
+    <message>
+        <source>PREF_IOD_TYPE</source>
+        <translation>IOD type</translation>
+    </message>
+    <message>
+        <source>PREF_IOD_VALUE</source>
+        <translation>Interocular distance (IOD) value</translation>
+    </message>
+    <message>
+        <source>PREF_ABSOLUTE</source>
+        <translation>Absolute</translation>
+    </message>
+    <message>
+        <source>PREF_RELATIVE</source>
+        <translation>Relative</translation>
+    </message>
+    <message>
+        <source>PREF_REVERSE_STEREO</source>
+        <translation>Reverse stereo</translation>
+    </message>
+    <message>
+        <source>PREF_ENABLE_VSYNC</source>
+        <translation>Enable V-Sync</translation>
+    </message>
+    <message>
+        <source>PREF_ENABLE_QUAD_BUFFER_SUPPORT</source>
+        <translation>Enable quad-buffer support</translation>
+    </message>
     <message>
         <source>PREF_LOGARITHMIC</source>
         <translation>Logarithmic</translation>
@@ -888,6 +948,14 @@ File does not exist</translation>
         <source>PREF_GROUP_SHORTCUTS</source>
         <translation>Shortcuts settings</translation>
     </message>
+    <message>
+        <source>PREF_GROUP_FULL_SCREEN</source>
+        <translation>Full-screen</translation>
+    </message>
+    <message>
+        <source>PREF_FULL_SCREEN_AUTO</source>
+        <translation>Hide object browser and viewers toolbars</translation>
+    </message>
   <message>
     <source>PREF_TAB_PYEDITOR</source>
     <translation>Python Viewer</translation>
index 81ca07de70aa036e3d3d2f4f3245175a8c17acc3..9d293f2546190ac4d50416872136aabd3f5296a1 100755 (executable)
@@ -627,6 +627,66 @@ Les modifications seront appliquées à la prochaine session.</translation>
         <source>PREF_GROUP_OCCVIEWER</source>
         <translation>Scène OCC 3D</translation>
     </message>
+    <message>
+        <source>PREF_GROUP_STEREO</source>
+        <translation type="unfinished">Stereo render</translation>
+    </message>
+    <message>
+        <source>PREF_STEREO_TYPE</source>
+        <translation type="unfinished">Stereo type</translation>
+    </message>
+    <message>
+        <source>PREF_ANAGLYPH_FILTER</source>
+        <translation type="unfinished">Anaglyph filter</translation>
+    </message>
+    <message>
+        <source>PREF_ANAGLYPH_RED_CYAN</source>
+        <translation type="unfinished">Red-Cyan</translation>
+    </message>
+    <message>
+        <source>PREF_ANAGLYPH_YELLOW_BLUE</source>
+        <translation type="unfinished">Yellow-Blue</translation>
+    </message>
+    <message>
+        <source>PREF_ANAGLYPH_GREEN_MAGENTA</source>
+        <translation type="unfinished">Green-Magenta</translation>
+    </message>
+    <message>
+        <source>PREF_FOCUS_TYPE</source>
+        <translation> type="unfinished"Convergence distance type</translation>
+    </message>
+    <message>
+        <source>PREF_FOCUS_VALUE</source>
+        <translation type="unfinished">Stereographic focus value</translation>
+    </message>
+    <message>
+        <source>PREF_IOD_TYPE</source>
+        <translation type="unfinished">IOD type</translation>
+    </message>
+    <message>
+        <source>PREF_IOD_VALUE</source>
+        <translation type="unfinished">Interocular distance (IOD) value</translation>
+    </message>
+    <message>
+        <source>PREF_ABSOLUTE</source>
+        <translation type="unfinished">Absolute</translation>
+    </message>
+    <message>
+        <source>PREF_RELATIVE</source>
+        <translation type="unfinished">Relative</translation>
+    </message>
+    <message>
+        <source>PREF_REVERSE_STEREO</source>
+        <translation type="unfinished">Reverse stereo</translation>
+    </message>
+    <message>
+        <source>PREF_ENABLE_VSYNC</source>
+        <translation type="unfinished">Enable V-Sync</translation>
+    </message>
+    <message>
+        <source>PREF_ENABLE_QUAD_BUFFER_SUPPORT</source>
+        <translation type="unfinished">Enable quad-buffer support</translation>
+    </message>
     <message>
         <source>PREF_LOGARITHMIC</source>
         <translation>Logarithmique</translation>
@@ -888,6 +948,14 @@ Le fichier n&apos;existe pas</translation>
         <source>PREF_GROUP_SHORTCUTS</source>
         <translation>Réglage des raccourcis clavier</translation>
     </message>
+    <message>
+        <source>PREF_GROUP_FULL_SCREEN</source>
+        <translation type="unfinished">Full-screen</translation>
+    </message>
+    <message>
+        <source>PREF_FULL_SCREEN_AUTO</source>
+        <translation type="unfinished">Hide object browser and viewers toolbars</translation>
+    </message>
     <message>
         <source>PREF_TAB_PYEDITOR</source>
         <translation>Editeur python</translation>
index 881dd0507f560f34b9094044e04d71221d407100..954a371ce4faede40105f3310557a5cec08dc850 100644 (file)
@@ -627,6 +627,66 @@ CEA/DEN, CEDRAT, EDF R&amp;D, LEG, PRINCIPIA R&amp;D, BUREAU VERITAS</translatio
       <source>PREF_GROUP_OCCVIEWER</source>
       <translation>OCC 3D Viewer</translation>
     </message>
+    <message>
+      <source>PREF_GROUP_STEREO</source>
+      <translation type="unfinished">Stereo render</translation>
+    </message>
+    <message>
+      <source>PREF_STEREO_TYPE</source>
+      <translation type="unfinished">Stereo type</translation>
+    </message>
+    <message>
+      <source>PREF_ANAGLYPH_FILTER</source>
+      <translation type="unfinished">Anaglyph filter</translation>
+    </message>
+    <message>
+      <source>PREF_ANAGLYPH_RED_CYAN</source>
+      <translation type="unfinished">Red-Cyan</translation>
+    </message>
+    <message>
+      <source>PREF_ANAGLYPH_YELLOW_BLUE</source>
+      <translation type="unfinished">Yellow-Blue</translation>
+    </message>
+    <message>
+      <source>PREF_ANAGLYPH_GREEN_MAGENTA</source>
+      <translation type="unfinished">Green-Magenta</translation>
+    </message>
+    <message>
+      <source>PREF_FOCUS_TYPE</source>
+      <translation> type="unfinished"Convergence distance type</translation>
+    </message>
+    <message>
+      <source>PREF_FOCUS_VALUE</source>
+      <translation type="unfinished">Stereographic focus value</translation>
+    </message>
+    <message>
+      <source>PREF_IOD_TYPE</source>
+      <translation type="unfinished">IOD type</translation>
+    </message>
+    <message>
+      <source>PREF_IOD_VALUE</source>
+      <translation type="unfinished">Interocular distance (IOD) value</translation>
+    </message>
+    <message>
+      <source>PREF_ABSOLUTE</source>
+      <translation type="unfinished">Absolute</translation>
+    </message>
+    <message>
+      <source>PREF_RELATIVE</source>
+      <translation type="unfinished">Relative</translation>
+    </message>
+    <message>
+      <source>PREF_REVERSE_STEREO</source>
+      <translation type="unfinished">Reverse stereo</translation>
+    </message>
+    <message>
+      <source>PREF_ENABLE_VSYNC</source>
+      <translation type="unfinished">Enable V-Sync</translation>
+    </message>
+    <message>
+      <source>PREF_ENABLE_QUAD_BUFFER_SUPPORT</source>
+      <translation type="unfinished">Enable quad-buffer support</translation>
+    </message>
     <message>
       <source>PREF_LOGARITHMIC</source>
       <translation>対数</translation>
@@ -887,6 +947,14 @@ CEA/DEN, CEDRAT, EDF R&amp;D, LEG, PRINCIPIA R&amp;D, BUREAU VERITAS</translatio
       <source>PREF_GROUP_SHORTCUTS</source>
       <translation>ショートカットの設定</translation>
     </message>
+    <message>
+      <source>PREF_GROUP_FULL_SCREEN</source>
+      <translation type="unfinished">Full-screen</translation>
+    </message>
+    <message>
+      <source>PREF_FULL_SCREEN_AUTO</source>
+      <translation type="unfinished">Hide object browser and viewers toolbars</translation>
+    </message>
     <message>
       <source>PREF_TAB_PYEDITOR</source>
       <translation>Python Viewer</translation>
index a69ace13358b076cf121a8f7ca17a19a01768ef3..01e7473bb8ec32a09450f3fd6294de2792f88500 100755 (executable)
@@ -135,6 +135,7 @@ SET(_other_RESOURCES
   resources/occ_view_scaling.png
   resources/occ_view_selection.png
   resources/occ_view_shoot.png
+  resources/occ_view_stereo.png
   resources/occ_view_style_switch.png
   resources/occ_view_top.png
   resources/occ_view_triedre.png
index 9ebb0cdf228f9e3e3eb4aa78ab9fedaf0c30c7dc..5907af309539dc23729ca01787f1d5220be3329d 100644 (file)
@@ -328,6 +328,116 @@ void OCCViewer_ViewFrame::setProjectionType( int t)
   }
 }
 
+//**************************************************************************************
+int OCCViewer_ViewFrame::stereoType() const
+{
+  return getView(MAIN_VIEW)->stereoType();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setStereoType( int t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setStereoType(t);
+  }
+}
+
+//**************************************************************************************
+int OCCViewer_ViewFrame::anaglyphFilter() const
+{
+  return getView(MAIN_VIEW)->anaglyphFilter();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setAnaglyphFilter( int t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setAnaglyphFilter(t);
+  }
+}
+
+//**************************************************************************************
+int OCCViewer_ViewFrame::stereographicFocusType() const
+{
+  return getView(MAIN_VIEW)->stereographicFocusType();
+}
+
+//**************************************************************************************
+double OCCViewer_ViewFrame::stereographicFocusValue() const
+{
+  return getView(MAIN_VIEW)->stereographicFocusValue();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setStereographicFocus( int t, double v)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setStereographicFocus(t, v);
+  }
+}
+
+//**************************************************************************************
+int OCCViewer_ViewFrame::interocularDistanceType() const
+{
+  return getView(MAIN_VIEW)->interocularDistanceType();
+}
+
+//**************************************************************************************
+double OCCViewer_ViewFrame::interocularDistanceValue() const
+{
+  return getView(MAIN_VIEW)->interocularDistanceValue();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setInterocularDistance( int t, double v)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setInterocularDistance(t, v);
+  }
+}
+
+//**************************************************************************************
+bool OCCViewer_ViewFrame::isReverseStereo() const
+{
+  return getView(MAIN_VIEW)->isReverseStereo();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setReverseStereo( bool t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setReverseStereo(t);
+  }
+}
+
+//**************************************************************************************
+bool OCCViewer_ViewFrame::isVSync() const
+{
+  return getView(MAIN_VIEW)->isVSync();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setVSync( bool t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setVSync(t);
+  }
+}
+
+//**************************************************************************************
+bool OCCViewer_ViewFrame::isQuadBufferSupport() const
+{
+  return getView(MAIN_VIEW)->isQuadBufferSupport();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setQuadBufferSupport( bool t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setQuadBufferSupport(t);
+  }
+}
+
 //**************************************************************************************
 void OCCViewer_ViewFrame::setZoomingStyle( const int i ) 
 { 
index a8ef4b2ac5910ed269b2a8c59eafa54ef3034d13..1e56502dafe66bae1ec913ba1aa1a7c8e5acf0e2 100644 (file)
@@ -73,6 +73,29 @@ public:
   virtual int projectionType() const;
   virtual void setProjectionType( int );
 
+  virtual int stereoType() const;
+  virtual void setStereoType( const int );
+
+  virtual int anaglyphFilter() const;
+  virtual void setAnaglyphFilter( const int );
+
+  virtual void setStereographicFocus( const int, const double );
+  virtual int stereographicFocusType() const;
+  virtual double stereographicFocusValue() const;
+
+  virtual void setInterocularDistance( const int, const double );
+  virtual int interocularDistanceType() const;
+  virtual double interocularDistanceValue() const;
+
+  virtual bool isReverseStereo() const;
+  virtual void setReverseStereo( const bool );
+
+  virtual bool isVSync() const;
+  virtual void setVSync( const bool );
+
+  virtual bool isQuadBufferSupport() const;
+  virtual void setQuadBufferSupport( const bool );
+
   virtual int  zoomingStyle() const { return getView(MAIN_VIEW)->zoomingStyle(); }
   virtual void setZoomingStyle( const int );
 
index d8feb5d21ce801209b9433800713d830b96dbe42..10cd6c8505f3a1be3e93693c31bf9d857d3a6359 100755 (executable)
@@ -90,6 +90,21 @@ QString OCCViewer_Viewer::backgroundData( QStringList& gradList, QIntList& idLis
   return tr("BG_IMAGE_FILES");
 }
 
+/*!
+  Get data for supported stereo pair modes: stereo types and identifiers
+*/
+void OCCViewer_Viewer::stereoData( QStringList& typeList, QIntList& idList)
+{
+  typeList << tr("ST_QUADBUFFER")    << tr("ST_ANAGLYPH")         <<
+              tr("ST_ROWINTERLACED") << tr("ST_COLUMNINTERLACED") <<
+              tr("ST_CHESSBOARD")    << tr("ST_SIDEBYSIDE")       <<
+              tr("ST_OVERUNDER");
+  idList   << QuadBufferType    << AnaglyphType         <<
+              RowInterlacedType << ColumnInterlacedType <<
+              ChessBoardType    << SideBySideType       <<
+              OverUnderType;
+}
+
 /*!
   Constructor
   \param DisplayTrihedron - is trihedron displayed
@@ -155,6 +170,17 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron)
   // set projection type to orthographic
   myProjectionType = 0;
 
+  // set stereo parameters
+  myStereoType = 0;
+  myAnaglyphFilter = 0;
+  myToReverseStereo = 0;
+  myVSyncMode = 1;
+  myQuadBufferSupport = 0;
+  myStereographicFocusType = 1;
+  myInterocularDistanceType = 1;
+  myStereographicFocusValue = 1.0;
+  myInterocularDistanceValue = 0.05;
+
   //set clipping color and texture to standard
   myClippingColor = QColor( 50, 50, 50 );
   myDefaultTextureUsed = true;
@@ -219,10 +245,17 @@ void OCCViewer_Viewer::initView( OCCViewer_ViewWindow* view )
     view->initSketchers();
     view->setInteractionStyle( interactionStyle() );
     view->setProjectionType( projectionType() );
+    view->setStereoType( stereoType() );
+    view->setAnaglyphFilter( anaglyphFilter() );
+    view->setStereographicFocus( stereographicFocusType(), stereographicFocusValue() );
+    view->setInterocularDistance( interocularDistanceType(), interocularDistanceValue() );
+    view->setReverseStereo( isReverseStereo() );
+    view->setVSync( isVSync() );
+    view->setQuadBufferSupport( isQuadBufferSupport() );
     view->setZoomingStyle( zoomingStyle() );
     view->enablePreselection( isPreselectionEnabled() );
     view->enableSelection( isSelectionEnabled() );
-    
+
     OCCViewer_ViewPort3d* vp3d = view->getViewPort();
     if ( vp3d )
     {
@@ -507,6 +540,222 @@ void OCCViewer_Viewer::setProjectionType( const int theType )
   }
 }
 
+/*!
+  \return stereo type
+*/
+int OCCViewer_Viewer::stereoType() const
+{
+  return myStereoType;
+}
+
+/*!
+  Sets stereo type
+  \param theType - new stereo type
+*/
+void OCCViewer_Viewer::setStereoType( const int theType )
+{
+  myStereoType = theType;
+
+  if ( !myViewManager )
+    return;
+
+  QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+  for ( int i = 0; i < (int)wins.count(); i++ )
+  {
+    OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+    if ( win )
+      win->setStereoType( (OCCViewer_ViewWindow::StereoType)theType );
+  }
+}
+
+/*!
+  \return stereographic focus type
+*/
+int OCCViewer_Viewer::stereographicFocusType() const
+{
+  return myStereographicFocusType;
+}
+
+/*!
+  \return stereographic focus value
+*/
+double OCCViewer_Viewer::stereographicFocusValue() const
+{
+  return myStereographicFocusValue;
+}
+
+/*!
+  Sets stereographic focus parameters
+  \param theType - new stereographic focus type
+  \param theValue - new stereographic focus value
+*/
+void OCCViewer_Viewer::setStereographicFocus( const int theType, const double theValue )
+{
+  myStereographicFocusType = theType;
+  myStereographicFocusValue = theValue;
+
+  if ( !myViewManager )
+    return;
+
+  QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+  for ( int i = 0; i < (int)wins.count(); i++ )
+  {
+    OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+    if ( win )
+      win->setStereographicFocus( (OCCViewer_ViewWindow::FocusIODType)theType, theValue );
+  }
+}
+
+/*!
+  \return stereographic focus type
+*/
+int OCCViewer_Viewer::interocularDistanceType() const
+{
+  return myInterocularDistanceType;
+}
+
+/*!
+  \return stereographic focus value
+*/
+double OCCViewer_Viewer::interocularDistanceValue() const
+{
+  return myInterocularDistanceValue;
+}
+
+/*!
+  Sets interocular distance parameters
+  \param theType - new IOD type
+  \param theValue - new IOD value
+*/
+void OCCViewer_Viewer::setInterocularDistance( const int theType, const double theValue )
+{
+  myInterocularDistanceType = theType;
+  myInterocularDistanceValue = theValue;
+
+  if ( !myViewManager )
+    return;
+
+  QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+  for ( int i = 0; i < (int)wins.count(); i++ )
+  {
+    OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+    if ( win )
+      win->setInterocularDistance( (OCCViewer_ViewWindow::FocusIODType)theType, theValue );
+  }
+}
+
+/*!
+  \return anaglyph filter
+*/
+int OCCViewer_Viewer::anaglyphFilter() const
+{
+  return myAnaglyphFilter;
+}
+
+/*!
+  Sets anaglyph filter
+  \param theType - new anaglyph filter
+*/
+void OCCViewer_Viewer::setAnaglyphFilter( const int theType )
+{
+  myAnaglyphFilter = theType;
+
+  if ( !myViewManager )
+    return;
+
+  QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+  for ( int i = 0; i < (int)wins.count(); i++ )
+  {
+    OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+    if ( win )
+      win->setAnaglyphFilter( (OCCViewer_ViewWindow::AnaglyphFilter)theType );
+  }
+}
+
+/*!
+  \return reverse stereo
+*/
+bool OCCViewer_Viewer::isReverseStereo() const
+{
+  return myToReverseStereo;
+}
+
+/*!
+  Sets reverse stereo
+  \param theReverse - enable/disable reverse mode
+*/
+void OCCViewer_Viewer::setReverseStereo( const bool theReverse )
+{
+  myToReverseStereo = theReverse;
+
+  if ( !myViewManager )
+    return;
+
+  QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+  for ( int i = 0; i < (int)wins.count(); i++ )
+  {
+    OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+    if ( win )
+      win->setReverseStereo( theReverse );
+  }
+}
+
+/*!
+  \return V-Sync mode
+*/
+bool OCCViewer_Viewer::isVSync() const
+{
+  return myVSyncMode;
+}
+
+/*!
+  Set V-Sync mode
+  \param theEnable - enable/disable V-Sync mode
+*/
+void OCCViewer_Viewer::setVSync( const bool theEnable )
+{
+  myVSyncMode = theEnable;
+
+  if ( !myViewManager )
+    return;
+
+  QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+  for ( int i = 0; i < (int)wins.count(); i++ )
+  {
+    OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+    if ( win )
+      win->setVSync( theEnable );
+  }
+}
+
+/*!
+  \return support quad-buffered stereo
+*/
+bool OCCViewer_Viewer::isQuadBufferSupport() const
+{
+  return myQuadBufferSupport;
+}
+
+/*!
+  Set support quad-buffered stereo
+  \param theEnable - enable/disable support quad-buffered stereo
+*/
+void OCCViewer_Viewer::setQuadBufferSupport( const bool theEnable )
+{
+  myQuadBufferSupport = theEnable;
+
+  if ( !myViewManager )
+    return;
+
+  QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+  for ( int i = 0; i < (int)wins.count(); i++ )
+  {
+    OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+    if ( win )
+      win->setQuadBufferSupport( theEnable );
+  }
+}
+
 /*!
   \return zooming style
 */
index 6bd1e12710244969e234ca0d420434f9386713b0..04fd3d53ecb5ddaa97aa9adf4b40278c23674fb1 100755 (executable)
@@ -69,9 +69,17 @@ public:
     Corner3Gradient,    Corner4Gradient,
     LastGradient = Corner4Gradient
   };
+  /*! supported stereo types */
+  enum {
+    QuadBufferType,    AnaglyphType,
+    RowInterlacedType, ColumnInterlacedType,
+    ChessBoardType,    SideBySideType,
+    OverUnderType
+  };
   
   static QString           Type() { return "OCCViewer"; }
   static QString           backgroundData( QStringList&, QIntList&, QIntList& );
+  static void              stereoData( QStringList&, QIntList&);
 
   OCCViewer_Viewer( bool DisplayTrihedron = true);
   virtual ~OCCViewer_Viewer();
@@ -136,6 +144,29 @@ public:
   int                             projectionType() const;
   void                            setProjectionType( const int );
 
+  int                             stereoType() const;
+  void                            setStereoType( const int );
+
+  int                             anaglyphFilter() const;
+  void                            setAnaglyphFilter( const int );
+
+  void                            setStereographicFocus( const int, const double );
+  int                             stereographicFocusType() const;
+  double                          stereographicFocusValue() const;
+
+  void                            setInterocularDistance( const int, const double );
+  int                             interocularDistanceType() const;
+  double                          interocularDistanceValue() const;
+
+  bool                            isReverseStereo() const;
+  void                            setReverseStereo( const bool );
+
+  bool                            isVSync() const;
+  void                            setVSync( const bool );
+
+  bool                            isQuadBufferSupport() const;
+  void                            setQuadBufferSupport( const bool );
+
   int                             zoomingStyle() const;
   void                            setZoomingStyle( const int );
 
@@ -212,11 +243,21 @@ protected:
   int                             myInteractionStyle;
   int                             myZoomingStyle;
   int                             myProjectionType;
+  int                             myStereoType;
+  int                             myAnaglyphFilter;
+  int                             myStereographicFocusType;
+  int                             myInterocularDistanceType;
+
+  double                          myStereographicFocusValue;
+  double                          myInterocularDistanceValue;
 
   bool                            myPreselectionEnabled;
   bool                            mySelectionEnabled;
   bool                            myMultiSelectionEnabled;
   bool                            myIsRelative;
+  bool                            myToReverseStereo;
+  bool                            myVSyncMode;
+  bool                            myQuadBufferSupport;
 
   int                             myTopLayerId;
 
index 7fa8797e2038e772e9f2b2e32e3679889da4b9f5..cc6d7bf5a496d68a28ce9401c1e20304d940803b 100755 (executable)
@@ -614,6 +614,17 @@ void OCCViewer_ViewPort3d::resizeEvent( QResizeEvent* e )
     activeView()->MustBeResized();
 }
 
+/*!
+  Moved the viewport
+*/
+/*
+void OCCViewer_ViewPort3d::repaintViewAfterMove( )
+{
+  if ( !activeView().IsNull() ){
+    activeView()->MustBeResized();
+  }
+}
+*/
 /*!
   Fits all objects in view. [ virtual protected ]
 */
index 5ac793fb399b4d0b65b2bb1a189268f0d0a1a3e3..7f8841a25e2523ca88716d8f86f00d4af86dc1eb 100755 (executable)
@@ -94,6 +94,8 @@ public:
 
   void                  showStaticTrihedron( bool );
 
+  //void                  repaintViewAfterMove( );
+
   void                  setDefaultCursor( Qt::CursorShape theCursorShape );
   QCursor*              getDefaultCursor() const;
 
index 0599c7534b8d2a921b773998d43c0b17388f3c55..d4ff42f3743603d3003080b9774aeedfa313e63e 100755 (executable)
@@ -35,8 +35,6 @@
 #include "OCCViewer_CubeAxesDlg.h"
 #include "OCCViewer_ClippingDlg.h"
 
-#include <Basics_OCCTVersion.hxx>
-
 #include <SUIT_Desktop.h>
 #include <SUIT_Session.h>
 #include <SUIT_ViewManager.h>
@@ -49,7 +47,7 @@
 #include <QtxMultiAction.h>
 #include <QtxRubberBand.h>
 
-#include <OpenGLUtils_FrameBuffer.h>
+#include <Basics_OCCTVersion.hxx>
 
 #include <QPainter>
 #include <QTime>
 #include <GProp_GProps.hxx>
 #include <TopoDS.hxx>
 
+#include <Graphic3d_SequenceOfHClipPlane.hxx>
+#include <Graphic3d_ClipPlane.hxx>
+#include <OpenGl_GraphicDriver.hxx>
+#include <OpenGLUtils_FrameBuffer.h>
+
 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
 #include <Graphic3d_MapOfStructure.hxx>
 #include <Graphic3d_Structure.hxx>
 #include <Graphic3d_ExportFormat.hxx>
+#include <Graphic3d_StereoMode.hxx>
+#include <Graphic3d_RenderingParams.hxx>
+
 
 #include <Visual3d_View.hxx>
 #include <V3d_Plane.hxx>
@@ -84,9 +90,6 @@
 #include <gp_GTrsf.hxx>
 #include <TColgp_Array1OfPnt2d.hxx>
 
-#include <Graphic3d_SequenceOfHClipPlane.hxx>
-#include <Graphic3d_ClipPlane.hxx>
-
 #include <Image_PixMap.hxx>
 
 #include <Standard_Version.hxx>
@@ -105,6 +108,12 @@ static QEvent* l_mbPressEvent = 0;
 
 #include <GL/gl.h>
 
+// To avoid conflict between KeyPress from the X.h (define KeyPress 2)
+// and QEvent::KeyPress (qevent.h)
+#ifdef KeyPress
+#undef KeyPress
+#endif
+
 const char* imageZoomCursor[] = {
 "32 32 3 1",
 ". c None",
@@ -252,7 +261,6 @@ OCCViewer_ViewWindow::OCCViewer_ViewWindow( SUIT_Desktop*     theDesktop,
   myCursorIsHand = false;
 
   clearViewAspects();
-
 }
 
 /*!
@@ -1293,10 +1301,19 @@ void OCCViewer_ViewWindow::createActions()
   //connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onProjectionType()));
   toolMgr()->registerAction( aAction, PerspectiveId );
 
+  // - stereo projection
+  aAction = new QtxAction(tr("MNU_STEREO_MODE"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_STEREO" ) ),
+                          tr( "MNU_STEREO_MODE" ), 0, this);
+  aAction->setStatusTip(tr("DSC_STEREO_MODE"));
+  aAction->setCheckable(true);
+  toolMgr()->registerAction( aAction, StereoId );
+  //connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onProjectionType()));
+
   // - add exclusive action group
   QActionGroup* aProjectionGroup = new QActionGroup( this );
   aProjectionGroup->addAction( toolMgr()->action( OrthographicId ) );
   aProjectionGroup->addAction( toolMgr()->action( PerspectiveId ) );
+  aProjectionGroup->addAction( toolMgr()->action( StereoId ) );
   connect(aProjectionGroup, SIGNAL(triggered(QAction*)), this, SLOT(onProjectionType()));
 
   // Reset
@@ -1481,6 +1498,7 @@ void OCCViewer_ViewWindow::createToolBar()
 
     toolMgr()->append( OrthographicId, tid );
     toolMgr()->append( PerspectiveId, tid );
+    toolMgr()->append( StereoId, tid );
 
     toolMgr()->append( ResetId, tid );
   }
@@ -1628,7 +1646,13 @@ void OCCViewer_ViewWindow::onResetView()
 void OCCViewer_ViewWindow::onProjectionType()
 {
   emit vpTransformationStarted( PROJECTION );
-  setProjectionType( toolMgr()->action( OrthographicId )->isChecked() ? Orthographic : Perspective );
+  if (toolMgr()->action( OrthographicId )->isChecked())
+    setProjectionType( Orthographic);
+  if (toolMgr()->action( PerspectiveId )->isChecked())
+    setProjectionType( Perspective);
+  if (toolMgr()->action( StereoId )->isChecked()) {
+    setProjectionType( Stereo);
+  }
   emit vpTransformationFinished( PROJECTION );
 }
 
@@ -2793,13 +2817,57 @@ void OCCViewer_ViewWindow::setProjectionType( int mode )
   Handle(V3d_View) aView3d = myViewPort->getView();
   if ( !aView3d.IsNull() ) {
     Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
-    aCamera->SetProjectionType( mode == Perspective ? Graphic3d_Camera::Projection_Perspective : Graphic3d_Camera::Projection_Orthographic );
+    if (mode == Perspective)
+      aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Perspective );
+    if (mode == Orthographic)
+      aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Orthographic );
+    if (mode == Stereo) {
+      aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Stereo );
+      SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+      setStereoType( aResMgr->integerValue( "OCCViewer", "stereo_type", 0 ) );
+      setAnaglyphFilter( aResMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 ) );
+      setReverseStereo( aResMgr->booleanValue( "OCCViewer", "reverse_stereo", false ) );
+      setVSync( aResMgr->booleanValue( "OCCViewer", "enable_vsync", true ) );
+      setQuadBufferSupport( aResMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", true ) );
+    }
+    aView3d->Redraw();
     onViewFitAll();
   }
   // update action state if method is called outside
-  QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( mode == Orthographic ? OrthographicId : PerspectiveId ) );
-  if ( ! a->isChecked() )
-    a->setChecked( true );
+  QtxAction* anOrthographicAction = dynamic_cast<QtxAction*>( toolMgr()->action( OrthographicId ) );
+  QtxAction* aPerspectiveAction = dynamic_cast<QtxAction*>( toolMgr()->action( PerspectiveId ) );
+  QtxAction* aStereoAction = dynamic_cast<QtxAction*>( toolMgr()->action( StereoId ) );
+  if ( mode == Orthographic && !anOrthographicAction->isChecked() ) {
+         anOrthographicAction->setChecked( true );
+  }
+  if ( mode == Perspective && !aPerspectiveAction->isChecked() ) {
+         aPerspectiveAction->setChecked( true );
+  }
+  if ( mode == Stereo ) {
+    if ( anOrthographicAction->isEnabled() )
+      anOrthographicAction->setDisabled( true );
+    else
+      anOrthographicAction->setEnabled( true );
+    if ( aPerspectiveAction->isEnabled() ) {
+      aPerspectiveAction->setChecked( true );
+      aPerspectiveAction->setDisabled( true );
+      if ( isQuadBufferSupport() ) {
+        if ( !isOpenGlStereoSupport() && stereoType() == QuadBuffer )
+          SUIT_MessageBox::warning( 0, tr( "WRN_WARNING" ),  tr( "WRN_SUPPORT_QUAD_BUFFER" ) );
+      }
+    }
+    else {
+      aPerspectiveAction->setChecked( true );
+      aPerspectiveAction->setEnabled( true );
+      onProjectionType();
+    }
+  }
+  else {
+    if ( !anOrthographicAction->isEnabled() )
+      anOrthographicAction->setEnabled( true );
+    if ( !aPerspectiveAction->isEnabled() )
+      aPerspectiveAction->setEnabled( true );
+  }
 }
 
 int OCCViewer_ViewWindow::projectionType() const
@@ -2808,11 +2876,201 @@ int OCCViewer_ViewWindow::projectionType() const
   Handle(V3d_View) aView3d = myViewPort->getView();
   if ( !aView3d.IsNull() ) {
     Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
-    mode = aCamera->ProjectionType() == Graphic3d_Camera::Projection_Perspective ? Perspective : Orthographic;
+    if (aCamera->ProjectionType() == Graphic3d_Camera::Projection_Perspective)
+      mode = Perspective;
+    if (aCamera->ProjectionType() == Graphic3d_Camera::Projection_Orthographic)
+      mode = Orthographic;
+    if (aCamera->ProjectionType() == Graphic3d_Camera::Projection_Stereo)
+      mode = Stereo;
   }
   return mode;
 }
 
+void OCCViewer_ViewWindow::setStereoType( int type )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    aParams->StereoMode = (Graphic3d_StereoMode)type;
+  }
+}
+
+int OCCViewer_ViewWindow::stereoType() const
+{
+  int type = QuadBuffer;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    type = (OCCViewer_ViewWindow::StereoType)aParams->StereoMode;
+  }
+  return type;
+}
+
+void OCCViewer_ViewWindow::setAnaglyphFilter( int type )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    if (type == RedCyan)
+      aParams->AnaglyphFilter = Graphic3d_RenderingParams::Anaglyph_RedCyan_Optimized;
+    if (type == YellowBlue)
+      aParams->AnaglyphFilter = Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized;
+    if (type == GreenMagenta)
+      aParams->AnaglyphFilter = Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple;
+  }
+}
+
+int OCCViewer_ViewWindow::anaglyphFilter() const
+{
+  int type = RedCyan;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    if (aParams->AnaglyphFilter == Graphic3d_RenderingParams::Anaglyph_RedCyan_Optimized)
+      type = RedCyan;
+    if (aParams->AnaglyphFilter == Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized)
+      type = YellowBlue;
+    if (aParams->AnaglyphFilter == Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple)
+      type = GreenMagenta;
+  }
+  return type;
+}
+
+void OCCViewer_ViewWindow::setStereographicFocus( int type, double value )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    aCamera->SetZFocus( (Graphic3d_Camera::FocusType) type, value );
+  }
+}
+
+int OCCViewer_ViewWindow::stereographicFocusType() const
+{
+  int type = Relative;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    type = (OCCViewer_ViewWindow::FocusIODType)aCamera->ZFocusType();
+  }
+  return type;
+}
+
+double OCCViewer_ViewWindow::stereographicFocusValue() const
+{
+  double value = 1.0;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    value = aCamera->ZFocus();
+  }
+  return value;
+}
+
+void OCCViewer_ViewWindow::setInterocularDistance( int type, double value )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    aCamera->SetIOD( (Graphic3d_Camera::IODType) type, value );
+  }
+}
+
+int OCCViewer_ViewWindow::interocularDistanceType() const
+{
+  int type = Relative;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    type = (OCCViewer_ViewWindow::FocusIODType)aCamera->GetIODType();
+  }
+  return type;
+}
+
+double OCCViewer_ViewWindow::interocularDistanceValue() const
+{
+  double value = 0.05;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Handle(Graphic3d_Camera) aCamera = aView3d->Camera();
+    value = aCamera->IOD();
+  }
+  return value;
+}
+
+void OCCViewer_ViewWindow::setReverseStereo( bool reverse )
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    aParams->ToReverseStereo = reverse;
+  }
+}
+
+bool OCCViewer_ViewWindow::isReverseStereo() const
+{
+  int reverse = false;
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams();
+    reverse = aParams->ToReverseStereo;
+  }
+  return reverse;
+}
+
+void OCCViewer_ViewWindow::setVSync( bool enable )
+{
+  Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext();
+  if ( !anIntCont.IsNull() ) {
+    Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver());
+    OpenGl_Caps* aCaps = &aDriver->ChangeOptions();
+    aCaps->swapInterval = enable;
+  }
+}
+
+bool OCCViewer_ViewWindow::isVSync() const
+{
+  int enable = true;
+  Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext();
+  if ( !anIntCont.IsNull() ) {
+    Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver());
+    OpenGl_Caps* aCaps = &aDriver->ChangeOptions();
+    enable = aCaps->swapInterval;
+  }
+  return enable;
+}
+
+void OCCViewer_ViewWindow::setQuadBufferSupport( bool enable )
+{
+  Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext();
+  if ( !anIntCont.IsNull() ) {
+    Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver());
+    OpenGl_Caps* aCaps = &aDriver->ChangeOptions();
+    aCaps->contextStereo = enable;
+  }
+}
+
+bool OCCViewer_ViewWindow::isQuadBufferSupport() const
+{
+  int enable = true;
+  Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext();
+  if ( !anIntCont.IsNull() ) {
+    Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver());
+    OpenGl_Caps* aCaps = &aDriver->ChangeOptions();
+    enable = aCaps->contextStereo;
+  }
+  return enable;
+}
+
+bool OCCViewer_ViewWindow::isOpenGlStereoSupport() const
+{
+  GLboolean support[1];
+  glGetBooleanv (GL_STEREO, support);
+  if ( support[0] )
+    return true;
+  return false;
+}
+
 // obsolete
 QColor OCCViewer_ViewWindow::backgroundColor() const
 {
index c0a0237715f49cdcf90942aff477cc060bc035ba..08f4202e36ebe299ccb832e69027767a49de7a94 100755 (executable)
@@ -151,7 +151,7 @@ public:
         SwitchInteractionStyleId, SwitchZoomingStyleId, 
         SwitchPreselectionId, SwitchSelectionId,
         MaximizedId, SynchronizeId, ReturnTo3dViewId,
-        OrthographicId, PerspectiveId,
+        OrthographicId, PerspectiveId, StereoId,
         UserId };
 
   enum OperationType{ NOTHING, PANVIEW, ZOOMVIEW, ROTATE, 
@@ -165,8 +165,14 @@ public:
 
   enum Mode2dType { No2dMode, XYPlane, XZPlane, YZPlane };
 
-  enum ProjectionType { Orthographic, Perspective };
+  enum ProjectionType { Orthographic, Perspective, Stereo };
   
+  enum StereoType { QuadBuffer, Anaglyph, RowInterlaced, ColumnInterlaced, ChessBoard, SideBySide, OverUnder, SoftPageFlip, NumberOfModes };
+
+  enum AnaglyphFilter { RedCyan, YellowBlue, GreenMagenta };
+
+  enum FocusIODType { Absolute, Relative };
+
   OCCViewer_ViewWindow(SUIT_Desktop* theDesktop, OCCViewer_Viewer* theModel);
   virtual ~OCCViewer_ViewWindow();
 
@@ -211,6 +217,29 @@ public:
   virtual int                     projectionType() const;
   virtual void                    setProjectionType( int );
 
+  virtual int                     stereoType() const;
+  virtual void                    setStereoType( const int );
+
+  virtual int                     anaglyphFilter() const;
+  virtual void                    setAnaglyphFilter( const int );
+
+  virtual void                    setStereographicFocus( const int, const double );
+  virtual int                     stereographicFocusType() const;
+  virtual double                  stereographicFocusValue() const;
+
+  virtual void                    setInterocularDistance( const int, const double );
+  virtual int                     interocularDistanceType() const;
+  virtual double                  interocularDistanceValue() const;
+
+  virtual bool                    isReverseStereo() const;
+  virtual void                    setReverseStereo( const bool );
+
+  virtual bool                    isVSync() const;
+  virtual void                    setVSync( const bool );
+
+  virtual bool                    isQuadBufferSupport() const;
+  virtual void                    setQuadBufferSupport( const bool );
+
   void setTransformEnabled( const OperationType, const bool );
   bool transformEnabled( const OperationType ) const;
 
@@ -304,6 +333,8 @@ public:
 protected:
   virtual QString  filter() const;
 
+  bool isOpenGlStereoSupport() const;
+
   /* Transformation selected but not started yet */
   bool transformRequested() const;
   bool setTransformRequested ( OperationType );
@@ -322,7 +353,7 @@ protected:
 
   void createActions();
   void createToolBar();
+
   virtual OperationType getButtonState(QMouseEvent* theEvent, int theInteractionStyle);
 
   viewAspect getViewParams() const;
index 74b1e9f567721636aeb62018a9857232a07b8fcd..ee8fbb6a0ba19d7c6f2f55c704950bb59a671167 100644 (file)
         <source>ICON_OCCVIEWER_PERSPECTIVE</source>
         <translation>occ_view_perspective.png</translation>
     </message>
+    <message>
+        <source>ICON_OCCVIEWER_STEREO</source>
+        <translation>occ_view_stereo.png</translation>
+    </message>
 </context>
 </TS>
index a533aa166029cf35c03e76e106e559c03cf414ef..5c993519b32c53b3f1b022e3254f9d779cf588da 100644 (file)
         <source>DSC_PERSPECTIVE_MODE</source>
         <translation>Set the perspective projection type</translation>
     </message>
+    <message>
+        <source>MNU_STEREO_MODE</source>
+        <translation>Stereo projection</translation>
+    </message>
+    <message>
+        <source>DSC_STEREO_MODE</source>
+        <translation>Set the stereo projection type</translation>
+    </message>
+    <message>
+        <source>WRN_SUPPORT_QUAD_BUFFER</source>
+        <translation>Graphic driver not support quad-buffer</translation>
+    </message>
 </context>
 <context>
     <name>OCCViewer_CreateRestoreViewDlg</name>
         <source>BG_IMAGE_FILES</source>
         <translation>Image files (*.bmp *.gif *.pix *.xwd *.rgb *.rs)</translation>
     </message>
+    <message>
+        <source>ST_QUADBUFFER</source>
+        <translation>Shutter glasses (OpenGL quad-buffer)</translation>
+    </message>
+    <message>
+        <source>ST_ANAGLYPH</source>
+        <translation>Anaglyph</translation>
+    </message>
+    <message>
+        <source>ST_ROWINTERLACED</source>
+        <translation>Row-interlaced</translation>
+    </message>
+    <message>
+        <source>ST_COLUMNINTERLACED</source>
+        <translation>Column-interlaced</translation>
+    </message>
+    <message>
+        <source>ST_CHESSBOARD</source>
+        <translation>Chess-board stereo for DLP TVs</translation>
+    </message>
+    <message>
+        <source>ST_SIDEBYSIDE</source>
+        <translation>Horizontal-anamorphic (side-by-side)</translation>
+    </message>
+    <message>
+        <source>ST_OVERUNDER</source>
+        <translation>Vertical-anamorphic (Half OverUnder)</translation>
+    </message>
 </context>
 <context>
     <name>OCCViewer_AxialScaleDlg</name>
index 87e685c0214a1493852da8a1258399f16b7d8f41..df2e06769ed87ff7b6520875ca9a1a792c010dd1 100755 (executable)
         <source>DSC_PERSPECTIVE_MODE</source>
         <translation>Choisir la projection en perspective</translation>
     </message>
+    <message>
+        <source>MNU_STEREO_MODE</source>
+        <translation type="unfinished">Stereo projection</translation>
+    </message>
+    <message>
+        <source>DSC_STEREO_MODE</source>
+        <translation type="unfinished">Set the stereo projection type</translation>
+    </message>
+    <message>
+        <source>WRN_SUPPORT_QUAD_BUFFER</source>
+        <translation type="unfinished">Graphic driver not support quad-buffer</translation>
+    </message>
 </context>
 <context>
     <name>OCCViewer_CreateRestoreViewDlg</name>
         <source>BG_IMAGE_FILES</source>
         <translation>Fichiers images (*.bmp *.gif *.pix *.xwd *.rgb *.rs)</translation>
     </message>
+    <message>
+        <source>ST_QUADBUFFER</source>
+        <translation type="unfinished">Shutter glasses (OpenGL quad-buffer)</translation>
+    </message>
+    <message>
+        <source>ST_ANAGLYPH</source>
+        <translation type="unfinished">Anaglyph</translation>
+    </message>
+    <message>
+        <source>ST_ROWINTERLACED</source>
+        <translation type="unfinished">Row-interlaced</translation>
+    </message>
+    <message>
+        <source>ST_COLUMNINTERLACED</source>
+        <translation type="unfinished">Column-interlaced</translation>
+    </message>
+    <message>
+        <source>ST_CHESSBOARD</source>
+        <translation type="unfinished">Chess-board stereo for DLP TVs</translation>
+    </message>
+    <message>
+        <source>ST_SIDEBYSIDE</source>
+        <translation type="unfinished">Horizontal-anamorphic (side-by-side)</translation>
+    </message>
+    <message>
+        <source>ST_OVERUNDER</source>
+        <translation type="unfinished">Vertical-anamorphic (Half OverUnder)</translation>
+    </message>
 </context>
 <context>
     <name>OCCViewer_AxialScaleDlg</name>
index f88b6b5dabe018025239abd7c8366faca1e72258..c05ea384d9e68e86657b69aec033db441ca83a8a 100644 (file)
       <source>DSC_PERSPECTIVE_MODE</source>
       <translation>透視投影を選択します。</translation>
     </message>
+    <message>
+      <source>MNU_STEREO_MODE</source>
+      <translation type="unfinished">Stereo projection</translation>
+    </message>
+    <message>
+      <source>DSC_STEREO_MODE</source>
+      <translation type="unfinished">Set the stereo projection type</translation>
+    </message>
+    <message>
+      <source>WRN_SUPPORT_QUAD_BUFFER</source>
+      <translation type="unfinished">Graphic driver not support quad-buffer</translation>
+    </message>
   </context>
   <context>
     <name>OCCViewer_CreateRestoreViewDlg</name>
       <source>BG_IMAGE_FILES</source>
       <translation>イメージ ファイル (*.bmp *.gif *.pix *.xwd *.rgb * .rs)</translation>
     </message>
+    <message>
+      <source>ST_QUADBUFFER</source>
+      <translation type="unfinished">Shutter glasses (OpenGL quad-buffer)</translation>
+    </message>
+    <message>
+      <source>ST_ANAGLYPH</source>
+      <translation type="unfinished">Anaglyph</translation>
+    </message>
+    <message>
+      <source>ST_ROWINTERLACED</source>
+      <translation type="unfinished">Row-interlaced</translation>
+    </message>
+    <message>
+      <source>ST_COLUMNINTERLACED</source>
+      <translation type="unfinished">Column-interlaced</translation>
+    </message>
+    <message>
+      <source>ST_CHESSBOARD</source>
+      <translation type="unfinished">Chess-board stereo for DLP TVs</translation>
+    </message>
+    <message>
+      <source>ST_SIDEBYSIDE</source>
+      <translation type="unfinished">Horizontal-anamorphic (side-by-side)</translation>
+    </message>
+    <message>
+      <source>ST_OVERUNDER</source>
+      <translation type="unfinished">Vertical-anamorphic (Half OverUnder)</translation>
+    </message>
   </context>
   <context>
     <name>OCCViewer_AxialScaleDlg</name>
diff --git a/src/OCCViewer/resources/occ_view_stereo.png b/src/OCCViewer/resources/occ_view_stereo.png
new file mode 100644 (file)
index 0000000..218a2a6
Binary files /dev/null and b/src/OCCViewer/resources/occ_view_stereo.png differ
index 3b147fc676d35e2831d82cf11f55d77c00c3dec4..a4df0a7c3ae87ae80f2753a36942249da2965ce1 100755 (executable)
@@ -2117,6 +2117,7 @@ Qt::HANDLE Qtx::getVisual()
     GLX_RGBA,           // Needs to support OpenGL
     GLX_DEPTH_SIZE, 16, // Needs to support a 16 bit depth buffer
     GLX_DOUBLEBUFFER,   // Needs to support double-buffering
+    GLX_STEREO,         // Needs to support stereo rendering
     GLX_STENCIL_SIZE, 1,
     None                // end of list
   };
index b4abe7b8fd5367b79cae1581b89da6083abe13cc..cd8944258b9ee22fbdf540290929486430533c4a 100644 (file)
@@ -528,16 +528,16 @@ QtxWorkstackArea::QtxWorkstackArea( QWidget* parent )
   base->setMargin( frameWidth() );
   base->setSpacing( 0 );
 
-  QWidget* top = new QWidget( this );
-  base->addWidget( top );
+  myTop = new QWidget( this );
+  base->addWidget( myTop );
 
-  QHBoxLayout* tl = new QHBoxLayout( top );
+  QHBoxLayout* tl = new QHBoxLayout( myTop );
   tl->setMargin( 0 );
 
-  myBar = new QtxWorkstackTabBar( top );
+  myBar = new QtxWorkstackTabBar( myTop );
   tl->addWidget( myBar, 1 );
 
-  CloseButton* close = new CloseButton( top );
+  CloseButton* close = new CloseButton( myTop );
   close->setIcon( style()->standardIcon( QStyle::SP_TitleBarCloseButton ) );
   myClose = close;
   tl->addWidget( myClose );
@@ -902,6 +902,16 @@ bool QtxWorkstackArea::restoreState( QDataStream& stream, QMap<QString, QtxWorks
   return true;
 }
 
+/*!
+  \brief Show/Hide tab bar.
+*/
+void QtxWorkstackArea::showTabBar( bool visible)
+{
+  myTop->setVisible(visible);
+  myBar->setVisible(visible);
+}
+
+
 /*!
   \brief Get rectangle to be drawn when highlighting drop area.
   \return area drop rectangle
@@ -3179,6 +3189,23 @@ bool QtxWorkstack::opaqueResize() const
   return mySplit->opaqueResize();
 }
 
+/*!
+  \brief Show/Hide active tab bar.
+*/
+void QtxWorkstack::showActiveTabBar( bool visible )
+{
+  QList<QtxWorkstackArea*> areaList;
+  areas( mySplit, areaList, true );
+  QList<QtxWorkstackArea*>::ConstIterator it;
+  for ( it = areaList.begin(); it != areaList.end(); ++it )
+  {
+    (*it)->showTabBar( visible );
+  }
+  QList<QSplitter*> recList;
+  splitters( mySplit, recList, true );
+  for ( QList<QSplitter*>::iterator itr = recList.begin(); itr != recList.end(); ++itr )
+    (*itr)->setVisible(visible);
+}
 
 /*!
   \fn void QtxWorkstack::windowActivated( QWidget* w )
index 8772058a5ea9cfd498e3365428b4a3350b91e9b7..6d8e89bd2d21881c0e3bbf26dba8ebefc275e8c9 100644 (file)
@@ -116,6 +116,8 @@ public:
   void                setOpaqueResize( bool = true );
   bool                opaqueResize() const;
 
+  void                showActiveTabBar( bool = true );
+
   void Split( QWidget* wid, const Qt::Orientation o, const SplitType type );
   void Attract( QWidget* wid1, QWidget* wid2, const bool all );
   void SetRelativePosition( QWidget* wid, const Qt::Orientation o, const double pos );
@@ -244,6 +246,8 @@ public:
   void                saveState( QDataStream& ) const;
   bool                restoreState( QDataStream&, QMap<QString, QtxWorkstackChild*>& );
 
+  void                showTabBar( bool = true);
+
 signals:
   void                activated( QWidget* );
   void                contextMenuRequested( QWidget*, QPoint );
@@ -294,6 +298,7 @@ private:
   typedef QList<QtxWorkstackChild*> ChildList;
 
 private:
+  QWidget*            myTop;     //!< workarea top widget
   QtxWorkstackTabBar* myBar;     //!< workarea tab bar header
   ChildList           myList;    //!< child widgets list
   QAbstractButton*    myClose;   //!< close button
index 00f89a799be913872a2bc96853a8d2df5c514b47..811be3e9a838949bf08e2b9e97d7e4a1baab0b53 100755 (executable)
@@ -278,6 +278,7 @@ void SUIT_Application::setDesktop( SUIT_Desktop* desk )
   myDesktop = desk;
   if ( myDesktop ) {
     connect( myDesktop, SIGNAL( activated() ), this, SLOT( onDesktopActivated() ) );
+//    connect( myDesktop, SIGNAL( moved() ), this, SLOT( onDesktopMoved() ) );
     // Force desktop activation (NPAL16628)
     QApplication::postEvent(myDesktop, new QEvent(QEvent::WindowActivate));
   }
@@ -689,6 +690,13 @@ void SUIT_Application::onDesktopActivated()
   emit activated( this );
 }
 
+/*!
+  SLOT: it is called when desktop is moved
+*/
+/*void SUIT_Application::onDesktopMoved()
+{
+  emit moving();
+}*/
 /*!
   SLOT: is used for Help browsing
 */
index 917c3872b27d916157f2e5f662bf965fb9b1b260..542b160bb3ea05dd37575dd3c43c4fb0f312dc2c 100755 (executable)
@@ -118,6 +118,7 @@ public:
 signals:
   void                  applicationClosed( SUIT_Application* );
   void                  activated( SUIT_Application* );
+//  void                  moving();
   void                  infoChanged( QString );
 
 public slots:
@@ -176,6 +177,7 @@ protected:
 
 protected slots:
   virtual void          onDesktopActivated();
+//  void                  onDesktopMoved();
 
 private:
   SUIT_Study*           myStudy;
index e0cbd04a03f8daf457007c40c9b420ff71554576..96bc10f3dbd6b3ed71324b679710474d20850fc2 100755 (executable)
@@ -84,6 +84,9 @@ bool SUIT_Desktop::event( QEvent* e )
   case QEvent::WindowDeactivate:
     emit deactivated();
     break;
+ /*case QEvent::Move:
+    emit moved();
+    break;*/
   default:
     break;
   }
index c1f62e4d7087653089ee1b0b2a27783b33f83ae9..8a0a17e53ccb0476f604b92cfeac6cf1764d03e1 100755 (executable)
@@ -76,6 +76,7 @@ public:
 signals:
   void                     activated();
   void                     deactivated();
+//  void                     moved();
   void                     windowActivated( SUIT_ViewWindow* );
   void                     closing( SUIT_Desktop*, QCloseEvent* );
   void                     message( const QString& );