0024637: Visualization - clean up implementation of rendering in immediate mode
[occt.git] / src / Visual3d / Visual3d_ViewManager.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 3c90fcb..0c79703
@@ -1,3 +1,16 @@
+// 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.
 
 /***********************************************************************
 
@@ -17,7 +30,7 @@
       24-10-97  : CAL ; Retrait de DownCast.
       20-11-97  : CAL ; Disparition de la dependance avec math
       01-12-97  : CAL ; Retrait du test IsActive sur l'Update et le Redraw
-      31-12-97  : CAL ; Disparition de MathGra 
+      31-12-97  : CAL ; Disparition de MathGra
       16-01-98  : CAL ; Ajout du SetTransform sur une TOS_COMPUTED
       11-03-98  : CAL ; Visual3d_ViewManager::Remove ()
       20-05-98  : CAL ; Perfs. Connection entre structures COMPUTED.
 #include <Visual3d_PickPath.hxx>
 #include <Visual3d_SetIteratorOfSetOfView.hxx>
 
-#ifndef WNT
-# include <Xw_Window.hxx>
-#else
+#if defined (_WIN32) || defined(__WIN32__)
 # include <WNT_Window.hxx>
-#endif  // WNT
+#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
+# include <Cocoa_Window.hxx>
+#else
+# include <Xw_Window.hxx>
+#endif
 
 //-Aliases
 
@@ -75,8 +90,8 @@
 
 //-Constructors
 
-Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Aspect_GraphicDevice)& aDevice):
-Graphic3d_StructureManager (aDevice),
+Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Graphic3d_GraphicDriver)& theDriver):
+Graphic3d_StructureManager (theDriver),
 MyDefinedView (),
 MyViewGenId (View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*(Visual3d_ViewManager::CurrentId ()-1),View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*Visual3d_ViewManager::CurrentId ()-1),
 MyZBufferAuto (Standard_False),
@@ -87,9 +102,7 @@ MyTransparency (Standard_False)
   myLayerIds.Add (0);
   myLayerSeq.Append (0);
 
-  Handle(Aspect_GraphicDriver) agd = aDevice->GraphicDriver ();
-
-  MyGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd;
+  MyGraphicDriver = theDriver;
 }
 
 //-Destructors
@@ -114,19 +127,19 @@ void Visual3d_ViewManager::Remove () {
        //
        // Destroy all defined views
        //
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
 
 #ifdef DESTROY
        cout << "The Manager " << MyId << " have " << Length << " defined views\n";
        cout << flush;
 #endif
-       MyDefinedView.Clear ();
 
+  // clear all structures whilst views are alive for correct GPU memory management
+  MyDisplayedStructure.Clear();
+  MyHighlightedStructure.Clear();
+  MyPickStructure.Clear();
+
+  // clear list of managed views
+  MyDefinedView.Clear();
 }
 
 void Visual3d_ViewManager::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AStructure, const Standard_Integer OldPriority, const Standard_Integer NewPriority) {
@@ -141,13 +154,8 @@ void Visual3d_ViewManager::ChangeDisplayPriority (const Handle(Graphic3d_Structu
        //
        // Change structure priority in all defined views
        //
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->ChangeDisplayPriority
                        (AStructure, OldPriority, NewPriority);
@@ -158,14 +166,14 @@ void Visual3d_ViewManager::ChangeDisplayPriority (const Handle(Graphic3d_Structu
 
 }
 
-void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure) { 
+void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure) {
 
   //Standard_Integer LengthD   = MyDisplayedStructure.Extent() ();
 
   // Even if physically the structure cannot
   // be displayed (pb of visualisation type)
   // it has status Displayed.
+
   if (!MyDisplayedStructure.Contains(AStructure))
     return;
 
@@ -173,19 +181,19 @@ void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStruct
   // Recompute structure in all activated views
   //
   Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
   while (MyIterator.More ()) {
     (MyIterator.Value ())->ReCompute (AStructure);
 
     // MyIterator.Next () is located on the next view
     MyIterator.Next ();
   }
-  
+
 }
 
-void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure, 
-                                     const Handle(Graphic3d_DataStructureManager)& AProjector) 
-{ 
+void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure,
+                                     const Handle(Graphic3d_DataStructureManager)& AProjector)
+{
 
   if (! AProjector->IsKind (STANDARD_TYPE (Visual3d_View))) return;
 
@@ -196,19 +204,17 @@ void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStruct
 #endif
   Standard_Integer ViewId = theView->Identification ();
 
-  Standard_Integer indexD = 0;
-
   // Even if physically the structure cannot
   // be displayed (pb of visualisation type)
   // it has status Displayed.
   if (!MyDisplayedStructure.Contains(AStructure))
     return;
-       
+
   //
   // Recompute structure in all activated views
   //
   Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
   while (MyIterator.More ()) {
     if ((MyIterator.Value ())->Identification () == ViewId)
       theView->ReCompute (AStructure);
@@ -221,13 +227,8 @@ void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStruct
 
 void Visual3d_ViewManager::Clear (const Handle(Graphic3d_Structure)& AStructure, const Standard_Boolean WithDestruction) {
 
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Clear (AStructure, WithDestruction);
 
@@ -239,13 +240,8 @@ void Visual3d_ViewManager::Clear (const Handle(Graphic3d_Structure)& AStructure,
 
 void Visual3d_ViewManager::Connect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
 
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Connect (AMother, ADaughter);
 
@@ -257,13 +253,8 @@ void Visual3d_ViewManager::Connect (const Handle(Graphic3d_Structure)& AMother,
 
 void Visual3d_ViewManager::Disconnect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
 
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Disconnect (AMother, ADaughter);
 
@@ -273,7 +264,7 @@ void Visual3d_ViewManager::Disconnect (const Handle(Graphic3d_Structure)& AMothe
 
 }
 
-void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructure) { 
+void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructure) {
 
 
  // Even if physically the structure cannot
@@ -286,7 +277,7 @@ void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructur
        // Display structure in all activated views
        //
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Display (AStructure);
 
@@ -310,13 +301,8 @@ void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure)
        //
        // Erase structure in all defined views
        //
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Erase (AStructure);
 
@@ -325,7 +311,6 @@ void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure)
        }
 
        MyHighlightedStructure.Remove (AStructure);
-       MyVisibleStructure.Remove (AStructure);
        MyPickStructure.Remove (AStructure);
 
 }
@@ -333,7 +318,7 @@ void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure)
 void Visual3d_ViewManager::Erase () {
 
  Graphic3d_MapIteratorOfMapOfStructure it( MyDisplayedStructure);
+
  for (; it.More(); it.Next()) {
    Handle(Graphic3d_Structure) SG = it.Key();
    SG->Erase();
@@ -348,13 +333,8 @@ void Visual3d_ViewManager::Highlight (const Handle(Graphic3d_Structure)& AStruct
        //
        // Highlight in all activated views
        //
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Highlight (AStructure, AMethod);
 
@@ -366,13 +346,8 @@ void Visual3d_ViewManager::Highlight (const Handle(Graphic3d_Structure)& AStruct
 
 void Visual3d_ViewManager::SetTransform (const Handle(Graphic3d_Structure)& AStructure, const TColStd_Array2OfReal& ATrsf) {
 
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->SetTransform (AStructure, ATrsf);
 
@@ -385,7 +360,7 @@ void Visual3d_ViewManager::SetTransform (const Handle(Graphic3d_Structure)& AStr
 void Visual3d_ViewManager::UnHighlight () {
 
   Graphic3d_MapIteratorOfMapOfStructure it(MyHighlightedStructure);
-  
+
   for (; it.More(); it.Next()) {
     Handle(Graphic3d_Structure) SG = it.Key();
     SG->UnHighlight ();
@@ -402,13 +377,8 @@ void Visual3d_ViewManager::UnHighlight (const Handle(Graphic3d_Structure)& AStru
        //
        // UnHighlight in all activated views
        //
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->UnHighlight (AStructure);
 
@@ -418,72 +388,82 @@ void Visual3d_ViewManager::UnHighlight (const Handle(Graphic3d_Structure)& AStru
 
 }
 
-void Visual3d_ViewManager::Redraw () const {
-
-Standard_Integer MaxDx, MaxDy;
-Standard_Integer Dx, Dy;
-       MaxDx = MaxDy = IntegerFirst ();
-
-       //
-       // Redraw all activated views
-       //
-       Standard_Integer j = MyDefinedView.Extent ();
-       if (j == 0) return;
-       Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-       if (! MyUnderLayer.IsNull () || ! MyOverLayer.IsNull ()) {
-           while (MyIterator.More ()) {
-               (MyIterator.Value ())->Window ()->Size (Dx, Dy);
-               if (Dx > MaxDx) MaxDx = Dx;
-               if (Dy > MaxDy) MaxDy = Dy;
+void Visual3d_ViewManager::Redraw() const
+{
+  // redraw all activated views
+  if (MyDefinedView.Extent() == 0)
+  {
+    return;
+  }
 
-               // MyIterator.Next () is located on the next view
-               MyIterator.Next ();
-           }
-           if (! MyUnderLayer.IsNull ())
-               MyUnderLayer->SetViewport (MaxDx, MaxDy);
-           if (! MyOverLayer.IsNull ())
-               MyOverLayer->SetViewport (MaxDx, MaxDy);
-       }
-       if (! MyUnderLayer.IsNull () || ! MyOverLayer.IsNull ())
-           MyIterator.Initialize (MyDefinedView);
-       while (MyIterator.More ()) {
-           (MyIterator.Value ())->Redraw (MyUnderLayer, MyOverLayer);
+  if (!MyUnderLayer.IsNull() || !MyOverLayer.IsNull())
+  {
+    Standard_Integer aWidth = 0, aHeight = 0;
+    Standard_Integer aWidthMax  = 0;
+    Standard_Integer aHeightMax = 0;
+    for (Visual3d_SetIteratorOfSetOfView anIter (MyDefinedView);
+         anIter.More(); anIter.Next())
+    {
+      anIter.Value()->Window()->Size (aWidth, aHeight);
+      aWidthMax  = Max (aWidthMax,  aWidth);
+      aHeightMax = Max (aHeightMax, aWidth);
+    }
+    if (!MyUnderLayer.IsNull())
+    {
+      MyUnderLayer->SetViewport (aWidthMax, aHeightMax);
+    }
+    if (!MyOverLayer.IsNull())
+    {
+      MyOverLayer->SetViewport (aWidthMax, aHeightMax);
+    }
+  }
 
-           // MyIterator.Next () is located on the next view
-           MyIterator.Next ();
+  for (Visual3d_SetIteratorOfSetOfView anIter (MyDefinedView);
+       anIter.More(); anIter.Next())
+  {
+    anIter.Value()->Redraw (MyUnderLayer, MyOverLayer);
        }
+}
 
+void Visual3d_ViewManager::Update() const
+{
+  Redraw();
 }
 
-void Visual3d_ViewManager::Update () const {
+void Visual3d_ViewManager::RedrawImmediate() const
+{
+  if (MyDefinedView.Extent() == 0)
+  {
+    return;
+  }
 
-       //
-       // Update all activated views
-       //
-       Standard_Integer j = MyDefinedView.Extent ();
-       if (j == 0) return;
-       Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-       while (MyIterator.More ()) {
-               (MyIterator.Value ())->Update (MyUnderLayer, MyOverLayer);
+  // update all activated views
+  for (Visual3d_SetIteratorOfSetOfView anIter (MyDefinedView);
+       anIter.More(); anIter.Next())
+  {
+    anIter.Value()->RedrawImmediate (MyUnderLayer, MyOverLayer);
+  }
+}
 
-               // MyIterator.Next () is located on the next view
-               MyIterator.Next ();
-       }
+void Visual3d_ViewManager::Invalidate() const
+{
+  if (MyDefinedView.Extent() == 0)
+  {
+    return;
+  }
 
+  // update all activated views
+  for (Visual3d_SetIteratorOfSetOfView anIter (MyDefinedView);
+       anIter.More(); anIter.Next())
+  {
+    anIter.Value()->Invalidate();
+  }
 }
 
 Handle(Visual3d_HSetOfView) Visual3d_ViewManager::ActivatedView () const {
 
 Handle (Visual3d_HSetOfView) SG = new Visual3d_HSetOfView ();
 
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
 Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
 
        while (MyIterator.More ()) {
@@ -540,595 +520,6 @@ Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
 
 }
 
-void Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Graphic3d_Vertex& AVertex, Standard_Integer& AU, Standard_Integer& AV) const {
-
-// Convert only if the data is correct
-Standard_Boolean Exist;
-Graphic3d_CView  TheCView;
-//Graphic3d_Vertex Point;
-
-TColStd_Array2OfReal Ori_Matrix (0,3,0,3);
-TColStd_Array2OfReal Map_Matrix (0,3,0,3);
-
-Standard_Integer Width, Height;
-Standard_Real AX, AY, AZ;
-Standard_Real Dx, Dy, Ratio;
-
-       Exist   = ViewExists (AWindow, TheCView);
-
-       if (! Exist) {
-               AU = AV = IntegerLast ();
-       }
-       else {
-    // NKV - 11.02.08 - Use graphic driver functions
-    Standard_Boolean Result;
-
-    AVertex.Coord (AX, AY, AZ);
-
-    Result = MyGraphicDriver->ProjectRaster (TheCView, 
-      Standard_ShortReal (AX), Standard_ShortReal (AY), Standard_ShortReal (AZ),
-      AU, AV);
-
-    // the old code
-    if (!Result) {
-
-      Standard_Real PtX, PtY, PtZ, PtT;
-      Standard_Real APX, APY, APZ;
-      Standard_Real APT;
-
-      Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-#ifdef DEB
-      Standard_Integer Length = MyDefinedView.Extent ();
-#else
-      MyDefinedView.Extent ();
-#endif
-
-      Standard_Integer stop = 0;
-
-      while ((! stop) && (MyIterator.More ())) {
-       if (TheCView.ViewId ==
-           (MyIterator.Value ())->Identification ()) {
-         Ori_Matrix    =
-           (MyIterator.Value ())->MatrixOfOrientation ();
-         Map_Matrix    =
-           (MyIterator.Value ())->MatrixOfMapping ();
-         stop  = 1;
-       }
-
-       // MyIterator.Next () is located on the next view
-       MyIterator.Next ();
-      }
-
-
-      // WCS -> View Reference Coordinate Space
-      PtX      = Ori_Matrix (0, 0) * AX
-               + Ori_Matrix (0, 1) * AY
-               + Ori_Matrix (0, 2) * AZ
-               + Ori_Matrix (0, 3);
-      PtY      = Ori_Matrix (1, 0) * AX
-               + Ori_Matrix (1, 1) * AY
-               + Ori_Matrix (1, 2) * AZ
-               + Ori_Matrix (1, 3);
-      PtZ      = Ori_Matrix (2, 0) * AX
-               + Ori_Matrix (2, 1) * AY
-               + Ori_Matrix (2, 2) * AZ
-               + Ori_Matrix (2, 3);
-      PtT      = Ori_Matrix (3, 0) * AX
-               + Ori_Matrix (3, 1) * AY
-               + Ori_Matrix (3, 2) * AZ
-               + Ori_Matrix (3, 3);
-
-      // VRCS -> Normalized Projection Coordinate Space
-      APX      = Map_Matrix (0, 0) * PtX
-               + Map_Matrix (0, 1) * PtY
-               + Map_Matrix (0, 2) * PtZ
-               + Map_Matrix (0, 3) * PtT;
-      APY      = Map_Matrix (1, 0) * PtX
-               + Map_Matrix (1, 1) * PtY
-               + Map_Matrix (1, 2) * PtZ
-               + Map_Matrix (1, 3) * PtT;
-      APZ      = Map_Matrix (2, 0) * PtX
-               + Map_Matrix (2, 1) * PtY
-               + Map_Matrix (2, 2) * PtZ
-               + Map_Matrix (2, 3) * PtT;
-      APT      = Map_Matrix (3, 0) * PtX
-               + Map_Matrix (3, 1) * PtY
-               + Map_Matrix (3, 2) * PtZ
-               + Map_Matrix (3, 3) * PtT;
-
-      if (APT == 0. || stop == 0) {
-       AU = AV = IntegerLast ();
-      }
-      else {
-       APX /= APT;
-       APY /= APT;
-       APZ /= APT;
-
-       // NPCS -> Device Coordinate Space
-       AWindow->Size (Width, Height);
-       Dx      = Standard_Real (Width);
-       Dy      = Standard_Real (Height);
-       Ratio   = Dx / Dy;
-       if (Ratio >= 1.) {
-         AU = Standard_Integer (APX * Dx);
-         AV = Standard_Integer (Dy - APY * Dy * Ratio);
-       }
-       else {
-         AU = Standard_Integer (APX * Dx / Ratio);
-         AV = Standard_Integer (Dy - APY * Dy);
-       }
-      }
-    }
-  }
-
-}
-
-Graphic3d_Vertex Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV) const {
-
-// Convert only if the data is correct
-Graphic3d_CView TheCView;
-Graphic3d_Vertex Point;
-
-       if (! ViewExists (AWindow, TheCView))
-           Point.SetCoord (RealLast (), RealLast (), RealLast ());
-       else {
-Standard_Integer Width, Height;
-Standard_ShortReal x, y, z;
-Standard_Boolean Result;
-
-           AWindow->Size (Width, Height);
-
-           Result      = MyGraphicDriver->UnProjectRaster (TheCView,
-                               0, 0, Width, Height,
-                               AU, AV, x, y, z);
-
-           // unproject is done by UnProjectRaster
-           if (Result) {
-               Point.SetCoord
-                   (Standard_Real (x), Standard_Real (y), Standard_Real (z));
-           }
-           // unproject cannot be done by UnProjectRaster
-           // Code suspended since drivers Phigs and Pex are abandoned.
-           else {
-
-Standard_Real NPCX, NPCY, NPCZ;
-Standard_Real VRCX, VRCY, VRCZ, VRCT;
-Standard_Real WCX, WCY, WCZ, WCT;
-
-TColStd_Array2OfReal TOri_Matrix (0,3,0,3);
-TColStd_Array2OfReal TMap_Matrix (0,3,0,3);
-TColStd_Array2OfReal TOri_Matrix_Inv (0,3,0,3);
-TColStd_Array2OfReal TMap_Matrix_Inv (0,3,0,3);
-
-Standard_Real Dx, Dy, Ratio;
-Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-Standard_Integer j;
-
-Standard_Integer stop = 0;
-
-Standard_Boolean BResult;
-
-               j = MyDefinedView.Extent ();
-
-               while ((! stop) && (MyIterator.More ())) {
-                   if (TheCView.ViewId ==
-                       (MyIterator.Value ())->Identification ()) {
-                       TOri_Matrix     =
-                               (MyIterator.Value ())->MatrixOfOrientation ();
-                       TMap_Matrix     =
-                               (MyIterator.Value ())->MatrixOfMapping ();
-                       stop    = 1;
-                   }
-
-                   // MyIterator.Next () is located on the next view
-                   MyIterator.Next ();
-               }
-
-               // View Mapping Transformation and View Clip, inversion
-               BResult = Aspect::Inverse (TMap_Matrix, TMap_Matrix_Inv);
-
-               // View Orientation Transformation, inversion
-               BResult = Aspect::Inverse (TOri_Matrix, TOri_Matrix_Inv);
-
-               // (AU, AV) : Device Coordinate Space
-               // DCS -> NPCS Normalized Projection Coordinate Space
-               Dx      = Standard_Real (Width);
-               Dy      = Standard_Real (Height);
-               Ratio   = Dx / Dy;
-
-               if (Ratio >= 1.) {
-                       NPCX    = Standard_Real (AU) / Dx;
-                       NPCY    = (Dy - Standard_Real (AV)) / Dx;
-               }
-               else {
-                       NPCX    = Standard_Real (AU) / Dy;
-                       NPCY    = (Dy - Standard_Real (AV)) / Dy;
-               }
-               NPCZ    = 0.0;
-
-               // NPCS -> VRCS View Reference Coordinate Space
-               // PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
-
-               VRCX    = TMap_Matrix_Inv (0, 0) * NPCX
-                       + TMap_Matrix_Inv (0, 1) * NPCY
-                       + TMap_Matrix_Inv (0, 2) * NPCZ
-                       + TMap_Matrix_Inv (0, 3);
-               VRCY    = TMap_Matrix_Inv (1, 0) * NPCX
-                       + TMap_Matrix_Inv (1, 1) * NPCY
-                       + TMap_Matrix_Inv (1, 2) * NPCZ
-                       + TMap_Matrix_Inv (1, 3);
-               VRCZ    = TMap_Matrix_Inv (2, 0) * NPCX
-                       + TMap_Matrix_Inv (2, 1) * NPCY
-                       + TMap_Matrix_Inv (2, 2) * NPCZ
-                       + TMap_Matrix_Inv (2, 3);
-               VRCT    = TMap_Matrix_Inv (3, 0) * NPCX
-                       + TMap_Matrix_Inv (3, 1) * NPCY
-                       + TMap_Matrix_Inv (3, 2) * NPCZ
-                       + TMap_Matrix_Inv (3, 3);
-
-               // VRCS -> WCS World Coordinate Space
-               // PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
-
-               WCX     = TOri_Matrix_Inv (0, 0) * VRCX
-                       + TOri_Matrix_Inv (0, 1) * VRCY
-                       + TOri_Matrix_Inv (0, 2) * VRCZ
-                       + TOri_Matrix_Inv (0, 3) * VRCT;
-               WCY     = TOri_Matrix_Inv (1, 0) * VRCX
-                       + TOri_Matrix_Inv (1, 1) * VRCY
-                       + TOri_Matrix_Inv (1, 2) * VRCZ
-                       + TOri_Matrix_Inv (1, 3) * VRCT;
-               WCZ     = TOri_Matrix_Inv (2, 0) * VRCX
-                       + TOri_Matrix_Inv (2, 1) * VRCY
-                       + TOri_Matrix_Inv (2, 2) * VRCZ
-                       + TOri_Matrix_Inv (2, 3) * VRCT;
-               WCT     = TOri_Matrix_Inv (3, 0) * VRCX
-                       + TOri_Matrix_Inv (3, 1) * VRCY
-                       + TOri_Matrix_Inv (3, 2) * VRCZ
-                       + TOri_Matrix_Inv (3, 3) * VRCT;
-
-               if (WCT != 0.)
-                   Point.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
-               else
-                   Point.SetCoord (RealLast (), RealLast (), RealLast ());
-           }
-       }
-
-       return (Point);
-
-}
-
-void Visual3d_ViewManager::ConvertCoordWithProj (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV, Graphic3d_Vertex& Point, Graphic3d_Vector& Proj) const {
-
-// Conversion only if the data is correct
-Graphic3d_CView TheCView;
-
-        if (! ViewExists (AWindow, TheCView)) {
-           Point.SetCoord (RealLast (), RealLast (), RealLast ());
-           Proj.SetCoord (0., 0., 0.);
-        }
-       else {
-Standard_Integer Width, Height;
-Standard_ShortReal x, y, z;
-Standard_ShortReal dx, dy, dz;
-Standard_Boolean Result;
-
-           AWindow->Size (Width, Height);
-
-           Result      = MyGraphicDriver->UnProjectRasterWithRay (TheCView,
-                               0, 0, Width, Height,
-                               AU, AV, x, y, z, dx, dy, dz);
-
-           // unproject is done by UnProjectRaster
-           if (Result) {
-               Point.SetCoord
-                   (Standard_Real (x), Standard_Real (y), Standard_Real (z));
-               Proj.SetCoord
-                   (Standard_Real (dx), Standard_Real (dy), Standard_Real (dz));
-                Proj.Normalize();
-           }
-           // unproject cannot be done by UnProjectRaster
-           // Code is suspended since drivers Phigs are Pex abandoned.
-           else {
-
-Standard_Real NPCX, NPCY, NPCZ;
-Standard_Real VRCX, VRCY, VRCZ, VRCT;
-Standard_Real WCX, WCY, WCZ, WCT;
-
-TColStd_Array2OfReal TOri_Matrix (0,3,0,3);
-TColStd_Array2OfReal TMap_Matrix (0,3,0,3);
-TColStd_Array2OfReal TOri_Matrix_Inv (0,3,0,3);
-TColStd_Array2OfReal TMap_Matrix_Inv (0,3,0,3);
-
-Standard_Real Dx, Dy, Ratio;
-Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-Standard_Integer j;
-
-Standard_Integer stop = 0;
-
-Standard_Boolean BResult;
-
-               j = MyDefinedView.Extent ();
-
-               while ((! stop) && (MyIterator.More ())) {
-                   if (TheCView.ViewId ==
-                       (MyIterator.Value ())->Identification ()) {
-                       TOri_Matrix     =
-                               (MyIterator.Value ())->MatrixOfOrientation ();
-                       TMap_Matrix     =
-                               (MyIterator.Value ())->MatrixOfMapping ();
-                       stop    = 1;
-                   }
-
-                   // MyIterator.Next () is located on the next view
-                   MyIterator.Next ();
-               }
-
-               // View Mapping Transformation and View Clip, inversion
-               BResult = Aspect::Inverse (TMap_Matrix, TMap_Matrix_Inv);
-
-               // View Orientation Transformation, inversion
-               BResult = Aspect::Inverse (TOri_Matrix, TOri_Matrix_Inv);
-
-               // (AU, AV) : Device Coordinate Space
-               // DCS -> NPCS Normalized Projection Coordinate Space
-               Dx      = Standard_Real (Width);
-               Dy      = Standard_Real (Height);
-               Ratio   = Dx / Dy;
-
-               if (Ratio >= 1.) {
-                       NPCX    = Standard_Real (AU) / Dx;
-                       NPCY    = (Dy - Standard_Real (AV)) / Dx;
-               }
-               else {
-                       NPCX    = Standard_Real (AU) / Dy;
-                       NPCY    = (Dy - Standard_Real (AV)) / Dy;
-               }
-               NPCZ    = 0.0;
-
-               // NPCS -> VRCS View Reference Coordinate Space
-               // PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
-
-               VRCX    = TMap_Matrix_Inv (0, 0) * NPCX
-                       + TMap_Matrix_Inv (0, 1) * NPCY
-                       + TMap_Matrix_Inv (0, 2) * NPCZ
-                       + TMap_Matrix_Inv (0, 3);
-               VRCY    = TMap_Matrix_Inv (1, 0) * NPCX
-                       + TMap_Matrix_Inv (1, 1) * NPCY
-                       + TMap_Matrix_Inv (1, 2) * NPCZ
-                       + TMap_Matrix_Inv (1, 3);
-               VRCZ    = TMap_Matrix_Inv (2, 0) * NPCX
-                       + TMap_Matrix_Inv (2, 1) * NPCY
-                       + TMap_Matrix_Inv (2, 2) * NPCZ
-                       + TMap_Matrix_Inv (2, 3);
-               VRCT    = TMap_Matrix_Inv (3, 0) * NPCX
-                       + TMap_Matrix_Inv (3, 1) * NPCY
-                       + TMap_Matrix_Inv (3, 2) * NPCZ
-                       + TMap_Matrix_Inv (3, 3);
-
-               // VRCS -> WCS World Coordinate Space
-               // PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
-
-               WCX     = TOri_Matrix_Inv (0, 0) * VRCX
-                       + TOri_Matrix_Inv (0, 1) * VRCY
-                       + TOri_Matrix_Inv (0, 2) * VRCZ
-                       + TOri_Matrix_Inv (0, 3) * VRCT;
-               WCY     = TOri_Matrix_Inv (1, 0) * VRCX
-                       + TOri_Matrix_Inv (1, 1) * VRCY
-                       + TOri_Matrix_Inv (1, 2) * VRCZ
-                       + TOri_Matrix_Inv (1, 3) * VRCT;
-               WCZ     = TOri_Matrix_Inv (2, 0) * VRCX
-                       + TOri_Matrix_Inv (2, 1) * VRCY
-                       + TOri_Matrix_Inv (2, 2) * VRCZ
-                       + TOri_Matrix_Inv (2, 3) * VRCT;
-               WCT     = TOri_Matrix_Inv (3, 0) * VRCX
-                       + TOri_Matrix_Inv (3, 1) * VRCY
-                       + TOri_Matrix_Inv (3, 2) * VRCZ
-                       + TOri_Matrix_Inv (3, 3) * VRCT;
-
-               if (WCT != 0.)
-                   Point.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
-               else
-                   Point.SetCoord (RealLast (), RealLast (), RealLast ());
-
-                // Define projection ray
-               NPCZ    = 10.0;
-
-               // NPCS -> VRCS View Reference Coordinate Space
-               // PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
-
-               VRCX    = TMap_Matrix_Inv (0, 0) * NPCX
-                       + TMap_Matrix_Inv (0, 1) * NPCY
-                       + TMap_Matrix_Inv (0, 2) * NPCZ
-                       + TMap_Matrix_Inv (0, 3);
-               VRCY    = TMap_Matrix_Inv (1, 0) * NPCX
-                       + TMap_Matrix_Inv (1, 1) * NPCY
-                       + TMap_Matrix_Inv (1, 2) * NPCZ
-                       + TMap_Matrix_Inv (1, 3);
-               VRCZ    = TMap_Matrix_Inv (2, 0) * NPCX
-                       + TMap_Matrix_Inv (2, 1) * NPCY
-                       + TMap_Matrix_Inv (2, 2) * NPCZ
-                       + TMap_Matrix_Inv (2, 3);
-               VRCT    = TMap_Matrix_Inv (3, 0) * NPCX
-                       + TMap_Matrix_Inv (3, 1) * NPCY
-                       + TMap_Matrix_Inv (3, 2) * NPCZ
-                       + TMap_Matrix_Inv (3, 3);
-
-               // VRCS -> WCS World Coordinate Space
-               // PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
-
-               WCX     = TOri_Matrix_Inv (0, 0) * VRCX
-                       + TOri_Matrix_Inv (0, 1) * VRCY
-                       + TOri_Matrix_Inv (0, 2) * VRCZ
-                       + TOri_Matrix_Inv (0, 3) * VRCT;
-               WCY     = TOri_Matrix_Inv (1, 0) * VRCX
-                       + TOri_Matrix_Inv (1, 1) * VRCY
-                       + TOri_Matrix_Inv (1, 2) * VRCZ
-                       + TOri_Matrix_Inv (1, 3) * VRCT;
-               WCZ     = TOri_Matrix_Inv (2, 0) * VRCX
-                       + TOri_Matrix_Inv (2, 1) * VRCY
-                       + TOri_Matrix_Inv (2, 2) * VRCZ
-                       + TOri_Matrix_Inv (2, 3) * VRCT;
-               WCT     = TOri_Matrix_Inv (3, 0) * VRCX
-                       + TOri_Matrix_Inv (3, 1) * VRCY
-                       + TOri_Matrix_Inv (3, 2) * VRCZ
-                       + TOri_Matrix_Inv (3, 3) * VRCT;
-
-                if (WCT != 0.) {
-                   Proj.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
-                    Proj.Normalize();
-                }
-               else
-                   Proj.SetCoord (0., 0., 0.);
-           }
-       }
-
-}
-
-Visual3d_PickDescriptor Visual3d_ViewManager::Pick (const Visual3d_ContextPick& CTX, const Handle(Aspect_Window)& AWindow, const Standard_Integer AX, const Standard_Integer AY) {
-
-// The marking is activated only if the data is correct
-Standard_Boolean DoPick = Standard_False;
-
-CALL_DEF_PICK apick;
-Standard_Integer Width, Height;
-
-       // Parse the list of views to find a 
-       // view having this specified window
-       Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-       int TheWindowIdOfView;
-
-#ifndef WNT
-const Handle(Xw_Window) THEWindow = *(Handle(Xw_Window) *) &AWindow;
-       int TheSpecifiedWindowId = int (THEWindow->XWindow ());
-#else
-const Handle(WNT_Window) THEWindow = *(Handle(WNT_Window) *) &AWindow;
-       int TheSpecifiedWindowId = int (THEWindow->HWindow ());
-#endif  // WNT
-
-       while ((! DoPick) && (MyIterator.More ())) {
-
-          if ( ((MyIterator.Value ())->IsDefined ()) &&
-               ((MyIterator.Value ())->IsActive ()) ) {
-
-const Handle(Aspect_Window) AspectWindow = (MyIterator.Value ())->Window ();
-#ifndef WNT
-const Handle(Xw_Window) theWindow = *(Handle(Xw_Window) *) &AspectWindow;
-       TheWindowIdOfView = int (theWindow->XWindow ());
-#else
-const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AspectWindow;
-       TheWindowIdOfView = int (theWindow->HWindow ());
-#endif  // WNT
-               // Comparision on window IDs
-               if (TheWindowIdOfView == TheSpecifiedWindowId) {
-                       DoPick          = Standard_True;
-
-                       // Update
-                       apick.WsId      =
-                       int ((MyIterator.Value ())->Identification ());
-
-                       apick.ViewId    =
-                       int ((MyIterator.Value ())->Identification ());
-#ifndef WNT
-                       apick.DefWindow.XWindow = TheSpecifiedWindowId;
-#else
-                       apick.DefWindow.XWindow = (HWND) TheSpecifiedWindowId;
-#endif
-
-                       apick.x                 = int (AX);
-                       apick.y                 = int (AY);
-
-                       theWindow->Size (Width, Height);
-                       apick.DefWindow.dx      = float (Width);
-                       apick.DefWindow.dy      = float (Height);
-
-                       apick.Context.aperture  = (float) CTX.Aperture ();
-                       apick.Context.order     = int (CTX.Order ());
-                       apick.Context.depth     = int (CTX.Depth ());
-
-               }
-          } /* if ((MyIterator.Value ())->IsDefined ()) { */
-
-          // MyIterator.Next () is located on the next view
-          MyIterator.Next ();
-       }
-
-       if (DoPick)
-               MyGraphicDriver->Pick (apick);
-       else
-               apick.Pick.depth        = 0;
-
-       // Picking : return
-Standard_Integer i, j=0;
-Standard_Integer NbPick;
-
-Visual3d_PickDescriptor PDes (CTX);
-Visual3d_PickPath PPat;
-
-       PDes.Clear ();
-       NbPick  = 0;
-       // For i=0 it is not a graphic structure it is a view structure
-       // For i=1 it is the displayed graphic structure
-       // For i=2 to apick.Pick.depth-1 it is the connected graphic structures
-       if (apick.Pick.depth != 0) {
-           j = apick.Pick.listid[1];
-           if ((Graphic3d_StructureManager::Identification (j))->
-                                               IsSelectable ()) {
-               // Maj element number
-               PPat.SetElementNumber (apick.Pick.listelem[1]);
-               // Maj pick identifier
-               PPat.SetPickIdentifier (apick.Pick.listpickid[1]);
-               // Maj structure
-               PPat.SetStructIdentifier
-                       (Graphic3d_StructureManager::Identification (j));
-               // Maj PickPath
-               PDes.AddPickPath (PPat);
-               NbPick++;
-           }
-       }
-
-       // Not very efficient, revise (CAL 22/09/95)
-       if (apick.Pick.depth > 2) {
-Handle(Graphic3d_Structure) StructCur =
-       Graphic3d_StructureManager::Identification (j);
-Standard_Boolean found;
-Graphic3d_MapOfStructure Set;
-
-           for (i=2; i<apick.Pick.depth; i++) {
-               found = Standard_False;
-               j = apick.Pick.listid[i-1];
-               Set.Clear ();
-               StructCur->Descendants (Set);
-Graphic3d_MapIteratorOfMapOfStructure IteratorD (Set);
-
-               j = apick.Pick.listid[i];
-               while (IteratorD.More () && !found) {
-                   StructCur = IteratorD.Key ();
-                   if (StructCur->Identification () == j ) {
-                       found = Standard_True;
-                       // Maj element number
-                       PPat.SetElementNumber (apick.Pick.listelem[i]);
-                       // Maj pick identifier
-                       PPat.SetPickIdentifier (apick.Pick.listpickid[i]);
-                       // Maj structure
-                       PPat.SetStructIdentifier (StructCur);
-                       // Maj PickPath
-                       PDes.AddPickPath (PPat);
-                       NbPick++;
-                   }
-                   // IteratorD.Next () is located on the next structure
-                   IteratorD.Next ();
-               }
-           }
-       }
-
-       apick.Pick.depth        = int (NbPick);
-
-       MyGraphicDriver->InitPick ();
-
-       return (PDes);
-
-}
-
 Standard_Boolean Visual3d_ViewManager::ViewExists (const Handle(Aspect_Window)& AWindow, Graphic3d_CView& TheCView) const {
 
 Standard_Boolean Exist = Standard_False;
@@ -1136,15 +527,17 @@ Standard_Boolean Exist = Standard_False;
        // Parse the list of views to find
        // a view with the specified window
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-       int TheWindowIdOfView;
 
-#ifndef WNT
-const Handle(Xw_Window) THEWindow = *(Handle(Xw_Window) *) &AWindow;
-       int TheSpecifiedWindowId = int (THEWindow->XWindow ());
+#if defined(_WIN32) || defined(__WIN32__)
+  const Handle(WNT_Window) THEWindow = Handle(WNT_Window)::DownCast (AWindow);
+  Aspect_Handle TheSpecifiedWindowId = THEWindow->HWindow ();
+#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
+  const Handle(Cocoa_Window) THEWindow = Handle(Cocoa_Window)::DownCast (AWindow);
+  NSView* TheSpecifiedWindowId = THEWindow->HView();
 #else
-const Handle(WNT_Window) THEWindow = *(Handle(WNT_Window) *) &AWindow;
-       int TheSpecifiedWindowId = int (THEWindow->HWindow ());
-#endif  // WNT
+  const Handle(Xw_Window) THEWindow = Handle(Xw_Window)::DownCast (AWindow);
+  int TheSpecifiedWindowId = int (THEWindow->XWindow ());
+#endif
 
        while ((! Exist) && (MyIterator.More ())) {
 
@@ -1152,17 +545,20 @@ const Handle(WNT_Window) THEWindow = *(Handle(WNT_Window) *) &AWindow;
                ((MyIterator.Value ())->IsActive ()) ) {
 
 const Handle(Aspect_Window) AspectWindow = (MyIterator.Value ())->Window ();
-#ifndef WNT
-const Handle(Xw_Window) theWindow = *(Handle(Xw_Window) *) &AspectWindow;
-       TheWindowIdOfView = int (theWindow->XWindow ());
+#if defined(_WIN32) || defined(__WIN32__)
+   const Handle(WNT_Window) theWindow = Handle(WNT_Window)::DownCast (AspectWindow);
+   Aspect_Handle TheWindowIdOfView = theWindow->HWindow ();
+#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
+   const Handle(Cocoa_Window) theWindow = Handle(Cocoa_Window)::DownCast (AspectWindow);
+   NSView* TheWindowIdOfView = theWindow->HView();
 #else
-const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AspectWindow;
-       TheWindowIdOfView = int (theWindow->HWindow ());
+   const Handle(Xw_Window) theWindow = Handle(Xw_Window)::DownCast (AspectWindow);
+   int TheWindowIdOfView = int (theWindow->XWindow ());
 #endif  // WNT
                // Comparaison on window IDs
                if (TheWindowIdOfView == TheSpecifiedWindowId) {
                        Exist   = Standard_True;
-                       TheCView        = *(CALL_DEF_VIEW *)(MyIterator.Value ())->CView ();
+                       TheCView        = *(Graphic3d_CView* )(MyIterator.Value())->CView();
                }
           } /* if ((MyIterator.Value ())->IsDefined ()) */
 
@@ -1180,12 +576,6 @@ void Visual3d_ViewManager::Activate () {
        // Activates all deactivated views
        //
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
 
        while (MyIterator.More ()) {
                if (! (MyIterator.Value ())->IsActive ())
@@ -1202,13 +592,8 @@ void Visual3d_ViewManager::Deactivate () {
        //
        // Deactivates all activated views
        //
-#ifdef DEB
-       Standard_Integer Length = MyDefinedView.Extent ();
-#else
-        MyDefinedView.Extent ();
-#endif
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                if ((MyIterator.Value ())->IsActive ())
                        (MyIterator.Value ())->Deactivate ();
@@ -1235,7 +620,7 @@ Handle(Graphic3d_Structure) Visual3d_ViewManager::Identification (const Standard
 }
 
 Standard_Integer Visual3d_ViewManager::Identification () const {
+
        return (Graphic3d_StructureManager::Identification ());
 
 }
@@ -1249,6 +634,19 @@ Standard_Integer Visual3d_ViewManager::Identification (const Handle(Visual3d_Vie
 
 void Visual3d_ViewManager::UnIdentification (const Standard_Integer aViewId)
 {
+  Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+  while (MyIterator.More()) 
+  {
+    if ((MyIterator.Value())->Identification () == aViewId)
+    {
+      const Handle(Visual3d_View)& theView = MyIterator.Value();
+      //remove the view from the list
+      MyDefinedView.Remove(theView);
+      break;
+    }
+    // go to next
+    MyIterator.Next ();
+  }
   MyViewGenId.Free(aViewId);
 }
 
@@ -1280,7 +678,7 @@ void Visual3d_ViewManager::SetZBufferAuto (const Standard_Boolean AFlag) {
        if (! MyZBufferAuto && ! AFlag) return;
 
        // if pass from False to True :
-       // no problem, at the next view update, it 
+       // no problem, at the next view update, it
        // will properly ask questions to answer (SetVisualisation)
        // if pass from True to False :
        // it is necessary to modify ZBufferActivity at each view so that
@@ -1346,7 +744,7 @@ const Handle(Visual3d_Layer)& Visual3d_ViewManager::OverLayer () const {
 
 //=======================================================================
 //function : ChangeZLayer
-//purpose  : 
+//purpose  :
 //=======================================================================
 
 void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
@@ -1354,7 +752,7 @@ void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theS
 {
   if (!myLayerIds.Contains (theLayerId))
     return;
-  
+
   // change display layer for structure in all views
   if (MyDisplayedStructure.Contains (theStructure))
   {
@@ -1362,10 +760,9 @@ void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theS
     for ( ; aViewIt.More (); aViewIt.Next ())
       (aViewIt.Value ())->ChangeZLayer (theStructure, theLayerId);
   }
-  
+
   // tell graphic driver to update the structure's display layer
-  MyGraphicDriver->ChangeZLayer (
-    (*(Graphic3d_CStructure*)theStructure->CStructure ()), theLayerId);
+  MyGraphicDriver->ChangeZLayer (*(theStructure->CStructure()), theLayerId);
 }
 
 //=======================================================================
@@ -1375,10 +772,7 @@ void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theS
 
 Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structure)& theStructure) const
 {
-  Graphic3d_CStructure& aStructure =
-    (*(Graphic3d_CStructure*)theStructure->CStructure ());
-
-  return MyGraphicDriver->GetZLayer (aStructure);
+  return MyGraphicDriver->GetZLayer (*theStructure->CStructure ());
 }
 
 //=======================================================================
@@ -1411,7 +805,7 @@ Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId)
 
 //=======================================================================
 //function : RemoveZLayer
-//purpose  : 
+//purpose  :
 //=======================================================================
 
 Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theLayerId)
@@ -1460,3 +854,26 @@ Aspect_GenId& Visual3d_ViewManager::getZLayerGenId ()
   static Aspect_GenId aGenId (1, IntegerLast());
   return aGenId;
 }
+
+//=======================================================================
+//function : InstallZLayers
+//purpose  :
+//=======================================================================
+
+void Visual3d_ViewManager::InstallZLayers(const Handle(Visual3d_View)& theView) const
+{
+  if (!MyDefinedView.Contains (theView))
+    return;
+
+  // erase and insert layers iteratively to provide the same layer order as
+  // in the view manager's sequence. This approach bases on the layer insertion
+  // order: the new layers are always appended to the end of the list
+  // inside of view, while layer remove operation doesn't affect the order.
+  // Starting from second layer : no need to change the default z layer.
+  for (Standard_Integer aSeqIdx = 2; aSeqIdx <= myLayerSeq.Length (); aSeqIdx++)
+  {
+    Standard_Integer aLayerID = myLayerSeq.Value (aSeqIdx);
+    theView->RemoveZLayer (aLayerID);
+    theView->AddZLayer (aLayerID);
+  }
+}