0024637: Visualization - clean up implementation of rendering in immediate mode
[occt.git] / src / Visual3d / Visual3d_View.cxx
index ab03d78..658997b 100644 (file)
@@ -3,8 +3,8 @@
 //
 // 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
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License 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.
@@ -24,8 +24,6 @@
         A view is defined by :
                 -  ViewManager
                 -  ContextView
-                -  ViewMapping
-                -  ViewOrientation
 
      HISTORIQUE DES MODIFICATIONS   :
      --------------------------------
 #include <Visual3d_Light.hxx>
 #include <Visual3d_SetOfLight.hxx>
 #include <Visual3d_HSetOfLight.hxx>
+#include <Visual3d_HSetOfView.hxx>
 #include <Visual3d_SetIteratorOfSetOfLight.hxx>
-
 #include <Visual3d_SetIteratorOfSetOfView.hxx>
 
 #include <Graphic3d_TextureEnv.hxx>
 
 Visual3d_View::Visual3d_View (const Handle(Visual3d_ViewManager)& AManager):
 MyContext (),
-MyViewMapping (),
-MyViewMappingReset (),
-MyViewOrientation (),
-MyViewOrientationReset (),
-MyTransformation (0, 3, 0, 3),
-MyMatrixOfMapping (0, 3, 0, 3),
-MyMatrixOfOrientation (0, 3, 0, 3),
 MyTOCOMPUTESequence (),
 MyCOMPUTEDSequence (),
 MyDisplayedStructure ()
 {
-Standard_Integer i, j;
 
         MyPtrViewManager        = AManager.operator->();
         MyCView.ViewId          = int (AManager->Identification (this));
@@ -187,75 +177,8 @@ Standard_Integer i, j;
 
         MyCView.Context.NbActiveLight = 0;
 
-        for (i=0; i<=3; i++)
-                for (j=0; j<=3; j++)
-                        if (i == j)     MyTransformation (i, j) = 1.0;
-                        else            MyTransformation (i, j) = 0.0;
-
-Standard_Real X, Y, Z;
-
-        (MyViewOrientation.ViewReferencePoint ()).Coord (X, Y, Z);
-        MyCView.Orientation.ViewReferencePoint.x        = float (X);
-        MyCView.Orientation.ViewReferencePoint.y        = float (Y);
-        MyCView.Orientation.ViewReferencePoint.z        = float (Z);
-        (MyViewOrientation.ViewReferencePlane ()).Coord (X, Y, Z);
-        MyCView.Orientation.ViewReferencePlane.x        = float (X);
-        MyCView.Orientation.ViewReferencePlane.y        = float (Y);
-        MyCView.Orientation.ViewReferencePlane.z        = float (Z);
-        (MyViewOrientation.ViewReferenceUp ()).Coord (X, Y, Z);
-        MyCView.Orientation.ViewReferenceUp.x           = float (X);
-        MyCView.Orientation.ViewReferenceUp.y           = float (Y);
-        MyCView.Orientation.ViewReferenceUp.z           = float (Z);
-
-Standard_Real Sx, Sy, Sz;
-
-        MyViewOrientation.AxialScale(Sx, Sy, Sz);
-        MyCView.Orientation.ViewScaleX                  = float (Sx);
-        MyCView.Orientation.ViewScaleY                  = float (Sy);
-        MyCView.Orientation.ViewScaleZ                  = float (Sz);
-
-        // NKV : 23/07/07 - Define custom MODELVIEW matrix
-        MyCView.Orientation.IsCustomMatrix = 0;
-        memset( (float*)MyCView.Orientation.ModelViewMatrix, 0, 16*sizeof( float ) );
-        MyCView.Orientation.ModelViewMatrix[0][0] =
-        MyCView.Orientation.ModelViewMatrix[1][1] =
-        MyCView.Orientation.ModelViewMatrix[2][2] =
-        MyCView.Orientation.ModelViewMatrix[3][3] = 1.;
-        //
-
-Standard_Real um, vm, uM, vM;
-
-        MyCView.Mapping.Projection      = int (MyViewMapping.Projection ());
-        (MyViewMapping.ProjectionReferencePoint ()).Coord (X, Y, Z);
-        MyCView.Mapping.ProjectionReferencePoint.x      = float (X);
-        MyCView.Mapping.ProjectionReferencePoint.y      = float (Y);
-        MyCView.Mapping.ProjectionReferencePoint.z      = float (Z);
-        MyCView.Mapping.ViewPlaneDistance       =
-                        float (MyViewMapping.ViewPlaneDistance ());
-        MyCView.Mapping.BackPlaneDistance       =
-                        float (MyViewMapping.BackPlaneDistance ());
-        MyCView.Mapping.FrontPlaneDistance      =
-                        float (MyViewMapping.FrontPlaneDistance ());
-        MyViewMapping.WindowLimit (um, vm, uM, vM);
-        MyCView.Mapping.WindowLimit.um  = float (um);
-        MyCView.Mapping.WindowLimit.vm  = float (vm);
-        MyCView.Mapping.WindowLimit.uM  = float (uM);
-        MyCView.Mapping.WindowLimit.vM  = float (vM);
-
-        // NKV : 23/07/07 - Define custom MODELVIEW matrix
-        MyCView.Mapping.IsCustomMatrix = 0;
-        memset( (float*)MyCView.Mapping.ProjectionMatrix, 0, 16*sizeof( float ) );
-        MyCView.Mapping.ProjectionMatrix[0][0] =
-        MyCView.Mapping.ProjectionMatrix[1][1] =
-        MyCView.Mapping.ProjectionMatrix[2][2] =
-        MyCView.Mapping.ProjectionMatrix[3][3] = 1.;
-        //
-
         MyCView.Context.ZBufferActivity = -1;
 
-        MyMatOfMapIsEvaluated   = Standard_False;
-        MyMatOfOriIsEvaluated   = Standard_False;
-
         IsInitialized = Standard_False;
         ComputedModeIsActive      = Standard_False;
         MyCView.Backfacing        = 0;
@@ -270,134 +193,6 @@ Standard_Real um, vm, uM, vM;
 
 }
 
-Visual3d_View::Visual3d_View (const Handle(Visual3d_ViewManager)& AManager, const Visual3d_ViewOrientation& VO, const Visual3d_ViewMapping& VM, const Visual3d_ContextView& CTX):
-MyTransformation (0, 3, 0, 3),
-MyMatrixOfMapping (0, 3, 0, 3),
-MyMatrixOfOrientation (0, 3, 0, 3),
-MyTOCOMPUTESequence (),
-MyCOMPUTEDSequence (),
-MyDisplayedStructure ()
-{
-Standard_Integer i, j;
-
-        MyPtrViewManager        = AManager.operator->();
-        MyViewOrientation       = VO;
-        MyViewMapping           = VM;
-        MyContext               = CTX;
-        MyViewOrientationReset  = VO;
-        MyViewMappingReset      = VM;
-
-        MyCView.ViewId          = int (AManager->Identification (this));
-        MyCView.Active          = 0;
-        MyCView.IsDeleted       = 0;
-
-        MyCView.WsId                  = -1;
-        MyCView.DefWindow.IsDefined   = 0;
-
-        MyCView.Context.NbActiveLight = 0;
-
-        for (i=0; i<=3; i++)
-                for (j=0; j<=3; j++)
-                        if (i == j)     MyTransformation (i, j) = 1.0;
-                        else            MyTransformation (i, j) = 0.0;
-
-Standard_Real X, Y, Z;
-
-        (MyViewOrientation.ViewReferencePoint ()).Coord (X, Y, Z);
-        MyCView.Orientation.ViewReferencePoint.x        = float (X);
-        MyCView.Orientation.ViewReferencePoint.y        = float (Y);
-        MyCView.Orientation.ViewReferencePoint.z        = float (Z);
-        (MyViewOrientation.ViewReferencePlane ()).Coord (X, Y, Z);
-        MyCView.Orientation.ViewReferencePlane.x        = float (X);
-        MyCView.Orientation.ViewReferencePlane.y        = float (Y);
-        MyCView.Orientation.ViewReferencePlane.z        = float (Z);
-        (MyViewOrientation.ViewReferenceUp ()).Coord (X, Y, Z);
-        MyCView.Orientation.ViewReferenceUp.x           = float (X);
-        MyCView.Orientation.ViewReferenceUp.y           = float (Y);
-        MyCView.Orientation.ViewReferenceUp.z           = float (Z);
-
-Standard_Real Sx, Sy, Sz;
-
-        MyViewOrientation.AxialScale(Sx, Sy, Sz);
-        MyCView.Orientation.ViewScaleX                  = float (Sx);
-        MyCView.Orientation.ViewScaleY                  = float (Sy);
-        MyCView.Orientation.ViewScaleZ                  = float (Sz);
-
-        // NKV : 23/07/07 - Define custom MODELVIEW matrix
-        if (MyViewOrientation.IsCustomMatrix()) {
-          MyCView.Orientation.IsCustomMatrix = 1;
-          for ( i = 0; i < 4; i++)
-            for ( j = 0; j < 4; j++)
-              MyCView.Orientation.ModelViewMatrix[i][j] =
-                (Standard_ShortReal)MyViewOrientation.MyModelViewMatrix->Value(i,j);
-        }
-        else {
-          MyCView.Orientation.IsCustomMatrix = 0;
-          memset( (float*)MyCView.Orientation.ModelViewMatrix, 0, 16*sizeof( float ) );
-          MyCView.Orientation.ModelViewMatrix[0][0] =
-          MyCView.Orientation.ModelViewMatrix[1][1] =
-          MyCView.Orientation.ModelViewMatrix[2][2] =
-          MyCView.Orientation.ModelViewMatrix[3][3] = 1.;
-        }
-        //
-
-Standard_Real um, vm, uM, vM;
-
-        MyCView.Mapping.Projection      = int (MyViewMapping.Projection ());
-        (MyViewMapping.ProjectionReferencePoint ()).Coord (X, Y, Z);
-        MyCView.Mapping.ProjectionReferencePoint.x      = float (X);
-        MyCView.Mapping.ProjectionReferencePoint.y      = float (Y);
-        MyCView.Mapping.ProjectionReferencePoint.z      = float (Z);
-        MyCView.Mapping.ViewPlaneDistance       =
-                        float (MyViewMapping.ViewPlaneDistance ());
-        MyCView.Mapping.BackPlaneDistance       =
-                        float (MyViewMapping.BackPlaneDistance ());
-        MyCView.Mapping.FrontPlaneDistance      =
-                        float (MyViewMapping.FrontPlaneDistance ());
-        MyViewMapping.WindowLimit (um, vm, uM, vM);
-        MyCView.Mapping.WindowLimit.um  = float (um);
-        MyCView.Mapping.WindowLimit.vm  = float (vm);
-        MyCView.Mapping.WindowLimit.uM  = float (uM);
-        MyCView.Mapping.WindowLimit.vM  = float (vM);
-
-        // NKV : 23/07/07 - Define custom MODELVIEW matrix
-        if (MyViewMapping.IsCustomMatrix()) {
-          MyCView.Mapping.IsCustomMatrix = 1;
-          for ( i = 0; i < 4; i++)
-            for ( j = 0; j < 4; j++)
-              MyCView.Mapping.ProjectionMatrix[i][j] =
-                (Standard_ShortReal)MyViewMapping.MyProjectionMatrix->Value(i,j);
-        }
-        else {
-          MyCView.Mapping.IsCustomMatrix = 0;
-          memset( (float*)MyCView.Mapping.ProjectionMatrix, 0, 16*sizeof( float ) );
-          MyCView.Mapping.ProjectionMatrix[0][0] =
-          MyCView.Mapping.ProjectionMatrix[1][1] =
-          MyCView.Mapping.ProjectionMatrix[2][2] =
-          MyCView.Mapping.ProjectionMatrix[3][3] = 1.;
-        }
-        //
-
-        MyCView.Context.ZBufferActivity = -1;
-
-        MyMatOfMapIsEvaluated   = Standard_False;
-        MyMatOfOriIsEvaluated   = Standard_False;
-
-        IsInitialized = Standard_False;
-        ComputedModeIsActive      = Standard_False;
-
-        MyCView.ptrUnderLayer = 0;
-        MyCView.ptrOverLayer = 0;
-        MyCView.GContext = 0;
-        MyCView.GDisplayCB = 0;
-        MyCView.GClientData = 0;
-
-        MyGraphicDriver = MyViewManager->GraphicDriver();
-
-}
-
-//-Destructors
-
 //-Methods, in order
 // RIC120302
 void Visual3d_View::SetWindow (const Handle(Aspect_Window)&      AWindow,
@@ -419,16 +214,16 @@ void Visual3d_View::SetWindow (const Handle(Aspect_Window)&      AWindow,
 
 void Visual3d_View::SetWindow (const Handle(Aspect_Window)& theWindow)
 {
+  if (IsDeleted ()) return;
 
-        if (IsDeleted ()) return;
-
-        if (IsDefined ())
-                Visual3d_ViewDefinitionError::Raise ("Window already defined");
-
-        MyWindow        = theWindow;
-        MyCView.WsId                    = MyCView.ViewId;
-        MyCView.DefWindow.IsDefined     = 1;
+  if (IsDefined ())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window already defined");
+  }
 
+  MyWindow = theWindow;
+  MyCView.WsId = MyCView.ViewId;
+  MyCView.DefWindow.IsDefined = 1;
 #if (defined(_WIN32) || defined(__WIN32__))
   const Handle(WNT_Window) aWin   = Handle(WNT_Window)::DownCast (theWindow);
   MyCView.DefWindow.XWindow       = (HWND )(aWin->HWindow());
@@ -563,9 +358,6 @@ void Visual3d_View::Remove () {
         MyCView.IsDeleted       = 1;
         MyCView.DefWindow.IsDefined     = 0;
 
-        MyMatOfMapIsEvaluated   = Standard_False;
-        MyMatOfOriIsEvaluated   = Standard_False;
-
         IsInitialized = Standard_False;
 
         MyWindow.Nullify ();
@@ -583,120 +375,47 @@ void Visual3d_View::Resized () {
 
 }
 
-void Visual3d_View::SetRatio () {
-
-        if (IsDeleted ()) return;
-
-Aspect_TypeOfUpdate UpdateMode = MyViewManager->UpdateMode ();
-        MyViewManager->SetUpdateMode (Aspect_TOU_WAIT);
-
-Standard_Real Umin, Vmin, Umax, Vmax;
-Standard_Integer Dxw, Dyw;
-Standard_Real Dxv, Dyv;
-Standard_Real Xc, Yc;
-Standard_Real Rap;
-
-        Rap     = 0. ;
-        MyWindow->Size (Dxw, Dyw);
-        MyViewMapping.WindowLimit(Umin,Vmin,Umax,Vmax) ;
-        Xc      = (Umin + Umax)/2. ; Yc = (Vmin + Vmax)/2. ;
-        Dxv     = Umax - Umin ; Dyv     = Vmax - Vmin ;
-        if( Dxw > 0 && Dyw > 0 ) Rap = (Standard_Real)Dyw/(Standard_Real)Dxw ;
-        if( Rap > 0.0 ) {
-
-            if( Dxv <= Dyv )
-            {
-                if (Rap <= 1.0)
-                {
-                    Dyv = Dxv;
-                    Dxv = Dxv/Rap;
-                }
-                else
-                {
-                    Dxv = Dxv;
-                    Dyv = Dxv*Rap;
-                }
-            }
-            else
-            {
-                if (Rap <= 1.0)
-                {
-                    Dxv = Dyv/Rap;
-                    Dyv = Dyv;
-                }
-                else
-                {
-                    Dxv = Dyv;
-                    Dyv = Dyv*Rap;
-                }
-            }
-
-            Umin        = Xc - Dxv/2. ; Vmin    = Yc - Dyv/2. ;
-            Umax        = Xc + Dxv/2. ; Vmax    = Yc + Dyv/2. ;
-
-            MyViewMapping.SetWindowLimit(Umin,Vmin,Umax,Vmax) ;
+void Visual3d_View::SetRatio()
+{
+  if (IsDeleted())
+  {
+    return;
+  }
 
-            // Update before SetViewMapping.
+  Aspect_TypeOfUpdate UpdateMode = MyViewManager->UpdateMode();
 
-            MyCView.DefWindow.dx        = float( Dxw );
-            MyCView.DefWindow.dy        = float( Dyw );
+  MyViewManager->SetUpdateMode (Aspect_TOU_WAIT);
 
-            SetViewMapping (MyViewMapping);
-//          SetViewMappingDefault ();
-            // FMN+ Update Ratio for MyViewMappingReset
+  Standard_Integer aWidth, aHeight;
 
-            MyViewMappingReset.WindowLimit(Umin,Vmin,Umax,Vmax) ;
-            Xc  = (Umin + Umax)/2. ; Yc = (Vmin + Vmax)/2. ;
-            Dxv = Umax - Umin ; Dyv     = Vmax - Vmin ;
+  MyWindow->Size (aWidth, aHeight);
 
-            if( Dxv <= Dyv )
-            {
-                if (Rap <= 1.0)
-                {
-                    Dyv = Dxv;
-                    Dxv = Dxv/Rap;
-                }
-                else
-                {
-                    Dxv = Dxv;
-                    Dyv = Dxv*Rap;
-                }
-            }
-            else
-            {
-                if (Rap <= 1.0)
-                {
-                    Dxv = Dyv/Rap;
-                    Dyv = Dyv;
-                }
-                else
-                {
-                    Dxv = Dyv;
-                    Dyv = Dyv*Rap;
-                }
-            }
+  if( aWidth > 0 && aHeight > 0 )
+  {
+    Standard_Real aRatio = (Standard_Real)aWidth / (Standard_Real)aHeight; 
 
-            Umin        = Xc - Dxv/2. ; Vmin    = Yc - Dyv/2. ;
-            Umax        = Xc + Dxv/2. ; Vmax    = Yc + Dyv/2. ;
+    MyCView.DefWindow.dx = Standard_ShortReal (aWidth);
+    MyCView.DefWindow.dy = Standard_ShortReal (aHeight);
 
-            MyViewMappingReset.SetWindowLimit(Umin,Vmin,Umax,Vmax) ;
+    MyGraphicDriver->RatioWindow (MyCView);
 
-            // FMN- Update Ratio for MyViewMappingReset
+    // Update camera aspect
+    Handle(Graphic3d_Camera) aCamera = MyCView.Context.Camera;
 
-            MyGraphicDriver->RatioWindow (MyCView);
-        }
-
-        // Force recalculation of 2 matrices.
-        //
-        // The current view can help to reconstruct a copied view
-        // that is itself. Owing to SetWindow and SetRatio the
-        // recalculation of matrices of this new view is imposed.
-        MyMatOfMapIsEvaluated   = Standard_False;
-        MyMatOfOriIsEvaluated   = Standard_False;
+    if (!aCamera.IsNull())
+    {
+      aCamera->SetAspect (aRatio);
+    }
 
-        MyViewManager->SetUpdateMode (UpdateMode);
-        if (UpdateMode == Aspect_TOU_ASAP) Update ();
+    if (!myDefaultCamera.IsNull())
+    {
+      myDefaultCamera->SetAspect (aRatio);
+    }
+  }
 
+  MyViewManager->SetUpdateMode (UpdateMode);
+  if (UpdateMode == Aspect_TOU_ASAP)
+    Update();
 }
 
 void Visual3d_View::UpdateLights()
@@ -859,382 +578,106 @@ Aspect_GradientBackground Visual3d_View::GradientBackground () const {
 
 }
 
-void Visual3d_View::SetTransform (const TColStd_Array2OfReal& AMatrix) {
-
-        if (IsDeleted ()) return;
-
-Standard_Integer lr, ur, lc, uc;
-Standard_Integer i, j;
-
-        // Assign the new transformation in an array [0..3][0..3]
-        // Avoid problems if the has defined a matrice [1..4][1..4]
-        //                                                 ou [3..6][-1..2] !!
-        lr      = AMatrix.LowerRow ();
-        ur      = AMatrix.UpperRow ();
-        lc      = AMatrix.LowerCol ();
-        uc      = AMatrix.UpperCol ();
-
-        if ( (ur - lr + 1 != 4) || (uc - lc + 1 != 4) )
-                Visual3d_TransformError::Raise ("Transform : not a 4x4 matrix");
-
-        for (i=0; i<=3; i++)
-        for (j=0; j<=3; j++)
-                MyTransformation (i, j) = AMatrix (lr + i, lc + j);
-
-Graphic3d_Vector VPN;
-Graphic3d_Vertex VRP;
-Graphic3d_Vector VUP;
-Standard_Real Sx, Sy, Sz;
-
-Visual3d_ViewOrientation NewViewOrientation;
-
-        VPN     = MyViewOrientation.ViewReferencePlane ();
-        VRP     = MyViewOrientation.ViewReferencePoint ();
-        VUP     = MyViewOrientation.ViewReferenceUp ();
-       MyViewOrientation.AxialScale(Sx, Sy, Sz);
-
-        NewViewOrientation.SetViewReferencePlane
-                (Graphic3d_Structure::Transforms (Transform (), VPN));
-
-        NewViewOrientation.SetViewReferencePoint
-                (Graphic3d_Structure::Transforms (Transform (), VRP));
-
-        NewViewOrientation.SetViewReferenceUp
-                (Graphic3d_Structure::Transforms (Transform (), VUP));
-       NewViewOrientation.SetAxialScale(Sx, Sy, Sz);
-
-        SetViewOrientation (NewViewOrientation);
-
-        MyMatOfOriIsEvaluated   = Standard_False;
-
-}
-
-const TColStd_Array2OfReal& Visual3d_View::Transform () const {
-
-        return (MyTransformation);
-
-}
-
-void Visual3d_View::SetViewOrientation (const Visual3d_ViewOrientation& VO) {
-
-        if (IsDeleted ()) return;
-
-        MyViewOrientation       = VO;
-
-        Standard_Real X, Y, Z;
-        // Tests on modification of parameters.
-        Standard_Boolean VUPIsModified  = Standard_False;
-        Standard_Boolean VRPIsModified  = Standard_False;
-        Standard_Boolean VRUIsModified  = Standard_False;
-        Standard_Boolean ScaleIsModified  = Standard_False;
-        Standard_Boolean CustomIsModified = Standard_False;
-
-        (MyViewOrientation.ViewReferencePoint ()).Coord (X, Y, Z);
-        VUPIsModified =
-           MyCView.Orientation.ViewReferencePoint.x != float (X)
-        || MyCView.Orientation.ViewReferencePoint.y != float (Y)
-        || MyCView.Orientation.ViewReferencePoint.z != float (Z);
-        MyCView.Orientation.ViewReferencePoint.x        = float (X);
-        MyCView.Orientation.ViewReferencePoint.y        = float (Y);
-        MyCView.Orientation.ViewReferencePoint.z        = float (Z);
-
-        (MyViewOrientation.ViewReferencePlane ()).Coord (X, Y, Z);
-        VRPIsModified =
-           MyCView.Orientation.ViewReferencePlane.x != float (X)
-        || MyCView.Orientation.ViewReferencePlane.y != float (Y)
-        || MyCView.Orientation.ViewReferencePlane.z != float (Z);
-        MyCView.Orientation.ViewReferencePlane.x        = float (X);
-        MyCView.Orientation.ViewReferencePlane.y        = float (Y);
-        MyCView.Orientation.ViewReferencePlane.z        = float (Z);
-
-        (MyViewOrientation.ViewReferenceUp ()).Coord (X, Y, Z);
-        VRUIsModified =
-           MyCView.Orientation.ViewReferenceUp.x != float (X)
-        || MyCView.Orientation.ViewReferenceUp.y != float (Y)
-        || MyCView.Orientation.ViewReferenceUp.z != float (Z);
-        MyCView.Orientation.ViewReferenceUp.x           = float (X);
-        MyCView.Orientation.ViewReferenceUp.y           = float (Y);
-        MyCView.Orientation.ViewReferenceUp.z           = float (Z);
-
-        MyViewOrientation.AxialScale(X, Y, Z);
-        ScaleIsModified =
-           MyCView.Orientation.ViewScaleX != float (X)
-        || MyCView.Orientation.ViewScaleY != float (Y)
-        || MyCView.Orientation.ViewScaleZ != float (Z);
-        MyCView.Orientation.ViewScaleX                  = float (X);
-        MyCView.Orientation.ViewScaleY                  = float (Y);
-        MyCView.Orientation.ViewScaleZ                  = float (Z);
-
-        CustomIsModified =
-          (MyCView.Orientation.IsCustomMatrix != MyViewOrientation.IsCustomMatrix());
-        MyCView.Orientation.IsCustomMatrix = MyViewOrientation.IsCustomMatrix();
-        if ( MyViewOrientation.IsCustomMatrix() ) {
-          Standard_Integer i, j;
-          for (i = 0; i < 4; i++)
-            for (j = 0; j < 4; j++) {
-             if (!CustomIsModified) CustomIsModified =
-               MyCView.Orientation.ModelViewMatrix[i][j] != MyViewOrientation.MyModelViewMatrix->Value(i,j);
-            }
-        }
-
-#ifdef TRACE_TRSF
-        cout << "Visual3d_View::SetViewOrientation\n";
-        if (VUPIsModified || VRPIsModified || VRUIsModified || ScaleIsModified || CustomIsModified)
-          cout <<   "VUPIsModified : " << VUPIsModified
-          << ", VRPIsModified : " << VRPIsModified
-          << ", VRUIsModified : " << VRUIsModified
-          << ", CustomIsModified : " << CustomIsModified
-          << ", ScaleIsModified : " << ScaleIsModified << "\n" << flush;
-        else
-          cout << "no modification\n" << flush;
-#endif
-
-        // restart if one of parameters is modified
-        if (!IsInitialized || VUPIsModified || VRPIsModified
-            || VRUIsModified || ScaleIsModified || CustomIsModified) {
-
-        MyMatOfOriIsEvaluated = !VUPIsModified && !VRPIsModified
-                              && !VRUIsModified && !ScaleIsModified;
-
-        if (! IsDefined ()) return;
-
-        Standard_Boolean AWait = Standard_False;        // => immediate update
-        MyGraphicDriver->ViewOrientation (MyCView, AWait);
-        IsInitialized = Standard_True;
-        Compute ();
-
-        if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
-        }
-
-}
-
-Visual3d_ViewOrientation Visual3d_View::ViewOrientation () const {
-
-        return (MyViewOrientation);
-
-}
-
-Visual3d_ViewOrientation Visual3d_View::ViewOrientationDefault () const {
-
-        return (MyViewOrientationReset);
-
-}
-
-void Visual3d_View::SetViewOrientationDefault () {
-
-        MyViewOrientationReset.Assign (MyViewOrientation);
-
-}
-
-void Visual3d_View::ViewOrientationReset () {
-
-        if (IsDeleted ()) return;
-
-        MyViewOrientation       = MyViewOrientationReset;
-
-        Standard_Real X, Y, Z;
-
-        // Tests on modification of parameters.
-        Standard_Boolean VUPIsModified  = Standard_False;
-        Standard_Boolean VRPIsModified  = Standard_False;
-        Standard_Boolean VRUIsModified  = Standard_False;
-        Standard_Boolean ScaleIsModified  = Standard_False;
-        Standard_Boolean CustomIsModified = Standard_False;
-
-        (MyViewOrientation.ViewReferencePoint ()).Coord (X, Y, Z);
-        VUPIsModified =
-           MyCView.Orientation.ViewReferencePoint.x != float (X)
-        || MyCView.Orientation.ViewReferencePoint.y != float (Y)
-        || MyCView.Orientation.ViewReferencePoint.z != float (Z);
-        MyCView.Orientation.ViewReferencePoint.x        = float (X);
-        MyCView.Orientation.ViewReferencePoint.y        = float (Y);
-        MyCView.Orientation.ViewReferencePoint.z        = float (Z);
-
-        (MyViewOrientation.ViewReferencePlane ()).Coord (X, Y, Z);
-        VRPIsModified =
-           MyCView.Orientation.ViewReferencePlane.x != float (X)
-        || MyCView.Orientation.ViewReferencePlane.y != float (Y)
-        || MyCView.Orientation.ViewReferencePlane.z != float (Z);
-        MyCView.Orientation.ViewReferencePlane.x        = float (X);
-        MyCView.Orientation.ViewReferencePlane.y        = float (Y);
-        MyCView.Orientation.ViewReferencePlane.z        = float (Z);
-
-        (MyViewOrientation.ViewReferenceUp ()).Coord (X, Y, Z);
-        VRUIsModified =
-           MyCView.Orientation.ViewReferenceUp.x != float (X)
-        || MyCView.Orientation.ViewReferenceUp.y != float (Y)
-        || MyCView.Orientation.ViewReferenceUp.z != float (Z);
-        MyCView.Orientation.ViewReferenceUp.x           = float (X);
-        MyCView.Orientation.ViewReferenceUp.y           = float (Y);
-        MyCView.Orientation.ViewReferenceUp.z           = float (Z);
-
-        MyViewOrientation.AxialScale(X, Y, Z);
-        ScaleIsModified =
-           MyCView.Orientation.ViewScaleX != float (X)
-        || MyCView.Orientation.ViewScaleY != float (Y)
-        || MyCView.Orientation.ViewScaleZ != float (Z);
-        MyCView.Orientation.ViewScaleX                  = float (X);
-        MyCView.Orientation.ViewScaleY                  = float (Y);
-        MyCView.Orientation.ViewScaleZ                  = float (Z);
-
-        CustomIsModified =
-        MyCView.Orientation.IsCustomMatrix != MyViewOrientation.IsCustomMatrix();
-        MyCView.Orientation.IsCustomMatrix = MyViewOrientation.IsCustomMatrix();
-        if ( MyViewOrientation.IsCustomMatrix() ) {
-          Standard_Integer i, j;
-          for (i = 0; i < 4; i++)
-            for (j = 0; j < 4; j++) {
-             if (!CustomIsModified) CustomIsModified =
-               MyCView.Orientation.ModelViewMatrix[i][j] != MyViewOrientation.MyModelViewMatrix->Value(i,j);
-            }
-        }
-
-
-#ifdef TRACE_TRSF
-        cout << "Visual3d_View::ViewOrientationReset\n";
-        if (VUPIsModified || VRPIsModified || VRUIsModified || ScaleIsModified || CustomIsModified)
-          cout <<   "VUPIsModified : " << VUPIsModified
-          << ", VRPIsModified : " << VRPIsModified
-          << ", VRUIsModified : " << VRUIsModified
-          << ", CustomIsModified : " << CustomIsModified
-          << ", ScaleIsModified : " << ScaleIsModified << "\n" << flush;
-        else
-          cout << "no modification\n" << flush;
-#endif
-
-        // Restart if one of parameters is modified
-        if (!IsInitialized || VUPIsModified || VRPIsModified
-            || VRUIsModified || ScaleIsModified || CustomIsModified) {
-
-        MyMatOfOriIsEvaluated = !VUPIsModified && !VRPIsModified
-                              && !VRUIsModified && !ScaleIsModified;
-
-        if (! IsDefined ()) return;
-
-        Standard_Boolean AWait = Standard_False;        // => immediate update
-        MyGraphicDriver->ViewOrientation (MyCView, AWait);
-        IsInitialized = Standard_True;
-        Compute ();
-
-        if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
-        }
+// =======================================================================
+// function : DefaultCamera
+// purpose  :
+// =======================================================================
+const Handle(Graphic3d_Camera)& Visual3d_View::DefaultCamera() const
+{
+  return myDefaultCamera;
 }
 
-void Visual3d_View::SetViewMapping (const Visual3d_ViewMapping& VM) {
-
-        if (IsDeleted ()) return;
-
-Visual3d_TypeOfProjection OldType = MyViewMapping.Projection ();
-Visual3d_TypeOfProjection NewType = VM.Projection ();
-
-        MyViewMapping   = VM;
-
-Standard_Real X, Y, Z;
-Standard_Real um, vm, uM, vM;
-
-        MyCView.Mapping.Projection      = int (MyViewMapping.Projection ());
-        (MyViewMapping.ProjectionReferencePoint ()).Coord (X, Y, Z);
-        MyCView.Mapping.ProjectionReferencePoint.x      = float (X);
-        MyCView.Mapping.ProjectionReferencePoint.y      = float (Y);
-        MyCView.Mapping.ProjectionReferencePoint.z      = float (Z);
-        MyCView.Mapping.ViewPlaneDistance       =
-                        float (MyViewMapping.ViewPlaneDistance ());
-        MyCView.Mapping.BackPlaneDistance       =
-                        float (MyViewMapping.BackPlaneDistance ());
-        MyCView.Mapping.FrontPlaneDistance      =
-                        float (MyViewMapping.FrontPlaneDistance ());
-        MyViewMapping.WindowLimit (um, vm, uM, vM);
-        MyCView.Mapping.WindowLimit.um  = float (um);
-        MyCView.Mapping.WindowLimit.vm  = float (vm);
-        MyCView.Mapping.WindowLimit.uM  = float (uM);
-        MyCView.Mapping.WindowLimit.vM  = float (vM);
-
-        MyCView.Mapping.IsCustomMatrix = MyViewMapping.IsCustomMatrix();
-        if (MyViewMapping.IsCustomMatrix()) {
-          Standard_Integer i, j;
-          for (i = 0; i < 4; i++)
-            for (j = 0; j < 4; j++)
-              MyCView.Mapping.ProjectionMatrix[i][j] =
-                (Standard_ShortReal)MyViewMapping.MyProjectionMatrix->Value(i,j);
-        }
-
-        MyMatOfMapIsEvaluated   = Standard_False;
-
-        if (! IsDefined ()) return;
-
-Standard_Boolean AWait = Standard_False;        // => immediate update
-        MyGraphicDriver->ViewMapping (MyCView, AWait);
+// =======================================================================
+// function : Camera
+// purpose  :
+// =======================================================================
+const Handle(Graphic3d_Camera)& Visual3d_View::Camera() const{  return MyCView.Context.Camera;}
 
-        // Passage Parallele/Perspective
-        if (OldType != NewType)
-                Compute ();
+// =======================================================================
+// function : SetCamera
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetCamera (const Handle(Graphic3d_Camera)& theCamera)
+{
+  MyCView.Context.Camera = theCamera;
 
-        if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
+  MyGraphicDriver->SetCamera (MyCView);
 
+  if (MyViewManager->UpdateMode() == Aspect_TOU_ASAP)
+  {
+    Update();
+  }
 }
 
-Visual3d_ViewMapping Visual3d_View::ViewMapping () const {
-
-        return (MyViewMapping);
+// =======================================================================
+// function : SetViewOrientationDefault
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetViewOrientationDefault ()
+{
+  if (myDefaultCamera.IsNull())
+  {
+    myDefaultCamera = new Graphic3d_Camera();
+  }
 
+  myDefaultCamera->CopyOrientationData (MyCView.Context.Camera);
 }
 
-Visual3d_ViewMapping Visual3d_View::ViewMappingDefault () const {
+// =======================================================================
+// function : ViewOrientationReset
+// purpose  :
+// =======================================================================
+void Visual3d_View::ViewOrientationReset ()
+{
+  if (IsDeleted())
+  {
+    return;
+  }
 
-        return (MyViewMappingReset);
+  if (!myDefaultCamera.IsNull())
+  {
+    MyCView.Context.Camera->CopyOrientationData (myDefaultCamera);
+  }
 
+  if (MyViewManager->UpdateMode() == Aspect_TOU_ASAP)
+  {
+    Update();
+  }
 }
 
-void Visual3d_View::SetViewMappingDefault () {
-
-        MyViewMappingReset.Assign (MyViewMapping);
-
+// =======================================================================
+// function : SetViewMappingDefault
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetViewMappingDefault()
+{
+  if (myDefaultCamera.IsNull())
+  {
+    myDefaultCamera = new Graphic3d_Camera();
+  }
+  myDefaultCamera->CopyMappingData (MyCView.Context.Camera);
 }
 
-void Visual3d_View::ViewMappingReset () {
-
-        if (IsDeleted ()) return;
-
-        MyViewMapping   = MyViewMappingReset;
-
-Standard_Real X, Y, Z;
-Standard_Real um, vm, uM, vM;
-
-        MyCView.Mapping.Projection      = int (MyViewMapping.Projection ());
-        (MyViewMapping.ProjectionReferencePoint ()).Coord (X, Y, Z);
-        MyCView.Mapping.ProjectionReferencePoint.x      = float (X);
-        MyCView.Mapping.ProjectionReferencePoint.y      = float (Y);
-        MyCView.Mapping.ProjectionReferencePoint.z      = float (Z);
-        MyCView.Mapping.ViewPlaneDistance       =
-                        float (MyViewMapping.ViewPlaneDistance ());
-        MyCView.Mapping.BackPlaneDistance       =
-                        float (MyViewMapping.BackPlaneDistance ());
-        MyCView.Mapping.FrontPlaneDistance      =
-                        float (MyViewMapping.FrontPlaneDistance ());
-        MyViewMapping.WindowLimit (um, vm, uM, vM);
-        MyCView.Mapping.WindowLimit.um  = float (um);
-        MyCView.Mapping.WindowLimit.vm  = float (vm);
-        MyCView.Mapping.WindowLimit.uM  = float (uM);
-        MyCView.Mapping.WindowLimit.vM  = float (vM);
-
-        MyCView.Mapping.IsCustomMatrix = MyViewMapping.IsCustomMatrix();
-        if (MyViewMapping.IsCustomMatrix()) {
-          Standard_Integer i, j;
-          for (i = 0; i < 4; i++)
-            for (j = 0; j < 4; j++)
-              MyCView.Mapping.ProjectionMatrix[i][j] =
-                (Standard_ShortReal)MyViewMapping.MyProjectionMatrix->Value(i,j);
-        }
-
-        MyMatOfMapIsEvaluated   = Standard_False;
-
-        if (! IsDefined ()) return;
-
-Standard_Boolean AWait = Standard_False;        // => immediate update
-        MyGraphicDriver->ViewMapping (MyCView, AWait);
+// =======================================================================
+// function : ViewMappingReset
+// purpose  :
+// =======================================================================
+void Visual3d_View::ViewMappingReset ()
+{
+  if (IsDeleted ())
+  {
+    return;
+  }
 
-        if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
+  if (!myDefaultCamera.IsNull())
+  {
+    MyCView.Context.Camera->CopyMappingData (myDefaultCamera);
+  }
 
+  if (MyViewManager->UpdateMode() == Aspect_TOU_ASAP)
+  {
+    Update();
+  }
 }
 
 void Visual3d_View::SetContext (const Visual3d_ContextView& CTX) {
@@ -1578,127 +1021,115 @@ void Visual3d_View::Deactivate () {
 
 }
 
-void Visual3d_View::Redraw () {
-
-        Redraw (MyViewManager->UnderLayer (), MyViewManager->OverLayer ());
-
+void Visual3d_View::Redraw()
+{
+  Redraw (MyViewManager->UnderLayer(), MyViewManager->OverLayer(), 0, 0, 0, 0);
 }
 
-void Visual3d_View::Redraw (const Standard_Integer x, const Standard_Integer y, const Standard_Integer width, const Standard_Integer height) {
-
-        Redraw (MyViewManager->UnderLayer (), MyViewManager->OverLayer (), x, y, width, height);
+void Visual3d_View::Redraw (const Standard_Integer theX,
+                            const Standard_Integer theY,
+                            const Standard_Integer theWidth,
+                            const Standard_Integer theHeight)
+{
+  Redraw (MyViewManager->UnderLayer(), MyViewManager->OverLayer(),
+          theX, theY, theWidth, theHeight);
 }
 
-void Visual3d_View::Redraw (const Handle(Visual3d_Layer)& AnUnderLayer, const Handle(Visual3d_Layer)& AnOverLayer) {
-
-        if (IsDeleted ()) return;
-
-        if ((! IsDefined ()) || (! IsActive ())) return;
-
-        if (! MyWindow->IsMapped ()) return;
-
-        // san - 14/04/2004 - set up Z buffer state before redrawing
-       // If the activation/desactivation of ZBuffer should be automatic
-        // depending on the presence or absence of facets.
-        if (MyViewManager->ZBufferAuto ()) {
-                Standard_Boolean BContainsFacet = ContainsFacet ();
-                Standard_Boolean BZBuffer       = ZBufferIsActivated ();
-                // If the view contains facets
-                // and if ZBuffer is not active
-                if (BContainsFacet && ! BZBuffer)
-                        SetZBufferActivity (1);
-                // If the view contains only facets
-                // and if ZBuffer is active
-                if (! BContainsFacet && BZBuffer)
-                        SetZBufferActivity (0);
-        }
-
-        Aspect_CLayer2d OverCLayer;
-        Aspect_CLayer2d UnderCLayer;
-        OverCLayer.ptrLayer = UnderCLayer.ptrLayer = NULL;
-        if (! AnOverLayer.IsNull ()) OverCLayer = AnOverLayer->CLayer ();
-        if (! AnUnderLayer.IsNull ()) UnderCLayer = AnUnderLayer->CLayer ();
-        MyGraphicDriver->Redraw (MyCView, UnderCLayer, OverCLayer);
-
+void Visual3d_View::Redraw (const Handle(Visual3d_Layer)& theUnderLayer,
+                            const Handle(Visual3d_Layer)& theOverLayer)
+{
+  Redraw (theUnderLayer, theOverLayer, 0, 0, 0, 0);
 }
 
-void Visual3d_View::Redraw (const Handle(Visual3d_Layer)& AnUnderLayer, const Handle(Visual3d_Layer)& AnOverLayer, const Standard_Integer x, const Standard_Integer y, const Standard_Integer width, const Standard_Integer height) {
-
-        if (IsDeleted ()) return;
-
-        if ((! IsDefined ()) || (! IsActive ())) return;
-
-        if (! MyWindow->IsMapped ()) return;
+void Visual3d_View::Redraw (const Handle(Visual3d_Layer)& theUnderLayer,
+                            const Handle(Visual3d_Layer)& theOverLayer,
+                            const Standard_Integer        theX,
+                            const Standard_Integer        theY,
+                            const Standard_Integer        theWidth,
+                            const Standard_Integer        theHeight)
+{
+  if (IsDeleted()
+   || !IsDefined()
+   || !IsActive()
+   || !MyWindow->IsMapped())
+  {
+    return;
+  }
 
-        // san - 14/04/2004 - set up Z buffer state before redrawing
-          // If activation/desactivation of ZBuffer should be automatic
-        // depending on the presence or absence of facets.
-        if (MyViewManager->ZBufferAuto ()) {
-        Standard_Boolean BContainsFacet = ContainsFacet ();
-        Standard_Boolean BZBuffer       = ZBufferIsActivated ();
-                // If the view contains facets
-                // and if ZBuffer is not active
-                if (BContainsFacet && ! BZBuffer)
-                        SetZBufferActivity (1);
-                // If the view contains only facets
-                // and if ZBuffer is active
-                if (! BContainsFacet && BZBuffer)
-                        SetZBufferActivity (0);
-        }
+  if (MyGraphicDriver->IsDeviceLost())
+  {
+    MyViewManager->RecomputeStructures();
+    MyViewManager->RecomputeStructures (myImmediateStructures);
+    MyGraphicDriver->ResetDeviceLostFlag();
+  }
 
-        Aspect_CLayer2d OverCLayer;
-        Aspect_CLayer2d UnderCLayer;
-        OverCLayer.ptrLayer = UnderCLayer.ptrLayer = NULL;
-        if (! AnOverLayer.IsNull ()) OverCLayer = AnOverLayer->CLayer ();
-        if (! AnUnderLayer.IsNull ()) UnderCLayer = AnUnderLayer->CLayer ();
-        MyGraphicDriver->Redraw (MyCView, UnderCLayer, OverCLayer, x, y, width, height);
+  // set up Z buffer state before redrawing
+  if (MyViewManager->ZBufferAuto())
+  {
+    const Standard_Boolean hasFacet   = ContainsFacet();
+    const Standard_Boolean hasZBuffer = ZBufferIsActivated();
+    // if the view contains facets and if ZBuffer is not active
+    if (hasFacet && !hasZBuffer)
+    {
+      SetZBufferActivity (1);
+    }
+    // if the view contains only facets and if ZBuffer is active
+    if (!hasFacet && hasZBuffer)
+    {
+      SetZBufferActivity (0);
+    }
+  }
 
+  Aspect_CLayer2d anOverCLayer, anUnderCLayer;
+  anOverCLayer.ptrLayer = anUnderCLayer.ptrLayer = NULL;
+  if (!theOverLayer .IsNull()) anOverCLayer  = theOverLayer ->CLayer();
+  if (!theUnderLayer.IsNull()) anUnderCLayer = theUnderLayer->CLayer();
+  MyGraphicDriver->Redraw (MyCView, anUnderCLayer, anOverCLayer, theX, theY, theWidth, theHeight);
 }
 
-void Visual3d_View::Update () {
-
-        Update (MyViewManager->UnderLayer (), MyViewManager->OverLayer ());
-
+void Visual3d_View::RedrawImmediate()
+{
+  RedrawImmediate (MyViewManager->UnderLayer(), MyViewManager->OverLayer());
 }
 
-void Visual3d_View::Update (const Handle(Visual3d_Layer)& AnUnderLayer, const Handle(Visual3d_Layer)& AnOverLayer) {
-
-        if (IsDeleted ()) return;
+void Visual3d_View::RedrawImmediate (const Handle(Visual3d_Layer)& theUnderLayer,
+                                     const Handle(Visual3d_Layer)& theOverLayer)
+{
+  if (IsDeleted()
+   || !IsDefined()
+   || !IsActive()
+   || !MyWindow->IsMapped())
+  {
+    return;
+  }
 
-        if ((! IsDefined ()) || (! IsActive ())) return;
+  Aspect_CLayer2d anOverCLayer, anUnderCLayer;
+  anOverCLayer.ptrLayer = anUnderCLayer.ptrLayer = NULL;
+  if (!theOverLayer .IsNull()) anOverCLayer  = theOverLayer ->CLayer();
+  if (!theUnderLayer.IsNull()) anUnderCLayer = theUnderLayer->CLayer();
+  MyGraphicDriver->RedrawImmediate (MyCView, anUnderCLayer, anOverCLayer);
+}
 
-        if (! MyWindow->IsMapped ()) return;
+void Visual3d_View::Invalidate()
+{
+  MyGraphicDriver->Invalidate (MyCView);
+}
 
-        if (MyGraphicDriver->IsDeviceLost())
-        {
-          MyViewManager->ReComputeStructures();
-          MyGraphicDriver->ResetDeviceLostFlag();
-        }
+void Visual3d_View::Update()
+{
+  IsInitialized = Standard_True;
+  Compute ();
 
-        // If activation/desactivation of ZBuffer should be automatic
-        // depending on the presence or absence of facets.
-        if (MyViewManager->ZBufferAuto ()) {
-Standard_Boolean BContainsFacet = ContainsFacet ();
-Standard_Boolean BZBuffer       = ZBufferIsActivated ();
-                // If the view contains facets
-                // and if ZBuffer is not active
-                        if (BContainsFacet && ! BZBuffer)
-                        SetZBufferActivity (1);
-                   // If the view does not contain facets
-                // and if ZBuffer is active
-                if (! BContainsFacet && BZBuffer)
-                        SetZBufferActivity (0);
-        }
+  Redraw (MyViewManager->UnderLayer(), MyViewManager->OverLayer(), 0, 0, 0, 0);
+}
 
-Aspect_CLayer2d OverCLayer;
-Aspect_CLayer2d UnderCLayer;
-        OverCLayer.ptrLayer = UnderCLayer.ptrLayer = NULL;
-        if (! AnUnderLayer.IsNull ()) UnderCLayer = AnUnderLayer->CLayer ();
-        if (! AnOverLayer.IsNull ()) OverCLayer = AnOverLayer->CLayer ();
-        //OSD::SetSignal (Standard_False);
-        MyGraphicDriver->Update (MyCView, UnderCLayer, OverCLayer);
-        //OSD::SetSignal (Standard_True);
+void Visual3d_View::Update (const Handle(Visual3d_Layer)& theUnderLayer,
+                            const Handle(Visual3d_Layer)& theOverLayer)
+{
+  IsInitialized = Standard_True;
+  Compute ();
 
+  Redraw (theUnderLayer, theOverLayer, 0, 0, 0, 0);
 }
 
 Visual3d_TypeOfAnswer Visual3d_View::AcceptDisplay (const Handle(Graphic3d_Structure)& AStructure) const {
@@ -1763,17 +1194,11 @@ Standard_Integer Index = IsComputed (AStructure);
              << ", " << OldPriority << ", " << NewPriority << ")\n";
         cout << flush;
 #endif
-                MyGraphicDriver->EraseStructure
-                        (MyCView,
-                         *(Graphic3d_CStructure *)
-                            MyCOMPUTEDSequence.Value (Index)->CStructure ());
-                MyGraphicDriver->DisplayStructure
-                        (MyCView,
-                         *(Graphic3d_CStructure *)
-                            MyCOMPUTEDSequence.Value (Index)->CStructure (),
-                         int (NewPriority));
+                MyGraphicDriver->EraseStructure   (MyCView, *(MyCOMPUTEDSequence.Value (Index)->CStructure()));
+                MyGraphicDriver->DisplayStructure (MyCView, *(MyCOMPUTEDSequence.Value (Index)->CStructure()), NewPriority);
         }
-        else {
+        else
+        {
 #ifdef TRACE
         Standard_Integer StructId = AStructure->Identification ();
         cout << "Visual3d_View" << MyCView.ViewId << "::ChangeDisplayPriority ("
@@ -1781,13 +1206,8 @@ Standard_Integer Index = IsComputed (AStructure);
              << ", " << OldPriority << ", " << NewPriority << ")\n";
         cout << flush;
 #endif
-                MyGraphicDriver->EraseStructure
-                        (MyCView,
-                         *(Graphic3d_CStructure *)AStructure->CStructure ());
-                MyGraphicDriver->DisplayStructure
-                        (MyCView,
-                         *(Graphic3d_CStructure *)AStructure->CStructure (),
-                         int (NewPriority));
+                MyGraphicDriver->EraseStructure   (MyCView, *(AStructure->CStructure()));
+                MyGraphicDriver->DisplayStructure (MyCView, *(AStructure->CStructure()), NewPriority);
         }
 
 }
@@ -1876,6 +1296,56 @@ Standard_Integer IndexD = IsComputed (ADaughter);
 
 }
 
+Standard_Boolean Visual3d_View::DisplayImmediate (const Handle(Graphic3d_Structure)& theStructure,
+                                                  const Standard_Boolean             theIsSingleView)
+{
+  if (!myImmediateStructures.Add (theStructure))
+  {
+    return Standard_False;
+  }
+
+  if (theIsSingleView)
+  {
+    Handle_Visual3d_HSetOfView aViews = MyViewManager->DefinedView();
+    for (Visual3d_SetIteratorOfSetOfView aViewIter (aViews->Set()); aViewIter.More(); aViewIter.Next())
+    {
+      if (aViewIter.Value().Access() != this)
+      {
+        aViewIter.Value()->EraseImmediate (theStructure);
+      }
+    }
+  }
+
+  MyGraphicDriver->DisplayImmediateStructure (MyCView, *theStructure->CStructure());
+  return Standard_True;
+}
+
+Standard_Boolean Visual3d_View::EraseImmediate (const Handle(Graphic3d_Structure)& theStructure)
+{
+  const Standard_Boolean isErased = myImmediateStructures.Remove (theStructure);
+  if (isErased)
+  {
+    MyGraphicDriver->EraseImmediateStructure (MyCView, *theStructure->CStructure());
+  }
+
+  return isErased;
+}
+
+Standard_Boolean Visual3d_View::ClearImmediate()
+{
+  if (myImmediateStructures.IsEmpty())
+  {
+    return Standard_False;
+  }
+
+  for (Graphic3d_MapIteratorOfMapOfStructure anIter (myImmediateStructures); anIter.More(); anIter.Next())
+  {
+    MyGraphicDriver->EraseImmediateStructure (MyCView, *anIter.Key()->CStructure());
+  }
+  myImmediateStructures.Clear();
+  return Standard_True;
+}
+
 void Visual3d_View::Display (const Handle(Graphic3d_Structure)& AStructure) {
 
         Display (AStructure, MyViewManager->UpdateMode ());
@@ -1915,11 +1385,7 @@ Standard_Integer Index = IsComputed (AStructure);
 
         if (Answer == Visual3d_TOA_YES ) {
                 if (IsDisplayed (AStructure)) return;
-                MyGraphicDriver->DisplayStructure (
-                        MyCView,
-                        *(Graphic3d_CStructure *)AStructure->CStructure (),
-                        int (AStructure->DisplayPriority ())
-                );
+                MyGraphicDriver->DisplayStructure (MyCView, *(AStructure->CStructure()), AStructure->DisplayPriority());
                 MyDisplayedStructure.Add (AStructure);
                 if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
         }
@@ -1935,11 +1401,7 @@ Standard_Integer OldStructId =
                     // to be displayed
                     if (! IsDisplayed (AStructure)) {
                         MyDisplayedStructure.Add (AStructure);
-                        MyGraphicDriver->DisplayStructure (
-                            MyCView,
-                            *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure (),
-                            int (AStructure->DisplayPriority ())
-                        );
+                        MyGraphicDriver->DisplayStructure (MyCView, *(MyCOMPUTEDSequence.Value (Index)->CStructure()), AStructure->DisplayPriority ());
                         if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
                     }
                     return;
@@ -1963,11 +1425,7 @@ Standard_Integer OldStructId =
                             OldStructId = MyCOMPUTEDSequence.Value (NewIndex)->
                                                         Identification ();
                             MyDisplayedStructure.Add (AStructure);
-                            MyGraphicDriver->DisplayStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (NewIndex)->CStructure (),
-                                int (AStructure->DisplayPriority ())
-                            );
+                            MyGraphicDriver->DisplayStructure (MyCView, *(MyCOMPUTEDSequence.Value (NewIndex)->CStructure()), AStructure->DisplayPriority ());
                             if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
                         }
                         return;
@@ -1977,10 +1435,7 @@ Standard_Integer OldStructId =
                     else {
                         // COMPUTED is removed if displayed
                         if (IsDisplayed (AStructure))
-                            MyGraphicDriver->EraseStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ()
-                            );
+                            MyGraphicDriver->EraseStructure (MyCView, *(MyCOMPUTEDSequence.Value (Index)->CStructure()));
                     }
                 }
             } // if (Index != 0)
@@ -2058,11 +1513,7 @@ Standard_Boolean ComputeShading = ((ViewType == Visual3d_TOV_SHADING) &&
             if (Answer != Visual3d_TOA_NO) {
                 if (! IsDisplayed (AStructure))
                         MyDisplayedStructure.Add (AStructure);
-                MyGraphicDriver->DisplayStructure (
-                        MyCView,
-                        *(Graphic3d_CStructure *)TheStructure->CStructure (),
-                        int (AStructure->DisplayPriority ())
-                );
+                MyGraphicDriver->DisplayStructure (MyCView, *(TheStructure->CStructure()), AStructure->DisplayPriority ());
                 if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
             }
         } // Visual3d_TOA_COMPUTE
@@ -2093,10 +1544,7 @@ Visual3d_TypeOfAnswer Answer = AcceptDisplay (AStructure);
                 }
 
                 if (Answer != Visual3d_TOA_COMPUTE) {
-                        MyGraphicDriver->EraseStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)AStructure->CStructure ()
-                        );
+                        MyGraphicDriver->EraseStructure (MyCView, *(AStructure->CStructure()));
                 }
 
                 if (Answer == Visual3d_TOA_COMPUTE) {
@@ -2119,8 +1567,7 @@ Standard_Integer Index = IsComputed (AStructure);
              << StructId << " is removed. \n";
         cout << flush;
 #endif
-                        MyGraphicDriver->EraseStructure
-                                (MyCView, *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ());
+                        MyGraphicDriver->EraseStructure (MyCView, *(MyCOMPUTEDSequence.Value (Index)->CStructure()));
                     }
                     // else is impossible
                 }
@@ -2308,146 +1755,164 @@ Graphic3d_MapIteratorOfMapOfStructure Iterator (ASet);
 
 }
 
-void Visual3d_View::MinMaxValues (Standard_Real& XMin, Standard_Real& YMin, Standard_Real& ZMin, Standard_Real& XMax, Standard_Real& YMax, Standard_Real& ZMax) const {
-
-        MinMaxValues
-        (MyDisplayedStructure, XMin, YMin, ZMin, XMax, YMax, ZMax);
-
+//=============================================================================
+//function : MinMaxValues
+//purpose  :
+//=============================================================================
+void Visual3d_View::MinMaxValues (Standard_Real& theXMin,
+                                  Standard_Real& theYMin,
+                                  Standard_Real& theZMin,
+                                  Standard_Real& theXMax,
+                                  Standard_Real& theYMax,
+                                  Standard_Real& theZMax,
+                                  const Standard_Boolean theToIgnoreInfiniteFlag) const
+{
+  MinMaxValues (MyDisplayedStructure,
+                theXMin, theYMin, theZMin,
+                theXMax, theYMax, theZMax,
+                theToIgnoreInfiniteFlag);
 }
 
-void Visual3d_View::MinMaxValues (const Graphic3d_MapOfStructure& ASet, Standard_Real& XMin, Standard_Real& YMin, Standard_Real& ZMin, Standard_Real& XMax, Standard_Real& YMax, Standard_Real& ZMax) const {
-
-  if (ASet.IsEmpty ()) {
-    XMin = RealFirst ();
-    YMin = RealFirst ();
-    ZMin = RealFirst ();
+//=============================================================================
+//function : MinMaxValues
+//purpose  :
+//=============================================================================
+void Visual3d_View::MinMaxValues (const Graphic3d_MapOfStructure& theSet,
+                                  Standard_Real& theXMin,
+                                  Standard_Real& theYMin,
+                                  Standard_Real& theZMin,
+                                  Standard_Real& theXMax,
+                                  Standard_Real& theYMax,
+                                  Standard_Real& theZMax,
+                                  const Standard_Boolean theToIgnoreInfiniteFlag) const
+{
+  if (theSet.IsEmpty ())
+  {
+    theXMin = RealFirst();
+    theYMin = RealFirst();
+    theZMin = RealFirst();
 
-    XMax = RealLast ();
-    YMax = RealLast ();
-    ZMax = RealLast ();
+    theXMax = RealLast();
+    theYMax = RealLast();
+    theZMax = RealLast();
   }
-  else {
-
-  Standard_Real Xm, Ym, Zm, XM, YM, ZM;
-  Graphic3d_MapIteratorOfMapOfStructure Iterator (ASet);
-
-  XMin = RealLast ();
-  YMin = RealLast ();
-  ZMin = RealLast ();
+  else
+  {
+    Standard_Real aXm, aYm, aZm, aXM, aYM, aZM;
+    Graphic3d_MapIteratorOfMapOfStructure anIterator (theSet);
 
-  XMax = RealFirst ();
-  YMax = RealFirst ();
-  ZMax = RealFirst ();
+    theXMin = RealLast();
+    theYMin = RealLast();
+    theZMin = RealLast();
 
-  for ( Iterator.Initialize (ASet);
-        Iterator.More ();
-        Iterator.Next ()) {
+    theXMax = RealFirst ();
+    theYMax = RealFirst ();
+    theZMax = RealFirst ();
 
-          if (!Iterator.Key()->IsVisible())
-          {
-            continue;
-          }
+    for (anIterator.Initialize (theSet); anIterator.More(); anIterator.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStructure = anIterator.Key();
 
-      if ( (Iterator.Key ())->IsInfinite ()){
+      if (aStructure->IsInfinite() && !theToIgnoreInfiniteFlag)
+      {
         //XMin, YMin .... ZMax are initialized by means of infinite line data
-        (Iterator.Key ())->MinMaxValues (Xm, Ym, Zm, XM, YM, ZM);
-        if ( Xm != RealFirst() && Xm < XMin )
-          XMin = Xm ;
-        if ( Ym != RealFirst() && Ym < YMin )
-          YMin = Ym ;
-        if ( Zm != RealFirst() && Zm < ZMin )
-          ZMin = Zm ;
-        if ( XM != RealLast()  && XM > XMax )
-          XMax = XM ;
-        if ( YM != RealLast()  && YM > YMax )
-          YMax = YM ;
-        if ( ZM != RealLast()  && ZM > ZMax )
-          ZMax = ZM ;
+        aStructure->MinMaxValues (aXm, aYm, aZm, aXM, aYM, aZM, Standard_False);
+        if (aXm != RealFirst() && aXm < theXMin)
+        {
+          theXMin = aXm;
+        }
+        if (aYm != RealFirst() && aYm < theYMin)
+        {
+          theYMin = aYm;
+        }
+        if (aZm != RealFirst() && aZm < theZMin)
+        {
+          theZMin = aZm;
+        }
+        if (aXM != RealLast() && aXM > theXMax)
+        {
+          theXMax = aXM;
+        }
+        if (aYM != RealLast() && aYM > theYMax)
+        {
+          theYMax = aYM;
+        }
+        if (aZM != RealLast() && aZM > theZMax)
+        {
+          theZMax = aZM;
+        }
       }
+
       // Only non-empty and non-infinite structures
       // are taken into account for calculation of MinMax
-      if (! (Iterator.Key ())->IsInfinite () &&
-          ! (Iterator.Key ())->IsEmpty ()) {
-            (Iterator.Key ())->MinMaxValues(Xm, Ym, Zm, XM, YM, ZM);
-          /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
-          //"FitAll" operation ignores object with transform persitence parameter
-          if( (Iterator.Key ())->TransformPersistenceMode() == Graphic3d_TMF_None )
-          {
-            if (Xm < XMin) XMin = Xm;
-            if (Ym < YMin) YMin = Ym;
-            if (Zm < ZMin) ZMin = Zm;
-            if (XM > XMax) XMax = XM;
-            if (YM > YMax) YMax = YM;
-            if (ZM > ZMax) ZMax = ZM;
-          }
+      if ((!aStructure->IsInfinite() || theToIgnoreInfiniteFlag) && !aStructure->IsEmpty())
+      {
+        aStructure->MinMaxValues (aXm, aYm, aZm, aXM, aYM, aZM, theToIgnoreInfiniteFlag);
+
+        /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
+        //"FitAll" operation ignores object with transform persitence parameter
+        if(aStructure->TransformPersistenceMode() == Graphic3d_TMF_None )
+        {
+          theXMin = Min (aXm, theXMin);
+          theYMin = Min (aYm, theYMin);
+          theZMin = Min (aZm, theZMin);
+          theXMax = Max (aXM, theXMax);
+          theYMax = Max (aYM, theYMax);
+          theZMax = Max (aZM, theZMax);
         }
+      }
     }
 
     // The following cases are relevant
     // For exemple if all structures are empty or infinite
-    if (XMax < XMin) { Xm = XMin; XMin = XMax; XMax = Xm; }
-    if (YMax < YMin) { Ym = YMin; YMin = YMax; YMax = Ym; }
-    if (ZMax < ZMin) { Zm = ZMin; ZMin = ZMax; ZMax = Zm; }
+    if (theXMax < theXMin) { aXm = theXMin; theXMin = theXMax; theXMax = aXm; }
+    if (theYMax < theYMin) { aYm = theYMin; theYMin = theYMax; theYMax = aYm; }
+    if (theZMax < theZMin) { aZm = theZMin; theZMin = theZMax; theZMax = aZm; }
   }
-  Standard_Real Sx, Sy, Sz;
-  MyViewOrientation.AxialScale(Sx, Sy, Sz);
-  XMin = (Sx > 1. && XMin < RealFirst ()/Sx)?RealFirst (): XMin*Sx;
-  XMax = (Sx > 1. && XMax > RealLast  ()/Sx)?RealLast  (): XMax*Sx;
-  YMin = (Sy > 1. && YMin < RealFirst ()/Sy)?RealFirst (): YMin*Sy;
-  YMax = (Sy > 1. && YMax > RealLast  ()/Sy)?RealLast  (): YMax*Sy;
-  ZMin = (Sz > 1. && ZMin < RealFirst ()/Sz)?RealFirst (): ZMin*Sz;
-  ZMax = (Sz > 1. && ZMax > RealLast  ()/Sz)?RealLast  (): ZMax*Sz;
 }
 
-void Visual3d_View::MinMaxValues (Standard_Real& XMin, Standard_Real& YMin, Standard_Real& XMax, Standard_Real& YMax) {
-
-        MinMaxValues (MyDisplayedStructure, XMin, YMin, XMax, YMax);
-
-}
-
-void Visual3d_View::MinMaxValues (const Graphic3d_MapOfStructure& ASet, Standard_Real& XMin, Standard_Real& YMin, Standard_Real& XMax, Standard_Real& YMax) {
-
-Standard_Real Xm, Ym, Zm, XM, YM, ZM;
-Standard_Real Xp, Yp, Zp;
-
-        MinMaxValues (ASet, Xm, Ym, Zm, XM, YM, ZM);
-
-        Projects (Xm, Ym, Zm, Xp, Yp, Zp);
-        XMin    = Xp;
-        YMin    = Yp;
-
-        Projects (XM, YM, ZM, Xp, Yp, Zp);
-        XMax    = Xp;
-        YMax    = Yp;
-
-        if (XMax < XMin) { Xp = XMax; XMax = XMin; XMin = Xp; }
-        if (YMax < YMin) { Yp = YMax; YMax = YMin; YMin = Yp; }
+//=============================================================================
+//function : MinMaxValues
+//purpose  :
+//=============================================================================
+void Visual3d_View::MinMaxValues (Standard_Real& theXMin,
+                                  Standard_Real& theYMin,
+                                  Standard_Real& theXMax,
+                                  Standard_Real& theYMax,
+                                  const Standard_Boolean theToIgnoreInfiniteFlag) const
+{
+  MinMaxValues (MyDisplayedStructure,
+                theXMin, theYMin,
+                theXMax, theYMax,
+                theToIgnoreInfiniteFlag);
 }
 
-const TColStd_Array2OfReal& Visual3d_View::MatrixOfOrientation () {
-
-        if (! MyMatOfOriIsEvaluated) {
-                MyGraphicDriver->InquireMat
-                    (MyCView, MyMatrixOfOrientation, MyMatrixOfMapping);
-                MyMatOfMapIsEvaluated   = Standard_True;
-                MyMatOfOriIsEvaluated   = Standard_True;
-        }
-
-        return (MyMatrixOfOrientation);
+//=============================================================================
+//function : MinMaxValues
+//purpose  :
+//=============================================================================
+void Visual3d_View::MinMaxValues (const Graphic3d_MapOfStructure& theSet,
+                                  Standard_Real& theXMin,
+                                  Standard_Real& theYMin,
+                                  Standard_Real& theXMax,
+                                  Standard_Real& theYMax,
+                                  const Standard_Boolean theToIgnoreInfiniteFlag) const
+{
+  Standard_Real aXm, aYm, aZm, aXM, aYM, aZM;
+  Standard_Real aXp, aYp, aZp;
 
-}
+  MinMaxValues (theSet, aXm, aYm, aZm, aXM, aYM, aZM, theToIgnoreInfiniteFlag);
 
-const TColStd_Array2OfReal& Visual3d_View::MatrixOfMapping () {
+  Projects (aXm, aYm, aZm, aXp, aYp, aZp);
+  theXMin = aXp;
+  theYMin = aYp;
 
-        if (! MyMatOfMapIsEvaluated) {
-                MyGraphicDriver->InquireMat
-                    (MyCView, MyMatrixOfOrientation, MyMatrixOfMapping);
-                MyMatOfMapIsEvaluated   = Standard_True;
-                MyMatOfOriIsEvaluated   = Standard_True;
-        }
-
-        return (MyMatrixOfMapping);
+  Projects (aXM, aYM, aZM, aXp, aYp, aZp);
+  theXMax = aXp;
+  theYMax = aYp;
 
+  if (theXMax < theXMin) { aXp = theXMax; theXMax = theXMin; theXMin = aXp; }
+  if (theYMax < theYMin) { aYp = theYMax; theYMax = theYMin; theYMin = aYp; }
 }
 
 Standard_Integer Visual3d_View::NumberOfDisplayedStructures () const {
@@ -2458,202 +1923,30 @@ Standard_Integer Result = MyDisplayedStructure.Extent ();
 
 }
 
-#ifdef OLD_METHOD
-void Visual3d_View::Projects (const Standard_Real AX, const Standard_Real AY, const Standard_Real AZ, Standard_Real& APX, Standard_Real& APY, Standard_Real& APZ) const {
-
-math_Vector PtDC (0,3), PtWC (0,3);
-
-// RLE method:
-// Otherwise use new on Visual3d_View (constructor+destructor)
-// as Projects is a const method or MatrixOfOrientation and
-// MatrixOfMapping is not.
-Visual3d_View * const newthis = (Visual3d_View * const) this;
-        newthis->MatrixOfOrientation ();
-        newthis->MatrixOfMapping ();
-
-// World Coordinate Space
-        PtWC (0) = AX;
-        PtWC (1) = AY;
-        PtWC (2) = AZ;
-        PtWC (3) = 1.0;
-
-        // WCS -> View Reference Coordinate Space
-        math_Vector PtVRC(0,3);
-        PtVRC = MyMatrixOfOrientation.Multiplied (PtWC);
-
-        // VRCS -> Normalized Projection Coordinate Space
-        math_Vector PtNPC(0,3);
-        PtNPC = MyMatrixOfMapping.Multiplied (PtVRC);
-        for (Standard_Integer i=0; i<3; i++) PtNPC (i) = PtNPC (i) / PtNPC (3);
-
-#ifdef DEBUG
-        printf("Display coordinates PtNPC: %f,%f,%f,%f\n",
-                        PtNPC(0),PtNPC(1),PtNPC(2),PtNPC(3));
-#endif // DEBUG
-
-        Standard_Real Ratio;
-#ifdef DEBUG
-        // NPCS -> Device Coordinate Space
-        Standard_Real Dx        = Standard_Real (MyCView.DefWindow.dx);
-        Standard_Real Dy        = Standard_Real (MyCView.DefWindow.dy);
-
-        Ratio           = Dx / Dy;
-        PtDC (0)        = PtNPC (0) * Dx;
-        PtDC (1)        = Dy - PtNPC (1) * Dy * Ratio;
-
-        printf("Display coordinates : %f,%f,%f,%f\n",
-                        PtDC(0),PtDC(1),PtDC(2),PtDC(3));
-#endif // DEBUG
-
-        // NPCS -> Window Space
-Standard_Real um, vm, uM, vM;
-        MyViewMapping.WindowLimit (um, vm, uM, vM);
-
-        Ratio   = (uM - um) / (vM - vm);
-        if (Ratio >= 1.0)
-            PtNPC (1)   = PtNPC (1) * Ratio;
-        else
-            PtNPC (0)   = PtNPC (0) / Ratio;
-
-#ifdef DEBUG
-        printf("Display coordinates PtNPC: %f,%f,%f,%f\n",
-                        PtNPC(0),PtNPC(1),PtNPC(2),PtNPC(3));
-#endif // DEBUG
-
-        Standard_Real fpd       = MyViewMapping.FrontPlaneDistance ();
-        Standard_Real bpd       = MyViewMapping.BackPlaneDistance ();
-
-        /*
-         * Coordinates of PtNPC are described in the space
-         * [0-1]x[0-1]x[0-1].
-         * It is necessary to transform x and y in the window space.
-         * It is necessary to transform z in the space of back and front
-         * plane, taking into account clipping planes.
-         * Z clipping planes are defined between 0 and 1.
-        */
-
-        APX     = PtNPC (0) * (uM - um) + um;
-        APY     = PtNPC (1) * (vM - vm) + vm;
-        APZ     = PtNPC (2) * (fpd - bpd) + bpd;
-
-#ifdef DEBUG
-        Standard_Integer l,c;
-        printf("OrientationMatrix :");
-        for( l=0 ; l<4 ; l++ ) {
-          printf("\n    %d->",l);
-          for( c=0 ; c<4 ; c++ ) {
-            printf(" %f ,",MyMatrixOfOrientation(c,l));
-          }
-        }
-        printf("\n\n");
-        printf("MappingMatrix :");
-        for( l=0 ; l<4 ; l++ ) {
-          printf("\n    %d->",l);
-          for( c=0 ; c<4 ; c++ ) {
-            printf(" %f ,",MyMatrixOfMapping(c,l));
-          }
-        }
-        printf("\n\n");
-        printf("World coordinates : %f,%f,%f,%f\n",
-                        PtWC(0),PtWC(1),PtWC(2),PtWC(3));
-        printf("View coordinates : %f,%f,%f,%f\n",
-                        PtVRC(0),PtVRC(1),PtVRC(2),PtVRC(3));
-        printf("Display coordinates : %f,%f,%f,%f\n",
-                        PtNPC(0),PtNPC(1),PtNPC(2),PtNPC(3));
-        printf("Window limit : %f,%f,%f,%f\n",um,vm,uM,vM);
-        printf("Ratio : %f\n",Ratio);
-        printf("Front-plane : %f back-plane : %f\n",fpd,bpd);
-        printf("Projection : %f,%f,%f\n \n",APX,APY,APZ);
-#endif
-
-}
-#endif /* OLD_METHOD */
-
-// OCC18942: This method is likely to duplicate Visual3d_ViewManager::ConvertCoord() one,
-// therefore it is necessary to consider merging the two methods or making them call the same
-// graphic driver's method after OCCT 6.3.
-void Visual3d_View::Projects (const Standard_Real AX, const Standard_Real AY, const Standard_Real AZ, Standard_Real& APX, Standard_Real& APY, Standard_Real& APZ) {
+//=======================================================================
+//function : Projects
+//purpose  :
+//=======================================================================
+void Visual3d_View::Projects (const Standard_Real theX,
+                              const Standard_Real theY,
+                              const Standard_Real theZ,
+                              Standard_Real& thePX,
+                              Standard_Real& thePY,
+                              Standard_Real& thePZ) const
+{
+  const Handle(Graphic3d_Camera)& aCamera = MyCView.Context.Camera;
 
-Standard_Real PtX, PtY, PtZ, PtT;
-Standard_Real APT;
-static Standard_Real Ratio, um, vm, uM, vM;
-static Standard_Real fpd, bpd;
+  gp_XYZ aViewSpaceDimensions = aCamera->ViewDimensions();
+  Standard_Real aXSize = aViewSpaceDimensions.X();
+  Standard_Real aYSize = aViewSpaceDimensions.Y();
+  Standard_Real aZSize = aViewSpaceDimensions.Z();
 
-        if (! MyMatOfOriIsEvaluated || ! MyMatOfMapIsEvaluated) {
-                MyGraphicDriver->InquireMat
-                    (MyCView, MyMatrixOfOrientation, MyMatrixOfMapping);
-                MyMatOfOriIsEvaluated = MyMatOfMapIsEvaluated = Standard_True;
-        }
+  gp_Pnt aPoint = aCamera->Project (gp_Pnt (theX, theY, theZ));
 
-        // WCS -> View Reference Coordinate Space
-        PtX     = MyMatrixOfOrientation (0, 0) * AX
-                + MyMatrixOfOrientation (0, 1) * AY
-                + MyMatrixOfOrientation (0, 2) * AZ
-                + MyMatrixOfOrientation (0, 3);
-        PtY     = MyMatrixOfOrientation (1, 0) * AX
-                + MyMatrixOfOrientation (1, 1) * AY
-                + MyMatrixOfOrientation (1, 2) * AZ
-                + MyMatrixOfOrientation (1, 3);
-        PtZ     = MyMatrixOfOrientation (2, 0) * AX
-                + MyMatrixOfOrientation (2, 1) * AY
-                + MyMatrixOfOrientation (2, 2) * AZ
-                + MyMatrixOfOrientation (2, 3);
-        PtT     = MyMatrixOfOrientation (3, 0) * AX
-                + MyMatrixOfOrientation (3, 1) * AY
-                + MyMatrixOfOrientation (3, 2) * AZ
-                + MyMatrixOfOrientation (3, 3);
-
-        // VRCS -> Normalized Projection Coordinate Space
-        APX     = MyMatrixOfMapping (0, 0) * PtX
-                + MyMatrixOfMapping (0, 1) * PtY
-                + MyMatrixOfMapping (0, 2) * PtZ
-                + MyMatrixOfMapping (0, 3) * PtT;
-        APY     = MyMatrixOfMapping (1, 0) * PtX
-                + MyMatrixOfMapping (1, 1) * PtY
-                + MyMatrixOfMapping (1, 2) * PtZ
-                + MyMatrixOfMapping (1, 3) * PtT;
-        APZ     = MyMatrixOfMapping (2, 0) * PtX
-                + MyMatrixOfMapping (2, 1) * PtY
-                + MyMatrixOfMapping (2, 2) * PtZ
-                + MyMatrixOfMapping (2, 3) * PtT;
-        APT     = MyMatrixOfMapping (3, 0) * PtX
-                + MyMatrixOfMapping (3, 1) * PtY
-                + MyMatrixOfMapping (3, 2) * PtZ
-                + MyMatrixOfMapping (3, 3) * PtT;
-
-        APX /= APT;
-        APY /= APT;
-        APZ /= APT;
-
-        // NPCS -> Window Space
-        MyViewMapping.WindowLimit (um, vm, uM, vM);
-        fpd     = MyViewMapping.FrontPlaneDistance ();
-        bpd     = MyViewMapping.BackPlaneDistance ();
-
-        if(MyCView.Mapping.IsCustomMatrix) {
-               // OCC18942: SAN - If orientation and mapping matrices are those used by OpenGL
-               // visualization, then X, Y and Z coordinates normally vary between -1 and 1
-               APX     = ( APX + 1 ) * 0.5 * (uM - um) + um;
-               APY     = ( APY + 1 ) * 0.5 * (vM - vm) + vm;
-        } else {
-               Ratio   = (uM - um) / (vM - vm);
-               if (Ratio >= 1.0)
-                       APY *= Ratio;
-               else
-                       APX /= Ratio;
-
-               /*
-         * Coordinates of APX, APY, APZ are described in the space
-         * [0-1]x[0-1]x[0-1].
-         * It is necessary to transform x and y in the window space.
-         * It is necessary to transform z in the space of back and front
-         * plane, taking into account clipping planes.
-         * Z clipping planes are defined between 0 and 1.
-               */
-            APX     = APX * (uM - um) + um;
-            APY     = APY * (vM - vm) + vm;
-        }
-        APZ     = APZ * (fpd - bpd) + bpd;
+  // NDC [-1, 1] --> PROJ [ -size / 2, +size / 2 ]
+  thePX = aPoint.X() * aXSize * 0.5;
+  thePY = aPoint.Y() * aYSize * 0.5;
+  thePZ = aPoint.Z() * aZSize * 0.5;
 }
 
 Standard_Integer Visual3d_View::Identification () const {
@@ -2897,14 +2190,8 @@ Standard_Boolean ComputeShading = ((ViewType == Visual3d_TOV_SHADING) &&
                         NewStructId = TheStructure->Identification ();
 
                         // The previous calculation is removed and the new one is dislayed
-                        MyGraphicDriver->EraseStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ());
-                        MyGraphicDriver->DisplayStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)TheStructure->CStructure (),
-                                int (AStructure->DisplayPriority ())
-                        );
+                        MyGraphicDriver->EraseStructure   (MyCView, *(MyCOMPUTEDSequence.Value (Index)->CStructure()));
+                        MyGraphicDriver->DisplayStructure (MyCView, *(TheStructure->CStructure()), AStructure->DisplayPriority());
 
 #ifdef TRACE_LENGTH
         if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
@@ -3021,22 +2308,20 @@ void Visual3d_View::TriedronEcho (const Aspect_TypeOfTriedronEcho AType ) {
 
 }
 
-Standard_Boolean checkFloat(const Standard_Real value)
+static Standard_Boolean checkFloat(const Standard_Real value)
 {
     return value > -FLT_MAX && value < FLT_MAX;
 }
 
-void SetMinMaxValuesCallback(void* Visual3dView)
+static void SetMinMaxValuesCallback(Visual3d_View* theView)
 {
     Standard_Real xmin, ymin, zmin, xmax, ymax, zmax;
-
-    Handle(Visual3d_View) view = (Handle(Visual3d_View)&) Visual3dView;
-    view->MinMaxValues(xmin, ymin, zmin, xmax, ymax, zmax);
+    theView->MinMaxValues(xmin, ymin, zmin, xmax, ymax, zmax);
 
     if (checkFloat(xmin) && checkFloat(ymin) && checkFloat(zmin) &&
         checkFloat(xmax) && checkFloat(ymax) && checkFloat(zmax))
     {
-        Handle(Graphic3d_GraphicDriver) driver = Handle(Graphic3d_GraphicDriver)::DownCast(view->GraphicDriver());
+        Handle(Graphic3d_GraphicDriver) driver = Handle(Graphic3d_GraphicDriver)::DownCast(theView->GraphicDriver());
         driver->GraduatedTrihedronMinMaxValues((Standard_ShortReal)xmin, (Standard_ShortReal)ymin, (Standard_ShortReal)zmin,
                                                (Standard_ShortReal)xmax, (Standard_ShortReal)ymax, (Standard_ShortReal)zmax);
     }
@@ -3355,17 +2640,8 @@ void Visual3d_View :: SetComputedMode ( const Standard_Boolean aMode )
 
      StructId = MyCOMPUTEDSequence.Value ( Index ) -> Identification ();
 
-     MyGraphicDriver -> EraseStructure (
-                         MyCView,
-                         *( Graphic3d_CStructure* )
-                          MyCOMPUTEDSequence.Value ( Index ) -> CStructure ()
-                        );
-     MyGraphicDriver -> DisplayStructure (
-                         MyCView,
-                                         *( Graphic3d_CStructure* )
-                          S1Iterator.Key () -> CStructure (),
-                         int (  S1Iterator.Key () -> DisplayPriority ()  )
-                                    );
+     MyGraphicDriver->EraseStructure   (MyCView, *(MyCOMPUTEDSequence.Value (Index)->CStructure()));
+     MyGraphicDriver->DisplayStructure (MyCView, *(S1Iterator.Key()->CStructure()), S1Iterator.Key()->DisplayPriority());
     }  // end if ( Index != 0 ) . . .
 
    }  // end if ( Answer . . . )
@@ -3388,17 +2664,8 @@ void Visual3d_View :: SetComputedMode ( const Standard_Boolean aMode )
 
      StructId = MyCOMPUTEDSequence.Value ( Index ) -> Identification ();
 
-     MyGraphicDriver -> EraseStructure (
-                         MyCView,
-                         *( Graphic3d_CStructure* )
-                          S1Iterator.Key () -> CStructure ()
-                        );
-     MyGraphicDriver -> DisplayStructure (
-                         MyCView,
-                                         *( Graphic3d_CStructure* )
-                          MyCOMPUTEDSequence.Value ( Index ) -> CStructure (),
-                                         int (  S1Iterator.Key () -> DisplayPriority ()  )
-                        );
+     MyGraphicDriver->EraseStructure   (MyCView, *(S1Iterator.Key()->CStructure()));
+     MyGraphicDriver->DisplayStructure (MyCView, *(MyCOMPUTEDSequence.Value (Index)->CStructure()), S1Iterator.Key()->DisplayPriority());
 
      Display (  S1Iterator.Key (), Aspect_TOU_WAIT  );
 
@@ -3510,16 +2777,8 @@ void Visual3d_View :: SetComputedMode ( const Standard_Boolean aMode )
 
      }  // end else
 
-     MyGraphicDriver -> EraseStructure (
-                         MyCView,
-                         *( Graphic3d_CStructure* )
-                          S1Iterator.Key () -> CStructure ()
-                        );
-     MyGraphicDriver -> DisplayStructure (
-                         MyCView,
-                         *( Graphic3d_CStructure* )TheStructure -> CStructure (),
-                         int (  S1Iterator.Key () -> DisplayPriority ()  )
-                        );
+     MyGraphicDriver->EraseStructure   (MyCView, *(S1Iterator.Key()->CStructure()));
+     MyGraphicDriver->DisplayStructure (MyCView, *(TheStructure->CStructure()), S1Iterator.Key()->DisplayPriority());
     }  // end else
 
    }  // end if
@@ -3698,6 +2957,5 @@ void Visual3d_View::RemoveZLayer (const Standard_Integer theLayerId)
 void Visual3d_View::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
                                   const Standard_Integer theLayerId)
 {
-  MyGraphicDriver->ChangeZLayer (
-    (*(Graphic3d_CStructure*)theStructure->CStructure()), MyCView, theLayerId);
+  MyGraphicDriver->ChangeZLayer (*(theStructure->CStructure()), MyCView, theLayerId);
 }