0025147: Visualization, TKOpenGl - support EGL as alternative to GLX
[occt.git] / src / Visual3d / Visual3d_View.cxx
old mode 100755 (executable)
new mode 100644 (file)
index d765c3a..35c4a9a
-/***********************************************************************
-
-     FONCTION :
-     ----------
-        Classe Visual3d_View.cxx :
-
-
-        Declaration of variables specific to views.
-
-        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.
-      19-09-97  : CAL ; Remplacement de Window->Position par Window->Size;
-      17-10-97  : CAL ; Le Projects nouveau est arrive. (NewProjects)
-      24-10-97  : CAL ; Retrait de DownCast.
-      24-10-97  : CAL ; Retrait des DataStructure (Vieille maquette inutilisee).
-      17-11-97  : FMN ; Ajout DoResize dans Resized()
-      20-11-97  : CAL ; Disparition de la dependance avec math
-      ??-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
-      06-02-98  : FMN ; CTS19079: TOP TEN: Probleme de highlight dans EDesigner.
-      05-03-98  : CAL ; GraphicTransform que si Trsf non invalidante
-      27-03-98  : CAL ; Ajout de TheStructure = devant Compute (...) !!!!
-      16-04-98  : CAL ; Remise a ID de la Trsf sur la COMPUTED
-      20-05-98  : CAL ; Perfs. Connection entre structures COMPUTED.
-      24-06-98  : CAL ; PRO14526 SetTransparency sur une vue non active.
-      17-07-98  : CAL ; PRO14872 test sur aTrsf dans ::SetTransform.
-      16-09-98  : BGN ; Points d'entree du Triedre (S3819, Phase 1)
-      22-09-98  : BGN ; S3989 (anciennement S3819)
-                        TypeOfTriedron* from Aspect (pas Visual3d)
-      06-10-98  : CAL ; Ajout d'un TIMER si CSF_GraphicTimer est definie.
-      16-10-98  : CAL ; Ajout d'un TIMER si CSF_GraphicTimer est definie.
-      02-11-98  : CAL ; Retrait de OSD::SetSignal.
-      18-11-98  : FMN ; Correction sur la gestion de la perspective
-      02-12-98  : CAL ; S4062. Ajout des layers.
-      13-09-99  : GG  ; GER61454 Adds LightLimit() and PlaneLimit() methods
-      10-11-99  : GG  ; PRO19603 Add Redraw( area ) method
-      14-01-00  : GG  ; IMP140100 Add ViewManager( ) method
-      22-10-01  : SAV ; Added EnableDepthTest() method.
-      30-04-02  : JMB ; MyDisplayStructure : use a Map instead of a Set (very bad performance
-                        in data access when a lot of objects are used)
-                        Will improve performance of selection mechanisms
-
-************************************************************************/
-
-#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 IMP140100       //GG14-01-00 Add ViewManager( ) method
-
-#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.
-
-#define  BUC61044    /* 25/10/01 SAV ; added functionality to control gl depth testing
-                        from higher API */
-#define  BUC61045    /* 25/10/01 SAV ; added functionality to control gl lighting
-                        from higher API */
-
-#define OCC1188         //SAV Added methods to set background image
-
-/*----------------------------------------------------------------------*/
-/*
- * Constantes
- */
-
-#define NO_DEBUG
-#define NO_DESTROY
-#define NO_TRACE
-#define NO_TRACE_ACCEPT
-#define NO_TRACE_CLEAR
-#define NO_TRACE_CONNECT
-#define NO_TRACE_HIGH
-#define NO_TRACE_COMP
-#define NO_TRACE_TRSF
-#define NO_TRACE_DISPLAY
-#define NO_TRACE_ISCOMP
-#define NO_TRACE_LENGTH
-#define NO_TRACE_LAYER
-
-/*----------------------------------------------------------------------*/
-/*
- * Includes
- */
-
-#ifdef WNT
-#include <windows.h>
+// Copyright (c) 1995-1999 Matra Datavision
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public 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.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifdef _WIN32
+  #include <windows.h>
 #endif
 
-// for the class
 #include <Visual3d_View.ixx>
-#include <Visual3d_View.pxx>
-#include <Visual3d_DepthCueingDefinitionError.hxx>
-#include <Visual3d_ZClippingDefinitionError.hxx>
-
-#ifdef OLD_METHOD
-#include <math_Vector.hxx>
-#endif /* OLD_METHOD */
-
-#include <OSD.hxx>
 
-#include <Graphic3d_Structure.hxx>
-#include <Graphic3d_MapOfStructure.hxx>
-#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
 #include <Graphic3d_DataStructureManager.hxx>
-
 #include <Graphic3d_GraphicDriver.hxx>
-#include <Graphic3d_GraphicDevice.hxx>
-
+#include <Graphic3d_MapOfStructure.hxx>
+#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
+#include <Graphic3d_Structure.hxx>
+#include <Graphic3d_TextureEnv.hxx>
 #include <Graphic3d_Vector.hxx>
 #include <Graphic3d_Vertex.hxx>
-
+#include <Visual3d_DepthCueingDefinitionError.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 <Graphic3d_TextureEnv.hxx>
-
+#include <Visual3d_HSequenceOfView.hxx>
+#include <Visual3d_ZClippingDefinitionError.hxx>
+#include <OSD.hxx>
 #include <TColStd_HArray2OfReal.hxx>
 
-#ifndef WNT
-# include <Xw_Window.hxx>
+#if defined(_WIN32)
+  #include <WNT_Window.hxx>
+#elif (defined(__APPLE__) && !defined(MACOSX_USE_GLX))
+  #include <Cocoa_Window.hxx>
 #else
-# include <WNT_Window.hxx>
-#endif  // WNT
+  #include <Xw_Window.hxx>
+#endif
 
 #include <float.h>
 
-//-Aliases
-
-//-Global data definitions
+// =======================================================================
+// function : Visual3d_View
+// purpose  :
+// =======================================================================
+Visual3d_View::Visual3d_View (const Handle(Visual3d_ViewManager)& theMgr)
+: myViewManager         (theMgr.operator->()),
+  myIsInComputedMode    (Standard_False),
+  myAutoZFitIsOn        (Standard_True),
+  myAutoZFitScaleFactor (1.0),
+  myStructuresUpdated   (Standard_True)
+{
+  MyCView.ViewId                  = theMgr->Identification (this);
+  MyCView.Active                  = 0;
+  MyCView.IsDeleted               = 0;
+  MyCView.WsId                    = -1;
+  MyCView.DefWindow.IsDefined     = 0;
+  MyCView.Context.NbActiveLight   = 0;
+  MyCView.Context.ZBufferActivity = -1;
+
+  MyCView.Backfacing    = 0;
+  MyCView.ptrUnderLayer = 0;
+  MyCView.ptrOverLayer  = 0;
+  MyCView.GContext      = 0;
+  MyCView.GDisplayCB    = 0;
+  MyCView.GClientData   = 0;
+
+  myGraphicDriver = myViewManager->GraphicDriver();
+}
+
+// =======================================================================
+// function : SetWindow
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetWindow (const Handle(Aspect_Window)&      theWindow,
+                               const Aspect_RenderingContext     theContext,
+                               const Aspect_GraphicCallbackProc& theDisplayCB,
+                               const Standard_Address            theClientData)
+{
+  if (IsDeleted())
+  {
+    return;
+  }
+  else if (IsDefined())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window already defined");
+  }
 
-//-Constructors
+  MyCView.GContext    = theContext;
+  MyCView.GDisplayCB  = theDisplayCB;
+  MyCView.GClientData = theClientData;
+  SetWindow (theWindow);
+}
 
-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 ()
+// =======================================================================
+// function : SetWindow
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetWindow (const Handle(Aspect_Window)& theWindow)
 {
-Standard_Integer i, j;
+  if (IsDeleted())
+  {
+    return;
+  }
+  else if (IsDefined())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window already defined");
+  }
 
-#ifdef IMP140100
-        MyPtrViewManager        = AManager.operator->();
-#else
-        MyPtrViewManager        = (void *) AManager.operator->();
-#endif
+  MyWindow = theWindow;
+  MyCView.WsId = MyCView.ViewId;
+  MyCView.DefWindow.IsDefined = 1;
+  MyCView.DefWindow.XWindow       = theWindow->NativeHandle();
+  MyCView.DefWindow.XParentWindow = theWindow->NativeParentHandle();
+
+  Standard_Integer Width, Height;
+  theWindow->Size (Width, Height);
+  MyCView.DefWindow.dx = float(Width);
+  MyCView.DefWindow.dy = float(Height);
+
+  Standard_Real R, G, B;
+  MyBackground = MyWindow->Background ();
+  MyBackground.Color().Values (R, G, B, Quantity_TOC_RGB);
+  MyCView.DefWindow.Background.r = float (R);
+  MyCView.DefWindow.Background.g = float (G);
+  MyCView.DefWindow.Background.b = float (B);
+
+  UpdateView();
+  if (!myGraphicDriver->View (MyCView))
+  {
+    Visual3d_ViewDefinitionError::Raise ("Association failed");
+  }
 
-        memset (&MyCView, 0, sizeof(MyCView));
-        MyCView.ViewId          = int (AManager->Identification (this));
-        MyCView.Active          = 0;
-        MyCView.IsDeleted       = 0;
+  MyGradientBackground = MyWindow->GradientBackground();
+  SetGradientBackground(MyGradientBackground,1);
 
-        MyCView.WsId    = -1;
-        MyCView.DefWindow.IsDefined     = 0;
+  Standard_Boolean AWait = Standard_False; // => immediate update
+  myGraphicDriver->SetVisualisation (MyCView);
+  myGraphicDriver->AntiAliasing (MyCView, MyContext.AliasingIsOn());
+  myGraphicDriver->DepthCueing  (MyCView, MyContext.DepthCueingIsOn());
+  myGraphicDriver->ClipLimit    (MyCView, AWait);
+  myGraphicDriver->Environment  (MyCView);
 
-        MyCView.Context.NbActiveLight   = 0;
-        MyCView.Context.NbActivePlane   = 0;
-#ifdef GER61454
-        MyCView.Context.ActivePlane = NULL;
-#endif
+  // Make view manager z layer list consistent with the view's list.
+  myViewManager->InstallZLayers (this);
 
-        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;
-
-        MyMatOfMapIsModified    = Standard_True;
-        MyMatOfOriIsModified    = Standard_True;
-        MyMatOfMapIsEvaluated   = Standard_False;
-        MyMatOfOriIsEvaluated   = Standard_False;
-
-        DegenerateModeIsActive  = Standard_False;
-        AnimationModeIsActive   = 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;
-
-Handle(Aspect_GraphicDriver) agd =
-        (MyViewManager->GraphicDevice ())->GraphicDriver ();
-
-        MyGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd;
+  // Update planses of model clipping
+  UpdatePlanes();
 
+  // Update light sources
+  UpdateLights();
+
+  // Association view-window does not cause the display
+  // of structures that can be displayed in the new view.
+  // In fact, association view-window is done, but the
+  // display is produced only if the view is activated (Activate).
+  SetRatio();
 }
 
-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 ()
+// =======================================================================
+// function : Window
+// purpose  :
+// =======================================================================
+Handle(Aspect_Window) Visual3d_View::Window() const
 {
-Standard_Integer i, j;
-
-#ifdef IMP140100
-        MyPtrViewManager        = AManager.operator->();
-#else
-        MyPtrViewManager        = (void *) AManager.operator->();
-#endif
-
-        MyViewOrientation       = VO;
-        MyViewMapping           = VM;
-        MyContext               = CTX;
-        MyViewOrientationReset  = VO;
-        MyViewMappingReset      = VM;
+  if (!IsDefined())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  }
+  return MyWindow;
+}
 
-        memset (&MyCView, 0, sizeof(MyCView));
-        MyCView.ViewId          = int (AManager->Identification (this));
-        MyCView.Active          = 0;
-        MyCView.IsDeleted       = 0;
+// =======================================================================
+// function : IsDefined
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::IsDefined() const
+{
+  return MyCView.DefWindow.IsDefined != 0;
+}
 
-        MyCView.WsId    = -1;
-        MyCView.DefWindow.IsDefined     = 0;
+// =======================================================================
+// function : IsDeleted
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::IsDeleted() const
+{
+  return MyCView.IsDeleted != 0;
+}
 
-        MyCView.Context.NbActiveLight   = 0;
-        MyCView.Context.NbActivePlane   = 0;
-#ifdef GER61454
-        MyCView.Context.ActivePlane = NULL;
-#endif
+// =======================================================================
+// function : Destroy
+// purpose  :
+// =======================================================================
+void Visual3d_View::Destroy()
+{
+  // Since myViewManager can be already destroyed,
+  // avoid attempts to access it in SetBackground()
+  myViewManager = NULL;
+  Remove();
+}
 
-        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] = 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] = 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.;
-        }
-        //
+// =======================================================================
+// function : Remove
+// purpose  :
+// =======================================================================
+void Visual3d_View::Remove()
+{
+  if (IsDeleted()
+  || !IsDefined())
+  {
+    return;
+  }
 
-        MyCView.Context.ZBufferActivity = -1;
+  myStructsToCompute.Clear();
+  myStructsComputed .Clear();
+  myStructsDisplayed.Clear();
 
-        MyMatOfMapIsModified    = Standard_True;
-        MyMatOfOriIsModified    = Standard_True;
-        MyMatOfMapIsEvaluated   = Standard_False;
-        MyMatOfOriIsEvaluated   = Standard_False;
-#ifdef G003
-        AnimationModeIsActive     = Standard_False;
-        MyCView.IsDegenerates     = 0;
-        MyCView.IsDegeneratesPrev = 0;
-        ComputedModeIsActive      = Standard_False;
-#endif  // G003
+  Aspect_GradientBackground aBlackGrad;
+  SetBackground (Aspect_Background (Quantity_NOC_BLACK));
+  SetGradientBackground (aBlackGrad, Standard_False);
 
-        MyCView.ptrUnderLayer = 0;
-        MyCView.ptrOverLayer = 0;
-        MyCView.GContext = 0;
-        MyCView.GDisplayCB = 0;
-        MyCView.GClientData = 0;
+  if (myViewManager != NULL)
+  {
+    myViewManager->UnIdentification (MyCView.ViewId);
+  }
 
-Handle(Aspect_GraphicDriver) agd =
-        (MyViewManager->GraphicDevice ())->GraphicDriver ();
+  myGraphicDriver->RemoveView (MyCView);
 
-        MyGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd;
+  MyCView.WsId                = -1;
+  MyCView.IsDeleted           = 1;
+  MyCView.DefWindow.IsDefined = 0;
 
+  MyWindow.Nullify();
 }
 
-//-Destructors
-
-//-Methods, in order
-// RIC120302
-void Visual3d_View::SetWindow (const Handle(Aspect_Window)&      AWindow,
-                               const Aspect_RenderingContext     AContext,
-                               const Aspect_GraphicCallbackProc& ADisplayCB,
-                               const Standard_Address            AClientData)
+// =======================================================================
+// function : Resized
+// purpose  :
+// =======================================================================
+void Visual3d_View::Resized()
 {
-  if (IsDeleted ()) return;
-
-  if (IsDefined ())
-    Visual3d_ViewDefinitionError::Raise ("Window already defined");
-
-  MyCView.GContext        = AContext;
-  MyCView.GDisplayCB      = ADisplayCB;
-  MyCView.GClientData     = AClientData;
-  SetWindow(AWindow);
+  if (IsDeleted())
+  {
+    return;
+  }
+  else if (!IsDefined())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  }
+  MyWindow->DoResize();
+  SetRatio();
 }
-// RIC120302
-
-void Visual3d_View::SetWindow (const Handle(Aspect_Window)& AWindow) {
 
-        if (IsDeleted ()) return;
+// =======================================================================
+// function : SetRatio
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetRatio()
+{
+  if (IsDeleted())
+  {
+    return;
+  }
 
-        if (IsDefined ())
-                Visual3d_ViewDefinitionError::Raise ("Window already defined");
+  const Aspect_TypeOfUpdate anUpdateMode = myViewManager->UpdateMode();
+  myViewManager->SetUpdateMode (Aspect_TOU_WAIT);
 
-        MyWindow        = AWindow;
-        MyCView.WsId                    = MyCView.ViewId;
-        MyCView.DefWindow.IsDefined     = 1;
-#ifndef WNT
-const Handle(Xw_Window) theWindow = *(Handle(Xw_Window) *) &AWindow;
-        MyCView.DefWindow.XWindow       = theWindow->XWindow ();
-#ifdef RIC120302
-        MyCView.DefWindow.XParentWindow = theWindow->XParentWindow ();
-#endif
-#else
-WNT_WindowData* wd;
-const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AWindow;
-        MyCView.DefWindow.XWindow       = ( HWND )(theWindow->HWindow());
-#ifdef RIC120302
-        MyCView.DefWindow.XParentWindow = ( HWND )(theWindow->HParentWindow());
-#endif
-        wd = ( WNT_WindowData* )GetWindowLongPtr (( HWND )(theWindow->HWindow()), GWLP_USERDATA);
-        wd -> WNT_WDriver_Ptr = ( void* )this;
-        wd -> WNT_VMgr        = ( void* )MyPtrViewManager;
-#endif  /* WNT */
+  Standard_Integer aWidth, aHeight;
+  MyWindow->Size (aWidth, aHeight);
+  if (aWidth > 0 && aHeight > 0)
+  {
+    Standard_Real aRatio = (Standard_Real)aWidth / (Standard_Real)aHeight; 
 
-        Standard_Integer Width, Height;
-        AWindow->Size (Width, Height);
+    MyCView.DefWindow.dx = Standard_ShortReal (aWidth);
+    MyCView.DefWindow.dy = Standard_ShortReal (aHeight);
 
-        MyCView.DefWindow.dx    = float( Width );
-        MyCView.DefWindow.dy    = float( Height );
+    myGraphicDriver->RatioWindow (MyCView);
 
-        Standard_Real R, G, B;
-        MyBackground    = MyWindow->Background ();
-        (MyBackground.Color ()).Values (R, G, B, Quantity_TOC_RGB);
-        MyCView.DefWindow.Background.r  = float (R);
-        MyCView.DefWindow.Background.g  = float (G);
-        MyCView.DefWindow.Background.b  = float (B);
+    // Update camera aspect
+    const Handle(Graphic3d_Camera)& aCamera = MyCView.Context.Camera;
+    if (!aCamera.IsNull())
+    {
+      aCamera->SetAspect (aRatio);
+    }
 
-        UpdateView ();
-        if (! MyGraphicDriver->View (MyCView))
-                Visual3d_ViewDefinitionError::Raise ("Association failed");
+    if (!myDefaultCamera.IsNull())
+    {
+      myDefaultCamera->SetAspect (aRatio);
+    }
+  }
 
-        MyGradientBackground = MyWindow->GradientBackground();
-        SetGradientBackground(MyGradientBackground,1);
+  myViewManager->SetUpdateMode (anUpdateMode);
+  Update (anUpdateMode);
+}
 
-        Standard_Boolean AWait = Standard_False;        // => immediate update
-        MyGraphicDriver->SetVisualisation (MyCView);
-        MyGraphicDriver->AntiAliasing (MyCView, MyContext.AliasingIsOn ());
-        MyGraphicDriver->DepthCueing (MyCView, MyContext.DepthCueingIsOn ());
-        MyGraphicDriver->ClipLimit (MyCView, AWait);
-        MyGraphicDriver->Environment(MyCView);
+// =======================================================================
+// function : UpdateLights
+// purpose  :
+// =======================================================================
+void Visual3d_View::UpdateLights()
+{
+  if (IsDeleted()
+   || !IsDefined())
+  {
+    return;
+  }
 
-        // Make view manager z layer list consistent with the view's list.
-        MyViewManager->InstallZLayers (this);
+  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;
 
-        // Update planses of model clipping
-        UpdatePlanes ();
+    MyCView.Context.NbActiveLight = 1;
+    MyCView.Context.ActiveLight   = &aCLight;
+    myGraphicDriver->SetLight (MyCView);
+    MyCView.Context.ActiveLight   = NULL;
+    return;
+  }
 
-        // Update light sources 
-        UpdateLights ();
+  MyCView.Context.NbActiveLight = Min (MyContext.NumberOfActivatedLights(),
+                                       myGraphicDriver->InquireLightLimit());
+  if (MyCView.Context.NbActiveLight < 1)
+  {
+    myGraphicDriver->SetLight (MyCView);
+    return;
+  }
 
-        /*
-         * Association view-window does not cause the display
-         * of structures that can be displayed in the new view.
-         * In fact, association view-window is done, but the
-         * display is produced only if the view is activated (Activate).
-         */
+  // 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;
+}
 
-        SetRatio ();
+// =======================================================================
+// function : UpdatePlanes
+// purpose  :
+// =======================================================================
+void Visual3d_View::UpdatePlanes()
+{
+  MyCView.Context.ClipPlanes = MyContext.ClipPlanes();
+  if (IsDeleted() || !IsDefined())
+  {
+    return;
+  }
 
+  myGraphicDriver->SetClipPlanes (MyCView);
 }
 
-Handle(Aspect_Window) Visual3d_View::Window () const {
+// =======================================================================
+// function : SetBackground
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetBackground (const Aspect_Background& theBack)
+{
+  if (IsDeleted())
+  {
+    return;
+  }
+  else if (!IsDefined())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  }
+
+  // At this level, only GL can update the background.
+  // It is not necessary to call MyWindow->SetBackground (ABack); as
+  // this method starts update of window background by X
+  // (if the windowing is X)
 
-        if (! IsDefined ())
-                Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  Standard_Real R, G, B;
+  MyBackground = theBack;
+  MyBackground.Color().Values (R, G, B, Quantity_TOC_RGB);
+  MyCView.DefWindow.Background.r = float (R);
+  MyCView.DefWindow.Background.g = float (G);
+  MyCView.DefWindow.Background.b = float (B);
 
-        return (MyWindow);
+  myGraphicDriver->Background (MyCView);
 
+  if (myViewManager != NULL)
+  {
+    Update (myViewManager->UpdateMode());
+  }
 }
 
-Standard_Boolean Visual3d_View::IsDefined () const {
+// =======================================================================
+// function : SetGradientBackground
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetGradientBackground (const Aspect_GradientBackground& theBack,
+                                           const Standard_Boolean           theToUpdate)
+{
+  if (IsDeleted())
+  {
+    return;
+  }
+  else if (!IsDefined())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  }
 
-        if (MyCView.DefWindow.IsDefined)
-                return (Standard_True);
-        else
-                return (Standard_False);
+  MyGradientBackground = theBack;
+  Quantity_Color aCol1, aCol2;
+  MyGradientBackground.Colors (aCol1, aCol2);
+  myGraphicDriver->GradientBackground (MyCView, aCol1, aCol2, MyGradientBackground.BgGradientFillMethod());
 
+  if (theToUpdate)
+  {
+     Update (Aspect_TOU_ASAP);
+  }
+  else if (myViewManager != NULL)
+  {
+    Update (myViewManager->UpdateMode());
+  }
 }
 
-Standard_Boolean Visual3d_View::IsDeleted () const {
+// =======================================================================
+// function : SetBackgroundImage
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetBackgroundImage (const Standard_CString  theFileName,
+                                        const Aspect_FillMethod theFillStyle,
+                                        const Standard_Boolean  theToUpdate)
+{
+  if (IsDeleted())
+  {
+    return;
+  }
+  if (!IsDefined())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  }
 
-        if (MyCView.IsDeleted)
-                return (Standard_True);
-        else
-                return (Standard_False);
+  myGraphicDriver->BackgroundImage (theFileName, MyCView, theFillStyle);
 
+  Update (theToUpdate ? Aspect_TOU_ASAP : myViewManager->UpdateMode());
 }
 
-void Visual3d_View::Destroy () {
-
-#ifdef DESTROY
-        cout << "Visual3d_View::Destroy (" << Identification () << ")\n";
-#endif
+// =======================================================================
+// function : SetBgImageStyle
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetBgImageStyle (const Aspect_FillMethod theFillStyle,
+                                     const Standard_Boolean  theToUpdate)
+{
+  if (IsDeleted())
+  {
+    return;
+  }
+  if (!IsDefined())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  }
 
-        // Since MyPtrViewManager can be already distroyed,
-        // avoid attempts to access it in SetBackground()
-        MyPtrViewManager = 0;
-        Remove ();
+  myGraphicDriver->SetBgImageStyle (MyCView, theFillStyle);
 
+  Update (theToUpdate ? Aspect_TOU_ASAP : myViewManager->UpdateMode());
 }
 
-void Visual3d_View::Remove () {
-
-#ifdef DESTROY
-        cout << "Visual3d_View::Remove (" << Identification () << ")" << endl;
-#endif
-
-        if (IsDeleted ()) return;
-        if (! IsDefined ()) return;
+// =======================================================================
+// function : Background
+// purpose  :
+// =======================================================================
+Aspect_Background Visual3d_View::Background() const
+{
+  return MyBackground;
+}
 
-        MyTOCOMPUTESequence.Clear ();
-        MyCOMPUTEDSequence.Clear ();
-        MyDisplayedStructure.Clear ();
+// =======================================================================
+// function : SetBgGradientStyle
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetBgGradientStyle (const Aspect_GradientFillMethod theFillStyle,
+                                        const Standard_Boolean          theToUpdate)
+{
+  if (IsDeleted())
+  {
+    return;
+  }
+  else if (!IsDefined())
+  {
+    Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  }
 
-        Quantity_Color BlackColor (0.0, 0.0, 0.0, Quantity_TOC_RGB);
-        Aspect_Background BlackBackground (BlackColor);
-        SetBackground (BlackBackground);
+  myGraphicDriver->SetBgGradientStyle (MyCView, theFillStyle);
 
-        Aspect_GradientBackground BlackGradBackground;
-        SetGradientBackground (BlackGradBackground,0);
+  Update (theToUpdate ? Aspect_TOU_ASAP : myViewManager->UpdateMode());
+}
 
-       if (MyPtrViewManager)
-         MyPtrViewManager->UnIdentification( MyCView.ViewId );
+// =======================================================================
+// function : GradientBackground
+// purpose  :
+// =======================================================================
+Aspect_GradientBackground Visual3d_View::GradientBackground() const
+{
+  return MyGradientBackground;
+}
 
-        MyGraphicDriver->RemoveView (MyCView);
+// =======================================================================
+// function : DefaultCamera
+// purpose  :
+// =======================================================================
+const Handle(Graphic3d_Camera)& Visual3d_View::DefaultCamera() const
+{
+  return myDefaultCamera;
+}
 
-        MyCView.WsId            = -1;
-        MyCView.IsDeleted       = 1;
-        MyCView.DefWindow.IsDefined     = 0;
+// =======================================================================
+// function : Camera
+// purpose  :
+// =======================================================================
+const Handle(Graphic3d_Camera)& Visual3d_View::Camera() const
+{
+  return MyCView.Context.Camera;
+}
 
-        MyMatOfMapIsModified    = Standard_True;
-        MyMatOfOriIsModified    = Standard_True;
-        MyMatOfMapIsEvaluated   = Standard_False;
-        MyMatOfOriIsEvaluated   = Standard_False;
+// =======================================================================
+// function : SetCamera
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetCamera (const Handle(Graphic3d_Camera)& theCamera)
+{
+  MyCView.Context.Camera = theCamera;
 
-        MyWindow.Nullify ();
+  myGraphicDriver->SetCamera (MyCView);
 
+  Update (myViewManager->UpdateMode());
 }
 
-void Visual3d_View::Resized () {
-
-        if (IsDeleted ()) return;
-
-        if (! IsDefined ())
-                Visual3d_ViewDefinitionError::Raise ("Window not defined");
-        MyWindow->DoResize() ;
-        SetRatio ();
+// =======================================================================
+// function : SetViewOrientationDefault
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetViewOrientationDefault()
+{
+  if (myDefaultCamera.IsNull())
+  {
+    myDefaultCamera = new Graphic3d_Camera();
+  }
 
+  myDefaultCamera->CopyOrientationData (MyCView.Context.Camera);
 }
 
-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.
-
-            MyCView.DefWindow.dx        = float( Dxw );
-            MyCView.DefWindow.dy        = float( Dyw );
-
-            SetViewMapping (MyViewMapping);
-//          SetViewMappingDefault ();
-            // FMN+ Update Ratio for MyViewMappingReset
-
-            MyViewMappingReset.WindowLimit(Umin,Vmin,Umax,Vmax) ;
-            Xc  = (Umin + Umax)/2. ; Yc = (Vmin + Vmax)/2. ;
-            Dxv = Umax - Umin ; Dyv     = Vmax - Vmin ;
-
-            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. ;
-
-            MyViewMappingReset.SetWindowLimit(Umin,Vmin,Umax,Vmax) ;
-
-            // FMN- Update Ratio for MyViewMappingReset
-
-            MyGraphicDriver->RatioWindow (MyCView);
-        }
-
-        // Force recalculation of 2 matrices.
-        //
-        // The current view can help to reconstruct a copied view
-        // that is itself. Owing to SetWindow and SetRatio the
-        // recalculation of matrices of this new view is imposed.
-        MyMatOfMapIsEvaluated   = Standard_False;
-        MyMatOfOriIsEvaluated   = Standard_False;
+// =======================================================================
+// function : ViewOrientationReset
+// purpose  :
+// =======================================================================
+void Visual3d_View::ViewOrientationReset()
+{
+  if (IsDeleted())
+  {
+    return;
+  }
 
-        MyViewManager->SetUpdateMode (UpdateMode);
-        if (UpdateMode == Aspect_TOU_ASAP) Update ();
+  if (!myDefaultCamera.IsNull())
+  {
+    MyCView.Context.Camera->CopyOrientationData (myDefaultCamera);
+  }
 
+  Update (myViewManager->UpdateMode());
 }
 
-void Visual3d_View::UpdateLights () {
-
-Standard_Integer i, j;
-CALL_DEF_LIGHT *lights=NULL;
-
-#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);
-                        }
-                }
+// =======================================================================
+// function : SetViewMappingDefault
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetViewMappingDefault()
+{
+  if (myDefaultCamera.IsNull())
+  {
+    myDefaultCamera = new Graphic3d_Camera();
+  }
+  myDefaultCamera->CopyMappingData (MyCView.Context.Camera);
+}
 
-        }
-#ifdef BUC60570
+// =======================================================================
+// function : ViewMappingReset
+// purpose  :
+// =======================================================================
+void Visual3d_View::ViewMappingReset()
+{
+  if (IsDeleted())
+  {
+    return;
   }
-#endif
-        // management of light sources
-        if (! IsDeleted ())
-                if (IsDefined ())
-                        MyGraphicDriver->SetLight (MyCView);
 
-        // Dynamic allocation
-        if (MyCView.Context.NbActiveLight > 0) delete [] lights;
+  if (!myDefaultCamera.IsNull())
+  {
+    MyCView.Context.Camera->CopyMappingData (myDefaultCamera);
+  }
 
+  Update (myViewManager->UpdateMode());
 }
 
-void Visual3d_View::UpdatePlanes () {
+// =======================================================================
+// function : SetContext
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetContext (const Visual3d_ContextView& theViewCtx)
+{
+  if (IsDeleted())
+  {
+    return;
+  }
 
-Standard_Integer i, j;
-CALL_DEF_PLANE *planes=NULL;
+  // To manage display only in case of change of visualisation mode
+  const bool isVisModeChanged = theViewCtx.Visualization() != MyContext.Visualization();
+  const bool isModelChanged   = theViewCtx.Model()         != MyContext.Model();
 
-        i       = MyContext.NumberOfActivatedClipPlanes ();
-        j       = MyGraphicDriver->InquirePlaneLimit ();
-        MyCView.Context.NbActivePlane   = (i > j ? j : i);
+  // To manage antialiasing only in case of change
+  const Standard_Boolean anAliasingModeOld = MyContext.AliasingIsOn();
+  const Standard_Boolean anAliasingModeNew = theViewCtx.AliasingIsOn();
 
-        if (MyCView.Context.NbActivePlane > 0) {
+  // To manage the depth cueing only in case of change
+  const Standard_Boolean aDepthCueingModeOld = MyContext.DepthCueingIsOn();
+  const Standard_Boolean aDepthCueingModeNew = theViewCtx.DepthCueingIsOn();
 
-                // 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];
+  const Standard_Real aDepthCueingFrontPlaneOld = MyContext.DepthCueingFrontPlane();
+  const Standard_Real aDepthCueingFrontPlaneNew = theViewCtx.DepthCueingFrontPlane();
+  const Standard_Real aDepthCueingBackPlaneOld  = MyContext.DepthCueingBackPlane();
+  const Standard_Real aDepthCueingBackPlaneNew  = theViewCtx.DepthCueingBackPlane();
 
-                MyCView.Context.ActivePlane     = planes;
-#endif
-Standard_Real A, B, C, D;
+  // To manage the Zclipping only in case of change
+  const Standard_Boolean aFrontZClippingModeOld = MyContext.FrontZClippingIsOn();
+  const Standard_Boolean aFrontZClippingModeNew = theViewCtx.FrontZClippingIsOn();
+  const Standard_Boolean aBackZClippingModeOld  = MyContext.BackZClippingIsOn();
+  const Standard_Boolean aBackZClippingModeNew  = theViewCtx.BackZClippingIsOn();
 
-                // Parcing of clipping planes
-                for (j=0; j<MyCView.Context.NbActivePlane; j++) {
+  const Standard_Real aZClippingFrontPlaneOld = MyContext.ZClippingFrontPlane();
+  const Standard_Real aZClippingFrontPlaneNew = theViewCtx.ZClippingFrontPlane();
+  const Standard_Real aZClippingBackPlaneOld  = MyContext.ZClippingBackPlane();
+  const Standard_Real aZClippingBackPlaneNew  = theViewCtx.ZClippingBackPlane();
 
-                        planes[j].WsId          = MyCView.ViewId;
-                        planes[j].ViewId        = MyCView.ViewId;
+  const bool isTextEnvChanged    = theViewCtx.TextureEnv()    != MyContext.TextureEnv();
+  const bool isSurfDetailChanged = theViewCtx.SurfaceDetail() != MyContext.SurfaceDetail();
 
-                        planes[j].Active        = 1;
-                        planes[j].PlaneId       =
-                                int ((MyContext.ActivatedClipPlane (j+1))->Identification ());
+  MyContext = theViewCtx;
 
-                        (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);
-                }
+  UpdateView();
 
-        }
+  Standard_Boolean toWait = Standard_False; // => immediate update
+  if (IsDefined())
+  {
+    // management of visualization modes and types of shading.
+    if (isVisModeChanged
+     || isModelChanged)
+    {
+      myGraphicDriver->SetVisualisation (MyCView);
+    }
 
-        // 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
+    // management of antialiasing
+    if (anAliasingModeOld != anAliasingModeNew)
+    {
+      myGraphicDriver->AntiAliasing (MyCView, anAliasingModeNew);
+    }
 
-}
+    // management of depth_cueing
+    if (aDepthCueingModeOld       != aDepthCueingModeNew
+     || aDepthCueingFrontPlaneOld != aDepthCueingFrontPlaneNew
+     || aDepthCueingBackPlaneOld  != aDepthCueingBackPlaneNew)
+    {
+      if (aDepthCueingModeNew
+      &&  aDepthCueingBackPlaneNew >= aDepthCueingFrontPlaneNew)
+      {
+        Visual3d_DepthCueingDefinitionError::Raise ("Bad value for DepthCueingPlanes position");
+      }
+      myGraphicDriver->DepthCueing (MyCView, aDepthCueingModeNew);
+    }
 
-void Visual3d_View::SetBackground (const Aspect_Background& ABack) {
+    // management of Zclipping
+    if (aFrontZClippingModeOld  != aFrontZClippingModeNew
+     || aBackZClippingModeOld   != aBackZClippingModeNew
+     || aZClippingFrontPlaneOld != aZClippingFrontPlaneNew
+     || aZClippingBackPlaneOld  != aZClippingBackPlaneNew)
+    {
+      if (aBackZClippingModeNew
+       && aFrontZClippingModeNew
+       && aZClippingBackPlaneNew >= aZClippingFrontPlaneNew)
+      {
+        Visual3d_ZClippingDefinitionError::Raise ("Bad value for ZClippingPlanes position");
+      }
 
-        if (IsDeleted ()) return;
+      myGraphicDriver->ClipLimit (MyCView, toWait);
+    }
 
-        if (! IsDefined ())
-                Visual3d_ViewDefinitionError::Raise ("Window not defined");
+    // management of textures
+    if (isTextEnvChanged
+     || isSurfDetailChanged)
+    {
+      myGraphicDriver->Environment (MyCView);
+    }
 
-        // At this level, only GL can update the background.
-        // It is not necessary to call MyWindow->SetBackground (ABack); as
-        // this method starts update of window background by X
-        // (if the windowing is X)
+    UpdatePlanes(); // Update of planes of model clipping
+    UpdateLights(); // Update of light sources
+  }
 
-        Standard_Real R, G, B;
-        MyBackground    = ABack;
-        (MyBackground.Color ()).Values (R, G, B, Quantity_TOC_RGB);
-        MyCView.DefWindow.Background.r  = float (R);
-        MyCView.DefWindow.Background.g  = float (G);
-        MyCView.DefWindow.Background.b  = float (B);
+  if (isVisModeChanged)
+  {
+    // Change of context =>
+    // Remove structures that cannot be displayed in the new visualisation mode.
+    // It is not necessary to warn ViewManager as this structure should not disappear from
+    // the list of structures displayed in it.
+    NCollection_Sequence<Handle(Graphic3d_Structure)> aStructs;
+    for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStruct  = aStructIter.Key();
+      const Visual3d_TypeOfAnswer        anAnswer = AcceptDisplay (aStruct);
+      if (anAnswer == Visual3d_TOA_NO
+       || anAnswer == Visual3d_TOA_COMPUTE)
+      {
+        aStructs.Append (aStruct);
+      }
+    }
+    for (NCollection_Sequence<Handle(Graphic3d_Structure)>::Iterator aStructIter (aStructs); aStructIter.More(); aStructIter.Next())
+    {
+      Erase (aStructIter.ChangeValue(), Aspect_TOU_WAIT);
+    }
+    aStructs.Clear();
+
+    // Change of context =>
+    // Display structures that can be displayed with the new visualisation mode.
+    // All structures with status Displayed are removed from the ViewManager
+    // and displayed in the view directly, if the structure is not already
+    // displayed and if the view accepts it in its context.
+    Graphic3d_MapOfStructure aMapDisplayed;
+    myViewManager->DisplayedStructures (aMapDisplayed);
+    for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aMapDisplayed); aStructIter.More(); aStructIter.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key();
+      if (IsDisplayed (aStruct))
+      {
+        continue;
+      }
 
-        MyGraphicDriver->Background (MyCView);
+      const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct);
+      if (anAnswer == Visual3d_TOA_YES
+       || anAnswer == Visual3d_TOA_COMPUTE)
+      {
+        aStructs.Append (aStruct);
+      }
+    }
 
-        if (MyPtrViewManager && MyViewManager->UpdateMode () == Aspect_TOU_ASAP)
-          Update ();
+    for (NCollection_Sequence<Handle(Graphic3d_Structure)>::Iterator aStructIter (aStructs); aStructIter.More(); aStructIter.Next())
+    {
+      Display (aStructIter.ChangeValue(), Aspect_TOU_WAIT);
+    }
+  }
 
+  Update (myViewManager->UpdateMode());
 }
 
-void Visual3d_View::SetGradientBackground(const Aspect_GradientBackground& ABack, const Standard_Boolean update)
+// =======================================================================
+// function : Context
+// purpose  :
+// =======================================================================
+const Visual3d_ContextView& Visual3d_View::Context() const
 {
-
-  if (IsDeleted ()) return;
-
-  if (! IsDefined ())
-    Visual3d_ViewDefinitionError::Raise ("Window not defined");
-
-  MyGradientBackground = ABack;
-  Quantity_Color aCol1,aCol2;
-  MyGradientBackground.Colors(aCol1,aCol2);
-  MyGraphicDriver->GradientBackground(MyCView, aCol1, aCol2, MyGradientBackground.BgGradientFillMethod());
-
-  if ( update )
-     Update ();
-  else if (MyPtrViewManager && MyViewManager->UpdateMode () == Aspect_TOU_ASAP)
-    Update();
+  return MyContext;
 }
 
-void Visual3d_View::SetBackgroundImage( const Standard_CString FileName,
-                                        const Aspect_FillMethod FillStyle,
-                                        const Standard_Boolean update )
+// =======================================================================
+// function : DisplayedStructures
+// purpose  :
+// =======================================================================
+void Visual3d_View::DisplayedStructures (Graphic3d_MapOfStructure& theStructures) const
 {
-#ifdef OCC1188
-  if ( IsDeleted() )
+  if (IsDeleted())
+  {
     return;
-  if ( !IsDefined() )
-    Visual3d_ViewDefinitionError::Raise ("Window not defined");
-
-  MyGraphicDriver->BackgroundImage( FileName, MyCView, FillStyle );
+  }
 
-  if ( update )
-    Update();
-  else if ( MyViewManager->UpdateMode() == Aspect_TOU_ASAP )
-    Update();
-#endif
+  for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+  {
+    theStructures.Add (aStructIter.Key());
+  }
 }
 
-void Visual3d_View::SetBgImageStyle( const Aspect_FillMethod FillStyle,
-                                     const Standard_Boolean update )
+// =======================================================================
+// function : Activate
+// purpose  :
+// =======================================================================
+void Visual3d_View::Activate()
 {
-#ifdef OCC1188
-  if ( IsDeleted() )
+  if (IsDeleted())
+  {
     return;
-  if ( !IsDefined() )
+  }
+  else if (!IsDefined())
+  {
     Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  }
 
-  MyGraphicDriver->SetBgImageStyle( MyCView, FillStyle );
+  if (!IsActive())
+  {
+    myGraphicDriver->ActivateView (MyCView);
+    myGraphicDriver->Background   (MyCView);
+    myGraphicDriver->Transparency (MyCView, myViewManager->Transparency());
+
+    MyCView.Active = 1;
+
+    // Activation of a new view =>
+    // Display structures that can be displayed in this new view.
+    // All structures with status
+    // Displayed in ViewManager are returned and displayed in
+    // the view directly, if the structure is not already
+    // displayed and if the view accepts it in its context.
+    Graphic3d_MapOfStructure aDisplayedStructs;
+    myViewManager->DisplayedStructures (aDisplayedStructs);
+    for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aDisplayedStructs); aStructIter.More(); aStructIter.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key();
+      if (IsDisplayed (aStruct))
+      {
+        continue;
+      }
 
-  if ( update )
-    Update();
-  else if ( MyViewManager->UpdateMode() == Aspect_TOU_ASAP )
-    Update();
-#endif
-}
+      // If the structure can be displayed in the new context of the view, it is displayed.
+      const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct);
+      if (anAnswer == Visual3d_TOA_YES
+       || anAnswer == Visual3d_TOA_COMPUTE)
+      {
+        Display (aStruct, Aspect_TOU_WAIT);
+      }
+    }
+  }
 
-Aspect_Background Visual3d_View::Background () const {
+  // If the activation/desactivation of ZBuffer should be automatic
+  // depending on the presence or absence of facets.
+  if (myViewManager->ZBufferAuto())
+  {
+    const Standard_Boolean containsFacet = ContainsFacet();
+    const Standard_Boolean hasZBuffer    = ZBufferIsActivated();
+    if (containsFacet && !hasZBuffer)
+    {
+      SetZBufferActivity (1); // If the view contains facets and if ZBuffer is not active
+    }
+    else if (!containsFacet && hasZBuffer)
+    {
+      SetZBufferActivity (0); // If the view does not contain facets and if ZBuffer is active
+    }
+  }
 
-        return (MyBackground);
+  Update (myViewManager->UpdateMode());
+}
 
+// =======================================================================
+// function : IsActive
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::IsActive() const
+{
+  return !IsDeleted()
+      &&  MyCView.Active;
 }
 
-void Visual3d_View::SetBgGradientStyle( const Aspect_GradientFillMethod FillStyle,
-                                        const Standard_Boolean update )
+// =======================================================================
+// function : Deactivate
+// purpose  :
+// =======================================================================
+void Visual3d_View::Deactivate()
 {
-  if ( IsDeleted() )
+  if (IsDeleted())
+  {
     return;
-  if ( !IsDefined() )
+  }
+  else if (!IsDefined())
+  {
     Visual3d_ViewDefinitionError::Raise ("Window not defined");
+  }
 
-  MyGraphicDriver->SetBgGradientStyle( MyCView, FillStyle );
+  if (IsActive())
+  {
+    myGraphicDriver->DeactivateView (MyCView);
+
+    // Deactivation of a view =>
+    // Removal of structures displayed in this view.
+    // All structures with status
+    // Displayed in ViewManager are returned and removed from
+    // the view directly, if the structure is not already
+    // displayed and if the view accepts it in its context.
+    Graphic3d_MapOfStructure aDisplayedStructs;
+    myViewManager->DisplayedStructures (aDisplayedStructs);
+    for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (aDisplayedStructs); aStructIter.More(); aStructIter.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key();
+      if (IsDisplayed (aStruct))
+      {
+        continue;
+      }
 
-  if ( update )
-    Update();
-  else if ( MyViewManager->UpdateMode() == Aspect_TOU_ASAP )
-    Update();
+      const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct);
+      if (anAnswer == Visual3d_TOA_YES
+       || anAnswer == Visual3d_TOA_COMPUTE)
+      {
+        Erase (aStruct, Aspect_TOU_WAIT);
+      }
+    }
 
+    Update (myViewManager->UpdateMode());
+    MyCView.Active = 0; // No action currently possible in the view
+  }
 }
 
-Aspect_GradientBackground Visual3d_View::GradientBackground () const {
-
-        return MyGradientBackground;
-
+// =======================================================================
+// function : Redraw
+// purpose  :
+// =======================================================================
+void Visual3d_View::Redraw()
+{
+  Redraw (myViewManager->UnderLayer(), myViewManager->OverLayer(), 0, 0, 0, 0);
 }
 
-void Visual3d_View::SetTransform (const TColStd_Array2OfReal& AMatrix) {
+// =======================================================================
+// function : Redraw
+// purpose  :
+// =======================================================================
+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);
+}
 
-        if (IsDeleted ()) return;
+// =======================================================================
+// function : Redraw
+// purpose  :
+// =======================================================================
+void Visual3d_View::Redraw (const Handle(Visual3d_Layer)& theUnderLayer,
+                            const Handle(Visual3d_Layer)& theOverLayer)
+{
+  Redraw (theUnderLayer, theOverLayer, 0, 0, 0, 0);
+}
+
+// =======================================================================
+// function : Redraw
+// purpose  :
+// =======================================================================
+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;
+  }
 
-Standard_Integer lr, ur, lc, uc;
-Standard_Integer i, j;
+  Aspect_CLayer2d anOverCLayer, anUnderCLayer;
+  anOverCLayer.ptrLayer = anUnderCLayer.ptrLayer = NULL;
+  if (!theOverLayer .IsNull()) anOverCLayer  = theOverLayer ->CLayer();
+  if (!theUnderLayer.IsNull()) anUnderCLayer = theUnderLayer->CLayer();
 
-        // 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 ();
+  for (Standard_Integer aRetryIter = 0; aRetryIter < 2; ++aRetryIter)
+  {
+    if (myGraphicDriver->IsDeviceLost())
+    {
+      myViewManager->RecomputeStructures();
+      myViewManager->RecomputeStructures (myImmediateStructures);
+      myGraphicDriver->ResetDeviceLostFlag();
+    }
 
-        if ( (ur - lr + 1 != 4) || (uc - lc + 1 != 4) )
-                Visual3d_TransformError::Raise ("Transform : not a 4x4 matrix");
+    // 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);
+      }
+    }
 
-        for (i=0; i<=3; i++)
-        for (j=0; j<=3; j++)
-                MyTransformation (i, j) = AMatrix (lr + i, lc + j);
+    if (myStructuresUpdated)
+    {
+      AutoZFit();
+      myStructuresUpdated = Standard_False;
+    }
 
-Graphic3d_Vector VPN;
-Graphic3d_Vertex VRP;
-Graphic3d_Vector VUP;
-Standard_Real Sx, Sy, Sz;
+    myGraphicDriver->Redraw (MyCView, anUnderCLayer, anOverCLayer, theX, theY, theWidth, theHeight);
+    if (!myGraphicDriver->IsDeviceLost())
+    {
+      return;
+    }
+  }
+}
 
-Visual3d_ViewOrientation NewViewOrientation;
+// =======================================================================
+// function : RedrawImmediate
+// purpose  :
+// =======================================================================
+void Visual3d_View::RedrawImmediate()
+{
+  RedrawImmediate (myViewManager->UnderLayer(), myViewManager->OverLayer());
+}
 
-        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);
-
-        MyMatOfOriIsModified    = Standard_True;
-        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);
-
-Standard_Real Sx, Sy, Sz;
-
-        MyViewOrientation.AxialScale(Sx, Sy, Sz);
-       ScaleIsModified =
-            MyCView.Orientation.ViewScaleX != float (X)
-         || MyCView.Orientation.ViewScaleY != float (Y)
-         || MyCView.Orientation.ViewScaleZ != float (Z);
-        MyCView.Orientation.ViewScaleX                  = float (Sx);
-        MyCView.Orientation.ViewScaleY                  = float (Sy);
-        MyCView.Orientation.ViewScaleZ                  = float (Sz);
-
-        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);
-              MyCView.Orientation.ModelViewMatrix[i][j] = MyViewOrientation.MyModelViewMatrix->Value(i,j);
-            }
-        }
-
-#ifdef TRACE_TRSF
-cout << "Visual3d_View::SetViewOrientation\n";
-        if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified)
-                cout <<   "VUPIsModified : " << VUPIsModified
-                     << ", VRPIsModified : " << VRPIsModified
-                     << ", VRUIsModified : " << VRUIsModified
-                     << ", CustomIsModified : " << CustomIsModified << "\n" << flush;
-        else
-                cout << "no modification\n" << flush;
-#endif
-
-        // restart if one of parameters is modified
-        if (VUPIsModified || VRPIsModified || VRUIsModified || ScaleIsModified || CustomIsModified) {
-
-         if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified) {
-                MyMatOfOriIsModified    = Standard_True;
-                MyMatOfOriIsEvaluated   = Standard_False;
-             }
-
-                if (! IsDefined ()) return;
-
-Standard_Boolean AWait = Standard_False;        // => immediate update
-                MyGraphicDriver->ViewOrientation (MyCView, AWait);
-
-                Compute ();
-
-                if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
-        }
-
-}
-
-Visual3d_ViewOrientation Visual3d_View::ViewOrientation () const {
-
-        return (MyViewOrientation);
-
-}
-
-Visual3d_ViewOrientation Visual3d_View::ViewOrientationDefault () const {
-
-        return (MyViewOrientationReset);
+// =======================================================================
+// function : RedrawImmediate
+// purpose  :
+// =======================================================================
+void Visual3d_View::RedrawImmediate (const Handle(Visual3d_Layer)& theUnderLayer,
+                                     const Handle(Visual3d_Layer)& theOverLayer)
+{
+  if (IsDeleted()
+   || !IsDefined()
+   || !IsActive()
+   || !MyWindow->IsMapped())
+  {
+    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);
 }
 
-void Visual3d_View::SetViewOrientationDefault () {
-
-        MyViewOrientationReset.Assign (MyViewOrientation);
-
+// =======================================================================
+// function : Invalidate
+// purpose  :
+// =======================================================================
+void Visual3d_View::Invalidate()
+{
+  myGraphicDriver->Invalidate (MyCView);
 }
 
-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.y != float (Y);
-        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.y != float (Y);
-        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.y != float (Y);
-        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);
-       ScaleIsModified =
-            MyCView.Orientation.ViewScaleX != float (X)
-         || MyCView.Orientation.ViewScaleY != float (Y)
-         || MyCView.Orientation.ViewScaleZ != float (Z);
-        MyCView.Orientation.ViewScaleX                  = float (Sx);
-        MyCView.Orientation.ViewScaleY                  = float (Sy);
-        MyCView.Orientation.ViewScaleZ                  = float (Sz);
-
-        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);
-              MyCView.Orientation.ModelViewMatrix[i][j] = MyViewOrientation.MyModelViewMatrix->Value(i,j);
-            }
-        }
-
-#ifdef TRACE_TRSF
-cout << "Visual3d_View::ViewOrientationReset\n";
-if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified)
-cout <<   "VUPIsModified : " << VUPIsModified
-     << ", VRPIsModified : " << VRPIsModified
-     << ", VRUIsModified : " << VRUIsModified
-     << ", CustomIsModified : " << CustomIsModified << "\n" << flush;
-else
-cout << "no modification\n" << flush;
-#endif
-
-        // Restart if one of parameters is modified
-        if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified) {
-
-         if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified) {
-                MyMatOfOriIsModified    = Standard_True;
-                MyMatOfOriIsEvaluated   = Standard_False;
-             }
-
-                if (! IsDefined ()) return;
-
-Standard_Boolean AWait = Standard_False;        // => immediate update
-                MyGraphicDriver->ViewOrientation (MyCView, AWait);
-
-                Compute ();
-
-                if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
-        }
-
+// =======================================================================
+// function : Update
+// purpose  :
+// =======================================================================
+void Visual3d_View::Update (Aspect_TypeOfUpdate theUpdateMode)
+{
+  myStructuresUpdated = Standard_True;
+  if (theUpdateMode == Aspect_TOU_ASAP)
+  {
+    Compute();
+    Redraw (myViewManager->UnderLayer(), myViewManager->OverLayer(), 0, 0, 0, 0);
+  }
 }
 
-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] =
-                MyViewMapping.MyProjectionMatrix->Value(i,j);
-        }
-
-        MyMatOfMapIsModified    = Standard_True;
-        MyMatOfMapIsEvaluated   = Standard_False;
-
-        if (! IsDefined ()) return;
-
-Standard_Boolean AWait = Standard_False;        // => immediate update
-        MyGraphicDriver->ViewMapping (MyCView, AWait);
-
-        // Passage Parallele/Perspective
-        if (OldType != NewType)
-                Compute ();
-
-        if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
-
+// =======================================================================
+// function : Update
+// purpose  :
+// =======================================================================
+void Visual3d_View::Update (const Handle(Visual3d_Layer)& theUnderLayer,
+                            const Handle(Visual3d_Layer)& theOverLayer)
+{
+  Compute();
+  myStructuresUpdated = Standard_True;
+  Redraw (theUnderLayer, theOverLayer, 0, 0, 0, 0);
 }
 
-Visual3d_ViewMapping Visual3d_View::ViewMapping () const {
-
-        return (MyViewMapping);
-
+// ========================================================================
+// function : SetAutoZFitMode
+// purpose  :
+// ========================================================================
+void Visual3d_View::SetAutoZFitMode (const Standard_Boolean theIsOn,
+                                     const Standard_Real    theScaleFactor)
+{
+  Standard_ASSERT_RAISE (theScaleFactor > 0.0, "Zero or negative scale factor is not allowed.");
+  myAutoZFitScaleFactor = theScaleFactor;
+  myAutoZFitIsOn = theIsOn;
 }
 
-Visual3d_ViewMapping Visual3d_View::ViewMappingDefault () const {
-
-        return (MyViewMappingReset);
-
+// ========================================================================
+// function : AutoZFitMode
+// purpose  :
+// ========================================================================
+Standard_Boolean Visual3d_View::AutoZFitMode() const
+{
+  return myAutoZFitIsOn;
 }
 
-void Visual3d_View::SetViewMappingDefault () {
-
-        MyViewMappingReset.Assign (MyViewMapping);
-
+// ========================================================================
+// function : AutoZFitScaleFactor
+// purpose  :
+// ========================================================================
+Standard_Real Visual3d_View::AutoZFitScaleFactor() const
+{
+  return myAutoZFitScaleFactor;
 }
 
-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] =
-                MyViewMapping.MyProjectionMatrix->Value(i,j);
-        }
-
-        MyMatOfMapIsModified    = Standard_True;
-        MyMatOfMapIsEvaluated   = Standard_False;
-
-        if (! IsDefined ()) return;
-
-Standard_Boolean AWait = Standard_False;        // => immediate update
-        MyGraphicDriver->ViewMapping (MyCView, AWait);
-
-        if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
+// ========================================================================
+// function : AutoZFit
+// purpose  :
+// ========================================================================
+void Visual3d_View::AutoZFit()
+{
+  if (!AutoZFitMode())
+  {
+    return;
+  }
 
+  ZFitAll (myAutoZFitScaleFactor);
 }
 
-void Visual3d_View::SetContext (const Visual3d_ContextView& CTX) {
-
-        if (IsDeleted ()) return;
-
-Visual3d_TypeOfVisualization OldVisualMode;
-Visual3d_TypeOfVisualization NewVisualMode;
-
-        // To manage display only in case of 
-        // change of visualisation mode.
-        OldVisualMode   = MyContext.Visualization ();
-        NewVisualMode   = CTX.Visualization ();
-
-Visual3d_TypeOfModel OldModel;
-Visual3d_TypeOfModel NewModel;
-
-        // To manage change of visualisation only in case 
-        // of change of mode of visualisation or of type of shading.
-        OldModel        = MyContext.Model ();
-        NewModel        = CTX.Model ();
-
-Standard_Boolean OldAliasingMode;
-Standard_Boolean NewAliasingMode;
-
-        // To manage antialiasing only in case of change.
-        OldAliasingMode = MyContext.AliasingIsOn ();
-        NewAliasingMode = CTX.AliasingIsOn ();
-
-Standard_Boolean OldDepthCueingMode;
-Standard_Boolean NewDepthCueingMode;
-
-Standard_Real OldDepthCueingFrontPlane;
-Standard_Real NewDepthCueingFrontPlane;
-Standard_Real OldDepthCueingBackPlane;
-Standard_Real NewDepthCueingBackPlane;
-
-        // To manage the depth cueing only in case of change.
-        OldDepthCueingMode              = MyContext.DepthCueingIsOn ();
-        NewDepthCueingMode              = CTX.DepthCueingIsOn ();
-
-        OldDepthCueingFrontPlane        = MyContext.DepthCueingFrontPlane ();
-        NewDepthCueingFrontPlane        = CTX.DepthCueingFrontPlane ();
-        OldDepthCueingBackPlane         = MyContext.DepthCueingBackPlane ();
-        NewDepthCueingBackPlane         = CTX.DepthCueingBackPlane ();
-
-Standard_Boolean OldFrontZClippingMode;
-Standard_Boolean NewFrontZClippingMode;
-Standard_Boolean OldBackZClippingMode;
-Standard_Boolean NewBackZClippingMode;
-
-Standard_Real OldZClippingFrontPlane;
-Standard_Real NewZClippingFrontPlane;
-Standard_Real OldZClippingBackPlane;
-Standard_Real NewZClippingBackPlane;
-
-        // To manage the Zclipping only in case of change.
-        OldFrontZClippingMode   = MyContext.FrontZClippingIsOn ();
-        NewFrontZClippingMode   = CTX.FrontZClippingIsOn ();
-        OldBackZClippingMode    = MyContext.BackZClippingIsOn ();
-        NewBackZClippingMode    = CTX.BackZClippingIsOn ();
-
-        OldZClippingFrontPlane  = MyContext.ZClippingFrontPlane ();
-        NewZClippingFrontPlane  = CTX.ZClippingFrontPlane ();
-        OldZClippingBackPlane   = MyContext.ZClippingBackPlane ();
-        NewZClippingBackPlane   = CTX.ZClippingBackPlane ();
-
-Standard_Integer OldTexEnvId;
-Standard_Integer NewTexEnvId;
-Visual3d_TypeOfSurfaceDetail OldSurfaceDetail;
-Visual3d_TypeOfSurfaceDetail NewSurfaceDetail;
-
-        Handle(Graphic3d_TextureEnv)    TempTextureEnv1 = MyContext.TextureEnv();
-        if (! TempTextureEnv1.IsNull()) OldTexEnvId = TempTextureEnv1->TextureId();
-        else                            OldTexEnvId = -1;
-
-        Handle(Graphic3d_TextureEnv)    TempTextureEnv2 = CTX.TextureEnv();
-
-        if (! TempTextureEnv2.IsNull()) NewTexEnvId = TempTextureEnv2->TextureId();
-        else                            NewTexEnvId = -1;
-
-        OldSurfaceDetail = MyContext.SurfaceDetail();
-        NewSurfaceDetail = CTX.SurfaceDetail();
-
-        MyContext       = CTX;
-
-        UpdateView ();
-
-Standard_Boolean AWait = Standard_False;        // => immediate update
-        if (IsDefined ()) {
-                // management of visualization modes and types of shading.
-                if ((OldVisualMode != NewVisualMode) || (OldModel != NewModel))
-                        MyGraphicDriver->SetVisualisation (MyCView);
-
-                // management of antialiasing.
-                if (OldAliasingMode != NewAliasingMode)
-                MyGraphicDriver->AntiAliasing (MyCView, NewAliasingMode);
-
-                // management of depth_cueing.
-                if ((OldDepthCueingMode != NewDepthCueingMode) ||
-                    (OldDepthCueingFrontPlane != NewDepthCueingFrontPlane) ||
-                    (OldDepthCueingBackPlane != NewDepthCueingBackPlane)) {
-#ifdef BUC60572
-                    if( NewDepthCueingMode &&
-                        (NewDepthCueingBackPlane >= NewDepthCueingFrontPlane) )
-                        Visual3d_DepthCueingDefinitionError::Raise
-                        ("Bad value for DepthCueingPlanes position");
-#endif
-                        MyGraphicDriver->DepthCueing
-                                (MyCView, NewDepthCueingMode);
-                }
-
-                // management of Zclipping
-                if ((OldFrontZClippingMode != NewFrontZClippingMode) ||
-                    (OldBackZClippingMode != NewBackZClippingMode) ||
-                    (OldZClippingFrontPlane != NewZClippingFrontPlane) ||
-                    (OldZClippingBackPlane != NewZClippingBackPlane)) {
-#ifdef BUC60572
-                    if( NewBackZClippingMode && NewFrontZClippingMode &&
-                        (NewZClippingBackPlane >= NewZClippingFrontPlane) )
-                        Visual3d_ZClippingDefinitionError::Raise
-                        ("Bad value for ZClippingPlanes position");
-#endif
-                        MyGraphicDriver->ClipLimit (MyCView, AWait);
-                }
-
-                // management of textures
-                if ( (OldTexEnvId != NewTexEnvId) ||
-                     (OldSurfaceDetail != NewSurfaceDetail) )
-                  MyGraphicDriver->Environment(MyCView);
-
-                // Update of planes of model clipping
-                UpdatePlanes ();
-
-                // Update of light sources 
-                UpdateLights ();
-        }
-
-        if (OldVisualMode != NewVisualMode) {
-
-                /*
-                 * Change of context =>
-                 * Remove structures that cannot be displayed
-                 * in the new visualisation mode.
-                 * It is not necessary to warn ViewManager as
-                 * this structure should not disappear from
-                 * the list of structures displayed in it.
-                 */
-Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
-Visual3d_TypeOfAnswer Answer;
-
-                Standard_Integer i      = MyDisplayedStructure.Extent ();
-
-Graphic3d_SequenceOfStructure FooSequence;
-
-                while (S1Iterator.More ()) {
-                        Answer  = AcceptDisplay (S1Iterator.Key ());
-                        // If the structure can't be displayed in the 
-                        // new context of the view, it is removed.
-                        if ((Answer == Visual3d_TOA_NO) ||
-                            (Answer == Visual3d_TOA_COMPUTE))
-                                //Erase (S1Iterator.Key (), Aspect_TOU_WAIT);
-                                FooSequence.Append (S1Iterator.Key ());
-
-                        // S1Iterator.Next () is located on the next structure
-                        S1Iterator.Next ();
-                }
-
-Standard_Integer Length = FooSequence.Length ();
-                // The stored structures are removed
-                for (i=1; i<=Length; i++)
-                        Erase (FooSequence.Value (i), Aspect_TOU_WAIT);
-                if (Length != 0) FooSequence.Clear ();
-
-                /*
-                 * Change of context =>
-                 * Display structures that can be displayed 
-                 * with the new visualisation mode.
-                 * All structures with status Displayed are removed from the ViewManager 
-                 * and displayed in the view directly, if the structure is not already 
-                 * displayed and if the view accepts it in its context.
-                 */
-
-                i       = MyViewManager->NumberOfDisplayedStructures ();
-                Graphic3d_MapOfStructure Map;
-                MyViewManager->DisplayedStructures(Map);
-                Graphic3d_MapIteratorOfMapOfStructure it(Map);
-
-                for (; it.More(); it.Next()) {
-                  Handle(Graphic3d_Structure) SG = it.Key();
-                    if (! IsDisplayed (SG)) {
-                      Answer = AcceptDisplay(SG);
-                        // If the structure can be displayed in the 
-                        // new context of the view, it is displayed.
-                        if ((Answer == Visual3d_TOA_YES) ||
-                            (Answer == Visual3d_TOA_COMPUTE))
-                            //Display (MyViewManager->DisplayedStructure (j),
-                                //Aspect_TOU_WAIT);
-                        FooSequence.Append (SG);
-                    }
-                }
-
-                Length  = FooSequence.Length ();
-                // The stored structures are displayed
-                for (i=1; i<=Length; i++)
-                        Display (FooSequence.Value (i), Aspect_TOU_WAIT);
-                if (Length != 0) FooSequence.Clear ();
-        }
+// ========================================================================
+// function : ZFitAll
+// purpose  :
+// ========================================================================
+void Visual3d_View::ZFitAll (const Standard_Real theScaleFactor)
+{
+  Standard_Real aMinMax[6];    // applicative min max boundaries
+  MinMaxValues (aMinMax[0], aMinMax[1], aMinMax[2],
+    aMinMax[3], aMinMax[4], aMinMax[5],
+    Standard_False);
 
-        if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
+  Standard_Real aGraphicBB[6]; // real graphical boundaries (not accounting infinite flag).
+  MinMaxValues (aGraphicBB[0], aGraphicBB[1], aGraphicBB[2],
+    aGraphicBB[3], aGraphicBB[4], aGraphicBB[5],
+    Standard_True);
 
-}
+  Bnd_Box aMinMaxBox;
+  Bnd_Box aGraphicBox;
 
-const Visual3d_ContextView& Visual3d_View::Context () const {
+  aMinMaxBox.Update (aMinMax[0], aMinMax[1], aMinMax[2],
+    aMinMax[3], aMinMax[4], aMinMax[5]);
 
-        return (MyContext);
+  aGraphicBox.Update (aGraphicBB[0], aGraphicBB[1], aGraphicBB[2],
+    aGraphicBB[3], aGraphicBB[4], aGraphicBB[5]);
 
+  const Handle(Graphic3d_Camera)& aCamera = MyCView.Context.Camera;
+  aCamera->ZFitAll (theScaleFactor, aMinMaxBox, aGraphicBox);
 }
 
-void Visual3d_View::DisplayedStructures (Graphic3d_MapOfStructure& SG) const
+// ========================================================================
+// function : AcceptDisplay
+// purpose  :
+// ========================================================================
+Visual3d_TypeOfAnswer Visual3d_View::AcceptDisplay (const Handle(Graphic3d_Structure)& theStruct) const
 {
-
-  if (IsDeleted ()) return;
-
-  Graphic3d_MapIteratorOfMapOfStructure Iterator (MyDisplayedStructure);
-
-  while (Iterator.More ()) {
-    SG.Add (Iterator.Key ());
-
-    // Iterator.Next () is located on the next structure
-    Iterator.Next ();
+  const Visual3d_TypeOfVisualization ViewType = MyContext.Visualization();
+  switch (theStruct->Visual())
+  {
+    case Graphic3d_TOS_ALL:
+    {
+      return Visual3d_TOA_YES; // The structure accepts any type of view
+    }
+    case Graphic3d_TOS_SHADING:
+    {
+      return ViewType == Visual3d_TOV_SHADING
+           ? Visual3d_TOA_YES
+           : Visual3d_TOA_NO;
+    }
+    case Graphic3d_TOS_WIREFRAME:
+    {
+      return ViewType == Visual3d_TOV_WIREFRAME
+           ? Visual3d_TOA_YES
+           : Visual3d_TOA_NO;
+    }
+    case Graphic3d_TOS_COMPUTED:
+    {
+      return (ViewType == Visual3d_TOV_SHADING || ViewType == Visual3d_TOV_WIREFRAME)
+           ?  Visual3d_TOA_COMPUTE
+           :  Visual3d_TOA_NO;
+    }
   }
-
-}
-
-void Visual3d_View::Activate () {
-
-        if (IsDeleted ()) return;
-
-        if (! IsDefined ())
-                Visual3d_ViewDefinitionError::Raise ("Window not defined");
-
-        if (! IsActive ()) {
-
-                MyGraphicDriver->ActivateView (MyCView);
-                MyGraphicDriver->Background (MyCView);
-                MyGraphicDriver->Transparency
-                        (MyCView, MyViewManager->Transparency ());
-
-                MyCView.Active  = 1;
-
-                /*
-                 * Activation of a new view =>
-                 * Display structures that can be displayed in this new view.
-                 * All structures with status
-                 * Displayed in ViewManager are returned and displayed in 
-                 * the view directly, if the structure is not already 
-                 * displayed and if the view accepts it in its context.
-                 */
-
-               Visual3d_TypeOfAnswer Answer;
-                Graphic3d_MapOfStructure Map;
-                MyViewManager->DisplayedStructures(Map);
-                Graphic3d_MapIteratorOfMapOfStructure it(Map);
-
-                for (; it.More(); it.Next()) {
-                  Handle(Graphic3d_Structure) SG = it.Key();
-                    if (! IsDisplayed (SG)) {
-                      Answer    = AcceptDisplay(SG);
-                        // If the structure can be displayed in the
-                        // new context of the view, it is displayed.
-                        if ((Answer == Visual3d_TOA_YES) ||
-                            (Answer == Visual3d_TOA_COMPUTE))
-                        Display (SG,Aspect_TOU_WAIT);
-                    }
-                }
-
-        }
-
-        // 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 does not contain facets
-                // and if ZBuffer is active
-                if (! BContainsFacet && BZBuffer)
-                        SetZBufferActivity (0);
-        }
-
-        if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
-
+  return Visual3d_TOA_NO;
 }
 
-Standard_Boolean Visual3d_View::IsActive () const {
-
-        if (IsDeleted ()) return (Standard_False);
+// ========================================================================
+// function : ChangeDisplayPriority
+// purpose  :
+// ========================================================================
+void Visual3d_View::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& theStruct,
+                                           const Standard_Integer           /*theOldPriority*/,
+                                           const Standard_Integer             theNewPriority)
+{
+  if (IsDeleted()
+  || !IsDefined()
+  || !IsActive()
+  || !IsDisplayed (theStruct))
+  {
+    return;
+  }
 
-        if (MyCView.Active)
-                return (Standard_True);
-        else
-                return (Standard_False);
+  if (!myIsInComputedMode)
+  {
+    myGraphicDriver->ChangePriority (*theStruct->CStructure(), MyCView, theNewPriority);
+    return;
+  }
 
+  const Standard_Integer      anIndex  = IsComputed (theStruct);
+  const Graphic3d_CStructure& aCStruct = anIndex != 0
+                                       ? *(myStructsComputed.Value (anIndex)->CStructure())
+                                       : *theStruct->CStructure();
+  myGraphicDriver->ChangePriority (aCStruct, MyCView, theNewPriority);
 }
 
-void Visual3d_View::Deactivate () {
-
-        if (IsDeleted ()) return;
-
-        if (! IsDefined ())
-                Visual3d_ViewDefinitionError::Raise ("Window not defined");
-
-        if (IsActive ()) {
-
-                MyGraphicDriver->DeactivateView (MyCView);
-
-                /*
-                 * Deactivation of a view =>
-                 * Removal of structures displayed in this view.
-                 * All structures with status
-                 * Displayed in ViewManager are returned and removed from 
-                 * the view directly, if the structure is not already 
-                 * displayed and if the view accepts it in its context.
-                */
-
-               Visual3d_TypeOfAnswer Answer;
-                Graphic3d_MapOfStructure Map;
-                MyViewManager->DisplayedStructures(Map);
-                Graphic3d_MapIteratorOfMapOfStructure it(Map);
-
-                for (; it.More(); it.Next()) {
-                  Handle(Graphic3d_Structure) SG = it.Key();
-                    if (! IsDisplayed (SG)) {
-                        Answer  = AcceptDisplay(SG);
-                        // If the structure was displayed it is removed.
-                        if ((Answer == Visual3d_TOA_YES) ||
-                            (Answer == Visual3d_TOA_COMPUTE))
-                                Erase (SG,Aspect_TOU_WAIT);
-                    }
-                }
-
-                if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
-
-                // No action currently possible in the view
-                MyCView.Active  = 0;
-        }
-
+// ========================================================================
+// function : Clear
+// purpose  :
+// ========================================================================
+void Visual3d_View::Clear (const Handle(Graphic3d_Structure)& theStruct,
+                           const Standard_Boolean             theWithDestruction)
+{
+  const Standard_Integer anIndex = IsComputed (theStruct);
+  if (anIndex != 0)
+  {
+    const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.Value (anIndex);
+    aCompStruct->GraphicClear (theWithDestruction);
+    aCompStruct->SetHLRValidation (Standard_False);
+  }
 }
 
-void Visual3d_View::Redraw () {
-
-        Redraw (MyViewManager->UnderLayer (), MyViewManager->OverLayer ());
-
+// ========================================================================
+// function : Connect
+// purpose  :
+// ========================================================================
+void Visual3d_View::Connect (const Handle(Graphic3d_Structure)& theMother,
+                             const Handle(Graphic3d_Structure)& theDaughter)
+{
+  Standard_Integer anIndexM = IsComputed (theMother);
+  Standard_Integer anIndexD = IsComputed (theDaughter);
+  if (anIndexM != 0
+   && anIndexD != 0)
+  {
+    const Handle(Graphic3d_Structure)& aStructM = myStructsComputed.Value (anIndexM);
+    const Handle(Graphic3d_Structure)& aStructD = myStructsComputed.Value (anIndexD);
+    aStructM->GraphicConnect (aStructD);
+  }
 }
 
-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);
+// ========================================================================
+// function : Disconnect
+// purpose  :
+// ========================================================================
+void Visual3d_View::Disconnect (const Handle(Graphic3d_Structure)& theMother,
+                                const Handle(Graphic3d_Structure)& theDaughter)
+{
+  Standard_Integer anIndexM = IsComputed (theMother);
+  Standard_Integer anIndexD = IsComputed (theDaughter);
+  if (anIndexM != 0
+   && anIndexD != 0)
+  {
+    const Handle(Graphic3d_Structure)& aStructM = myStructsComputed.Value (anIndexM);
+    const Handle(Graphic3d_Structure)& aStructD = myStructsComputed.Value (anIndexD);
+    aStructM->GraphicDisconnect (aStructD);
+  }
 }
 
-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;
+// ========================================================================
+// function : DisplayImmediate
+// purpose  :
+// ========================================================================
+Standard_Boolean Visual3d_View::DisplayImmediate (const Handle(Graphic3d_Structure)& theStructure,
+                                                  const Standard_Boolean             theIsSingleView)
+{
+  if (!myImmediateStructures.Add (theStructure))
+  {
+    return Standard_False;
+  }
 
-        // 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);
-        }
+  if (theIsSingleView)
+  {
+    Handle(Visual3d_HSequenceOfView) aViews = myViewManager->DefinedView();
 
-        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);
+    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;
 }
 
-void Visual3d_View::Redraw (const Handle(Visual3d_Layer)& AnUnderLayer, const Handle(Visual3d_Layer)& AnOverLayer, const Standard_Integer x, const Standard_Integer y, const Standard_Integer width, const Standard_Integer height) {
-
-        if (IsDeleted ()) return;
-
-        if ((! IsDefined ()) || (! IsActive ())) return;
-
-        if (! MyWindow->IsMapped ()) return;
-
-        // 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);
-        }
-
-        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);
+// ========================================================================
+// function : EraseImmediate
+// purpose  :
+// ========================================================================
+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;
 }
 
-void Visual3d_View::Update () {
-
-        Update (MyViewManager->UnderLayer (), MyViewManager->OverLayer ());
+// ========================================================================
+// function : ClearImmediate
+// purpose  :
+// ========================================================================
+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::Update (const Handle(Visual3d_Layer)& AnUnderLayer, const Handle(Visual3d_Layer)& AnOverLayer) {
-
-        if (IsDeleted ()) return;
-
-        if ((! IsDefined ()) || (! IsActive ())) return;
-
-        if (! MyWindow->IsMapped ()) return;
-
-        // 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);
-        }
-
-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);
-
-        MyMatOfMapIsModified    = Standard_False;
-        MyMatOfOriIsModified    = Standard_False;
-
+// ========================================================================
+// function : Display
+// purpose  :
+// ========================================================================
+void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct)
+{
+  Display (theStruct, myViewManager->UpdateMode());
 }
 
-Visual3d_TypeOfAnswer Visual3d_View::AcceptDisplay (const Handle(Graphic3d_Structure)& AStructure) const {
-
-// Return type of visualization of the view
-Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
-
-// Return type of visualization of the structure
-Graphic3d_TypeOfStructure StructType = AStructure->Visual ();
-
-Visual3d_TypeOfAnswer Result = Visual3d_TOA_NO;
-
-        if (StructType == Graphic3d_TOS_ALL)
-                // The structure accepts any type of view
-                Result  = Visual3d_TOA_YES;
-        else {
-                if ((StructType == Graphic3d_TOS_SHADING)
-                        && (ViewType == Visual3d_TOV_SHADING))
-                        Result  = Visual3d_TOA_YES;
-                if ((StructType == Graphic3d_TOS_WIREFRAME)
-                        && (ViewType == Visual3d_TOV_WIREFRAME))
-                        Result  = Visual3d_TOA_YES;
-                if ((StructType == Graphic3d_TOS_COMPUTED)
-                        && (ViewType == Visual3d_TOV_WIREFRAME))
-                        Result  = Visual3d_TOA_COMPUTE;
-                if ((StructType == Graphic3d_TOS_COMPUTED)
-                        && (ViewType == Visual3d_TOV_SHADING))
-                        Result  = Visual3d_TOA_COMPUTE;
-        }
+// ========================================================================
+// function : Display
+// purpose  :
+// ========================================================================
+void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct,
+                             const Aspect_TypeOfUpdate          theUpdateMode)
+{
+  if (IsDeleted()
+  || !IsDefined()
+  || !IsActive())
+  {
+    return;
+  }
 
-#ifdef TRACE_ACCEPT
-        if (Result == Visual3d_TOA_YES)
-        cout << "YES = Visual3d_View" << MyCView.ViewId
-             << "::AcceptDisplay (" << AStructure->Identification () << ")\n";
-        if (Result == Visual3d_TOA_NO)
-        cout << "NO = Visual3d_View" << MyCView.ViewId
-             << "::AcceptDisplay (" << AStructure->Identification () << ")\n";
-        if (Result == Visual3d_TOA_COMPUTE)
-        cout << "COMPUTE = Visual3d_View" << MyCView.ViewId
-             << "::AcceptDisplay (" << AStructure->Identification () << ")\n";
-        cout << flush;
-#endif
+  // If Display on a structure present in the list of calculated structures while it is not
+  // or more, of calculated type =>
+  // - removes it as well as the associated old computed
+  // THis happens when hlhsr becomes again of type e non computed after SetVisual.
+  Standard_Integer anIndex = IsComputed (theStruct);
+  if (anIndex != 0
+   && theStruct->Visual() != Graphic3d_TOS_COMPUTED)
+  {
+    myStructsToCompute.Remove (anIndex);
+    myStructsComputed .Remove (anIndex);
+    anIndex = 0;
+  }
 
-        return (Result);
+  Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (theStruct);
+  if (anAnswer == Visual3d_TOA_NO)
+  {
+    return;
+  }
 
-}
+  if (!ComputedMode())
+  {
+    anAnswer = Visual3d_TOA_YES;
+  }
 
-void Visual3d_View::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AStructure, const Standard_Integer OldPriority, const Standard_Integer NewPriority) {
+  if (anAnswer == Visual3d_TOA_YES)
+  {
+    if (IsDisplayed (theStruct))
+    {
+      return;
+    }
 
-        if (IsDeleted ()) return;
-        if (! IsDefined ()) return;
-        if (! IsActive ()) return;
-        if (! IsDisplayed (AStructure)) return;
+    theStruct->CalculateBoundBox();
+    myGraphicDriver->DisplayStructure (MyCView, *theStruct->CStructure(), theStruct->DisplayPriority());
+    myStructsDisplayed.Add (theStruct);
+    Update (theUpdateMode);
+    return;
+  }
+  else if (anAnswer != Visual3d_TOA_COMPUTE)
+  {
+    return;
+  }
 
-Standard_Integer Index = IsComputed (AStructure);
-#ifdef G003
-        if (  Index != 0 && ComputedMode () && !DegenerateModeIsOn ()  )
-#else
-        if ((Index != 0) && (! DegenerateModeIsOn ()))
-#endif  // G003
+  if (anIndex != 0)
+  {
+    // Already computed, is COMPUTED still valid?
+    const Handle(Graphic3d_Structure)& anOldStruct = myStructsComputed.Value (anIndex);
+    if (anOldStruct->HLRValidation())
+    {
+      // Case COMPUTED valid
+      // to be displayed
+      if (!IsDisplayed (theStruct))
+      {
+        myStructsDisplayed.Add (theStruct);
+        myGraphicDriver->DisplayStructure (MyCView, *anOldStruct->CStructure(), theStruct->DisplayPriority());
+        Update (theUpdateMode);
+      }
+      return;
+    }
+    else
+    {
+      // Case COMPUTED invalid
+      // Is there another valid representation?
+      // Find in the sequence of already calculated structures
+      // 1/ Structure having the same Owner as <AStructure>
+      // 2/ That is not <AStructure>
+      // 3/ The COMPUTED which of is valid
+      const Standard_Integer aNewIndex = HaveTheSameOwner (theStruct);
+      if (aNewIndex != 0)
+      {
+        // Case of COMPUTED invalid, WITH a valid of replacement
+        // to be displayed
+        if (!IsDisplayed (theStruct))
         {
-#ifdef TRACE
-       Standard_Integer StructId = MyCOMPUTEDSequence.Value (Index)->Identification ();
-        cout << "Visual3d_View" << MyCView.ViewId << "::ChangeDisplayPriority ("
-             << AStructure->Identification () << "/" << StructId
-             << ", " << 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));
-        }
-        else {
-#ifdef TRACE
-        Standard_Integer StructId = AStructure->Identification ();
-        cout << "Visual3d_View" << MyCView.ViewId << "::ChangeDisplayPriority ("
-             << AStructure->Identification () << "/" << StructId
-             << ", " << OldPriority << ", " << NewPriority << ")\n";
-        cout << flush;
-#endif
-                MyGraphicDriver->EraseStructure
-                        (MyCView,
-                         *(Graphic3d_CStructure *)AStructure->CStructure ());
-                MyGraphicDriver->DisplayStructure
-                        (MyCView,
-                         *(Graphic3d_CStructure *)AStructure->CStructure (),
-                         int (NewPriority));
-        }
-
-}
-
-void Visual3d_View::Clear (const Handle(Graphic3d_Structure)& AStructure, const Standard_Boolean WithDestruction) {
-
-#ifdef TRACE_CLEAR
-        cout << "Visual3d_View" << MyCView.ViewId << "::Clear ("
-             << AStructure->Identification () << ")\n";
-        cout << flush;
-#endif
-
-Standard_Integer Index = IsComputed (AStructure);
-        if (Index != 0) {
-#ifdef TRACE_CLEAR
-        cout << "Structure " << AStructure->Identification ()
-             << " calculated in the view "
-             << Identification () << ", by structure "
-             << MyCOMPUTEDSequence.Value (Index)->Identification ()
-             << " is emptied.\n";
-        cout << flush;
-#endif
-                MyCOMPUTEDSequence.Value (Index)->GraphicClear (WithDestruction);
-                MyCOMPUTEDSequence.Value (Index)->SetHLRValidation (Standard_False);
-        }
-
-}
-
-void Visual3d_View::Connect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
-
-#ifdef TRACE_CONNECT
-        cout << "Visual3d_View" << MyCView.ViewId << "::Connect ("
-             << AMother->Identification ()
-             << ADaughter->Identification () << ")\n";
-        cout << flush;
-#endif
-
-Standard_Integer IndexM = IsComputed (AMother);
-Standard_Integer IndexD = IsComputed (ADaughter);
-
-        if (IndexM != 0 && IndexD != 0) {
-#ifdef TRACE_CONNECT
-        cout << "Structure " << AMother->Identification ()
-             << " is connected to structure "
-             << ADaughter->Identification () << endl;
-        cout << "These structures are calculated.\n";
-        cout << "In the view " << Identification ()
-             << "Structure "
-             << MyCOMPUTEDSequence.Value (IndexM)->Identification ()
-             << " is connected to the structure "
-             << MyCOMPUTEDSequence.Value (IndexD)->Identification ()
-             << endl;
-#endif
-                MyCOMPUTEDSequence.Value (IndexM)->GraphicConnect (MyCOMPUTEDSequence.Value (IndexD));
-        }
-
-}
-
-void Visual3d_View::Disconnect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
-
-#ifdef TRACE_CONNECT
-        cout << "Visual3d_View" << MyCView.ViewId << "::Disconnect ("
-             << AMother->Identification ()
-             << ADaughter->Identification () << ")\n";
-        cout << flush;
-#endif
-
-Standard_Integer IndexM = IsComputed (AMother);
-Standard_Integer IndexD = IsComputed (ADaughter);
-
-        if (IndexM != 0 && IndexD != 0) {
-#ifdef TRACE_CONNECT
-        cout << "Structure " << AMother->Identification ()
-             << " is disconnected from the structure "
-             << ADaughter->Identification () << endl;
-        cout << "These structures are calculated.\n";
-        cout << "In the view " << Identification ()
-             << "Structure "
-             << MyCOMPUTEDSequence.Value (IndexM)->Identification ()
-             << " is disconnected from the structure "
-             << MyCOMPUTEDSequence.Value (IndexD)->Identification ()
-             << endl;
-#endif
-                MyCOMPUTEDSequence.Value (IndexM)->GraphicDisconnect (MyCOMPUTEDSequence.Value (IndexD));
+          const Handle(Graphic3d_Structure)& aNewStruct = myStructsComputed.Value (aNewIndex);
+          myStructsComputed.SetValue (anIndex, aNewStruct);
+          myStructsDisplayed.Add (theStruct);
+          myGraphicDriver->DisplayStructure (MyCView, *aNewStruct->CStructure(), theStruct->DisplayPriority());
+          Update (theUpdateMode);
         }
-
-}
-
-void Visual3d_View::Display (const Handle(Graphic3d_Structure)& AStructure) {
-
-        Display (AStructure, MyViewManager->UpdateMode ());
-
-}
-
-void Visual3d_View::Display (const Handle(Graphic3d_Structure)& AStructure, const Aspect_TypeOfUpdate AnUpdateMode) {
-
-        if (IsDeleted ()) return;
-        if (! IsDefined ()) return;
-        if (! IsActive ()) return;
-
-        // If Display on a structure present in the list
-        // of calculated structures while it is not 
-        // or more, of calculated type =>
-        // - removes it as well as the associated old computed
-        // THis happens when hlhsr becomes again of type e
-        // non computed after SetVisual.
-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 (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 ())
-                );
-                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 ();
-
-                // Case COMPUTED valide
-                if (MyCOMPUTEDSequence.Value (Index)->HLRValidation ()) {
-                    // to be displayed
-                    if (! IsDisplayed (AStructure)) {
-                        MyDisplayedStructure.Add (AStructure);
-                        MyGraphicDriver->DisplayStructure (
-                            MyCView,
-                            *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure (),
-                            int (AStructure->DisplayPriority ())
-                        );
-                        if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
-                    }
-                    return;
-                }
-
-                // Case COMPUTED invalid
-                else {
-                    // Is there another valid representation ?
-                    // Find in the sequence of already calculated structures
-                    // 1/ Structure having the same Owner as <AStructure>
-                    // 2/ That is not <AStructure>
-                    // 3/ The COMPUTED which of is valid
-                    Standard_Integer NewIndex = HaveTheSameOwner (AStructure);
-
-                    // Case of COMPUTED invalid, WITH a valid of replacement
-                    if (NewIndex != 0) {
-                        // to be displayed
-                        if (! IsDisplayed (AStructure)) {
-                            MyCOMPUTEDSequence.SetValue
-                                (Index, MyCOMPUTEDSequence.Value (NewIndex));
-                            OldStructId = MyCOMPUTEDSequence.Value (NewIndex)->
-                                                        Identification ();
-                            MyDisplayedStructure.Add (AStructure);
-                            MyGraphicDriver->DisplayStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (NewIndex)->CStructure (),
-                                int (AStructure->DisplayPriority ())
-                            );
-                            if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
-                        }
-                        return;
-                    }
-
-                    // Cas COMPUTED invalid, WITHOUT a valid of replacement
-                    else {
-                        // COMPUTED is removed if displayed 
-                        if (IsDisplayed (AStructure))
-                            MyGraphicDriver->EraseStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ()
-                            );
-                    }
-                }
-            } // if (Index != 0)
-
-            // Compute + Validation
-#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);
-
-#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 ();
-
-// Of which type will be the computed ?
-Standard_Boolean ComputeWireframe = ((ViewType == Visual3d_TOV_WIREFRAME) &&
-                (AStructure->ComputeVisual () != Graphic3d_TOS_SHADING));
-
-Standard_Boolean ComputeShading = ((ViewType == Visual3d_TOV_SHADING) &&
-                (AStructure->ComputeVisual () != Graphic3d_TOS_WIREFRAME));
-
-            if (ComputeWireframe)
-                TheStructure->SetVisual (Graphic3d_TOS_WIREFRAME);
-            if (ComputeShading)
-                TheStructure->SetVisual (Graphic3d_TOS_SHADING);
-
-            if (! ComputeShading && ! ComputeWireframe)
-                Answer = Visual3d_TOA_NO;
-            else
-                Answer = AcceptDisplay (TheStructure);
-
-            if (AStructure->IsHighlighted()) {
-                TheStructure->SetHighlightColor (AStructure->HighlightColor ());
-                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 ())
-                );
-                if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
-            }
-        } // Visual3d_TOA_COMPUTE
-}
-
-void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& AStructure) {
-
-        if (IsDeleted ()) return;
-
-        Erase (AStructure, MyViewManager->UpdateMode ());
-
-}
-
-void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& AStructure, const Aspect_TypeOfUpdate AnUpdateMode) {
-
-Standard_Integer StructId;
-
-        if (IsDeleted ()) return;
-
-        // No test on window as the structure is displayed only if 
-        // the window exists, so only one test is enough.
-        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 (Answer != Visual3d_TOA_COMPUTE) {
-                        MyGraphicDriver->EraseStructure (
-                                MyCView,
-                                *(Graphic3d_CStructure *)AStructure->CStructure ()
-                        );
-                }
-
-                if (Answer == Visual3d_TOA_COMPUTE) {
-Standard_Integer Index = IsComputed (AStructure);
-#ifdef TRACE_COMP
-        cout << "Visual3d_View" << MyCView.ViewId << "::Erase ("
-             << AStructure->Identification () << ");\n";
-        cout << "Index : " << Index << "\n";
-        cout << flush;
-#endif
-#ifdef G003
-                    if (  Index != 0 && ComputedMode () &&
-                                                !DegenerateModeIsOn ()  )
-#else
-                    if ((Index != 0) && (! DegenerateModeIsOn ()))
-#endif  // G003
-                    {
-                        StructId =
-                        MyCOMPUTEDSequence.Value (Index)->Identification ();
-#ifdef TRACE_COMP
-        cout << "Structure " << AStructure->Identification ()
-             << " calculated, in the view "
-             << Identification () << ", by the structure "
-             << StructId << " is removed. \n";
-        cout << flush;
-#endif
-                        MyGraphicDriver->EraseStructure
-                                (MyCView, *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ());
-                    }
-                    // else is impossible
-                }
-                MyDisplayedStructure.Remove (AStructure);
-                if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
-        }
-
-}
-
-void Visual3d_View::Highlight (const Handle(Graphic3d_Structure)& AStructure, const Aspect_TypeOfHighlightMethod AMethod) {
-
-#ifdef TRACE_HIGH
-        cout << "Visual3d_View" << MyCView.ViewId << "::Highlight ("
-             << AStructure->Identification () << ")\n";
-        cout << flush;
-#endif
-
-Standard_Integer Index = IsComputed (AStructure);
-        if (Index != 0) {
-#ifdef TRACE_HIGH
-        cout << "Structure " << AStructure->Identification ()
-             << " calculated, in the view "
-             << Identification () << ", by the structure "
-             << MyCOMPUTEDSequence.Value (Index)->Identification ()
-             << " passes in highlight mode.\n";
-        cout << flush;
-#endif
-                (MyCOMPUTEDSequence.Value (Index))->SetHighlightColor
-                        (AStructure->HighlightColor ());
-                (MyCOMPUTEDSequence.Value (Index))->GraphicHighlight (AMethod);
-        }
-
-}
-
-void Visual3d_View::SetTransform (const Handle(Graphic3d_Structure)& AStructure, const TColStd_Array2OfReal& ATrsf) {
-
-#ifdef TRACE_TRSF
-        cout << "Visual3d_View" << MyCView.ViewId << "::Transform ("
-             << AStructure->Identification () << ")\n";
-        cout << flush;
-#endif
-
-Standard_Integer Index = IsComputed (AStructure);
-        if (Index != 0) {
-#ifdef TRACE_TRSF
-        cout << "The structure " << AStructure->Identification ()
-             << " calculated, in the view "
-             << Identification () << ", by the structure "
-             << MyCOMPUTEDSequence.Value (Index)->Identification ()
-             << " is transformed.\n";
-        cout << flush;
-#endif
-                // Test is somewhat light !
-                // trsf is transferred only if it is :
-                // a translation
-                // a scale
-                if (ATrsf (0, 1) != 0. || ATrsf (0, 2) != 0.
-                 || ATrsf (1, 0) != 0. || ATrsf (1, 2) != 0.
-                 || ATrsf (2, 0) != 0. || ATrsf (2, 1) != 0.)
-                    ReCompute (AStructure);
-                else
-                    MyCOMPUTEDSequence.Value (Index)->GraphicTransform (ATrsf);
-        }
-
-}
-
-void Visual3d_View::UnHighlight (const Handle(Graphic3d_Structure)& AStructure) {
-
-#ifdef TRACE_HIGH
-        cout << "Visual3d_View" << MyCView.ViewId << "::UnHighlight ("
-             << AStructure->Identification () << ")\n";
-        cout << flush;
-#endif
-
-Standard_Integer Index = IsComputed (AStructure);
-        if (Index != 0) {
-#ifdef TRACE_HIGH
-        cout << "Structure " << AStructure->Identification ()
-             << " calculated, in the view "
-             << Identification () << ", by the structure "
-             << MyCOMPUTEDSequence.Value (Index)->Identification ()
-             << " passes in unhighlight mode.\n";
-        cout << flush;
-#endif
-                MyCOMPUTEDSequence.Value (Index)->GraphicUnHighlight ();
-        }
-
-
-}
-
-Standard_Integer Visual3d_View::IsComputed (const Handle(Graphic3d_Structure)& AStructure) const {
-
-Standard_Integer StrId = AStructure->Identification ();
-
-Standard_Integer Result = 0;
-Standard_Integer Length = MyTOCOMPUTESequence.Length ();
-
-        // Recherche de la structure <AStructure> dans la
-        // sequence des structures deja calculees
-        for (Standard_Integer i=1; i<=Length && Result==0; i++)
-                if ((MyTOCOMPUTESequence.Value (i))->Identification ()
-                        == StrId) Result        = i;
-#ifdef TRACE_ISCOMP
-        cout << "\n In the view " << Identification () << " the structure ";
-        if (Result != 0)
-                cout << StrId << " is calculated by "
-                     << MyCOMPUTEDSequence.Value (Result)->Identification ()
-                     << "\n" << flush;
-        else
-                cout << StrId << " is not calculated\n" << flush;
-#endif
-
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
-                cout << "In Visual3d_View::IsComputed, ";
-                cout << "TOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-        }
-#endif
-
-        return (Result);
-
-}
-
-Standard_Boolean Visual3d_View::IsDisplayed (const Handle(Graphic3d_Structure)& AStructure) const {
-
-Standard_Boolean Result = Standard_False;
-
-        if (IsDeleted ()) return Result;
-
-        Result  = MyDisplayedStructure.Contains (AStructure);
-
-        return Result;
-
-}
-
-#ifdef IMPLEMENTED
-Standard_Boolean Visual3d_View::ContainsComputedStructure () const {
-
-Standard_Boolean Result = Standard_False;
-
-        if (MyDisplayedStructure.IsEmpty ()) return Result;
-
-Graphic3d_MapIteratorOfMapOfStructure Iterator (MyDisplayedStructure);
-
-        Standard_Integer i      = MyDisplayedStructure.Extent ();
-
-        // Stop at the first structure of type TOS_COMPUTED
-        while (! Result && Iterator.More ()) {
-                Result  =
-                (((Iterator.Key ())->Visual ()) == Graphic3d_TOS_COMPUTED);
-
-                // Iterator.Next () is located on the 
-                // next structure
-                Iterator.Next ();
-        }
-
-        return Result;
-
-}
-#endif
-
-Standard_Boolean Visual3d_View::ContainsFacet () const {
-
-        return ContainsFacet (MyDisplayedStructure);
-
-}
-
-Standard_Boolean Visual3d_View::ContainsFacet (const Graphic3d_MapOfStructure& ASet) const {
-
-Standard_Boolean Result = Standard_False;
-
-        if (ASet.IsEmpty ()) return Result;
-
-Graphic3d_MapIteratorOfMapOfStructure Iterator (ASet);
-
-        // Stop at the first structure containing a facet
-        for ( Iterator.Initialize (ASet);
-              Iterator.More () && ! Result;
-              Iterator.Next ())
-                Result  = (Iterator.Key ())->ContainsFacet ();
-
-        return Result;
-
-}
-
-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);
-
-}
-
-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 ();
-  }
-  else {
-
-  Standard_Real Xm, Ym, Zm, XM, YM, ZM;
-  Graphic3d_MapIteratorOfMapOfStructure Iterator (ASet);
-
-  XMin = RealLast ();
-  YMin = RealLast ();
-  ZMin = RealLast ();
-
-  XMax = RealFirst ();
-  YMax = RealFirst ();
-  ZMax = RealFirst ();
-
-  for ( Iterator.Initialize (ASet);
-        Iterator.More ();
-        Iterator.Next ()) {
-
-      if ( (Iterator.Key ())->IsInfinite ()){
-        //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 ;
+        return;
       }
-      // 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;
-          }
-        }
-    }
-
-    // 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; }
-  }
-  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; }
-}
-
-const TColStd_Array2OfReal& Visual3d_View::MatrixOfOrientation () {
-
-        if (! MyMatOfOriIsEvaluated) {
-                MyGraphicDriver->InquireMat
-                    (MyCView, MyMatrixOfOrientation, MyMatrixOfMapping);
-                MyMatOfMapIsEvaluated   = Standard_True;
-                MyMatOfOriIsEvaluated   = Standard_True;
-        }
-
-        return (MyMatrixOfOrientation);
-
-}
-
-const TColStd_Array2OfReal& Visual3d_View::MatrixOfMapping () {
-
-        if (! MyMatOfMapIsEvaluated) {
-                MyGraphicDriver->InquireMat
-                    (MyCView, MyMatrixOfOrientation, MyMatrixOfMapping);
-                MyMatOfMapIsEvaluated   = Standard_True;
-                MyMatOfOriIsEvaluated   = Standard_True;
-        }
-
-        return (MyMatrixOfMapping);
-
-}
-
-Standard_Integer Visual3d_View::NumberOfDisplayedStructures () const {
-
-Standard_Integer Result = MyDisplayedStructure.Extent ();
-
-        return (Result);
-
-}
-
-#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) {
-
-Standard_Real PtX, PtY, PtZ, PtT;
-Standard_Real APT;
-static Standard_Real Ratio, um, vm, uM, vM;
-static Standard_Real fpd, bpd;
-
-        if (! MyMatOfOriIsEvaluated || ! MyMatOfMapIsEvaluated) {
-                MyGraphicDriver->InquireMat
-                    (MyCView, MyMatrixOfOrientation, MyMatrixOfMapping);
-                MyMatOfOriIsEvaluated = MyMatOfMapIsEvaluated = Standard_True;
-        }
-
-        // 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;
-}
-
-Standard_Integer Visual3d_View::Identification () const {
-
-        return (Standard_Integer (MyCView.ViewId));
-
-}
-
-
-Standard_Boolean Visual3d_View::ZBufferIsActivated () const {
-
-        if (IsDeleted ()) return (Standard_False);
-
-        if ((! IsDefined ()) || (! IsActive ())) return (Standard_False);
-
-// -1 => not forced by the programmer => depends on the type of visualisation
-//  0 ou 1 => forced by the programmer
-
-        if (MyCView.Context.ZBufferActivity == -1)
-                if (MyContext.Visualization () == Visual3d_TOV_SHADING)
-                        return (Standard_True);
-                else
-                        return (Standard_False);
-        else
-                if (MyCView.Context.ZBufferActivity)
-                        return (Standard_True);
-                else
-                        return (Standard_False);
-
-}
-
-void Visual3d_View::SetTransparency (const Standard_Boolean AnActivity) {
-
-        if (IsDeleted ()) return;
-
-        if ((! IsDefined ()) || (! IsActive ())) return;
-
-        MyGraphicDriver->Transparency (MyCView, AnActivity);
-
-}
-
-void Visual3d_View::SetZBufferActivity (const Standard_Integer AnActivity) {
-
-        if (MyCView.Context.ZBufferActivity == AnActivity) return;
-
-        if (IsDeleted ()) return;
-
-        if ((! IsDefined ()) || (! IsActive ())) return;
-
-        MyCView.Context.ZBufferActivity = AnActivity;
-        MyGraphicDriver->SetVisualisation (MyCView);
-
-}
-
-void Visual3d_View::UpdateView () {
-
-        MyCView.Context.Aliasing        = (MyContext.AliasingIsOn () ? 1:0);
-        MyCView.Context.BackZClipping   =
-                (MyContext.BackZClippingIsOn () ? 1:0);
-        MyCView.Context.FrontZClipping  =
-                (MyContext.FrontZClippingIsOn() ? 1:0);
-        MyCView.Context.DepthCueing     =
-                (MyContext.DepthCueingIsOn () ? 1:0);
-
-        MyCView.Context.ZClipFrontPlane =
-                                float (MyContext.ZClippingFrontPlane ());
-        MyCView.Context.ZClipBackPlane          =
-                                float (MyContext.ZClippingBackPlane ());
-        MyCView.Context.DepthFrontPlane =
-                                float (MyContext.DepthCueingFrontPlane ());
-        MyCView.Context.DepthBackPlane          =
-                                float (MyContext.DepthCueingBackPlane ());
-
-        MyCView.Context.Model           = int (MyContext.Model ());
-        MyCView.Context.Visualization   = int (MyContext.Visualization ());
-
-        Handle(Graphic3d_TextureEnv)   TempTextureEnv = MyContext.TextureEnv();
-        if (! TempTextureEnv.IsNull()) MyCView.Context.TexEnvId = TempTextureEnv->TextureId();
-        else                           MyCView.Context.TexEnvId = -1;
-        MyCView.Context.SurfaceDetail = MyContext.SurfaceDetail();
-
-}
-
-void Visual3d_View::Compute () {
-
-Standard_Integer i;
-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
-
-        /*
-         * Force HLRValidation to False on all structures
-         * calculated in the view.
-         */
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
-                cout << "In Visual3d_View::Compute, ";
-                cout << "TOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-        }
-#endif
-
-        /*
-         * Change of orientation or of projection type =>
-         * 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;
-
-        i       = MyDisplayedStructure.Extent ();
-
-Graphic3d_SequenceOfStructure FooSequence;
-
-        while (S1Iterator.More ()) {
-                Answer  = AcceptDisplay (S1Iterator.Key ());
-                // If the structure was calculated, it is recalculated.
-                if (Answer == Visual3d_TOA_COMPUTE) {
-#ifdef TRACE
-                        cout << "AcceptDisplay ("
-                             << (S1Iterator.Key ())->Identification ()
-                             << ") == Visual3d_TOA_COMPUTE;\n";
-                        cout << flush;
-#endif
-                        //Display (S1Iterator.Key (), Aspect_TOU_WAIT);
-                        FooSequence.Append (S1Iterator.Key ());
-                }
-
-                // S1Iterator.Next () is located on the next structure
-                S1Iterator.Next ();
-        }
-
-        Length  = FooSequence.Length ();
-        // All stored structures are displayed
-        for (i=1; i<=Length; i++)
-                Display (FooSequence.Value (i), Aspect_TOU_WAIT);
-        if (Length != 0) FooSequence.Clear ();
-
-}
-
-void Visual3d_View::ReCompute (const Handle(Graphic3d_Structure)& AStructure) {
-#ifdef G003
-        if ( DegenerateModeIsOn () || !ComputedMode () ) return;
-#else
-        if (DegenerateModeIsOn()) return;
-#endif  // G003
-
-        if (IsDeleted ()) return;
-
-        if ((! IsDefined ()) || (! IsActive ())) return;
-
-        if (! MyWindow->IsMapped ()) return;
-
-        if (! AStructure->IsDisplayed ()) return;
-
-Visual3d_TypeOfAnswer Answer;
-
-        Answer  = AcceptDisplay (AStructure);
-
-        if (Answer == Visual3d_TOA_COMPUTE) {
-Standard_Integer Index = IsComputed (AStructure);
-                if (Index == 0) {
-#ifdef TRACE_COMP
-        cout << "Structure " << AStructure->Identification ()
-             << " is not calculated in the view "
-             << Identification () << "\n";
-        cout << flush;
-#endif
-                }
-                else {
-                 Standard_Integer OldStructId, NewStructId;
-                        OldStructId =
-                        MyCOMPUTEDSequence.Value (Index)->Identification ();
-#ifdef TRACE_COMP
-       Standard_Integer StructId = AStructure->Identification ();
-        cout << "Structure " << StructId
-             << " calculated, in the view "
-             << Identification () << ", by the structure "
-             << OldStructId << " is recalculated.\n";
-        cout << flush;
-#endif
-
-        // Compute + Validation
-#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) &&
-        (AStructure->ComputeVisual () != Graphic3d_TOS_SHADING));
-
-Standard_Boolean ComputeShading = ((ViewType == Visual3d_TOV_SHADING) &&
-        (AStructure->ComputeVisual () != Graphic3d_TOS_WIREFRAME));
-
-                        if (ComputeWireframe)
-                            TheStructure->SetVisual (Graphic3d_TOS_WIREFRAME);
-                        if (ComputeShading)
-                            TheStructure->SetVisual (Graphic3d_TOS_SHADING);
-
-                        if (AStructure->IsHighlighted ()) {
-                            TheStructure->SetHighlightColor
-                                (AStructure->HighlightColor ());
-                            TheStructure->GraphicHighlight (Aspect_TOHM_COLOR);
-                        }
-
-                        // Ot is ranged
-                        // Find structure <AStructure>
-                        // in the sequence of structures to be calculated.
-                        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 ())
-                        );
-
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
-                cout << "In Visual3d_View::ReCompute, ";
-                cout << "TOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-        }
-#endif
-
-                          // hlhsr and the new associated compute 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
-
-                          // hlhsr and the new associated compute are removed 
-
-                          MyTOCOMPUTESequence.Remove (Index);
-                          MyCOMPUTEDSequence.Remove (Index);
-
-#ifdef TRACE_LENGTH
-        if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ())
-                cout << "\tTOCOMPUTE " << MyTOCOMPUTESequence.Length ()
-                     << " != COMPUTED " << MyCOMPUTEDSequence.Length ()
-                     << "\n" << flush;
-#endif
-                }
-        }
-
-}
-
-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;
-
-}
-
-Handle(Aspect_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;
-Standard_Integer Length = MyTOCOMPUTESequence.Length ();
-
-        // Find in the sequence of already calculated structures 
-        // 1/ Structure with the same Owner as <AStructure>
-        // 2/ Which is not <AStructure>
-        // 3/ COMPUTED which of is valid
-        for (Standard_Integer i=1; i<=Length && Result==0; i++)
-           if ((MyTOCOMPUTESequence.Value (i)->Owner () == AStructure->Owner ())
-            && (MyTOCOMPUTESequence.Value (i)->Identification () !=
-                                                AStructure->Identification ())
-            && (MyCOMPUTEDSequence.Value (i)->HLRValidation ())) Result   = i;
-
-        return (Result);
-
-}
-
-Standard_Address Visual3d_View::CView () const {
-
-        return Standard_Address (&MyCView);
-
-}
+      else
+      {
+        // Case COMPUTED invalid, WITHOUT a valid of replacement
+        // COMPUTED is removed if displayed
+        if (IsDisplayed (theStruct))
+        {
+          myGraphicDriver->EraseStructure (MyCView, *anOldStruct->CStructure());
+        }
+      }
+    }
+  }
 
+  // Compute + Validation
+  Handle(Graphic3d_Structure) aStruct;
+  TColStd_Array2OfReal aTrsf (0, 3, 0, 3);
+  theStruct->Transform (aTrsf);
+  if (anIndex != 0)
+  {
+    TColStd_Array2OfReal anIdent (0, 3, 0, 3);
+    for (Standard_Integer ii = 0; ii <= 3; ++ii)
+    {
+      for (Standard_Integer jj = 0; jj <= 3; ++jj)
+      {
+        anIdent (ii, jj) = (ii == jj ? 1.0 : 0.0);
+      }
+    }
 
-// Triedron methods : the Triedron is a non-zoomable object.
+    aStruct = myStructsComputed.Value (anIndex);
+    aStruct->SetTransform (anIdent, Graphic3d_TOC_REPLACE);
+    if (theStruct->IsTransformed())
+    {
+      theStruct->Compute (this, aTrsf, aStruct);
+    }
+    else
+    {
+      theStruct->Compute (this, aStruct);
+    }
+  }
+  else
+  {
+    aStruct = theStruct->IsTransformed()
+            ? theStruct->Compute (this, aTrsf)
+            : theStruct->Compute (this);
+  }
 
-void Visual3d_View::ZBufferTriedronSetup(const Quantity_NameOfColor XColor,
-                                    const Quantity_NameOfColor YColor,
-                                    const Quantity_NameOfColor ZColor,
-                                    const Standard_Real        SizeRatio,
-                                    const Standard_Real        AxisDiametr,
-                                    const Standard_Integer     NbFacettes) {
-  MyGraphicDriver->ZBufferTriedronSetup(XColor, YColor, ZColor,
-                                        SizeRatio, AxisDiametr, NbFacettes);
-}
+  aStruct->SetHLRValidation (Standard_True);
 
+  // TOCOMPUTE and COMPUTED associated to sequences are added
+  myStructsToCompute.Append (theStruct);
+  myStructsComputed .Append (aStruct);
 
+  // The previous are removed if necessary
+  if (anIndex != 0)
+  {
+    myStructsToCompute.Remove (anIndex);
+    myStructsComputed .Remove (anIndex);
+  }
 
-void Visual3d_View::TriedronDisplay (const Aspect_TypeOfTriedronPosition APosition,
- const Quantity_NameOfColor AColor, const Standard_Real AScale, const Standard_Boolean AsWireframe ) {
+  // Of which type will be the computed?
+  const Visual3d_TypeOfVisualization aViewType = MyContext.Visualization();
+  const Standard_Boolean toComputeWireframe = aViewType == Visual3d_TOV_WIREFRAME
+                                           && theStruct->ComputeVisual() != Graphic3d_TOS_SHADING;
+  const Standard_Boolean toComputeShading   = aViewType == Visual3d_TOV_SHADING
+                                           && theStruct->ComputeVisual() != Graphic3d_TOS_WIREFRAME;
+  if (!toComputeShading && !toComputeWireframe)
+  {
+    anAnswer = Visual3d_TOA_NO;
+  }
+  else
+  {
+    aStruct->SetVisual (toComputeWireframe ? Graphic3d_TOS_WIREFRAME : Graphic3d_TOS_SHADING);
+    anAnswer = AcceptDisplay (aStruct);
+  }
 
-        MyGraphicDriver->TriedronDisplay (MyCView,APosition, AColor, AScale, AsWireframe);
+  if (theStruct->IsHighlighted())
+  {
+    aStruct->SetHighlightColor (theStruct->HighlightColor());
+    aStruct->GraphicHighlight (Aspect_TOHM_COLOR);
+  }
 
+  // It is displayed only if the calculated structure
+  // has a proper type corresponding to the one of the view.
+  if (anAnswer != Visual3d_TOA_NO)
+  {
+    if (!IsDisplayed (theStruct))
+    {
+      myStructsDisplayed.Add (theStruct);
+    }
+    myGraphicDriver->DisplayStructure (MyCView, *aStruct->CStructure(), theStruct->DisplayPriority());
+    Update (theUpdateMode);
+  }
 }
 
-void Visual3d_View::TriedronErase () {
-
-        MyGraphicDriver->TriedronErase (MyCView);
-
-
+// ========================================================================
+// function : Erase
+// purpose  :
+// ========================================================================
+void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct)
+{
+  if (!IsDeleted())
+  {
+    Erase (theStruct, myViewManager->UpdateMode());
+  }
 }
 
-void Visual3d_View::TriedronEcho (const Aspect_TypeOfTriedronEcho AType ) {
+// ========================================================================
+// function : Erase
+// purpose  :
+// ========================================================================
+void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct,
+                           const Aspect_TypeOfUpdate          theUpdateMode)
+{
+  if (IsDeleted()
+  || !IsDisplayed (theStruct))
+  {
+    return;
+  }
 
-        MyGraphicDriver->TriedronEcho (MyCView,AType);
+  Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (theStruct);
+  if (!ComputedMode())
+  {
+    anAnswer = Visual3d_TOA_YES;
+  }
 
+  if (anAnswer != Visual3d_TOA_COMPUTE)
+  {
+    myGraphicDriver->EraseStructure (MyCView, *theStruct->CStructure());
+  }
+  else if (anAnswer == Visual3d_TOA_COMPUTE
+       && myIsInComputedMode)
+  {
+    const Standard_Integer anIndex = IsComputed (theStruct);
+    if (anIndex != 0)
+    {
+      const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
+      myGraphicDriver->EraseStructure (MyCView, *aCompStruct->CStructure());
+    }
+  }
+  myStructsDisplayed.Remove (theStruct);
+  Update (theUpdateMode);
 }
 
-Standard_Boolean checkFloat(const Standard_Real value)
+// ========================================================================
+// function : Highlight
+// purpose  :
+// ========================================================================
+void Visual3d_View::Highlight (const Handle(Graphic3d_Structure)& theStruct,
+                               const Aspect_TypeOfHighlightMethod theMethod)
 {
-    return value > -FLT_MAX && value < FLT_MAX;
+  const Standard_Integer anIndex = IsComputed (theStruct);
+  if (anIndex != 0)
+  {
+    const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
+    aCompStruct->SetHighlightColor (theStruct->HighlightColor());
+    aCompStruct->GraphicHighlight (theMethod);
+  }
 }
 
-void SetMinMaxValuesCallback(void* Visual3dView)
+// ========================================================================
+// function : SetTransform
+// purpose  :
+// ========================================================================
+void Visual3d_View::SetTransform (const Handle(Graphic3d_Structure)& theStruct,
+                                  const TColStd_Array2OfReal&        theTrsf)
 {
-    Standard_Real xmin, ymin, zmin, xmax, ymax, zmax;
-
-    Handle(Visual3d_View) view = (Handle(Visual3d_View)&) Visual3dView;
-    view->MinMaxValues(xmin, ymin, zmin, xmax, ymax, zmax);
-
-    if (checkFloat(xmin) && checkFloat(ymin) && checkFloat(zmin) &&
-        checkFloat(xmax) && checkFloat(ymax) && checkFloat(zmax))
+  const Standard_Integer anIndex = IsComputed (theStruct);
+  if (anIndex != 0)
+  {
+    // Test is somewhat light !
+    // trsf is transferred only if it is :
+    // a translation
+    // a scale
+    if (theTrsf (0, 1) != 0.0 || theTrsf (0, 2) != 0.0
+     || theTrsf (1, 0) != 0.0 || theTrsf (1, 2) != 0.0
+     || theTrsf (2, 0) != 0.0 || theTrsf (2, 1) != 0.0)
+    {
+      ReCompute (theStruct);
+    }
+    else
     {
-        Handle(Graphic3d_GraphicDriver) driver = Handle(Graphic3d_GraphicDriver)::DownCast(view->GraphicDriver());
-        driver->GraduatedTrihedronMinMaxValues((Standard_ShortReal)xmin, (Standard_ShortReal)ymin, (Standard_ShortReal)zmin,
-                                               (Standard_ShortReal)xmax, (Standard_ShortReal)ymax, (Standard_ShortReal)zmax);
+      const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
+      aCompStruct->GraphicTransform (theTrsf);
     }
+  }
+
+  theStruct->CalculateBoundBox();
+  if (!theStruct->IsMutable()
+   && !theStruct->CStructure()->IsForHighlight
+   && !theStruct->CStructure()->IsInfinite)
+  {
+    const Standard_Integer aLayerId = theStruct->GetZLayer();
+    myGraphicDriver->InvalidateBVHData (MyCView, aLayerId);
+  }
 }
 
-Standard_Boolean Visual3d_View::GetGraduatedTrihedron
-    (/* Names of axes */
-     TCollection_ExtendedString& xname,
-     TCollection_ExtendedString& yname,
-     TCollection_ExtendedString& zname,
-     /* Draw names */
-     Standard_Boolean& xdrawname,
-     Standard_Boolean& ydrawname,
-     Standard_Boolean& zdrawname,
-     /* Draw values */
-     Standard_Boolean& xdrawvalues,
-     Standard_Boolean& ydrawvalues,
-     Standard_Boolean& zdrawvalues,
-     /* Draw grid */
-     Standard_Boolean& drawgrid,
-     /* Draw axes */
-     Standard_Boolean& drawaxes,
-     /* Number of splits along axes */
-     Standard_Integer& nbx,
-     Standard_Integer& nby,
-     Standard_Integer& nbz,
-     /* Offset for drawing values */
-     Standard_Integer& xoffset,
-     Standard_Integer& yoffset,
-     Standard_Integer& zoffset,
-     /* Offset for drawing names of axes */
-     Standard_Integer& xaxisoffset,
-     Standard_Integer& yaxisoffset,
-     Standard_Integer& zaxisoffset,
-     /* Draw tickmarks */
-     Standard_Boolean& xdrawtickmarks,
-     Standard_Boolean& ydrawtickmarks,
-     Standard_Boolean& zdrawtickmarks,
-     /* Length of tickmarks */
-     Standard_Integer& xtickmarklength,
-     Standard_Integer& ytickmarklength,
-     Standard_Integer& ztickmarklength,
-     /* Grid color */
-     Quantity_Color& gridcolor,
-     /* Colors of axis names */
-     Quantity_Color& xnamecolor,
-     Quantity_Color& ynamecolor,
-     Quantity_Color& znamecolor,
-     /* Colors of axis and values */
-     Quantity_Color& xcolor,
-     Quantity_Color& ycolor,
-     Quantity_Color& zcolor,
-     /* Name of font for names of axes */
-     TCollection_AsciiString& fontOfNames,
-     /* Style of names of axes */
-     OSD_FontAspect& styleOfNames,
-     /* Size of names of axes */
-     Standard_Integer& sizeOfNames,
-     /* Name of font for values */
-     TCollection_AsciiString& fontOfValues,
-     /* Style of values */
-     OSD_FontAspect& styleOfValues,
-     /* Size of values */
-     Standard_Integer& sizeOfValues) const
+// ========================================================================
+// function : UnHighlight
+// purpose  :
+// ========================================================================
+void Visual3d_View::UnHighlight (const Handle(Graphic3d_Structure)& theStruct)
 {
-    if (!MyGTrihedron.ptrVisual3dView)
-        return Standard_False;
-
-    /* Names of axes */
-    xname = MyGTrihedron.xname;
-    yname = MyGTrihedron.yname; 
-    zname = MyGTrihedron.zname;
-    /* Draw names */
-    xdrawname = MyGTrihedron.xdrawname; 
-    ydrawname = MyGTrihedron.ydrawname; 
-    zdrawname = MyGTrihedron.zdrawname;
-    /* Draw values */
-    xdrawvalues = MyGTrihedron.xdrawvalues; 
-    ydrawvalues = MyGTrihedron.ydrawvalues; 
-    zdrawvalues = MyGTrihedron.zdrawvalues;
-    /* Draw grid */
-    drawgrid = MyGTrihedron.drawgrid;
-    /* Draw axes */
-    drawaxes = MyGTrihedron.drawaxes;
-    /* Number of splits along axes */
-    nbx = MyGTrihedron.nbx;
-    nby = MyGTrihedron.nby;
-    nbz = MyGTrihedron.nbz;
-    /* Offset for drawing values */
-    xoffset = MyGTrihedron.xoffset;
-    yoffset = MyGTrihedron.yoffset;
-    zoffset = MyGTrihedron.zoffset;
-    /* Offset for drawing names of axes */
-    xaxisoffset = MyGTrihedron.xaxisoffset;
-    yaxisoffset = MyGTrihedron.yaxisoffset;
-    zaxisoffset = MyGTrihedron.zaxisoffset;
-    /* Draw tickmarks */
-    xdrawtickmarks = MyGTrihedron.xdrawtickmarks;
-    ydrawtickmarks = MyGTrihedron.ydrawtickmarks;
-    zdrawtickmarks = MyGTrihedron.zdrawtickmarks;
-    /* Length of tickmarks */
-    xtickmarklength = MyGTrihedron.xtickmarklength;
-    ytickmarklength = MyGTrihedron.ytickmarklength;
-    ztickmarklength = MyGTrihedron.ztickmarklength;
-    /* Grid color */
-    gridcolor = MyGTrihedron.gridcolor;
-    /* Colors of axis names */
-    xnamecolor = MyGTrihedron.xnamecolor;
-    ynamecolor = MyGTrihedron.ynamecolor;
-    znamecolor = MyGTrihedron.znamecolor;
-    /* Colors of axis and values */
-    xcolor = MyGTrihedron.xcolor;
-    ycolor = MyGTrihedron.ycolor;
-    zcolor = MyGTrihedron.zcolor;
-    /* Name of font for names of axes */
-    fontOfNames = MyGTrihedron.fontOfNames;
-    /* Style of names of axes */
-    styleOfNames = MyGTrihedron.styleOfNames;
-    /* Size of names of axes */
-    sizeOfNames = MyGTrihedron.sizeOfNames;
-    /* Name of font for values */
-    fontOfValues = MyGTrihedron.fontOfValues;
-    /* Style of values */
-    styleOfValues = MyGTrihedron.styleOfValues;
-    /* Size of values */
-    sizeOfValues = MyGTrihedron.sizeOfValues;
-
-    return Standard_True;
+  Standard_Integer anIndex = IsComputed (theStruct);
+  if (anIndex != 0)
+  {
+    const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
+    aCompStruct->GraphicUnHighlight();
+  }
 }
 
-void Visual3d_View::GraduatedTrihedronDisplay
-    (/* Names of axes */
-     const TCollection_ExtendedString &xname,
-     const TCollection_ExtendedString &yname,
-     const TCollection_ExtendedString &zname,
-     /* Draw names */
-     const Standard_Boolean xdrawname,
-     const Standard_Boolean ydrawname,
-     const Standard_Boolean zdrawname,
-     /* Draw values */
-     const Standard_Boolean xdrawvalues,
-     const Standard_Boolean ydrawvalues,
-     const Standard_Boolean zdrawvalues,
-     /* Draw grid */
-     const Standard_Boolean drawgrid,
-     /* Draw axes */
-     const Standard_Boolean drawaxes,
-     /* Number of splits along axes */
-     const Standard_Integer nbx,
-     const Standard_Integer nby,
-     const Standard_Integer nbz,
-     /* Offset for drawing values */
-     const Standard_Integer xoffset,
-     const Standard_Integer yoffset,
-     const Standard_Integer zoffset,
-     /* Offset for drawing names of axes */
-     const Standard_Integer xaxisoffset,
-     const Standard_Integer yaxisoffset,
-     const Standard_Integer zaxisoffset,
-     /* Draw tickmarks */
-     const Standard_Boolean xdrawtickmarks,
-     const Standard_Boolean ydrawtickmarks,
-     const Standard_Boolean zdrawtickmarks,
-     /* Length of tickmarks */
-     const Standard_Integer xtickmarklength,
-     const Standard_Integer ytickmarklength,
-     const Standard_Integer ztickmarklength,
-     /* Grid color */
-     const Quantity_Color& gridcolor,
-     /* Colors of axis names */
-     const Quantity_Color& xnamecolor,
-     const Quantity_Color& ynamecolor,
-     const Quantity_Color& znamecolor,
-     /* Colors of axis and values */
-     const Quantity_Color& xcolor,
-     const Quantity_Color& ycolor,
-     const Quantity_Color& zcolor,
-     /* Name of font for names of axes */
-     const TCollection_AsciiString &fontOfNames,
-     /* Style of names of axes */
-     const OSD_FontAspect styleOfNames,
-     /* Size of names of axes */
-     const Standard_Integer sizeOfNames,
-     /* Name of font for values */
-     const TCollection_AsciiString &fontOfValues,
-     /* Style of values */
-     const OSD_FontAspect styleOfValues,
-     /* Size of values */
-     const Standard_Integer sizeOfValues)
+// ========================================================================
+// function : IsComputed
+// purpose  :
+// ========================================================================
+Standard_Integer Visual3d_View::IsComputed (const Handle(Graphic3d_Structure)& theStruct) const
 {
-    /* Names of axes */
-    MyGTrihedron.xname = xname;
-    MyGTrihedron.yname = yname;
-    MyGTrihedron.zname = zname;
-    /* Draw names */
-    MyGTrihedron.xdrawname = xdrawname;
-    MyGTrihedron.ydrawname = ydrawname;
-    MyGTrihedron.zdrawname = zdrawname;
-    /* Draw values */
-    MyGTrihedron.xdrawvalues = xdrawvalues;
-    MyGTrihedron.ydrawvalues = ydrawvalues;
-    MyGTrihedron.zdrawvalues = zdrawvalues;
-    /* Draw grid */
-    MyGTrihedron.drawgrid = drawgrid;
-    /* Draw axes */
-    MyGTrihedron.drawaxes = drawaxes;
-    /* Number of splits along axes */
-    MyGTrihedron.nbx = nbx;
-    MyGTrihedron.nby = nby;
-    MyGTrihedron.nbz = nbz;
-    /* Offset for drawing values */
-    MyGTrihedron.xoffset = xoffset;
-    MyGTrihedron.yoffset = yoffset;
-    MyGTrihedron.zoffset = zoffset;
-    /* Offset for drawing names of axes */
-    MyGTrihedron.xaxisoffset = xaxisoffset;
-    MyGTrihedron.yaxisoffset = yaxisoffset;
-    MyGTrihedron.zaxisoffset = zaxisoffset;
-    /* Draw tickmarks */
-    MyGTrihedron.xdrawtickmarks = xdrawtickmarks;
-    MyGTrihedron.ydrawtickmarks = ydrawtickmarks;
-    MyGTrihedron.zdrawtickmarks = zdrawtickmarks;
-    /* Length of tickmarks */
-    MyGTrihedron.xtickmarklength = xtickmarklength;
-    MyGTrihedron.ytickmarklength = ytickmarklength;
-    MyGTrihedron.ztickmarklength = ztickmarklength;
-    /* Grid color */
-    MyGTrihedron.gridcolor = gridcolor;
-    /* Colors of axis names */
-    MyGTrihedron.xnamecolor = xnamecolor;
-    MyGTrihedron.ynamecolor = ynamecolor;
-    MyGTrihedron.znamecolor = znamecolor;
-    /* Colors of axis and values */
-    MyGTrihedron.xcolor = xcolor;
-    MyGTrihedron.ycolor = ycolor;
-    MyGTrihedron.zcolor = zcolor;
-    /* Name of font for names of axes */
-    MyGTrihedron.fontOfNames = fontOfNames;
-    /* Style of names of axes */
-    MyGTrihedron.styleOfNames = styleOfNames;
-    /* Size of names of axes */
-    MyGTrihedron.sizeOfNames = sizeOfNames;
-    /* Name of font for values */
-    MyGTrihedron.fontOfValues = fontOfValues;
-    /* Style of values */
-    MyGTrihedron.styleOfValues = styleOfValues;
-    /* Size of values */
-    MyGTrihedron.sizeOfValues = sizeOfValues;
-
-    MyGTrihedron.ptrVisual3dView = this;
-    MyGTrihedron.cbCubicAxes = SetMinMaxValuesCallback;
-    MyGraphicDriver->GraduatedTrihedronDisplay(MyCView,MyGTrihedron);
+  const Standard_Integer aStructId  = theStruct->Identification();
+  const Standard_Integer aNbStructs = myStructsToCompute.Length();
+  for (Standard_Integer aStructIter = 1; aStructIter <= aNbStructs; ++aStructIter)
+  {
+    const Handle(Graphic3d_Structure)& aStruct = myStructsToCompute.Value (aStructIter);
+    if (aStruct->Identification() == aStructId)
+    {
+      return aStructIter;
+    }
+  }
+  return 0;
 }
 
-void Visual3d_View::GraduatedTrihedronErase()
+// ========================================================================
+// function : IsDisplayed
+// purpose  :
+// ========================================================================
+Standard_Boolean Visual3d_View::IsDisplayed (const Handle(Graphic3d_Structure)& theStruct) const
 {
-    MyGTrihedron.ptrVisual3dView = NULL;
-    MyGraphicDriver->GraduatedTrihedronErase(MyCView);
+  return !IsDeleted()
+      &&  myStructsDisplayed.Contains (theStruct);
 }
 
-const Handle(Visual3d_Layer)& Visual3d_View::UnderLayer () const {
-
-        return (MyViewManager->UnderLayer ());
-
+// ========================================================================
+// function : ContainsFacet
+// purpose  :
+// ========================================================================
+Standard_Boolean Visual3d_View::ContainsFacet() const
+{
+  return ContainsFacet (myStructsDisplayed);
 }
 
-const Handle(Visual3d_Layer)& Visual3d_View::OverLayer () const {
+// ========================================================================
+// function : ContainsFacet
+// purpose  :
+// ========================================================================
+Standard_Boolean Visual3d_View::ContainsFacet (const Graphic3d_MapOfStructure& theSet) const
+{
+  for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (theSet); aStructIter.More(); aStructIter.Next())
+  {
+    if (aStructIter.Key()->ContainsFacet())
+    {
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+// ========================================================================
+// 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 (myStructsDisplayed,
+                theXMin, theYMin, theZMin,
+                theXMax, theYMax, theZMax,
+                theToIgnoreInfiniteFlag);
+}
+
+// ========================================================================
+// 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
+  {
+    Standard_Real aXm, aYm, aZm, aXM, aYM, aZM;
+    Graphic3d_MapIteratorOfMapOfStructure anIterator (theSet);
 
-        return (MyViewManager->OverLayer ());
+    theXMin = RealLast();
+    theYMin = RealLast();
+    theZMin = RealLast();
 
-}
+    theXMax = RealFirst ();
+    theYMax = RealFirst ();
+    theZMax = RealFirst ();
 
-Standard_Integer Visual3d_View::LightLimit() const {
+    for (anIterator.Initialize (theSet); anIterator.More(); anIterator.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStructure = anIterator.Key();
 
-        Standard_Integer maxlight = MyGraphicDriver->InquireLightLimit ();
-//      printf(" $$$ Visual3d_View::LightLimit() is %d\n",maxlight);
-        return maxlight;
-}
+      if (!aStructure->IsVisible())
+        continue;
 
-Standard_Integer Visual3d_View::PlaneLimit() const {
+      if (aStructure->IsInfinite() && !theToIgnoreInfiniteFlag)
+      {
+        //XMin, YMin .... ZMax are initialized by means of infinite line data
+        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;
+        }
+      }
 
-        Standard_Integer maxplane = MyGraphicDriver->InquirePlaneLimit ();
-//      printf(" $$$ Visual3d_View::PlaneLimit() is %d\n",maxplane);
-        return maxplane;
-}
+      // Only non-empty and non-infinite structures
+      // are taken into account for calculation of MinMax
+      if ((!aStructure->IsInfinite() || theToIgnoreInfiniteFlag) && !aStructure->IsEmpty())
+      {
+        aStructure->MinMaxValues (aXm, aYm, aZm, aXM, aYM, aZM, theToIgnoreInfiniteFlag);
 
-#ifdef IMP140100
-Handle(Visual3d_ViewManager) Visual3d_View::ViewManager() const {
+        /* 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);
+        }
+      }
+    }
 
-        return MyPtrViewManager;
+    // The following cases are relevant
+    // For exemple if all structures are empty or infinite
+    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; }
+  }
 }
-#endif
-
-#ifdef G003
-void Visual3d_View :: SetComputedMode ( const Standard_Boolean aMode ) {
-
- if (  (  (aMode &&  ComputedModeIsActive) ||
-         (!aMode && !ComputedModeIsActive)
-       ) || DegenerateModeIsOn ()
- ) return;
-
- Graphic3d_MapIteratorOfMapOfStructure S1Iterator ( MyDisplayedStructure );
- Visual3d_TypeOfAnswer                 Answer;
- Standard_Integer                      StructId;
- Standard_Integer                      i = MyDisplayedStructure.Extent ();
-
- if (  !( ComputedModeIsActive = aMode )  ) {
-
-  while (  S1Iterator.More ()  ) {
-
-   Answer = AcceptDisplay (  S1Iterator.Key ()  );
-
-   if ( Answer == Visual3d_TOA_COMPUTE ) {
-
-    Standard_Integer Index = IsComputed (  S1Iterator.Key ()  );
-
-    if ( Index != 0 ) {
-
-     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 ()  )
-                                    );
-    }  // end if ( Index != 0 ) . . .
-
-   }  // end if ( Answer . . . )
-
-   S1Iterator.Next ();
-
-  }  // end while
-
- } else {
-
-  while (  S1Iterator.More ()  ) {
-
-   Answer = AcceptDisplay (  S1Iterator.Key ()  );
-
-   if ( Answer == Visual3d_TOA_COMPUTE ) {
-
-    Standard_Integer Index = IsComputed (  S1Iterator.Key ()  );
-
-    if ( Index != 0 ) {
-
-     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 ()  )
-                        );
-
-     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
-                                             );
-      }  // end if
-
-     }  // end if
-
-    } else {
-
-     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 );
+// ========================================================================
+// 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 (myStructsDisplayed,
+                theXMin, theYMin,
+                theXMax, theYMax,
+                theToIgnoreInfiniteFlag);
+}
+
+// ========================================================================
+// 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;
 
-     AStructure -> Transform ( ATrsf );
+  MinMaxValues (theSet, aXm, aYm, aZm, aXM, aYM, aZM, theToIgnoreInfiniteFlag);
 
-     if ( Index != 0 ) {
+  Projects (aXm, aYm, aZm, aXp, aYp, aZp);
+  theXMin = aXp;
+  theYMin = aYp;
 
-      TColStd_Array2OfReal Ident ( 0, 3, 0, 3 );
-      Standard_Integer     ii, jj;
+  Projects (aXM, aYM, aZM, aXp, aYp, aZp);
+  theXMax = aXp;
+  theYMax = aYp;
 
-      for ( ii = 0; ii <= 3; ++ii )
+  if (theXMax < theXMin) { aXp = theXMax; theXMax = theXMin; theXMin = aXp; }
+  if (theYMax < theYMin) { aYp = theYMax; theYMax = theYMin; theYMin = aYp; }
+}
 
-       for ( jj = 0; jj <= 3; ++jj  )
+// =======================================================================
+// function : NumberOfDisplayedStructures
+// purpose  :
+// =======================================================================
+Standard_Integer Visual3d_View::NumberOfDisplayedStructures() const
+{
+  return myStructsDisplayed.Extent();
+}
+
+// =======================================================================
+// 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;
 
-        Ident ( ii, jj ) = ( ii == jj ? 1.0 : 0.0 );
+  gp_XYZ aViewSpaceDimensions = aCamera->ViewDimensions();
+  Standard_Real aXSize = aViewSpaceDimensions.X();
+  Standard_Real aYSize = aViewSpaceDimensions.Y();
+  Standard_Real aZSize = aViewSpaceDimensions.Z();
 
-      TheStructure = MyCOMPUTEDSequence.Value ( Index );
+  gp_Pnt aPoint = aCamera->Project (gp_Pnt (theX, theY, theZ));
 
-      TheStructure -> SetTransform ( Ident, Graphic3d_TOC_REPLACE );
+  // 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;
+}
 
-      if (  AStructure->IsTransformed ()  )
+// =======================================================================
+// function : Identification
+// purpose  :
+// =======================================================================
+Standard_Integer Visual3d_View::Identification() const
+{
+  return MyCView.ViewId;
+}
 
-       AStructure -> Compute ( this, ATrsf, TheStructure );
+// =======================================================================
+// function : ZBufferIsActivated
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::ZBufferIsActivated() const
+{
+  if (IsDeleted()
+  || !IsDefined()
+  || !IsActive())
+  {
+    return Standard_False;
+  }
 
-      else
+  if (MyCView.Context.ZBufferActivity == -1)
+  {
+    // not forced by the programmer => depends on the type of visualisation
+    return MyContext.Visualization () == Visual3d_TOV_SHADING;
+  }
+  return MyCView.Context.ZBufferActivity != 0; //  0 or 1 => forced by the programmer
+}
 
-       AStructure -> Compute ( this, TheStructure );
+// =======================================================================
+// function : SetTransparency
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetTransparency (const Standard_Boolean theActivity)
+{
+  if (IsDeleted()
+  || !IsDefined()
+  || !IsActive())
+  {
+    return;
+  }
 
-     } else {
+  myGraphicDriver->Transparency (MyCView, theActivity);
+}
 
-      if ( AStructure -> IsTransformed ()  )
+// =======================================================================
+// function : SetZBufferActivity
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetZBufferActivity (const Standard_Integer theActivity)
+{
+  if (IsDeleted()
+  ||  MyCView.Context.ZBufferActivity == theActivity
+  || !IsDefined()
+  || !IsActive())
+  {
+    return;
+  }
 
-       TheStructure = AStructure -> Compute ( this, ATrsf );
+  MyCView.Context.ZBufferActivity = theActivity;
+  myGraphicDriver->SetVisualisation (MyCView);
+}
 
-      else
+// =======================================================================
+// function : UpdateView
+// purpose  :
+// =======================================================================
+void Visual3d_View::UpdateView()
+{
+  MyCView.Context.Aliasing        = MyContext.AliasingIsOn();
+  MyCView.Context.BackZClipping   = MyContext.BackZClippingIsOn();
+  MyCView.Context.FrontZClipping  = MyContext.FrontZClippingIsOn();
+  MyCView.Context.DepthCueing     = MyContext.DepthCueingIsOn();
 
-       TheStructure = AStructure -> Compute ( this );
+  MyCView.Context.ZClipFrontPlane = float (MyContext.ZClippingFrontPlane());
+  MyCView.Context.ZClipBackPlane  = float (MyContext.ZClippingBackPlane());
+  MyCView.Context.DepthFrontPlane = float (MyContext.DepthCueingFrontPlane());
+  MyCView.Context.DepthBackPlane  = float (MyContext.DepthCueingBackPlane());
 
-     }  // end else
-#endif  // OLD
-     TheStructure -> SetHLRValidation ( Standard_True );
+  MyCView.Context.Model           = MyContext.Model();
+  MyCView.Context.Visualization   = MyContext.Visualization();
 
-     Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
+  MyCView.Context.TextureEnv      = MyContext.TextureEnv();
+  MyCView.Context.SurfaceDetail   = MyContext.SurfaceDetail();
+}
 
-     Standard_Boolean ComputeWireframe =
-      (  ( ViewType == Visual3d_TOV_WIREFRAME ) &&
-             (  S1Iterator.Key () -> ComputeVisual () != Graphic3d_TOS_SHADING  )
-      );
+// =======================================================================
+// function : Compute
+// purpose  :
+// =======================================================================
+void Visual3d_View::Compute()
+{
+  // force HLRValidation to False on all structures calculated in the view
+  const Standard_Integer aNbCompStructs = myStructsComputed.Length();
+  for (Standard_Integer aStructIter = 1; aStructIter <= aNbCompStructs; ++aStructIter)
+  {
+    myStructsComputed.Value (aStructIter)->SetHLRValidation (Standard_False);
+  }
 
-     Standard_Boolean ComputeShading =
-      (  ( ViewType == Visual3d_TOV_SHADING ) &&
-             (  S1Iterator.Key () -> ComputeVisual () != Graphic3d_TOS_WIREFRAME  )
-      );
+  if (!ComputedMode())
+  {
+    return;
+  }
 
-     if ( ComputeWireframe ) TheStructure -> SetVisual ( Graphic3d_TOS_WIREFRAME );
-     if ( ComputeShading   ) TheStructure -> SetVisual ( Graphic3d_TOS_SHADING   );
+  // Change of orientation or of projection type =>
+  // Remove structures that were calculated for the previous orientation.
+  // Recalculation of new structures.
+  NCollection_Sequence<Handle(Graphic3d_Structure)> aStructsSeq;
+  for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+  {
+    const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStructIter.Key());
+    if (anAnswer == Visual3d_TOA_COMPUTE)
+    {
+      aStructsSeq.Append (aStructIter.Key()); // if the structure was calculated, it is recalculated
+    }
+  }
 
-     if (  S1Iterator.Key () -> IsHighlighted ()  ) {
+  for (NCollection_Sequence<Handle(Graphic3d_Structure)>::Iterator aStructIter (aStructsSeq); aStructIter.More(); aStructIter.Next())
+  {
+    Display (aStructIter.ChangeValue(), Aspect_TOU_WAIT);
+  }
+}
 
-      TheStructure -> SetHighlightColor (
-                       S1Iterator.Key () -> HighlightColor ()
-                      );
-      TheStructure -> GraphicHighlight ( Aspect_TOHM_COLOR );
+// =======================================================================
+// function : ReCompute
+// purpose  :
+// =======================================================================
+void Visual3d_View::ReCompute (const Handle(Graphic3d_Structure)& theStruct)
+{
+  theStruct->CalculateBoundBox();
+  if (!theStruct->IsMutable()
+   && !theStruct->CStructure()->IsForHighlight
+   && !theStruct->CStructure()->IsInfinite)
+  {
+    const Standard_Integer aLayerId = theStruct->DisplayPriority();
+    myGraphicDriver->InvalidateBVHData(MyCView, aLayerId);
+  }
 
-     }  // end if
+  if (!ComputedMode()
+   ||  IsDeleted()
+   || !IsDefined()
+   || !IsActive()
+   || !MyWindow->IsMapped()
+   || !theStruct->IsDisplayed())
+  {
+    return;
+  }
 
-     Standard_Integer Result = 0;
-     Standard_Integer Length = MyTOCOMPUTESequence.Length ();
-     StructId = S1Iterator.Key () -> Identification ();
+  const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (theStruct);
+  if (anAnswer != Visual3d_TOA_COMPUTE)
+  {
+    return;
+  }
 
-     for ( i = 1; i <= Length && Result == 0; ++i )
+  const Standard_Integer anIndex = IsComputed (theStruct);
+  if (anIndex == 0)
+  {
+    return;
+  }
 
-      if (  MyTOCOMPUTESequence.Value ( i ) -> Identification () == StructId  )
+  // compute + validation
+  TColStd_Array2OfReal anIdent (0, 3, 0, 3);
+  for (Standard_Integer aRow = 0; aRow <= 3; ++aRow)
+  {
+    for (Standard_Integer aCol = 0; aCol <= 3; ++aCol)
+    {
+      anIdent (aRow, aCol) = (aRow == aCol ? 1.0 : 0.0);
+    }
+  }
+  TColStd_Array2OfReal aTrsf (0, 3, 0, 3);
+  theStruct->Transform (aTrsf);
+
+  Handle(Graphic3d_Structure) aCompStructOld = myStructsComputed.ChangeValue (anIndex);
+  Handle(Graphic3d_Structure) aCompStruct    = aCompStructOld;
+  aCompStruct->SetTransform (anIdent, Graphic3d_TOC_REPLACE);
+  theStruct->IsTransformed() ? theStruct->Compute (this, aTrsf, aCompStruct)
+                             : theStruct->Compute (this,        aCompStruct);
+  aCompStruct->SetHLRValidation (Standard_True);
+
+  // of which type will be the computed?
+  const Visual3d_TypeOfVisualization aViewType = MyContext.Visualization();
+  const Standard_Boolean toComputeWireframe = aViewType == Visual3d_TOV_WIREFRAME
+                                           && theStruct->ComputeVisual() != Graphic3d_TOS_SHADING;
+  const Standard_Boolean toComputeShading   = aViewType == Visual3d_TOV_SHADING
+                                           && theStruct->ComputeVisual() != Graphic3d_TOS_WIREFRAME;
+  if (toComputeWireframe)
+  {
+    aCompStruct->SetVisual (Graphic3d_TOS_WIREFRAME);
+  }
+  else if (toComputeShading)
+  {
+    aCompStruct->SetVisual (Graphic3d_TOS_SHADING);
+  }
 
-       Result = i;
+  if (theStruct->IsHighlighted())
+  {
+    aCompStruct->SetHighlightColor (theStruct->HighlightColor());
+    aCompStruct->GraphicHighlight (Aspect_TOHM_COLOR);
+  }
 
-     if ( Result )
+  // The previous calculation is removed and the new one is dislayed
+  myGraphicDriver->EraseStructure   (MyCView, *aCompStructOld->CStructure());
+  myGraphicDriver->DisplayStructure (MyCView, *aCompStruct->CStructure(), theStruct->DisplayPriority());
 
-      MyCOMPUTEDSequence.ChangeValue ( Result ) = TheStructure;
+  // why not just replace existing items?
+  //myStructsToCompute.ChangeValue (anIndex) = theStruct;
+  //myStructsComputed .ChangeValue (anIndex) = aCompStruct;
 
-     else {
+  // hlhsr and the new associated compute are added
+  myStructsToCompute.Append (theStruct);
+  myStructsComputed .Append (aCompStruct);
 
-      MyTOCOMPUTESequence.Append (  S1Iterator.Key ()  );
-      MyCOMPUTEDSequence.Append  ( TheStructure );
+  // hlhsr and the new associated compute are removed
+  myStructsToCompute.Remove (anIndex);
+  myStructsComputed .Remove (anIndex);
+}
 
-     }  // end else
+// =======================================================================
+// function : GraphicDriver
+// purpose  :
+// =======================================================================
+const Handle(Graphic3d_GraphicDriver)& Visual3d_View::GraphicDriver() const
+{
+  return myGraphicDriver;
+}
 
-     MyGraphicDriver -> EraseStructure (
-                         MyCView,
-                         *( Graphic3d_CStructure* )
-                          S1Iterator.Key () -> CStructure ()
-                        );
-     MyGraphicDriver -> DisplayStructure (
-                         MyCView,
-                         *( Graphic3d_CStructure* )TheStructure -> CStructure (),
-                         int (  S1Iterator.Key () -> DisplayPriority ()  )
-                        );
-    }  // end else
+// =======================================================================
+// function : HaveTheSameOwner
+// purpose  :
+// =======================================================================
+Standard_Integer Visual3d_View::HaveTheSameOwner (const Handle(Graphic3d_Structure)& theStruct) const
+{
+  // Find in the sequence of already calculated structures
+  // 1/ Structure with the same Owner as <AStructure>
+  // 2/ Which is not <AStructure>
+  // 3/ COMPUTED which of is valid
+  const Standard_Integer aNbToCompStructs = myStructsToCompute.Length();
+  for (Standard_Integer aStructIter = 1; aStructIter <= aNbToCompStructs; ++aStructIter)
+  {
+    const Handle(Graphic3d_Structure)& aStructToComp = myStructsToCompute.Value (aStructIter);
+    if (aStructToComp->Owner()          == theStruct->Owner()
+     && aStructToComp->Identification() != theStruct->Identification())
+    {
+      const Handle(Graphic3d_Structure)& aStructComp = myStructsComputed.Value (aStructIter);
+      if (aStructComp->HLRValidation())
+      {
+        return aStructIter;
+      }
+    }
+  }
+  return 0;
+}
 
-   }  // end if
+// =======================================================================
+// function : CView
+// purpose  :
+// =======================================================================
+Standard_Address Visual3d_View::CView() const
+{
+  return Standard_Address (&MyCView);
+}
+
+// =======================================================================
+// function : ZBufferTriedronSetup
+// purpose  :
+// =======================================================================
+void Visual3d_View::ZBufferTriedronSetup (const Quantity_NameOfColor theXColor,
+                                          const Quantity_NameOfColor theYColor,
+                                          const Quantity_NameOfColor theZColor,
+                                          const Standard_Real        theSizeRatio,
+                                          const Standard_Real        theAxisDiametr,
+                                          const Standard_Integer     theNbFacettes)
+{
+  myGraphicDriver->ZBufferTriedronSetup (theXColor, theYColor, theZColor,
+                                         theSizeRatio, theAxisDiametr, theNbFacettes);
+}
+
+// =======================================================================
+// function : TriedronDisplay
+// purpose  :
+// =======================================================================
+void Visual3d_View::TriedronDisplay (const Aspect_TypeOfTriedronPosition thePosition,
+                                     const Quantity_NameOfColor          theColor,
+                                     const Standard_Real                 theScale,
+                                     const Standard_Boolean              theAsWireframe)
+{
+  myGraphicDriver->TriedronDisplay (MyCView, thePosition, theColor, theScale, theAsWireframe);
+}
 
-   S1Iterator.Next ();
+// =======================================================================
+// function : TriedronErase
+// purpose  :
+// =======================================================================
+void Visual3d_View::TriedronErase()
+{
+  myGraphicDriver->TriedronErase (MyCView);
+}
 
-  }  // end while
+// =======================================================================
+// function : TriedronEcho
+// purpose  :
+// =======================================================================
+void Visual3d_View::TriedronEcho (const Aspect_TypeOfTriedronEcho theType)
+{
+  myGraphicDriver->TriedronEcho (MyCView, theType);
+}
 
-  if (  MyViewManager -> UpdateMode () == Aspect_TOU_ASAP  ) Update ();
+static Standard_Boolean checkFloat (const Standard_Real theValue)
+{
+  return theValue > -FLT_MAX
+      && theValue <  FLT_MAX;
+}
 
- }  // end else
+static void SetMinMaxValuesCallback (Visual3d_View* theView)
+{
+  Graphic3d_Vec3d aMin, aMax;
+  theView->MinMaxValues (aMin.x(), aMin.y(), aMin.z(),
+                         aMax.x(), aMax.y(), aMax.z());
+  if (checkFloat (aMin.x()) && checkFloat (aMin.y()) && checkFloat (aMin.z())
+   && checkFloat (aMax.x()) && checkFloat (aMax.y()) && checkFloat (aMax.z()))
+  {
+    const Handle(Graphic3d_GraphicDriver)& aDriver = theView->GraphicDriver();
+    aDriver->GraduatedTrihedronMinMaxValues ((Standard_ShortReal )aMin.x(), (Standard_ShortReal )aMin.y(), (Standard_ShortReal )aMin.z(),
+                                             (Standard_ShortReal )aMax.x(), (Standard_ShortReal )aMax.y(), (Standard_ShortReal )aMax.z());
+  }
+}
 
-}  // end Visual3d_View :: SetComputedMode
+// =======================================================================
+// function : GetGraduatedTrihedron
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::GetGraduatedTrihedron (TCollection_ExtendedString& theXName,
+                                                       TCollection_ExtendedString& theYName,
+                                                       TCollection_ExtendedString& theZName,
+                                                       Standard_Boolean&           theToDrawXName,
+                                                       Standard_Boolean&           theToDrawYName,
+                                                       Standard_Boolean&           theToDrawZName,
+                                                       Standard_Boolean&           theToDrawXValues,
+                                                       Standard_Boolean&           theToDrawYValues,
+                                                       Standard_Boolean&           theToDrawZValues,
+                                                       Standard_Boolean&           theToDrawGrid,
+                                                       Standard_Boolean&           theToDrawAxes,
+                                                       Standard_Integer&           theNbX,
+                                                       Standard_Integer&           theNbY,
+                                                       Standard_Integer&           theNbZ,
+                                                       Standard_Integer&           theXOffset,
+                                                       Standard_Integer&           theYOffset,
+                                                       Standard_Integer&           theZOffset,
+                                                       Standard_Integer&           theXAxisOffset,
+                                                       Standard_Integer&           theYAxisOffset,
+                                                       Standard_Integer&           theZAxisOffset,
+                                                       Standard_Boolean&           theToDrawXTickMarks,
+                                                       Standard_Boolean&           theToDrawYTickMarks,
+                                                       Standard_Boolean&           theToDrawZTickMarks,
+                                                       Standard_Integer&           theXTickMarkLength,
+                                                       Standard_Integer&           theYTickMarkLength,
+                                                       Standard_Integer&           theZTickMarkLength,
+                                                       Quantity_Color&             theGridColor,
+                                                       Quantity_Color&             theXNameColor,
+                                                       Quantity_Color&             theYNameColor,
+                                                       Quantity_Color&             theZNameColor,
+                                                       Quantity_Color&             theXColor,
+                                                       Quantity_Color&             theYColor,
+                                                       Quantity_Color&             theZColor,
+                                                       TCollection_AsciiString&    theFontOfNames,
+                                                       Font_FontAspect&            theStyleOfNames,
+                                                       Standard_Integer&           theSizeOfNames,
+                                                       TCollection_AsciiString&    theFontOfValues,
+                                                       Font_FontAspect&            theStyleOfValues,
+                                                       Standard_Integer&           theSizeOfValues) const
+{
+  if (!MyGTrihedron.ptrVisual3dView)
+  {
+    return Standard_False;
+  }
 
-Standard_Boolean Visual3d_View :: ComputedMode () const {
+  theXName = MyGTrihedron.xname;
+  theYName = MyGTrihedron.yname;
+  theZName = MyGTrihedron.zname;
+  theToDrawXName   = MyGTrihedron.xdrawname;
+  theToDrawYName   = MyGTrihedron.ydrawname;
+  theToDrawZName   = MyGTrihedron.zdrawname;
+  theToDrawXValues = MyGTrihedron.xdrawvalues;
+  theToDrawYValues = MyGTrihedron.ydrawvalues;
+  theToDrawZValues = MyGTrihedron.zdrawvalues;
+  theToDrawGrid    = MyGTrihedron.drawgrid;
+  theToDrawAxes    = MyGTrihedron.drawaxes;
+  theNbX = MyGTrihedron.nbx;
+  theNbY = MyGTrihedron.nby;
+  theNbZ = MyGTrihedron.nbz;
+  theXOffset     = MyGTrihedron.xoffset;
+  theYOffset     = MyGTrihedron.yoffset;
+  theZOffset     = MyGTrihedron.zoffset;
+  theXAxisOffset = MyGTrihedron.xaxisoffset;
+  theYAxisOffset = MyGTrihedron.yaxisoffset;
+  theZAxisOffset = MyGTrihedron.zaxisoffset;
+  theToDrawXTickMarks = MyGTrihedron.xdrawtickmarks;
+  theToDrawYTickMarks = MyGTrihedron.ydrawtickmarks;
+  theToDrawZTickMarks = MyGTrihedron.zdrawtickmarks;
+  theXTickMarkLength  = MyGTrihedron.xtickmarklength;
+  theYTickMarkLength  = MyGTrihedron.ytickmarklength;
+  theZTickMarkLength  = MyGTrihedron.ztickmarklength;
+  theGridColor  = MyGTrihedron.gridcolor;
+  theXNameColor = MyGTrihedron.xnamecolor;
+  theYNameColor = MyGTrihedron.ynamecolor;
+  theZNameColor = MyGTrihedron.znamecolor;
+  theXColor     = MyGTrihedron.xcolor;
+  theYColor     = MyGTrihedron.ycolor;
+  theZColor     = MyGTrihedron.zcolor;
+  theFontOfNames   = MyGTrihedron.fontOfNames;
+  theStyleOfNames  = MyGTrihedron.styleOfNames;
+  theSizeOfNames   = MyGTrihedron.sizeOfNames;
+  theFontOfValues  = MyGTrihedron.fontOfValues;
+  theStyleOfValues = MyGTrihedron.styleOfValues;
+  theSizeOfValues  = MyGTrihedron.sizeOfValues;
+  return Standard_True;
+}
 
- return ComputedModeIsActive;
+// =======================================================================
+// function : GraduatedTrihedronDisplay
+// purpose  :
+// =======================================================================
+void Visual3d_View::GraduatedTrihedronDisplay (const TCollection_ExtendedString& theXName,
+                                               const TCollection_ExtendedString& theYName,
+                                               const TCollection_ExtendedString& theZName,
+                                               const Standard_Boolean theToDrawXName,
+                                               const Standard_Boolean theToDrawYName,
+                                               const Standard_Boolean theToDrawZName,
+                                               const Standard_Boolean theToDrawXValues,
+                                               const Standard_Boolean theToDrawYValues,
+                                               const Standard_Boolean theToDrawZValues,
+                                               const Standard_Boolean theToDrawGrid,
+                                               const Standard_Boolean theToDrawAxes,
+                                               const Standard_Integer theNbX,
+                                               const Standard_Integer theNbY,
+                                               const Standard_Integer theNbZ,
+                                               const Standard_Integer theXOffset,
+                                               const Standard_Integer theYOffset,
+                                               const Standard_Integer theZOffset,
+                                               const Standard_Integer theXAxisOffset,
+                                               const Standard_Integer theYAxisOffset,
+                                               const Standard_Integer theZAxisOffset,
+                                               const Standard_Boolean theToDrawXTickMarks,
+                                               const Standard_Boolean theToDrawYTickMarks,
+                                               const Standard_Boolean theToDrawZTickMarks,
+                                               const Standard_Integer theXTickMarkLength,
+                                               const Standard_Integer theYTickMarkLength,
+                                               const Standard_Integer theZTickMarkLength,
+                                               const Quantity_Color&  theGridColor,
+                                               const Quantity_Color&  theXNameColor,
+                                               const Quantity_Color&  theYNameColor,
+                                               const Quantity_Color&  theZNameColor,
+                                               const Quantity_Color&  theXColor,
+                                               const Quantity_Color&  theYColor,
+                                               const Quantity_Color&  theZColor,
+                                               const TCollection_AsciiString& theFontOfNames,
+                                               const Font_FontAspect  theStyleOfNames,
+                                               const Standard_Integer theSizeOfNames,
+                                               const TCollection_AsciiString& theFontOfValues,
+                                               const Font_FontAspect  theStyleOfValues,
+                                               const Standard_Integer theSizeOfValues)
+{
+  MyGTrihedron.xname = theXName;
+  MyGTrihedron.yname = theYName;
+  MyGTrihedron.zname = theZName;
+  MyGTrihedron.xdrawname = theToDrawXName;
+  MyGTrihedron.ydrawname = theToDrawYName;
+  MyGTrihedron.zdrawname = theToDrawZName;
+  MyGTrihedron.xdrawvalues = theToDrawXValues;
+  MyGTrihedron.ydrawvalues = theToDrawYValues;
+  MyGTrihedron.zdrawvalues = theToDrawZValues;
+  MyGTrihedron.drawgrid = theToDrawGrid;
+  MyGTrihedron.drawaxes = theToDrawAxes;
+  MyGTrihedron.nbx = theNbX;
+  MyGTrihedron.nby = theNbY;
+  MyGTrihedron.nbz = theNbZ;
+  MyGTrihedron.xoffset = theXOffset;
+  MyGTrihedron.yoffset = theYOffset;
+  MyGTrihedron.zoffset = theZOffset;
+  MyGTrihedron.xaxisoffset = theXAxisOffset;
+  MyGTrihedron.yaxisoffset = theYAxisOffset;
+  MyGTrihedron.zaxisoffset = theZAxisOffset;
+  MyGTrihedron.xdrawtickmarks = theToDrawXTickMarks;
+  MyGTrihedron.ydrawtickmarks = theToDrawYTickMarks;
+  MyGTrihedron.zdrawtickmarks = theToDrawZTickMarks;
+  MyGTrihedron.xtickmarklength = theXTickMarkLength;
+  MyGTrihedron.ytickmarklength = theYTickMarkLength;
+  MyGTrihedron.ztickmarklength = theZTickMarkLength;
+  MyGTrihedron.gridcolor  = theGridColor;
+  MyGTrihedron.xnamecolor = theXNameColor;
+  MyGTrihedron.ynamecolor = theYNameColor;
+  MyGTrihedron.znamecolor = theZNameColor;
+  MyGTrihedron.xcolor = theXColor;
+  MyGTrihedron.ycolor = theYColor;
+  MyGTrihedron.zcolor = theZColor;
+  MyGTrihedron.fontOfNames   = theFontOfNames;
+  MyGTrihedron.styleOfNames  = theStyleOfNames;
+  MyGTrihedron.sizeOfNames   = theSizeOfNames;
+  MyGTrihedron.fontOfValues  = theFontOfValues;
+  MyGTrihedron.styleOfValues = theStyleOfValues;
+  MyGTrihedron.sizeOfValues  = theSizeOfValues;
+
+  MyGTrihedron.ptrVisual3dView = this;
+  MyGTrihedron.cbCubicAxes     = SetMinMaxValuesCallback;
+  myGraphicDriver->GraduatedTrihedronDisplay (MyCView, MyGTrihedron);
+}
+
+// =======================================================================
+// function : GraduatedTrihedronErase
+// purpose  :
+// =======================================================================
+void Visual3d_View::GraduatedTrihedronErase()
+{
+  MyGTrihedron.ptrVisual3dView = NULL;
+  myGraphicDriver->GraduatedTrihedronErase (MyCView);
+}
 
-}  // end Visual3d_View :: ComputedMode
+// =======================================================================
+// function : UnderLayer
+// purpose  :
+// =======================================================================
+const Handle(Visual3d_Layer)& Visual3d_View::UnderLayer() const
+{
+  return myViewManager->UnderLayer();
+}
 
-void Visual3d_View :: SetBackFacingModel (
-                       const Visual3d_TypeOfBackfacingModel aModel
-                      ) {
- switch ( aModel ) {
+// =======================================================================
+// function : OverLayer
+// purpose  :
+// =======================================================================
+const Handle(Visual3d_Layer)& Visual3d_View::OverLayer() const
+{
+  return myViewManager->OverLayer();
+}
 
-  default:
-  case Visual3d_TOBM_AUTOMATIC:
-   MyCView.Backfacing = 0;
-   break;
+// =======================================================================
+// function : LightLimit
+// purpose  :
+// =======================================================================
+Standard_Integer Visual3d_View::LightLimit() const
+{
+  return myGraphicDriver->InquireLightLimit();
+}
 
-  case Visual3d_TOBM_FORCE:
-   MyCView.Backfacing = 1;
-   break;
+// =======================================================================
+// function : PlaneLimit
+// purpose  :
+// =======================================================================
+Standard_Integer Visual3d_View::PlaneLimit() const
+{
+  return myGraphicDriver->InquirePlaneLimit();
+}
 
-  case Visual3d_TOBM_DISABLE:
-   MyCView.Backfacing = -1;
-   break;
+// =======================================================================
+// function : ViewManager
+// purpose  :
+// =======================================================================
+Handle(Visual3d_ViewManager) Visual3d_View::ViewManager() const
+{
+  return myViewManager;
+}
 
- }  // end switch
+// =======================================================================
+// function : SetComputedMode
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetComputedMode (const Standard_Boolean theMode)
+{
+  if (( theMode &&  myIsInComputedMode)
+   || (!theMode && !myIsInComputedMode))
+  {
+    return;
+  }
 
- MyGraphicDriver -> SetBackFacingModel ( MyCView );
+  myIsInComputedMode = theMode;
+  if (!myIsInComputedMode)
+  {
+    for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+    {
+      const Handle(Graphic3d_Structure)& aStruct  = aStructIter.Key();
+      const Visual3d_TypeOfAnswer        anAnswer = AcceptDisplay (aStruct);
+      if (anAnswer != Visual3d_TOA_COMPUTE)
+      {
+        continue;
+      }
 
-}  // end Visual3d_View :: SetBackFacingModel
+      const Standard_Integer anIndex = IsComputed (aStruct);
+      if (anIndex != 0)
+      {
+        const Handle(Graphic3d_Structure)& aStructComp = myStructsComputed.Value (anIndex);
+        myGraphicDriver->EraseStructure   (MyCView, *aStructComp->CStructure());
+        myGraphicDriver->DisplayStructure (MyCView, *aStruct->CStructure(), aStruct->DisplayPriority());
+      }
+    }
+    return;
+  }
 
-Visual3d_TypeOfBackfacingModel Visual3d_View :: BackFacingModel () const {
+  for (Graphic3d_MapIteratorOfMapOfStructure aDispStructIter (myStructsDisplayed); aDispStructIter.More(); aDispStructIter.Next())
+  {
+    Handle(Graphic3d_Structure) aStruct = aDispStructIter.Key();
+    const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct);
+    if (anAnswer != Visual3d_TOA_COMPUTE)
+    {
+      continue;
+    }
 
- switch ( MyCView.Backfacing ) {
+    const Standard_Integer anIndex = IsComputed (aStruct);
+    if (anIndex != 0)
+    {
+      myGraphicDriver->EraseStructure   (MyCView, *aStruct->CStructure());
+      myGraphicDriver->DisplayStructure (MyCView, *(myStructsComputed.Value (anIndex)->CStructure()), aStruct->DisplayPriority());
+
+      Display (aStruct, Aspect_TOU_WAIT);
+      if (aStruct->IsHighlighted())
+      {
+        const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.Value (anIndex);
+        if (!aCompStruct->IsHighlighted())
+        {
+          aCompStruct->SetHighlightColor (aStruct->HighlightColor());
+          aCompStruct->GraphicHighlight (Aspect_TOHM_COLOR);
+        }
+      }
+    }
+    else
+    {
+      TColStd_Array2OfReal aTrsf (0, 3, 0, 3);
+      aStruct->Transform (aTrsf);
+      Handle(Graphic3d_Structure) aCompStruct = aStruct->IsTransformed() ? aStruct->Compute (this, aTrsf) : aStruct->Compute (this);
+      aCompStruct->SetHLRValidation (Standard_True);
+
+      const Visual3d_TypeOfVisualization aViewType = MyContext.Visualization();
+      const Standard_Boolean toComputeWireframe = aViewType == Visual3d_TOV_WIREFRAME
+                                                && aStruct->ComputeVisual() != Graphic3d_TOS_SHADING;
+      const Standard_Boolean toComputeShading   = aViewType == Visual3d_TOV_SHADING
+                                                && aStruct->ComputeVisual() != Graphic3d_TOS_WIREFRAME;
+      if (toComputeWireframe) aCompStruct->SetVisual (Graphic3d_TOS_WIREFRAME);
+      if (toComputeShading  ) aCompStruct->SetVisual (Graphic3d_TOS_SHADING);
+
+      if (aStruct->IsHighlighted())
+      {
+        aCompStruct->SetHighlightColor (aStruct->HighlightColor());
+        aCompStruct->GraphicHighlight (Aspect_TOHM_COLOR);
+      }
 
-  case 0:
-   return Visual3d_TOBM_AUTOMATIC;
+      Standard_Boolean hasResult = Standard_False;
+      const Standard_Integer aNbToCompute = myStructsToCompute.Length();
+      const Standard_Integer aStructId    = aStruct->Identification();
+      for (Standard_Integer aToCompStructIter = 1; aToCompStructIter <= aNbToCompute; ++aToCompStructIter)
+      {
+        if (myStructsToCompute.Value (aToCompStructIter)->Identification() == aStructId)
+        {
+          hasResult = Standard_True;
+          myStructsComputed.ChangeValue (aToCompStructIter) = aCompStruct;
+          break;
+        }
+      }
 
-  case 1:
-   return Visual3d_TOBM_FORCE;
+      if (!hasResult)
+      {
+        myStructsToCompute.Append (aStruct);
+        myStructsComputed .Append (aCompStruct);
+      }
 
- }  // end switch
+      myGraphicDriver->EraseStructure   (MyCView, *aStruct->CStructure());
+      myGraphicDriver->DisplayStructure (MyCView, *aCompStruct->CStructure(), aStruct->DisplayPriority());
+    }
+  }
+  Update (myViewManager->UpdateMode());
+}
 
- return Visual3d_TOBM_DISABLE;
+// =======================================================================
+// function : ComputedMode
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::ComputedMode() const
+{
+  return myIsInComputedMode;
+}
 
-}  // end Visual3d_View :: BackFacingModel
-#endif  // G003
+// =======================================================================
+// function : SetBackFacingModel
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetBackFacingModel (const Visual3d_TypeOfBackfacingModel theModel)
+{
+  switch (theModel)
+  {
+    default:
+    case Visual3d_TOBM_AUTOMATIC:
+      MyCView.Backfacing = 0;
+      break;
+    case Visual3d_TOBM_FORCE:
+      MyCView.Backfacing = 1;
+      break;
+    case Visual3d_TOBM_DISABLE:
+      MyCView.Backfacing = -1;
+      break;
+  }
+  myGraphicDriver->SetBackFacingModel (MyCView);
+}
 
-void Visual3d_View::EnableDepthTest( const Standard_Boolean enable ) const
+// =======================================================================
+// function : BackFacingModel
+// purpose  :
+// =======================================================================
+Visual3d_TypeOfBackfacingModel Visual3d_View::BackFacingModel() const
 {
-#ifdef BUC61044
-  MyGraphicDriver->SetDepthTestEnabled( MyCView, enable );
-#endif
+  switch (MyCView.Backfacing)
+  {
+    case 0: return Visual3d_TOBM_AUTOMATIC;
+    case 1: return Visual3d_TOBM_FORCE;
+  }
+  return Visual3d_TOBM_DISABLE;
 }
 
-Standard_Boolean Visual3d_View::IsDepthTestEnabled() const
+// =======================================================================
+// function : EnableDepthTest
+// purpose  :
+// =======================================================================
+void Visual3d_View::EnableDepthTest (const Standard_Boolean theToEnable) const
 {
-#ifdef BUC61044
-  return MyGraphicDriver->IsDepthTestEnabled( MyCView );
-#else
-  return Standard_True;
-#endif
+  myGraphicDriver->SetDepthTestEnabled (MyCView, theToEnable);
 }
 
-void Visual3d_View::ReadDepths(const Standard_Integer x,
-                               const Standard_Integer y,
-                               const Standard_Integer width,
-                               const Standard_Integer height,
-                               const Standard_Address buffer) const
+// =======================================================================
+// function : IsDepthTestEnabled
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::IsDepthTestEnabled() const
+{
+  return myGraphicDriver->IsDepthTestEnabled (MyCView);
+}
+
+// =======================================================================
+// function : ReadDepths
+// purpose  :
+// =======================================================================
+void Visual3d_View::ReadDepths (const Standard_Integer theX,
+                                const Standard_Integer theY,
+                                const Standard_Integer theWidth,
+                                const Standard_Integer theHeight,
+                                const Standard_Address theBuffer) const
 {
-  MyGraphicDriver->ReadDepths( MyCView, x, y, width, height, buffer );
+  myGraphicDriver->ReadDepths (MyCView, theX, theY, theWidth, theHeight, theBuffer);
 }
 
+// =======================================================================
+// function : FBOCreate
+// purpose  :
+// =======================================================================
 Graphic3d_PtrFrameBuffer Visual3d_View::FBOCreate(const Standard_Integer theWidth,
                                                   const Standard_Integer theHeight)
 {
-  return MyGraphicDriver->FBOCreate( MyCView, theWidth, theHeight );
+  return myGraphicDriver->FBOCreate( MyCView, theWidth, theHeight );
 }
 
+// =======================================================================
+// function : FBORelease
+// purpose  :
+// =======================================================================
 void Visual3d_View::FBORelease(Graphic3d_PtrFrameBuffer& theFBOPtr)
 {
-  MyGraphicDriver->FBORelease( MyCView, theFBOPtr );
+  myGraphicDriver->FBORelease( MyCView, theFBOPtr );
 }
 
+// =======================================================================
+// function : FBOGetDimensions
+// purpose  :
+// =======================================================================
 void Visual3d_View::FBOGetDimensions(const Graphic3d_PtrFrameBuffer theFBOPtr,
                                      Standard_Integer& theWidth,    Standard_Integer& theHeight,
                                      Standard_Integer& theWidthMax, Standard_Integer& theHeightMax)
 {
-  MyGraphicDriver->FBOGetDimensions( MyCView, theFBOPtr,
+  myGraphicDriver->FBOGetDimensions( MyCView, theFBOPtr,
                                      theWidth, theHeight,
                                      theWidthMax, theHeightMax );
 }
 
+// =======================================================================
+// function : FBOChangeViewport
+// purpose  :
+// =======================================================================
 void Visual3d_View::FBOChangeViewport(Graphic3d_PtrFrameBuffer& theFBOPtr,
                                       const Standard_Integer theWidth, const Standard_Integer theHeight)
 {
-  MyGraphicDriver->FBOChangeViewport( MyCView, theFBOPtr,
+  myGraphicDriver->FBOChangeViewport( MyCView, theFBOPtr,
                                      theWidth, theHeight );
 }
 
-Standard_Boolean Visual3d_View::BufferDump (Image_CRawBufferData& theBuffer)
+// =======================================================================
+// function : BufferDump
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::BufferDump (Image_PixMap&               theImage,
+                                            const Graphic3d_BufferType& theBufferType)
 {
-  return MyGraphicDriver->BufferDump( MyCView, theBuffer);
+  return myGraphicDriver->BufferDump (MyCView, theImage, theBufferType);
 }
 
+// =======================================================================
+// function : EnableGLLight
+// purpose  :
+// =======================================================================
 void Visual3d_View::EnableGLLight( const Standard_Boolean enable ) const
 {
-#ifdef BUC61045
-  MyGraphicDriver->SetGLLightEnabled( MyCView, enable );
-#endif
+  myGraphicDriver->SetGLLightEnabled( MyCView, enable );
 }
 
-
+// =======================================================================
+// function : IsGLLightEnabled
+// purpose  :
+// =======================================================================
 Standard_Boolean Visual3d_View::IsGLLightEnabled() const
 {
-#ifdef BUC61045
-  return MyGraphicDriver->IsGLLightEnabled( MyCView );
-#else
-  return Standard_True;
-#endif
+  return myGraphicDriver->IsGLLightEnabled( MyCView );
 }
 
+// =======================================================================
+// function : Export
+// purpose  :
+// =======================================================================
 Standard_Boolean Visual3d_View::Export (const Standard_CString       theFileName,
                                         const Graphic3d_ExportFormat theFormat,
                                         const Graphic3d_SortType     theSortType,
@@ -4288,8 +2720,8 @@ Standard_Boolean Visual3d_View::Export (const Standard_CString       theFileName
                                         const Standard_Address       theProgressBarFunc,
                                         const Standard_Address       theProgressObject) const
 {
-  Handle(Visual3d_Layer) anUnderLayer = MyViewManager->UnderLayer();
-  Handle(Visual3d_Layer) anOverLayer  = MyViewManager->OverLayer();
+  Handle(Visual3d_Layer) anUnderLayer = myViewManager->UnderLayer();
+  Handle(Visual3d_Layer) anOverLayer  = myViewManager->OverLayer();
 
   Aspect_CLayer2d anOverCLayer;
   Aspect_CLayer2d anUnderCLayer;
@@ -4303,39 +2735,92 @@ Standard_Boolean Visual3d_View::Export (const Standard_CString       theFileName
   Standard_Integer aWidth, aHeight;
   Window()->Size (aWidth, aHeight);
 
-  return MyGraphicDriver->Export (theFileName, theFormat, theSortType,
+  return myGraphicDriver->Export (theFileName, theFormat, theSortType,
                                   aWidth, aHeight, MyCView, anUnderCLayer, anOverCLayer,
                                   thePrecision, theProgressBarFunc, theProgressObject);
 }
 
-//=======================================================================
-//function : AddZLayer
-//purpose  :
-//=======================================================================
+// =======================================================================
+// function : SetZLayerSettings
+// purpose  :
+// =======================================================================
+void Visual3d_View::SetZLayerSettings (const Standard_Integer theLayerId,
+                                       const Graphic3d_ZLayerSettings& theSettings)
+{
+  myGraphicDriver->SetZLayerSettings (MyCView, theLayerId, theSettings);
+}
 
+// =======================================================================
+// function : AddZLayer
+// purpose  :
+// =======================================================================
 void Visual3d_View::AddZLayer (const Standard_Integer theLayerId)
 {
-  MyGraphicDriver->AddZLayer (MyCView, theLayerId);
+  myGraphicDriver->AddZLayer (MyCView, theLayerId);
 }
 
-//=======================================================================
-//function : RemoveZLayer
-//purpose  : 
-//=======================================================================
-
+// =======================================================================
+// function : RemoveZLayer
+// purpose  :
+// =======================================================================
 void Visual3d_View::RemoveZLayer (const Standard_Integer theLayerId)
 {
-  MyGraphicDriver->RemoveZLayer (MyCView, theLayerId);
+  myGraphicDriver->RemoveZLayer (MyCView, theLayerId);
 }
 
-//=======================================================================
-//function : ChangeZLayer
-//purpose  : 
-//=======================================================================
-
+// =======================================================================
+// function : ChangeZLayer
+// purpose  :
+// =======================================================================
 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);
+}
+
+// =======================================================================
+// function : Print
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::Print (const Aspect_Handle    thePrintDC, 
+                                       const Standard_Boolean theToShowBackground,
+                                       const Standard_CString theFilename,
+                                       const Aspect_PrintAlgo thePrintAlgorithm,
+                                       const Standard_Real    theScaleFactor) const
+{
+  return Print (myViewManager->UnderLayer(),
+                myViewManager->OverLayer(),
+                thePrintDC, theToShowBackground,
+                theFilename, thePrintAlgorithm, 
+                theScaleFactor);
+}
+
+// =======================================================================
+// function : Print
+// purpose  :
+// =======================================================================
+Standard_Boolean Visual3d_View::Print (const Handle(Visual3d_Layer)& theUnderLayer,
+                                       const Handle(Visual3d_Layer)& theOverLayer,
+                                       const Aspect_Handle           thePrintDC,
+                                       const Standard_Boolean        theToShowBackground,
+                                       const Standard_CString        theFilename,
+                                       const Aspect_PrintAlgo        thePrintAlgorithm,
+                                       const Standard_Real           theScaleFactor) const
+{
+  if (IsDeleted()
+  || !IsDefined()
+  || !IsActive()
+  || !MyWindow->IsMapped())
+  {
+    return Standard_False;
+  }
+
+  Aspect_CLayer2d anOverCLayer;
+  Aspect_CLayer2d anUnderCLayer;
+  anOverCLayer.ptrLayer = anUnderCLayer.ptrLayer = NULL;
+  if (!theOverLayer.IsNull())  anOverCLayer  = theOverLayer->CLayer();
+  if (!theUnderLayer.IsNull()) anUnderCLayer = theUnderLayer->CLayer();
+  return myGraphicDriver->Print (MyCView, anUnderCLayer, anOverCLayer,
+                                 thePrintDC, theToShowBackground, theFilename,
+                                 thePrintAlgorithm, theScaleFactor);
 }