0024819: TKOpenGl - extend the ray-tracing core by visualization of lines, text and...
[occt.git] / src / Visual3d / Visual3d_View.cxx
old mode 100755 (executable)
new mode 100644 (file)
index e667120..f33d6ea
@@ -1,20 +1,16 @@
 // Copyright (c) 1995-1999 Matra Datavision
-// Copyright (c) 1999-2012 OPEN CASCADE SAS
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
 //
-// The content of this file is subject to the Open CASCADE Technology Public
-// License Version 6.5 (the "License"). You may not use the content of this file
-// except in compliance with the License. Please obtain a copy of the License
-// at http://www.opencascade.org and read it completely before using this file.
+// This file is part of Open CASCADE Technology software library.
 //
-// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
-// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+// 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.
 //
-// The Original Code and all software distributed under the License is
-// distributed on an "AS IS" basis, without warranty of any kind, and the
-// Initial Developer hereby disclaims all such warranties, including without
-// limitation, any warranties of merchantability, fitness for a particular
-// purpose or non-infringement. Please see the License for the specific terms
-// and conditions governing the rights and limitations under the License.
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
 
 /***********************************************************************
 
         A view is defined by :
                 -  ViewManager
                 -  ContextView
-                -  ViewMapping
-                -  ViewOrientation
 
      HISTORIQUE DES MODIFICATIONS   :
      --------------------------------
       Mars 1992 : NW,JPB,CAL ; Creation.
       04-02-97  : FMN ; Suppression de PSOutput, XWDOutput ...
-      22-04-97  : CAL ; Ajout du Plot.
       03-06-97  : FMN ; Correction calcul SetRatio
       06-05-97  : CAL ; Ajout du Clear sur les TOS_COMPUTED.
       28-07-97  : PCT ; Ajout lumiere frontale headlight.
@@ -48,7 +41,6 @@
       ??-11-97  : CAL ; Retrait de la dependance avec math. Calcul developpe.
       ??-11-97  : CAL ; Ajout de NumberOfDisplayedStructures
       07-08-97  : PCT ; ajout support texture mapping
-      05-01-98  : CAL ; Ajout de AnimationMode
       15-01-98  : FMN ; FRA60019 calcul Ratio pour MyViewMappingReset
       15-01-98  : CAL ; Ajout de la transformation d'une TOS_COMPUTED
       26-01-98  : CAL ; Ajout de la methode HaveTheSameOwner
 #define BUC60572        //GG_03-08-99    Add protection on Zclipping & Zcueing planes
 //              positions.
 
-#define BUC60570        //GG 14-09-99 Don't activates lighting
-//                      when the view shading model is NONE.
-
 #define GER61454        //GG 14-09-99 Activates model clipping planes
 
-#define G003            //EUG 30-09-00 Degeneration management
-//                                     Backfacing management
-
 #define RIC120302       //GG Add a NEW SetWindow method which enable
 //                      to connect a graphic widget and context to OGL.
 
 #include <Graphic3d_Vertex.hxx>
 
 #include <Visual3d_Light.hxx>
-#include <Visual3d_SetOfLight.hxx>
-#include <Visual3d_HSetOfLight.hxx>
-#include <Visual3d_SetIteratorOfSetOfLight.hxx>
-
-#include <Visual3d_ClipPlane.hxx>
-#include <Visual3d_SetOfClipPlane.hxx>
-#include <Visual3d_HSetOfClipPlane.hxx>
-#include <Visual3d_SetIteratorOfSetOfClipPlane.hxx>
-
-#include <Visual3d_SetIteratorOfSetOfView.hxx>
+#include <Visual3d_HSequenceOfView.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));
@@ -202,225 +171,12 @@ Standard_Integer i, j;
         MyCView.DefWindow.IsDefined   = 0;
 
         MyCView.Context.NbActiveLight = 0;
-        MyCView.Context.NbActivePlane = 0;
-#ifdef GER61454
-        MyCView.Context.ActivePlane   = NULL;
-#endif
-
-        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;
-
-        DegenerateModeIsActive  = Standard_False;
-        AnimationModeIsActive   = Standard_False;
-
         IsInitialized = Standard_False;
-#ifdef G003
-        MyCView.IsDegenerates     = 0;
-        MyCView.IsDegeneratesPrev = 0;
         ComputedModeIsActive      = Standard_False;
         MyCView.Backfacing        = 0;
-#endif  // G003
-
-        MyCView.ptrUnderLayer = 0;
-        MyCView.ptrOverLayer = 0;
-        MyCView.GContext = 0;
-        MyCView.GDisplayCB = 0;
-        MyCView.GClientData = 0;
-
-        MyGraphicDriver = MyViewManager->GraphicDriver();
-
-}
-
-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;
-        MyCView.Context.NbActivePlane = 0;
-#ifdef GER61454
-        MyCView.Context.ActivePlane = NULL;
-#endif
-
-        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;
-#ifdef G003
-        AnimationModeIsActive     = Standard_False;
-        MyCView.IsDegenerates     = 0;
-        MyCView.IsDegeneratesPrev = 0;
-        ComputedModeIsActive      = Standard_False;
-#endif  // G003
 
         MyCView.ptrUnderLayer = 0;
         MyCView.ptrOverLayer = 0;
@@ -432,8 +188,6 @@ Standard_Real um, vm, uM, vM;
 
 }
 
-//-Destructors
-
 //-Methods, in order
 // RIC120302
 void Visual3d_View::SetWindow (const Handle(Aspect_Window)&      AWindow,
@@ -455,16 +209,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());
@@ -480,7 +234,7 @@ void Visual3d_View::SetWindow (const Handle(Aspect_Window)& theWindow)
 #else
   const Handle(Xw_Window) aWin    = Handle(Xw_Window)::DownCast (theWindow);
   MyCView.DefWindow.XWindow       = aWin->XWindow();
-  MyCView.DefWindow.XParentWindow = aWin->XParentWindow();
+  //MyCView.DefWindow.XParentWindow = aWin->XParentWindow();
 #endif
 
         Standard_Integer Width, Height;
@@ -599,9 +353,6 @@ void Visual3d_View::Remove () {
         MyCView.IsDeleted       = 1;
         MyCView.DefWindow.IsDefined     = 0;
 
-        MyMatOfMapIsEvaluated   = Standard_False;
-        MyMatOfOriIsEvaluated   = Standard_False;
-
         IsInitialized = Standard_False;
 
         MyWindow.Nullify ();
@@ -619,324 +370,100 @@ 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) ;
-
-            // Update before SetViewMapping.
+void Visual3d_View::SetRatio()
+{
+  if (IsDeleted())
+  {
+    return;
+  }
 
-            MyCView.DefWindow.dx        = float( Dxw );
-            MyCView.DefWindow.dy        = float( Dyw );
+  Aspect_TypeOfUpdate UpdateMode = MyViewManager->UpdateMode();
 
-            SetViewMapping (MyViewMapping);
-//          SetViewMappingDefault ();
-            // FMN+ Update Ratio for MyViewMappingReset
+  MyViewManager->SetUpdateMode (Aspect_TOU_WAIT);
 
-            MyViewMappingReset.WindowLimit(Umin,Vmin,Umax,Vmax) ;
-            Xc  = (Umin + Umax)/2. ; Yc = (Vmin + Vmax)/2. ;
-            Dxv = Umax - Umin ; Dyv     = Vmax - Vmin ;
+  Standard_Integer 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;
-                }
-            }
+  MyWindow->Size (aWidth, aHeight);
 
-            Umin        = Xc - Dxv/2. ; Vmin    = Yc - Dyv/2. ;
-            Umax        = Xc + Dxv/2. ; Vmax    = Yc + Dyv/2. ;
+  if( aWidth > 0 && aHeight > 0 )
+  {
+    Standard_Real aRatio = (Standard_Real)aWidth / (Standard_Real)aHeight; 
 
-            MyViewMappingReset.SetWindowLimit(Umin,Vmin,Umax,Vmax) ;
+    MyCView.DefWindow.dx = Standard_ShortReal (aWidth);
+    MyCView.DefWindow.dy = Standard_ShortReal (aHeight);
 
-            // FMN- Update Ratio for MyViewMappingReset
+    MyGraphicDriver->RatioWindow (MyCView);
 
-            MyGraphicDriver->RatioWindow (MyCView);
-        }
+    // Update camera aspect
+    Handle(Graphic3d_Camera) aCamera = MyCView.Context.Camera;
 
-        // 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 () {
+void Visual3d_View::UpdateLights()
+{
+  if (IsDeleted()
+   || !IsDefined())
+  {
+    return;
+  }
 
-Standard_Integer i, j;
-CALL_DEF_LIGHT *lights=NULL;
+  if (MyContext.Model() == Visual3d_TOM_NONE)
+  {
+    // activate only a white ambient light
+    Graphic3d_CLight aCLight;
+    aCLight.Type        = Visual3d_TOLS_AMBIENT;
+    aCLight.IsHeadlight = Standard_False;
+    aCLight.Color.r() = aCLight.Color.g() = aCLight.Color.b() = 1.0f;
 
-#ifdef BUC60570
-  if( MyContext.Model() == Visual3d_TOM_NONE ) {
-// Activates only a white ambient light
     MyCView.Context.NbActiveLight = 1;
-    lights      = new CALL_DEF_LIGHT [MyCView.Context.NbActiveLight];
-    MyCView.Context.ActiveLight = lights;
-
-    lights[0].WsId              = MyCView.ViewId;
-    lights[0].ViewId    = MyCView.ViewId;
-    lights[0].LightType = int (Visual3d_TOLS_AMBIENT);
-    lights[0].Active    = 1;
-    lights[0].LightId   = 0;
-    lights[0].Headlight = 0;
-    lights[0].Color.r   = lights[0].Color.g = lights[0].Color.b = 1.;
-  } else {
-#endif
-        i       = MyContext.NumberOfActivatedLights ();
-        j       = MyGraphicDriver->InquireLightLimit ();
-        MyCView.Context.NbActiveLight   = (i > j ? j : i);
-
-        if (MyCView.Context.NbActiveLight > 0) {
-
-                // Dynamic Allocation
-                lights  = new CALL_DEF_LIGHT [MyCView.Context.NbActiveLight];
-
-                MyCView.Context.ActiveLight     = lights;
-
-Standard_Real X, Y, Z;
-
-Standard_Real LightConcentration;
-Standard_Real LightAttenuation1;
-Standard_Real LightAttenuation2;
-Standard_Real LightAngle;
-Quantity_Color LightColor;
-Graphic3d_Vertex LightPosition;
-Graphic3d_Vector LightDirection;
-Visual3d_TypeOfLightSource LightType=Visual3d_TOLS_AMBIENT;
-
-                // Parcing of light sources
-                for (j=0; j<MyCView.Context.NbActiveLight; j++) {
-                        LightType       = (MyContext.ActivatedLight (j+1))->LightType ();
-
-                        lights[j].WsId          = MyCView.ViewId;
-                        lights[j].ViewId        = MyCView.ViewId;
-
-                        lights[j].LightType     = int (LightType);
-                        lights[j].Active        = 1;
-                        lights[j].LightId       =
-                                int ((MyContext.ActivatedLight (j+1))->Identification ());
-                        lights[j].Headlight = (MyContext.ActivatedLight (j+1))->Headlight ()? 1:0;
-
-                        switch (LightType) {
-
-                        case Visual3d_TOLS_AMBIENT :
-                                (MyContext.ActivatedLight (j+1))->Values (
-                                                        LightColor
-                                                                );
-                        break;
-
-                        case Visual3d_TOLS_POSITIONAL :
-                                (MyContext.ActivatedLight (j+1))->Values (
-                                                        LightColor,
-                                                        LightPosition,
-                                                        LightAttenuation1,
-                                                        LightAttenuation2
-                                                                );
-                        break;
-
-                        case Visual3d_TOLS_DIRECTIONAL :
-                                (MyContext.ActivatedLight (j+1))->Values (
-                                                        LightColor,
-                                                        LightDirection
-                                                                );
-                        break;
-
-                        case Visual3d_TOLS_SPOT :
-                                (MyContext.ActivatedLight (j+1))->Values (
-                                                        LightColor,
-                                                        LightPosition,
-                                                        LightDirection,
-                                                        LightConcentration,
-                                                        LightAttenuation1,
-                                                        LightAttenuation2,
-                                                        LightAngle
-                                                                );
-                        break;
-
-                        }
-
-                        lights[j].Color.r       = float (LightColor.Red ());
-                        lights[j].Color.g       = float (LightColor.Green ());
-                        lights[j].Color.b       = float (LightColor.Blue ());
-
-                        if ( (LightType == Visual3d_TOLS_POSITIONAL) ||
-                             (LightType == Visual3d_TOLS_SPOT) ) {
-                                LightPosition.Coord (X, Y, Z);
-                                lights[j].Position.x    = float (X);
-                                lights[j].Position.y    = float (Y);
-                                lights[j].Position.z    = float (Z);
-                        }
-
-                        if ( (LightType == Visual3d_TOLS_DIRECTIONAL) ||
-                             (LightType == Visual3d_TOLS_SPOT) ) {
-                                LightDirection.Coord (X, Y, Z);
-                                lights[j].Direction.x   = float (X);
-                                lights[j].Direction.y   = float (Y);
-                                lights[j].Direction.z   = float (Z);
-                        }
-
-                        if ( (LightType == Visual3d_TOLS_POSITIONAL) ||
-                             (LightType == Visual3d_TOLS_SPOT) ) {
-                                lights[j].Attenuation[0] =
-                                        float (LightAttenuation1);
-                                lights[j].Attenuation[1] =
-                                        float (LightAttenuation2);
-                        }
-
-                        if (LightType == Visual3d_TOLS_SPOT) {
-                                lights[j].Concentration =
-                                        float (LightConcentration);
-                                lights[j].Angle         =
-                                        float (LightAngle);
-                        }
-                }
-
-        }
-#ifdef BUC60570
+    MyCView.Context.ActiveLight   = &aCLight;
+    MyGraphicDriver->SetLight (MyCView);
+    MyCView.Context.ActiveLight   = NULL;
+    return;
   }
-#endif
-        // management of light sources
-        if (! IsDeleted ())
-                if (IsDefined ())
-                        MyGraphicDriver->SetLight (MyCView);
 
-        // Dynamic allocation
-        if (MyCView.Context.NbActiveLight > 0) delete [] lights;
+  MyCView.Context.NbActiveLight = Min (MyContext.NumberOfActivatedLights(),
+                                       MyGraphicDriver->InquireLightLimit());
+  if (MyCView.Context.NbActiveLight < 1)
+  {
+    MyGraphicDriver->SetLight (MyCView);
+    return;
+  }
 
+  // parcing of light sources
+  MyCView.Context.ActiveLight = new Graphic3d_CLight[MyCView.Context.NbActiveLight];
+  for (Standard_Integer aLightIter = 0; aLightIter < MyCView.Context.NbActiveLight; ++aLightIter)
+  {
+    MyCView.Context.ActiveLight[aLightIter] = MyContext.ActivatedLight (aLightIter + 1)->CLight();
+  }
+  MyGraphicDriver->SetLight (MyCView);
+  delete[] MyCView.Context.ActiveLight;
+  MyCView.Context.ActiveLight = NULL;
 }
 
-void Visual3d_View::UpdatePlanes () {
-
-Standard_Integer i, j;
-CALL_DEF_PLANE *planes=NULL;
-
-        i       = MyContext.NumberOfActivatedClipPlanes ();
-        j       = MyGraphicDriver->InquirePlaneLimit ();
-        MyCView.Context.NbActivePlane   = (i > j ? j : i);
-
-        if (MyCView.Context.NbActivePlane > 0) {
-
-                // Dynamic Allocation
-#ifdef GER61454 //Keep the plane address for the next Update !
-                if( !MyCView.Context.ActivePlane )
-                   MyCView.Context.ActivePlane = new CALL_DEF_PLANE [j];
-                planes = MyCView.Context.ActivePlane;
-#else
-                planes  = new CALL_DEF_PLANE [MyCView.Context.NbActivePlane];
-
-                MyCView.Context.ActivePlane     = planes;
-#endif
-Standard_Real A, B, C, D;
-
-                // Parcing of clipping planes
-                for (j=0; j<MyCView.Context.NbActivePlane; j++) {
-
-                        planes[j].WsId          = MyCView.ViewId;
-                        planes[j].ViewId        = MyCView.ViewId;
-
-                        planes[j].Active        = 1;
-                        planes[j].PlaneId       =
-                                int ((MyContext.ActivatedClipPlane (j+1))->Identification ());
-
-                        (MyContext.ActivatedClipPlane (j+1))->Plane (A, B, C, D);
-                        planes[j].CoefA         = float (A);
-                        planes[j].CoefB         = float (B);
-                        planes[j].CoefC         = float (C);
-                        planes[j].CoefD         = float (D);
-                }
-
-        }
-
-        // Management of planes of clipping model
-        if (! IsDeleted ())
-                if (IsDefined ())
-                        MyGraphicDriver->SetPlane (MyCView);
-
-        // Dynamic allocation
-#ifdef GER61454
-        if ( MyCView.Context.ActivePlane && (MyCView.Context.NbActivePlane == 0)
- ) {
-          delete [] MyCView.Context.ActivePlane;
-          MyCView.Context.ActivePlane = NULL;
-        }
-#else
-        if (MyCView.Context.NbActivePlane > 0) delete [] planes;
-#endif
+void Visual3d_View::UpdatePlanes()
+{
+  MyCView.Context.ClipPlanes = MyContext.ClipPlanes();
+  if (IsDeleted() || !IsDefined())
+  {
+    return;
+  }
 
+  MyGraphicDriver->SetClipPlanes (MyCView);
 }
 
 void Visual3d_View::SetBackground (const Aspect_Background& ABack) {
@@ -1046,382 +573,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) {
@@ -1765,121 +1016,123 @@ 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;
+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;
+  }
 
-        if (! MyWindow->IsMapped ()) return;
+  Aspect_CLayer2d anOverCLayer, anUnderCLayer;
+  anOverCLayer.ptrLayer = anUnderCLayer.ptrLayer = NULL;
+  if (!theOverLayer .IsNull()) anOverCLayer  = theOverLayer ->CLayer();
+  if (!theUnderLayer.IsNull()) anUnderCLayer = theUnderLayer->CLayer();
 
-        // 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);
-        }
+  for (Standard_Integer aRetryIter = 0; aRetryIter < 2; ++aRetryIter)
+  {
+    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);
+      }
+    }
 
+    MyGraphicDriver->Redraw (MyCView, anUnderCLayer, anOverCLayer, theX, theY, theWidth, theHeight);
+    if (!MyGraphicDriver->IsDeviceLost())
+    {
+      return;
+    }
+  }
 }
 
-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) {
+void Visual3d_View::RedrawImmediate (const Handle(Visual3d_Layer)& theUnderLayer,
+                                     const Handle(Visual3d_Layer)& theOverLayer)
+{
+  if (IsDeleted()
+   || !IsDefined()
+   || !IsActive()
+   || !MyWindow->IsMapped())
+  {
+    return;
+  }
 
-        if (IsDeleted ()) 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 ((! IsDefined ()) || (! IsActive ())) return;
+void Visual3d_View::Invalidate()
+{
+  MyGraphicDriver->Invalidate (MyCView);
+}
 
-        if (! MyWindow->IsMapped ()) return;
+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 {
@@ -1927,7 +1180,7 @@ Visual3d_TypeOfAnswer Result = Visual3d_TOA_NO;
 
 }
 
-void Visual3d_View::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AStructure, const Standard_Integer OldPriority, const Standard_Integer NewPriority) {
+void Visual3d_View::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AStructure, const Standard_Integer /*OldPriority*/, const Standard_Integer NewPriority) {
 
         if (IsDeleted ()) return;
         if (! IsDefined ()) return;
@@ -1935,11 +1188,7 @@ void Visual3d_View::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AS
         if (! IsDisplayed (AStructure)) return;
 
 Standard_Integer Index = IsComputed (AStructure);
-#ifdef G003
-        if (  Index != 0 && ComputedMode () && !DegenerateModeIsOn ()  )
-#else
-        if ((Index != 0) && (! DegenerateModeIsOn ()))
-#endif  // G003
+        if (Index != 0 && ComputedMode())
         {
 #ifdef TRACE
        Standard_Integer StructId = MyCOMPUTEDSequence.Value (Index)->Identification ();
@@ -1948,17 +1197,10 @@ 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->ChangePriority (*(MyCOMPUTEDSequence.Value (Index)->CStructure()), MyCView, NewPriority);
         }
-        else {
+        else
+        {
 #ifdef TRACE
         Standard_Integer StructId = AStructure->Identification ();
         cout << "Visual3d_View" << MyCView.ViewId << "::ChangeDisplayPriority ("
@@ -1966,13 +1208,7 @@ 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->ChangePriority (*(AStructure->CStructure()), MyCView, NewPriority);
         }
 
 }
@@ -2061,6 +1297,57 @@ 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_HSequenceOfView) aViews = MyViewManager->DefinedView();
+
+    for (int i=1;i<=aViews->Length();i++)
+    {
+      if (aViews->Value(i).Access() != this)
+      {
+        aViews->Value(i)->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 ());
@@ -2082,95 +1369,33 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& AStructure, cons
 Standard_Integer Index = IsComputed (AStructure);
 
         if ((Index != 0) && (AStructure->Visual () != Graphic3d_TOS_COMPUTED)) {
-
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
-                cout << "In Visual3d_View::Display, ";
-                cout << "TOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-        }
-#endif
                 MyTOCOMPUTESequence.Remove (Index);
                 MyCOMPUTEDSequence.Remove (Index);
-
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ())
-                cout << "\tTOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-#endif
                 Index = 0;
         }
 
        Visual3d_TypeOfAnswer Answer = AcceptDisplay (AStructure);
 
-#ifdef TRACE_DISPLAY
-       Standard_Integer StructId = AStructure->Identification ();
-        cout << "Visual3d_View" << MyCView.ViewId << "::Display ("
-             << StructId << ");\n";
-        cout << flush;
-#endif
-
         if (Answer == Visual3d_TOA_NO) {
-#ifdef TRACE_DISPLAY
-                cout << "Answer : Visual3d_TOA_NO\n";
-                cout << flush;
-#endif
                 return;
         }
 
-        // Mode degenerated active
-#ifdef G003
-        if (  !ComputedMode () || DegenerateModeIsOn ()  )
-                                        Answer = Visual3d_TOA_YES;
-#else
-        if (DegenerateModeIsOn ()) Answer = Visual3d_TOA_YES;
-;
-#endif  // G003
+        if (!ComputedMode())
+        {
+          Answer = Visual3d_TOA_YES;
+        }
 
         if (Answer == Visual3d_TOA_YES ) {
-#ifdef TRACE_DISPLAY
-                cout << "Answer : Visual3d_TOA_YES\n";
-                cout << flush;
-#endif
                 if (IsDisplayed (AStructure)) return;
-                MyGraphicDriver->DisplayStructure (
-                        MyCView,
-                        *(Graphic3d_CStructure *)AStructure->CStructure (),
-                        int (AStructure->DisplayPriority ())
-                );
+                AStructure->CalculateBoundBox();
+                MyGraphicDriver->DisplayStructure (MyCView, *(AStructure->CStructure()), AStructure->DisplayPriority());
                 MyDisplayedStructure.Add (AStructure);
                 if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
         }
 
         if (Answer == Visual3d_TOA_COMPUTE) {
-#ifdef TRACE_DISPLAY
-            cout << "Answer : Visual3d_TOA_COMPUTE\n";
-            cout << "Index : " << Index << "\n" << flush;
-#endif
             if (Index != 0) {
                 // Already computed, is COMPUTED still valid?
-#ifdef TRACE_DISPLAY
-                if (MyCOMPUTEDSequence.Value (Index)->HLRValidation ()) {
-                  cout << "Structure "
-                     << MyTOCOMPUTESequence.Value (Index)->Identification ()
-                     << "already calculated, in the view "
-                     << Identification () << ", par la structure "
-                     << MyCOMPUTEDSequence.Value (Index)->Identification ()
-                     << "\n was not recalculated as HLR is valid\n";
-                  cout << flush;
-                }
-                else {
-                  cout << "Structure "
-                     << MyTOCOMPUTESequence.Value (Index)->Identification ()
-                     << " already calculated, in the view "
-                     << Identification () << ", by the structure "
-                     << MyCOMPUTEDSequence.Value (Index)->Identification ()
-                     << "\n should be recalculated as HLR is invalid\n";
-                  cout << flush;
-                }
-#endif
 Standard_Integer OldStructId =
         MyCOMPUTEDSequence.Value (Index)->Identification ();
 
@@ -2179,11 +1404,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;
@@ -2207,11 +1428,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;
@@ -2221,10 +1438,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)
@@ -2262,37 +1476,16 @@ Standard_Integer ii, jj;
 #endif
             TheStructure->SetHLRValidation (Standard_True);
 
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ())
-                cout << "\tTOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-#endif
-
             // TOCOMPUTE and COMPUTED associated to sequences are added
             MyTOCOMPUTESequence.Append (AStructure);
             MyCOMPUTEDSequence.Append (TheStructure);
 
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ())
-                cout << "\tTOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-#endif
-
             // The previous are removed if necessary
             if (Index != 0) {
                 MyTOCOMPUTESequence.Remove (Index);
                 MyCOMPUTEDSequence.Remove (Index);
             }
 
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ())
-                cout << "\tTOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-#endif
-
 // Return type of visualisation of the view
 Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
 
@@ -2318,28 +1511,12 @@ Standard_Boolean ComputeShading = ((ViewType == Visual3d_TOV_SHADING) &&
                 TheStructure->GraphicHighlight (Aspect_TOHM_COLOR);
             }
 
-#ifdef TRACE_DISPLAY
-            cout << "Structure " << StructId
-                 << " in the view " << Identification ()
-                 << " is calculated by the structure "
-                 << TheStructure->Identification ();
-            if (Answer == Visual3d_TOA_YES)
-                cout << " and displayed\n";
-            else
-                cout << " but not displayed\n";
-            cout << flush;
-#endif
-
             // It is displayed only if the calculated structure
             // has a proper type corresponding to the one of the view.
             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
@@ -2364,19 +1541,13 @@ Standard_Integer StructId;
         if (IsDisplayed (AStructure)) {
 Visual3d_TypeOfAnswer Answer = AcceptDisplay (AStructure);
 
-                // Degenerated mode is active
-#ifdef G003
-                if (  !ComputedMode () || DegenerateModeIsOn ()  )
-                                        Answer = Visual3d_TOA_YES;
-#else
-                if (DegenerateModeIsOn ()) Answer = Visual3d_TOA_YES;
-#endif  // G003
+                if (!ComputedMode())
+                {
+                  Answer = Visual3d_TOA_YES;
+                }
 
                 if (Answer != Visual3d_TOA_COMPUTE) {
-                        MyGraphicDriver->EraseStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)AStructure->CStructure ()
-                        );
+                        MyGraphicDriver->EraseStructure (MyCView, *(AStructure->CStructure()));
                 }
 
                 if (Answer == Visual3d_TOA_COMPUTE) {
@@ -2387,12 +1558,8 @@ Standard_Integer Index = IsComputed (AStructure);
         cout << "Index : " << Index << "\n";
         cout << flush;
 #endif
-#ifdef G003
-                    if (  Index != 0 && ComputedMode () &&
-                                                !DegenerateModeIsOn ()  )
-#else
-                    if ((Index != 0) && (! DegenerateModeIsOn ()))
-#endif  // G003
+
+                    if (Index != 0 && ComputedMode())
                     {
                         StructId =
                         MyCOMPUTEDSequence.Value (Index)->Identification ();
@@ -2403,8 +1570,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
                 }
@@ -2469,6 +1635,14 @@ Standard_Integer Index = IsComputed (AStructure);
                     MyCOMPUTEDSequence.Value (Index)->GraphicTransform (ATrsf);
         }
 
+        Standard_Integer aLayerId = AStructure->GetZLayer();
+        if (!AStructure->IsMutable()
+         && !AStructure->CStructure()->IsForHighlight
+         && !AStructure->CStructure()->IsInfinite)
+        {
+          AStructure->CalculateBoundBox();
+          MyGraphicDriver->InvalidateBVHData (MyCView, aLayerId);
+        }
 }
 
 void Visual3d_View::UnHighlight (const Handle(Graphic3d_Structure)& AStructure) {
@@ -2592,141 +1766,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 ();
-
-    XMax = RealLast ();
-    YMax = RealLast ();
-    ZMax = RealLast ();
+//=============================================================================
+//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();
+
+    theXMax = RealLast();
+    theYMax = RealLast();
+    theZMax = RealLast();
   }
-  else {
+  else
+  {
+    Standard_Real aXm, aYm, aZm, aXM, aYM, aZM;
+    Graphic3d_MapIteratorOfMapOfStructure anIterator (theSet);
 
-  Standard_Real Xm, Ym, Zm, XM, YM, ZM;
-  Graphic3d_MapIteratorOfMapOfStructure Iterator (ASet);
+    theXMin = RealLast();
+    theYMin = RealLast();
+    theZMin = RealLast();
 
-  XMin = RealLast ();
-  YMin = RealLast ();
-  ZMin = RealLast ();
+    theXMax = RealFirst ();
+    theYMax = RealFirst ();
+    theZMax = RealFirst ();
 
-  XMax = RealFirst ();
-  YMax = RealFirst ();
-  ZMax = RealFirst ();
-
-  for ( Iterator.Initialize (ASet);
-        Iterator.More ();
-        Iterator.Next ()) {
+    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;
 
-const TColStd_Array2OfReal& Visual3d_View::MatrixOfMapping () {
+  MinMaxValues (theSet, aXm, aYm, aZm, aXM, aYM, aZM, theToIgnoreInfiniteFlag);
 
-        if (! MyMatOfMapIsEvaluated) {
-                MyGraphicDriver->InquireMat
-                    (MyCView, MyMatrixOfOrientation, MyMatrixOfMapping);
-                MyMatOfMapIsEvaluated   = Standard_True;
-                MyMatOfOriIsEvaluated   = Standard_True;
-        }
+  Projects (aXm, aYm, aZm, aXp, aYp, aZp);
+  theXMin = aXp;
+  theYMin = aYp;
 
-        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 {
@@ -2737,202 +1934,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 {
@@ -3021,12 +2046,10 @@ Standard_Integer Length = MyCOMPUTEDSequence.Length ();
         for (i=1; i<=Length; i++)
             (MyCOMPUTEDSequence.Value (i))->SetHLRValidation (Standard_False);
 
-        // if the degenerated node is active, nothing is recomputed
-#ifdef G003
-        if (  DegenerateModeIsOn () || !ComputedMode ()  ) return;
-#else
-        if (DegenerateModeIsOn ()) return;
-#endif  // G003
+        if (!ComputedMode())
+        {
+          return;
+        }
 
         /*
          * Force HLRValidation to False on all structures
@@ -3046,10 +2069,6 @@ Standard_Integer Length = MyCOMPUTEDSequence.Length ();
          * Remove structures that were calculated for the
          * previous orientation.
          * Recalculation of new structures.
-         * Passage of the degenerated mode ON to OFF =>
-         * Remove structures that were calculated before
-         * the degenerated mode passed to ON.
-         * Recalculate new structures.
          */
 Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
 Visual3d_TypeOfAnswer Answer;
@@ -3085,11 +2104,14 @@ Graphic3d_SequenceOfStructure FooSequence;
 }
 
 void Visual3d_View::ReCompute (const Handle(Graphic3d_Structure)& AStructure) {
-#ifdef G003
-        if ( DegenerateModeIsOn () || !ComputedMode () ) return;
-#else
-        if (DegenerateModeIsOn()) return;
-#endif  // G003
+        if (MyCView.IsCullingEnabled)
+        {
+          AStructure->CalculateBoundBox();
+          Standard_Integer aLayerId = AStructure->DisplayPriority();
+          MyGraphicDriver->InvalidateBVHData(MyCView, aLayerId);
+        }
+
+        if (!ComputedMode()) return;
 
         if (IsDeleted ()) return;
 
@@ -3186,14 +2208,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 ()) {
@@ -3231,332 +2247,12 @@ Standard_Boolean ComputeShading = ((ViewType == Visual3d_TOV_SHADING) &&
 
 }
 
-void
-#ifdef G003
-Visual3d_View::SetAnimationModeOn ( const Standard_Boolean degenerate ) {
-#else
-Visual3d_View::SetAnimationModeOn () {
-#endif
-
-        if (AnimationModeIsOn ()) return;
-
-        AnimationModeIsActive   = Standard_True;
-#ifdef G003
-        if ( degenerate )
-          SetDegenerateModeOn ();
-        else
-          SetDegenerateModeOff ();
-#endif  // G003
-        MyGraphicDriver->BeginAnimation (MyCView);
-
-}
-
-void Visual3d_View::SetAnimationModeOff () {
-
-        if (! AnimationModeIsOn ()) return;
-
-        AnimationModeIsActive   = Standard_False;
-#ifdef G003
-        SetDegenerateModeOff ();
-#endif  // G003
-        MyGraphicDriver->EndAnimation (MyCView);
-
-}
-
-Standard_Boolean Visual3d_View::AnimationModeIsOn () const {
-
-        return AnimationModeIsActive;
-
-}
-
-void Visual3d_View::SetDegenerateModeOn () {
-
-#ifdef TRACE
-        cout << "Visual3d_View" << MyCView.ViewId
-             << "::SetDegenerateModeOn ();\n";
-        cout << flush;
-#endif
-
-        // If the degenerated mode is already active, nothing is recalculated
-        if (DegenerateModeIsOn ()) return;
-        DegenerateModeIsActive = Standard_True;
-
-#ifdef G003
-        MyCView.IsDegenerates  = 1;
-#else
-        /*
-         * Change of activity of the degenerated mode
-         * Remove structures that were calculated
-         * and displayed when the mode was off.
-         * Display of non-calculated structures.
-         */
-Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
-Visual3d_TypeOfAnswer Answer;
-Standard_Integer StructId;
-
-        while (S1Iterator.More ()) {
-
-                Answer  = AcceptDisplay (S1Iterator.Key ());
-                // If the structure was calculated, the previous one is
-                // removed and the new one is displayed
-                // (This is the role of passage into degenerated mode)
-
-                if (Answer == Visual3d_TOA_COMPUTE) {
-Standard_Integer Index = IsComputed (S1Iterator.Key ());
-                    if (Index != 0) {
-                        StructId =
-                        MyCOMPUTEDSequence.Value (Index)->Identification ();
-#ifdef TRACE_COMP
-        cout << "Structure " << S1Iterator.Key ()->Identification ()
-             << " calculated, in the view "
-             << Identification () << ", by structure "
-             << StructId << " passes in degenerated mode.\n";
-        cout << "Remove" << StructId << " then display "
-             << S1Iterator.Key ()->Identification () << "\n";
-        cout << flush;
-#endif
-                        MyGraphicDriver->EraseStructure
-                                (MyCView, *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ());
-                        MyGraphicDriver->DisplayStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)S1Iterator.Key ()->CStructure (),
-                                int (S1Iterator.Key ()->DisplayPriority ())
-                        );
-                    }
-                    else {
-                        // Else is impossible)
-                        // If the mode was not degenerated previously, the
-                        // calculated structure associated to S1Iterator.Key ()
-                        // really exists and Index != 0
-                    }
-                }
-
-                // S1Iterator.Next () is located on the next structure
-                S1Iterator.Next ();
-        }
-#endif  //G003
-}
-
-void Visual3d_View::SetDegenerateModeOff () {
-
-#ifdef TRACE
-        cout << "Visual3d_View" << MyCView.ViewId
-             << "::SetDegenerateModeOff ();\n";
-        cout << flush;
-#endif
-
-        // If the degenerated mode is already inactive, nothing is recalculated
-        if (! DegenerateModeIsOn ()) return;
-
-        DegenerateModeIsActive  = Standard_False;
-
-#ifdef G003
-        MyCView.IsDegenerates  = 0;
-#else
-        /*
-         * Change of activity of degenerated mode
-         * Remove structures that were displayed
-         * when the mode was on.
-         * Calculation of structures.
-         */
-Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
-Visual3d_TypeOfAnswer Answer;
-Standard_Integer StructId;
-
-        Standard_Integer i      = MyDisplayedStructure.Extent ();
-
-        while (S1Iterator.More ()) {
-
-                Answer  = AcceptDisplay (S1Iterator.Key ());
-                // If the structure was calculated, the previous one is
-                // removed and the new one is displayed
-                // (This is the role of passage into degenerated mode)
-
-                if (Answer == Visual3d_TOA_COMPUTE) {
-Standard_Integer Index = IsComputed (S1Iterator.Key ());
-                    if (Index != 0) {
-                        StructId =
-                        MyCOMPUTEDSequence.Value (Index)->Identification ();
-#ifdef TRACE_COMP
-        cout << "Structure " << S1Iterator.Key ()->Identification ()
-             << " calculated, in the view "
-             << Identification () << ", by the structure "
-             << StructId << " passes into normal mode.\n";
-        cout << "Remove " << S1Iterator.Key ()->Identification ()
-             << " then display " << StructId << "\n";
-        cout << flush;
-#endif
-                        MyGraphicDriver->EraseStructure
-                                (MyCView,
-                                *(Graphic3d_CStructure *)S1Iterator.Key ()->CStructure ());
-                        MyGraphicDriver->DisplayStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure (),
-                                int (S1Iterator.Key ()->DisplayPriority ())
-                        );
-
-                        Display (S1Iterator.Key (), Aspect_TOU_WAIT);
-
-                        if ((S1Iterator.Key ())->IsHighlighted()) {
-                           if (! (MyCOMPUTEDSequence.Value (Index))->IsHighlighted()) {
-                                (MyCOMPUTEDSequence.Value (Index))->SetHighlightColor
-                                        ((S1Iterator.Key ())->HighlightColor ());
-                                (MyCOMPUTEDSequence.Value (Index))->GraphicHighlight (Aspect_TOHM_COLOR);
-                            }
-                        }
-                    }
-                    else {
-                        // Else is impossible
-                        // Degenerated mode was activated before display of the
-                        // structure. So the structure was displayed in the
-                        // degenerated mode, but the calculated structure didn't exist.
-                        // It is calculated.
-
-        // Compute + Validation
-Handle(Graphic3d_Structure) AStructure = (S1Iterator.Key ());
-#ifdef OLD
-Handle(Graphic3d_Structure) TheStructure = AStructure->Compute (this);
-#else
-Handle(Graphic3d_Structure) TheStructure;
-TColStd_Array2OfReal ATrsf (0, 3, 0, 3);
-        AStructure->Transform (ATrsf);
-        if (Index != 0) {
-TColStd_Array2OfReal Ident (0, 3, 0, 3);
-Standard_Integer ii, jj;
-        for (ii=0; ii<=3; ii++)
-            for (jj=0; jj<=3; jj++)
-                Ident (ii, jj) = (ii == jj ? 1.0 : 0.0);
-            TheStructure = MyCOMPUTEDSequence.Value (Index);
-            TheStructure->SetTransform (Ident, Graphic3d_TOC_REPLACE);
-            if (AStructure->IsTransformed ()) {
-                AStructure->Compute (this, ATrsf, TheStructure);
-            }
-            else {
-                AStructure->Compute (this, TheStructure);
-            }
-        }
-        else {
-            if (AStructure->IsTransformed ()) {
-                TheStructure = AStructure->Compute (this, ATrsf);
-            }
-            else {
-                TheStructure = AStructure->Compute (this);
-            }
-        }
-#endif
-        TheStructure->SetHLRValidation (Standard_True);
-
-// Return type of visualisation of the view
-Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
-
-// Of which type will be the computed ?
-Standard_Boolean ComputeWireframe = ((ViewType == Visual3d_TOV_WIREFRAME) &&
-        ((S1Iterator.Key ())->ComputeVisual () != Graphic3d_TOS_SHADING));
-
-Standard_Boolean ComputeShading = ((ViewType == Visual3d_TOV_SHADING) &&
-        ((S1Iterator.Key ())->ComputeVisual () != Graphic3d_TOS_WIREFRAME));
-
-                        if (ComputeWireframe)
-                            TheStructure->SetVisual (Graphic3d_TOS_WIREFRAME);
-                        if (ComputeShading)
-                            TheStructure->SetVisual (Graphic3d_TOS_SHADING);
-
-                        if ((S1Iterator.Key ())->IsHighlighted()) {
-                            TheStructure->SetHighlightColor
-                                ((S1Iterator.Key ())->HighlightColor ());
-                            TheStructure->GraphicHighlight (Aspect_TOHM_COLOR);
-                        }
-
-                        // Make range
-Standard_Integer Result = 0;
-Standard_Integer Length = MyTOCOMPUTESequence.Length ();
-                        // Find structure <S1Iterator.Key ()>
-                        // in the sequence of structures to be calculated
-                        StructId = (S1Iterator.Key ())->Identification ();
-                        for (i=1; i<=Length && Result==0; i++)
-                          if ((MyTOCOMPUTESequence.Value (i))->Identification () ==
-                            StructId) Result    = i;
-                        if (Result != 0)
-                          MyCOMPUTEDSequence.ChangeValue (Result) = TheStructure;
-                        else {
-                          // hlhsr and the associated new compute are added
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
-                cout << "In Visual3d_View::SetDegenerateModeOff, ";
-                cout << "TOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-        }
-#endif
-                          MyTOCOMPUTESequence.Append (S1Iterator.Key ());
-                          MyCOMPUTEDSequence.Append (TheStructure);
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ())
-                cout << "\tTOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-#endif
-                        }
-
-                        // The degenerated is removed and the calculated is displayed
-                        MyGraphicDriver->EraseStructure
-                                (MyCView,
-                                *(Graphic3d_CStructure *)(S1Iterator.Key ()->CStructure ()));
-                        MyGraphicDriver->DisplayStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)TheStructure->CStructure (),
-                                int (S1Iterator.Key ()->DisplayPriority ())
-                        );
-                    }
-                }
-
-                // S1Iterator.Next () is located on the next structure
-                S1Iterator.Next ();
-        }
-
-        if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
-#endif  //G003
-}
-
-Standard_Boolean Visual3d_View::DegenerateModeIsOn () const {
-
-        return DegenerateModeIsActive;
-
-}
-
 const Handle(Graphic3d_GraphicDriver)& Visual3d_View::GraphicDriver () const {
 
         return MyGraphicDriver;
 
 }
 
-void Visual3d_View::Plot (const Handle(Graphic3d_Plotter)& APlotter) const {
-
-Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
-
-        while (S1Iterator.More ()) {
-
-                if (DegenerateModeIsOn ())
-                        // As the  mode is degenerated the displayed structure
-                        // is plotted without taking into account if it is calculated or not
-                        (S1Iterator.Key ())->Plot (APlotter);
-                else {
-Standard_Integer Index = IsComputed (S1Iterator.Key ());
-                        // As the  mode is not degenerated the displayed structure
-                        // is plotted as if it was not calculated, otherwise the
-                        // associated calculated structure is plotted.
-                        if (Index == 0)
-                            (S1Iterator.Key ())->Plot (APlotter);
-                        else
-                            (MyCOMPUTEDSequence.Value (Index))->Plot (APlotter);
-                }
-
-                // S1Iterator.Next () is located on the next structure
-                S1Iterator.Next ();
-        }
-
-}
-
 Standard_Integer Visual3d_View::HaveTheSameOwner (const Handle(Graphic3d_Structure)& AStructure) const {
 
 Standard_Integer Result = 0;
@@ -3617,22 +2313,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);
     }
@@ -3924,20 +2618,20 @@ Handle(Visual3d_ViewManager) Visual3d_View::ViewManager() const
   return MyPtrViewManager;
 }
 
-#ifdef G003
-void Visual3d_View :: SetComputedMode ( const Standard_Boolean aMode ) {
-
- if (  (  (aMode &&  ComputedModeIsActive) ||
-         (!aMode && !ComputedModeIsActive)
-       ) || DegenerateModeIsOn ()
- ) return;
+void Visual3d_View :: SetComputedMode ( const Standard_Boolean aMode )
+{
+  if ((aMode &&  ComputedModeIsActive) ||
+     (!aMode && !ComputedModeIsActive))
+  {
+    return;
+  }
 
  Graphic3d_MapIteratorOfMapOfStructure S1Iterator ( MyDisplayedStructure );
  Visual3d_TypeOfAnswer                 Answer;
  Standard_Integer                      StructId;
  Standard_Integer                      i = MyDisplayedStructure.Extent ();
-
- if (  !( ComputedModeIsActive = aMode )  ) {
+ ComputedModeIsActive = aMode;
+ if (!ComputedModeIsActive) {
 
   while (  S1Iterator.More ()  ) {
 
@@ -3951,17 +2645,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 . . . )
@@ -3984,17 +2669,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  );
 
@@ -4106,16 +2782,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
@@ -4175,7 +2843,6 @@ Visual3d_TypeOfBackfacingModel Visual3d_View :: BackFacingModel () const {
  return Visual3d_TOBM_DISABLE;
 
 }  // end Visual3d_View :: BackFacingModel
-#endif  // G003
 
 void Visual3d_View::EnableDepthTest( const Standard_Boolean enable ) const
 {
@@ -4267,6 +2934,17 @@ Standard_Boolean Visual3d_View::Export (const Standard_CString       theFileName
                                   thePrecision, theProgressBarFunc, theProgressObject);
 }
 
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+
+void Visual3d_View::SetZLayerSettings (const Standard_Integer theLayerId,
+                                       const Graphic3d_ZLayerSettings& theSettings)
+{
+  MyGraphicDriver->SetZLayerSettings (MyCView, theLayerId, theSettings);
+}
+
 //=======================================================================
 //function : AddZLayer
 //purpose  :
@@ -4295,6 +2973,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);
 }