0024001: Stereographic rendering support
authorduv <duv@opencascade.com>
Thu, 23 Jan 2014 10:44:31 +0000 (14:44 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 23 Jan 2014 10:46:06 +0000 (14:46 +0400)
Deleted TODOs which were used when branch was built without OpenCL.
Modified test case bugs/vis/bug23747_2 (changed textured shape)

99 files changed:
samples/mfc/standard/04_Viewer3d/src/Viewer3d.aps
samples/mfc/standard/05_ImportExport/res/ImportExport.rc
samples/mfc/standard/05_ImportExport/res/Toolbar.bmp
samples/mfc/standard/09_Animation/src/AnimationView3D.cpp
samples/mfc/standard/09_Animation/src/AnimationView3D.h
samples/mfc/standard/09_Animation/src/StdAfx.h
samples/mfc/standard/Common/OCC_3dView.cpp
samples/mfc/standard/Common/OCC_3dView.h
samples/mfc/standard/Common/OCC_App.cpp
samples/mfc/standard/Common/OCC_App.h
samples/mfc/standard/Common/OCC_BaseDoc.cpp
samples/mfc/standard/Common/OCC_BaseDoc.h
samples/mfc/standard/Common/OCC_StereoConfigDlg.cpp [new file with mode: 0644]
samples/mfc/standard/Common/OCC_StereoConfigDlg.h [new file with mode: 0644]
samples/mfc/standard/Common/res/3dChildFrameTB.bmp
samples/mfc/standard/Common/res/OCC_Resource.aps [new file with mode: 0755]
samples/mfc/standard/Common/res/OCC_Resource.h
samples/mfc/standard/Common/res/OCC_Resource.rc
samples/mfc/standard/mfcsample/adm/win/vc10/mfcsample.vcxproj
samples/mfc/standard/mfcsample/adm/win/vc10/mfcsample.vcxproj.filters
samples/mfc/standard/mfcsample/adm/win/vc11/mfcsample.vcxproj
samples/mfc/standard/mfcsample/adm/win/vc11/mfcsample.vcxproj.filters
samples/mfc/standard/mfcsample/adm/win/vc8/mfcsample.vcproj
samples/mfc/standard/mfcsample/adm/win/vc9/mfcsample.vcproj
src/Graphic3d/FILES
src/Graphic3d/Graphic3d.cdl
src/Graphic3d/Graphic3d_CView.hxx
src/Graphic3d/Graphic3d_Camera.cxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_Camera.hxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_Camera_Handle.hxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_GraphicDriver.cdl
src/NCollection/FILES
src/NIS/Handle_NIS_View.hxx
src/NIS/NIS_View.cxx
src/NIS/NIS_View.hxx
src/OpenGl/FILES
src/OpenGl/OpenGl_Context.cxx
src/OpenGl/OpenGl_Context.hxx
src/OpenGl/OpenGl_Display.cxx
src/OpenGl/OpenGl_Display.hxx
src/OpenGl/OpenGl_Flipper.cxx
src/OpenGl/OpenGl_GraphicDriver.hxx
src/OpenGl/OpenGl_GraphicDriver_2.cxx
src/OpenGl/OpenGl_GraphicDriver_7.cxx
src/OpenGl/OpenGl_ShaderManager.cxx
src/OpenGl/OpenGl_ShaderManager.hxx
src/OpenGl/OpenGl_ShaderStates.cxx
src/OpenGl/OpenGl_ShaderStates.hxx
src/OpenGl/OpenGl_Structure.cxx
src/OpenGl/OpenGl_Trihedron.cxx
src/OpenGl/OpenGl_View.cxx
src/OpenGl/OpenGl_View.hxx
src/OpenGl/OpenGl_View_1.cxx [deleted file]
src/OpenGl/OpenGl_View_2.cxx
src/OpenGl/OpenGl_Window.cxx
src/OpenGl/OpenGl_Workspace.cxx
src/OpenGl/OpenGl_Workspace_2.cxx
src/OpenGl/OpenGl_Workspace_5.cxx
src/OpenGl/OpenGl_Workspace_Raytrace.cxx
src/OpenGl/OpenGl_telem_view.cxx [deleted file]
src/OpenGl/OpenGl_telem_view.hxx [deleted file]
src/PrsMgr/PrsMgr_Presentation3d.cxx
src/Select3D/Select3D_Projector.cxx
src/StdSelect/StdSelect.cxx
src/StdSelect/StdSelect_ViewerSelector3d.cxx
src/V3d/V3d.cdl
src/V3d/V3d_OrthographicView.cdl [deleted file]
src/V3d/V3d_OrthographicView.cxx [deleted file]
src/V3d/V3d_PerspectiveView.cdl [deleted file]
src/V3d/V3d_PerspectiveView.cxx [deleted file]
src/V3d/V3d_View.cdl
src/V3d/V3d_View.cxx
src/V3d/V3d_View_3.cxx
src/V3d/V3d_View_4.cxx
src/V3d/V3d_Viewer.cdl
src/V3d/V3d_Viewer.cxx
src/ViewerTest/ViewerTest.cxx
src/ViewerTest/ViewerTest_ViewerCommands.cxx
src/Visual3d/Visual3d.cdl
src/Visual3d/Visual3d_View.cdl
src/Visual3d/Visual3d_View.cxx
src/Visual3d/Visual3d_ViewManager.cdl
src/Visual3d/Visual3d_ViewManager.cxx
src/Visual3d/Visual3d_ViewMapping.cdl [deleted file]
src/Visual3d/Visual3d_ViewMapping.cxx [deleted file]
src/Visual3d/Visual3d_ViewOrientation.cdl [deleted file]
src/Visual3d/Visual3d_ViewOrientation.cxx [deleted file]
tests/bugs/vis/bug137_4
tests/bugs/vis/bug137_5
tests/bugs/vis/bug22337 [new file with mode: 0644]
tests/bugs/vis/bug23747_2
tests/bugs/vis/bug24001 [new file with mode: 0644]
tests/bugs/vis/bug280_2
tests/bugs/vis/bug280_3
tests/bugs/vis/bug349
tests/bugs/vis/bug349_1
tests/v3d/raytrace/bug24130
tests/v3d/raytrace/connected
tests/v3d/raytrace/plastic

index 198641f..3f49567 100755 (executable)
Binary files a/samples/mfc/standard/04_Viewer3d/src/Viewer3d.aps and b/samples/mfc/standard/04_Viewer3d/src/Viewer3d.aps differ
index 906b1d9..edb30d8 100755 (executable)
@@ -90,6 +90,8 @@ BEGIN
     SEPARATOR
     BUTTON      ID_FILE_EXPORT_IMAGE
     SEPARATOR
+    BUTTON      ID_BUTTON_STEREO
+    SEPARATOR
     BUTTON      ID_APP_ABOUT
 END
 
@@ -264,6 +266,11 @@ BEGIN
     ID_FILE_MRU_FILE1       "Open recent file\nRecent file"
 END
 
+STRINGTABLE
+BEGIN
+    ID_BUTTON_STEREO        "Toggle stereographic mode on / off"
+END
+
 #endif    // English (U.S.) resources
 /////////////////////////////////////////////////////////////////////////////
 
index 74a3f3c..566bad2 100755 (executable)
Binary files a/samples/mfc/standard/05_ImportExport/res/Toolbar.bmp and b/samples/mfc/standard/05_ImportExport/res/Toolbar.bmp differ
index 18d0804..3c82518 100755 (executable)
@@ -135,6 +135,7 @@ void CAnimationView3D::OnInitialUpdate()
 
   aViewer = GetDocument()->GetViewer();
   aViewer->SetDefaultTypeOfView (V3d_PERSPECTIVE);
+
   myView = aViewer->CreateView();
 
   // store for restore state after rotation (witch is in Degenerated mode)
@@ -156,8 +157,6 @@ void CAnimationView3D::OnInitialUpdate()
                                    /* I suspect another problem elsewhere  */
   ::PostMessage ( GetSafeHwnd () , WM_SIZE , SIZE_RESTORED , w + h*65536 ) ;
 
-  myPView = Handle(V3d_PerspectiveView)::DownCast (myView);
-
   m_Tune.Create ( IDD_TUNE , NULL ) ;
 
   RECT dlgrect;
@@ -892,37 +891,37 @@ void CAnimationView3D::Twist (int x , int /*y*/)
        myView->SetTwist (a) ;
 }
 
-void CAnimationView3D::SetFocal(double dFocus,double dAngle)
+//=============================================================================
+// function: SetFocal
+// purpose:
+//=============================================================================
+void CAnimationView3D::SetFocal (double theFocus, double theAngle)
 {
-       double v [3] ;
-       double l ;
-       int    i     ;
 
-       v [0] = m_Atx - m_Eyex ;
-       v [1] = m_Aty - m_Eyey ;
-       v [2] = m_Atz - m_Eyez ;
+  Handle(Graphic3d_Camera) aCamera = myView->Camera();
 
-       l = sqrt ( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) ;
-       if ( l > 1.e-3 ) {
-               for ( i=0 ; i<3 ; i++ )
-          v [i] = v [i] / l * dFocus ;
+  gp_Pnt anAt  = aCamera->Center();
+  gp_Pnt anEye = aCamera->Eye();
 
-               m_Focus = dFocus ;
+  gp_Vec aLook (anAt, anEye);
 
-               m_Atx = v [0] + m_Eyex ;
-               m_Aty = v [1] + m_Eyey ;
-               m_Atz = v [2] + m_Eyez ;
+  if (aCamera->Distance() > 1.e-3)
+  {
+    aLook = aLook / aCamera->Distance() * theFocus;
 
-        myView->SetImmediateUpdate ( Standard_False ) ;
-               myView->SetAt  ( m_Atx  , m_Aty  , m_Atz  ) ;
-               m_dAngle = dAngle ;
-               dAngle = dAngle * M_PI / 180. ;
-        myPView->SetAngle ( dAngle ) ;
-               dAngle = myPView->Angle () ;
+    m_Focus = theFocus;
 
-        myView->SetImmediateUpdate ( Standard_True ) ;
-        myView->Update ();
-       }
+    anAt.SetX (aLook.X() + anEye.X());
+    anAt.SetY (aLook.Y() + anEye.Y());
+    anAt.SetZ (aLook.Z() + anEye.Z());
+
+    m_dAngle = theAngle;
+
+    aCamera->SetCenter (anAt);
+    aCamera->SetFOVy (theAngle);
+
+    myView->Update();
+  }
 }
 
 void CAnimationView3D::ReloadData()
@@ -958,9 +957,9 @@ void CAnimationView3D::ReloadData()
        dy = m_Aty - m_Eyey ;
        dz = m_Atz - m_Eyez ;
 
-    m_Focus = sqrt ( dx * dx + dy * dy + dz * dz ) ;
-       m_dAngle = myPView->Angle () ;
-       m_dAngle = m_dAngle * 180. / M_PI ;
+  m_Focus = sqrt (dx * dx + dy * dy + dz * dz);
+
+  m_dAngle = myView->Camera()->FOVy();
 
        m_Tune.m_dAngle = m_dAngle ;
        m_Tune.m_dFocus = m_Focus  ;
index c965502..19822c8 100755 (executable)
@@ -59,7 +59,7 @@ public:
        void SetDimensions ();
        void ReloadData();
        CTune m_Tune;
-       void SetFocal ( double dFocus , double dAngle );
+  void SetFocal (double theFocus, double theAngle);
        void Fly (int x , int y);
        void Turn (int x , int y);
        void Roll (int x , int y);
@@ -138,8 +138,6 @@ private:
   Quantity_Factor      myCurZoom;
   Standard_Boolean     myHlrModeIsOn;
 
-  Handle_V3d_PerspectiveView myPView;
-
   View3D_CurrentAction myCurrentMode;
   double               m_Atx  , m_Aty  , m_Atz  ;
   double               m_Eyex , m_Eyey , m_Eyez ;
index 31695e3..cda56c6 100755 (executable)
@@ -210,7 +210,6 @@ enum CurrentAction3d {
 #include "HLRAlgo_Projector.hxx"
 #include "Aspect_MarkMap.hxx"
 
-#include <V3d_PerspectiveView.hxx>
 #include <Geom_BSplineSurface.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Solid.hxx>
index 9f1f7e9..101de8c 100755 (executable)
@@ -9,7 +9,11 @@
 #include <res\OCC_Resource.h>
 
 #include <Visual3d_View.hxx>
+
 #include <Graphic3d_ExportFormat.hxx>
+#include <Graphic3d_Camera.hxx>
+
+#include <OpenGl_GraphicDriver.hxx>
 
 #define ValZWMin 1
 
@@ -31,6 +35,7 @@ BEGIN_MESSAGE_MAP(OCC_3dView, CView)
        ON_COMMAND(ID_BUTTONRot, OnBUTTONRot)
        ON_COMMAND(ID_BUTTONTop, OnBUTTONTop)
        ON_COMMAND(ID_BUTTONZoomAll, OnBUTTONZoomAll)
+  ON_COMMAND(ID_BUTTON_STEREOCONFIG, OnStereoConfigButton)
        ON_WM_SIZE()
     ON_COMMAND(ID_FILE_EXPORT_IMAGE, OnFileExportImage)
        ON_COMMAND(ID_BUTTONZoomProg, OnBUTTONZoomProg)
@@ -49,6 +54,7 @@ BEGIN_MESSAGE_MAP(OCC_3dView, CView)
        ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg)
        ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin)
        ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot)
+  ON_UPDATE_COMMAND_UI(ID_BUTTON_STEREOCONFIG, OnUpdateStereoConfigButton)
        ON_COMMAND(ID_Modify_ChangeBackground     , OnModifyChangeBackground)
        //}}AFX_MSG_MAP
 END_MESSAGE_MAP()
@@ -73,9 +79,13 @@ OCC_3dView::OCC_3dView()
 
 OCC_3dView::~OCC_3dView()
 {
-  if ( myView )
+  if (myView)
+  {
     myView->Remove();
-  if (m_Pen) delete m_Pen;
+  }
+
+  delete m_pStereoDlg;
+  delete m_Pen;
 }
 
 BOOL OCC_3dView::PreCreateWindow(CREATESTRUCT& cs)
@@ -97,15 +107,27 @@ void OCC_3dView::OnInitialUpdate()
   myHlrModeIsOn = Standard_False;
   myView->SetComputedMode (myHlrModeIsOn);
 
-  Handle(Graphic3d_GraphicDriver) aGraphicDriver = 
-    ((OCC_App*)AfxGetApp())->GetGraphicDriver();
+  Handle(OpenGl_GraphicDriver) aDriver = 
+    Handle(OpenGl_GraphicDriver)::DownCast (((OCC_App*)AfxGetApp())->GetGraphicDriver());
 
   Handle(WNT_Window) aWNTWindow = new WNT_Window(GetSafeHwnd());
+
   myView->SetWindow(aWNTWindow);
-  if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
+  myView->Camera()->SetProjectionType (aDriver->Options().contextStereo
+    ? Graphic3d_Camera::Projection_Stereo
+    : Graphic3d_Camera::Projection_Orthographic);
+
+  if (!aWNTWindow->IsMapped())
+  {
+    aWNTWindow->Map();
+  }
 
   // store the mode ( nothing , dynamic zooming, dynamic ... )
   myCurrentMode = CurAction3d_Nothing;
+
+  m_pStereoDlg = new OCC_StereoConfigDlg (this);
+  m_pStereoDlg->SetView (myView);
+  m_pStereoDlg->Create (IDD_DIALOG_STEREO, this);
 }
 
 void OCC_3dView::OnDraw(CDC* /*pDC*/)
@@ -600,3 +622,33 @@ void OCC_3dView::OnModifyChangeBackground()
        }
     myView->Redraw();
 }
+
+//=============================================================================
+// function: OnStereoConfigButton
+// purpose: Open stereographic configuration dialog
+//=============================================================================
+void OCC_3dView::OnStereoConfigButton()
+{
+  m_pStereoDlg->ShowWindow (SW_SHOW);
+}
+
+//=============================================================================
+// function: OnUpdateStereoConfigButton
+// purpose: Enable / disable state of stereo configuration button
+//=============================================================================
+void OCC_3dView::OnUpdateStereoConfigButton (CCmdUI* theCmdUI)
+{
+  // get camera
+  Handle(Graphic3d_Camera) aCamera = myView->Camera();
+
+  // check that button is enabled
+  Standard_Boolean isEnabled = !aCamera.IsNull() && aCamera->IsStereo();
+
+  // update toggle state
+  theCmdUI->Enable (isEnabled);
+
+  if (!isEnabled)
+  {
+    m_pStereoDlg->ShowWindow (SW_HIDE);
+  }
+}
index 0e76294..8bcbb2c 100755 (executable)
@@ -11,6 +11,7 @@
 
 #include "OCC_BaseView.h"
 #include "OCC_3dDoc.h"
+#include "OCC_StereoConfigDlg.h"
 #include <Standard_Macro.hxx>
 
 enum CurAction3d { 
@@ -81,6 +82,8 @@ protected:
        afx_msg void OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI);
        afx_msg void OnUpdateBUTTONRot(CCmdUI* pCmdUI);
        afx_msg void OnModifyChangeBackground();
+  afx_msg void OnStereoConfigButton();
+  afx_msg void OnUpdateStereoConfigButton (CCmdUI* theCmdUI);
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
 
@@ -111,6 +114,11 @@ protected:
                                                const Standard_Integer  MaxY  ,
                                                    const Standard_Boolean  Draw  ,
                                 const LineStyle aLineStyle = Default  );
+
+private:
+
+  //! Persistent non blocking stereo configuration dialog
+  OCC_StereoConfigDlg* m_pStereoDlg;
 };
 
 #ifndef _DEBUG  // debug version in OCC_3dView.cpp
index ba76749..b64e527 100644 (file)
@@ -5,11 +5,13 @@
 #include <stdafx.h>
 
 #include "OCC_App.h"
-
+#include "OCC_BaseDoc.h"
 #include <res\OCC_Resource.h>
 
 #include <Standard_Version.hxx>
+#include <OpenGl_GraphicDriver.hxx>
 #include <OSD.hxx>
+
 #include "afxwin.h"
 
 /////////////////////////////////////////////////////////////////////////////
@@ -24,6 +26,8 @@ BEGIN_MESSAGE_MAP(OCC_App, CWinApp)
        // Standard file based document commands
        ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
        ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
+  ON_COMMAND(ID_BUTTON_STEREO, &OCC_App::OnStereo)
+  ON_UPDATE_COMMAND_UI(ID_BUTTON_STEREO, &OCC_App::OnUpdateStereo)
 END_MESSAGE_MAP()
 
 /////////////////////////////////////////////////////////////////////////////
@@ -174,3 +178,57 @@ void OCC_App::SetSampleName(LPCTSTR Name)
 {
   SampleName = Name;
 }
+
+//=============================================================================
+// function: OnStereo
+// purpose:
+//=============================================================================
+void OCC_App::OnStereo()
+{
+  Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast (myGraphicDriver);
+
+  int anAnswer = MessageBox(NULL,
+    "It is required to switch OpenGl context to turn on / off hardware stereo support. "
+    "The document views need to be re-created to change \"GL\" context pixel format. "
+    "This will close all current views and open new one (the model will be kept).\n"
+    "Do you want to continue?", "Enable/disable hardware stereo support", MB_OKCANCEL | MB_ICONQUESTION);
+  if (anAnswer != IDOK)
+  {
+    return;
+  }
+
+  Standard_Boolean& aStereoMode = aDriver->ChangeOptions().contextStereo;
+
+  aStereoMode = !aStereoMode;
+
+  // reset document views
+  POSITION aTemplateIt = GetFirstDocTemplatePosition();
+
+  while (aTemplateIt != NULL)
+  {
+    CDocTemplate* aTemplate = (CDocTemplate*)GetNextDocTemplate (aTemplateIt);
+
+    POSITION aDocumentIt = aTemplate->GetFirstDocPosition();
+
+    while (aDocumentIt != NULL)
+    {
+      OCC_BaseDoc* aDocument = dynamic_cast<OCC_BaseDoc*> (aTemplate->GetNextDoc (aDocumentIt));
+      if (aDocument == NULL)
+        continue;
+
+      aDocument->ResetDocumentViews (aTemplate);
+    }
+  }
+}
+
+//=============================================================================
+// function: OnUpdateStereo
+// purpose:
+//=============================================================================
+void OCC_App::OnUpdateStereo (CCmdUI* theCmdUI)
+{
+  Handle(OpenGl_GraphicDriver) aDriver =
+    Handle(OpenGl_GraphicDriver)::DownCast (myGraphicDriver);
+
+  theCmdUI->SetCheck (!aDriver.IsNull() && aDriver->Options().contextStereo);
+}
index f079a5a..b379fdb 100755 (executable)
@@ -27,11 +27,13 @@ public:
   }
 
 // Implementation
-       //{{AFX_MSG(OCC_BaseApp)
-       afx_msg void OnAppAbout();
-               // NOTE - the ClassWizard will add and remove member functions here.
-               //    DO NOT EDIT what you see in these blocks of generated code !
-       //}}AFX_MSG
+  //{{AFX_MSG(OCC_BaseApp)
+  afx_msg void OnAppAbout();
+  afx_msg void OnStereo();
+  afx_msg void OnUpdateStereo (CCmdUI* theCmdUI);
+    // NOTE - the ClassWizard will add and remove member functions here.
+    //    DO NOT EDIT what you see in these blocks of generated code !
+   //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
 protected:
   Handle_Graphic3d_GraphicDriver myGraphicDriver;
index 46c9e74..0985de4 100755 (executable)
@@ -67,3 +67,39 @@ OCC_BaseDoc::~OCC_BaseDoc()
 {
 
 }
+
+//=============================================================================
+// function: ResetDocumentViews
+// purpose:
+//=============================================================================
+void OCC_BaseDoc::ResetDocumentViews (CDocTemplate* theTemplate)
+{
+  // do not delete document if no views
+  BOOL isAutoDelete = m_bAutoDelete;
+  m_bAutoDelete = FALSE;
+
+  // close all opened views
+  POSITION aViewIt = GetFirstViewPosition();
+  while (aViewIt)
+  {
+    CView* aView = GetNextView (aViewIt);
+    if (aView == NULL)
+    {
+      continue;
+    }
+
+    RemoveView (aView);
+
+    aView->GetParentFrame()->SendMessage (WM_CLOSE);
+  }
+
+  // create new view frame
+  CFrameWnd* aNewFrame = theTemplate->CreateNewFrame (this, NULL);
+  m_bAutoDelete = isAutoDelete;
+
+  // init frame
+  theTemplate->InitialUpdateFrame(aNewFrame, this);
+
+
+
+}
index 46a0b2b..0c8ad8c 100755 (executable)
@@ -68,6 +68,11 @@ public:
   virtual void Popup (const Standard_Integer /*theMouseX*/,
                       const Standard_Integer /*theMouseY*/,
                       const Handle(V3d_View)& /*theView*/) {}
+
+public:
+
+  void ResetDocumentViews (CDocTemplate* theTemplate);
+
 protected:
 
   Handle(V3d_Viewer) myViewer;
diff --git a/samples/mfc/standard/Common/OCC_StereoConfigDlg.cpp b/samples/mfc/standard/Common/OCC_StereoConfigDlg.cpp
new file mode 100644 (file)
index 0000000..6251b0d
--- /dev/null
@@ -0,0 +1,248 @@
+///////////////////////////////////////////////////////////////////////////////
+// OCC_StereoConfigDlg.cpp : source file
+///////////////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "OCC_StereoConfigDlg.h"
+#include <Graphic3d_Camera.hxx>
+
+BEGIN_MESSAGE_MAP (OCC_StereoConfigDlg, CDialog)
+
+  ON_WM_HSCROLL()
+  ON_NOTIFY (UDN_DELTAPOS, IDC_SPIN_FOCUS, OnSpinFocus)
+  ON_NOTIFY (UDN_DELTAPOS, IDC_SPIN_IOD, OnSpinIOD)
+  ON_BN_CLICKED (IDC_CHECK_FOCUS_RELATIVE, OnCheckFocus)
+  ON_BN_CLICKED (IDC_CHECK_IOD_RELATIVE, OnCheckIOD)
+  ON_EN_CHANGE (IDC_EDIT_FOCUS, OnChangeFocus)
+  ON_EN_CHANGE (IDC_EDIT_IOD, OnChangeIOD)
+
+END_MESSAGE_MAP()
+
+// round up value macro
+#define ROUND_UP(X) X = (Round(X * 10000.0) / 10000.0)
+
+// slider tick conversion
+#define TO_SLIDER(X) (Standard_Integer)Round(X * 10)
+
+// back conversion from slider ticks
+#define FROM_SLIDER(X) X / 10.0
+
+// ============================================================================
+// function: SetView
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::SetView (const Handle(V3d_View)& theView)
+{
+  myView = theView;
+
+  // access initial values
+  myIOD = myView->Camera()->IOD();
+  myFocus = myView->Camera()->ZFocus();
+  mySliderFocus = TO_SLIDER(myFocus);
+  myIsRelativeIOD   = (myView->Camera()->GetIODType() == Graphic3d_Camera::IODType_Relative);
+  myIsRelativeFocus = (myView->Camera()->ZFocusType() == Graphic3d_Camera::FocusType_Relative);
+}
+
+// ============================================================================
+// function: DoDataExchange
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::DoDataExchange(CDataExchange* theDX)
+{
+  CDialog::DoDataExchange(theDX);
+
+  DDX_Text (theDX, IDC_EDIT_IOD, myIOD);
+  DDV_MinMaxDouble (theDX, myIOD, -DBL_MAX, DBL_MAX);
+
+  if (myIsRelativeFocus)
+  {
+    // do slider data exchange
+    DDX_Slider (theDX, IDC_SLIDER_FOCUS, (int&)mySliderFocus);
+    DDV_MinMaxSlider (theDX, mySliderFocus, TO_SLIDER(0.1), TO_SLIDER(10));
+
+    // show up value in edit field
+    Standard_Real aEditValue = FROM_SLIDER (mySliderFocus);
+    DDX_Text (theDX, IDC_EDIT_FOCUS, aEditValue);
+
+    // update focus value correspondingly
+    myFocus = FROM_SLIDER (mySliderFocus);
+  }
+  else
+  {
+    DDX_Text (theDX, IDC_EDIT_FOCUS, myFocus);
+    DDV_MinMaxDouble (theDX, myFocus, 50, DBL_MAX);
+
+    mySliderFocus = TO_SLIDER(1.0);
+    DDX_Slider (theDX, IDC_SLIDER_FOCUS, (int&)mySliderFocus);
+  }
+
+  DDX_Check (theDX, IDC_CHECK_FOCUS_RELATIVE, (int&)myIsRelativeFocus);
+  DDX_Check (theDX, IDC_CHECK_IOD_RELATIVE, (int&)myIsRelativeIOD);
+
+  CEdit* aFocusEdit = (CEdit*) GetDlgItem (IDC_EDIT_FOCUS);
+  aFocusEdit->EnableWindow (myIsRelativeFocus != Standard_True);
+
+  CSliderCtrl* aSlider = (CSliderCtrl*) GetDlgItem (IDC_SLIDER_FOCUS);
+  aSlider->EnableWindow (myIsRelativeFocus == Standard_True);
+}
+
+// ============================================================================
+// function: OnHScroll
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::OnHScroll(UINT theSBCode, UINT thePos, CScrollBar* theScrollBar)
+{
+  UpdateData (true);
+  UpdateData (false);
+  UpdateCamera();
+  CWnd::OnHScroll(theSBCode, thePos, theScrollBar);
+}
+
+// ============================================================================
+// function: UpdateCamera
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::UpdateCamera()
+{
+  // update camera properties and redraw view
+  Handle(Graphic3d_Camera)& aCamera = myView->Camera();
+  if (aCamera.IsNull())
+    return;
+
+  // change IOD
+  Graphic3d_Camera::IODType aIODType = 
+    myIsRelativeIOD ? Graphic3d_Camera::IODType_Relative :
+                      Graphic3d_Camera::IODType_Absolute;
+
+  aCamera->SetIOD (aIODType, myIOD);
+
+  // change Focus
+  Graphic3d_Camera::FocusType aFocusType = 
+    myIsRelativeFocus ? Graphic3d_Camera::FocusType_Relative :
+                        Graphic3d_Camera::FocusType_Absolute;
+
+  aCamera->SetZFocus (aFocusType, myFocus);
+
+  // redraw view
+  myView->Redraw();
+}
+
+// ============================================================================
+// function: OnCheckFocus
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::OnCheckFocus()
+{
+  UpdateData (true);
+
+  // change focus to some predefined values
+  if (myIsRelativeFocus)
+    myFocus = 1.0;
+  else
+    myFocus = 100.0;
+
+  UpdateData (false);
+  UpdateCamera();
+}
+
+// ============================================================================
+// function: OnCheckIOD
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::OnCheckIOD()
+{
+  UpdateData (true);
+  UpdateCamera();
+}
+
+// ============================================================================
+// function: OnChangeFocus
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::OnChangeFocus()
+{
+  // keep previous value
+  Standard_Real aPrevFocus = myFocus;
+
+  // read data from ui controls
+  if (UpdateData (true))
+  {
+    UpdateCamera();
+  }
+  else
+  {
+    // revert back
+    myFocus = aPrevFocus;
+    UpdateData (false);
+  }
+}
+
+// ============================================================================
+// function: OnChangeIOD
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::OnChangeIOD()
+{
+  // keep previous value
+  Standard_Real aPrevIOD = myIOD;
+
+  // read data from ui controls
+  if (UpdateData (true))
+  {
+    UpdateCamera();
+  }
+  else
+  {
+    // revert back
+    myIOD = aPrevIOD;
+    UpdateData (false);
+  }
+}
+
+// ============================================================================
+// function: OnSpinFocus
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::OnSpinFocus (NMHDR* theNMHDR, LRESULT* theResult)
+{
+  NM_UPDOWN* aNMUpDown = (NM_UPDOWN*)theNMHDR;
+
+  const double aStep = 0.1; // use small incremental step
+  const double aDelta = aNMUpDown->iDelta * aStep; // get delta
+
+  // changes value
+  myFocus -= (Standard_Real)aDelta;
+
+  // round up value
+  ROUND_UP (myFocus);
+
+  // actualize view & ui controls
+  UpdateData (false);
+  UpdateCamera();
+
+  *theResult = 0;
+}
+
+// ============================================================================
+// function: OnSpinIOD
+// purpose:
+// ============================================================================
+void OCC_StereoConfigDlg::OnSpinIOD (NMHDR* theNMHDR, LRESULT* theResult)
+{
+  NM_UPDOWN* aNMUpDown = (NM_UPDOWN*)theNMHDR;
+
+  const double aStep = 0.01; // use small incremental step
+  const double aDelta = aNMUpDown->iDelta * aStep; // get delta
+
+  // changes value
+  myIOD -= (Standard_Real)aDelta;
+
+  // round up value
+  ROUND_UP (myIOD);
+
+  // actualize view & ui controls
+  UpdateData (false);
+  UpdateCamera();
+
+  *theResult = 0;
+}
diff --git a/samples/mfc/standard/Common/OCC_StereoConfigDlg.h b/samples/mfc/standard/Common/OCC_StereoConfigDlg.h
new file mode 100644 (file)
index 0000000..dd21ca0
--- /dev/null
@@ -0,0 +1,55 @@
+///////////////////////////////////////////////////////////////////////////////
+// OCC_StereoConfigDlg.h : header file
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef OCC_StereoConfigDlg_Header
+#define OCC_StereoConfigDlg_Header
+
+#if _MSC_VER >= 1000
+#pragma once
+#endif // _MSC_VER >= 1000
+
+#include "res\OCC_Resource.h"
+#include <V3d_View.hxx>
+
+// Dialog to dynamically configure 3D Viewer stereo
+// projection properties.
+class AFX_EXT_CLASS OCC_StereoConfigDlg : public CDialog
+{
+public:
+
+  OCC_StereoConfigDlg (CWnd* theParent = NULL)
+    : CDialog (IDD_DIALOG_STEREO, theParent) {}
+
+  void SetView (const Handle(V3d_View)& theView);
+
+protected:
+
+  virtual void DoDataExchange (CDataExchange* theDX);
+
+  void UpdateCamera();
+
+// Implementation
+protected:
+
+  afx_msg void OnCheckFocus();
+  afx_msg void OnCheckIOD();
+  afx_msg void OnChangeFocus();
+  afx_msg void OnChangeIOD();
+  afx_msg void OnSpinFocus (NMHDR* theNMHDR, LRESULT* theResult);
+  afx_msg void OnSpinIOD (NMHDR* theNMHDR, LRESULT* theResult);
+  afx_msg void OnHScroll(UINT theSBCode, UINT thePos, CScrollBar* theScrollBar);
+
+  DECLARE_MESSAGE_MAP()
+
+private:
+
+  Standard_Real myIOD;
+  Standard_Real myFocus;
+  Standard_Integer mySliderFocus;
+  Standard_Boolean myIsRelativeIOD;
+  Standard_Boolean myIsRelativeFocus;
+  Handle(V3d_View) myView;
+};
+
+#endif
index 417f228..0b01037 100755 (executable)
Binary files a/samples/mfc/standard/Common/res/3dChildFrameTB.bmp and b/samples/mfc/standard/Common/res/3dChildFrameTB.bmp differ
diff --git a/samples/mfc/standard/Common/res/OCC_Resource.aps b/samples/mfc/standard/Common/res/OCC_Resource.aps
new file mode 100755 (executable)
index 0000000..d191417
Binary files /dev/null and b/samples/mfc/standard/Common/res/OCC_Resource.aps differ
index 3575ca3..f4fd5c5 100755 (executable)
@@ -5,6 +5,7 @@
 #define IDD_ParamsFacesPage             101
 #define IDR_POPUP                       116
 #define IDD_Dimension                   119
+#define IDD_DIALOG_STEREO               120
 #define IDD_LengthParamsEdgePage        122
 #define IDD_LengthParamsVerticesPage    123
 #define IDD_LengthParamsEdgesPage       125
 #define IDC_TextDisplayMode             1047
 #define IDC_TextDisplayModeStatic       1048
 #define IDC_DimensionColor              1049
-#define IDC_FacesSt1                    1052
-#define IDC_FacesSt2                    1053
-#define IDC_FacesBtn1                   1054
-#define IDC_FacesBtn2                   1055
+#define IDC_EDIT_IOD                    1050
+#define IDC_SPIN_IOD                    1051
+#define IDC_CHECK_IOD_RELATIVE          1052
+#define IDC_CHECK_FOCUS_RELATIVE        1053
+#define IDC_SLIDER_FOCUS                1054
+#define IDC_EDIT_FOCUS                  1055
+#define IDC_SPIN_FOCUS                  1056
+#define IDC_FacesSt1                    1057
+#define IDC_FacesSt2                    1058
+#define IDC_FacesBtn1                   1059
+#define IDC_FacesBtn2                   1060
 #define ID_WINDOW_NEW3D                 1151
 #define ID_OBJECT_DISPLAYALL            1201
 #define ID_OBJECT_MATERIAL              1205
 #define ID_OBJECT_DIMENSIONS            40035
 #define ID_OBJECT_DIM                   40036
 #define ID_LOCALCONTEXT_ADDDIMENSION    40037
+#define ID_BUTTON_STEREOSETTINGS        40038
+#define ID_BUTTON_STEREO                40039
+#define ID_BUTTON_STEREOCONFIG          40040
 #define ID_FILE_IMPORT_CSFDB            40100
 #define ID_FILE_IMPORT_BREP             40101
 #define ID_FILE_IMPORT_STEP             40102
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        131
-#define _APS_NEXT_COMMAND_VALUE         40038
-#define _APS_NEXT_CONTROL_VALUE         1055
+#define _APS_NEXT_COMMAND_VALUE         40041
+#define _APS_NEXT_CONTROL_VALUE         1061
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif
index f138f53..7a61b51 100755 (executable)
@@ -280,6 +280,25 @@ BEGIN
     PUSHBUTTON      "Change dimension color",IDC_DimensionColor,105,156,63,24,BS_MULTILINE
     CONTROL         "",IDC_Flyout,"msctls_trackbar32",TBS_TOP | TBS_TOOLTIPS | WS_TABSTOP,73,112,100,20
 END
+IDD_DIALOG_STEREO DIALOGEX 0, 0, 166, 177
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Configure stereo"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    EDITTEXT        IDC_EDIT_IOD,88,42,41,12,ES_AUTOHSCROLL | WS_GROUP
+    CONTROL         "",IDC_SPIN_IOD,"msctls_updown32",UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP,130,42,11,12
+    GROUPBOX        "Stereo focus properties:",IDC_STATIC,7,72,149,96
+    GROUPBOX        "Eye separation properties:",IDC_STATIC,6,6,150,60
+    LTEXT           "Intraocular distance:",IDC_STATIC,18,43,68,8
+    CONTROL         "",IDC_CHECK_IOD_RELATIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,102,24,16,10
+    LTEXT           "Relative to focal length:",IDC_STATIC,18,24,78,8
+    CONTROL         "",IDC_CHECK_FOCUS_RELATIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,102,90,16,10
+    LTEXT           "Relative to focal length:",IDC_STATIC,18,90,78,8
+    CONTROL         "",IDC_SLIDER_FOCUS,"msctls_trackbar32",TBS_TOP | WS_TABSTOP,18,108,126,24
+    LTEXT           "Fixed value:",IDC_STATIC,18,146,40,8
+    EDITTEXT        IDC_EDIT_FOCUS,67,144,41,12,ES_AUTOHSCROLL | WS_GROUP
+    CONTROL         "",IDC_SPIN_FOCUS,"msctls_updown32",UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP,108,144,11,12
+END
 
 IDD_ParamsFacesPage DIALOGEX 0, 0, 134, 73
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
@@ -345,6 +364,8 @@ BEGIN
     BUTTON      ID_BUTTONRot
     BUTTON      ID_BUTTONReset
     SEPARATOR
+    BUTTON      ID_BUTTON_STEREOCONFIG
+    SEPARATOR
     BUTTON      ID_BUTTONHlrOff
     BUTTON      ID_BUTTONHlrOn
 END
@@ -486,6 +507,14 @@ BEGIN
         HORZGUIDE, 336
     END
 
+    IDD_DIALOG_STEREO, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 159
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 170
+    END
+
     IDD_ParamsFacesPage, DIALOG
     BEGIN
         LEFTMARGIN, 7
@@ -657,6 +686,12 @@ BEGIN
     ID_LOCALCONTEXT_ADDDIMENSION "Add new dimension for selected objetcs"
 END
 
+STRINGTABLE 
+BEGIN
+    ID_BUTTON_STEREOSETTINGS "Configure stereo properties"
+    ID_BUTTON_STEREO        "Toggle stereographic mode on / off"
+END
+
 #endif    // English (U.S.) resources
 /////////////////////////////////////////////////////////////////////////////
 
index 2d7a927..8a26a35 100644 (file)
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ClCompile>
+    <ClCompile Include="..\..\..\..\Common\OCC_StereoConfigDlg.cpp">
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
     <ClCompile Include="..\..\..\..\Common\LengthParamsEdgePage.cpp" />
     <ClCompile Include="..\..\..\..\Common\LengthParamsEdgesPage.cpp" />
     <ClCompile Include="..\..\..\..\Common\LengthParamsVerticesPage.cpp" />
     <ClInclude Include="..\..\..\..\Common\OCC_BaseDoc.h" />
     <ClInclude Include="..\..\..\..\Common\OCC_BaseView.h" />
     <ClInclude Include="..\..\..\..\Common\OCC_MainFrame.h" />
+    <ClInclude Include="..\..\..\..\Common\OCC_StereoConfigDlg.h" />
     <ClInclude Include="..\..\..\..\Common\RadiusParamsPage.h" />
     <ClInclude Include="..\..\..\..\Common\ParamsFacesPage.h" />
     <ClInclude Include="..\..\..\..\Common\res\OCC_Resource.h" />
index 65bb538..3a5573c 100644 (file)
     <ClCompile Include="..\..\..\..\Common\ISession2D\ISession2D_Shape.cpp">
       <Filter>Source Files\ISession2D-src</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\..\Common\OCC_StereoConfigDlg.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\..\..\Common\DimensionDlg.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
     <ClInclude Include="..\..\..\..\Common\ISession2D\ISession2D_Shape.h">
       <Filter>Header Files\ISession2D-headers</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\..\Common\OCC_StereoConfigDlg.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\..\Common\DimensionDlg.h">
       <Filter>Header Files</Filter>
     </ClInclude>
index 5e3ab7c..99d3fde 100644 (file)
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ClCompile>
+    <ClCompile Include="..\..\..\..\Common\OCC_StereoConfigDlg.cpp">
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
     <ClCompile Include="..\..\..\..\Common\ImportExport\SaveCSFDBDlg.cpp">
       <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     <ClInclude Include="..\..\..\..\Common\ParamsFacesPage.h" />
     <ClInclude Include="..\..\..\..\Common\res\OCC_Resource.h" />
     <ClInclude Include="..\..\..\..\Common\ResultDialog.h" />
+    <ClInclude Include="..\..\..\..\Common\OCC_StereoConfigDlg.h" />
     <ClInclude Include="..\..\..\..\Common\ImportExport\SaveCSFDBDlg.h" />
     <ClInclude Include="..\..\..\..\Common\ImportExport\SaveSTEPDlg.h" />
     <ClInclude Include="..\..\..\..\Common\StdAfx.h" />
index 65bb538..1e4879d 100644 (file)
@@ -84,6 +84,9 @@
     <ClCompile Include="..\..\..\..\Common\ResultDialog.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\..\Common\OCC_StereoConfigDlg.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\..\..\Common\ImportExport\SaveCSFDBDlg.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
     <ClInclude Include="..\..\..\..\Common\ResultDialog.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\..\Common\OCC_StereoConfigDlg.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\..\Common\ImportExport\SaveCSFDBDlg.h">
       <Filter>Header Files</Filter>
     </ClInclude>
index b4c98d2..994a3fb 100644 (file)
                                </FileConfiguration>
                        </File>
                        <File
+                               RelativePath="..\..\..\..\Common\OCC_StereoConfigDlg.cpp"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\..\..\..\Common\RadiusParamsPage.cpp"
                                >
                        </File>
                                >
                        </File>
                        <File
+                               RelativePath="..\..\..\..\Common\OCC_StereoConfigDlg.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\..\..\..\Common\RadiusParamsPage.h"
                                >
                        </File>
index 344cc6a..d990d69 100644 (file)
                                </FileConfiguration>
                        </File>
                        <File
+                               RelativePath="..\..\..\..\Common\OCC_StereoConfigDlg.cpp"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\..\..\..\Common\RadiusParamsPage.cpp"
                                >
                        </File>
                                >
                        </File>
                        <File
+                               RelativePath="..\..\..\..\Common\OCC_StereoConfigDlg.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\..\..\..\Common\RadiusParamsPage.h"
                                >
                        </File>
index 5698da7..ffe8d9b 100755 (executable)
@@ -71,3 +71,6 @@ Graphic3d_ClipPlane.cxx
 Graphic3d_ClipPlane_Handle.hxx
 Graphic3d_SequenceOfHClipPlane.hxx
 Graphic3d_SequenceOfHClipPlane_Handle.hxx
+Graphic3d_Camera.cxx
+Graphic3d_Camera.hxx
+Graphic3d_Camera_Handle.hxx
index d219be4..5ab2107 100644 (file)
@@ -411,6 +411,7 @@ is
     
     imported MarkerImage;
     imported MarkerImage_Handle;
+    imported Camera_Handle;
 
     primitive PtrFrameBuffer;
     primitive Vec2;
index 83d58e9..f815de8 100644 (file)
@@ -17,6 +17,9 @@
 #include <InterfaceGraphic_Graphic3d.hxx>
 #include <InterfaceGraphic_Visual3d.hxx>
 #include <Handle_Graphic3d_TextureEnv.hxx>
+#include <Graphic3d_Camera.hxx>
+
+#include <Standard_Type.hxx>
 #include <Graphic3d_CLight.hxx>
 #include <Graphic3d_SequenceOfHClipPlane.hxx>
 
@@ -71,6 +74,8 @@ public:
   int   SurfaceDetail;
 
   Graphic3d_SequenceOfHClipPlane ClipPlanes;
+
+  Handle(Graphic3d_Camera) Camera;
 };
 
 class Graphic3d_CView
@@ -88,7 +93,7 @@ public:
     ptrUnderLayer (NULL),
     ptrOverLayer  (NULL),
     Backfacing  (0),
-       GContext (NULL),
+         GContext (NULL),
     GDisplayCB  (NULL),
     GClientData (NULL),
     ptrFBO (NULL),
@@ -98,11 +103,7 @@ public:
     IsReflectionsEnabled (1),
     IsAntialiasingEnabled (0)
   {
-    memset(&Orientation,0,sizeof(Orientation));
-       memset(&Mapping,0,sizeof(Mapping));
-       memset(&OrientationReset,0,sizeof(OrientationReset));
-       memset(&MappingReset,0,sizeof(MappingReset));
-       memset(&DefWindow,0,sizeof(DefWindow));
+         memset(&DefWindow,0,sizeof(DefWindow));
   }
 
 public:
@@ -116,12 +117,6 @@ public:
 
   int   Active;
 
-  CALL_DEF_VIEWORIENTATION Orientation;
-  CALL_DEF_VIEWMAPPING     Mapping;
-
-  CALL_DEF_VIEWORIENTATION OrientationReset;
-  CALL_DEF_VIEWMAPPING     MappingReset;
-
   CALL_DEF_VIEWCONTEXT     Context;
 
   CALL_DEF_WINDOW          DefWindow;
diff --git a/src/Graphic3d/Graphic3d_Camera.cxx b/src/Graphic3d/Graphic3d_Camera.cxx
new file mode 100644 (file)
index 0000000..affd625
--- /dev/null
@@ -0,0 +1,917 @@
+// Created on: 2013-05-29
+// Created by: Anton POLETAEV
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <gp_Pln.hxx>
+#include <Standard_ShortReal.hxx>
+
+#include <Graphic3d_Vec4.hxx>
+#include <Graphic3d_Camera.hxx>
+
+#include <Standard_Atomic.hxx>
+
+IMPLEMENT_STANDARD_HANDLE(Graphic3d_Camera, Standard_Transient)
+IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_Camera, Standard_Transient)
+
+namespace
+{
+  // (degrees -> radians) * 0.5
+  static const Standard_ShortReal DTR_HALF = 0.5f * 0.0174532925f;
+
+  // atomic state counter
+  static volatile Standard_Integer THE_STATE_COUNTER = 0;
+};
+
+// =======================================================================
+// function : Graphic3d_Camera
+// purpose  :
+// =======================================================================
+Graphic3d_Camera::Graphic3d_Camera()
+: myUp (0.0, 1.0, 0.0),
+  myEye (0.0, 0.0, -1500.0),
+  myCenter (0.0, 0.0, 0.0),
+  myProjectionShift (0.0, 0.0, 0.0),
+  myAxialScale (1.0, 1.0, 1.0),
+  myProjType (Projection_Orthographic),
+  myFOVy (45.0),
+  myZNear (0.001),
+  myZFar (3000.0),
+  myAspect (1.0),
+  myScale (1000.0),
+  myZFocus (1.0),
+  myZFocusType (FocusType_Relative),
+  myIOD (0.05),
+  myIODType (IODType_Relative),
+  myNbUpdateLocks (0)
+{
+  myProjectionState  = (Standard_Size)Standard_Atomic_Increment (&THE_STATE_COUNTER);
+  myOrientationState = (Standard_Size)Standard_Atomic_Increment (&THE_STATE_COUNTER);
+
+  myOrientation.InitIdentity();
+  myMProjection.InitIdentity();
+  myLProjection.InitIdentity();
+  myRProjection.InitIdentity();
+
+  UpdateProjection();
+  UpdateOrientation();
+}
+
+// =======================================================================
+// function : Graphic3d_Camera
+// purpose  :
+// =======================================================================
+Graphic3d_Camera::Graphic3d_Camera (const Handle(Graphic3d_Camera)& theOther)
+: myNbUpdateLocks (0)
+{
+  Copy (theOther);
+}
+
+// =======================================================================
+// function : CopyMappingData
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::CopyMappingData (const Handle(Graphic3d_Camera)& theOtherCamera)
+{
+  myProjectionShift     = theOtherCamera->myProjectionShift;
+  myFOVy                = theOtherCamera->myFOVy;
+  myZNear               = theOtherCamera->myZNear;
+  myZFar                = theOtherCamera->myZFar;
+  myAspect              = theOtherCamera->myAspect;
+  myScale               = theOtherCamera->myScale;
+  myZFocus              = theOtherCamera->myZFocus;
+  myZFocusType          = theOtherCamera->myZFocusType;
+  myIOD                 = theOtherCamera->myIOD;
+  myIODType             = theOtherCamera->myIODType;
+  myProjType            = theOtherCamera->myProjType;
+
+  myProjectionState     = theOtherCamera->myProjectionState;
+
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : CopyOrientationData
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::CopyOrientationData (const Handle(Graphic3d_Camera)& theOtherCamera)
+{
+  myUp             = theOtherCamera->myUp;
+  myEye            = theOtherCamera->myEye;
+  myCenter         = theOtherCamera->myCenter;
+  myAxialScale     = theOtherCamera->myAxialScale;
+
+  myOrientationState = theOtherCamera->myOrientationState;
+
+  UpdateOrientation();
+}
+
+// =======================================================================
+// function : Copy
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::Copy (const Handle(Graphic3d_Camera)& theOther)
+{
+  BeginUpdate();
+  CopyMappingData (theOther);
+  CopyOrientationData (theOther);
+  EndUpdate();
+}
+
+// =======================================================================
+// function : SetEye
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetEye (const gp_Pnt& theEye)
+{
+  myEye = theEye;
+  UpdateOrientation();
+}
+
+// =======================================================================
+// function : SetCenter
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetCenter (const gp_Pnt& theCenter)
+{
+  myCenter = theCenter;
+  UpdateOrientation();
+}
+
+// =======================================================================
+// function : SetUp
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetUp (const gp_Dir& theUp)
+{
+  myUp = theUp;
+  UpdateOrientation();
+}
+
+// =======================================================================
+// function : SetProjectionShift
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetProjectionShift (const gp_Pnt& theProjShift)
+{
+  myProjectionShift = theProjShift;
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : SetAxialScale
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetAxialScale (const gp_Pnt& theAxialScale)
+{
+  myAxialScale = theAxialScale;
+  UpdateOrientation();
+}
+
+// =======================================================================
+// function : SetDistance
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetDistance (const Standard_Real theDistance)
+{
+  gp_Vec aCenter2Eye (Direction());
+  aCenter2Eye.Reverse();
+  aCenter2Eye.Scale (theDistance);
+  SetEye (Center().Translated (aCenter2Eye));
+}
+
+// =======================================================================
+// function : Distance
+// purpose  :
+// =======================================================================
+Standard_Real Graphic3d_Camera::Distance() const
+{
+  return myEye.Distance (myCenter);
+}
+
+// =======================================================================
+// function : SetDirection
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetDirection (const gp_Dir& theDir)
+{
+  gp_Vec aScaledDir (theDir);
+  aScaledDir.Scale (Distance());
+  aScaledDir.Reverse();
+  SetEye (Center().Translated (aScaledDir));
+}
+
+// =======================================================================
+// function : Direction
+// purpose  :
+// =======================================================================
+gp_Dir Graphic3d_Camera::Direction() const
+{
+  return gp_Dir (gp_Vec (myEye, myCenter));
+}
+
+// =======================================================================
+// function : SetScale
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetScale (const Standard_Real theScale)
+{
+  myScale = theScale;
+
+  switch (myProjType)
+  {
+    case Projection_Perspective  :
+    case Projection_Stereo       :
+    case Projection_MonoLeftEye  :
+    case Projection_MonoRightEye :
+    {
+      Standard_Real aDistance = theScale * 0.5 / Tan(myFOVy * M_PI / 360.0);
+      SetDistance (aDistance);
+    }
+
+    default :
+      break;
+  }
+
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : Scale
+// purpose  :
+// =======================================================================
+Standard_Real Graphic3d_Camera::Scale() const
+{
+  switch (myProjType)
+  {
+    case Projection_Orthographic :
+      return myScale;
+
+    // case Projection_Perspective  :
+    // case Projection_Stereo       :
+    // case Projection_MonoLeftEye  :
+    // case Projection_MonoRightEye :
+    default :
+      return Distance() * 2.0 * Tan(myFOVy * M_PI / 360.0);
+  }
+}
+
+// =======================================================================
+// function : SetProjectionType
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetProjectionType (const Projection theProjectionType)
+{
+  Projection anOldType = myProjType;
+
+  if (anOldType == theProjectionType)
+  {
+    return;
+  }
+
+  myProjType = theProjectionType;
+
+  switch (myProjType)
+  {
+    case Projection_Orthographic :
+    case Projection_Perspective  :
+    case Projection_MonoLeftEye  :
+    case Projection_MonoRightEye :
+      myLProjection.InitIdentity();
+      myRProjection.InitIdentity();
+      break;
+
+    default:
+      break;
+  }
+
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : SetFOVy
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetFOVy (const Standard_Real theFOVy)
+{
+  myFOVy = theFOVy;
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : SetZNear
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetZNear (const Standard_Real theZNear)
+{
+  myZNear = theZNear;
+
+  // it is important to prevent too low ZNear values relatively to ZFar
+  // so we can not just pass Precision::Confusion() to it
+  const Standard_Real aTolerance  = 0.001;
+  const Standard_Real aMinimumZ   = myZFar * aTolerance;
+  const Standard_Real aMinimumGap = aTolerance;
+  // while it is possible to manually set up pretty small ZNear value,
+  // it may affect project / unproject operations dramatically
+  if (myZNear < aMinimumZ)
+  {
+    myZNear = aMinimumZ;
+  }
+
+  if (myZFar < (myZNear + aMinimumGap))
+  {
+    myZFar = myZNear + aMinimumGap;
+  }
+
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : SetZFar
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetZFar (const Standard_Real theZFar)
+{
+  myZFar = theZFar;
+
+  // it is important to prevent too low ZNear values relatively to ZFar
+  // so we can not just pass Precision::Confusion() to it
+  const Standard_Real aTolerance  = 0.001;
+  const Standard_Real aMinimumGap = aTolerance;
+
+  // while it is possible to manually set up pretty small ZNear value,
+  // it may affect project / unproject operations dramatically
+  if (myZFar < (myZNear + aMinimumGap))
+  {
+    myZFar = myZNear + aMinimumGap;
+  }
+
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : SetAspect
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetAspect (const Standard_Real theAspect)
+{
+  myAspect = theAspect;
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : SetZFocus
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetZFocus(const FocusType theType, const Standard_Real theZFocus)
+{
+  myZFocusType = theType;
+  myZFocus = theZFocus;
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : SetIOD
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::SetIOD (const IODType theType, const Standard_Real theIOD)
+{
+  myIODType = theType;
+  myIOD = theIOD;
+  UpdateProjection();
+}
+
+// =======================================================================
+// function : OrthogonalizeUp
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::OrthogonalizeUp()
+{
+  gp_Dir aDir  = Direction();
+  gp_Dir aLeft = aDir.Crossed (Up());
+
+  // recompute up as: up = left x direction
+  SetUp (aLeft.Crossed (aDir));
+}
+
+// =======================================================================
+// function : BeginUpdate
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::BeginUpdate()
+{
+  myNbUpdateLocks++;
+}
+
+// =======================================================================
+// function : EndUpdate
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::EndUpdate()
+{
+  if (myNbUpdateLocks > 0)
+    myNbUpdateLocks--;
+
+  // if number of locks > 0, the updates are bypassed
+  UpdateProjection();
+  UpdateOrientation();
+}
+
+// =======================================================================
+// function : Transform
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::Transform (const gp_Trsf& theTrsf)
+{
+  myUp.Transform (theTrsf);
+  myEye.Transform (theTrsf);
+  myCenter.Transform (theTrsf);
+  UpdateOrientation();
+}
+
+// =======================================================================
+// function : safePointCast
+// purpose  :
+// =======================================================================
+static Graphic3d_Vec4 safePointCast (const gp_Pnt& thePnt)
+{
+  Standard_Real aLim = 1e15f;
+  
+  // have to deal with values greater then max float
+  gp_Pnt aSafePoint = thePnt;
+  const Standard_Real aBigFloat = aLim * 0.1f;
+  if (Abs (aSafePoint.X()) > aLim)
+    aSafePoint.SetX (aSafePoint.X() >= 0 ? aBigFloat : -aBigFloat);
+  if (Abs (aSafePoint.Y()) > aLim)
+    aSafePoint.SetY (aSafePoint.Y() >= 0 ? aBigFloat : -aBigFloat);
+  if (Abs (aSafePoint.Z()) > aLim)
+    aSafePoint.SetZ (aSafePoint.Z() >= 0 ? aBigFloat : -aBigFloat);
+
+  // convert point
+  Graphic3d_Vec4 aPnt (static_cast<Standard_ShortReal> (aSafePoint.X()),
+                       static_cast<Standard_ShortReal> (aSafePoint.Y()),
+                       static_cast<Standard_ShortReal> (aSafePoint.Z()), 1.0f);
+
+  return aPnt;
+}
+
+// =======================================================================
+// function : Project
+// purpose  :
+// =======================================================================
+gp_Pnt Graphic3d_Camera::Project (const gp_Pnt& thePnt) const
+{
+  const Graphic3d_Mat4& aViewMx = OrientationMatrix();
+  const Graphic3d_Mat4& aProjMx = ProjectionMatrix();
+
+  // use compatible type of point
+  Graphic3d_Vec4 aPnt = safePointCast (thePnt);
+
+  aPnt = aViewMx * aPnt; // convert to view coordinate space
+  aPnt = aProjMx * aPnt; // convert to projection coordinate space
+
+  const Standard_Real aInvW = 1.0 / Standard_Real (aPnt.w());
+
+  return gp_Pnt (aPnt.x() * aInvW, aPnt.y() * aInvW, aPnt.z() * aInvW);
+}
+
+// =======================================================================
+// function : UnProject
+// purpose  :
+// =======================================================================
+gp_Pnt Graphic3d_Camera::UnProject (const gp_Pnt& thePnt) const
+{
+  const Graphic3d_Mat4& aViewMx = OrientationMatrix();
+  const Graphic3d_Mat4& aProjMx = ProjectionMatrix();
+
+  Graphic3d_Mat4 aInvView;
+  Graphic3d_Mat4 aInvProj;
+
+  // this case should never happen
+  if (!aViewMx.Inverted (aInvView) || !aProjMx.Inverted (aInvProj))
+  {
+    return gp_Pnt (0.0, 0.0, 0.0);
+  }
+
+  // use compatible type of point
+  Graphic3d_Vec4 aPnt = safePointCast (thePnt);
+
+  aPnt = aInvProj * aPnt; // convert to view coordinate space
+  aPnt = aInvView * aPnt; // convert to world coordinate space
+
+  const Standard_Real aInvW = 1.0 / Standard_Real (aPnt.w());
+
+  return gp_Pnt (aPnt.x() * aInvW, aPnt.y() * aInvW, aPnt.z() * aInvW);
+}
+
+// =======================================================================
+// function : ConvertView2Proj
+// purpose  :
+// =======================================================================
+gp_Pnt Graphic3d_Camera::ConvertView2Proj (const gp_Pnt& thePnt) const
+{
+  const Graphic3d_Mat4& aProjMx = ProjectionMatrix();
+
+  // use compatible type of point
+  Graphic3d_Vec4 aPnt = safePointCast (thePnt);
+
+  aPnt = aProjMx * aPnt; // convert to projection coordinate space
+
+  const Standard_Real aInvW = 1.0 / Standard_Real (aPnt.w());
+
+  return gp_Pnt (aPnt.x() * aInvW, aPnt.y() * aInvW, aPnt.z() * aInvW);
+}
+
+// =======================================================================
+// function : ConvertProj2View
+// purpose  :
+// =======================================================================
+gp_Pnt Graphic3d_Camera::ConvertProj2View (const gp_Pnt& thePnt) const
+{
+  const Graphic3d_Mat4& aProjMx = ProjectionMatrix();
+
+  Graphic3d_Mat4 aInvProj;
+
+  // this case should never happen, but...
+  if (!aProjMx.Inverted (aInvProj))
+  {
+    return gp_Pnt(0, 0, 0);
+  }
+
+  // use compatible type of point
+  Graphic3d_Vec4 aPnt = safePointCast (thePnt);
+
+  aPnt = aInvProj * aPnt; // convert to view coordinate space
+
+  const Standard_Real aInvW = 1.0 / Standard_Real (aPnt.w());
+
+  return gp_Pnt (aPnt.x() * aInvW, aPnt.y() * aInvW, aPnt.z() * aInvW);
+}
+
+// =======================================================================
+// function : ConvertWorld2View
+// purpose  :
+// =======================================================================
+gp_Pnt Graphic3d_Camera::ConvertWorld2View (const gp_Pnt& thePnt) const
+{
+  const Graphic3d_Mat4& aViewMx = OrientationMatrix();
+
+  // use compatible type of point
+  Graphic3d_Vec4 aPnt = safePointCast (thePnt);
+
+  aPnt = aViewMx * aPnt; // convert to view coordinate space
+
+  const Standard_Real aInvW = 1.0 / Standard_Real (aPnt.w());
+
+  return gp_Pnt (aPnt.x() * aInvW, aPnt.y() * aInvW, aPnt.z() * aInvW);
+}
+
+// =======================================================================
+// function : ConvertView2World
+// purpose  :
+// =======================================================================
+gp_Pnt Graphic3d_Camera::ConvertView2World (const gp_Pnt& thePnt) const
+{
+  const Graphic3d_Mat4& aViewMx = OrientationMatrix();
+
+  Graphic3d_Mat4 aInvView;
+
+  if (!aViewMx.Inverted (aInvView))
+  {
+    return gp_Pnt(0, 0, 0);
+  }
+
+  // use compatible type of point
+  Graphic3d_Vec4 aPnt = safePointCast (thePnt);
+
+  aPnt = aInvView * aPnt; // convert to world coordinate space
+
+  const Standard_Real aInvW = 1.0 / Standard_Real (aPnt.w());
+
+  return gp_Pnt (aPnt.x() * aInvW, aPnt.y() * aInvW, aPnt.z() * aInvW);
+}
+
+// =======================================================================
+// function : ViewDimensions
+// purpose  :
+// =======================================================================
+gp_Pnt Graphic3d_Camera::ViewDimensions () const
+{
+  // view plane dimensions
+  Standard_Real aSizeY = IsOrthographic() ? myScale : (2.0 * Distance() * Tan (DTR_HALF * myFOVy));
+  Standard_Real aSizeX = myAspect * aSizeY;
+
+  // and frustum depth
+  return gp_Pnt (aSizeX, aSizeY, myZFar - myZNear);
+}
+
+// =======================================================================
+// function : WindowLimit
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::WindowLimit (Standard_Real& theUMin,
+                                    Standard_Real& theVMin,
+                                    Standard_Real& theUMax,
+                                    Standard_Real& theVMax) const
+{
+  gp_Pnt aViewDims = ViewDimensions();
+  gp_Pnt aShift    = ProjectionShift();
+  theUMin = -aViewDims.X() * 0.5 - aShift.X();
+  theVMin = -aViewDims.Y() * 0.5 - aShift.Y();
+  theUMax = aViewDims.X() * 0.5 - aShift.X();
+  theVMax = aViewDims.Y() * 0.5 - aShift.Y();
+}
+
+// =======================================================================
+// function : UpdateProjection
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::UpdateProjection()
+{
+  if (myNbUpdateLocks > 0)
+  {
+    return;
+  }
+
+  myProjectionState = (Standard_Size)Standard_Atomic_Increment (&THE_STATE_COUNTER);
+
+  // sets top of frustum based on FOVy and near clipping plane
+  Standard_Real aDYHalf;
+  if (IsOrthographic())
+  {
+     aDYHalf = myScale * 0.5;
+  }
+  else
+  {
+    aDYHalf = myZNear * Tan (DTR_HALF * myFOVy);
+  }
+
+  // sets right of frustum based on aspect ratio
+  Standard_Real aDXHalf = myAspect * aDYHalf;
+
+  Standard_ShortReal aLeft      = (Standard_ShortReal) -aDXHalf;
+  Standard_ShortReal aRight     = (Standard_ShortReal)  aDXHalf;
+  Standard_ShortReal aBot       = (Standard_ShortReal) -aDYHalf;
+  Standard_ShortReal aTop       = (Standard_ShortReal)  aDYHalf;
+  Standard_ShortReal aNear      = (Standard_ShortReal)  myZNear;
+  Standard_ShortReal aFar       = (Standard_ShortReal)  myZFar;
+  Standard_ShortReal aShiftX    = (Standard_ShortReal)  myProjectionShift.X();
+  Standard_ShortReal aShiftY    = (Standard_ShortReal)  myProjectionShift.Y();
+
+  Standard_ShortReal aIOD = (myIODType == IODType_Relative)
+        ? (Standard_ShortReal)(myIOD * Distance())
+        : (Standard_ShortReal)(myIOD);
+
+  Standard_ShortReal aFocus = (myZFocusType == FocusType_Relative)
+        ? (Standard_ShortReal)(myZFocus * Distance())
+        : (Standard_ShortReal)(myZFocus);
+
+  switch (myProjType)
+  {
+    case Projection_Orthographic :
+      OrthoProj (aLeft, aRight, aBot, aTop, aNear, aFar, aShiftX, aShiftY, myMProjection);
+      break;
+
+    case Projection_Perspective :
+      PerspectiveProj (aLeft, aRight, aBot, aTop, aNear, aFar, aShiftX, aShiftY, myMProjection);
+      break;
+
+    case Projection_MonoLeftEye :
+    {
+      StereoEyeProj (aLeft, aRight, aBot, aTop, aNear,
+                     aFar, aIOD, aFocus, aShiftX, aShiftY,
+                     Standard_True, myMProjection);
+      break;
+    }
+
+    case Projection_MonoRightEye :
+    {
+      StereoEyeProj (aLeft, aRight, aBot, aTop, aNear,
+                     aFar, aIOD, aFocus, aShiftX, aShiftY,
+                     Standard_False, myMProjection);
+      break;
+    }
+
+    case Projection_Stereo :
+    {
+      PerspectiveProj (aLeft, aRight, aBot, aTop, aNear, aFar, aShiftX, aShiftY, myMProjection);
+
+      StereoEyeProj (aLeft, aRight, aBot, aTop, aNear,
+                     aFar, aIOD, aFocus, aShiftX, aShiftY,
+                     Standard_True, myLProjection);
+
+      StereoEyeProj (aLeft, aRight, aBot, aTop, aNear,
+                     aFar, aIOD, aFocus, aShiftX, aShiftY,
+                     Standard_False, myRProjection);
+      break;
+    }
+  }
+}
+
+// =======================================================================
+// function : UpdateOrientation
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::UpdateOrientation()
+{
+  if (myNbUpdateLocks > 0)
+  {
+    return;
+  }
+
+  myOrientationState = (Standard_Size)Standard_Atomic_Increment (&THE_STATE_COUNTER);
+
+  Graphic3d_Vec3 anEye ((Standard_ShortReal) myEye.X(),
+                        (Standard_ShortReal) myEye.Y(),
+                        (Standard_ShortReal) myEye.Z());
+
+  Graphic3d_Vec3 aCenter ((Standard_ShortReal) myCenter.X(),
+                          (Standard_ShortReal) myCenter.Y(),
+                          (Standard_ShortReal) myCenter.Z());
+
+  Graphic3d_Vec3 anUp ((Standard_ShortReal) myUp.X(),
+                       (Standard_ShortReal) myUp.Y(),
+                       (Standard_ShortReal) myUp.Z());
+
+  Graphic3d_Vec3 anAxialScale ((Standard_ShortReal) myAxialScale.X(),
+                               (Standard_ShortReal) myAxialScale.Y(),
+                               (Standard_ShortReal) myAxialScale.Z());  
+
+  LookOrientation (anEye, aCenter, anUp, anAxialScale, myOrientation);
+
+  // Update orthogonalized Up vector
+  myUp = gp_Dir (anUp.x(), anUp.y(), anUp.z());
+}
+
+// =======================================================================
+// function : OrthoProj
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::OrthoProj (const Standard_ShortReal theLeft,
+                                  const Standard_ShortReal theRight,
+                                  const Standard_ShortReal theBottom,
+                                  const Standard_ShortReal theTop,
+                                  const Standard_ShortReal theNear,
+                                  const Standard_ShortReal theFar,
+                                  const Standard_ShortReal theShiftX,
+                                  const Standard_ShortReal theShiftY,
+                                  Graphic3d_Mat4& theOutMx)
+{
+  // row 0
+  theOutMx.ChangeValue (0, 0) = 2.0f / (theRight - theLeft);
+  theOutMx.ChangeValue (0, 1) = 0.0f;
+  theOutMx.ChangeValue (0, 2) = 0.0f;
+  theOutMx.ChangeValue (0, 3) = - (theRight + theLeft) / (theRight - theLeft);
+
+  // row 1
+  theOutMx.ChangeValue (1, 0) = 0.0f;
+  theOutMx.ChangeValue (1, 1) = 2.0f / (theTop - theBottom);
+  theOutMx.ChangeValue (1, 2) = 0.0f;
+  theOutMx.ChangeValue (1, 3) = - (theTop + theBottom) / (theTop - theBottom);
+
+  // row 2
+  theOutMx.ChangeValue (2, 0) = 0.0f;
+  theOutMx.ChangeValue (2, 1) = 0.0f;
+  theOutMx.ChangeValue (2, 2) = -2.0f / (theFar - theNear);
+  theOutMx.ChangeValue (2, 3) = - (theFar + theNear) / (theFar - theNear);
+
+  // row 3
+  theOutMx.ChangeValue (3, 0) = 0.0f;
+  theOutMx.ChangeValue (3, 1) = 0.0f;
+  theOutMx.ChangeValue (3, 2) = 0.0f;
+  theOutMx.ChangeValue (3, 3) = 1.0f;
+
+  Graphic3d_Mat4 aViewportShift;
+  aViewportShift.ChangeValue (0, 3) = theShiftX;
+  aViewportShift.ChangeValue (1, 3) = theShiftY;
+
+  theOutMx.Multiply (aViewportShift);
+}
+
+// =======================================================================
+// function : PerspectiveProj
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::PerspectiveProj (const Standard_ShortReal theLeft,
+                                        const Standard_ShortReal theRight,
+                                        const Standard_ShortReal theBottom,
+                                        const Standard_ShortReal theTop,
+                                        const Standard_ShortReal theNear,
+                                        const Standard_ShortReal theFar,
+                                        const Standard_ShortReal theShiftX,
+                                        const Standard_ShortReal theShiftY,
+                                        Graphic3d_Mat4& theOutMx)
+{
+  // column 0
+  theOutMx.ChangeValue (0, 0) = (2.0f * theNear) / (theRight - theLeft);
+  theOutMx.ChangeValue (1, 0) = 0.0f;
+  theOutMx.ChangeValue (2, 0) = 0.0f;
+  theOutMx.ChangeValue (3, 0) = 0.0f;
+
+  // column 1
+  theOutMx.ChangeValue (0, 1) = 0.0f;
+  theOutMx.ChangeValue (1, 1) = (2.0f * theNear) / (theTop - theBottom);
+  theOutMx.ChangeValue (2, 1) = 0.0f;
+  theOutMx.ChangeValue (3, 1) = 0.0f;
+
+  // column 2
+  theOutMx.ChangeValue (0, 2) = (theRight + theLeft) / (theRight - theLeft);
+  theOutMx.ChangeValue (1, 2) = (theTop + theBottom) / (theTop - theBottom);
+  theOutMx.ChangeValue (2, 2) = -(theFar + theNear) / (theFar - theNear);
+  theOutMx.ChangeValue (3, 2) = -1.0f;
+
+  // column 3
+  theOutMx.ChangeValue (0, 3) = 0.0f;
+  theOutMx.ChangeValue (1, 3) = 0.0f;
+  theOutMx.ChangeValue (2, 3) = -(2.0f * theFar * theNear) / (theFar - theNear);
+  theOutMx.ChangeValue (3, 3) = 0.0f;
+
+  Graphic3d_Mat4 aViewportShift;
+  aViewportShift.ChangeValue (0, 3) = theShiftX;
+  aViewportShift.ChangeValue (1, 3) = theShiftY;
+
+  theOutMx.Multiply (aViewportShift);
+}
+
+// =======================================================================
+// function : StereoEyeProj
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::StereoEyeProj (const Standard_ShortReal theLeft,
+                                      const Standard_ShortReal theRight,
+                                      const Standard_ShortReal theBottom,
+                                      const Standard_ShortReal theTop,
+                                      const Standard_ShortReal theNear,
+                                      const Standard_ShortReal theFar,
+                                      const Standard_ShortReal theIOD,
+                                      const Standard_ShortReal theZFocus,
+                                      const Standard_ShortReal theShiftX,
+                                      const Standard_ShortReal theShiftY,
+                                      const Standard_Boolean   theIsLeft,
+                                      Graphic3d_Mat4& theOutMx)
+{
+  Standard_ShortReal aDx = theIsLeft ? ( 0.5f * theIOD) : (-0.5f * theIOD);
+  Standard_ShortReal aDXStereoShift = aDx * theNear / theZFocus;
+
+  // construct eye projection matrix
+  PerspectiveProj (theLeft  + aDXStereoShift,
+                   theRight + aDXStereoShift,
+                   theBottom, theTop, theNear, theFar,
+                   theShiftX, theShiftY,
+                   theOutMx);
+
+  if (theIOD != 0.0f)
+  {
+    // X translation to cancel parallax
+    theOutMx.Translate (Graphic3d_Vec3 (aDx, 0.0f, 0.0f));
+  }
+}
+
+// =======================================================================
+// function : LookOrientation
+// purpose  :
+// =======================================================================
+void Graphic3d_Camera::LookOrientation (const Graphic3d_Vec3& theEye,
+                                        const Graphic3d_Vec3& theLookAt,
+                                        Graphic3d_Vec3& theUpDir,
+                                        const Graphic3d_Vec3& theAxialScale,
+                                        Graphic3d_Mat4& theOutMx)
+{
+  Graphic3d_Vec3 aForward = theLookAt - theEye;
+  aForward.Normalize();
+
+  // side = forward x up
+  Graphic3d_Vec3 aSide = Graphic3d_Vec3::Cross (aForward, theUpDir);
+  aSide.Normalize();
+
+  // recompute up as: up = side x forward
+  Graphic3d_Vec3 anUp = Graphic3d_Vec3::Cross (aSide, aForward);
+  theUpDir = anUp;
+
+  Graphic3d_Mat4 aLookMx;
+  aLookMx.SetRow (0, aSide);
+  aLookMx.SetRow (1, anUp);
+  aLookMx.SetRow (2, -aForward);
+
+  theOutMx.InitIdentity(); 
+  theOutMx.Multiply (aLookMx); 
+
+  theOutMx.Translate (-theEye);
+
+  Graphic3d_Mat4 anAxialScaleMx;
+  anAxialScaleMx.ChangeValue (0, 0) = theAxialScale.x();
+  anAxialScaleMx.ChangeValue (1, 1) = theAxialScale.y();
+  anAxialScaleMx.ChangeValue (2, 2) = theAxialScale.z();
+
+  theOutMx.Multiply (anAxialScaleMx);
+}
diff --git a/src/Graphic3d/Graphic3d_Camera.hxx b/src/Graphic3d/Graphic3d_Camera.hxx
new file mode 100644 (file)
index 0000000..132205d
--- /dev/null
@@ -0,0 +1,558 @@
+// Created on: 2013-05-29
+// Created by: Anton POLETAEV
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Graphic3d_Camera_HeaderFile
+#define _Graphic3d_Camera_HeaderFile
+
+#include <Graphic3d_Mat4.hxx>
+#include <Graphic3d_Vec3.hxx>
+
+#include <gp_Dir.hxx>
+#include <gp_Pnt.hxx>
+
+#include <Standard_Macro.hxx>
+#include <Standard_TypeDef.hxx>
+
+DEFINE_STANDARD_HANDLE (Graphic3d_Camera, Standard_Transient)
+
+//! Camera class provides object-oriented approach to setting up projection
+//! and orientation properties of 3D view.
+class Graphic3d_Camera : public Standard_Transient
+{
+
+public:
+
+  //! Enumerates supported monographic projections.
+  //! - Projection_Orthographic : orthographic projection.
+  //! - Projection_Perspective  : perspective projection.
+  //! - Projection_Stere        : stereographic projection.
+  //! - Projection_MonoLeftEye  : mono projection for stereo left eye.
+  //! - Projection_MonoRightEye : mono projection for stereo right eye.
+  enum Projection
+  {
+    Projection_Orthographic,
+    Projection_Perspective,
+    Projection_Stereo,
+    Projection_MonoLeftEye,
+    Projection_MonoRightEye
+  };
+
+  //! Enumerates approaches to define stereographic focus.
+  //! - FocusType_Absolute : focus is specified as absolute value.
+  //! - FocusType_Relative : focus is specified relative to
+  //! (as coefficient of) camera focal length.
+  enum FocusType
+  {
+    FocusType_Absolute,
+    FocusType_Relative
+  };
+
+  //! Enumerates approaches to define Intraocular distance.
+  //! - IODType_Absolute : Intraocular distance is defined as absolute value.
+  //! - IODType_Relative : Intraocular distance is defined relative to
+  //! (as coefficient of) camera focal length.
+  enum IODType
+  {
+    IODType_Absolute,
+    IODType_Relative
+  };
+
+public:
+
+  //! Default constructor.
+  //! Initializes camera with the following properties:
+  //! Eye (0, 0, -2); Center (0, 0, 0); Up (0, 1, 0);
+  //! Type (Orthographic); FOVy (45); Scale (1000); IsStereo(false);
+  //! ZNear (0.1); ZFar (100); Aspect(1);
+  //! ZFocus(1.0); ZFocusType(Relative); IOD(0.05); IODType(Relative)
+  Standard_EXPORT Graphic3d_Camera();
+
+  //! Copy constructor.
+  //! @param theOther [in] the camera to copy from.
+  Standard_EXPORT Graphic3d_Camera (const Handle(Graphic3d_Camera)& theOther);
+
+  //! Initialize mapping related parameters from other camera handle.
+  Standard_EXPORT void CopyMappingData (const Handle(Graphic3d_Camera)& theOtherCamera);
+
+  //! Initialize orientation related parameters from other camera handle.
+  Standard_EXPORT void CopyOrientationData (const Handle(Graphic3d_Camera)& theOtherCamera);
+
+  //! Copy properties of another camera.
+  //! @param theOther [in] the camera to copy from.
+  Standard_EXPORT void Copy (const Handle(Graphic3d_Camera)& theOther);
+
+  //! Returns modification state of camera projection matrix
+  Standard_Size ProjectionState() const
+  {
+    return myProjectionState;
+  }
+
+  //! Returns modification state of camera model-view matrix
+  Standard_Size ModelViewState() const
+  {
+    return myOrientationState;
+  }
+
+  //! Sets camera Eye position.
+  //! @param theEye [in] the location of camera's Eye.
+  Standard_EXPORT void SetEye (const gp_Pnt& theEye);
+
+  //! Get camera Eye position.
+  //! @return camera eye location.
+  const gp_Pnt& Eye() const
+  {
+    return myEye;
+  }
+
+  //! Sets Center of the camera.
+  //! @param theCenter [in] the point where the camera looks at.
+  Standard_EXPORT void SetCenter (const gp_Pnt& theCenter);
+
+  //! Get Center of the camera.
+  //! @return the point where the camera looks at.
+  const gp_Pnt& Center() const
+  {
+    return myCenter;
+  }
+
+  //! Sets camera Up direction vector.
+  //! @param theUp [in] the Up direction vector.
+  Standard_EXPORT void SetUp (const gp_Dir& theUp);
+
+  //! Get camera Up direction vector.
+  //! @return Camera's Up direction vector.
+  const gp_Dir& Up() const
+  {
+    return myUp;
+  }
+
+  //! Set camera projection shift vector.<br>
+  //! Used for compatibility with older view mechanics. Applied after
+  //! view transform and before projection step (P * Shift * V).
+  //! @param theProjShift [in] the projection shift vector.
+  Standard_EXPORT void SetProjectionShift (const gp_Pnt& theProjShift);
+
+  //! Get camera projection shift vector.
+  //! @return Camera's projection shift vector.
+  const gp_Pnt& ProjectionShift() const
+  {
+    return myProjectionShift;
+  }
+
+  //! Set camera axial scale.<br>
+  //! @param theAxialScale [in] the axial scale vector.
+  Standard_EXPORT void SetAxialScale (const gp_Pnt& theAxialScale);
+
+  //! Get camera axial scale.
+  //! @return Camera's axial scale.
+  const gp_Pnt& AxialScale() const
+  {
+    return myAxialScale;
+  }
+
+  //! Set distance of Eye from camera Center.
+  //! @param theDistance [in] the distance.
+  Standard_EXPORT void SetDistance (const Standard_Real theDistance);
+
+  //! Get distance of Eye from camera Center.
+  //! @return the distance.
+  Standard_EXPORT Standard_Real Distance() const;
+
+  //! Sets camera look direction.
+  //! @param theDir [in] the direction.
+  Standard_EXPORT void SetDirection (const gp_Dir& theDir);
+
+  //! Get camera look direction.
+  //! @return camera look direction.
+  Standard_EXPORT gp_Dir Direction() const;
+
+  //! Sets camera scale. For orthographic projection the scale factor
+  //! corresponds to parallel scale of view mapping  (i.e. size
+  //! of viewport). For perspective camera scale is converted to
+  //! distance.
+  //! @param theScale [in] the scale factor.
+  Standard_EXPORT void SetScale (const Standard_Real theScale);
+
+  //! Get camera scale.
+  //! @return camera scale factor.
+  Standard_EXPORT Standard_Real Scale() const;
+
+  //! Change camera projection type.
+  //! While switching between perspective and ortho projection types
+  //! ZNear and ZFar value conversion is performed due to different 
+  //! coordinate systems (made for compatibility, to be improved..)
+  //! @param theProjectionType [in] the camera projection type.
+  Standard_EXPORT void SetProjectionType (const Projection theProjection);
+
+  //! @return camera projection type.
+  Projection ProjectionType() const
+  {
+    return myProjType;
+  }
+
+  //! Check that the camera projection is orthographic.
+  //! @return boolean flag that indicates whether the camera's projection is
+  //! orthographic or not.
+  Standard_Boolean IsOrthographic() const
+  {
+    return (myProjType == Projection_Orthographic);
+  }
+
+  //! Check whether the camera projection is stereo.
+  //! Please note that stereo rendering is now implemented with support of
+  //! Quad buffering.
+  //! @return boolean flag indicating whether the stereographic L/R projection
+  //! is chosen.
+  Standard_Boolean IsStereo() const
+  {
+    return (myProjType == Projection_Stereo);
+  }
+
+  //! Set Field Of View (FOV) in y axis for perspective projection.
+  //! @param theFOVy [in] the FOV in degrees.
+  Standard_EXPORT void SetFOVy (const Standard_Real theFOVy);
+
+  //! Get Field Of View (FOV) in y axis.
+  //! @return the FOV value in degrees.
+  Standard_Real FOVy() const
+  {
+    return myFOVy;
+  }
+
+  //! Change the Near Z-clipping plane position.
+  //! @param theZNear [in] the distance of the plane from the Eye.
+  Standard_EXPORT void SetZNear (const Standard_Real theZNear);
+
+  //! Get the Near Z-clipping plane position.
+  //! @return the distance of the plane from the Eye.
+  Standard_Real ZNear() const
+  {
+    return myZNear;
+  }
+
+  //! Change the Far Z-clipping plane position.
+  //! @param theZFar [in] the distance of the plane from the Eye.
+  Standard_EXPORT void SetZFar (const Standard_Real theZFar);
+
+  //! Get the Far Z-clipping plane position.
+  //! @return the distance of the plane from the Eye.
+  Standard_Real ZFar() const
+  {
+    return myZFar;
+  }
+
+  //! Change display ratio.
+  //! @param theAspect [in] the display ratio.
+  Standard_EXPORT void SetAspect (const Standard_Real theAspect);
+
+  //! Get camera display ratio.
+  //! @return display ratio.
+  Standard_Real Aspect() const
+  {
+    return myAspect;
+  }
+
+  //! Sets stereographic focus distance.
+  //! @param theType [in] the focus definition type. Focus can be defined
+  //! as absolute value or relatively to (as coefficient of) coefficient of
+  //! camera focal length.
+  //! @param theZFocus [in] the focus absolute value or coefficient depending
+  //! on the passed definition type.
+  Standard_EXPORT void SetZFocus (const FocusType theType, const Standard_Real theZFocus);
+
+  //! Get stereographic focus value.
+  //! @return absolute or relative stereographic focus value
+  //! depending on its definition type.
+  Standard_Real ZFocus() const
+  {
+    return myZFocus;
+  }
+
+  //! Get stereographic focus definition type.
+  //! @return definition type used for stereographic focus.
+  FocusType ZFocusType() const
+  {
+    return myZFocusType;
+  }
+
+  //! Sets Intraocular distance.
+  //! @param theType [in] the IOD definition type. IOD can be defined as
+  //! absolute value or relatively to (as coefficient of) camera focal length.
+  //! @param theIOD [in] the Intraocular distance.
+  Standard_EXPORT void SetIOD (const IODType theType, const Standard_Real theIOD);
+
+  //! Get Intraocular distance value.
+  //! @return absolute or relative IOD value depending on its definition type.
+  Standard_Real IOD() const
+  {
+    return myIOD;
+  }
+
+  //! Get Intraocular distance definition type.
+  //! @return definition type used for Intraocular distance.
+  IODType GetIODType() const
+  {
+    return myIODType;
+  }
+
+  //! Get orientation matrix.
+  //! @return camera orientation matrix.
+  const Graphic3d_Mat4& OrientationMatrix() const
+  {
+    return myOrientation;
+  }
+
+  //! Get monographic or middle point projection matrix used for monographic
+  //! rendering and for point projection / unprojection.
+  //! @return monographic projection matrix.
+  const Graphic3d_Mat4& ProjectionMatrix() const
+  {
+    return myMProjection;
+  }
+
+  //! @return stereographic matrix computed for left eye. Please note
+  //! that this method is used for rendering for <i>Projection_Stereo</i>.
+  const Graphic3d_Mat4& ProjectionStereoLeft() const
+  {
+    return myLProjection;
+  }
+
+  //! @return stereographic matrix computed for right eye. Please note
+  //! that this method is used for rendering for <i>Projection_Stereo</i>.
+  const Graphic3d_Mat4& ProjectionStereoRight() const
+  {
+    return myRProjection;
+  }
+
+public:
+
+  //! Orthogonalize up direction vector.
+  Standard_EXPORT void OrthogonalizeUp();
+
+  //! Suspend internal data recalculation when changing set of camera
+  //! properties. This method is optional and can be used for pieces
+  //! of code which are critical to performance. Note that the method
+  //! supports stacked calls (carried out by internal counter).
+  Standard_EXPORT void BeginUpdate();
+
+  //! Unset lock set by <i>BeginUpdate</i> and invoke data recalculation when
+  //! there are no more locks left. This method is optional and can be used
+  //! for pieces of code which are critical to performance.
+  Standard_EXPORT void EndUpdate();
+
+  // Basic camera operations
+public:
+
+  //! Transform orientation components of the camera:
+  //! Eye, Up and Center points.
+  //! @param theTrsf [in] the transformation to apply.
+  Standard_EXPORT void Transform (const gp_Trsf& theTrsf);
+
+  //! Calculate view plane size at center (target) point
+  //! and distance between ZFar and ZNear planes.
+  //! @return values in form of gp_Pnt (Width, Height, Depth).
+  Standard_EXPORT gp_Pnt ViewDimensions () const;
+
+  //! Calculate view plane dimensions with projection shift applied.
+  //! Analog to old ViewMapping.WindowLimit() function.
+  //! @param theUMin [out] the u component of min corner of the rect.
+  //! @param theVMin [out] the v component of min corner of the rect.
+  //! @param theUMax [out] the u component of max corner of the rect.
+  //! @param theVMax [out] the v component of max corner of the rect.
+  Standard_EXPORT void WindowLimit (Standard_Real& theUMin,
+                                    Standard_Real& theVMin,
+                                    Standard_Real& theUMax,
+                                    Standard_Real& theVMax) const;
+
+  // Projection methods
+public:
+
+  //! Project point from world coordinate space to
+  //! normalized device coordinates (mapping).
+  //! @param thePnt [in] the 3D point in WCS.
+  //! @return mapped point in NDC.
+  Standard_EXPORT gp_Pnt Project (const gp_Pnt& thePnt) const;
+
+  //! Unproject point from normalized device coordinates
+  //! to world coordinate space.
+  //! @param thePnt [in] the NDC point.
+  //! @return 3D point in WCS.
+  Standard_EXPORT gp_Pnt UnProject (const gp_Pnt& thePnt) const;
+
+  //! Convert point from view coordinate space to
+  //! projection coordinate space.
+  //! @param thePnt [in] the point in VCS.
+  //! @return point in NDC.
+  Standard_EXPORT gp_Pnt ConvertView2Proj (const gp_Pnt& thePnt) const;
+
+  //! Convert point from projection coordinate space
+  //! to view coordinate space.
+  //! @param thePnt [in] the point in NDC.
+  //! @return point in VCS.
+  Standard_EXPORT gp_Pnt ConvertProj2View (const gp_Pnt& thePnt) const;
+
+  //! Convert point from world coordinate space to
+  //! view coordinate space.
+  //! @param thePnt [in] the 3D point in WCS.
+  //! @return point in VCS.
+  Standard_EXPORT gp_Pnt ConvertWorld2View (const gp_Pnt& thePnt) const;
+
+  //! Convert point from view coordinate space to
+  //! world coordinates.
+  //! @param thePnt [in] the 3D point in VCS.
+  //! @return point in WCS.
+  Standard_EXPORT gp_Pnt ConvertView2World (const gp_Pnt& thePnt) const;
+
+  // managing projection and orientation cache:
+public:
+
+  //! Compute and cache projection matrices.
+  void UpdateProjection();
+
+  //! Compute and cache orientation matrix.
+  void UpdateOrientation();
+
+private:
+
+  //! Compose orthographic projection matrix for
+  //! the passed camera volume mapping.
+  //! @param theLeft [in] the left mapping (clipping) coordinate.
+  //! @param theRight [in] the right mapping (clipping) coordinate.
+  //! @param theBottom [in] the bottom mapping (clipping) coordinate.
+  //! @param theTop [in] the top mapping (clipping) coordinate.
+  //! @param theNear [in] the near mapping (clipping) coordinate.
+  //! @param theFar [in] the far mapping (clipping) coordinate.
+  //! @param theShiftX [in] the shift x coordinate.
+  //! @param theShiftY [in] the shift y coordinate.
+  //! @param theOutMx [out] the projection matrix.
+  static void 
+    OrthoProj (const Standard_ShortReal theLeft,
+               const Standard_ShortReal theRight,
+               const Standard_ShortReal theBottom,
+               const Standard_ShortReal theTop,
+               const Standard_ShortReal theNear,
+               const Standard_ShortReal theFar,
+               const Standard_ShortReal theShiftX,
+               const Standard_ShortReal theShiftY,
+               Graphic3d_Mat4&          theOutMx);
+
+  //! Compose perspective projection matrix for
+  //! the passed camera volume mapping.
+  //! @param theLeft [in] the left mapping (clipping) coordinate.
+  //! @param theRight [in] the right mapping (clipping) coordinate.
+  //! @param theBottom [in] the bottom mapping (clipping) coordinate.
+  //! @param theTop [in] the top mapping (clipping) coordinate.
+  //! @param theNear [in] the near mapping (clipping) coordinate.
+  //! @param theFar [in] the far mapping (clipping) coordinate.
+  //! @param theShiftX [in] the shift x coordinate.
+  //! @param theShiftY [in] the shift y coordinate.
+  //! @param theOutMx [out] the projection matrix.
+  static void
+    PerspectiveProj (const Standard_ShortReal theLeft,
+                     const Standard_ShortReal theRight,
+                     const Standard_ShortReal theBottom,
+                     const Standard_ShortReal theTop,
+                     const Standard_ShortReal theNear,
+                     const Standard_ShortReal theFar,
+                     const Standard_ShortReal theShiftX,
+                     const Standard_ShortReal theShiftY,
+                     Graphic3d_Mat4&          theOutMx);
+
+  //! Compose projection matrix for L/R stereo eyes.
+  //! @param theLeft [in] the left mapping (clipping) coordinate.
+  //! @param theRight [in] the right mapping (clipping) coordinate.
+  //! @param theBottom [in] the bottom mapping (clipping) coordinate.
+  //! @param theTop [in] the top mapping (clipping) coordinate.
+  //! @param theNear [in] the near mapping (clipping) coordinate.
+  //! @param theFar [in] the far mapping (clipping) coordinate.
+  //! @param theIOD [in] the Intraocular distance.
+  //! @param theZFocus [in] the z coordinate of off-axis
+  //! projection plane with zero parallax.
+  //! @param theShiftX [in] the shift x coordinate.
+  //! @param theShiftY [in] the shift y coordinate.
+  //! @param theIsLeft [in] boolean flag to choose between L/R eyes.
+  //! @param theOutMx [out] the projection matrix.
+  static void
+    StereoEyeProj (const Standard_ShortReal theLeft,
+                   const Standard_ShortReal theRight,
+                   const Standard_ShortReal theBottom,
+                   const Standard_ShortReal theTop,
+                   const Standard_ShortReal theNear,
+                   const Standard_ShortReal theFar,
+                   const Standard_ShortReal theIOD,
+                   const Standard_ShortReal theZFocus,
+                   const Standard_ShortReal theShiftX,
+                   const Standard_ShortReal theShiftY,
+                   const Standard_Boolean   theIsLeft,
+                   Graphic3d_Mat4&          theOutMx);
+
+  //! Construct "look at" orientation transformation.
+  //! Reference point differs for perspective and ortho modes 
+  //! (made for compatibility, to be improved..).
+  //! @param theEye [in] the eye coordinates in 3D space.
+  //! @param theLookAt [in] the point the camera looks at.
+  //! @param theUpDir [in] the up direction vector.
+  //! @param theAxialScale [in] the axial scale vector.
+  //! @param theOutMx [in/out] the orientation matrix.
+  static void
+    LookOrientation (const Graphic3d_Vec3& theEye,
+                     const Graphic3d_Vec3& theLookAt,
+                     Graphic3d_Vec3& theUpDir,
+                     const Graphic3d_Vec3& theAxialScale,
+                     Graphic3d_Mat4& theOutMx);
+
+private:
+
+  gp_Dir myUp;     //!< Camera up direction vector.
+  gp_Pnt myEye;    //!< Camera eye position.
+  gp_Pnt myCenter; //!< Camera center.
+
+  gp_Pnt myProjectionShift; //!< Camera projection shift for compatibility.
+  gp_Pnt myAxialScale;      //!< Camera axial scale.
+
+  Projection myProjType;  //!< Projection type used for rendering.
+  Standard_Real myFOVy;   //!< Field Of View in y axis.
+  Standard_Real myZNear;  //!< Distance to near clipping plane.
+  Standard_Real myZFar;   //!< Distance to far clipping plane.
+  Standard_Real myAspect; //!< Width to height display ratio.
+
+  Standard_Real myScale;      //!< Specifies parallel scale for orthographic projection.
+  Standard_Real myZFocus;     //!< Stereographic focus value.
+  FocusType     myZFocusType; //!< Stereographic focus definition type.
+
+  Standard_Real myIOD;     //!< Intraocular distance value.
+  IODType       myIODType; //!< Intraocular distance definition type.
+
+  //! Number of locks set up on internal data recalculation by
+  //! <i>(BeginUpdate, EndUpdate)</i> pairs. The counter provides effective
+  //! use of the mentioned methods when camera properties are modified
+  //! in stacked functions.
+  Standard_Integer myNbUpdateLocks;
+
+  Graphic3d_Mat4 myOrientation; //!< Camera orientation matrix.
+  Graphic3d_Mat4 myMProjection; //!< Monographic projection matrix.
+  Graphic3d_Mat4 myLProjection; //!< Projection matrix for left eye.
+  Graphic3d_Mat4 myRProjection; //!< Projection matrix for right eye.
+
+  Standard_Size myProjectionState;
+  Standard_Size myOrientationState;
+
+public:
+
+  DEFINE_STANDARD_RTTI(Graphic3d_Camera);
+
+};
+
+#endif
diff --git a/src/Graphic3d/Graphic3d_Camera_Handle.hxx b/src/Graphic3d/Graphic3d_Camera_Handle.hxx
new file mode 100644 (file)
index 0000000..f7cf994
--- /dev/null
@@ -0,0 +1,22 @@
+// Created on: 2013-05-31
+// Created by: Anton POLETAEV
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Graphic3d_Camera_Handle_H__
+#define _Graphic3d_Camera_Handle_H__
+
+#include <Graphic3d_Camera.hxx>
+typedef Handle(Graphic3d_Camera) Graphic3d_Camera_Handle;
+
+#endif
index ab353ca..9486c19 100644 (file)
@@ -123,13 +123,6 @@ is
         is deferred;
     ---Purpose: call_togl_inquirelight
 
-    InquireMat ( me     : mutable;
-                 ACView : CView from Graphic3d;
-                 AMatO  : out Array2OfReal from TColStd;
-                 AMatM  : out Array2OfReal from TColStd )
-        is deferred;
-    ---Purpose: call_togl_inquiremat
-
     InquirePlaneLimit ( me  : mutable )
         returns Integer from Standard
         is deferred;
@@ -325,50 +318,6 @@ is
         is deferred;
     ---Purpose: call_togl_cliplimit
 
-    ProjectRaster ( me      : mutable;
-                    ACView  : CView from Graphic3d;
-                    AX      : ShortReal from Standard;
-                    AY      : ShortReal from Standard;
-                    AZ      : ShortReal from Standard;
-                    AU      : out Integer from Standard;
-                    AV      : out Integer from Standard )
-        returns Boolean from Standard
-        is deferred;
-    ---Purpose: call_togl_unproject_raster
-
-    UnProjectRaster ( me        : mutable;
-                      ACView    : CView from Graphic3d;
-                      Axm       : Integer from Standard;
-                      Aym       : Integer from Standard;
-                      AXM       : Integer from Standard;
-                      AYM       : Integer from Standard;
-                      AU        : Integer from Standard;
-                      AV        : Integer from Standard;
-                      AX        : out ShortReal from Standard;
-                      AY        : out ShortReal from Standard;
-                      AZ        : out ShortReal from Standard )
-        returns Boolean from Standard
-        is deferred;
-    ---Purpose: call_togl_unproject_raster
-
-    UnProjectRasterWithRay ( me        : mutable;
-                             ACView    : CView from Graphic3d;
-                             Axm       : Integer from Standard;
-                             Aym       : Integer from Standard;
-                             AXM       : Integer from Standard;
-                             AYM       : Integer from Standard;
-                             AU        : Integer from Standard;
-                             AV        : Integer from Standard;
-                             AX        : out ShortReal from Standard;
-                             AY        : out ShortReal from Standard;
-                             AZ        : out ShortReal from Standard;
-                             DX        : out ShortReal from Standard;
-                             DY        : out ShortReal from Standard;
-                             DZ        : out ShortReal from Standard )
-        returns Boolean from Standard
-        is deferred;
-    ---Purpose: call_togl_unproject_raster_with_ray
-
     RatioWindow ( me        : mutable;
                   ACView    : CView from Graphic3d )
         is deferred;
@@ -402,6 +351,10 @@ is
     SetClipPlanes (me : mutable; theCStructure : CStructure from Graphic3d) is deferred;
     ---Purpose: Pass clip planes to the associated graphic driver structure.
 
+    SetCamera (me : mutable; theCView : CView from Graphic3d)
+         is deferred;
+    ---Purpose: Inform graphic driver if camera assigned to view changes.
+
     SetVisualisation ( me       : mutable;
                        ACView   : CView from Graphic3d )
         is deferred;
@@ -431,18 +384,6 @@ is
         is deferred;
     ---Purpose: call_togl_view
 
-    ViewMapping ( me        : mutable;
-                  ACView    : CView from Graphic3d;
-                  AWait : Boolean from Standard )
-        is deferred;
-    ---Purpose: call_togl_viewmapping
-
-    ViewOrientation ( me        : mutable;
-                      ACView    : CView from Graphic3d;
-                      AWait     : Boolean from Standard )
-        is deferred;
-    ---Purpose: call_togl_vieworientation
-
         Environment ( me        : mutable;
                       ACView    : CView from Graphic3d )
         is deferred;
index 60e5de9..ae79b55 100755 (executable)
@@ -92,5 +92,4 @@ NCollection_DefineAlloc.hxx
 NCollection_Vec2.hxx
 NCollection_Vec3.hxx
 NCollection_Vec4.hxx
-
 NCollection_Mat4.hxx
index c22b701..67f357a 100644 (file)
 #define Handle_NIS_View_HeaderFile
 
 #include <Standard_DefineHandle.hxx>
-#include <Handle_V3d_OrthographicView.hxx>
+#include <Handle_V3d_View.hxx>
 
 class NIS_View;
 
 // Definition of HANDLE object using Standard_DefineHandle.hxx
-DEFINE_STANDARD_HANDLE (NIS_View, V3d_OrthographicView)
+DEFINE_STANDARD_HANDLE (NIS_View, V3d_View)
 
 #endif
index 0d3e4a1..edb01d0 100644 (file)
@@ -23,8 +23,8 @@
 
 #include <OpenGl_GlCore11.hxx>
 
-IMPLEMENT_STANDARD_HANDLE  (NIS_View, V3d_OrthographicView)
-IMPLEMENT_STANDARD_RTTIEXT (NIS_View, V3d_OrthographicView)
+IMPLEMENT_STANDARD_HANDLE  (NIS_View, V3d_View)
+IMPLEMENT_STANDARD_RTTIEXT (NIS_View, V3d_View)
 
 //=======================================================================
 //function : NIS_View()
@@ -33,7 +33,7 @@ IMPLEMENT_STANDARD_RTTIEXT (NIS_View, V3d_OrthographicView)
 
 NIS_View::NIS_View (const Handle(V3d_Viewer)&    theViewer,
                     const Handle(Aspect_Window)& theWindow)
-  : V3d_OrthographicView (theViewer),
+  : V3d_View (theViewer),
     myIsTopHilight(Standard_False),
     myDoHilightSelected(Standard_True)
 {
@@ -107,78 +107,109 @@ void NIS_View::RemoveContext (NIS_InteractiveContext * theCtx)
 Standard_Boolean NIS_View::FitAll3d (const Quantity_Coefficient theCoef)
 {
   Standard_Boolean aResult(Standard_False);
-  /*
-  Standard_Integer aLimp[4] = { 1000000, -1000000, 1000000, -1000000 };
-  GetBndBox( aLimp[0], aLimp[1], aLimp[2], aLimp[3] );
-  if (aLimp[1] > -1000000 && aLimp[3] > -1000000 &&
-      aLimp[0] < aLimp[1] && aLimp[2] < aLimp[3])
-  {
-    // Scale the view
-    WindowFit (aLimp[0], aLimp[2], aLimp[1], aLimp[3]);
-    aResult = Standard_True;
-  }
-  */
 
   Bnd_B3f aBox = GetBndBox();
 
   // Check that the box is not empty
-  if (aBox.IsVoid() == Standard_False && MyView->IsDefined() == Standard_True) {
+  if (aBox.IsVoid() == Standard_False && MyView->IsDefined() == Standard_True)
+  {
     // Convert the 3D box to 2D representation in view coordinates
-    Standard_Real Umin = 0.,Umax = 0.,Vmin = 0.,Vmax = 0.,U,V,W;
     gp_XYZ aCoord;
 
     const gp_XYZ aCorner[2] = { aBox.CornerMin(), aBox.CornerMax() };
 
-    Standard_Boolean doFit = Standard_True;
-    while (doFit) {
+    // Fit depth
+    const gp_XYZ& aBMin = aCorner[0];
+    const gp_XYZ& aBMax = aCorner[1];
 
-    for (Standard_Integer i = 0; i < 8; i++) {
-      if (i & 0x1) aCoord.SetX (aCorner[0].X());
-      else         aCoord.SetX (aCorner[1].X());
-      if (i & 0x2) aCoord.SetY (aCorner[0].Y());
-      else         aCoord.SetY (aCorner[1].Y());
-      if (i & 0x4) aCoord.SetZ (aCorner[0].Z());
-      else         aCoord.SetZ (aCorner[1].Z());
+    gp_Pnt anAABBCenter ((aBMin.X() + aBMax.X()) * 0.5,
+                         (aBMin.Y() + aBMax.Y()) * 0.5,
+                         (aBMin.Z() + aBMax.Z()) * 0.5);
 
-      MyView->Projects(aCoord.X(), aCoord.Y(), aCoord.Z(), U, V, W);
-      if (i) {
-        Umin = Min(Umin, U); Umax = Max(Umax, U);
-        Vmin = Min(Vmin, V); Vmax = Max(Vmax, V);
-      }
-      else {
-        Umin = Umax = U;
-        Vmin = Vmax = V;
+    gp_Vec aCenter2AABB (myCamera->Center(), anAABBCenter);
+    gp_Dir aDir = myCamera->Direction();
+
+    // distance projection onto camera direction
+    Standard_Real aDistToBox = -aCenter2AABB.Dot (aDir);
+    gp_Vec aZShift = gp_Vec (aDir).Reversed().Scaled (aDistToBox);
+
+    gp_Pnt anEyeBefore   = myCamera->Eye();
+    gp_Pnt aCenterBefore = myCamera->Center();
+
+    myCamera->BeginUpdate();
+    myCamera->SetEye (myCamera->Eye().Translated (aZShift));
+    myCamera->SetCenter (myCamera->Center().Translated (aZShift));
+    myCamera->EndUpdate();
+
+    Standard_Real Umin = RealLast();
+    Standard_Real Umax = RealFirst();
+    Standard_Real Vmin = RealLast();
+    Standard_Real Vmax = RealFirst();
+    Standard_Real U, V, W;
+
+    Standard_Boolean doFit = Standard_True;
+    while (doFit) 
+    {
+      for (Standard_Integer i = 0; i < 8; i++) {
+        if (i & 0x1) aCoord.SetX (aCorner[0].X());
+        else         aCoord.SetX (aCorner[1].X());
+        if (i & 0x2) aCoord.SetY (aCorner[0].Y());
+        else         aCoord.SetY (aCorner[1].Y());
+        if (i & 0x4) aCoord.SetZ (aCorner[0].Z());
+        else         aCoord.SetZ (aCorner[1].Z());
+
+        MyView->Projects(aCoord.X(), aCoord.Y(), aCoord.Z(), U, V, W);
+        if (i) {
+          Umin = Min(Umin, U); Umax = Max(Umax, U);
+          Vmin = Min(Vmin, V); Vmax = Max(Vmax, V);
+        }
+        else {
+          Umin = Umax = U;
+          Vmin = Vmax = V;
+        }
       }
-    }
 
-    if ( (Umax > Umin) && (Vmax > Vmin) ) {
-      Standard_Real OldUmin,OldUmax,OldVmin,OldVmax;
-      MyViewMapping.WindowLimit(OldUmin, OldVmin, OldUmax, OldVmax);
-      Standard_Real DxvOld = Abs(OldUmax - OldUmin);
+      if ( (Umax > Umin) && (Vmax > Vmin) )
+      {
+        gp_Pnt ViewDims = myCamera->ViewDimensions();
+        Standard_Real DxvOld = ViewDims.X();
+
+        Standard_Real Xrp, Yrp, DxvNew, DyvNew;
 
-      // make a margin
-      Standard_Real Xrp, Yrp, DxvNew, DyvNew;
+        DxvNew = Abs(Umax - Umin); DyvNew = Abs(Vmax - Vmin);
+        DxvNew *= (1. + theCoef);
+        DyvNew *= (1. + theCoef);
 
-      DxvNew = Abs(Umax - Umin); DyvNew = Abs(Vmax - Vmin);
-      DxvNew *= (1. + theCoef);
-      DyvNew *= (1. + theCoef);
+        Standard_Real aRatio = DxvNew / DxvOld;
 
-      Standard_Real aRatio = DxvNew / DxvOld;
+        Xrp = (Umin + Umax)/2. ; Yrp = (Vmin + Vmax)/2. ;
+        Umin = Xrp - DxvNew/2. ; Umax = Xrp + DxvNew/2. ;
+        Vmin = Yrp - DyvNew/2. ; Vmax = Yrp + DyvNew/2. ;
 
-      Xrp = (Umin + Umax)/2. ; Yrp = (Vmin + Vmax)/2. ;
-      Umin = Xrp - DxvNew/2. ; Umax = Xrp + DxvNew/2. ;
-      Vmin = Yrp - DyvNew/2. ; Vmax = Yrp + DyvNew/2. ;
+        // fit view
+        FitAll (Umin, Vmin, Umax, Vmax);
 
-      // fit view
-      FitAll(Umin, Vmin, Umax, Vmax);
+        // ratio 1e+6 often gives calculation error(s), reduce it
+        // if (aRatio < 1e+6) doFit = Standard_False;
+        if (aRatio < 100)
+        {
+          doFit = Standard_False;
+        }
 
-      // ratio 1e+6 often gives calculation error(s), reduce it
-      // if (aRatio < 1e+6) doFit = Standard_False;
-      if (aRatio < 100) doFit = Standard_False;
-      aResult = Standard_True;
+        aResult = Standard_True;
+      }
+      else
+      {
+        doFit = Standard_False;
+      }
     }
-    else doFit = Standard_False;
 
+    if (!aResult)
+    {
+      myCamera->BeginUpdate();
+      myCamera->SetCenter (aCenterBefore);
+      myCamera->SetEye (anEyeBefore);
+      myCamera->EndUpdate();
     }
   }
 
index ff72ecc..fd83fcf 100644 (file)
@@ -17,7 +17,7 @@
 #define NIS_View_HeaderFile
 
 #include <Handle_NIS_InteractiveObject.hxx>
-#include <V3d_OrthographicView.hxx>
+#include <V3d_View.hxx>
 #include <Standard_DefineHandle.hxx>
 #include <NCollection_List.hxx>
 #include <NCollection_Vector.hxx>
@@ -31,7 +31,7 @@ class gp_Ax1;
 /**
  * Manager of a single window with OpenGL context, used by one or more
  * NIS_InteractiveContext instances.
- * This class inherits V3d_OrthograpicView therefore its instances can be used
+ * This class inherits V3d_View therefore its instances can be used
  * to display any object that is normally handled by Graphic3d/V3d/AIS classes.
  * Also the standard view operations: Pan, Rotate, Zoom, mouse API, etc. are
  * supported due to this inheritance.<p>
@@ -53,7 +53,7 @@ class gp_Ax1;
  * AddContext and RemoveContext.
  */
 
-class NIS_View : public V3d_OrthographicView
+class NIS_View : public V3d_View
 {
  public:
   // ---------- PUBLIC METHODS ----------
index 4a80195..07164e5 100755 (executable)
@@ -43,7 +43,6 @@ OpenGl_Workspace_5.cxx
 Handle_OpenGl_View.hxx
 OpenGl_View.hxx
 OpenGl_View.cxx
-OpenGl_View_1.cxx
 OpenGl_View_2.cxx
 OpenGl_Light.hxx
 OpenGl_Trihedron.hxx
@@ -70,8 +69,6 @@ OpenGl_PriorityList.cxx
 OpenGl_AVIWriter.hxx
 OpenGl_AVIWriter.cxx
 OpenGl_tsm.hxx
-OpenGl_telem_view.cxx
-OpenGl_telem_view.hxx
 OpenGl_FrameBuffer.hxx
 OpenGl_FrameBuffer.cxx
 OpenGl_Texture.cxx
index 0ee2026..e813d74 100644 (file)
@@ -100,8 +100,10 @@ OpenGl_Context::OpenGl_Context (const Handle(OpenGl_Caps)& theCaps)
   myMaxClipPlanes (6),
   myGlVerMajor (0),
   myGlVerMinor (0),
-  myIsFeedback (Standard_False),
-  myIsInitialized (Standard_False)
+  myRenderMode (GL_RENDER),
+  myIsInitialized (Standard_False),
+  myIsStereoBuffers (Standard_False),
+  myDrawBuffer (0)
 {
 #if defined(MAC_OS_X_VERSION_10_3) && !defined(MACOSX_USE_GLX)
   // Vendors can not extend functionality on this system
@@ -194,6 +196,103 @@ Standard_Integer OpenGl_Context::MaxClipPlanes() const
 }
 
 // =======================================================================
+// function : SetDrawBufferLeft
+// purpose  :
+// =======================================================================
+void OpenGl_Context::SetDrawBufferLeft()
+{
+  switch (myDrawBuffer)
+  {
+    case GL_BACK_RIGHT :
+    case GL_BACK :
+      glDrawBuffer (GL_BACK_LEFT);
+      myDrawBuffer = GL_BACK_LEFT;
+      break;
+
+    case GL_FRONT_RIGHT :
+    case GL_FRONT :
+      glDrawBuffer (GL_FRONT_LEFT);
+      myDrawBuffer = GL_FRONT_LEFT;
+      break;
+
+    case GL_FRONT_AND_BACK :
+    case GL_RIGHT :
+      glDrawBuffer (GL_LEFT);
+      myDrawBuffer = GL_LEFT;
+      break;
+  }
+}
+
+// =======================================================================
+// function : SetDrawBufferRight
+// purpose  :
+// =======================================================================
+void OpenGl_Context::SetDrawBufferRight()
+{
+  switch (myDrawBuffer)
+  {
+    case GL_BACK_LEFT :
+    case GL_BACK :
+      glDrawBuffer (GL_BACK_RIGHT);
+      myDrawBuffer = GL_BACK_RIGHT;
+      break;
+
+    case GL_FRONT_LEFT :
+    case GL_FRONT :
+      glDrawBuffer (GL_FRONT_RIGHT);
+      myDrawBuffer = GL_FRONT_RIGHT;
+      break;
+
+    case GL_FRONT_AND_BACK :
+    case GL_LEFT :
+      glDrawBuffer (GL_RIGHT);
+      myDrawBuffer = GL_RIGHT;
+      break;
+  }
+}
+
+// =======================================================================
+// function : SetDrawBufferMono
+// purpose  :
+// =======================================================================
+void OpenGl_Context::SetDrawBufferMono()
+{
+  switch (myDrawBuffer)
+  {
+    case GL_BACK_LEFT :
+    case GL_BACK_RIGHT :
+      glDrawBuffer (GL_BACK);
+      myDrawBuffer = GL_BACK;
+      break;
+
+    case GL_FRONT_LEFT :
+    case GL_FRONT_RIGHT :
+      glDrawBuffer (GL_FRONT);
+      myDrawBuffer = GL_FRONT;
+      break;
+
+    case GL_LEFT :
+    case GL_RIGHT :
+      glDrawBuffer (GL_FRONT_AND_BACK);
+      myDrawBuffer = GL_FRONT_AND_BACK;
+      break;
+  }
+}
+
+// =======================================================================
+// function : FetchState
+// purpose  :
+// =======================================================================
+void OpenGl_Context::FetchState()
+{
+  // cache feedback mode state
+  glGetIntegerv (GL_RENDER_MODE, &myRenderMode);
+
+  // cache draw buffer state
+  glGetIntegerv (GL_DRAW_BUFFER, &myDrawBuffer);
+}
+
+// =======================================================================
 // function : Share
 // purpose  :
 // =======================================================================
@@ -658,6 +757,11 @@ void OpenGl_Context::init()
   // get number of maximum clipping planes
   glGetIntegerv (GL_MAX_CLIP_PLANES, &myMaxClipPlanes);
   glGetIntegerv (GL_MAX_TEXTURE_SIZE, &myMaxTexDim);
+
+  GLint aStereo;
+  glGetIntegerv (GL_STEREO, &aStereo);
+  myIsStereoBuffers = aStereo == 1;
+
   if (extAnis)
   {
     glGetIntegerv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &myAnisoMax);
@@ -1003,23 +1107,6 @@ void OpenGl_Context::init()
     core20 = myGlCore20;
   }
 }
-// =======================================================================
-// function : IsFeedback
-// purpose  :
-// =======================================================================
-Standard_Boolean OpenGl_Context::IsFeedback() const
-{
-  return myIsFeedback;
-}
-
-// =======================================================================
-// function : SetFeedback
-// purpose  :
-// =======================================================================
-void OpenGl_Context::SetFeedback (const Standard_Boolean theFeedbackOn)
-{
-  myIsFeedback = theFeedbackOn;
-}
 
 // =======================================================================
 // function : MemoryInfo
index fc44629..3a77465 100644 (file)
@@ -33,6 +33,7 @@
 #include <TCollection_AsciiString.hxx>
 #include <Handle_OpenGl_Context.hxx>
 #include <OpenGl_Clipping.hxx>
+#include <OpenGl_GlCore11.hxx>
 
 //! Forward declarations
 struct OpenGl_GlCore12;
@@ -195,11 +196,17 @@ public:
   //! Swap front/back buffers for this GL context (should be activated before!).
   Standard_EXPORT void SwapBuffers();
 
-  //! Return true if active mode is GL_FEEDBACK (cached state)
-  Standard_EXPORT Standard_Boolean IsFeedback() const;
+  //! Return true if active mode is GL_RENDER (cached state)
+  Standard_Boolean IsRender() const
+  {
+    return myRenderMode == GL_RENDER;
+  }
 
-  //! Setup feedback mode cached state
-  Standard_EXPORT void SetFeedback (const Standard_Boolean theFeedbackOn);
+  //! Return true if active mode is GL_FEEDBACK (cached state)
+  Standard_Boolean IsFeedback() const
+  {
+    return myRenderMode == GL_FEEDBACK;
+  }
 
   //! This function retrieves information from GL about free GPU memory that is:
   //!  - OS-dependent. On some OS it is per-process and on others - for entire system.
@@ -305,6 +312,36 @@ public:
                                     const unsigned int theSeverity,
                                     const TCollection_ExtendedString& theMessage);
 
+
+
+  //! @return true if OpenGl context supports left and
+  //! right rendering buffers.
+  Standard_Boolean HasStereoBuffers() const
+  {
+    return myIsStereoBuffers;
+  }
+
+  //! Switch to left stereographic rendering buffer.
+  //! This method can be used to keep unchanged choise
+  //! of front/back/both buffer rendering.
+  Standard_EXPORT void SetDrawBufferLeft();
+
+  //! Switch to right stereographic rendering buffer.
+  //! This method can be used to keep unchanged choise
+  //! of front/back/both buffer rendering.
+  Standard_EXPORT void SetDrawBufferRight();
+
+  //! Switch to non-stereographic rendering buffer.
+  //! This method can be used to keep unchanged choise
+  //! of front/back/both buffer rendering.
+  Standard_EXPORT void SetDrawBufferMono();
+
+  //! Fetch OpenGl context state. This class tracks value of several OpenGl
+  //! state variables. Consulting the cached values is quicker than
+  //! doing the same via OpenGl API. Call this method if any of the controlled
+  //! OpenGl state variables has a possibility of being out-of-date.
+  Standard_EXPORT void FetchState();
+
 private:
 
   //! Wrapper to system function to retrieve GL function pointer by name.
@@ -370,15 +407,17 @@ private: // context info
 
   OpenGl_Clipping myClippingState; //!< state of clip planes
 
-  void*            myGlLibHandle;   //!< optional handle to GL library
-  OpenGl_GlCore20* myGlCore20;      //!< common structure for GL core functions upto 2.0
-  Standard_Integer myAnisoMax;      //!< maximum level of anisotropy texture filter
-  Standard_Integer myMaxTexDim;     //!< value for GL_MAX_TEXTURE_SIZE
-  Standard_Integer myMaxClipPlanes; //!< value for GL_MAX_CLIP_PLANES
-  Standard_Integer myGlVerMajor;    //!< cached GL version major number
-  Standard_Integer myGlVerMinor;    //!< cached GL version minor number
-  Standard_Boolean myIsFeedback;    //!< flag indicates GL_FEEDBACK mode
-  Standard_Boolean myIsInitialized; //!< flag indicates initialization state
+  void*            myGlLibHandle;     //!< optional handle to GL library
+  OpenGl_GlCore20* myGlCore20;        //!< common structure for GL core functions upto 2.0
+  Standard_Integer myAnisoMax;        //!< maximum level of anisotropy texture filter
+  Standard_Integer myMaxTexDim;       //!< value for GL_MAX_TEXTURE_SIZE
+  Standard_Integer myMaxClipPlanes;   //!< value for GL_MAX_CLIP_PLANES
+  Standard_Integer myGlVerMajor;      //!< cached GL version major number
+  Standard_Integer myGlVerMinor;      //!< cached GL version minor number
+  Standard_Integer myRenderMode;      //!< value for active rendering mode
+  Standard_Boolean myIsInitialized;   //!< flag indicates initialization state
+  Standard_Boolean myIsStereoBuffers; //!< context supports stereo buffering
+  Standard_Integer myDrawBuffer;      //!< current draw buffer.
 
   Handle(OpenGl_ShaderManager) myShaderManager; //! support object for managing shader programs
 
index fa371a2..90a5422 100644 (file)
@@ -50,7 +50,6 @@ OpenGl_Display::OpenGl_Display (const Handle(Aspect_DisplayConnection)& theDispl
   myDBuffer(Standard_True),
   myDither(Standard_True),
   myBackDither(Standard_False),
-  myWalkthrough(Standard_False),
   mySymPerspective(Standard_False),
   myOffsetFactor(1.F),
   myOffsetUnits(0.F),
@@ -138,9 +137,6 @@ void OpenGl_Display::Init()
   if (getenv("CALL_OPENGL_NO_BACKDITHER") != NULL)
     myBackDither = Standard_False;
 
-  if (getenv("CSF_WALKTHROUGH") != NULL)
-    myWalkthrough = Standard_True;
-
   /* OCC18942: Test if symmetric perspective projection should be turned on */
   if (getenv("CSF_SYM_PERSPECTIVE") != NULL)
     mySymPerspective = Standard_True;
index 81dfdd8..11d257f 100644 (file)
@@ -56,7 +56,6 @@ public:
   Standard_Boolean DBuffer () const { return myDBuffer; }
   Standard_Boolean Dither () const { return myDither; }
   Standard_Boolean BackDither () const { return myBackDither; }
-  Standard_Boolean Walkthrough () const { return myWalkthrough; }
   Standard_Boolean SymPerspective() const { return mySymPerspective; }
   Standard_Boolean PolygonOffset (Standard_ShortReal &AFactor, Standard_ShortReal &AUnits) const
   {
@@ -91,7 +90,6 @@ public:
   Standard_Boolean myDBuffer;
   Standard_Boolean myDither;
   Standard_Boolean myBackDither;
-  Standard_Boolean myWalkthrough;
   Standard_Boolean mySymPerspective;
   Standard_ShortReal myOffsetFactor;
   Standard_ShortReal myOffsetUnits;
index 83398bf..254734c 100755 (executable)
@@ -92,7 +92,7 @@ void OpenGl_Flipper::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
                                     { 0.f, 0.f, 1.f, 0.f },
                                     { 0.f, 0.f, 0.f, 1.f } };
 
-      aContext->ShaderManager()->RevertModelWorldStateTo (aModelWorldState);
+      aContext->ShaderManager()->RevertModelWorldStateTo (&aModelWorldState);
     }
     else
     {
@@ -114,8 +114,8 @@ void OpenGl_Flipper::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
       Tmatrix3 aProjection;
       glGetFloatv (GL_PROJECTION_MATRIX, *aProjection);
 
-      aContext->ShaderManager()->UpdateWorldViewStateTo (aWorldView);
-      aContext->ShaderManager()->UpdateProjectionStateTo (aProjection);
+      aContext->ShaderManager()->UpdateWorldViewStateTo (&aWorldView);
+      aContext->ShaderManager()->UpdateProjectionStateTo (&aProjection);
     }
 
     if (aCurrMode != GL_MODELVIEW)
index 15ff6b4..aad3980 100644 (file)
@@ -106,7 +106,6 @@ public:
   Standard_EXPORT void End ();
 
   Standard_EXPORT Standard_Integer InquireLightLimit ();
-  Standard_EXPORT void InquireMat (const Graphic3d_CView& ACView, TColStd_Array2OfReal& AMatO, TColStd_Array2OfReal& AMatM);
   Standard_EXPORT Standard_Integer InquireViewLimit ();
   Standard_EXPORT void Blink (const Graphic3d_CStructure& ACStructure,const Standard_Boolean Create);
   Standard_EXPORT void BoundaryBox (const Graphic3d_CStructure& ACStructure, const Standard_Boolean Create);
@@ -155,22 +154,18 @@ public:
   Standard_EXPORT void ClipLimit (const Graphic3d_CView& ACView, const Standard_Boolean AWait);
   Standard_EXPORT void DeactivateView (const Graphic3d_CView& ACView);
   Standard_EXPORT void DepthCueing (const Graphic3d_CView& ACView, const Standard_Boolean AFlag);
-  Standard_EXPORT Standard_Boolean ProjectRaster (const Graphic3d_CView& ACView, const Standard_ShortReal AX, const Standard_ShortReal AY, const Standard_ShortReal AZ, Standard_Integer& AU, Standard_Integer& AV);
-  Standard_EXPORT Standard_Boolean UnProjectRaster (const Graphic3d_CView& ACView, const Standard_Integer Axm, const Standard_Integer Aym, const Standard_Integer AXM, const Standard_Integer AYM, const Standard_Integer AU, const Standard_Integer AV, Standard_ShortReal& AX, Standard_ShortReal& AY, Standard_ShortReal& AZ);
-  Standard_EXPORT Standard_Boolean UnProjectRasterWithRay (const Graphic3d_CView& ACView, const Standard_Integer Axm, const Standard_Integer Aym, const Standard_Integer AXM, const Standard_Integer AYM, const Standard_Integer AU, const Standard_Integer AV, Standard_ShortReal& AX, Standard_ShortReal& AY, Standard_ShortReal& AZ, Standard_ShortReal& DX, Standard_ShortReal& DY, Standard_ShortReal& DZ);
   Standard_EXPORT void RatioWindow (const Graphic3d_CView& ACView);
   Standard_EXPORT void Redraw (const Graphic3d_CView& ACView, const Aspect_CLayer2d& ACUnderLayer, const Aspect_CLayer2d& ACOverLayer, const Standard_Integer x = 0, const Standard_Integer y = 0, const Standard_Integer width = 0, const Standard_Integer height = 0);
   Standard_EXPORT void RemoveView (const Graphic3d_CView& ACView);
   Standard_EXPORT void SetLight (const Graphic3d_CView& ACView);
   Standard_EXPORT void SetClipPlanes (const Graphic3d_CView& theCView);
   Standard_EXPORT void SetClipPlanes (const Graphic3d_CStructure& theCStructure);
+  Standard_EXPORT void SetCamera (const Graphic3d_CView& theCView);
   Standard_EXPORT void SetVisualisation (const Graphic3d_CView& ACView);
   Standard_EXPORT void TransformStructure (const Graphic3d_CStructure& ACStructure);
   Standard_EXPORT void Transparency (const Graphic3d_CView& ACView, const Standard_Boolean AFlag);
   Standard_EXPORT void Update (const Graphic3d_CView& ACView, const Aspect_CLayer2d& ACUnderLayer, const Aspect_CLayer2d& ACOverLayer);
   Standard_EXPORT Standard_Boolean View (Graphic3d_CView& ACView);
-  Standard_EXPORT void ViewMapping (const Graphic3d_CView& ACView, const Standard_Boolean AWait);
-  Standard_EXPORT void ViewOrientation (const Graphic3d_CView& ACView,const Standard_Boolean AWait);
   Standard_EXPORT void Environment (const Graphic3d_CView& ACView);
   Standard_EXPORT void SetStencilTestOptions (const Graphic3d_CGroup& theCGroup, const Standard_Boolean theIsEnabled);
   Standard_EXPORT void Text (const Graphic3d_CGroup& ACGroup, const Standard_CString AText, const Graphic3d_Vertex& APoint, const Standard_Real AHeight, const Quantity_PlaneAngle AAngle, const Graphic3d_TextPath ATp, const Graphic3d_HorizontalTextAlignment AHta, const Graphic3d_VerticalTextAlignment AVta, const Standard_Boolean EvalMinMax = Standard_True);
index cab2177..2282a88 100644 (file)
@@ -25,13 +25,6 @@ Standard_Integer OpenGl_GraphicDriver::InquireLightLimit ()
   return (myGlDisplay.IsNull() ? 0 : myGlDisplay->Facilities().MaxLights);
 }
 
-void OpenGl_GraphicDriver::InquireMat (const Graphic3d_CView& ACView, TColStd_Array2OfReal& AMatO, TColStd_Array2OfReal& AMatM)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-    aCView->View->GetMatrices(AMatO,AMatM,ACView.Orientation.IsCustomMatrix);
-}
-
 Standard_Integer OpenGl_GraphicDriver::InquireViewLimit ()
 {
   return (myGlDisplay.IsNull() ? 0 : myGlDisplay->Facilities().MaxViews);
index 5ae09a1..2cab764 100644 (file)
@@ -135,54 +135,6 @@ void OpenGl_GraphicDriver::DepthCueing (const Graphic3d_CView& ACView, const Sta
     aCView->View->SetFog(ACView, AFlag);
 }
 
-Standard_Boolean OpenGl_GraphicDriver::ProjectRaster (const Graphic3d_CView& ACView, const Standard_ShortReal AX, const Standard_ShortReal AY, const Standard_ShortReal AZ, Standard_Integer& AU, Standard_Integer& AV)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (!aCView)
-    return Standard_False;
-
-  Standard_Integer aWidth = aCView->WS->Width();
-  Standard_Integer aHeight = aCView->WS->Height();
-  Standard_ShortReal xr, yr;
-  if (aCView->View->ProjectObjectToRaster(aWidth, aHeight, AX, AY, AZ, xr, yr))
-  {
-    AU = (Standard_Integer) xr;
-    AV = aHeight - (Standard_Integer) yr;
-    return Standard_True;
-  }
-
-  return Standard_False;
-}
-
-Standard_Boolean OpenGl_GraphicDriver::UnProjectRaster (const Graphic3d_CView& ACView, const Standard_Integer /*Axm*/, const Standard_Integer Aym, const Standard_Integer /*AXM*/, const Standard_Integer AYM, const Standard_Integer AU, const Standard_Integer AV, Standard_ShortReal& Ax, Standard_ShortReal& Ay, Standard_ShortReal& Az)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (!aCView)
-    return Standard_False;
-
-  const Standard_Integer aWidth = aCView->WS->Width();
-  const Standard_Integer aHeight = aCView->WS->Height();
-
-  /*
-  Patched by P.Dolbey: the window pixel height decreased by one
-  in order for yr to remain within valid coordinate range [0; Ym -1]
-  where Ym means window pixel height.
-  */
-  return aCView->View->ProjectRasterToObject( aWidth, aHeight, AU, (AYM-1)-Aym-AV, Ax, Ay, Az );
-}
-
-Standard_Boolean OpenGl_GraphicDriver::UnProjectRasterWithRay (const Graphic3d_CView& ACView, const Standard_Integer /*Axm*/, const Standard_Integer Aym, const Standard_Integer /*AXM*/, const Standard_Integer AYM, const Standard_Integer AU, const Standard_Integer AV, Standard_ShortReal& Ax, Standard_ShortReal& Ay, Standard_ShortReal& Az, Standard_ShortReal& Dx, Standard_ShortReal& Dy, Standard_ShortReal& Dz)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (!aCView)
-    return Standard_False;
-
-  const Standard_Integer aWidth = aCView->WS->Width();
-  const Standard_Integer aHeight = aCView->WS->Height();
-
-  return aCView->View->ProjectRasterToObjectWithRay( aWidth, aHeight, AU, AYM-Aym-AV, Ax, Ay, Az, Dx, Dy, Dz );
-}
-
 void OpenGl_GraphicDriver::RatioWindow (const Graphic3d_CView& theCView)
 {
   const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
@@ -514,6 +466,19 @@ void OpenGl_GraphicDriver::SetClipPlanes (const Graphic3d_CStructure& theCStruct
   }
 }
 
+//=======================================================================
+//function : SetCamera
+//purpose  :
+//=======================================================================
+void OpenGl_GraphicDriver::SetCamera (const Graphic3d_CView& theCView)
+{
+  const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
+  if (aCView)
+  {
+    aCView->View->SetCamera (theCView.Context.Camera);
+  }
+}
+
 void OpenGl_GraphicDriver::SetVisualisation (const Graphic3d_CView& ACView)
 {
   const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
@@ -568,32 +533,6 @@ Standard_Boolean OpenGl_GraphicDriver::View (Graphic3d_CView& theCView)
   return Standard_True;
 }
 
-void OpenGl_GraphicDriver::ViewMapping (const Graphic3d_CView& ACView, const Standard_Boolean AWait)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-  {
-    aCView->View->SetMapping (myGlDisplay, ACView);
-    if (!AWait)
-    {
-      aCView->WS->Resize(ACView.DefWindow);
-    }
-  }
-}
-
-void OpenGl_GraphicDriver::ViewOrientation (const Graphic3d_CView& ACView, const Standard_Boolean AWait)
-{
-  const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
-  if (aCView)
-  {
-    aCView->View->SetOrientation(ACView);
-    if (!AWait)
-    {
-      aCView->WS->Resize(ACView.DefWindow);
-    }
-  }
-}
-
 void OpenGl_GraphicDriver::SetBackFacingModel (const Graphic3d_CView& ACView)
 {
   const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
index 25218df..d155c00 100755 (executable)
@@ -154,7 +154,7 @@ void OpenGl_ShaderManager::UpdateLightSourceStateTo (const OpenGl_ListOfLight* t
 // function : SetProjectionState
 // purpose  : Sets new state of OCCT projection transform
 // =======================================================================
-void OpenGl_ShaderManager::UpdateProjectionStateTo (const Tmatrix3& theProjectionMatrix)
+void OpenGl_ShaderManager::UpdateProjectionStateTo (const Tmatrix3* theProjectionMatrix)
 {
   myProjectionState.Set (theProjectionMatrix);
   myProjectionState.Update();
@@ -164,7 +164,7 @@ void OpenGl_ShaderManager::UpdateProjectionStateTo (const Tmatrix3& theProjectio
 // function : SetModelWorldState
 // purpose  : Sets new state of OCCT model-world transform
 // =======================================================================
-void OpenGl_ShaderManager::UpdateModelWorldStateTo (const Tmatrix3& theModelWorldMatrix)
+void OpenGl_ShaderManager::UpdateModelWorldStateTo (const Tmatrix3* theModelWorldMatrix)
 {
   myModelWorldState.Set (theModelWorldMatrix);
   myModelWorldState.Update();
@@ -174,7 +174,7 @@ void OpenGl_ShaderManager::UpdateModelWorldStateTo (const Tmatrix3& theModelWorl
 // function : SetWorldViewState
 // purpose  : Sets new state of OCCT world-view transform
 // =======================================================================
-void OpenGl_ShaderManager::UpdateWorldViewStateTo (const Tmatrix3& theWorldViewMatrix)
+void OpenGl_ShaderManager::UpdateWorldViewStateTo (const Tmatrix3* theWorldViewMatrix)
 {
   myWorldViewState.Set (theWorldViewMatrix);
   myWorldViewState.Update();
@@ -184,7 +184,7 @@ void OpenGl_ShaderManager::UpdateWorldViewStateTo (const Tmatrix3& theWorldViewM
 // function : RevertProjectionStateTo
 // purpose  : Reverts state of OCCT projection transform
 // =======================================================================
-void OpenGl_ShaderManager::RevertProjectionStateTo (const Tmatrix3& theProjectionMatrix)
+void OpenGl_ShaderManager::RevertProjectionStateTo (const Tmatrix3* theProjectionMatrix)
 {
   myProjectionState.Set (theProjectionMatrix);
   myProjectionState.Revert();
@@ -194,7 +194,7 @@ void OpenGl_ShaderManager::RevertProjectionStateTo (const Tmatrix3& theProjectio
 // function : RevertModelWorldStateTo
 // purpose  : Reverts state of OCCT model-world transform
 // =======================================================================
-void OpenGl_ShaderManager::RevertModelWorldStateTo (const Tmatrix3& theModelWorldMatrix)
+void OpenGl_ShaderManager::RevertModelWorldStateTo (const Tmatrix3* theModelWorldMatrix)
 {
   myModelWorldState.Set (theModelWorldMatrix);
   myModelWorldState.Revert();
@@ -204,7 +204,7 @@ void OpenGl_ShaderManager::RevertModelWorldStateTo (const Tmatrix3& theModelWorl
 // function : RevertWorldViewStateTo
 // purpose  : Reverts state of OCCT world-view transform
 // =======================================================================
-void OpenGl_ShaderManager::RevertWorldViewStateTo (const Tmatrix3& theWorldViewMatrix)
+void OpenGl_ShaderManager::RevertWorldViewStateTo (const Tmatrix3* theWorldViewMatrix)
 {
   myWorldViewState.Set (theWorldViewMatrix);
   myWorldViewState.Revert();
index 0e494eb..b616e92 100755 (executable)
@@ -90,10 +90,10 @@ public:
   Standard_EXPORT const OpenGl_ProjectionState& ProjectionState() const;
 
   //! Updates state of OCCT projection transform.
-  Standard_EXPORT void UpdateProjectionStateTo (const Tmatrix3& theProjectionMatrix);
+  Standard_EXPORT void UpdateProjectionStateTo (const Tmatrix3* theProjectionMatrix);
 
   //! Reverts state of OCCT projection transform.
-  Standard_EXPORT void RevertProjectionStateTo (const Tmatrix3& theProjectionMatrix);
+  Standard_EXPORT void RevertProjectionStateTo (const Tmatrix3* theProjectionMatrix);
 
   //! Pushes current state of OCCT projection transform to specified program.
   Standard_EXPORT void PushProjectionState (const Handle(OpenGl_ShaderProgram)& theProgram) const;
@@ -104,10 +104,10 @@ public:
   Standard_EXPORT const OpenGl_ModelWorldState& ModelWorldState() const;
 
   //! Updates state of OCCT model-world transform.
-  Standard_EXPORT void UpdateModelWorldStateTo (const Tmatrix3& theModelWorldMatrix);
+  Standard_EXPORT void UpdateModelWorldStateTo (const Tmatrix3* theModelWorldMatrix);
 
   //! Reverts state of OCCT model-world transform.
-  Standard_EXPORT void RevertModelWorldStateTo (const Tmatrix3& theModelWorldMatrix);
+  Standard_EXPORT void RevertModelWorldStateTo (const Tmatrix3* theModelWorldMatrix);
 
   //! Pushes current state of OCCT model-world transform to specified program.
   Standard_EXPORT void PushModelWorldState (const Handle(OpenGl_ShaderProgram)& theProgram) const;
@@ -118,10 +118,10 @@ public:
   Standard_EXPORT const OpenGl_WorldViewState& WorldViewState() const;
 
   //! Updates state of OCCT world-view transform.
-  Standard_EXPORT void UpdateWorldViewStateTo (const Tmatrix3& theWorldViewMatrix);
+  Standard_EXPORT void UpdateWorldViewStateTo (const Tmatrix3* theWorldViewMatrix);
 
   //! Reverts state of OCCT world-view transform.
-  Standard_EXPORT void RevertWorldViewStateTo (const Tmatrix3& theWorldViewMatrix);
+  Standard_EXPORT void RevertWorldViewStateTo (const Tmatrix3* theWorldViewMatrix);
 
   //! Pushes current state of OCCT world-view transform to specified program.
   Standard_EXPORT void PushWorldViewState (const Handle(OpenGl_ShaderProgram)& theProgram) const;
index bb8e942..db37666 100755 (executable)
@@ -71,7 +71,7 @@ OpenGl_ProjectionState::OpenGl_ProjectionState()
 // function : Set
 // purpose  : Sets new OCCT projection state
 // =======================================================================
-void OpenGl_ProjectionState::Set (const Tmatrix3& theProjectionMatrix)
+void OpenGl_ProjectionState::Set (const Tmatrix3* theProjectionMatrix)
 {
   memcpy (myProjectionMatrix, theProjectionMatrix, sizeof (Tmatrix3));
   myInverseNeedUpdate = true;
@@ -116,7 +116,7 @@ OpenGl_ModelWorldState::OpenGl_ModelWorldState()
 // function : Set
 // purpose  : Sets new model-world matrix
 // =======================================================================
-void OpenGl_ModelWorldState::Set (const Tmatrix3& theModelWorldMatrix)
+void OpenGl_ModelWorldState::Set (const Tmatrix3* theModelWorldMatrix)
 {
   memcpy (myModelWorldMatrix, theModelWorldMatrix, sizeof (Tmatrix3));
   myInverseNeedUpdate = true;
@@ -161,7 +161,7 @@ OpenGl_WorldViewState::OpenGl_WorldViewState()
 // function : Set
 // purpose  : Sets new world-view matrix
 // =======================================================================
-void OpenGl_WorldViewState::Set (const Tmatrix3& theWorldViewMatrix)
+void OpenGl_WorldViewState::Set (const Tmatrix3* theWorldViewMatrix)
 {
   memcpy (myWorldViewMatrix, theWorldViewMatrix, sizeof (Tmatrix3));
   myInverseNeedUpdate = true;
index ae4bb1b..59a3616 100755 (executable)
@@ -53,7 +53,7 @@ public:
   OpenGl_ProjectionState();
 
   //! Sets new projection matrix.
-  void Set (const Tmatrix3& theProjectionMatrix);
+  void Set (const Tmatrix3* theProjectionMatrix);
 
   //! Returns current projection matrix.
   const Tmatrix3& ProjectionMatrix() const;
@@ -78,7 +78,7 @@ public:
   OpenGl_ModelWorldState();
 
   //! Sets new model-world matrix.
-  void Set (const Tmatrix3& theModelWorldMatrix);
+  void Set (const Tmatrix3* theModelWorldMatrix);
 
   //! Returns current model-world matrix.
   const Tmatrix3& ModelWorldMatrix() const;
@@ -103,7 +103,7 @@ public:
   OpenGl_WorldViewState();
   
   //! Sets new world-view matrix.
-  void Set (const Tmatrix3& theWorldViewMatrix);
+  void Set (const Tmatrix3* theWorldViewMatrix);
 
   //! Returns current world-view matrix.
   const Tmatrix3& WorldViewMatrix() const;
index d1027b1..b675cb3 100644 (file)
@@ -617,9 +617,9 @@ void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
         Tmatrix3 aProjection;
         glGetFloatv (GL_PROJECTION_MATRIX, *aProjection);
 
-        aCtx->ShaderManager()->UpdateModelWorldStateTo (aModelWorld);
-        aCtx->ShaderManager()->UpdateWorldViewStateTo (aWorldView);
-        aCtx->ShaderManager()->UpdateProjectionStateTo (aProjection);
+        aCtx->ShaderManager()->UpdateModelWorldStateTo (&aModelWorld);
+        aCtx->ShaderManager()->UpdateWorldViewStateTo (&aWorldView);
+        aCtx->ShaderManager()->UpdateProjectionStateTo (&aProjection);
       }
 
       glMatrixMode (GL_MODELVIEW);
@@ -767,7 +767,7 @@ void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
                                     { 0.f, 0.f, 1.f, 0.f },
                                     { 0.f, 0.f, 0.f, 1.f } };
 
-      aContext->ShaderManager()->RevertModelWorldStateTo (aModelWorldState);
+      aContext->ShaderManager()->RevertModelWorldStateTo (&aModelWorldState);
     }
     else
     {
index ea25d1c..553d2f6 100644 (file)
@@ -110,9 +110,26 @@ void OpenGl_Trihedron::redraw (const Handle(OpenGl_Workspace)& theWorkspace) con
   modelMatrix[3][0] = 0.;
   modelMatrix[3][1] = 0.;
   modelMatrix[3][2] = 0.;
-  projMatrix[3][0] = 0.;
-  projMatrix[3][1] = 0.;
-  projMatrix[3][2] = 0.;
+
+  projMatrix[0][0] = 2.0 / U;
+  projMatrix[0][1] = 0.0;
+  projMatrix[0][2] = 0.0;
+  projMatrix[0][3] = 0.0;
+
+  projMatrix[1][0] = 0.0;
+  projMatrix[1][1] = 2.0 / V;
+  projMatrix[1][2] = 0.0;
+  projMatrix[1][3] = 0.0;
+
+  projMatrix[2][0] = 0.0;
+  projMatrix[2][1] = 0.0;
+  projMatrix[2][2] = -2.0 * 1e-7;
+  projMatrix[2][3] = 0.0;
+
+  projMatrix[3][0] = 0.0;
+  projMatrix[3][1] = 0.0;
+  projMatrix[3][2] = 0.0;
+  projMatrix[3][3] = 1.0;
 
   /* sauvegarde du contexte des matrices avant chargement */
   glMatrixMode (GL_MODELVIEW);
@@ -303,9 +320,26 @@ void OpenGl_Trihedron::redrawZBuffer (const Handle(OpenGl_Workspace)& theWorkspa
     modelMatrix[3][0] = 0.;
     modelMatrix[3][1] = 0.;
     modelMatrix[3][2] = 0.;
-    projMatrix[3][0] = 0.;
-    projMatrix[3][1] = 0.;
-    projMatrix[3][2] = 0.;
+
+    projMatrix[0][0] = 2.0 / U;
+    projMatrix[0][1] = 0.0;
+    projMatrix[0][2] = 0.0;
+    projMatrix[0][3] = 0.0;
+
+    projMatrix[1][0] = 0.0;
+    projMatrix[1][1] = 2.0 / V;
+    projMatrix[1][2] = 0.0;
+    projMatrix[1][3] = 0.0;
+
+    projMatrix[2][0] = 0.0;
+    projMatrix[2][1] = 0.0;
+    projMatrix[2][2] = -2.0 * 1e-7;
+    projMatrix[2][3] = 0.0;
+
+    projMatrix[3][0] = 0.0;
+    projMatrix[3][1] = 0.0;
+    projMatrix[3][2] = 0.0;
+    projMatrix[3][3] = 1.0;
 
     /* save matrix */
     glMatrixMode (GL_MODELVIEW);
index 93f83ee..0291ea4 100644 (file)
@@ -42,34 +42,6 @@ static const OPENGL_BG_TEXTURE myDefaultBgTexture = { 0, 0, 0, Aspect_FM_CENTERE
 static const OPENGL_BG_GRADIENT myDefaultBgGradient = { {{ 0.F, 0.F, 0.F, 1.F }}, {{ 0.F, 0.F, 0.F, 1.F }}, Aspect_GFM_NONE };
 static const Tmatrix3 myDefaultMatrix = { { 1.F, 0.F, 0.F, 0.F }, { 0.F, 1.F, 0.F, 0.F }, { 0.F, 0.F, 1.F, 0.F }, { 0.F, 0.F, 0.F, 1.F } };
 static const OPENGL_ZCLIP myDefaultZClip = { { Standard_True, 0.F }, { Standard_True, 1.F } };
-static const OPENGL_EXTRA_REP myDefaultExtra =
-{
-  //vrp
-  { 0.F, 0.F, 0.F },
-  //vpn
-  { 0.F, 0.F, 1.F },
-  //vup
-  { 0.F, 1.F, 0.F },
-  //map
-  {
-    //window
-    { 0.F, 0.F, 1.F, 1.F },
-    //viewport
-    { 0.F, 0.F, 0.F, 1.F, 1.F, 1.F },
-    //proj
-    TelParallel,
-    //prp
-    { 0.F, 0.F, 0.F },
-    //vpd
-    0.F,
-    //fpd
-    0.F,
-    //bpd
-    -1.F
-  },
-  //scaleFactors
-  { 1.F, 1.F, 1.F }
-};
 
 static const OPENGL_FOG myDefaultFog = { Standard_False, 0.F, 1.F, { { 0.F, 0.F, 0.F, 1.F } } };
 static const TEL_TRANSFORM_PERSISTENCE myDefaultTransPers = { 0, 0.F, 0.F, 0.F };
@@ -89,15 +61,13 @@ OpenGl_View::OpenGl_View (const CALL_DEF_VIEWCONTEXT &AContext,
   myBackfacing(0),
   myBgTexture(myDefaultBgTexture),
   myBgGradient(myDefaultBgGradient),
-  //myOrientationMatrix(myDefaultMatrix),
-  //myMappingMatrix(myDefaultMatrix),
   //shield_indicator = TOn,
   //shield_colour = { { 0.F, 0.F, 0.F, 1.F } },
   //border_indicator = TOff,
   //border_colour = { { 0.F, 0.F, 0.F, 1.F } },
   //active_status = TOn,
   myZClip(myDefaultZClip),
-  myExtra(myDefaultExtra),
+  myCamera(AContext.Camera),
   myFog(myDefaultFog),
   myTrihedron(NULL),
   myGraduatedTrihedron(NULL),
@@ -106,14 +76,11 @@ OpenGl_View::OpenGl_View (const CALL_DEF_VIEWCONTEXT &AContext,
   myAntiAliasing(Standard_False),
   myTransPers(&myDefaultTransPers),
   myIsTransPers(Standard_False),
+  myProjectionState (0),
+  myModelViewState (0),
   myStateCounter (theCounter),
-  myLastOrientationState (0, 0),
-  myLastViewMappingState (0, 0),
   myLastLightSourceState (0, 0)
 {
-  // Initialize matrices
-  memcpy(myOrientationMatrix,myDefaultMatrix,sizeof(Tmatrix3));
-  memcpy(myMappingMatrix,myDefaultMatrix,sizeof(Tmatrix3));
 
   // Shading method
   switch (AContext.Model)
@@ -127,8 +94,6 @@ OpenGl_View::OpenGl_View (const CALL_DEF_VIEWCONTEXT &AContext,
       break;
   }
 
-  myCurrOrientationState = myStateCounter->Increment(); // <-- delete after merge with camera
-  myCurrViewMappingState = myStateCounter->Increment(); // <-- delete after merge with camera
   myCurrLightSourceState = myStateCounter->Increment();
 
 #ifdef HAVE_OPENCL
@@ -240,21 +205,8 @@ void OpenGl_View::SetVisualisation (const CALL_DEF_VIEWCONTEXT &AContext)
 //call_togl_cliplimit
 void OpenGl_View::SetClipLimit (const Graphic3d_CView& theCView)
 {
-  myZClip.Back.Limit =
-    (theCView.Context.ZClipBackPlane     - theCView.Mapping.BackPlaneDistance) /
-    (theCView.Mapping.FrontPlaneDistance - theCView.Mapping.BackPlaneDistance);
-  myZClip.Front.Limit =
-    (theCView.Context.ZClipFrontPlane    - theCView.Mapping.BackPlaneDistance) /
-    (theCView.Mapping.FrontPlaneDistance - theCView.Mapping.BackPlaneDistance);
-  if (myZClip.Back.Limit < 0.0f)
-    myZClip.Back.Limit = 0.0f;
-  if (myZClip.Front.Limit > 1.0f)
-    myZClip.Front.Limit = 1.0f;
-  if (myZClip.Back.Limit > myZClip.Front.Limit)
-  {
-    myZClip.Back.Limit  = 0.0f;
-    myZClip.Front.Limit = 1.0f;
-  }
+  myZClip.Back.Limit = theCView.Context.ZClipBackPlane;
+  myZClip.Front.Limit = theCView.Context.ZClipFrontPlane;
 
   myZClip.Back.IsOn  = (theCView.Context.BackZClipping  != 0);
   myZClip.Front.IsOn = (theCView.Context.FrontZClipping != 0);
@@ -262,138 +214,6 @@ void OpenGl_View::SetClipLimit (const Graphic3d_CView& theCView)
 
 /*----------------------------------------------------------------------*/
 
-//call_togl_viewmapping
-void OpenGl_View::SetMapping (const Handle(OpenGl_Display)& theGlDisplay,
-                              const Graphic3d_CView&        theCView)
-{
-  const float ratio   = theCView.DefWindow.dy / theCView.DefWindow.dx;
-  const float r_ratio = theCView.DefWindow.dx / theCView.DefWindow.dy;
-
-  TEL_VIEW_MAPPING Map;
-
-  Map.window.xmin = theCView.Mapping.WindowLimit.um;
-  Map.window.ymin = theCView.Mapping.WindowLimit.vm;
-  Map.window.xmax = theCView.Mapping.WindowLimit.uM;
-  Map.window.ymax = theCView.Mapping.WindowLimit.vM;
-
-  Map.viewport.xmin = 0.F;
-  Map.viewport.xmax = ( 1.F < r_ratio ? 1.F : r_ratio );
-  Map.viewport.ymin = 0.F;
-  Map.viewport.ymax = ( 1.F < ratio ? 1.F : ratio );
-  Map.viewport.zmin = 0.F;
-  Map.viewport.zmax = 1.F;
-
-  // projection type
-  switch (theCView.Mapping.Projection)
-  {
-    case 0 :
-      Map.proj = TelPerspective;
-      break;
-    case 1 :
-      Map.proj = TelParallel;
-      break;
-  }
-
-  // projection reference point
-  Map.prp[0] = theCView.Mapping.ProjectionReferencePoint.x;
-  Map.prp[1] = theCView.Mapping.ProjectionReferencePoint.y;
-  Map.prp[2] = theCView.Mapping.ProjectionReferencePoint.z;
-  if (!theGlDisplay.IsNull() && !theGlDisplay->Walkthrough())
-    Map.prp[2] += theCView.Mapping.FrontPlaneDistance;
-
-  // view plane distance
-  Map.vpd = theCView.Mapping.ViewPlaneDistance;
-
-  // back plane distance
-  Map.bpd = theCView.Mapping.BackPlaneDistance;
-
-  // front plane distance
-  Map.fpd = theCView.Mapping.FrontPlaneDistance;
-
-  Tint err_ind = 0;
-
-  // use user-defined matrix
-  if (theCView.Mapping.IsCustomMatrix)
-  {
-    int i, j;
-    for( i = 0; i < 4; i++ )
-      for( j = 0; j < 4; j++ )
-        myMappingMatrix[i][j] = theCView.Mapping.ProjectionMatrix[i][j];
-  }
-  else
-    TelEvalViewMappingMatrix (theGlDisplay, &Map, &err_ind, myMappingMatrix);
-
-  if (!err_ind)
-    myExtra.map = Map;
-
-  myCurrViewMappingState = myStateCounter->Increment();
-}
-
-/*----------------------------------------------------------------------*/
-
-//call_togl_vieworientation
-void OpenGl_View::SetOrientation (const Graphic3d_CView& theCView)
-{
-  Tfloat Vrp[3];
-  Tfloat Vpn[3];
-  Tfloat Vup[3];
-  Tfloat ScaleFactors[3];
-
-  Vrp[0] = theCView.Orientation.ViewReferencePoint.x;
-  Vrp[1] = theCView.Orientation.ViewReferencePoint.y;
-  Vrp[2] = theCView.Orientation.ViewReferencePoint.z;
-
-  Vpn[0] = theCView.Orientation.ViewReferencePlane.x;
-  Vpn[1] = theCView.Orientation.ViewReferencePlane.y;
-  Vpn[2] = theCView.Orientation.ViewReferencePlane.z;
-
-  Vup[0] = theCView.Orientation.ViewReferenceUp.x;
-  Vup[1] = theCView.Orientation.ViewReferenceUp.y;
-  Vup[2] = theCView.Orientation.ViewReferenceUp.z;
-
-  ScaleFactors[0] = theCView.Orientation.ViewScaleX;
-  ScaleFactors[1] = theCView.Orientation.ViewScaleY;
-  ScaleFactors[2] = theCView.Orientation.ViewScaleZ;
-
-  Tint err_ind = 0;
-
-  // use user-defined matrix
-  if (theCView.Orientation.IsCustomMatrix)
-  {
-    int i, j;
-    for( i = 0; i < 4; i++ )
-      for( j = 0; j < 4; j++ )
-        myOrientationMatrix[i][j] = theCView.Orientation.ModelViewMatrix[i][j];
-  }
-  else
-  {
-    TelEvalViewOrientationMatrix (Vrp, Vpn, Vup, ScaleFactors, &err_ind, myOrientationMatrix);
-  }
-
-  if (!err_ind)
-  {
-    myExtra.vrp[0] = Vrp[0];
-    myExtra.vrp[1] = Vrp[1];
-    myExtra.vrp[2] = Vrp[2];
-
-    myExtra.vpn[0] = Vpn[0];
-    myExtra.vpn[1] = Vpn[1];
-    myExtra.vpn[2] = Vpn[2];
-
-    myExtra.vup[0] = Vup[0];
-    myExtra.vup[1] = Vup[1];
-    myExtra.vup[2] = Vup[2];
-
-    myExtra.scaleFactors[0] = ScaleFactors[0],
-    myExtra.scaleFactors[1] = ScaleFactors[1],
-    myExtra.scaleFactors[2] = ScaleFactors[2];
-  }
-
-  myCurrOrientationState = myStateCounter->Increment();
-}
-
-/*----------------------------------------------------------------------*/
-
 void OpenGl_View::SetFog (const Graphic3d_CView& theCView,
                           const Standard_Boolean theFlag)
 {
@@ -405,29 +225,8 @@ void OpenGl_View::SetFog (const Graphic3d_CView& theCView,
   {
     myFog.IsOn = Standard_True;
 
-    myFog.Front =
-      (theCView.Context.DepthFrontPlane    - theCView.Mapping.BackPlaneDistance) /
-      (theCView.Mapping.FrontPlaneDistance - theCView.Mapping.BackPlaneDistance);
-
-    myFog.Back =
-      (theCView.Context.DepthBackPlane     - theCView.Mapping.BackPlaneDistance) /
-      (theCView.Mapping.FrontPlaneDistance - theCView.Mapping.BackPlaneDistance);
-
-    if (myFog.Front < 0.F)
-      myFog.Front = 0.F;
-    else if (myFog.Front > 1.F)
-      myFog.Front = 1.F;
-
-    if (myFog.Back < 0.F)
-      myFog.Back = 0.F;
-    else if (myFog.Back > 1.F)
-      myFog.Back = 1.F;
-
-    if (myFog.Back > myFog.Front)
-    {
-      myFog.Front = 1.F;
-      myFog.Back = 0.F;
-    }
+    myFog.Front = theCView.Context.DepthFrontPlane;
+    myFog.Back = theCView.Context.DepthBackPlane;
 
     myFog.Color.rgb[0] = theCView.DefWindow.Background.r;
     myFog.Color.rgb[1] = theCView.DefWindow.Background.g;
@@ -495,8 +294,8 @@ void OpenGl_View::EndTransformPersistence(const Handle(OpenGl_Context)& theCtx)
     glGetFloatv (GL_PROJECTION_MATRIX, *aResultProjection);
 
     // Set OCCT state uniform variables
-    theCtx->ShaderManager()->RevertWorldViewStateTo (aResultWorldView);
-    theCtx->ShaderManager()->RevertProjectionStateTo (aResultProjection);
+    theCtx->ShaderManager()->RevertWorldViewStateTo (&aResultWorldView);
+    theCtx->ShaderManager()->RevertProjectionStateTo (&aResultProjection);
   }
 }
 
@@ -581,9 +380,10 @@ const TEL_TRANSFORM_PERSISTENCE* OpenGl_View::BeginTransformPersistence (const H
   // prevent scaling-on-axis
   if (theTransPers->mode & TPF_ZOOM)
   {
-    const double aScaleX = myExtra.scaleFactors[0];
-    const double aScaleY = myExtra.scaleFactors[1];
-    const double aScaleZ = myExtra.scaleFactors[2];
+    const gp_Pnt anAxialScale = myCamera->AxialScale();
+    const double aScaleX = anAxialScale.X();
+    const double aScaleY = anAxialScale.Y();
+    const double aScaleZ = anAxialScale.Z();
     for (int i = 0; i < 3; ++i)
     {
       aModelMatrix[0][i] /= aScaleX;
@@ -659,8 +459,28 @@ const TEL_TRANSFORM_PERSISTENCE* OpenGl_View::BeginTransformPersistence (const H
   glGetFloatv (GL_PROJECTION_MATRIX, *aResultProjection);
 
   // Set OCCT state uniform variables
-  theCtx->ShaderManager()->UpdateWorldViewStateTo (aResultWorldView);
-  theCtx->ShaderManager()->UpdateProjectionStateTo (aResultProjection);
+  theCtx->ShaderManager()->UpdateWorldViewStateTo (&aResultWorldView);
+  theCtx->ShaderManager()->UpdateProjectionStateTo (&aResultProjection);
 
   return aTransPersPrev;
 }
+
+/*----------------------------------------------------------------------*/
+
+void OpenGl_View::GetMatrices (TColStd_Array2OfReal&  theMatOrient,
+                               TColStd_Array2OfReal&  theMatMapping) const
+{
+  const OpenGl_Matrix* aProj =   (const OpenGl_Matrix*) &myCamera->ProjectionMatrix();
+  const OpenGl_Matrix* aOrient = (const OpenGl_Matrix*) &myCamera->OrientationMatrix();
+
+  int i, j;
+  for (i = 0; i < 4; ++i)
+  {
+    for (j = 0; j < 4; ++j)
+    {
+      theMatOrient  (i, j) = aOrient->mat[j][i];
+      theMatMapping (i, j) = aProj->  mat[j][i];
+    }
+  }
+}
+/*----------------------------------------------------------------------*/
index 6a3faa6..ce2e210 100644 (file)
@@ -36,7 +36,6 @@
 #include <Graphic3d_SequenceOfHClipPlane.hxx>
 #include <Visual3d_TypeOfSurfaceDetail.hxx>
 
-#include <OpenGl_telem_view.hxx>
 #include <OpenGl_LayerList.hxx>
 #include <OpenGl_Light.hxx>
 
@@ -62,15 +61,6 @@ struct OPENGL_BG_GRADIENT
   Aspect_GradientFillMethod type;
 };
 
-struct OPENGL_EXTRA_REP
-{
-  Tfloat  vrp[3];
-  Tfloat  vpn[3];
-  Tfloat  vup[3];
-  TEL_VIEW_MAPPING map;
-  Tfloat  scaleFactors[3];
-};
-
 struct OPENGL_ZCLIP
 {
   struct {
@@ -91,6 +81,7 @@ struct OPENGL_FOG
   TEL_COLOUR         Color;
 };
 
+struct OpenGl_Matrix;
 class OpenGl_GraduatedTrihedron;
 class OpenGl_Structure;
 class OpenGl_Trihedron;
@@ -114,9 +105,9 @@ class OpenGl_View : public MMgt_TShared
   void SetClipPlanes (const Graphic3d_SequenceOfHClipPlane &thePlanes) { myClipPlanes = thePlanes; }
   void SetVisualisation (const CALL_DEF_VIEWCONTEXT &AContext);
 
+  void SetCamera (const Handle(Graphic3d_Camera)& theCamera) { myCamera = theCamera; }
+
   void SetClipLimit (const Graphic3d_CView& theCView);
-  void SetMapping (const Handle(OpenGl_Display)& theGlDisplay, const Graphic3d_CView& theCView);
-  void SetOrientation (const Graphic3d_CView& theCView);
 
   void SetFog (const Graphic3d_CView& theCView, const Standard_Boolean theFlag);
 
@@ -131,22 +122,8 @@ class OpenGl_View : public MMgt_TShared
                                   const Graphic3d_CGraduatedTrihedron& theCubic);
   void GraduatedTrihedronErase (const Handle(OpenGl_Context)& theCtx);
 
-  Standard_Boolean ProjectObjectToRaster (const Standard_Integer w, const Standard_Integer h,
-                                          const Standard_ShortReal x, const Standard_ShortReal y, const Standard_ShortReal z,
-                                          Standard_ShortReal &xr, Standard_ShortReal &yr);
-  Standard_Boolean ProjectRasterToObject (const Standard_Integer w, const Standard_Integer h,
-                                          const Standard_Integer xr, const Standard_Integer yr,
-                                          Standard_ShortReal &x, Standard_ShortReal &y, Standard_ShortReal &z);
-  Standard_Boolean ProjectRasterToObjectWithRay (const Standard_Integer w, const Standard_Integer h,
-                                                 const Standard_Integer xr, const Standard_Integer yr,
-                                                 Standard_ShortReal &x, Standard_ShortReal &y, Standard_ShortReal &z,
-                                                 Standard_ShortReal &dx, Standard_ShortReal &dy, Standard_ShortReal &dz);
-  void GetMatrices (TColStd_Array2OfReal&  theMatOrient,
-                    TColStd_Array2OfReal&  theMatMapping,
-                    const Standard_Boolean theIsCustom) const;
-
-  Standard_Real Height () const { return (myExtra.map.window.xmax - myExtra.map.window.xmin); }
-  Standard_Real Width () const { return (myExtra.map.window.ymax - myExtra.map.window.ymin); }
+  Standard_Real Height () const { return myCamera->ViewDimensions().X(); }
+  Standard_Real Width () const { return myCamera->ViewDimensions().Y(); }
 
   Standard_Integer Backfacing () const { return myBackfacing; }
 
@@ -202,6 +179,9 @@ class OpenGl_View : public MMgt_TShared
   //! Returns visualization mode for objects in the view.
   Visual3d_TypeOfSurfaceDetail SurfaceDetail() const { return mySurfaceDetail; }
 
+  void GetMatrices (TColStd_Array2OfReal&  theMatOrient,
+                    TColStd_Array2OfReal&  theMatMapping) const;
+
 #ifdef HAVE_OPENCL
   //! Returns modification state for ray-tracing.
   Standard_Size ModificationState() const { return myModificationState; }
@@ -218,6 +198,20 @@ public:
                       const Graphic3d_CView&               theCView,
                       const Aspect_CLayer2d&               theCLayer);
 
+  //! Redraw contents of model scene: clipping planes,
+  //! lights, structures. The peculiar properties of "scene" is that
+  //! it requires empty Z-Buffer and uses projection and orientation
+  //! matrices supplied by 3d view.
+  //! @param thePrintCtx [in] printer context which facilitates tiled printing.
+  //! @param theWorkspace [in] rendering workspace.
+  //! @param theCView [in] view data.
+  //! @param theProjection [in] view projection matrix.
+  //! @param theOrientation [in] view orientation matrix.
+  void RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintContext,
+                    const Handle(OpenGl_Workspace)& theWorkspace,
+                    const OpenGl_Matrix* theProjection,
+                    const OpenGl_Matrix* theOrientation);
+
   Handle(OpenGl_Texture) myTextureEnv;
   Visual3d_TypeOfSurfaceDetail mySurfaceDetail; //WSSurfaceDetail
   Standard_Integer myBackfacing; //WSBackfacing
@@ -225,22 +219,12 @@ public:
   OPENGL_BG_TEXTURE myBgTexture; //WSBgTexture
   OPENGL_BG_GRADIENT myBgGradient; //WSBgGradient
 
-  //{ myViewRep
-  Tmatrix3    myOrientationMatrix;
-  Tmatrix3    myMappingMatrix;
-
-  //Tint        shield_indicator;
-  //TEL_COLOUR  shield_colour;
-  //Tint        border_indicator;
-  //TEL_COLOUR  border_colour;
-  //Tint        active_status;
-
   OPENGL_ZCLIP   myZClip;
-  OPENGL_EXTRA_REP myExtra;
-  //}
 
   Graphic3d_SequenceOfHClipPlane myClipPlanes;
   
+  Handle(Graphic3d_Camera) myCamera;
+
   OPENGL_FOG myFog;
   OpenGl_Trihedron*          myTrihedron;
   OpenGl_GraduatedTrihedron* myGraduatedTrihedron;
@@ -263,10 +247,11 @@ public:
   const TEL_TRANSFORM_PERSISTENCE *myTransPers;
   Standard_Boolean myIsTransPers;
 
+  //! Modification state
+  Standard_Size myProjectionState;
+  Standard_Size myModelViewState;
   OpenGl_StateCounter* myStateCounter;
 
-  Standard_Size myCurrOrientationState; // <-- delete it after merge with new camera
-  Standard_Size myCurrViewMappingState; // <-- delete it after merge with new camera
   Standard_Size myCurrLightSourceState;
 
   typedef std::pair<Standard_Size, Standard_Size> StateInfo;
diff --git a/src/OpenGl/OpenGl_View_1.cxx b/src/OpenGl/OpenGl_View_1.cxx
deleted file mode 100644 (file)
index def82dc..0000000
+++ /dev/null
@@ -1,254 +0,0 @@
-// Created on: 2011-09-20
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and / or modify it
-// under the terms of the GNU Lesser General Public version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <OpenGl_GlCore11.hxx>
-
-#include <OpenGl_View.hxx>
-
-#include <Visual3d_Layer.hxx>
-
-#include <OpenGl_tgl_funcs.hxx>
-#include <OpenGl_PrinterContext.hxx>
-#include <OpenGl_Workspace.hxx>
-
-/*----------------------------------------------------------------------*/
-
-//TelProjectionRaster in OpenGl_telem_util.cxx
-Standard_Boolean OpenGl_View::ProjectObjectToRaster (const Standard_Integer w, const Standard_Integer h,
-                                                    const Standard_ShortReal x, const Standard_ShortReal y, const Standard_ShortReal z,
-                                                    Standard_ShortReal &xr, Standard_ShortReal &yr)
-{
-  int i, j, k;
-
-  GLdouble modelMatrix[16];
-  for (k = 0, i = 0; i < 4; i++)
-    for (j = 0; j < 4; j++, k++)
-      modelMatrix[k] = ( GLdouble )myOrientationMatrix[i][j];
-
-  GLdouble projMatrix[16];
-  for (k = 0, i = 0; i < 4; i++)
-    for (j = 0; j < 4; j++, k++)
-      projMatrix[k] = ( GLdouble )myMappingMatrix[i][j];
-
-  GLint viewport[4];
-  viewport[0] = 0;
-  viewport[1] = 0;
-  viewport[2] = w;
-  viewport[3] = h;
-
-  /*
-  * glGetIntegerv (GL_VIEWPORT, viewport);
-  * glGetDoublev (GL_MODELVIEW_MATRIX, modelMatrix);
-  * glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
-  */
-
-  GLdouble winx, winy, winz;
-  if (gluProject (( GLdouble )x, ( GLdouble )y, ( GLdouble )z, modelMatrix, projMatrix, viewport, &winx, &winy, &winz))
-  {
-    xr = ( Standard_ShortReal )winx;
-    yr = ( Standard_ShortReal )winy;
-    return Standard_True;
-  }
-
-  xr = 0.F;
-  yr = 0.F;
-  return Standard_False;
-}
-
-/*----------------------------------------------------------------------*/
-//TelUnProjectionRaster
-Standard_Boolean OpenGl_View::ProjectRasterToObject (const Standard_Integer w, const Standard_Integer h,
-                                                    const Standard_Integer xr, const Standard_Integer yr,
-                                                    Standard_ShortReal &x, Standard_ShortReal &y, Standard_ShortReal &z)
-{
-  int i, j, k;
-
-  GLdouble modelMatrix[16];
-  for (k = 0, i = 0; i < 4; i++)
-    for (j = 0; j < 4; j++, k++)
-      modelMatrix[k] = ( GLdouble )myOrientationMatrix[i][j];
-
-  GLdouble projMatrix[16];
-  for (k = 0, i = 0; i < 4; i++)
-    for (j = 0; j < 4; j++, k++)
-      projMatrix[k] = ( GLdouble )myMappingMatrix[i][j];
-
-  GLint viewport[4];
-  viewport[0] = 0;
-  viewport[1] = 0;
-  viewport[2] = w;
-  viewport[3] = h;
-
-  /*
-  * glGetIntegerv (GL_VIEWPORT, viewport);
-  * glGetDoublev (GL_MODELVIEW_MATRIX, modelMatrix);
-  * glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
-  */
-
-  GLdouble objx, objy, objz;
-  if (gluUnProject (( GLdouble )xr, ( GLdouble )yr, 0.0, modelMatrix, projMatrix, viewport, &objx, &objy, &objz))
-  {
-    x = ( Standard_ShortReal )objx;
-    y = ( Standard_ShortReal )objy;
-    z = ( Standard_ShortReal )objz;
-    return Standard_True;
-  }
-
-  x = 0.F;
-  y = 0.F;
-  z = 0.F;
-  return Standard_False;
-}
-
-/*----------------------------------------------------------------------*/
-//TelUnProjectionRasterWithRay
-Standard_Boolean OpenGl_View::ProjectRasterToObjectWithRay (const Standard_Integer w, const Standard_Integer h,
-                                                           const Standard_Integer xr, const Standard_Integer yr,
-                                                           Standard_ShortReal &x, Standard_ShortReal &y, Standard_ShortReal &z,
-                                                           Standard_ShortReal &dx, Standard_ShortReal &dy, Standard_ShortReal &dz)
-{
-  int i, j, k;
-
-  GLdouble modelMatrix[16];
-  for (k = 0, i = 0; i < 4; i++)
-    for (j = 0; j < 4; j++, k++)
-      modelMatrix[k] = ( GLdouble )myOrientationMatrix[i][j];
-
-  GLdouble projMatrix[16];
-  for (k = 0, i = 0; i < 4; i++)
-    for (j = 0; j < 4; j++, k++)
-      projMatrix[k] = ( GLdouble )myMappingMatrix[i][j];
-
-  GLint viewport[4];
-  viewport[0] = 0;
-  viewport[1] = 0;
-  viewport[2] = w;
-  viewport[3] = h;
-
-  /*
-  * glGetIntegerv (GL_VIEWPORT, viewport);
-  * glGetDoublev (GL_MODELVIEW_MATRIX, modelMatrix);
-  * glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
-  */
-
-  const GLdouble winx = ( GLdouble )xr;
-  const GLdouble winy = ( GLdouble )yr;
-
-  GLdouble objx, objy, objz;
-  if (gluUnProject (winx, winy, 0.0, modelMatrix, projMatrix, viewport, &objx, &objy, &objz))
-  {
-    GLdouble objx1, objy1, objz1;
-    if (gluUnProject (winx, winy, -10.0, modelMatrix, projMatrix, viewport, &objx1, &objy1, &objz1))
-    {
-      x = ( Standard_ShortReal )objx;
-      y = ( Standard_ShortReal )objy;
-      z = ( Standard_ShortReal )objz;
-      dx = ( Standard_ShortReal )(objx-objx1);
-      dy = ( Standard_ShortReal )(objy-objy1);
-      dz = ( Standard_ShortReal )(objz-objz1);
-      return Standard_True;
-    }
-  }
-
-  x = 0.F;
-  y = 0.F;
-  z = 0.F;
-  dx = 0.F;
-  dy = 0.F;
-  dz = 0.F;
-  return Standard_False;
-}
-
-/*----------------------------------------------------------------------*/
-
-//call_togl_inquiremat
-void OpenGl_View::GetMatrices (TColStd_Array2OfReal&  theMatOrient,
-                               TColStd_Array2OfReal&  theMatMapping,
-                               const Standard_Boolean theIsCustom) const
-{
-  int i, j;
-  if (theIsCustom)
-  {
-    // OCC18942: Trying to return the current matrices instead of calculating them anew.
-    // This in particular allows using application-defined matrices.
-    for (i = 0; i < 4; ++i)
-    {
-      for (j = 0; j < 4; ++j)
-      {
-        theMatOrient  (i, j) = myOrientationMatrix[j][i];
-        theMatMapping (i, j) = myMappingMatrix[j][i];
-      }
-    }
-    return;
-  }
-
-  int anErr = 0;
-  Tmatrix3 aMatOri;
-  Tmatrix3 aMatMapping;
-
-  view_map3 aViewMap;
-  memcpy (&aViewMap.win,     &myExtra.map.window,   sizeof(Tlimit));
-  memcpy (&aViewMap.proj_vp, &myExtra.map.viewport, sizeof(Tlimit3));
-  switch (myExtra.map.proj)
-  {
-    default:
-    case TelParallel:    aViewMap.proj_type = TYPE_PARAL;    break;
-    case TelPerspective: aViewMap.proj_type = TYPE_PERSPECT; break;
-  }
-  aViewMap.proj_ref_point.x = myExtra.map.prp[0];
-  aViewMap.proj_ref_point.y = myExtra.map.prp[1];
-  aViewMap.proj_ref_point.z = myExtra.map.prp[2];
-  aViewMap.view_plane  = myExtra.map.vpd;
-  aViewMap.back_plane  = myExtra.map.bpd;
-  aViewMap.front_plane = myExtra.map.fpd;
-
-  call_func_eval_ori_matrix3 ((const point3* )myExtra.vrp,
-                              (const vec3*   )myExtra.vpn,
-                              (const vec3*   )myExtra.vup,
-                              &anErr, aMatOri);
-  if (anErr == 0)
-    call_func_eval_map_matrix3 (&aViewMap, &anErr, aMatMapping);
-
-  if (anErr == 0)
-  {
-    for (i = 0; i < 4; ++i)
-    {
-      for (j = 0; j < 4; ++j)
-      {
-        theMatOrient  (i, j) = aMatOri[j][i];
-        theMatMapping (i, j) = aMatMapping[j][i];
-      }
-    }
-    return;
-  }
-
-  // return just identity matrices
-  for (i = 0; i < 4; ++i)
-  {
-    for (j = 0; j < 4; ++j)
-    {
-      if (i == j) {
-        theMatMapping (i, j) = 1.0;
-        theMatOrient  (i, j) = 1.0;
-      }
-      else {
-        theMatMapping (i, j)  = 0.0;
-        theMatOrient  (i, j)  = 0.0;
-      }
-    }
-  }
-}
-
-/*----------------------------------------------------------------------*/
index dd72640..c77b9a7 100644 (file)
@@ -156,417 +156,14 @@ static void bind_light (const OpenGl_Light& theLight,
 }
 
 /*----------------------------------------------------------------------*/
-/*
-* Prototypes
-*/
-
-static void call_util_apply_trans2( float ix, float iy, float iz, matrix3 mat,
-                                   float *ox, float *oy, float *oz );
-static void call_util_mat_mul( matrix3 mat_a, matrix3 mat_b, matrix3 mat_c);
-
-/*----------------------------------------------------------------------*/
-/*
-* Fonctions externes
-*/
-
-/*
-*  Evaluates orientation matrix.
-*/
-/* OCC18942: obsolete in OCCT6.3, might be removed in further versions! */
-void call_func_eval_ori_matrix3 (const point3* vrp,        // view reference point
-                                 const vec3*   vpn,        // view plane normal
-                                 const vec3*   vup,        // view up vector
-                                 int*          err_ind,
-                                 float         mout[4][4]) // OUT view orientation matrix
-{
-
-  /* Translate to VRP then change the basis.
-  * The old basis is: e1 = < 1, 0, 0>, e2 = < 0, 1, 0>, e3 = < 0, 0, 1>.
-  * The new basis is: ("x" means cross product)
-  *  e3' = VPN / |VPN|
-  *  e1' = VUP x VPN / |VUP x VPN|
-  *  e2' = e3' x e1'
-  * Therefore the transform from old to new is x' = TAx, where:
-  *
-  *       | e1'x e2'x e3'x 0 |         |   1      0      0      0 |
-  *   A = | e1'y e2'y e3'y 0 |,    T = |   0      1      0      0 |
-  *       | e1'z e2'z e3'z 0 |         |   0      0      1      0 |
-  *       |  0    0    0   1 |         | -vrp.x -vrp.y -vrp.z   1 |
-  *
-  */
-
-  /*
-  * These ei's are really ei primes.
-  */
-  register float      (*m)[4][4];
-  point3      e1, e2, e3, e4;
-  double      s, v;
-
-  /*
-  * e1' = VUP x VPN / |VUP x VPN|, but do the division later.
-  */
-  e1.x = vup->delta_y * vpn->delta_z - vup->delta_z * vpn->delta_y;
-  e1.y = vup->delta_z * vpn->delta_x - vup->delta_x * vpn->delta_z;
-  e1.z = vup->delta_x * vpn->delta_y - vup->delta_y * vpn->delta_x;
-  s = sqrt( e1.x * e1.x + e1.y * e1.y + e1.z * e1.z);
-  e3.x = vpn->delta_x;
-  e3.y = vpn->delta_y;
-  e3.z = vpn->delta_z;
-  v = sqrt( e3.x * e3.x + e3.y * e3.y + e3.z * e3.z);
-  /*
-  * Check for vup and vpn colinear (zero dot product).
-  */
-  if ((s > -EPSI) && (s < EPSI))
-    *err_ind = 2;
-  else
-    /*
-    * Check for a normal vector not null.
-    */
-    if ((v > -EPSI) && (v < EPSI))
-      *err_ind = 3;
-    else {
-      /*
-      * Normalize e1
-      */
-      e1.x /= ( float )s;
-      e1.y /= ( float )s;
-      e1.z /= ( float )s;
-      /*
-      * e3 = VPN / |VPN|
-      */
-      e3.x /= ( float )v;
-      e3.y /= ( float )v;
-      e3.z /= ( float )v;
-      /*
-      * e2 = e3 x e1
-      */
-      e2.x = e3.y * e1.z - e3.z * e1.y;
-      e2.y = e3.z * e1.x - e3.x * e1.z;
-      e2.z = e3.x * e1.y - e3.y * e1.x;
-      /*
-      * Add the translation
-      */
-      e4.x = -( e1.x * vrp->x + e1.y * vrp->y + e1.z * vrp->z);
-      e4.y = -( e2.x * vrp->x + e2.y * vrp->y + e2.z * vrp->z);
-      e4.z = -( e3.x * vrp->x + e3.y * vrp->y + e3.z * vrp->z);
-      /*
-      * Homogeneous entries
-      *
-      *  | e1.x  e2.x  e3.x  0.0 |   | 1  0  0  0 |
-      *  | e1.y  e2.y  e3.y  0.0 | * | 0  1  0  0 |
-      *  | e1.z  e2.z  e3.z  0.0 |   | a  b  1  c |
-      *  | e4.x  e4.y  e4.z  1.0 |   | 0  0  0  1 |
-      */
-
-      m = (float (*)[4][4])mout;
-
-      (*m)[0][0] = e1.x;
-      (*m)[0][1] = e2.x;
-      (*m)[0][2] = e3.x;
-      (*m)[0][3] = ( float )0.0;
-
-      (*m)[1][0] = e1.y;
-      (*m)[1][1] = e2.y;
-      (*m)[1][2] = e3.y;
-      (*m)[1][3] = ( float )0.0;
-
-      (*m)[2][0] = e1.z;
-      (*m)[2][1] = e2.z;
-      (*m)[2][2] = e3.z;
-      (*m)[2][3] = ( float )0.0;
-
-      (*m)[3][0] = e4.x;
-      (*m)[3][1] = e4.y;
-      (*m)[3][2] = e4.z;
-      (*m)[3][3] = ( float )1.0;
-
-      *err_ind = 0;
-    }
-}
-
-/*----------------------------------------------------------------------*/
-/*
-*  Evaluates mapping matrix.
-*/
-/* OCC18942: obsolete in OCCT6.3, might be removed in further versions! */
-void call_func_eval_map_matrix3(
-                                view_map3 *Map,
-                                int *err_ind,
-                                matrix3 mat)
-{
-  int i, j;
-  matrix3 Tpar, Spar;
-  matrix3 Tper, Sper;
-  matrix3 Shear;
-  matrix3 Scale;
-  matrix3 Tprp;
-  matrix3 aux_mat1, aux_mat2, aux_mat3;
-  point3 Prp;
-
-  *err_ind = 0;
-  for (i=0; i<4; i++)
-    for (j=0; j<4; j++)
-      Spar[i][j] = Sper[i][j] = aux_mat1[i][j] = aux_mat2[i][j] =
-      aux_mat3[i][j] = Tper[i][j] = Tpar[i][j] = Tprp[i][j] =
-      Shear[i][j] = Scale[i][j] = ( float )(i == j);
-
-  Prp.x = Map->proj_ref_point.x;
-  Prp.y = Map->proj_ref_point.y;
-  Prp.z = Map->proj_ref_point.z;
-
-  /*
-  * Type Parallele
-  */
-  if (Map->proj_type == TYPE_PARAL)
-  {
-    float umid, vmid;
-    point3 temp;
-
-#ifdef FMN
-    float    cx, cy, gx, gy, xsf, ysf, zsf;
-    float    fpd, bpd;
-    float    dopx, dopy, dopz;
-    matrix3  tmat = { { ( float )1.0, ( float )0.0, ( float )0.0, ( float )0.0 },
-    { ( float )0.0, ( float )1.0, ( float )0.0, ( float )0.0 },
-    { ( float )0.0, ( float )0.0, ( float )1.0, ( float )0.0 },
-    { ( float )0.0, ( float )0.0, ( float )0.0, ( float )1.0 } };
-    matrix3  smat = { { ( float )1.0, ( float )0.0, ( float )0.0, ( float )0.0 },
-    { ( float )0.0, ( float )1.0, ( float )0.0, ( float )0.0 },
-    { ( float )0.0, ( float )0.0, ( float )1.0, ( float )0.0 },
-    { ( float )0.0, ( float )0.0, ( float )0.0, ( float )1.0 } };
-    matrix3 shmat = { { ( float )1.0, ( float )0.0, ( float )0.0, ( float )0.0 },
-    { ( float )0.0, ( float )1.0, ( float )0.0, ( float )0.0 },
-    { ( float )0.0, ( float )0.0, ( float )1.0, ( float )0.0 },
-    { ( float )0.0, ( float )0.0, ( float )0.0, ( float )1.0 } };
-    matrix3 tshmat = { { ( float )1.0, ( float )0.0, ( float )0.0, ( float )0.0 },
-    { ( float )0.0, ( float )1.0, ( float )0.0, ( float )0.0 },
-    { ( float )0.0, ( float )0.0, ( float )1.0, ( float )0.0 },
-    { ( float )0.0, ( float )0.0, ( float )0.0, ( float )1.0 } };
-
-    /* centers */
-    cx = Map->win.x_min + Map->win.x_max, cx /= ( float )2.0;
-    cy = Map->win.y_min + Map->win.y_max, cy /= ( float )2.0;
-
-    gx = 2.0/ (Map->win.x_max - Map->win.x_min);
-    gy = 2.0/ (Map->win.y_max - Map->win.y_min);
-
-    tmat[0][3] = -cx;
-    tmat[1][3] = -cy;
-    tmat[2][3] = (Map->front_plane + Map->back_plane)/(Map->front_plane - Map->back_plane);
-
-    smat[0][0] = gx;
-    smat[1][1] = gy;
-    smat[2][2] = -2./(Map->front_plane - Map->back_plane);
-
-    /* scale factors */
-    dopx = cx - Prp.x;
-    dopy = cy - Prp.y;
-    dopz = - Prp.z;
-
-    /* map matrix */
-    shmat[0][2] = -(dopx/dopz);
-    shmat[1][2] = -(dopy/dopz);
-
-    /* multiply to obtain mapping matrix */
-    call_util_mat_mul( tmat, shmat, tshmat );
-    call_util_mat_mul( smat, tshmat, mat );
-
-    return;
-#endif
-
-    /* CAL */
-    Map->proj_vp.z_min = ( float )0.0;
-    Map->proj_vp.z_max = ( float )1.0;
-    /* CAL */
-
-    /* Shear matrix calculation */
-    umid = ( float )(Map->win.x_min+Map->win.x_max)/( float )2.0;
-    vmid = ( float )(Map->win.y_min+Map->win.y_max)/( float )2.0;
-    if(Prp.z == Map->view_plane){
-      /* Projection reference point is on the view plane */
-      *err_ind = 1;
-      return;
-    }
-    Shear[2][0] = ( float )(-1.0) * ((Prp.x-umid)/(Prp.z-Map->view_plane));
-    Shear[2][1] = ( float )(-1.0) * ((Prp.y-vmid)/(Prp.z-Map->view_plane));
-
-    /*
-    * Calculate the lower left coordinate of the view plane
-    * after the Shearing Transformation.
-    */
-    call_util_apply_trans2(Map->win.x_min, Map->win.y_min,
-      Map->view_plane, Shear, &(temp.x), &(temp.y), &(temp.z));
-
-    /* Translate the back plane to the origin */
-    Tpar[3][0] = ( float )(-1.0) * temp.x;
-    Tpar[3][1] = ( float )(-1.0) * temp.y;
-    Tpar[3][2] = ( float )(-1.0) * Map->back_plane;
-
-    call_util_mat_mul(Shear, Tpar, aux_mat1);
-
-    /* Calculation of Scaling transformation */
-    Spar[0][0] = ( float )1.0 / (Map->win.x_max - Map->win.x_min);
-    Spar[1][1] = ( float )1.0 / (Map->win.y_max - Map->win.y_min);
-    Spar[2][2] = ( float )1.0 / (Map->front_plane - Map->back_plane );
-    call_util_mat_mul (aux_mat1, Spar, aux_mat2);
-    /* Atlast we transformed view volume to NPC */
-
-    /* Translate and scale the view plane to projection view port */
-    if(Map->proj_vp.x_min < 0.0 || Map->proj_vp.y_min < 0.0 ||
-      Map->proj_vp.z_min < 0.0 || Map->proj_vp.x_max > 1.0 ||
-      Map->proj_vp.y_max > 1.0 || Map->proj_vp.z_max > 1.0 ||
-      Map->proj_vp.x_min > Map->proj_vp.x_max ||
-      Map->proj_vp.y_min > Map->proj_vp.y_max ||
-      Map->proj_vp.z_min > Map->proj_vp.z_max){
-        *err_ind = 1;
-        return;
-      }
-      for(i=0; i<4; i++)
-        for(j=0; j<4; j++)
-          aux_mat1[i][j] = (float)(i==j);
-      aux_mat1[0][0] = Map->proj_vp.x_max-Map->proj_vp.x_min;
-      aux_mat1[1][1] = Map->proj_vp.y_max-Map->proj_vp.y_min;
-      aux_mat1[2][2] = Map->proj_vp.z_max-Map->proj_vp.z_min;
-      aux_mat1[3][0] = Map->proj_vp.x_min;
-      aux_mat1[3][1] = Map->proj_vp.y_min;
-      aux_mat1[3][2] = Map->proj_vp.z_min;
-      call_util_mat_mul (aux_mat2, aux_mat1, mat);
-
-      return;
-  }
-
-  /*
-  * Type Perspective
-  */
-  else if (Map->proj_type == TYPE_PERSPECT)
-  {
-    float umid, vmid;
-    float B, F, V;
-    float Zvmin;
-
-    /* CAL */
-    Map->proj_vp.z_min = ( float )0.0;
-    Map->proj_vp.z_max = ( float )1.0;
-    /* CAL */
-
-    B = Map->back_plane;
-    F = Map->front_plane;
-    V = Map->view_plane;
-
-    if(Prp.z == Map->view_plane){
-      /* Centre of Projection is on the view plane */
-      *err_ind = 1;
-      return;
-    }
-    if(Map->proj_vp.x_min < 0.0 || Map->proj_vp.y_min < 0.0 ||
-      Map->proj_vp.z_min < 0.0 || Map->proj_vp.x_max > 1.0 ||
-      Map->proj_vp.y_max > 1.0 || Map->proj_vp.z_max > 1.0 ||
-      Map->proj_vp.x_min > Map->proj_vp.x_max ||
-      Map->proj_vp.y_min > Map->proj_vp.y_max ||
-      Map->proj_vp.z_min > Map->proj_vp.z_max ||
-      F < B){
-        *err_ind = 1;
-        return;
-      }
-
-      /* This is the transformation to move VRC to Center Of Projection */
-      Tprp[3][0] = ( float )(-1.0)*Prp.x;
-      Tprp[3][1] = ( float )(-1.0)*Prp.y;
-      Tprp[3][2] = ( float )(-1.0)*Prp.z;
-
-      /* Calculation of Shear matrix */
-      umid = ( float )(Map->win.x_min+Map->win.x_max)/( float )2.0-Prp.x;
-      vmid = ( float )(Map->win.y_min+Map->win.y_max)/( float )2.0-Prp.y;
-      Shear[2][0] = ( float )(-1.0)*umid/(Map->view_plane-Prp.z);
-      Shear[2][1] = ( float )(-1.0)*vmid/(Map->view_plane-Prp.z);
-      call_util_mat_mul(Tprp, Shear, aux_mat3);
-
-      /* Scale the view volume to canonical view volume
-      * Centre of projection at origin.
-      * 0 <= N <= -1, -0.5 <= U <= 0.5, -0.5 <= V <= 0.5
-      */
-      Scale[0][0] =  (( float )(-1.0)*Prp.z+V)/
-        ((Map->win.x_max-Map->win.x_min)*(( float )(-1.0)*Prp.z+B));
-      Scale[1][1] =  (( float )(-1.0)*Prp.z+V)/
-        ((Map->win.y_max-Map->win.y_min)*(( float )(-1.0)*Prp.z+B));
-      Scale[2][2] =  ( float )(-1.0) / (( float )(-1.0)*Prp.z+B);
-
-      call_util_mat_mul(aux_mat3, Scale, aux_mat1);
-
-      /*
-      * Transform the Perspective view volume into
-      * Parallel view volume.
-      * Lower left coordinate: (-0.5,-0.5, -1)
-      * Upper right coordinate: (0.5, 0.5, 1.0)
-      */
-      Zvmin = ( float )(-1.0*(-1.0*Prp.z+F)/(-1.0*Prp.z+B));
-      aux_mat2[2][2] = ( float )1.0/(( float )1.0+Zvmin);
-      aux_mat2[2][3] = ( float )(-1.0);
-      aux_mat2[3][2] = ( float )(-1.0)*Zvmin*aux_mat2[2][2];
-      aux_mat2[3][3] = ( float )0.0;
-      call_util_mat_mul(aux_mat1, aux_mat2, Shear);
-
-      for(i=0; i<4; i++)
-        for(j=0; j<4; j++)
-          aux_mat1[i][j] = aux_mat2[i][j] = (float)(i==j);
-
-      /* Translate and scale the view plane to projection view port */
-      aux_mat2[0][0] = (Map->proj_vp.x_max-Map->proj_vp.x_min);
-      aux_mat2[1][1] = (Map->proj_vp.y_max-Map->proj_vp.y_min);
-      aux_mat2[2][2] = (Map->proj_vp.z_max-Map->proj_vp.z_min);
-      aux_mat2[3][0] = aux_mat2[0][0]/( float )2.0+Map->proj_vp.x_min;
-      aux_mat2[3][1] = aux_mat2[1][1]/( float )2.0+Map->proj_vp.y_min;
-      aux_mat2[3][2] = aux_mat2[2][2]+Map->proj_vp.z_min;
-      call_util_mat_mul (Shear, aux_mat2, mat);
-
-      return;
-  }
-  else
-    *err_ind = 1;
-}
-
-/*----------------------------------------------------------------------*/
 
-static void
-call_util_apply_trans2( float ix, float iy, float iz, matrix3 mat,
-                       float *ox, float *oy, float *oz )
+void OpenGl_View::DrawBackground (const Handle(OpenGl_Workspace)& theWorkspace)
 {
-  float temp;
-  *ox = ix*mat[0][0]+iy*mat[1][0]+iz*mat[2][0]+mat[3][0];
-  *oy = ix*mat[0][1]+iy*mat[1][1]+iz*mat[2][1]+mat[3][1];
-  *oz = ix*mat[0][2]+iy*mat[1][2]+iz*mat[2][2]+mat[3][2];
-  temp = ix * mat[0][3]+iy * mat[1][3]+iz * mat[2][3]+mat[3][3];
-  *ox /= temp;
-  *oy /= temp;
-  *oz /= temp;
-}
-
-/*----------------------------------------------------------------------*/
-
-static void
-call_util_mat_mul( matrix3 mat_a, matrix3 mat_b, matrix3 mat_c)
-{
-  int i, j, k;
-
-  for (i=0; i<4; i++)
-    for (j=0; j<4; j++)
-      for (mat_c[i][j] = ( float )0.0,k=0; k<4; k++)
-        mat_c[i][j] += mat_a[i][k] * mat_b[k][j];
-}
-
-/*----------------------------------------------------------------------*/
-
-void OpenGl_View::DrawBackground (const Handle(OpenGl_Workspace) &AWorkspace)
-{
-  /////////////////////////////////////////////////////////////////////////////
-  // Step 1: Prepare for redraw
-
-  // Render background
-  if ( (AWorkspace->NamedStatus & OPENGL_NS_WHITEBACK) == 0 &&
-    ( myBgTexture.TexId != 0 || myBgGradient.type != Aspect_GFM_NONE ) )
+  if ( (theWorkspace->NamedStatus & OPENGL_NS_WHITEBACK) == 0 &&
+       ( myBgTexture.TexId != 0 || myBgGradient.type != Aspect_GFM_NONE ) )
   {
-    const Standard_Integer aViewWidth = AWorkspace->Width();
-    const Standard_Integer aViewHeight = AWorkspace->Height();
+    const Standard_Integer aViewWidth = theWorkspace->Width();
+    const Standard_Integer aViewHeight = theWorkspace->Height();
 
     glPushAttrib( GL_ENABLE_BIT | GL_TEXTURE_BIT );
 
@@ -722,8 +319,8 @@ void OpenGl_View::DrawBackground (const Handle(OpenGl_Workspace) &AWorkspace)
 
       glDisable( GL_BLEND ); //push GL_ENABLE_BIT
 
-      glColor3fv( AWorkspace->BackgroundColor().rgb );
-      glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); //push GL_TEXTURE_BIT
+      glColor3fv (theWorkspace->BackgroundColor().rgb);
+      glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); //push GL_TEXTURE_BIT
 
       // Note that texture is mapped using GL_REPEAT wrapping mode so integer part
       // is simply ignored, and negative multiplier is here for convenience only
@@ -743,11 +340,11 @@ void OpenGl_View::DrawBackground (const Handle(OpenGl_Workspace) &AWorkspace)
 
     glPopAttrib(); //GL_ENABLE_BIT | GL_TEXTURE_BIT
 
-    if ( AWorkspace->UseZBuffer() )
-      glEnable( GL_DEPTH_TEST );
+    if (theWorkspace->UseZBuffer())
+      glEnable (GL_DEPTH_TEST);
 
     /* GL_DITHER on/off pour le trace */
-    if (AWorkspace->Dither())
+    if (theWorkspace->Dither())
       glEnable (GL_DITHER);
     else
       glDisable (GL_DITHER);
@@ -758,74 +355,91 @@ void OpenGl_View::DrawBackground (const Handle(OpenGl_Workspace) &AWorkspace)
 
 //call_func_redraw_all_structs_proc
 void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
-                          const Handle(OpenGl_Workspace) &AWorkspace,
-                          const Graphic3d_CView& ACView,
-                          const Aspect_CLayer2d& ACUnderLayer,
-                          const Aspect_CLayer2d& ACOverLayer)
+                          const Handle(OpenGl_Workspace) &theWorkspace,
+                          const Graphic3d_CView& theCView,
+                          const Aspect_CLayer2d& theCUnderLayer,
+                          const Aspect_CLayer2d& theCOverLayer)
 {
+  // ==================================
+  //      Step 1: Prepare for redraw
+  // ==================================
+
+  const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
+
   // Store and disable current clipping planes
-  const Handle(OpenGl_Context)& aContext = AWorkspace->GetGlContext();
-  const Standard_Integer aMaxClipPlanes = aContext->MaxClipPlanes();
-  const GLenum lastid = GL_CLIP_PLANE0 + aMaxClipPlanes;
-  OPENGL_CLIP_PLANE *oldPlanes = new OPENGL_CLIP_PLANE[aMaxClipPlanes];
-  OPENGL_CLIP_PLANE *ptrPlane = oldPlanes;
-  GLenum planeid = GL_CLIP_PLANE0;
-  for ( ; planeid < lastid; planeid++, ptrPlane++ )
+  Standard_Integer aMaxPlanes = aContext->MaxClipPlanes();
+
+  OPENGL_CLIP_PLANE *aOldPlanes = new OPENGL_CLIP_PLANE[aMaxPlanes];
+  OPENGL_CLIP_PLANE *aPtrPlane = aOldPlanes;
+
+  GLenum aClipPlaneId = GL_CLIP_PLANE0;
+  const GLenum aClipLastId = GL_CLIP_PLANE0 + aMaxPlanes;
+  for (; aClipPlaneId < aClipLastId; aClipPlaneId++, aPtrPlane++)
   {
-    glGetClipPlane( planeid, ptrPlane->Equation );
-    if ( ptrPlane->isEnabled )
+    glGetClipPlane (aClipPlaneId, aPtrPlane->Equation);
+    if (aPtrPlane->isEnabled)
     {
-      glDisable( planeid );
-      ptrPlane->isEnabled = GL_TRUE;
+      glDisable (aClipPlaneId);
+      aPtrPlane->isEnabled = GL_TRUE;
     }
     else
     {
-      ptrPlane->isEnabled = GL_FALSE;
+      aPtrPlane->isEnabled = GL_FALSE;
     }
   }
 
   // Set OCCT state uniform variables
   const Handle(OpenGl_ShaderManager) aManager = aContext->ShaderManager();
-  if (StateInfo (myCurrLightSourceState, aManager->LightSourceState().Index()) != myLastLightSourceState)
-  {
-    aManager->UpdateLightSourceStateTo (&myLights);
-    myLastLightSourceState = StateInfo (myCurrLightSourceState, aManager->LightSourceState().Index());
-  }
-  if (StateInfo (myCurrViewMappingState, aManager->ProjectionState().Index()) != myLastViewMappingState)
-  {
-    aManager->UpdateProjectionStateTo (myMappingMatrix);
-    myLastViewMappingState = StateInfo (myCurrViewMappingState, aManager->ProjectionState().Index());
-  }
-  if (StateInfo (myCurrOrientationState, aManager->WorldViewState().Index()) != myLastOrientationState)
-  {
-    aManager->UpdateWorldViewStateTo (myOrientationMatrix);
-    myLastOrientationState = StateInfo (myCurrOrientationState, aManager->WorldViewState().Index());
-  }
-  if (aManager->ModelWorldState().Index() == 0)
+  if (!aManager->IsEmpty())
   {
-    Tmatrix3 aModelWorldState = { { 1.f, 0.f, 0.f, 0.f },
-                                  { 0.f, 1.f, 0.f, 0.f },
-                                  { 0.f, 0.f, 1.f, 0.f },
-                                  { 0.f, 0.f, 0.f, 1.f } };
-    
-    aManager->UpdateModelWorldStateTo (aModelWorldState);
+    if (StateInfo (myCurrLightSourceState, aManager->LightSourceState().Index()) != myLastLightSourceState)
+    {
+      aManager->UpdateLightSourceStateTo (&myLights);
+      myLastLightSourceState = StateInfo (myCurrLightSourceState, aManager->LightSourceState().Index());
+    }
+
+    if (myProjectionState != myCamera->ProjectionState())
+    {
+      myProjectionState = myCamera->ProjectionState();
+      aManager->UpdateProjectionStateTo ((const Tmatrix3*)myCamera->ProjectionMatrix().GetData());
+    }
+
+    if (myModelViewState != myCamera->ModelViewState())
+    {
+      myModelViewState = myCamera->ModelViewState();
+      aManager->UpdateWorldViewStateTo ((const Tmatrix3*)myCamera->OrientationMatrix().GetData());
+    }
+
+    if (aManager->ModelWorldState().Index() == 0)
+    {
+      Tmatrix3 aModelWorldState = { { 1.f, 0.f, 0.f, 0.f },
+                                    { 0.f, 1.f, 0.f, 0.f },
+                                    { 0.f, 0.f, 1.f, 0.f },
+                                    { 0.f, 0.f, 0.f, 1.f } };
+
+      aContext->ShaderManager()->UpdateModelWorldStateTo (&aModelWorldState);
+    }
   }
 
-  /////////////////////////////////////////////////////////////////////////////
-  // Step 1: Prepare for redraw
+  // ====================================
+  //      Step 2: Redraw background
+  // ====================================
 
   // Render background
-  DrawBackground (AWorkspace);
+  DrawBackground (theWorkspace);
 
   // Switch off lighting by default
   glDisable(GL_LIGHTING);
 
-  /////////////////////////////////////////////////////////////////////////////
-  // Step 2: Draw underlayer
-  RedrawLayer2d (thePrintContext, ACView, ACUnderLayer);
+  // =================================
+  //      Step 3: Draw underlayer
+  // =================================
+
+  RedrawLayer2d (thePrintContext, theCView, theCUnderLayer);
 
-  /////////////////////////////////////////////////////////////////////////////
-  // Step 3: Redraw main plane
+  // =================================
+  //      Step 4: Redraw main plane
+  // =================================
 
   // Setup face culling
   GLboolean isCullFace = GL_FALSE;
@@ -837,279 +451,114 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
       glEnable( GL_CULL_FACE );
       glCullFace( GL_BACK );
     }
-       else
+    else
       glDisable( GL_CULL_FACE );
   }
 
-  //TsmPushAttri(); /* save previous graphics context */
-
-  // if the view is scaled normal vectors are scaled to unit length for correct displaying of shaded objects
-  if(myExtra.scaleFactors[0] != 1.F ||
-     myExtra.scaleFactors[1] != 1.F ||
-     myExtra.scaleFactors[2] != 1.F)
+  // if the view is scaled normal vectors are scaled to unit
+  // length for correct displaying of shaded objects
+  const gp_Pnt anAxialScale = myCamera->AxialScale();
+  if(anAxialScale.X() != 1.F ||
+     anAxialScale.Y() != 1.F ||
+     anAxialScale.Z() != 1.F)
     glEnable(GL_NORMALIZE);
   else if(glIsEnabled(GL_NORMALIZE))
     glDisable(GL_NORMALIZE);
 
-  // Apply View Projection
-  // This routine activates the Projection matrix for a view.
-
-  glMatrixMode( GL_PROJECTION );
-
-#ifdef _WIN32
-  // add printing scale/tiling transformation
-  if (!thePrintContext.IsNull())
-  {
-    thePrintContext->LoadProjTransformation();
-  }
-  else
-#endif
-    glLoadIdentity();
-
-  glMultMatrixf( (const GLfloat *) myMappingMatrix );
-
-  // Add translation necessary for the environnement mapping
-  if (mySurfaceDetail != Visual3d_TOD_NONE)
-  {
-    // OCC280: FitAll work incorrect for perspective view if the SurfaceDetail mode is V3d_TEX_ENVIRONMENT or V3d_TEX_ALL
-    // const GLfloat dep = vptr->vrep.extra.map.fpd * 0.5F;
-    const GLfloat dep = (myExtra.map.fpd + myExtra.map.bpd) * 0.5F;
-    glTranslatef(-dep*myExtra.vpn[0],-dep*myExtra.vpn[1],-dep*myExtra.vpn[2]);
-  }
-
-  // Apply matrix
-  AWorkspace->SetViewMatrix((const OpenGl_Matrix *)myOrientationMatrix);
-
-/*
-While drawing after a clipplane has been defined and enabled, each vertex
-is transformed to eye-coordinates, where it is dotted with the transformed
-clipping plane equation.  Eye-coordinate vertexes whose dot product with
-the transformed clipping plane equation is positive or zero are in, and
-require no clipping.  Those eye-coordinate vertexes whose dot product is
-negative are clipped.  Because clipplane clipping is done in eye-
-coordinates, changes to the projection matrix have no effect on its
-operation.
-
-A point and a normal are converted to a plane equation in the following manner:
-
-point = [Px,Py,Pz]
-
-normal = |Nx|
-|Ny|
-|Nz|
-
-plane equation = |A|
-|B|
-|C|
-|D|
-A = Nx
-B = Ny
-C = Nz
-D = -[Px,Py,Pz] dot |Nx|
-|Ny|
-|Nz|
-
-*/
-
   // Apply Fog
   if ( myFog.IsOn )
   {
-    const GLfloat ramp = myExtra.map.fpd - myExtra.map.bpd;
-    const GLfloat fog_start = myFog.Front * ramp - myExtra.map.fpd;
-    const GLfloat fog_end   = myFog.Back  * ramp - myExtra.map.fpd;
-
-    glFogi(GL_FOG_MODE, GL_LINEAR);
-    glFogf(GL_FOG_START, fog_start);
-    glFogf(GL_FOG_END, fog_end);
-    glFogfv(GL_FOG_COLOR, myFog.Color.rgb);
-    glEnable(GL_FOG);
-  }
-  else
-    glDisable(GL_FOG);
-
-  // Apply Lights
-  {
-    // setup lights
-    Graphic3d_Vec4 anAmbientColor (THE_DEFAULT_AMBIENT[0],
-                                   THE_DEFAULT_AMBIENT[1],
-                                   THE_DEFAULT_AMBIENT[2],
-                                   THE_DEFAULT_AMBIENT[3]);
-    GLenum aLightGlId = GL_LIGHT0;
-    for (OpenGl_ListOfLight::Iterator aLightIt (myLights);
-         aLightIt.More(); aLightIt.Next())
+    Standard_Real aFogFrontConverted = (Standard_Real )myFog.Front + myCamera->Distance();
+    if (myCamera->ZFar() < aFogFrontConverted)
     {
-      bind_light (aLightIt.Value(), aLightGlId, anAmbientColor);
+      aFogFrontConverted = myCamera->ZFar();
+      myFog.Front = (Standard_ShortReal )(aFogFrontConverted - myCamera->Distance());
     }
 
-    // apply accumulated ambient color
-    anAmbientColor.a() = 1.0f;
-    glLightModelfv (GL_LIGHT_MODEL_AMBIENT, anAmbientColor.GetData());
-
-    if (aLightGlId != GL_LIGHT0)
+    Standard_Real aFogBackConverted = (Standard_Real )myFog.Back + myCamera->Distance();
+    if (myCamera->ZFar() < aFogFrontConverted)
     {
-      glEnable (GL_LIGHTING);
+      aFogBackConverted = myCamera->ZFar();
+      myFog.Back = (Standard_ShortReal )(aFogBackConverted - myCamera->Distance());
     }
-    // switch off unused lights
-    for (; aLightGlId <= GL_LIGHT7; ++aLightGlId)
+
+    if (aFogFrontConverted > aFogBackConverted)
     {
-      glDisable (aLightGlId);
-    }
+      myFog.Front = (Standard_ShortReal )(aFogFrontConverted - myCamera->Distance());
+      myFog.Back = (Standard_ShortReal )(aFogBackConverted - myCamera->Distance());
+    }    
+
+    glFogi(GL_FOG_MODE, GL_LINEAR);
+    glFogf(GL_FOG_START, (Standard_ShortReal )aFogFrontConverted);
+    glFogf(GL_FOG_END, (Standard_ShortReal )aFogBackConverted);
+    glFogfv(GL_FOG_COLOR, myFog.Color.rgb);
+    glEnable(GL_FOG);
   }
+  else
+    glDisable(GL_FOG);
 
   // Apply InteriorShadingMethod
   glShadeModel( myIntShadingMethod == TEL_SM_FLAT ? GL_FLAT : GL_SMOOTH );
 
-  // Apply clipping planes
+  // Apply AntiAliasing
+  if (myAntiAliasing)
+    theWorkspace->NamedStatus |= OPENGL_NS_ANTIALIASING;
+  else
+    theWorkspace->NamedStatus &= ~OPENGL_NS_ANTIALIASING;
+
+  if (!aManager->IsEmpty())
   {
-    if (myZClip.Back.IsOn || myZClip.Front.IsOn)
-    {
-      const GLdouble ramp = myExtra.map.fpd - myExtra.map.bpd;
+    aManager->UpdateClippingState();
+  }
 
-      Handle(Graphic3d_ClipPlane) aPlaneBack;
-      Handle(Graphic3d_ClipPlane) aPlaneFront;
+  // Redraw 3d scene
+  if (!myCamera->IsStereo() || !aContext->HasStereoBuffers())
+  {
+    // single-pass monographic rendering
+    const OpenGl_Matrix* aProj = (const OpenGl_Matrix*) &myCamera->ProjectionMatrix();
 
-      if (myZClip.Back.IsOn)
-      {
-        const GLdouble back = ramp * myZClip.Back.Limit + myExtra.map.bpd;
-        const Graphic3d_ClipPlane::Equation aBackEquation (0.0, 0.0, 1.0, -back);
-        aPlaneBack = new Graphic3d_ClipPlane (aBackEquation);
-      }
+    const OpenGl_Matrix* aOrient = (const OpenGl_Matrix*) &myCamera->OrientationMatrix();
 
-      if (myZClip.Front.IsOn)
-      {
-        const GLdouble front = ramp * myZClip.Front.Limit + myExtra.map.bpd;
-        const Graphic3d_ClipPlane::Equation aFrontEquation (0.0, 0.0, -1.0, front);
-        aPlaneFront = new Graphic3d_ClipPlane (aFrontEquation);
-      }
+    // redraw scene with normal orientation and projection
+    RedrawScene (thePrintContext, theWorkspace, aProj, aOrient);
+  }
+  else
+  {
+    // two stereographic passes
+    const OpenGl_Matrix* aLProj  = (const OpenGl_Matrix*) &myCamera->ProjectionStereoLeft();
+    const OpenGl_Matrix* aRProj  = (const OpenGl_Matrix*) &myCamera->ProjectionStereoRight();
+    const OpenGl_Matrix* aOrient = (const OpenGl_Matrix*) &myCamera->OrientationMatrix();
 
-      // do some "memory allocation"-wise optimization
-      if (!aPlaneBack.IsNull() || !aPlaneFront.IsNull())
-      {
-        Graphic3d_SequenceOfHClipPlane aSlicingPlanes;
-        if (!aPlaneBack.IsNull())
-        {
-          aSlicingPlanes.Append (aPlaneBack);
-        }
+    // safely switch to left Eye buffer
+    aContext->SetDrawBufferLeft();
 
-        if (!aPlaneFront.IsNull())
-        {
-          aSlicingPlanes.Append (aPlaneFront);
-        }
+    // redraw left Eye
+    RedrawScene (thePrintContext, theWorkspace, aLProj, aOrient);
 
-        // add planes at loaded view matrix state
-        aContext->ChangeClipping().AddView (aSlicingPlanes, AWorkspace);
-      }
-    }
-
-    // Apply user clipping planes
-    if (!myClipPlanes.IsEmpty())
+    // reset depth buffer of first rendering pass
+    if (theWorkspace->UseDepthTest())
     {
-      Graphic3d_SequenceOfHClipPlane aUserPlanes;
-      Graphic3d_SequenceOfHClipPlane::Iterator aClippingIt (myClipPlanes);
-      for (; aClippingIt.More(); aClippingIt.Next())
-      {
-        const Handle(Graphic3d_ClipPlane)& aClipPlane = aClippingIt.Value();
-        if (aClipPlane->IsOn())
-        {
-          aUserPlanes.Append (aClipPlane);
-        }
-      }
-
-      if (!aUserPlanes.IsEmpty())
-      {
-        // add planes at actual matrix state.
-        aContext->ChangeClipping().AddWorld (aUserPlanes);
-      }
+      glClear (GL_DEPTH_BUFFER_BIT);
     }
+    // safely switch to right Eye buffer
+    aContext->SetDrawBufferRight();
     
-    if (!aManager->IsEmpty())
-    {
-      aManager->UpdateClippingState();
-    }
-  }
+    // redraw right Eye
+    RedrawScene (thePrintContext, theWorkspace, aRProj, aOrient);
 
-  // Apply AntiAliasing
-  {
-    if (myAntiAliasing)
-      AWorkspace->NamedStatus |= OPENGL_NS_ANTIALIASING;
-       else
-      AWorkspace->NamedStatus &= ~OPENGL_NS_ANTIALIASING;
+    // switch back to monographic rendering
+    aContext->SetDrawBufferMono();
   }
 
-  // Clear status bitfields
-  AWorkspace->NamedStatus &= ~(OPENGL_NS_2NDPASSNEED | OPENGL_NS_2NDPASSDO);
-
-  // Added PCT for handling of textures
-  switch (mySurfaceDetail)
-  {
-    case Visual3d_TOD_NONE:
-      AWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX;
-      AWorkspace->DisableTexture();
-      // Render the view
-      RenderStructs(AWorkspace);
-      break;
-
-    case Visual3d_TOD_ENVIRONMENT:
-      AWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX;
-      AWorkspace->EnableTexture (myTextureEnv);
-      // Render the view
-      RenderStructs(AWorkspace);
-      AWorkspace->DisableTexture();
-      break;
-
-    case Visual3d_TOD_ALL:
-      // First pass
-      AWorkspace->NamedStatus &= ~OPENGL_NS_FORBIDSETTEX;
-      // Render the view
-      RenderStructs(AWorkspace);
-      AWorkspace->DisableTexture();
-
-      // Second pass
-      if (AWorkspace->NamedStatus & OPENGL_NS_2NDPASSNEED)
-      {
-        AWorkspace->NamedStatus |= OPENGL_NS_2NDPASSDO;
-        AWorkspace->EnableTexture (myTextureEnv);
-
-        /* sauvegarde de quelques parametres OpenGL */
-        GLint blend_dst, blend_src;
-        GLint zbuff_f;
-        GLboolean zbuff_w;
-        glGetBooleanv(GL_DEPTH_WRITEMASK, &zbuff_w);
-        glGetIntegerv(GL_DEPTH_FUNC, &zbuff_f);
-        glGetIntegerv(GL_BLEND_DST, &blend_dst);
-        glGetIntegerv(GL_BLEND_SRC, &blend_src);
-        GLboolean zbuff_state = glIsEnabled(GL_DEPTH_TEST);
-        GLboolean blend_state = glIsEnabled(GL_BLEND);
-
-        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-        glEnable(GL_BLEND);
-
-        glDepthFunc(GL_EQUAL);
-        glDepthMask(GL_FALSE);
-        glEnable(GL_DEPTH_TEST);
-
-        AWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX;
-
-        // Render the view
-        RenderStructs(AWorkspace);
-        AWorkspace->DisableTexture();
-
-        /* restauration des parametres OpenGL */
-        glBlendFunc(blend_src, blend_dst);
-        if (!blend_state) glDisable(GL_BLEND);
-
-        glDepthFunc(zbuff_f);
-        glDepthMask(zbuff_w);
-        if (!zbuff_state) glDisable(GL_DEPTH_FUNC);
-      }
-      break;
-  }
+  // ===============================
+  //      Step 5: Trihedron
+  // ===============================
 
   // Resetting GL parameters according to the default aspects
   // in order to synchronize GL state with the graphic driver state
   // before drawing auxiliary stuff (trihedrons, overlayer)
   // and invoking optional callbacks
-  AWorkspace->ResetAppliedAspect();
+  theWorkspace->ResetAppliedAspect();
 
   aContext->ChangeClipping().RemoveAll();
 
@@ -1127,11 +576,11 @@ D = -[Px,Py,Pz] dot |Nx|
   // display global trihedron
   if (myTrihedron != NULL)
   {
-    myTrihedron->Render (AWorkspace);
+    myTrihedron->Render (theWorkspace);
   }
   if (myGraduatedTrihedron != NULL)
   {
-    myGraduatedTrihedron->Render (AWorkspace);
+    myGraduatedTrihedron->Render (theWorkspace);
   }
 
   // Restore face culling
@@ -1146,25 +595,35 @@ D = -[Px,Py,Pz] dot |Nx|
       glDisable ( GL_CULL_FACE );
   }
 
-  /////////////////////////////////////////////////////////////////////////////
-  // Step 6: Draw overlayer
+  // ===============================
+  //      Step 6: Redraw overlay
+  // ===============================
+
   const int aMode = 0;
-  AWorkspace->DisplayCallback (ACView, (aMode | OCC_PRE_OVERLAY));
+  theWorkspace->DisplayCallback (theCView, (aMode | OCC_PRE_OVERLAY));
 
-  RedrawLayer2d (thePrintContext, ACView, ACOverLayer);
+  RedrawLayer2d (thePrintContext, theCView, theCOverLayer);
 
-  AWorkspace->DisplayCallback (ACView, aMode);
+  theWorkspace->DisplayCallback (theCView, aMode);
+
+  // ===============================
+  //      Step 7: Finalize
+  // ===============================
 
   // Restore clipping planes
-  for ( ptrPlane = oldPlanes, planeid = GL_CLIP_PLANE0; planeid < lastid; planeid++, ptrPlane++ )
+  aClipPlaneId = GL_CLIP_PLANE0;
+  aPtrPlane = aOldPlanes;
+
+  for (; aClipPlaneId < aClipLastId; aClipPlaneId++, aPtrPlane++)
   {
-    glClipPlane( planeid, ptrPlane->Equation );
-    if ( ptrPlane->isEnabled )
-      glEnable( planeid );
+    glClipPlane (aClipPlaneId, aPtrPlane->Equation);
+    if (aPtrPlane->isEnabled)
+      glEnable (aClipPlaneId);
     else
-      glDisable( planeid );
+      glDisable (aClipPlaneId);
   }
-  delete[] oldPlanes;
+
+  delete[] aOldPlanes;
 }
 
 /*----------------------------------------------------------------------*/
@@ -1510,3 +969,220 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure,
   Standard_Integer anOldLayer = theStructure->GetZLayer ();
   myZLayers.ChangeLayer (theStructure, anOldLayer, theNewLayerId);
 }
+
+//=======================================================================
+//function : RedrawScene
+//purpose  :
+//=======================================================================
+
+void OpenGl_View::RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintContext,
+                               const Handle(OpenGl_Workspace)& theWorkspace,
+                               const OpenGl_Matrix* theProjection,
+                               const OpenGl_Matrix* theOrientation)
+{
+  const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
+
+  if (myZClip.Back.IsOn || myZClip.Front.IsOn)
+  {
+    Handle(Graphic3d_ClipPlane) aPlaneBack;
+    Handle(Graphic3d_ClipPlane) aPlaneFront;
+
+    if (myZClip.Back.IsOn)
+    {
+      Standard_Real aClipBackConverted = (Standard_Real )myZClip.Front.Limit + myCamera->Distance();
+      if (myCamera->ZFar() < aClipBackConverted)
+      {
+        aClipBackConverted = myCamera->ZFar();
+        myZClip.Back.Limit = (Standard_ShortReal )(aClipBackConverted - myCamera->Distance());
+      }
+      const Graphic3d_ClipPlane::Equation aBackEquation (0.0, 0.0, 1.0, (Standard_ShortReal )aClipBackConverted);
+      aPlaneBack = new Graphic3d_ClipPlane (aBackEquation);
+    }
+
+    if (myZClip.Front.IsOn)
+    {
+      Standard_Real aClipFrontConverted = (Standard_Real )myZClip.Front.Limit + myCamera->Distance();
+      if (myCamera->ZNear() > aClipFrontConverted)
+      {
+        aClipFrontConverted = myCamera->ZNear();
+        myZClip.Front.Limit = (Standard_ShortReal )(aClipFrontConverted - myCamera->Distance());
+      }
+      const Graphic3d_ClipPlane::Equation aFrontEquation (0.0, 0.0, -1.0, (Standard_ShortReal )-aClipFrontConverted);
+      aPlaneFront = new Graphic3d_ClipPlane (aFrontEquation);
+    }
+
+    // do some "memory allocation"-wise optimization
+    if (!aPlaneBack.IsNull() || !aPlaneFront.IsNull())
+    {
+      Graphic3d_SequenceOfHClipPlane aSlicingPlanes;
+      if (!aPlaneBack.IsNull())
+      {
+        aSlicingPlanes.Append (aPlaneBack);
+      }
+
+      if (!aPlaneFront.IsNull())
+      {
+        aSlicingPlanes.Append (aPlaneFront);
+      }
+
+      // add planes at loaded view matrix state
+      aContext->ChangeClipping().AddView (aSlicingPlanes, theWorkspace);
+    }
+  }
+
+  // Apply user clipping planes
+  if (!myClipPlanes.IsEmpty())
+  {
+    Graphic3d_SequenceOfHClipPlane aUserPlanes;
+    Graphic3d_SequenceOfHClipPlane::Iterator aClippingIt (myClipPlanes);
+    for (; aClippingIt.More(); aClippingIt.Next())
+    {
+      const Handle(Graphic3d_ClipPlane)& aClipPlane = aClippingIt.Value();
+      if (aClipPlane->IsOn())
+      {
+        aUserPlanes.Append (aClipPlane);
+      }
+    }
+
+    if (!aUserPlanes.IsEmpty())
+    {
+      // add planes at actual matrix state.
+      aContext->ChangeClipping().AddWorld (aUserPlanes);
+    }
+
+    if (!aContext->ShaderManager()->IsEmpty())
+    {
+      aContext->ShaderManager()->UpdateClippingState();
+    }
+  }
+
+  // Setup view projection
+  glMatrixMode (GL_PROJECTION);
+
+#ifdef _WIN32
+  // add printing scale/tiling transformation
+  if (!thePrintContext.IsNull())
+  {
+    thePrintContext->LoadProjTransformation();
+  }
+  else
+#endif
+    glLoadIdentity();
+
+  glMultMatrixf ((const GLfloat*)theProjection);
+
+  if (!thePrintContext.IsNull())
+  {
+    // update shader uniform projection matrix with new data
+    Tmatrix3 aResultProjection;
+    glGetFloatv (GL_PROJECTION_MATRIX, *aResultProjection);
+    aContext->ShaderManager()->UpdateProjectionStateTo (&aResultProjection);
+
+    // force shader uniform restore on next frame
+    myProjectionState = 0; 
+  }
+
+  // Setup view orientation
+  theWorkspace->SetViewMatrix (theOrientation);
+
+  // Apply Lights
+  {
+    // setup lights
+    Graphic3d_Vec4 anAmbientColor (THE_DEFAULT_AMBIENT[0],
+                                   THE_DEFAULT_AMBIENT[1],
+                                   THE_DEFAULT_AMBIENT[2],
+                                   THE_DEFAULT_AMBIENT[3]);
+    GLenum aLightGlId = GL_LIGHT0;
+    for (OpenGl_ListOfLight::Iterator aLightIt (myLights);
+         aLightIt.More(); aLightIt.Next())
+    {
+      bind_light (aLightIt.Value(), aLightGlId, anAmbientColor);
+    }
+
+    // apply accumulated ambient color
+    anAmbientColor.a() = 1.0f;
+    glLightModelfv (GL_LIGHT_MODEL_AMBIENT, anAmbientColor.GetData());
+
+    if (aLightGlId != GL_LIGHT0)
+    {
+      glEnable (GL_LIGHTING);
+    }
+    // switch off unused lights
+    for (; aLightGlId <= GL_LIGHT7; ++aLightGlId)
+    {
+      glDisable (aLightGlId);
+    }
+  }
+
+  // Clear status bitfields
+  theWorkspace->NamedStatus &= ~(OPENGL_NS_2NDPASSNEED | OPENGL_NS_2NDPASSDO);
+
+  // Added PCT for handling of textures
+  switch (mySurfaceDetail)
+  {
+    case Visual3d_TOD_NONE:
+      theWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX;
+      theWorkspace->DisableTexture();
+      // Render the view
+      RenderStructs (theWorkspace);
+      break;
+
+    case Visual3d_TOD_ENVIRONMENT:
+      theWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX;
+      theWorkspace->EnableTexture (myTextureEnv);
+      // Render the view
+      RenderStructs (theWorkspace);
+      theWorkspace->DisableTexture();
+      break;
+
+    case Visual3d_TOD_ALL:
+      // First pass
+      theWorkspace->NamedStatus &= ~OPENGL_NS_FORBIDSETTEX;
+      // Render the view
+      RenderStructs (theWorkspace);
+      theWorkspace->DisableTexture();
+
+      // Second pass
+      if (theWorkspace->NamedStatus & OPENGL_NS_2NDPASSNEED)
+      {
+        theWorkspace->NamedStatus |= OPENGL_NS_2NDPASSDO;
+        theWorkspace->EnableTexture (myTextureEnv);
+
+        // Remember OpenGl properties
+        GLint aSaveBlendDst, aSaveBlendSrc;
+        GLint aSaveZbuffFunc;
+        GLboolean aSaveZbuffWrite;
+        glGetBooleanv (GL_DEPTH_WRITEMASK, &aSaveZbuffWrite);
+        glGetIntegerv (GL_DEPTH_FUNC, &aSaveZbuffFunc);
+        glGetIntegerv (GL_BLEND_DST, &aSaveBlendDst);
+        glGetIntegerv (GL_BLEND_SRC, &aSaveBlendSrc);
+        GLboolean wasZbuffEnabled = glIsEnabled (GL_DEPTH_TEST);
+        GLboolean wasBlendEnabled = glIsEnabled (GL_BLEND);
+
+        // Change the properties for second rendering pass
+        glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        glEnable (GL_BLEND);
+
+        glDepthFunc (GL_EQUAL);
+        glDepthMask (GL_FALSE);
+        glEnable (GL_DEPTH_TEST);
+
+        theWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX;
+
+        // Render the view
+        RenderStructs (theWorkspace);
+        theWorkspace->DisableTexture();
+
+        // Restore properties back
+        glBlendFunc (aSaveBlendSrc, aSaveBlendDst);
+        if (!wasBlendEnabled)
+          glDisable (GL_BLEND);
+
+        glDepthFunc (aSaveZbuffFunc);
+        glDepthMask (aSaveZbuffWrite);
+        if (!wasZbuffEnabled)
+          glDisable (GL_DEPTH_FUNC);
+      }
+      break;
+  }
+}
index be6c403..a78ffba 100644 (file)
@@ -13,7 +13,7 @@
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#include <OpenGl_GlCore11.hxx>
+#include <OpenGl_GlCore12.hxx>
 
 #include <InterfaceGraphic.hxx>
 
@@ -24,6 +24,7 @@
 
 #include <Aspect_GraphicDeviceDefinitionError.hxx>
 #include <TCollection_AsciiString.hxx>
+#include <TCollection_ExtendedString.hxx>
 
 IMPLEMENT_STANDARD_HANDLE(OpenGl_Window,MMgt_TShared)
 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Window,MMgt_TShared)
@@ -168,6 +169,21 @@ OpenGl_Window::OpenGl_Window (const Handle(OpenGl_Display)& theDisplay,
   }
 
   int aPixelFrmtId = ChoosePixelFormat (aWindowDC, &aPixelFrmt);
+
+  // in case of failure try without stereo if any
+  if (aPixelFrmtId == 0 && theCaps->contextStereo)
+  {
+    TCollection_ExtendedString aMsg ("OpenGl_Window::CreateWindow: "
+                                     "ChoosePixelFormat is unable to find stereo supported pixel format. "
+                                     "Choosing similar non stereo format.");
+    myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
+                              GL_DEBUG_TYPE_OTHER_ARB,
+                              0, GL_DEBUG_SEVERITY_HIGH_ARB, aMsg);
+
+    aPixelFrmt.dwFlags &= ~PFD_STEREO;
+    aPixelFrmtId = ChoosePixelFormat (aWindowDC, &aPixelFrmt);
+  }
+
   if (aPixelFrmtId == 0)
   {
     ReleaseDC (aWindow, aWindowDC);
@@ -395,7 +411,8 @@ OpenGl_Window::OpenGl_Window (const Handle(OpenGl_Display)& theDisplay,
     if (aVis != NULL)
     {
       // check Visual for OpenGl context's parameters compability
-      int isGl = 0, isDoubleBuffer = 0, isRGBA = 0, aDepthSize = 0, aStencilSize = 0;
+      int isGl = 0, isDoubleBuffer = 0, isRGBA = 0, isStereo = 0;
+      int aDepthSize = 0, aStencilSize = 0;
 
       if (glXGetConfig (aDisp, aVis, GLX_USE_GL, &isGl) != 0)
         isGl = 0;
@@ -406,13 +423,18 @@ OpenGl_Window::OpenGl_Window (const Handle(OpenGl_Display)& theDisplay,
       if (glXGetConfig (aDisp, aVis, GLX_DOUBLEBUFFER, &isDoubleBuffer) != 0)
         isDoubleBuffer = 0;
 
+      if (glXGetConfig (aDisp, aVis, GLX_STEREO, &isStereo) != 0)
+        isStereo = 0;
+
       if (glXGetConfig (aDisp, aVis, GLX_DEPTH_SIZE, &aDepthSize) != 0)
         aDepthSize = 0;
 
       if (glXGetConfig (aDisp, aVis, GLX_STENCIL_SIZE, &aStencilSize) != 0)
         aStencilSize = 0;
 
-      if (!isGl || !aDepthSize || !aStencilSize || !isRGBA  || (isDoubleBuffer ? 1 : 0) != (myDisplay->DBuffer()? 1 : 0))
+      if (!isGl || !aDepthSize || !isRGBA  || !aStencilSize ||
+          (isDoubleBuffer ? 1 : 0) != (myDisplay->DBuffer()   ? 1 : 0) ||
+          (isStereo       ? 1 : 0) != (theCaps->contextStereo ? 1 : 0))
       {
         XFree (aVis);
         aVis = NULL;
@@ -444,9 +466,29 @@ OpenGl_Window::OpenGl_Window (const Handle(OpenGl_Display)& theDisplay,
       if (myDisplay->DBuffer())
         anAttribs[anIter++] = GLX_DOUBLEBUFFER;
 
+      // warning: this flag may be set to None, so it need to be last in anAttribs
+      Standard_Integer aStereoFlagPos = anIter;
+      if (theCaps->contextStereo)
+        anAttribs[anIter++] = GLX_STEREO;
+
       anAttribs[anIter++] = None;
 
       aVis = glXChooseVisual (aDisp, scr, anAttribs);
+
+      // in case of failure try without stereo if any
+      if (aVis == NULL && theCaps->contextStereo)
+      {
+        TCollection_ExtendedString aMsg ("OpenGl_Window::CreateWindow: "
+                                         "glXChooseVisual is unable to find stereo supported pixel format. "
+                                         "Choosing similar non stereo format.");
+        myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
+                                  GL_DEBUG_TYPE_OTHER_ARB,
+                                  0, GL_DEBUG_SEVERITY_HIGH_ARB, aMsg);
+
+        anAttribs[aStereoFlagPos] = None;
+        aVis = glXChooseVisual (aDisp, scr, anAttribs);
+      }
+
       if (aVis == NULL)
       {
         Aspect_GraphicDeviceDefinitionError::Raise ("OpenGl_Window::CreateWindow: glXChooseVisual failed.");
@@ -773,20 +815,32 @@ void OpenGl_Window::DisableFeatures() const
   * code for simplicity.)
   */
 
+  if ((myGlContext->myGlVerMajor >= 1) && (myGlContext->myGlVerMinor >= 2))
+  {
 #ifdef GL_EXT_convolution
-  glDisable(GL_CONVOLUTION_1D_EXT);
-  glDisable(GL_CONVOLUTION_2D_EXT);
-  glDisable(GL_SEPARABLE_2D_EXT);
+    if (myGlContext->CheckExtension ("GL_CONVOLUTION_1D_EXT"))
+      glDisable(GL_CONVOLUTION_1D_EXT);
+
+    if (myGlContext->CheckExtension ("GL_CONVOLUTION_2D_EXT"))
+      glDisable(GL_CONVOLUTION_2D_EXT);
+
+    if (myGlContext->CheckExtension ("GL_SEPARABLE_2D_EXT"))
+      glDisable(GL_SEPARABLE_2D_EXT);
 #endif
 
 #ifdef GL_EXT_histogram
-  glDisable(GL_HISTOGRAM_EXT);
-  glDisable(GL_MINMAX_EXT);
+    if (myGlContext->CheckExtension ("GL_SEPARABLE_2D_EXT"))
+      glDisable(GL_HISTOGRAM_EXT);
+
+    if (myGlContext->CheckExtension ("GL_MINMAX_EXT"))
+      glDisable(GL_MINMAX_EXT);
 #endif
 
 #ifdef GL_EXT_texture3D
-  glDisable(GL_TEXTURE_3D_EXT);
+    if (myGlContext->CheckExtension ("GL_TEXTURE_3D_EXT"))
+      glDisable(GL_TEXTURE_3D_EXT);
 #endif
+  }
 }
 
 // =======================================================================
index d5fb08f..ecedc6a 100644 (file)
@@ -553,12 +553,10 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView,
   Handle(OpenGl_Context) aGlCtx = GetGlContext();
   aGlCtx->ReleaseDelayed();
 
-  // cache render mode state
-  GLint aRendMode = GL_RENDER;
-  glGetIntegerv (GL_RENDER_MODE,  &aRendMode);
-  aGlCtx->SetFeedback (aRendMode == GL_FEEDBACK);
+  // fetch OpenGl context state
+  aGlCtx->FetchState();
 
-  Tint toSwap = (aRendMode == GL_RENDER); // swap buffers
+  Tint toSwap = (aGlCtx->IsRender()); // swap buffers
   GLint aViewPortBack[4];
   OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer* )theCView.ptrFBO;
   if (aFrameBuffer != NULL)
@@ -619,5 +617,5 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView,
 #endif
 
   // reset render mode state
-  aGlCtx->SetFeedback (Standard_False);
+  aGlCtx->FetchState();
 }
index 9fd2549..759b109 100644 (file)
@@ -215,23 +215,7 @@ static void getMaxFrameSize(Standard_Integer& theWidth,
   theWidth  = (Standard_Integer)aMaxX;
   theHeight = (Standard_Integer)aMaxY;
 }
-// ---------------------------------------------------------------
-// Function: getDimensionsTiling
-// Purpose:  calculate maximum possible dimensions for framebuffer
-//           in tiling mode according to the view size
-// ---------------------------------------------------------------
-static void getDimensionsTiling (Standard_Integer& theFrameWidth,
-                                 Standard_Integer& theFrameHeight,
-                                 const int theViewWidth,
-                                 const int theViewHeight)
-{
-  // fit the maximum dimensions into the printing area
-  if (theFrameWidth > theViewWidth)
-      theFrameWidth = theViewWidth;
 
-  if (theFrameHeight > theViewHeight)
-      theFrameHeight = theViewHeight;
-}
 // ---------------------------------------------------------------
 // Function: initBufferStretch
 // Purpose:  calculate initialization sizes for frame buffer
@@ -389,9 +373,10 @@ Standard_Boolean OpenGl_Workspace::Print
     }
     else if (IsTiling)
     {
-      getDimensionsTiling (aFrameWidth, aFrameHeight, width, height);
-      if (aPrevWidth >= aFrameWidth && aPrevHeight >= aFrameHeight)
-        isUsable = true;
+      // use previous frame buffer with its dimensions
+      aFrameWidth  = aPrevWidth;
+      aFrameHeight = aPrevHeight;
+      isUsable = true;
     }
 
     // if it is enough memory for image paste dc operation
index 6800eb6..9f00b41 100644 (file)
@@ -266,11 +266,11 @@ const OpenGl_Matrix * OpenGl_Workspace::SetStructureMatrix (const OpenGl_Matrix
   {
     if (aRevert)
     {
-      myGlContext->ShaderManager()->RevertModelWorldStateTo (lmat.mat);
+      myGlContext->ShaderManager()->RevertModelWorldStateTo (&lmat.mat);
     }
     else
     {
-      myGlContext->ShaderManager()->UpdateModelWorldStateTo (lmat.mat);
+      myGlContext->ShaderManager()->UpdateModelWorldStateTo (&lmat.mat);
     }
   }
 
index 41cd130..1324181 100755 (executable)
@@ -1957,13 +1957,23 @@ void GenerateCornerRays (const GLdouble theInvModelProj[16],
                               1.f);
 
       aOrigin = MatVecMult (theInvModelProj, aOrigin);
+      aOrigin.x() = aOrigin.x() / aOrigin.w();
+      aOrigin.y() = aOrigin.y() / aOrigin.w();
+      aOrigin.z() = aOrigin.z() / aOrigin.w();
+      aOrigin.w() = 1.f;
 
       OpenGl_RTVec4f aDirect (float(x),
                               float(y),
                               1.f,
                               1.f);
 
-      aDirect = MatVecMult (theInvModelProj, aDirect) - aOrigin;
+      aDirect = MatVecMult (theInvModelProj, aDirect);
+      aDirect.x() = aDirect.x() / aDirect.w();
+      aDirect.y() = aDirect.y() / aDirect.w();
+      aDirect.z() = aDirect.z() / aDirect.w();
+      aDirect.w() = 1.f;
+
+      aDirect = aDirect - aOrigin;
 
       GLdouble aInvLen = 1.f / sqrt (aDirect.x() * aDirect.x() +
                                      aDirect.y() * aDirect.y() +
@@ -2007,7 +2017,7 @@ Standard_Boolean OpenGl_Workspace::Raytrace (const Graphic3d_CView& theCView,
   TColStd_Array2OfReal theOrientation (0, 3, 0, 3);
   TColStd_Array2OfReal theViewMapping (0, 3, 0, 3);
 
-  myView->GetMatrices (theOrientation, theViewMapping, Standard_True);
+  myView->GetMatrices (theOrientation, theViewMapping);
 
   GLdouble aOrientationMatrix[16];
   GLdouble aViewMappingMatrix[16];
diff --git a/src/OpenGl/OpenGl_telem_view.cxx b/src/OpenGl/OpenGl_telem_view.cxx
deleted file mode 100644 (file)
index 75cec5f..0000000
+++ /dev/null
@@ -1,343 +0,0 @@
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and / or modify it
-// under the terms of the GNU Lesser General Public version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-/***********************************************************************
-
-FONCTION :
-----------
-File OpenGl_telem_view :
-
-************************************************************************/
-
-#include <OpenGl_GlCore11.hxx>
-#include <OpenGl_telem_view.hxx>
-#include <OpenGl_telem_util.hxx>
-#include <OpenGl_Display.hxx>
-
-static  void
-EvalViewMappingMatrix (const Handle(OpenGl_Display)& theGlDisplay,
-                       tel_view_mapping mapping /* View Mapping */,
-                       Tint* error_ind          /* Out: Error Indicator */,
-                       Tmatrix3 mat             /* Out: Mapping Matrix * */,
-                       Tint     flag,
-                       Tfloat   cx,
-                       Tfloat   cy,
-                       Tint     /*clip_flag*/,
-                       Tlimit3* /*clip_limit*/
-                      )
-{
-  Tfloat    gx, gy, xsf, ysf, zsf;
-  Tfloat    fpd, bpd;
-
-  /* OCC18942 */
-  Tfloat    n, f, r, l, t, b, Zprp, dx, dy, VPD;
-
-  /* FSXXX */
-  /* GLint gdtmp; */
-  Tlimit3   vp = { ( float )-1.0, ( float )1.0, ( float )-1.0, ( float )1.0, ( float )1.0, ( float )-1.0 };
-  Tmatrix3  pmat = { { ( float )1.0, ( float )0.0, ( float )0.0, ( float )0.0 },
-  { ( float )0.0, ( float )1.0, ( float )0.0, ( float )0.0 },
-  { ( float )0.0, ( float )0.0, ( float )1.0, ( float )0.0 },
-  { ( float )0.0, ( float )0.0, ( float )0.0, ( float )1.0 } };
-  Tmatrix3  mmat = { { ( float )1.0, ( float )0.0, ( float )0.0, ( float )0.0 },
-  { ( float )0.0, ( float )1.0, ( float )0.0, ( float )0.0 },
-  { ( float )0.0, ( float )0.0, ( float )1.0, ( float )0.0 },
-  { ( float )0.0, ( float )0.0, ( float )0.0, ( float )1.0 } };
-
-  fpd = mapping->fpd;
-  bpd = mapping->bpd;
-
-  /* invalid window */
-  if( mapping->window.xmin >= mapping->window.xmax ||
-    mapping->window.ymin >= mapping->window.ymax )
-  {
-    *error_ind = 1;    
-    return;
-  }
-
-  /* invalid viewport */
-  if( mapping->viewport.xmin >= mapping->viewport.xmax ||
-    mapping->viewport.ymin >= mapping->viewport.ymax ||
-    mapping->viewport.zmin >= mapping->viewport.zmax )
-  {
-    *error_ind = 2;   
-    return;
-  }
-
-  /* invalid back/front plane distances */
-  if( mapping->bpd >= mapping->fpd )
-  {
-    *error_ind = 3;   
-    return;
-  }
-
-  /* prp between front and back planes */
-  if (theGlDisplay.IsNull() || !theGlDisplay->Walkthrough())
-  {
-    if( mapping->prp[2] < mapping->fpd &&
-      mapping->prp[2] > mapping->bpd )
-    {
-      *error_ind = 4;   
-      return;
-    } 
-  }
-
-  if( mapping->prp[2] == mapping->vpd )
-  {
-    *error_ind = 5;   /* prp on view plane */
-    return;
-  }
-
-  if( mapping->viewport.xmin < 0 ||
-    mapping->viewport.xmax > 1 ||
-    mapping->viewport.ymin < 0 ||
-    mapping->viewport.ymax > 1 ||
-    mapping->viewport.zmin < 0 ||
-    mapping->viewport.zmax > 1 )
-  {
-    *error_ind = 6;   /* viewport limits outside NPC space */
-    return;
-  }
-
-  *error_ind = 0;
-
-  /* OCC18942: Moved here while debugging perspective projection matrix */
-  /* centers */
-  if( flag == 0 )
-  {
-    cx = mapping->window.xmin + mapping->window.xmax, cx /= ( float )2.0;
-    cy = mapping->window.ymin + mapping->window.ymax, cy /= ( float )2.0;
-  }
-
-  gx = (cx - mapping->prp[0]) / (mapping->vpd - mapping->prp[2]);
-  gy = (cy - mapping->prp[1]) / (mapping->vpd - mapping->prp[2]);
-
-#ifdef PRINT
-  printf("EvalViewMappingMatrix \n");
-  printf("prp %f %f %f \n", mapping->prp[0], mapping->prp[1], mapping->prp[2]);
-  printf("vpd fpd bpd %f %f %f \n", mapping->vpd, mapping->fpd, mapping->bpd);
-  printf("window limit %f %f %f %f\n", mapping->window.xmin, mapping->window.xmax, 
-    mapping->window.ymin, mapping->window.ymax);
-  printf("viewport limit %f %f %f %f\n", mapping->viewport.xmin, mapping->viewport.xmax, 
-    mapping->viewport.ymin, mapping->viewport.ymax);
-#endif
-
-  /* projection matrix */
-  if( mapping->proj == TelParallel )
-  {
-
-    pmat[2][0] = -gx; pmat[3][0] = mapping->vpd*gx;
-    pmat[2][1] = -gy; pmat[3][1] = mapping->vpd*gy;
-  }
-  else if (!theGlDisplay.IsNull() && !theGlDisplay->SymPerspective())/* TelPerspective */
-  {
-    pmat[0][0] = pmat[1][1] = mapping->prp[2] - mapping->vpd;
-    pmat[2][0] = -gx; 
-    pmat[2][1] = -gy; 
-    pmat[2][3] = ( float )-1.0;
-    pmat[3][0] = mapping->vpd * gx; 
-    pmat[3][1] = mapping->vpd * gy; 
-    pmat[3][3] = mapping->prp[2];
-
-    /* modify the next two cells to change clipping policy */
-    if (!theGlDisplay.IsNull() && !theGlDisplay->Walkthrough())
-    {
-      pmat[2][2] = mapping->prp[2] - ( fpd + bpd );
-      pmat[3][2] = fpd * bpd; 
-    }
-  }
-  /* OCC18942: New approach to calculation of mapping (projection) matrix */
-  else 
-  {
-    dx = mapping->window.xmax - mapping->window.xmin;
-    dy = mapping->window.ymax - mapping->window.ymin;
-    Zprp = mapping->prp[2];
-    VPD = Zprp - mapping->vpd;
-
-    /* 
-    Calculate canonical perspective projection parameters as if we were about 
-    to use glFrustum() to create symmetric perspective frustum.
-
-    After the view orientation matrix is applied, the coordinate system origin is located 
-    at the VRP and oriented properly. However, the viewplane has width = dx and height = dy 
-    and its center (cx, cy, VPD) is not always located at the view Z axis.
-    The canonical perspective projection matrix assumes the eye is located at (0, 0, 0).
-    Thus the old approach resulted in a non-symmetric perspective, 
-    as X and Y coordinates of the projection reference point (PRP) were not updated
-    when cx and cy changed. Moreover, such "static" perspective had some other disadvantages,
-    such as non-realistic panning, i.e. instead of moving the eye (or camera) over the model
-    a sort of "frame" moved over the static perspective projection picture, 
-    exposing a part of this static picture to the user.
-
-    In order to make the perspective symmetric, we need to translate 
-    the coordinate system to PRP before projection.
-    Thus we translate X, Y and Z co-ordinates by -cx, -cy and -Zprp respectively.
-
-    NOTE: mat[i][j] means j-th element of i-th column, as OpenGL accepts the matrices
-    in column-major order, while in C two-dimensional arrays are stored in memory
-    in row-major order!
-
-    VPD is used below instead of near clipping plane dispance (n) in order to simplify 
-    calculation of l and r values. If we did not use VPD in the matrix calculation, we would have to 
-    project 0.5 * dx, -0.5 * dx, 0.5 * dy and - 0.5 * dy onto the near clipping plane 
-    to calculate these values.
-
-    Pending issues:
-    1. It is still necessary to find a way to calculate the perspective projection matrix 
-    for TPM_WALKTHROUGH projection model. This projection model is not supported yet 
-    by the new code.
-    */
-    r = .5f * dx;
-    l = -r;
-    t = .5f * dy;
-    b = -t;
-    n = Zprp - fpd; f = Zprp - bpd;
-
-    mat[0][0] = 2.f * VPD / (r - l);
-    mat[1][1] = 2.f * VPD / (t - b);
-    mat[2][0] = (r + l) / (r - l);
-    mat[2][1] = (t + b) / (t - b);
-    mat[2][2] = - (f + n) / (f - n);
-    mat[2][3] = -1.f;
-    /* 
-    The last column takes into account translation along X, Y and Z axis
-    before projecting. This can be considered as a result of right-multiplying the canonical 
-    perspective projection matrix P by a translation matrix T 
-    (it differs form the canonical matrix by the last column only):
-    | 1 0 0  -cx  |
-    | 0 1 0  -cy  |
-    mat = P * T, where T = | 0 0 1 -Zprp |
-    | 0 0 0   1   |
-    */
-    mat[3][0] = -mat[2][0] * Zprp - mat[0][0] * cx;
-    mat[3][1] = -mat[2][1] * Zprp - mat[1][1] * cy;
-    mat[3][2] = -2.f * f * n / (f - n) - mat[2][2] * Zprp;
-    mat[3][3] = Zprp;
-
-#ifdef PRINT
-    printf("r l t b n f: %f %f %f %f %f %f \n", r,l,t,b,n,f);
-    printf( "mapping_matrix (new code):\n" );
-    pr_matrix(mat);
-#endif
-
-    /* return here, as further calculations are related to the old approach */
-    return;
-  }
-
-  /* scale factors */
-  xsf = (vp.xmax - vp.xmin) / (mapping->window.xmax - mapping->window.xmin);
-  ysf = (vp.ymax - vp.ymin) / (mapping->window.ymax - mapping->window.ymin);
-  zsf = (vp.zmax - vp.zmin) / (fpd - bpd);
-
-  /* map matrix */
-  mmat[0][0] = xsf, mmat[1][1] = ysf, mmat[2][2] = zsf;
-  mmat[3][0] = vp.xmin - xsf*mapping->window.xmin;
-  mmat[3][1] = vp.ymin - ysf*mapping->window.ymin;
-  mmat[3][2] = vp.zmin - zsf*bpd;
-
-  /* multiply to obtain mapping matrix */
-  TelMultiplymat3( mat, pmat, mmat );
-
-#ifdef PRINT
-  printf( "mapping_matrix :\n" );
-  pr_matrix(mat);
-#endif
-}
-
-void
-TelEvalViewOrientationMatrix( Tfloat *vrp    /* View Reference Point */,
-                              Tfloat *vpn    /* View Plane Normal */,
-                              Tfloat *vup    /* View Up Vector */,
-                              Tfloat *asf    /* Axial Scale Factors */,
-                              Tint *error_ind/* Out: Error indicator */,
-                              Tmatrix3  rmat  /* Out: Orientation Matrix  */
-                             )
-{
-  Tfloat  u[3], v[3], n[3], f;
-
-  /* view plane normal of zero length */
-  if( vecmag(vpn) == 0.0 )
-  {
-    *error_ind = 1;   
-    return;
-  }
-
-  /* view up vector of zero length */
-  if( vecmag(vup) == 0.0 )
-  {
-    *error_ind = 2;    
-    return;
-  }
-
-  /* view up vector parallel to view plane normal */
-  vecang(vup, vpn, f);
-  if( f == 0.0 )
-  {
-    *error_ind = 3;    
-    return;
-  }
-
-  *error_ind = 0;
-
-  veccpy(n, vpn);
-  veccpy(v, vup);
-  vecnrm(n);  
-
-  veccrs(u,v,n);      /* up vector cross plane normal gives U axis */
-  vecnrm(u);
-
-  veccrs(v,n,u);      /* plane normal cross U axis gives modified up vector */
-  vecnrm(v); /* redundant ? */
-
-  /* rotate to align along u, v, n */
-  rmat[0][0] = ( float )u[0] * asf[0],
-    rmat[0][1] = ( float )v[0] * asf[0],
-    rmat[0][2] = ( float )n[0] * asf[0],
-    rmat[0][3] = ( float )0.0;
-
-  rmat[1][0] = ( float )u[1] * asf[1],
-    rmat[1][1] = ( float )v[1] * asf[1],
-    rmat[1][2] = ( float )n[1] * asf[1],
-    rmat[1][3] = ( float )0.0;
-
-  rmat[2][0] = ( float )u[2] * asf[2],
-    rmat[2][1] = ( float )v[2] * asf[2],
-    rmat[2][2] = ( float )n[2] * asf[2],
-    rmat[2][3] = ( float )0.0;
-
-  /* translate to centre at vrp */
-
-  rmat[3][0] = - ( float ) (u[0]*vrp[0] + u[1]*vrp[1] + u[2]*vrp[2]);
-  rmat[3][1] = - ( float ) (v[0]*vrp[0] + v[1]*vrp[1] + v[2]*vrp[2]);
-  rmat[3][2] = - ( float ) (n[0]*vrp[0] + n[1]*vrp[1] + n[2]*vrp[2]);
-  rmat[3][3] = ( float )1.0;
-
-#ifdef PRINT
-  printf("TelEvalViewOrientationMatrix \n");
-  printf("view_ref_pt %f %f %f \n", vrp[0], vrp[1], vrp[2]);
-  printf("view_up_vec %f %f %f \n", vup[0], vup[1], vup[2]);
-  printf("view_plane_normal %f %f %f \n", vpn[0], vpn[1], vpn[2]);
-  pr_matrix(rmat);
-#endif
-
-  return;
-}
-
-void TelEvalViewMappingMatrix (const Handle(OpenGl_Display)& theGlDisplay,
-                               tel_view_mapping mapping /* View Mapping */,
-                               Tint *error_ind          /* Out: Error Indicator */,
-                               Tmatrix3 mat             /* Out: Mapping Matrix */
-                               )
-{
-  EvalViewMappingMatrix (theGlDisplay, mapping, error_ind, mat, 0, ( float )0.0, ( float )0.0, 0, 0);
-}
diff --git a/src/OpenGl/OpenGl_telem_view.hxx b/src/OpenGl/OpenGl_telem_view.hxx
deleted file mode 100644 (file)
index 2acce33..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 1995-1999 Matra Datavision
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and / or modify it
-// under the terms of the GNU Lesser General Public version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-/***********************************************************************
-
-FONCTION :
-----------
-File OpenGl_telem_view.h :
-
-
-REMARQUES:
----------- 
-
-
-HISTORIQUE DES MODIFICATIONS   :
---------------------------------
-xx-xx-xx : xxx ; Creation.
-02-07-96 : FMN ; Suppression WSWSHeight et WSWSWidth
-Suppression de TelSetWSWindow
-03-07-96 : FMN ; A une workstation correspond une vue.
-Suppression de TelGetViewportAtLocation()
-Suppression de TelPrintAllViews()
-03-03-98 : FMN ; Suppression variable externe TglWhetherPerspective 
-
-************************************************************************/
-
-#ifndef  OPENGL_TELEM_VIEW_H
-#define  OPENGL_TELEM_VIEW_H
-
-#include <InterfaceGraphic_tgl_all.hxx>
-#include <Handle_OpenGl_Display.hxx>
-
-typedef  struct
-{
-  Tfloat    xmin;
-  Tfloat    xmax;
-  Tfloat    ymin;
-  Tfloat    ymax;
-} Tlimit;
-
-typedef  struct
-{
-  Tfloat    xmin;
-  Tfloat    xmax;
-  Tfloat    ymin;
-  Tfloat    ymax;
-  Tfloat    zmin;
-  Tfloat    zmax;
-} Tlimit3;
-
-typedef  enum
-{
-  TelParallel, TelPerspective
-} TelProjType;
-
-typedef  struct
-{
-  Tlimit      window;
-  Tlimit3     viewport;
-  TelProjType proj;
-  Tfloat      prp[3];
-  Tfloat      vpd;
-  Tfloat      fpd;
-  Tfloat      bpd;
-} TEL_VIEW_MAPPING, *tel_view_mapping;
-
-extern  void              /* vrp,     vpn,     vup,     error_ind, mat */
-TelEvalViewOrientationMatrix(Tfloat*, Tfloat*, Tfloat*, Tfloat*, Tint*, Tmatrix3);
-
-extern  void            /*         mapping, error_ind,  mat */
-TelEvalViewMappingMatrix (const Handle(OpenGl_Display)& theGlDisplay, tel_view_mapping theMapping, Tint* theError, Tmatrix3 theMat);
-
-#endif
index e127db4..4d6af34 100644 (file)
@@ -25,7 +25,6 @@
 #include <PrsMgr_Prs.hxx>
 #include <PrsMgr_ModedPresentation.hxx>
 #include <Visual3d_View.hxx>
-#include <Visual3d_ViewOrientation.hxx>
 #include <Graphic3d_Structure.hxx>
 #include <Precision.hxx>
 
@@ -343,25 +342,26 @@ void PrsMgr_Presentation3d::Compute(const Handle(Graphic3d_DataStructureManager)
 //purpose  : 
 //=======================================================================
 
-Handle(Prs3d_Projector) PrsMgr_Presentation3d::Projector(const Handle(Graphic3d_DataStructureManager)& aProjector) {
-  Visual3d_ViewOrientation VO = Handle(Visual3d_View)::DownCast(aProjector)->ViewOrientation();
+Handle(Prs3d_Projector) PrsMgr_Presentation3d::Projector(const Handle(Graphic3d_DataStructureManager)& aProjector)
+{
+  const Handle(Graphic3d_Camera)& aCamera = Handle(Visual3d_View)::DownCast (aProjector)->Camera();
+
   Standard_Real DX, DY, DZ,XAt, YAt , ZAt,XUp, YUp, ZUp;
-  VO.ViewReferencePlane().Coord(DX, DY, DZ);
-  VO.ViewReferencePoint().Coord(XAt,YAt,ZAt);
-  VO.ViewReferenceUp().Coord(XUp, YUp, ZUp);
-  Visual3d_ViewMapping VM =  Handle(Visual3d_View)::DownCast(aProjector)->ViewMapping();
-  Standard_Boolean pers = (VM.Projection() == Visual3d_TOP_PERSPECTIVE);
-    Standard_Real focale = 0.0 ;
-  if (pers) {
-    Standard_Real Xrp,Yrp,Zrp,ViewPlane,FrontPlane ;
-    Graphic3d_Vertex Prp = VM.ProjectionReferencePoint() ;
-    Prp.Coord(Xrp,Yrp,Zrp);
-    FrontPlane = VM.FrontPlaneDistance() ;
-    ViewPlane = VM.ViewPlaneDistance() ;
-    focale = FrontPlane + Zrp - ViewPlane ;
-  }
-  Handle(Prs3d_Projector) Proj = new Prs3d_Projector(pers,focale,DX, DY, DZ,XAt, YAt , ZAt,XUp, YUp, ZUp);
-  return Proj;
+  gp_Dir aDir = aCamera->Direction().Reversed();
+  DX = aDir.X(); DY = aDir.Y(); DZ = aDir.Z();
+
+  gp_Pnt anAt = aCamera->Center();
+  XAt = anAt.X(); YAt = anAt.Y(); ZAt = anAt.Z();
+
+  gp_Dir anUp = aCamera->Up();
+  XUp = anUp.X(); YUp = anUp.Y(); ZUp = anUp.Z();
+
+  Standard_Boolean pers = !aCamera->IsOrthographic();
+  Standard_Real focale  =  aCamera->Scale();
+
+  Handle(Prs3d_Projector) aProj = 
+    new Prs3d_Projector(pers, focale, DX, DY, DZ, XAt, YAt, ZAt, XUp, YUp, ZUp);
+  return aProj;
 
 }
 
index 2d2dba5..c19c509 100644 (file)
 //=======================================================================
 
 Select3D_Projector::Select3D_Projector(const Handle(V3d_View)& aViou)
-: myPersp(aViou->Type()==V3d_PERSPECTIVE),
-  myFocus(aViou->Focale()),
-  myView(aViou)
+  : myView (aViou)
 {
-  Standard_Real Xat,Yat,Zat,XUp,YUp,ZUp,DX,DY,DZ;
-  //Standard_Boolean Pers=Standard_False;
-
-  aViou->At(Xat,Yat,Zat);
-  aViou->Up(XUp,YUp,ZUp);
-  aViou->Proj(DX,DY,DZ);
-  gp_Pnt At (Xat,Yat,Zat);
-  gp_Dir Zpers (DX,DY,DZ);
-  gp_Dir Ypers (XUp,YUp,ZUp);
-  gp_Dir Xpers = Ypers.Crossed(Zpers);
-  gp_Ax3 Axe (At, Zpers, Xpers);
-  myScaledTrsf.SetTransformation(Axe);
-  myGTrsf.SetTrsf(myScaledTrsf);
-  Scaled();
-
 }
 
 //=======================================================================
@@ -413,15 +396,46 @@ gp_Lin Select3D_Projector::Shoot
 {
   gp_Lin L;
 
-  if (myPersp) {
-    L = gp_Lin(gp_Pnt(0,0, myFocus),
-              gp_Dir(X,Y,-myFocus));
+  if (!myView.IsNull())
+  {
+    Handle(Graphic3d_Camera) aCamera = myView->Camera();
+
+    Standard_Real aUMin, aVMin, aUMax, aVMax;  
+    aCamera->WindowLimit (aUMin, aVMin, aUMax, aVMax);
+
+    gp_Pnt aPos = aCamera->ConvertView2World (gp_Pnt (X, Y, 1.0));
+    gp_Pnt aEyePos = aCamera->Eye();
+
+    gp_Dir aDir;
+
+    if (aCamera->IsOrthographic())
+    {
+      aDir = aCamera->Direction();
+    }
+    else
+    {
+      aDir = gp_Dir (aPos.X() - aEyePos.X(),
+                     aPos.Y() - aEyePos.Y(), 
+                     aPos.Z() - aEyePos.Z());
+    }
+
+    L = gp_Lin (aPos, aDir);
   }
-  else {
-    L = gp_Lin(gp_Pnt(X,Y,0),
-              gp_Dir(0,0,-1));
+  else
+  {
+     if (myPersp) {
+       L = gp_Lin(gp_Pnt(0,0, myFocus),
+                  gp_Dir(X,Y,-myFocus));
+     }
+     else {
+       L = gp_Lin(gp_Pnt(X,Y,0),
+                  gp_Dir(0,0,-1));
+     }
+
+     Transform(L, myInvTrsf);
   }
-  Transform(L, myInvTrsf);
+
+
   return L;
 }
 
index 0ef0b71..7695c13 100644 (file)
@@ -29,7 +29,6 @@
 #include <gp_Pnt.hxx>
 #include <gp_Dir.hxx>
 #include <gp_Ax3.hxx>
-#include <V3d_PerspectiveView.hxx>
 #include <StdSelect_BRepOwner.hxx>
 
 Handle(Select3D_Projector) StdSelect::GetProjector(const Handle(V3d_View)& aViou)
index dc14b40..407bf23 100644 (file)
@@ -25,7 +25,6 @@
 #include <gp_Ax3.hxx>
 #include <gp_GTrsf.hxx>
 #include <gp_Pln.hxx>
-#include <V3d_PerspectiveView.hxx>
 #include <Select3D_SensitiveEntity.hxx>
 #include <Graphic3d_ArrayOfPolylines.hxx>
 #include <Graphic3d_SequenceOfHClipPlane.hxx>
@@ -436,29 +435,8 @@ Standard_Boolean StdSelect_ViewerSelector3d::UpdateProj(const Handle(V3d_View)&
       mycenter[jmod] = myprevcenter[jmod];
     }
 
-    gp_Dir Zpers (mycoeff[6], mycoeff[7], mycoeff[8]);
-    gp_Dir Ypers (mycoeff[3], mycoeff[4], mycoeff[5]);
-    gp_Dir Xpers = Ypers.Crossed (Zpers);
-    gp_XYZ loc (mycoeff[0], mycoeff[1], mycoeff[2]);
-    gp_Mat matrix;
-    matrix.SetCols (Xpers.XYZ(), Ypers.XYZ(), Zpers.XYZ());
-    gp_Mat matScale (mycoeff[11], 0, 0, 0, mycoeff[12], 0, 0, 0, mycoeff[13]);
-    matrix.Transpose();
-    loc.Multiply (matrix);
-    loc.Reverse ();
-    matrix.Multiply (matScale);
-    gp_GTrsf GT;
-    GT.SetTranslationPart (loc);
-    GT.SetVectorialPart (matrix);
-
-    myprj = new Select3D_Projector (GT, Pers, mycoeff[9]);
-
-    // SAV 08/05/02 : fix for detection problem in a perspective view
-    if (aView->Type() == V3d_PERSPECTIVE)
-      myprj->SetView (aView);
-    // NKV 31/07/07 : fix for detection problem in case of custom matrix
-    else if (aView->ViewOrientation().IsCustomMatrix())
-      myprj->SetView (aView);
+    myprj = new Select3D_Projector (aView);
+
   }
 
   if (Abs (aView->Scale() - mylastzoom) > 1.e-3)
index ae7f51d..a7ff180 100644 (file)
@@ -30,17 +30,6 @@ package V3d
         --          of the 3D Viewer. It provides a set of high level commands
         --          to control the views and viewing modes. This package is
         --          complementary to the Visual3D graphic package.
-        --    Warning
-        -- The CSF_WALKTHROUGH variable enables you to
-        -- manage the perspective of the view in the viewer by
-        -- defining setenv CSF_WALKTHROUGH "Yes".
-        -- If you use the syntax unsetenv
-        -- CSF_WALKTHROUGH, you undefine the variable
-        -- (you make sure that the variable is deactivated). In
-        -- this case, the eye is located outside the 3D bounding
-        -- box of the view. This is the default behavior for
-        -- managing the view perspective.
-
 
 uses
         TColStd,
@@ -170,6 +159,17 @@ is
         --            TOBM_ALWAYS_DISPLAYED     force display of back faces
         --            TOBM_NEVER_DISPLAYED      disable display of back faces
 
+        enumeration StereoDumpOptions is
+            SDO_MONO,
+            SDO_LEFT_EYE,
+            SDO_RIGHT_EYE
+        end StereoDumpOptions;
+        ---Purpose : Options to be used with image dumping.
+        --
+        --            SDO_MONO dump monographic projection for stereo camera
+        --            SDO_LEFT_EYE dump left eye projection for stereo camera
+        --            SDO_RIGHT_EYE dump right eye projection for stereo camera
+
         ------------------------
         ---Category: The classes
         ------------------------
@@ -180,12 +180,6 @@ is
         class View;
         ---Purpose: Provides a set of services common to all types of view.
 
-        class OrthographicView;
-        ---Purpose: Services of an orthogonal view.
-
-        class PerspectiveView;
-        ---Purpose: Services of a perspective view.
-
         class LayerMgr;
         ---Purpose: Services of layer management.
 
diff --git a/src/V3d/V3d_OrthographicView.cdl b/src/V3d/V3d_OrthographicView.cdl
deleted file mode 100644 (file)
index 0c7222f..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
--- Created on: 1992-01-21
--- Created by: GG
--- Copyright (c) 1992-1999 Matra Datavision
--- Copyright (c) 1999-2014 OPEN CASCADE SAS
---
--- This file is part of Open CASCADE Technology software library.
---
--- This library is free software; you can redistribute it and / or modify it
--- under the terms of the GNU Lesser General Public version 2.1 as published
--- by the Free Software Foundation, with special exception defined in the file
--- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
--- distribution for complete text of the license and disclaimer of any warranty.
---
--- Alternatively, this file may be used under the terms of Open CASCADE
--- commercial license or contractual agreement.
-
-class OrthographicView from V3d
-
-        ---Version:
-
-       ---Purpose: Define an orthographic view.
-        --          See the methods of the Class View
-
-        ---Keywords: View,Orthographic
-
-        ---Warning:
-
-        ---References:
-
-
-inherits View from V3d
-
-uses
-
-       Viewer from V3d,
-       PerspectiveView from V3d
-
-is
-
-       Create ( VM : mutable Viewer ) returns mutable OrthographicView; 
-       ---Level : Public
-       ---Purpose: Define an orthographic view in the viewer VM.
-
-       Create ( VM : mutable Viewer ; V : PerspectiveView ) 
-                                       returns mutable OrthographicView; 
-       ---Level : Public
-       ---Purpose: Defines an orthographic view from a Perspective view.
-       --          The parameters of the original view are duplicated
-       --          in the resulting view (Projection,Mapping,Context) .
-       --          The view thus created must be activated in a new
-       --          window.
-
-       Create ( VM : mutable Viewer ; V : OrthographicView ) 
-                                       returns mutable OrthographicView; 
-       ---Level : Public
-       ---Purpose: Defines one orthographic view from another.
-       --          The parameters of the original view are duplicated 
-       --          in the resulting view. (Projection,Mapping,Context) .
-       --          The view thus created must be activated in a new window.
-
-        Copy ( me ) returns mutable OrthographicView from V3d is static;
-       ---Level : Public
-end OrthographicView;
diff --git a/src/V3d/V3d_OrthographicView.cxx b/src/V3d/V3d_OrthographicView.cxx
deleted file mode 100644 (file)
index 3d8f51d..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-// Created by: GG
-// Copyright (c) 1991-1999 Matra Datavision
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and / or modify it
-// under the terms of the GNU Lesser General Public version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-// Modified     25-02-98 : FMN ; PERF.27: Optimization of view creation from an existing view
-
-
-//-Version
-
-//-Design       
-
-//-Warning      
-
-//-References
-
-//-Language     C++ 2.1
-
-// for Test method
-
-// for the class
-#include <V3d_View.hxx>
-#include <V3d_OrthographicView.ixx>
-#include <V3d_PerspectiveView.hxx>
-
-//-Declarations
-
-//-Aliases
-
-//-Global data definitions
-
-//-Constructors
-
-V3d_OrthographicView::V3d_OrthographicView (const Handle(V3d_Viewer)& VM):V3d_View (VM) {
-
-  MyType = V3d_ORTHOGRAPHIC ;
-  MyViewMapping.SetProjection(Visual3d_TOP_PARALLEL) ;
-  SetViewMappingDefault() ;
-  SetViewOrientationDefault() ;
-}
-
-V3d_OrthographicView::V3d_OrthographicView (const Handle(V3d_Viewer)& VM, const Handle(V3d_PerspectiveView)& V):V3d_View (VM,V) {
-
-  MyType = V3d_ORTHOGRAPHIC ;
-  MyViewMapping.SetProjection(Visual3d_TOP_PARALLEL) ;
-  SetZoom(0.1, Standard_True);
-  SetViewMappingDefault() ;
-  SetViewOrientationDefault() ;
-}
-
-V3d_OrthographicView::V3d_OrthographicView (const Handle(V3d_Viewer)& VM, const Handle(V3d_OrthographicView)& V):V3d_View (VM,V) {
-
-  MyType = V3d_ORTHOGRAPHIC ;
-  MyViewMapping.SetProjection(Visual3d_TOP_PARALLEL) ;
-  SetViewMappingDefault() ;
-  SetViewOrientationDefault() ;
-}
-
-Handle(V3d_OrthographicView) V3d_OrthographicView::Copy () const {
-  return new V3d_OrthographicView(this->Viewer(),this);}
diff --git a/src/V3d/V3d_PerspectiveView.cdl b/src/V3d/V3d_PerspectiveView.cdl
deleted file mode 100644 (file)
index ad46871..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
--- Created on: 1992-01-21
--- Created by: GG
--- Copyright (c) 1992-1999 Matra Datavision
--- Copyright (c) 1999-2014 OPEN CASCADE SAS
---
--- This file is part of Open CASCADE Technology software library.
---
--- This library is free software; you can redistribute it and / or modify it
--- under the terms of the GNU Lesser General Public version 2.1 as published
--- by the Free Software Foundation, with special exception defined in the file
--- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
--- distribution for complete text of the license and disclaimer of any warranty.
---
--- Alternatively, this file may be used under the terms of Open CASCADE
--- commercial license or contractual agreement.
-
--- Update:                             
-
-
-class PerspectiveView from V3d
-
-       ---Purpose : Creates and modifies a perspective
-       --           See the methods of the class View  
-
-
-
-inherits View from V3d
-
-
-uses
-
-       Viewer from V3d,
-       OrthographicView from V3d,
-       PlaneAngle from Quantity
-
-raises
-
-        BadValue from V3d
-       
-is
-
-       Create ( VM : mutable Viewer ) returns mutable PerspectiveView;
-       ---Level: Public
-       ---Purpose: Defines a perspective view in a viewer VM.
-       --          The default angle of opening is given
-       --          by the viewer.
-     
-
-       Create ( VM : mutable Viewer ; V : OrthographicView )
-                                       returns mutable PerspectiveView;  
-       ---Level: Public
-       ---Purpose: Creates a perspective view from the parameters 
-       --          of an orthographic view.
-        --          The parameters of the original view are duplicated
-        --          in the resulting view (Projection,Mapping,Context) .
-        --          The view thus created must be activated in a new window.
-       --          The default angle of opening is given
-       --          by the viewer.
-
-
-
-       Create ( VM : mutable Viewer ; V : PerspectiveView ) 
-                                       returns mutable PerspectiveView ; 
-       ---Level: Public
-       ---Purpose: Creates one perspective view from another.
-        --          The parameters of the original view are duplicated
-        --          in the resulting view (Projection,Mapping,Context) .
-        --          The view thus created must be activated in a new window.
-
-        Copy ( me ) returns mutable PerspectiveView from V3d is static;
-       ---Level: Public
-       
-        --------------------------------------------------------
-        ---Category: Methods to modify the status of the view
-        --------------------------------------------------------
-
-       SetAngle ( me : mutable ; Angle : PlaneAngle ) 
-       ---Level: Public
-       ---Purpose: Modifies the angle of opening of the perspective in RADIANS.
-       --          The projection window is resized according to the
-       --          formula :
-       --          TAN(Angle/2) = Size/Length       
-       --              Size expresses the smallest dimension of the window.
-       --              Length expresses the focal length.
-       raises BadValue from V3d
-       ---Purpose:  Warning! raises BadValue from V3d
-       --          if the opening angle is <= 0 or >= PI 
-        is static;
-       
-       Angle ( me ) returns PlaneAngle  is static; 
-       ---Level: Public
-       ---Purpose: Returns the value of the angle of opening.
-
-       SetPerspective ( me : mutable ; Angle : PlaneAngle; 
-                                UVRatio, ZNear, ZFar : Real ) 
-       ---Level: Public
-       ---Purpose: Modifies the viewing perspective volume by given
-       --              angle of opening of the perspective in RADIANS,
-       --      aspect ratio of window width to its height and 
-       --      near and far clipping planes
-       raises BadValue from V3d
-       --          if the opening angle is <= 0 or >= PI or
-    --      the ZNear<0, ZFar<0 or ZNear>=Zfar.
-        is static;
-       
-end PerspectiveView;
diff --git a/src/V3d/V3d_PerspectiveView.cxx b/src/V3d/V3d_PerspectiveView.cxx
deleted file mode 100644 (file)
index 1e469e0..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-// Created by: GG
-// Copyright (c) 1991-1999 Matra Datavision
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and / or modify it
-// under the terms of the GNU Lesser General Public version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-// Modified    07-10-96 : CQ ; correction PRO4522
-// Modified    23-02-98 : FMN ; Replace PI by Standard_PI
-// Modified     25-02-98 : FMN ; PERF.27: Optimisation of view creation from an existing view
-// Modified     02-09-98 : FMN ; Correction problem of angle calculation in V3d_PerspectiveView::Angle(). 
-// Modified     23-11-98 : FMN ; PRO14896: Correction of the management of the perspective (cf Programming Guide)
-//                              If the angle is modified the WindowLimit changes not the focal.
-//             22-12-98 : FMN ; Rename CSF_WALKTHROW into CSF_WALKTHROUGH
-
-// IMP240100       //GG -> Activates WalkThrough model.
-
-
-//-Version
-
-//-Design       
-
-//-Warning      
-
-//-References
-
-//-Language     C++ 2.1
-
-
-// for Test method
-
-// for the class
-#include <V3d_View.hxx>
-#include <V3d_PerspectiveView.ixx>
-#include <Visual3d_View.hxx>
-#include <V3d_BadValue.hxx>
-
-V3d_PerspectiveView::V3d_PerspectiveView (const Handle(V3d_Viewer)& VM):V3d_View (VM,V3d_PERSPECTIVE) {
-  MyViewMapping.SetProjection(Visual3d_TOP_PERSPECTIVE) ;
-  SetAngle(VM->DefaultAngle()) ;       
-//  SetZoom(10.0, Standard_True);
-  SetViewMappingDefault() ;
-  SetViewOrientationDefault() ;
-}
-
-V3d_PerspectiveView::V3d_PerspectiveView (const Handle(V3d_Viewer)& VM, const Handle(V3d_OrthographicView)& V):V3d_View (VM,V,V3d_PERSPECTIVE) {
-  MyViewMapping.SetProjection(Visual3d_TOP_PERSPECTIVE) ;
-  SetAngle(VM->DefaultAngle()) ;       
-//  SetZoom(10.0, Standard_True);
-  SetViewMappingDefault() ;
-  SetViewOrientationDefault() ;
-}
-
-V3d_PerspectiveView::V3d_PerspectiveView (const Handle(V3d_Viewer)& VM, const Handle(V3d_PerspectiveView)& V):V3d_View (VM,V,V3d_PERSPECTIVE) {
-  MyViewMapping.SetProjection(Visual3d_TOP_PERSPECTIVE) ;
-//  SetZoom(10.0, Standard_True);
-  SetViewMappingDefault() ;
-  SetViewOrientationDefault() ;
-}
-
-Handle(V3d_PerspectiveView) V3d_PerspectiveView::Copy() const {
-  return new V3d_PerspectiveView(this->Viewer(),this);}
-
-//-Methods, in order
-
-void V3d_PerspectiveView::SetAngle(const Standard_Real Angle) {
-  
-  Standard_Real focale,Umin,Vmin,Umax,Vmax,Dxv,Dyv,Rap,Xrp,Yrp;     
-
-  V3d_BadValue_Raise_if ( Angle <= 0. || Angle >= M_PI, "V3d_PerspectiveView::SetAngle, bad angle");
-
-  MyViewMapping.WindowLimit(Umin,Vmin,Umax,Vmax) ;
-  Dxv = Abs(Umax - Umin)/2. ; Dyv = Abs(Vmax - Vmin)/2.;
-  focale = Focale();
-  Xrp = (Umin + Umax)/2. ; Yrp = (Vmin + Vmax)/2. ;
-  Rap = Dxv / Dyv;
-  if( Dxv >= Dyv ) {
-      Dyv = Abs(focale * tan(Angle/2.)) ;
-      Dxv = Rap * Dyv;
-  } else {
-      Dxv = Abs(focale * tan(Angle/2.)) ;
-      Dyv = Dxv / Rap;
-  }
-  Umin = Xrp - Dxv ; Umax = Xrp + Dxv ;
-  Vmin = Yrp - Dyv ; Vmax = Yrp + Dyv ;
-  MyViewMapping.SetWindowLimit(Umin,Vmin,Umax,Vmax) ;
-  MyView->SetViewMapping(MyViewMapping) ;
-  ImmediateUpdate();
-}
-
-Standard_Real V3d_PerspectiveView::Angle()const  {
-  
-//  Graphic3d_Vertex Prp ;
-  Standard_Real focale,Umin,Vmin,Umax,Vmax,Dxv,Dyv ;     
-  Standard_Real angle = M_PI ;
-  
-  MyViewMapping.WindowLimit(Umin,Vmin,Umax,Vmax) ;
-  focale = Focale() ;
-  Dxv = (Umax - Umin)/2. ; Dyv = (Vmax - Vmin)/2. ;
-  if( focale > 0. ) {
-    if( Dxv >= Dyv ) {
-      angle = 2.*atan(Dyv/focale) ;
-    } else {
-      angle = 2.*atan(Dxv/focale) ;
-    }
-  }
-  
-  return angle ;
-}
-
-void V3d_PerspectiveView::SetPerspective(const Standard_Real Angle, const Standard_Real UVRatio,
-                                         const Standard_Real ZNear, const Standard_Real ZFar)
-{
-  Standard_Real Umin,Vmin,Umax,Vmax,Yrp,Zrp,du,dv;
-
-  V3d_BadValue_Raise_if ( ZNear <= 0. || ZFar <= 0. || ZNear >= ZFar, "V3d_PerspectiveView::SetPerspective, bad distances");
-  V3d_BadValue_Raise_if ( Angle <= 0. || Angle >= M_PI, "V3d_PerspectiveView::SetAngle, bad angle");
-
-  Graphic3d_Vertex PRP = MyViewMapping.ProjectionReferencePoint() ;
-  Yrp = Zrp = 0.;
-
-  PRP.SetCoord(Zrp, Yrp, Zrp);
-  MyViewMapping.SetProjectionReferencePoint(PRP);
-
-  Standard_Real size = (ZFar - ZNear) / 2.;
-
-  MyViewMapping.SetFrontPlaneDistance(size);
-  MyViewMapping.SetBackPlaneDistance(-size);
-  MyViewMapping.SetViewPlaneDistance(size);
-
-  // recompute window limits by mapping to view plane
-  dv = Abs(ZNear * tan(Angle/2.));
-  du = dv * UVRatio;
-  Umin = -du; Umax = du;
-  Vmin = -dv; Vmax = dv;
-  MyViewMapping.SetWindowLimit(Umin, Vmin, Umax, Vmax);
-
-  MyView->SetViewMapping(MyViewMapping) ;
-  ImmediateUpdate();
-}
index 8b7551f..4aaeff9 100644 (file)
@@ -73,6 +73,8 @@ class View from V3d inherits TShared from MMgt
 uses
 
         -- S3892
+        Pnt                     from gp,
+        Dir                     from gp,
         Ax3                     from gp,
         LayerMgr                from V3d,
         ColorScale              from V3d,
@@ -95,15 +97,15 @@ uses
         TypeOfZclipping                   from V3d,
         TypeOfProjectionModel             from V3d,
         TypeOfBackfacingModel             from V3d,
+        StereoDumpOptions                 from V3d,
         Viewer                            from V3d,
         Light                             from V3d,
         View                              from Visual3d,
-        ViewMapping                       from Visual3d,
-        ViewOrientation                   from Visual3d,
         ContextView                       from Visual3d,
         Vector                            from Graphic3d,
         Vertex                            from Graphic3d,
         Plotter                           from Graphic3d,
+        Camera_Handle                     from Graphic3d,
         Window                            from Aspect,
         PixMap                            from Image,
         BufferType                        from Graphic3d,
@@ -142,10 +144,10 @@ raises
 is
 
         Create ( VM : mutable Viewer; Type : TypeOfView from V3d = V3d_ORTHOGRAPHIC );
-        ---Purpose: Initialises the view.
+        ---Purpose: Initializes the view.
 
-        Create ( VM : mutable Viewer ; V : View from V3d; Type : TypeOfView from V3d = V3d_ORTHOGRAPHIC );
-        ---Purpose: Initialises the view by copying.
+        Create (theVM : mutable Viewer; theView : View from V3d);
+        ---Purpose: Initializes the view by copying.
 
         --------------------------------------------------------
         ---Category: Methods to modify the Status of the view
@@ -401,6 +403,14 @@ is
         returns Boolean from Standard;
          ---Purpose: sets the immediate update mode and returns the previous one.
 
+        SetAutoZFitMode( me : mutable; theMode : Boolean );
+          ---Level: public
+          ---Purpose: sets the auto z-fit mode
+
+        AutoZFitMode( me ) returns Boolean;
+          ---Level: public
+          ---Purpose: returns current auto z-fit mode
+
 
         ---------------------------------------------------
         --           Triedron methods
@@ -783,10 +793,6 @@ is
                 raises BadValue from V3d ;
         --      If the eye, view point, or high point are aligned or confused.
 
-    SetViewOrientation ( me : mutable; VO   : ViewOrientation from Visual3d );
-    ---Level: Public
-    ---Purpose: Modifies the orientation of the view.
-
         SetViewOrientationDefault( me : mutable );
         ---Level: Public
         ---Purpose: Saves the current state of the orientation of the view
@@ -872,13 +878,12 @@ is
                 raises BadValue from V3d ;
         --      If the one of factors <= 0
 
-        FitAll ( me : mutable ; Coef : Coefficient = 0.01;
-                      FitZ: Boolean from Standard = Standard_False; update : Boolean from Standard = Standard_True )
+        FitAll ( me : mutable ; Coef : Coefficient = 0.01; update : Boolean from Standard = Standard_True )
         ---Level: Public
         ---Purpose: Automatic zoom/panning. Objects in the view are visualised
         --          so as to occupy the maximum space while respecting the
         --          margin coefficient and the initial height /width ratio.
-        --          NOTE than the original Z size of the view is NOT modified .
+        --          Fits Z depending on AutoZFit option.
                 raises BadValue from V3d ;
         --      If the margin coefficient is <0 ou >= 1 or
         --      Updates the view
@@ -893,6 +898,10 @@ is
         --      If the margin coefficient is <0 ou or
         --      If No Objects are displayed in the view
 
+        AutoZFit ( me : mutable );
+        ---Level: Public
+        ---Purpose: Automatic z-range fitting with ZFitAll. Works only if myAutoZFit enabled.
+
         DepthFitAll( me : mutable ;   Aspect : Coefficient = 0.01;
                                       Margin : Coefficient = 0.01 );
         ---Level: Public
@@ -931,10 +940,6 @@ is
                 raises BadValue from V3d;
         --              If the ZNear<0, ZFar<0 or ZNear>=Zfar.
 
-    SetViewMapping ( me : mutable; VM   : ViewMapping from Visual3d );
-    ---Level: Public
-    ---Purpose: Modifies the mapping of the view.
-
         SetViewMappingDefault( me : mutable );
         ---Level: Public
         ---Purpose: Saves the current view mapping. This will be the
@@ -1288,42 +1293,17 @@ is
         ---Level: Advanced
         ---Purpose: Returns the associated Visual3d view.
 
-        ViewMapping ( me ) returns ViewMapping from Visual3d is static;
-    ---Level: Advanced
-    ---Purpose: Returns the current mapping of the view.
-
-    ViewOrientation ( me ) returns ViewOrientation from Visual3d is static;
-    ---Level: Advanced
-    ---Purpose: Returns the current orientation of the view.
-
-        ScreenAxis( myclass ; Vpn,Vup        : Vector from Graphic3d ;
+        ScreenAxis( myclass ; Vpn,Vup        : Dir from gp ;
                               Xaxe,Yaxe,Zaxe : out Vector from Graphic3d )
                                         returns Boolean is private ;
         ---Purpose: Determines the screen axes in the reference
         --          framework of the view.
 
-        InitMatrix ( myclass ; Matrix : out Array2OfReal from TColStd ) is private ;
-
-        Multiply( myclass ;
-                 Left, Right : Array2OfReal from TColStd ;
-                 Matrix      : out Array2OfReal from TColStd )
-                 returns Boolean from Standard is private ;
 
-        RotAxis( myclass ; Vrp      : Vertex from Graphic3d ;
-                           Axe      : Vector from Graphic3d ; Angle : PlaneAngle ;
-                           Matrix   : out Array2OfReal from TColStd ) is private ;
-        ---Purpose: Determines the rotation matrice around an axis
-        --          for a given angle.
-
-        TrsPoint( myclass ; P      : Vertex from Graphic3d ;
-                            Matrix : Array2OfReal from TColStd )
-                                returns Vertex from Graphic3d is private ;
-        ---Purpose: Transforms the point P according to the matrice Matrix .
-
-        TrsPoint( myclass ; V : Vector from Graphic3d ;
+        TrsPoint( myclass ; V : Vertex from Graphic3d ;
                                 Matrix : Array2OfReal from TColStd )
-                                returns Vector from Graphic3d is private ;
-        ---Purpose: Transforms the vector V according to the matrice Matrix .
+                                returns Vertex from Graphic3d is private ;
+        ---Purpose: Transforms the Vertex V according to the matrice Matrix .
         
         ImmediateUpdate (me) is static protected;
          ---Purpose: 
@@ -1489,7 +1469,8 @@ is
                    theWidth  : Integer from Standard;
                    theHeight : Integer from Standard;
                    theBufferType : BufferType from Graphic3d = Graphic3d_BT_RGB;
-                   theForceCentered : Boolean from Standard = Standard_True )
+                   theForceCentered : Boolean from Standard = Standard_True;
+                   theStereoOptions : StereoDumpOptions from V3d = V3d_SDO_MONO )
         returns Boolean from Standard;
         ---Level   : Public
         ---Purpose : dump the full contents of the view
@@ -1497,6 +1478,9 @@ is
         --        buffer type <theBufferType>. If <theForceCentered> is true
         --        view scene will be centered.
         --       Pixmap will be automatically (re)allocated when needed.
+        --       For stereographic camera by default the monographic projection
+        --       is used during dumping. <theStereoOptions> flag can be used to
+        --       dump projection for left right eye.
 
     SetProjModel( me : mutable;
         amOdel: TypeOfProjectionModel from V3d = V3d_TPM_SCREEN )
@@ -1576,6 +1560,55 @@ is
      ---Purpose: Get clip planes.
      -- @return sequence clip planes that have been set for the view
 
+    SetCamera (me : mutable; theCamera : Camera_Handle from Graphic3d) is static;
+    ---Level: Public
+    ---Purpose: Change camera used by view.
+
+    Camera (me) returns Camera_Handle from Graphic3d is static;
+    ---Level: Public
+    ---Purpose: Returns camera object of the view.
+    -- @return: handle to camera object, or NULL if 3D view does not use
+    -- the camera approach.
+
+    FitCamera (me : mutable;
+               theXmin : Real from Standard;
+               theYmin : Real from Standard;
+               theZmin : Real from Standard;
+               theXmax : Real from Standard;
+               theYmax : Real from Standard;
+               theZmax : Real from Standard) is protected;
+    ---Level: Protected
+    ---Purpose: Transform camera to fit in the passed bounding box
+    -- specified in world coordinate space.
+    -- @param theXmin [in] x min bounding.
+    -- @param theYmin [in] y min bounding.
+    -- @param theZmin [in] z min bounding.
+    -- @param theXmax [in] x max bounding.
+    -- @param theYmax [in] y max bounding.
+    -- @param theZmax [in] z max bounding.
+
+    ZoomCamera (me : mutable;
+                theUSize : Real from Standard;
+                theVSize : Real from Standard;
+                theZDepth : Real from Standard = 0.0) is protected;
+    ---Level: Protected
+    ---Purpose: Zoom camera to fit the section defined in view coordinate space
+    -- lying on the view direction ray. For orthogonal camera the method
+    -- changes scale, for perspective adjusts Eye location about the Center point.
+    -- Depth by Z defines distance of the zoomed section from camera Center. 
+    -- It is optional and for orthographic camera has no effect.
+    -- @param theUSize [in] size of view section on U axis (horizontal to the screen).
+    -- @param theVSize [in] size of view section on V axis (vertical to the screen).
+    -- @param theZDepth [in] distance from camera center to the specified section.
+
+    PanCamera (me : mutable;
+               theU : Real from Standard;
+               theV : Real from Standard) is protected;
+    ---Level: Protected
+    ---Purpose: Pan camera along the view plane on the passed U, V distances.
+    -- @param theU [in] the horizontal panning.
+    -- @param theV [in] the vertical panning.
+
         SetRaytracingMode (me : mutable) is static;
      ---Level: Public
      ---Purpose: enables OpenCL-based ray-tracing mode
@@ -1610,13 +1643,18 @@ is
 
 fields
 
-        MyType :                TypeOfView from V3d is protected ;
+        myOldMouseX : Real is protected;
+        myOldMouseY : Real is protected;
+        myCamStartOpUp : Dir from gp is protected;
+        myCamStartOpEye : Pnt from gp is protected;
+        myCamStartOpBnd : Real[6] is protected;
+        myCamStartOpCenter : Pnt from gp is protected;
+        myCamera : Camera_Handle from Graphic3d is protected;
+
         MyViewer :              ViewerPointer from V3d ;
         MyActiveLights:         ListOfTransient from V3d;
 
         MyView :                View from Visual3d is protected ;
-        MyViewMapping :         ViewMapping from Visual3d is protected ;
-        MyViewOrientation :     ViewOrientation from Visual3d ;
         MyViewContext :         ContextView from Visual3d ;
         MyBackground:           Background from Aspect ;
         MyGradientBackground:   GradientBackground from Aspect ;
@@ -1654,6 +1692,15 @@ fields
 
         MyTransparencyFlag      : Boolean from Standard;
         myImmediateUpdate: Boolean from Standard is protected;
+
+        myXscreenAxis: Vector from Graphic3d;
+        myYscreenAxis: Vector from Graphic3d;
+        myZscreenAxis: Vector from Graphic3d;
+        myViewAxis: Vector from Graphic3d;
+        myGravityReferencePoint: Vertex from Graphic3d;
+        myCamProjectionShift: Pnt from gp;
+        myAutoZFitMode: Boolean from Standard;
+
 friends
 
         SetViewOn from class Viewer from V3d ( me : mutable ),
index 069065c..ed22690 100644 (file)
@@ -56,7 +56,6 @@ ne marche pas. Contournement en appelant WNT_Window::Size(Int,Int).
 06-11-98 : CAL ; PRO ?????. Probleme dans ZFitAll si un point dans la vue.
 13-06-98 : FMN ; PRO14896: Correction sur la gestion de la perspective (cf Programming Guinde)
 29-OCT-98 : DCB : Adding ScreenCopy () method.
-22-12-98 : FMN ; Rename CSF_WALKTHROW en CSF_WALKTHROUGH
 10-11-99 : GG ; PRO19603 Add Redraw( area ) method
 IMP130100 : GG
 -> Don't increase too much the ZSize.
@@ -78,32 +77,6 @@ To solve the problem (for lack of a better solution) I make 2 passes.
 //GER61351  //GG_15/12/99 Add SetBackgroundColor() and BackgroundColor() methods
 
 
-#define IMP240100 //GG
-//      -> Remove PixToRef() method ,use
-//        instead the equivalent Convert() method.
-//      -> Rename RefToPix() to Convert() method.
-//            -> Remove the grid computation in Convert()
-//        method. Use instead the NEW ConvertToGrid() methods.
-//        Reason is the Convert() method is call by
-//        StdSelect_ViewSelector3d_Pick() from
-//        AIS_InteractiveContext() and it's not possible
-//        to select an object vertex when the grid is active!
-//      -> Remove grid echo marker definition
-//        (reported in the viewer)
-//      -> Add SetProjModel() methods.
-
-#define G004    //VKH 15-11-99
-//      -> Add Dump() methods
-//      -> GG 07/03/00 Use the new MMSize()
-//         method from Aspect_Window class.
-
-#define IMP210200       //GG Add Transparency() method
-
-#define IMP250200 //GG With SetDepth() method, when the requested
-//      depth is < 0.,
-//      move the view ref point and the eye,instead
-//      only the eye.
-
 #define IMP020300 //GG Don't use ZFitAll in during Rotation
 //      for perf improvment
 
@@ -140,21 +113,22 @@ To solve the problem (for lack of a better solution) I make 2 passes.
 #include <Standard_TypeMismatch.hxx>
 #include <Visual3d_ViewManager.hxx>
 #include <Visual3d_Light.hxx>
-#include <Graphic3d_Structure.hxx>
-#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
-#include <Graphic3d_MapOfStructure.hxx>
-#include <Graphic3d_TextureEnv.hxx>
 #include <Image_AlienPixMap.hxx>
 #include <V3d.hxx>
 #include <V3d_View.ixx>
 #include <V3d_BadValue.hxx>
+#include <V3d_StereoDumpOptions.hxx>
 #include <Standard_ShortReal.hxx>
 #include <gp_Dir.hxx>
+#include <gp_Pln.hxx>
 #include <TColStd_Array2OfReal.hxx>
 #include <Visual3d_TransientManager.hxx>
 #include <Precision.hxx>
 
-// S3892
+#include <Graphic3d_Structure.hxx>
+#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
+#include <Graphic3d_MapOfStructure.hxx>
+#include <Graphic3d_TextureEnv.hxx>
 #include <Graphic3d_AspectMarker3d.hxx>
 #include <Graphic3d_GraphicDriver.hxx>
 
@@ -176,99 +150,20 @@ To solve the problem (for lack of a better solution) I make 2 passes.
 * Constant
 */
 
-#define Zmargin 1.
 #define DEUXPI (2. * M_PI)
 
 /*----------------------------------------------------------------------*/
-/*
-* Local data definitions
-*/
-
-
-static Standard_Real MyXwindowCenter ;
-static Standard_Real MyYwindowCenter ;
-static Standard_Real MyWindowWidth ;
-static Standard_Real MyWindowHeight ;
-
-#define LOPTIM
-#ifndef LOPTIM
-static Graphic3d_Vector MyXscreenAxis ;
-static Graphic3d_Vector MyYscreenAxis ;
-static Graphic3d_Vector MyZscreenAxis ;
-static Graphic3d_Vector MyViewReferencePlane ;
-static Graphic3d_Vector MyViewReferenceUp ;
-static Graphic3d_Vector MyViewAxis ;
-static Graphic3d_Vertex MyViewReferencePoint ;
-static Graphic3d_Vertex MyGravityReferencePoint ;
-static Graphic3d_Vertex MyProjReferencePoint ;
-#else
-static Graphic3d_Vector& _MyXscreenAxis() {
-  static Graphic3d_Vector MyXscreenAxis;
-  return MyXscreenAxis;
-}
-#define MyXscreenAxis _MyXscreenAxis()
-
-static Graphic3d_Vector& _MyYscreenAxis() {
-  static Graphic3d_Vector MyYscreenAxis;
-  return MyYscreenAxis;
-}
-#define MyYscreenAxis _MyYscreenAxis()
-
-static Graphic3d_Vector& _MyZscreenAxis() {
-  static Graphic3d_Vector MyZscreenAxis;
-  return MyZscreenAxis;
-}
-#define MyZscreenAxis _MyZscreenAxis()
-
-static Graphic3d_Vector& _MyViewReferencePlane() {
-  static Graphic3d_Vector MyViewReferencePlane;
-  return MyViewReferencePlane;
-}
-#define MyViewReferencePlane _MyViewReferencePlane()
-
-static Graphic3d_Vector& _MyViewReferenceUp() {
-  static Graphic3d_Vector MyViewReferenceUp;
-  return MyViewReferenceUp;
-}
-#define MyViewReferenceUp _MyViewReferenceUp()
-
-static Graphic3d_Vector& _MyViewAxis() {
-  static Graphic3d_Vector MyViewAxis;
-  return MyViewAxis;
-}
-#define MyViewAxis _MyViewAxis()
-
-static Graphic3d_Vertex& _MyViewReferencePoint() {
-  static Graphic3d_Vertex MyViewReferencePoint;
-  return MyViewReferencePoint;
-}
-#define MyViewReferencePoint _MyViewReferencePoint()
-
-static Graphic3d_Vertex& _MyGravityReferencePoint() {
-  static Graphic3d_Vertex MyGravityReferencePoint;
-  return MyGravityReferencePoint;
-}
-#define MyGravityReferencePoint _MyGravityReferencePoint()
-
-static Graphic3d_Vertex& _MyProjReferencePoint() {
-  static Graphic3d_Vertex MyProjReferencePoint;
-  return MyProjReferencePoint;
-}
-#define MyProjReferencePoint _MyProjReferencePoint()
-#endif // LOPTIM
-
-/*----------------------------------------------------------------------*/
 //-Constructors
 
 V3d_View::V3d_View(const Handle(V3d_Viewer)& VM, const V3d_TypeOfView Type ) :
-MyType ( Type ),
-MyProjModel(V3d_TPM_SCREEN),
-MyViewer(VM.operator->()),
-MyActiveLights(),
-MyViewContext (),
-myActiveLightsIterator(),
-SwitchSetFront(Standard_False),
-MyTrsf (1, 4, 1, 4)         // S3892
+  MyProjModel(V3d_TPM_SCREEN),
+  MyViewer(VM.operator->()),
+  MyActiveLights(),
+  MyViewContext (),
+  myActiveLightsIterator(),
+  SwitchSetFront(Standard_False),  
+  MyTrsf (1, 4, 1, 4),
+  myAutoZFitMode (Standard_True)
 {
   myImmediateUpdate = Standard_False;
   MyView = new Visual3d_View(MyViewer->Viewer());
@@ -315,7 +210,7 @@ MyTrsf (1, 4, 1, 4)         // S3892
   else
     MyViewContext.SetBackZClippingOff ();
 
-  // Visualisation and Shading Model
+  // Visualization and Shading Model
   MyViewContext.SetModel ((MyView->Context ()).Model ());
   MyViewContext.SetVisualization ((MyView->Context ()).Visualization ());
 
@@ -324,73 +219,81 @@ MyTrsf (1, 4, 1, 4)         // S3892
   MyViewContext.SetTextureEnv (MyView->Context ().TextureEnv ());
   // } End of retrieval of the definition of ViewContext.
 
-  MyViewMapping = MyView->ViewMapping() ;
-  MyViewOrientation = MyView->ViewOrientation() ;
   MyBackground = VM->GetBackgroundColor() ;
   MyGradientBackground = VM->GetGradientBackground() ;
 
-  SetAxis(0.,0.,0.,1.,1.,1.) ;
-  SetVisualization(VM->DefaultVisualization()) ;
-  SetShadingModel(VM->DefaultShadingModel()) ;
-  SetSurfaceDetail(VM->DefaultSurfaceDetail()) ;
-  SetTwist(0.) ;
-  SetAt(0.,0.,0.) ;
-  SetProj(VM->DefaultViewProj()) ;
-  SetSize(VM->DefaultViewSize()) ;
+  // camera init
+  Handle(Graphic3d_Camera) aCamera = new Graphic3d_Camera();
+  aCamera->SetFOVy (45.0);
+  aCamera->SetIOD (Graphic3d_Camera::IODType_Relative, 0.05);
+  aCamera->SetZFocus (Graphic3d_Camera::FocusType_Relative, 1.0);
+  SetCamera (aCamera);
+
+  SetAxis (0.,0.,0.,1.,1.,1.);
+  SetVisualization (VM->DefaultVisualization());
+  SetShadingModel (VM->DefaultShadingModel());
+  SetSurfaceDetail (VM->DefaultSurfaceDetail());
+  SetTwist (0.);
+  SetAt (0.,0.,0.);
+  SetProj (VM->DefaultViewProj());
+  SetSize (VM->DefaultViewSize());
   Standard_Real zsize = VM->DefaultViewSize();
-  SetZSize(2.*zsize+zsize*Zmargin) ;
-  SetZClippingDepth(0.);
-  SetZClippingWidth(zsize);
-  SetZCueingDepth(0.);
-  SetZCueingWidth(zsize);
-  SetDepth(VM->DefaultViewSize()/2.) ;
-  SetCenter(0.,0.) ;
+  SetZSize (2.*zsize);
+  SetZClippingDepth (0.);
+  SetZClippingWidth (zsize);
+  SetZCueingDepth (0.);
+  SetZCueingWidth (zsize);
+  SetDepth (VM->DefaultViewSize()/2.0);
+  SetCenter (0.,0.);
   SetViewMappingDefault();
-  VM->AddView(this) ;
+  VM->AddView (this);
   Init();
   myImmediateUpdate = Standard_True;
 
-  // S3892
-#ifndef IMP240100
-#endif  //IMP240100
+  aCamera->SetProjectionType ((Type == V3d_ORTHOGRAPHIC)
+    ? Graphic3d_Camera::Projection_Orthographic
+    : Graphic3d_Camera::Projection_Perspective);
 
-#ifdef IMP210200
   MyTransparencyFlag = Standard_False;
-#endif
 }
 
 /*----------------------------------------------------------------------*/
 
-V3d_View::V3d_View(const Handle(V3d_Viewer)& VM,const Handle(V3d_View)& V, const V3d_TypeOfView Type ) :
-MyType ( Type ),
+V3d_View::V3d_View(const Handle(V3d_Viewer)& theVM,const Handle(V3d_View)& theView) :
 MyProjModel(V3d_TPM_SCREEN),
-MyViewer(VM.operator->()),
+MyViewer(theVM.operator->()),
 MyActiveLights(),
 MyViewContext (),
 myActiveLightsIterator(),
 SwitchSetFront(Standard_False),
-MyTrsf (1, 4, 1, 4)                                    // S3892
+MyTrsf (1, 4, 1, 4), 
+myAutoZFitMode (Standard_True)
 {
-  Handle(Visual3d_View) FromView = V->View() ;
+  Handle(Visual3d_View) aFromView = theView->View();
 
   myImmediateUpdate = Standard_False;
-  MyView = new Visual3d_View(MyViewer->Viewer());
+  MyView = new Visual3d_View (MyViewer->Viewer());
 
-  for (V->InitActiveLights();V->MoreActiveLights();V->NextActiveLights()){
-    MyActiveLights.Append(V->ActiveLight());}
+  for (theView->InitActiveLights(); theView->MoreActiveLights(); theView->NextActiveLights())
+  {
+    MyActiveLights.Append (theView->ActiveLight());
+  }
 
-  MyViewContext = FromView->Context() ;
+  MyViewContext = aFromView->Context() ;
 
-  MyViewMapping = FromView->ViewMapping() ;
-  MyViewOrientation = FromView->ViewOrientation() ;
-  MyBackground = FromView->Background() ;
-  MyGradientBackground = FromView->GradientBackground();
+  SetCamera (new Graphic3d_Camera (theView->Camera()));
 
-  MyView->SetContext(MyViewContext) ;
+  MyBackground = aFromView->Background() ;
+  MyGradientBackground = aFromView->GradientBackground();
+
+  MyView->SetContext (MyViewContext) ;
+
+  SetAxis (0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
+
+  theVM->AddView (this);
 
-  SetAxis(0.,0.,0.,1.,1.,1.) ;
-  VM->AddView(this) ;
   Init();
+
   myImmediateUpdate = Standard_True;
 }
 
@@ -412,7 +315,6 @@ void V3d_View::SetMagnify(const Handle(Aspect_Window)& TheWindow,
     MyView->SetWindow(TheWindow) ;
     FitAll(TheWindow,a,b,c,d);
     MyView->SetContext(MyViewContext) ;
-    MyView->SetViewOrientation(MyViewOrientation) ;
     MyView->SetBackground(MyBackground) ;
     MyViewer->SetViewOn(this) ;
     MyWindow = TheWindow;
@@ -435,11 +337,7 @@ void V3d_View::SetWindow(const Handle(Aspect_Window)& TheWindow)
   // particularly in class NIS_View.
   MyWindow = TheWindow;
   // SetWindow carries out SetRatio and modifies
-  // ViewMapping and ViewMappingDefault of MyView.
-  MyViewMapping = MyView->ViewMapping() ;
   MyView->SetContext(MyViewContext) ;
-  MyView->SetViewMapping(MyViewMapping) ;
-  MyView->SetViewOrientation(MyViewOrientation) ;
   MyView->SetBackground(MyBackground) ;
   MyViewer->SetViewOn(this) ;
   MyView->Redraw() ;
@@ -462,10 +360,7 @@ void V3d_View::SetWindow(const Handle(Aspect_Window)&      aWindow,
   // particularly in class NIS_View.
   MyWindow = aWindow;
   MyView->SetWindow(aWindow, aContext, aDisplayCB, aClientData) ;
-  MyViewMapping = MyView->ViewMapping() ;
   MyView->SetContext(MyViewContext) ;
-  MyView->SetViewMapping(MyViewMapping) ;
-  MyView->SetViewOrientation(MyViewOrientation) ;
   MyView->SetBackground(MyBackground) ;
   MyViewer->SetViewOn(this) ;
   MyView->Redraw() ;
@@ -542,7 +437,6 @@ void V3d_View::MustBeResized()
 
   if( MyView->IsDefined() ) {
     MyView->Resized() ;
-    MyViewMapping = MyView->ViewMapping();
     MyView->Redraw();
   }
 }
@@ -651,7 +545,6 @@ void V3d_View::SetAxis(const Standard_Real X, const Standard_Real Y, const Stand
   Nx /= D ; Ny /= D ; Nz /= D ;
   MyDefaultViewPoint.SetCoord(X,Y,Z) ;
   MyDefaultViewAxis.SetCoord(Nx,Ny,Nz) ;
-  MyDefaultViewAxis.Normalize() ;
 }
 
 /*----------------------------------------------------------------------*/
@@ -691,73 +584,78 @@ void V3d_View::SetVisualization(const V3d_TypeOfVisualization Mode)
 void V3d_View::SetFront()
 {
   gp_Ax3 a = MyViewer->PrivilegedPlane();
-  Standard_Real xo,yo,zo,vx,vy,vz,xu,yu,zu;
+  Standard_Real xo, yo, zo, vx, vy, vz, xu, yu, zu;
 
   a.Direction().Coord(vx,vy,vz);
   a.YDirection().Coord(xu,yu,zu);
   a.Location().Coord(xo,yo,zo);
 
+  myCamera->BeginUpdate();
+  myCamera->SetCenter (gp_Pnt (xo, yo, zo));
   if(SwitchSetFront)
-    MyViewOrientation.SetViewReferencePlane(Graphic3d_Vector(-vx,-vy,-vz));
+    myCamera->SetDirection (gp_Dir (vx, vy, vz));
   else
-    MyViewOrientation.SetViewReferencePlane(Graphic3d_Vector(vx,vy,vz));
-
-  SwitchSetFront = !SwitchSetFront;
+    myCamera->SetDirection (gp_Dir (vx, vy, vz).Reversed());
+  myCamera->SetUp (gp_Dir (xu, yu, zu));
 
-  MyViewOrientation.SetViewReferenceUp(Graphic3d_Vector(xu,yu,zu));
-  MyViewOrientation.SetViewReferencePoint(Graphic3d_Vertex(xo,yo,zo));
+  AutoZFit();
+  myCamera->EndUpdate();
 
-  MyView->SetViewOrientation(MyViewOrientation) ;
+  SwitchSetFront = !SwitchSetFront;
 
   ImmediateUpdate();
 }
 
 /*----------------------------------------------------------------------*/
 
-void V3d_View::Rotate(const Standard_Real ax, const Standard_Real ay, const Standard_Real az, const Standard_Boolean Start)
+void V3d_View::Rotate (const Standard_Real ax, 
+                       const Standard_Real ay, 
+                       const Standard_Real az, 
+                       const Standard_Boolean Start)
 {
-  Standard_Real Ax = ax ;
-  Standard_Real Ay = ay ;
-  Standard_Real Az = az ;
-  Graphic3d_Vector Vpn,Vup ;
-  TColStd_Array2OfReal Matrix(0,3,0,3) ;
-  TColStd_Array2OfReal Rmatrix(0,3,0,3) ;
+  Standard_Real Ax = ax;
+  Standard_Real Ay = ay;
+  Standard_Real Az = az;
 
-  if( Ax > 0. ) while ( Ax > DEUXPI ) Ax -= DEUXPI ;
-  else if( Ax < 0. ) while ( Ax < -DEUXPI ) Ax += DEUXPI ;
-  if( Ay > 0. ) while ( Ay > DEUXPI ) Ay -= DEUXPI ;
-  else if( Ay < 0. ) while ( Ay < -DEUXPI ) Ay += DEUXPI ;
-  if( Az > 0. ) while ( Az > DEUXPI ) Az -= DEUXPI ;
-  else if( Az < 0. ) while ( Az < -DEUXPI ) Az += DEUXPI ;
+  if( Ax > 0. ) while ( Ax > DEUXPI ) Ax -= DEUXPI;
+  else if( Ax < 0. ) while ( Ax < -DEUXPI ) Ax += DEUXPI;
+  if( Ay > 0. ) while ( Ay > DEUXPI ) Ay -= DEUXPI;
+  else if( Ay < 0. ) while ( Ay < -DEUXPI ) Ay += DEUXPI;
+  if( Az > 0. ) while ( Az > DEUXPI ) Az -= DEUXPI;
+  else if( Az < 0. ) while ( Az < -DEUXPI ) Az += DEUXPI;
+
+  if (Start)
+  {
+    myCamStartOpUp = myCamera->Up();
+    myCamStartOpEye = myCamera->Eye();
+    myCamStartOpCenter = myCamera->Center();
+  }
+
+  myCamera->BeginUpdate();
+  myCamera->SetUp (myCamStartOpUp);
+  myCamera->SetEye (myCamStartOpEye);
+  myCamera->SetCenter (myCamStartOpCenter);
+
+  // rotate camera around 3 initial axes
+  gp_Dir aBackDir (gp_Vec (myCamStartOpCenter, myCamStartOpEye));
+  gp_Dir aXAxis (myCamStartOpUp.Crossed (aBackDir));
+  gp_Dir aYAxis (aBackDir.Crossed (aXAxis));
+  gp_Dir aZAxis (aXAxis.Crossed (aYAxis));
+
+  gp_Trsf aRot[3], aTrsf;
+  aRot[0].SetRotation (gp_Ax1 (myCamStartOpCenter, aYAxis), -Ax);
+  aRot[1].SetRotation (gp_Ax1 (myCamStartOpCenter, aXAxis), Ay);
+  aRot[2].SetRotation (gp_Ax1 (myCamStartOpCenter, aZAxis), Az);
+  aTrsf.Multiply (aRot[0]);
+  aTrsf.Multiply (aRot[1]);
+  aTrsf.Multiply (aRot[2]);
+
+  myCamera->Transform (aTrsf);
+
+  myCamera->EndUpdate();
+
+  AutoZFit();
 
-  if( Start ) {
-    MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-    MyViewReferencePlane = MyViewOrientation.ViewReferencePlane() ;
-    MyViewReferenceUp = MyViewOrientation.ViewReferenceUp() ;
-    if (!ScreenAxis(MyViewReferencePlane,MyViewReferenceUp,
-      MyXscreenAxis,MyYscreenAxis,MyZscreenAxis))
-      V3d_BadValue::Raise ("V3d_View::Rotate, alignment of Eye,At,Up");
-  }
-
-  InitMatrix(Matrix) ;
-
-  if( Ax != 0. ) RotAxis(MyViewReferencePoint,MyYscreenAxis,-Ax,Matrix);
-  if( Ay != 0. ) {
-    RotAxis(MyViewReferencePoint,MyXscreenAxis,Ay,Rmatrix) ;
-    Multiply(Matrix, Rmatrix, Matrix);
-  }
-  if( Az != 0. ) {
-    RotAxis(MyViewReferencePoint,MyZscreenAxis,Az,Rmatrix) ;
-    Multiply(Matrix, Rmatrix, Matrix);
-  }
-  Vpn = TrsPoint(MyViewReferencePlane,Matrix) ;
-  MyViewOrientation.SetViewReferencePlane(Vpn) ;
-  Vup = TrsPoint(MyViewReferenceUp,Matrix) ;
-  MyViewOrientation.SetViewReferenceUp(Vup) ;
-  MyView->SetViewOrientation(MyViewOrientation) ;
-#ifdef IMP020300
-  SetZSize(0.) ;
-#endif
   ImmediateUpdate();
 }
 
@@ -766,13 +664,10 @@ void V3d_View::Rotate(const Standard_Real ax, const Standard_Real ay, const Stan
 void V3d_View::Rotate(const Standard_Real ax, const Standard_Real ay, const Standard_Real az,
                       const Standard_Real X, const Standard_Real Y, const Standard_Real Z, const Standard_Boolean Start)
 {
+
   Standard_Real Ax = ax ;
   Standard_Real Ay = ay ;
   Standard_Real Az = az ;
-  Graphic3d_Vector Vpn,Vup ;
-  Graphic3d_Vertex Vrp ;
-  TColStd_Array2OfReal Matrix(0,3,0,3) ;
-  TColStd_Array2OfReal Rmatrix(0,3,0,3) ;
 
   if( Ax > 0. ) while ( Ax > DEUXPI ) Ax -= DEUXPI ;
   else if( Ax < 0. ) while ( Ax < -DEUXPI ) Ax += DEUXPI ;
@@ -781,37 +676,41 @@ void V3d_View::Rotate(const Standard_Real ax, const Standard_Real ay, const Stan
   if( Az > 0. ) while ( Az > DEUXPI ) Az -= DEUXPI ;
   else if( Az < 0. ) while ( Az < -DEUXPI ) Az += DEUXPI ;
 
-  if( Start ) {
-    MyGravityReferencePoint.SetCoord(X,Y,Z) ;
-    MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-    MyViewReferencePlane = MyViewOrientation.ViewReferencePlane() ;
-    MyViewReferenceUp = MyViewOrientation.ViewReferenceUp() ;
-    if (!ScreenAxis(MyViewReferencePlane,MyViewReferenceUp,
-      MyXscreenAxis,MyYscreenAxis,MyZscreenAxis))
-      V3d_BadValue::Raise ("V3d_View::Rotate, alignment of Eye,At,Up");
-  }
-
-  InitMatrix(Matrix) ;
-
-  if( Ax != 0. ) RotAxis(MyGravityReferencePoint,MyYscreenAxis,-Ax,Matrix);
-  if( Ay != 0. ) {
-    RotAxis(MyGravityReferencePoint,MyXscreenAxis,Ay,Rmatrix) ;
-    Multiply(Matrix, Rmatrix, Matrix);
-  }
-  if( Az != 0. ) {
-    RotAxis(MyGravityReferencePoint,MyZscreenAxis,Az,Rmatrix) ;
-    Multiply(Matrix, Rmatrix, Matrix);
-  }
-  Vrp = TrsPoint(MyViewReferencePoint,Matrix) ;
-  MyViewOrientation.SetViewReferencePoint(Vrp) ;
-  Vpn = TrsPoint(MyViewReferencePlane,Matrix) ;
-  MyViewOrientation.SetViewReferencePlane(Vpn) ;
-  Vup = TrsPoint(MyViewReferenceUp,Matrix) ;
-  MyViewOrientation.SetViewReferenceUp(Vup) ;
-  MyView->SetViewOrientation(MyViewOrientation) ;
-#ifdef IMP020300
-  SetZSize(0.) ;
-#endif
+  if (Start)
+  {
+    myGravityReferencePoint.SetCoord (X, Y, Z);
+    myCamStartOpUp = myCamera->Up();
+    myCamStartOpEye = myCamera->Eye();
+    myCamStartOpCenter = myCamera->Center();
+  }
+
+  const Graphic3d_Vertex& aVref = myGravityReferencePoint;
+
+  myCamera->BeginUpdate();
+  myCamera->SetUp (myCamStartOpUp);
+  myCamera->SetEye (myCamStartOpEye);
+  myCamera->SetCenter (myCamStartOpCenter);
+
+  // rotate camera around 3 initial axes
+  gp_Pnt aRCenter (aVref.X(), aVref.Y(), aVref.Z());
+
+  gp_Dir aZAxis (myCamera->Direction().Reversed());
+  gp_Dir aYAxis (myCamera->Up());
+  gp_Dir aXAxis (aYAxis.Crossed (aZAxis)); 
+
+  gp_Trsf aRot[3], aTrsf;
+  aRot[0].SetRotation (gp_Ax1 (aRCenter, aYAxis), -Ax);
+  aRot[1].SetRotation (gp_Ax1 (aRCenter, aXAxis), Ay);
+  aRot[2].SetRotation (gp_Ax1 (aRCenter, aZAxis), Az);
+  aTrsf.Multiply (aRot[0]);
+  aTrsf.Multiply (aRot[1]);
+  aTrsf.Multiply (aRot[2]);
+
+  myCamera->Transform (aTrsf);
+  myCamera->EndUpdate();
+
+  AutoZFit();
+
   ImmediateUpdate();
 }
 
@@ -838,42 +737,55 @@ void V3d_View::Rotate(const V3d_TypeOfAxe Axe, const Standard_Real angle,
                       const Standard_Real X, const Standard_Real Y, const Standard_Real Z, const Standard_Boolean Start)
 {
   Standard_Real Angle = angle ;
-  Graphic3d_Vector Vpn,Vup ;
-  Graphic3d_Vertex Vrp ;
-  TColStd_Array2OfReal Matrix(0,3,0,3) ;
 
   if( Angle > 0. ) while ( Angle > DEUXPI ) Angle -= DEUXPI ;
   else if( Angle < 0. ) while ( Angle < -DEUXPI ) Angle += DEUXPI ;
 
-  if( Start ) {
-    MyGravityReferencePoint.SetCoord(X,Y,Z) ;
-    MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-    MyViewReferencePlane = MyViewOrientation.ViewReferencePlane() ;
-    MyViewReferenceUp = MyViewOrientation.ViewReferenceUp() ;
+  if (Start)
+  {
+    myGravityReferencePoint.SetCoord (X, Y, Z);
+    myCamStartOpUp = myCamera->Up();
+    myCamStartOpEye = myCamera->Eye();
+    myCamStartOpCenter = myCamera->Center();
+
     switch (Axe) {
     case V3d_X :
-      MyViewAxis.SetCoord(1.,0.,0.) ;
+      myViewAxis.SetCoord(1.,0.,0.) ;
       break ;
     case V3d_Y :
-      MyViewAxis.SetCoord(0.,1.,0.) ;
+      myViewAxis.SetCoord(0.,1.,0.) ;
       break ;
     case V3d_Z :
-      MyViewAxis.SetCoord(0.,0.,1.) ;
+      myViewAxis.SetCoord(0.,0.,1.) ;
       break ;
     }
+
+    myCamStartOpUp = myCamera->Up();
+    myCamStartOpEye = myCamera->Eye();
+    myCamStartOpCenter = myCamera->Center();
   }
 
-  RotAxis(MyGravityReferencePoint,MyViewAxis,Angle,Matrix) ;
-  Vrp = TrsPoint(MyViewReferencePoint,Matrix) ;
-  MyViewOrientation.SetViewReferencePoint(Vrp) ;
-  Vpn = TrsPoint(MyViewReferencePlane,Matrix) ;
-  MyViewOrientation.SetViewReferencePlane(Vpn) ;
-  Vup = TrsPoint(MyViewReferenceUp,Matrix) ;
-  MyViewOrientation.SetViewReferenceUp(Vup) ;
-  MyView->SetViewOrientation(MyViewOrientation) ;
-#ifdef IMP020300
-  SetZSize(0.) ;
-#endif
+  const Graphic3d_Vertex& aVref = myGravityReferencePoint;
+
+  myCamera->BeginUpdate();
+  myCamera->SetUp (myCamStartOpUp);
+  myCamera->SetEye (myCamStartOpEye);
+  myCamera->SetCenter (myCamStartOpCenter);
+
+  // rotate camera around passed axis
+  gp_Trsf aRotation;
+  gp_Pnt aRCenter (aVref.X(), aVref.Y(), aVref.Z());
+  gp_Dir aRAxis ((Axe == V3d_X) ? 1.0 : 0.0,
+                  (Axe == V3d_Y) ? 1.0 : 0.0,
+                  (Axe == V3d_Z) ? 1.0 : 0.0);
+
+  aRotation.SetRotation (gp_Ax1 (aRCenter, aRAxis), Angle);
+  myCamera->Transform (aRotation);
+
+  myCamera->EndUpdate();
+
+  AutoZFit();
+
   ImmediateUpdate();
 }
 
@@ -881,33 +793,35 @@ void V3d_View::Rotate(const V3d_TypeOfAxe Axe, const Standard_Real angle,
 
 void V3d_View::Rotate(const Standard_Real angle, const Standard_Boolean Start)
 {
-  Standard_Real Angle = angle ;
-  Graphic3d_Vector Vpn,Vup ;
-  TColStd_Array2OfReal Matrix(0,3,0,3) ;
+  Standard_Real Angle = angle;
 
   if( Angle > 0. ) while ( Angle > DEUXPI ) Angle -= DEUXPI ;
   else if( Angle < 0. ) while ( Angle < -DEUXPI ) Angle += DEUXPI ;
 
   if( Start ) {
-    MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-    MyViewReferencePlane = MyViewOrientation.ViewReferencePlane() ;
-    MyViewReferenceUp = MyViewOrientation.ViewReferenceUp() ;
+    myCamStartOpUp = myCamera->Up();
+    myCamStartOpEye = myCamera->Eye();
+    myCamStartOpCenter = myCamera->Center();
   }
 
-  RotAxis(MyDefaultViewPoint,MyDefaultViewAxis,Angle,Matrix) ;
-#ifdef BUC60952
-  Graphic3d_Vertex Vrp ;
-  Vrp = TrsPoint(MyViewReferencePoint,Matrix) ;
-  MyViewOrientation.SetViewReferencePoint(Vrp) ;
-#endif
-  Vpn = TrsPoint(MyViewReferencePlane,Matrix) ;
-  MyViewOrientation.SetViewReferencePlane(Vpn) ;
-  Vup = TrsPoint(MyViewReferenceUp,Matrix) ;
-  MyViewOrientation.SetViewReferenceUp(Vup) ;
-  MyView->SetViewOrientation(MyViewOrientation) ;
-#ifdef IMP020300
-  SetZSize(0.) ;
-#endif
+  const Graphic3d_Vertex& aPnt = MyDefaultViewPoint;
+  const Graphic3d_Vector& anAxis = MyDefaultViewAxis;
+
+  myCamera->BeginUpdate();
+  myCamera->SetUp (myCamStartOpUp);
+  myCamera->SetEye (myCamStartOpEye);
+  myCamera->SetCenter (myCamStartOpCenter);
+
+  gp_Trsf aRotation;
+  gp_Pnt aRCenter (aPnt.X(), aPnt.Y(), aPnt.Z());
+  gp_Dir aRAxis (anAxis.X(), anAxis.Y(), anAxis.Z());
+  aRotation.SetRotation (gp_Ax1 (aRCenter, aRAxis), Angle);
+  myCamera->Transform (aRotation);
+
+  myCamera->EndUpdate();
+
+  AutoZFit();
+
   ImmediateUpdate();
 }
 
@@ -915,14 +829,9 @@ void V3d_View::Rotate(const Standard_Real angle, const Standard_Boolean Start)
 
 void V3d_View::Turn(const Standard_Real ax, const Standard_Real ay, const Standard_Real az, const Standard_Boolean Start)
 {
-  Standard_Real Ax = ax ;
-  Standard_Real Ay = ay ;
-  Standard_Real Az = az ;
-  Graphic3d_Vertex Vrp,Eye ;
-  Graphic3d_Vector Vpn,Vup ;
-  Standard_Real Xrp,Yrp,Zrp,Xpn,Ypn,Zpn,Xat,Yat,Zat,Xeye,Yeye,Zeye ;
-  TColStd_Array2OfReal Matrix(0,3,0,3) ;
-  TColStd_Array2OfReal Rmatrix(0,3,0,3) ;
+  Standard_Real Ax = ax;
+  Standard_Real Ay = ay;
+  Standard_Real Az = az;
 
   if( Ax > 0. ) while ( Ax > DEUXPI ) Ax -= DEUXPI ;
   else if( Ax < 0. ) while ( Ax < -DEUXPI ) Ax += DEUXPI ;
@@ -932,50 +841,36 @@ void V3d_View::Turn(const Standard_Real ax, const Standard_Real ay, const Standa
   else if( Az < 0. ) while ( Az < -DEUXPI ) Az += DEUXPI ;
 
   if( Start ) {
-    MyProjReferencePoint = MyViewMapping.ProjectionReferencePoint();
-    MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-    MyViewReferencePlane = MyViewOrientation.ViewReferencePlane() ;
-    MyViewReferenceUp = MyViewOrientation.ViewReferenceUp() ;
-    if (!ScreenAxis(MyViewReferencePlane,MyViewReferenceUp,
-      MyXscreenAxis,MyYscreenAxis,MyZscreenAxis))
-      V3d_BadValue::Raise ("V3d_View::Turn, alignment of Eye,At,Up");
-  }
-
-  InitMatrix(Matrix) ;
-  MyProjReferencePoint.Coord(Xrp,Yrp,Zrp) ;
-  MyViewReferencePoint.Coord(Xat,Yat,Zat) ;
-  MyViewReferencePlane.Coord(Xpn,Ypn,Zpn) ;
-  Xeye = Zrp*Xpn + Xat ; Yeye = Zrp*Ypn + Yat ; Zeye = Zrp*Zpn + Zat ;
-  Eye.SetCoord(Xeye,Yeye,Zeye) ;
-  if( Ax != 0. ) RotAxis(Eye,MyYscreenAxis,-Ax,Matrix) ;
-  if( Ay != 0. ) {
-    RotAxis(Eye,MyXscreenAxis,Ay,Rmatrix) ;
-    Multiply(Matrix, Rmatrix, Matrix);
-  }
-  if( Az != 0. ) {
-    RotAxis(Eye,MyZscreenAxis,Az,Rmatrix) ;
-    Multiply(Matrix, Rmatrix, Matrix);
-  }
-  Vrp = TrsPoint(MyViewReferencePoint,Matrix) ;
-  MyViewOrientation.SetViewReferencePoint(Vrp) ;
-  Vpn = TrsPoint(MyViewReferencePlane,Matrix) ;
-  MyViewOrientation.SetViewReferenceUp(Vpn) ;
-  Vup = TrsPoint(MyViewReferenceUp,Matrix) ;
-  MyViewOrientation.SetViewReferenceUp(Vup) ;
-  MyView->SetViewOrientation(MyViewOrientation) ;
-#ifdef IMP020300
-  SetZSize(0.) ;
-#else
-  // Check ZClipping planes
-  Standard_Real Zmax ;
-  Vrp.Coord(Xat,Yat,Zat) ;
-  Zmax = Sqrt( Xat*Xat + Yat*Yat + Zat*Zat) ;
-  if( Zmax > MyViewMapping.FrontPlaneDistance() &&
-    MyProjModel == V3d_TPM_SCREEN ) {
-      SetZSize(2.*Zmax+Zmax*Zmargin) ;
-    }
-#endif
-    ImmediateUpdate();
+    myCamStartOpUp = myCamera->Up();
+    myCamStartOpEye = myCamera->Eye();
+    myCamStartOpCenter = myCamera->Center();
+  }
+
+  myCamera->BeginUpdate();
+  myCamera->SetUp (myCamStartOpUp);
+  myCamera->SetEye (myCamStartOpEye);
+  myCamera->SetCenter (myCamStartOpCenter);
+
+  // rotate camera around 3 initial axes
+  gp_Pnt aRCenter = myCamera->Eye();
+  gp_Dir aZAxis (myCamera->Direction().Reversed());
+  gp_Dir aYAxis (myCamera->Up());
+  gp_Dir aXAxis (aYAxis.Crossed (aZAxis)); 
+
+  gp_Trsf aRot[3], aTrsf;
+  aRot[0].SetRotation (gp_Ax1 (aRCenter, aYAxis), -Ax);
+  aRot[1].SetRotation (gp_Ax1 (aRCenter, aXAxis), Ay);
+  aRot[2].SetRotation (gp_Ax1 (aRCenter, aZAxis), Az);
+  aTrsf.Multiply (aRot[0]);
+  aTrsf.Multiply (aRot[1]);
+  aTrsf.Multiply (aRot[2]);
+
+  myCamera->Transform (aTrsf);
+  myCamera->EndUpdate();
+
+  AutoZFit();
+
+  ImmediateUpdate();
 }
 
 /*----------------------------------------------------------------------*/
@@ -998,197 +893,133 @@ void V3d_View::Turn(const V3d_TypeOfAxe Axe, const Standard_Real angle, const St
 void V3d_View::Turn(const Standard_Real angle, const Standard_Boolean Start)
 {
   Standard_Real Angle = angle ;
-  Graphic3d_Vertex Vrp,Eye ;
-  Graphic3d_Vector Vpn,Vup ;
-  Standard_Real Xrp,Yrp,Zrp,Xpn,Ypn,Zpn,Xat,Yat,Zat,Xeye,Yeye,Zeye ;
-  TColStd_Array2OfReal Matrix(0,3,0,3) ;
 
   if( Angle > 0. ) while ( Angle > DEUXPI ) Angle -= DEUXPI ;
   else if( Angle < 0. ) while ( Angle < -DEUXPI ) Angle += DEUXPI ;
 
   if( Start ) {
-    MyProjReferencePoint = MyViewMapping.ProjectionReferencePoint();
-    MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-    MyViewReferencePlane = MyViewOrientation.ViewReferencePlane() ;
-    MyViewReferenceUp = MyViewOrientation.ViewReferenceUp() ;
-  }
-  MyProjReferencePoint.Coord(Xrp,Yrp,Zrp) ;
-  MyViewReferencePoint.Coord(Xat,Yat,Zat) ;
-  MyViewReferencePlane.Coord(Xpn,Ypn,Zpn) ;
-  Xeye = Zrp*Xpn + Xat ; Yeye = Zrp*Ypn + Yat ; Zeye = Zrp*Zpn + Zat ;
-  Eye.SetCoord(Xeye,Yeye,Zeye) ;
-  RotAxis(Eye,MyDefaultViewAxis,Angle,Matrix) ;
-  Vrp = TrsPoint(MyViewReferencePoint,Matrix) ;
-  MyViewOrientation.SetViewReferencePoint(Vrp) ;
-  Vpn = TrsPoint(MyViewReferencePlane,Matrix) ;
-  MyViewOrientation.SetViewReferencePlane(Vpn) ;
-  Vup = TrsPoint(MyViewReferenceUp,Matrix) ;
-  MyViewOrientation.SetViewReferenceUp(Vup) ;
-  MyView->SetViewOrientation(MyViewOrientation) ;
-#ifdef IMP020300
-  SetZSize(0.) ;
-#else
-  // Check ZClipping planes
-  Standard_Real Zmax ;
-  Vrp.Coord(Xat,Yat,Zat) ;
-  Zmax = Sqrt( Xat*Xat + Yat*Yat + Zat*Zat ) ;
-  if( Zmax > MyViewMapping.FrontPlaneDistance() &&
-    MyProjModel == V3d_TPM_SCREEN ) {
-      SetZSize(2.*Zmax+Zmax*Zmargin) ;
-    }
-#endif
-    ImmediateUpdate();
+    myCamStartOpUp = myCamera->Up();
+    myCamStartOpEye = myCamera->Eye();
+    myCamStartOpCenter = myCamera->Center();
+  }
+
+  myCamera->BeginUpdate();
+  myCamera->SetUp (myCamStartOpUp);
+  myCamera->SetEye (myCamStartOpEye);
+  myCamera->SetCenter (myCamStartOpCenter);
+
+  const Graphic3d_Vector& anAxis = MyDefaultViewAxis;
+
+  gp_Trsf aRotation;
+  gp_Pnt aRCenter = myCamera->Eye();
+  gp_Dir aRAxis (anAxis.X(), anAxis.Y(), anAxis.Z());
+  aRotation.SetRotation (gp_Ax1 (aRCenter, aRAxis), Angle);
+  myCamera->Transform (aRotation);
+
+  myCamera->EndUpdate();
+
+  AutoZFit();
+
+  ImmediateUpdate();
 }
 
 void V3d_View::SetTwist(const Standard_Real angle)
 {
   Standard_Real Angle = angle ;
-  TColStd_Array2OfReal Matrix(0,3,0,3) ;
-  Standard_Boolean TheStatus ;
+  Standard_Boolean TheStatus;
 
   if( Angle > 0. ) while ( Angle > DEUXPI ) Angle -= DEUXPI ;
   else if( Angle < 0. ) while ( Angle < -DEUXPI ) Angle += DEUXPI ;
 
-  MyViewReferencePlane = MyViewOrientation.ViewReferencePlane() ;
-  MyViewReferenceUp.SetCoord(0.,0.,1.) ;
-  TheStatus = ScreenAxis(MyViewReferencePlane,MyViewReferenceUp,
-    MyXscreenAxis,MyYscreenAxis,MyZscreenAxis) ;
+  gp_Dir aReferencePlane (myCamera->Direction().Reversed());
+  gp_Dir anUp;
+
+  anUp = gp_Dir (0.0, 0.0, 1.0);
+
+  TheStatus = ScreenAxis(aReferencePlane, anUp,
+    myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
   if( !TheStatus ) {
-    MyViewReferenceUp.SetCoord(0.,1.,0.) ;
-    TheStatus = ScreenAxis(MyViewReferencePlane,MyViewReferenceUp,
-      MyXscreenAxis,MyYscreenAxis,MyZscreenAxis) ;
+    anUp = gp_Dir (0.0, 1.0, 0.0);
+    TheStatus = ScreenAxis(aReferencePlane, anUp,
+      myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
   }
   if( !TheStatus ) {
-    MyViewReferenceUp.SetCoord(1.,0.,0.) ;
-    TheStatus = ScreenAxis(MyViewReferencePlane,MyViewReferenceUp,
-      MyXscreenAxis,MyYscreenAxis,MyZscreenAxis) ;
+    anUp = gp_Dir (1.0, 0.0, 0.0);
+    TheStatus = ScreenAxis(aReferencePlane, anUp,
+      myXscreenAxis,myYscreenAxis,myZscreenAxis) ;
   }
 
   V3d_BadValue_Raise_if( !TheStatus,"V3d_ViewSetTwist, alignment of Eye,At,Up,");
+  
+  gp_Pnt aRCenter = myCamera->Center();
+  gp_Dir aZAxis (myCamera->Direction().Reversed());
+
+  gp_Trsf aTrsf;
+  aTrsf.SetRotation (gp_Ax1 (aRCenter, aZAxis), Angle);
+
+  Standard_Real myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ;
+  myYscreenAxis.Coord (myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ);
+    
+  myCamera->BeginUpdate();
+  myCamera->SetUp (gp_Dir (myYscreenAxisX, myYscreenAxisY, myYscreenAxisZ));
+  myCamera->Transform (aTrsf);
+  myCamera->EndUpdate();
+
+  AutoZFit();
 
-  MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-  RotAxis(MyViewReferencePoint,MyZscreenAxis,Angle,Matrix) ;
-  MyViewReferenceUp = TrsPoint(MyYscreenAxis,Matrix) ;
-  MyViewOrientation.SetViewReferenceUp(MyViewReferenceUp) ;
-  MyView->SetViewOrientation(MyViewOrientation) ;
   ImmediateUpdate();
 }
 
-#ifdef IMP240100
-void V3d_View::SetProjModel( const V3d_TypeOfProjectionModel aModel )
+void V3d_View::SetAutoZFitMode (Standard_Boolean theMode)
 {
-  MyProjModel = aModel;
+  myAutoZFitMode = theMode;
 }
 
-V3d_TypeOfProjectionModel V3d_View::ProjModel() const
+Standard_Boolean V3d_View::AutoZFitMode () const
 {
-  return MyProjModel;
+  return myAutoZFitMode;
 }
-#endif
 
 void V3d_View::SetEye(const Standard_Real X,const Standard_Real Y,const Standard_Real Z)
 {
-  Standard_Real Angle,Xat,Yat,Zat,Xrp,Yrp,Zrp,Xpn,Ypn,Zpn ;
-  Angle = Twist() ;
-  MyProjReferencePoint = MyViewMapping.ProjectionReferencePoint() ;
-  MyProjReferencePoint.Coord(Xrp,Yrp,Zrp) ;
-  MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-  MyViewReferencePoint.Coord(Xat,Yat,Zat) ;
-  MyViewReferenceUp = MyViewOrientation.ViewReferenceUp() ;
-  Xpn = X - Xat ; Ypn = Y - Yat ; Zpn = Z - Zat ;
-  Zrp = Sqrt(Xpn*Xpn + Ypn*Ypn + Zpn*Zpn) ;
-  V3d_BadValue_Raise_if( Zrp <= 0. , "V3d_View::SetEye:: Eye,At are Confused");
-
-  Xpn /= Zrp ; Ypn /= Zrp ; Zpn /= Zrp ;
-  MyViewReferencePlane.SetCoord(Xpn,Ypn,Zpn) ;
-  MyViewOrientation.SetViewReferencePlane(MyViewReferencePlane) ;
-  MyProjReferencePoint.SetCoord(Xrp,Yrp,Zrp) ;
-  MyViewMapping.SetProjectionReferencePoint(MyProjReferencePoint);
+  Standard_Real Angle;
+  Angle = Twist();
+
+  myCamera->SetEye (gp_Pnt (X, Y, Z));
 
   Standard_Boolean update = myImmediateUpdate;
   myImmediateUpdate = Standard_False;
-  if( MyProjModel == V3d_TPM_WALKTHROUGH ) {
-    //FMN desactivation temp SetTwist(Angle) ;
-    // Set infos.
-    MyView->SetViewOrientation(MyViewOrientation) ;
-    MyView->SetViewMapping(MyViewMapping) ;
-  } else {
-    SetTwist(Angle) ;
-  }
-#ifdef IMP020300
-  SetZSize(0.) ;
-#else
-  // Check ZClipping planes
-  Standard_Real Zmax = Sqrt( X*X + Y*Y + Z*Z ) ;
-  if( Zmax > MyViewMapping.FrontPlaneDistance() &&
-    MyProjModel == V3d_TPM_SCREEN ) {
-      SetZSize(2.*Zmax+Zmax*Zmargin) ;
-    } else {
-      if( MyType == V3d_PERSPECTIVE ) SetFocale(focale) ;
-      MyView->SetViewMapping(MyViewMapping);
-    }
-#endif
-    myImmediateUpdate = update;
-    ImmediateUpdate();
+
+  SetTwist(Angle);
+
+  AutoZFit();
+
+  myImmediateUpdate = update;
+  ImmediateUpdate();
 }
 
 void V3d_View::SetDepth(const Standard_Real Depth)
 {
-  Standard_Real Xrp,Yrp,Zrp ;
-#ifdef IMP250200
-  V3d_BadValue_Raise_if( Depth == 0. ,"V3d_View::SetDepth, bad depth");
-#else
-  V3d_BadValue_Raise_if( Depth <= 0. ,"V3d_View::SetDepth, bad depth");
-#endif
+  V3d_BadValue_Raise_if (Depth == 0. ,"V3d_View::SetDepth, bad depth");
 
-  MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-  MyViewReferencePlane = MyViewOrientation.ViewReferencePlane() ;
-  MyProjReferencePoint = MyViewMapping.ProjectionReferencePoint() ;
-  MyProjReferencePoint.Coord(Xrp,Yrp,Zrp) ;
-#ifdef IMP250200
   if( Depth > 0. )
-#endif
   {
-    Zrp = Depth;
-    MyProjReferencePoint.SetCoord(Xrp,Yrp,Zrp) ;
-    MyViewMapping.SetProjectionReferencePoint(MyProjReferencePoint);
-  }
-
-  // Check ZClipping planes
-  Standard_Real Xat,Yat,Zat,Xpn,Ypn,Zpn,Xeye,Yeye,Zeye ;
-  MyViewReferencePoint.Coord(Xat,Yat,Zat) ;
-  MyViewReferencePlane.Coord(Xpn,Ypn,Zpn) ;
-#ifdef IMP250200
-  if( Depth < 0. ) {  // Move the view ref point instead of the eye.
-    Xeye = Xpn*Zrp + Xat ; Yeye = Ypn*Zrp + Yat ; Zeye = Zpn*Zrp + Zat ;
-    Zrp = Abs(Depth) ;
-    Xat = Xeye - Xpn*Zrp ; Yat = Yeye - Ypn*Zrp ; Zat = Zeye - Zpn*Zrp;
-    MyViewReferencePoint.SetCoord(Xat,Yat,Zat) ;
-    MyProjReferencePoint.SetCoord(Xrp,Yrp,Zrp) ;
-    MyViewOrientation.SetViewReferencePoint(MyViewReferencePoint) ;
-    MyView->SetViewOrientation(MyViewOrientation);
+    // Move eye using center (target) as anchor.
+    myCamera->SetDistance (Depth);
+  }
+  else
+  { 
+    // Move the view ref point instead of the eye.
+    gp_Vec aDir (myCamera->Direction());
+    gp_Pnt aCameraEye = myCamera->Eye();
+    gp_Pnt aCameraCenter = aCameraEye.Translated (aDir.Multiplied (Abs (Depth)));      
+      
+    myCamera->SetCenter (aCameraCenter);
   }
-#endif
-#ifdef IMP020300
-  MyView->SetViewMapping(MyViewMapping) ;
-  SetZSize(0.) ;
-#else
-  Xeye = Xpn*Zrp + Xat ; Yeye = Ypn*Zrp + Yat ; Zeye = Zpn*Zrp + Zat ;
-  Standard_Real Zmax = Sqrt( Xeye*Xeye + Yeye*Yeye + Zeye*Zeye );
-
-  if( Zmax > MyViewMapping.FrontPlaneDistance() &&
-    MyProjModel == V3d_TPM_SCREEN ) {
-      SetZSize(2.*Zmax+Zmax*Zmargin) ;
-    } else {
-      if( MyType == V3d_PERSPECTIVE ) SetFocale(focale) ;
-#ifdef IMP250200
-      if( Depth > 0. )
-#endif
-        MyView->SetViewMapping(MyViewMapping) ;
-    }
-#endif
 
-    ImmediateUpdate();
+  AutoZFit();
+
+  ImmediateUpdate();
 }
 
 
@@ -1199,99 +1030,66 @@ void V3d_View::SetProj( const Standard_Real Vx,const Standard_Real Vy, const Sta
   V3d_BadValue_Raise_if( Sqrt(Vx*Vx + Vy*Vy + Vz*Vz) <= 0.,
     "V3d_View::SetProj, null projection vector");
 
-  Angle = Twist() ;
-  MyViewReferencePlane.SetCoord(Vx,Vy,Vz) ;
-  MyViewReferencePlane.Normalize() ;
-  MyViewOrientation.SetViewReferencePlane(MyViewReferencePlane) ;
+  Angle = Twist();
+
+  myCamera->SetDirection (gp_Dir (Vx, Vy, Vz).Reversed());
+
   Standard_Boolean update = myImmediateUpdate;
   myImmediateUpdate = Standard_False;
+
   if( MyProjModel == V3d_TPM_SCREEN ) SetTwist(Angle) ;
-#ifdef IMP020300
-  SetZSize(0.) ;
-#endif
+
+  AutoZFit();
+
   myImmediateUpdate = update;
   ImmediateUpdate();
 }
 
 void V3d_View::SetProj( const V3d_TypeOfOrientation Orientation )
 {
-  MyViewReferencePlane = V3d::GetProjAxis(Orientation) ;
-  MyViewOrientation.SetViewReferencePlane(MyViewReferencePlane) ;
-  // MSV 14.03.2007: reset ViewReferencePoint to debug LH3D14955
-  MyViewOrientation.SetViewReferencePoint(Graphic3d_Vertex (0.0f, 0.0f, 0.0f));
   Standard_Real Xpn=0;
   Standard_Real Ypn=0;
   Standard_Real Zpn=0;
 
   switch (Orientation) {
   case V3d_Zpos :
-    Ypn = 1. ;
-    break ;
+    Ypn = 1.;
+    break;
   case V3d_Zneg :
-    Ypn = -1. ;
-    break ;
+    Ypn = -1.;
+    break;
   default:
     Zpn = 1.;
   }
-  SetUp(Xpn,Ypn,Zpn);
-#ifdef IMP020300
-  SetZSize(0.) ;
-#endif
+
+  const Graphic3d_Vector& aBck = V3d::GetProjAxis (Orientation);
+  myCamera->BeginUpdate();
+  myCamera->SetCenter (gp_Pnt (0, 0, 0));
+  myCamera->SetDirection (gp_Dir (aBck.X(), aBck.Y(), aBck.Z()).Reversed());
+  myCamera->SetUp (gp_Dir (Xpn, Ypn, Zpn));
+  myCamera->EndUpdate();
+
+  AutoZFit();
+
   ImmediateUpdate();
 }
 
 void V3d_View::SetAt(const Standard_Real X,const Standard_Real Y,const Standard_Real Z)
 {
-  Standard_Real Angle,Xrp,Yrp,Zrp,Xpn,Ypn,Zpn,Xat,Yat,Zat ;
-  Standard_Real Xeye,Yeye,Zeye ;
-
-  Angle = Twist() ;
-  MyProjReferencePoint = MyViewMapping.ProjectionReferencePoint() ;
-  MyProjReferencePoint.Coord(Xrp,Yrp,Zrp) ;
-  MyViewReferencePlane = MyViewOrientation.ViewReferencePlane() ;
-  MyViewReferencePlane.Coord(Xpn,Ypn,Zpn) ;
-  MyViewReferencePoint = MyViewOrientation.ViewReferencePoint() ;
-  MyViewReferencePoint.Coord(Xat,Yat,Zat) ;
-  Xeye = Zrp*Xpn + Xat ; Yeye = Zrp*Ypn + Yat ; Zeye = Zrp*Zpn + Zat ;
-  Xpn = Xeye - X ; Ypn = Yeye - Y ; Zpn = Zeye - Z ;
-  Zrp = Sqrt(Xpn*Xpn + Ypn*Ypn + Zpn*Zpn) ;
-  V3d_BadValue_Raise_if( Zrp <= 0.,
-    "V3d_View::SetAt, Eye,At are Confused");
-
-  Xpn /= Zrp ; Ypn /= Zrp ; Zpn /= Zrp ;
-  MyViewReferencePoint.SetCoord(X,Y,Z) ;
-  MyViewOrientation.SetViewReferencePoint(MyViewReferencePoint) ;
-  MyViewReferencePlane.SetCoord(Xpn,Ypn,Zpn) ;
-  MyViewOrientation.SetViewReferencePlane(MyViewReferencePlane) ;
-  MyProjReferencePoint.SetCoord(Xrp,Yrp,Zrp) ;
-  MyViewMapping.SetProjectionReferencePoint(MyProjReferencePoint);
+  Standard_Real Angle;
+
+  Angle = Twist();
+
+  myCamera->SetCenter (gp_Pnt (X, Y, Z));
   Standard_Boolean update = myImmediateUpdate;
   myImmediateUpdate = Standard_False;
-  if( MyProjModel == V3d_TPM_WALKTHROUGH ) {
-    //FMN desactivation temp SetTwist(Angle) ;
-    // Set infos.
-    MyView->SetViewOrientation(MyViewOrientation) ;
-    MyView->SetViewMapping(MyViewMapping) ;
-  } else {
-    SetTwist(Angle) ;
-  }
-#ifdef IMP020300
-  MyView->SetViewMapping(MyViewMapping);
-  SetZSize(0.) ;
-#else
+
+  SetTwist(Angle) ;
+
+  AutoZFit();
+
+  myImmediateUpdate = update;
   ImmediateUpdate();
-  // Check ZClipping planes
-  Standard_Real Zmax = Sqrt( X*X&nb