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 90ccd31..0c79703
@@ -1,21 +1,16 @@
 // Copyright (c) 1995-1999 Matra Datavision
-// Copyright (c) 1999-2012 OPEN CASCADE SAS
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
 //
-// The content of this file is subject to the Open CASCADE Technology Public
-// License Version 6.5 (the "License"). You may not use the content of this file
-// except in compliance with the License. Please obtain a copy of the License
-// at http://www.opencascade.org and read it completely before using this file.
+// This file is part of Open CASCADE Technology software library.
 //
-// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
-// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
 //
-// The Original Code and all software distributed under the License is
-// distributed on an "AS IS" basis, without warranty of any kind, and the
-// Initial Developer hereby disclaims all such warranties, including without
-// limitation, any warranties of merchantability, fitness for a particular
-// purpose or non-infringement. Please see the License for the specific terms
-// and conditions governing the rights and limitations under the License.
-
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
 
 /***********************************************************************
 
@@ -35,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
 
@@ -93,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),
@@ -105,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
@@ -141,7 +136,6 @@ void Visual3d_ViewManager::Remove () {
   // clear all structures whilst views are alive for correct GPU memory management
   MyDisplayedStructure.Clear();
   MyHighlightedStructure.Clear();
-  MyVisibleStructure.Clear();
   MyPickStructure.Clear();
 
   // clear list of managed views
@@ -161,7 +155,7 @@ void Visual3d_ViewManager::ChangeDisplayPriority (const Handle(Graphic3d_Structu
        // Change structure priority in all defined views
        //
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->ChangeDisplayPriority
                        (AStructure, OldPriority, NewPriority);
@@ -172,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;
 
@@ -187,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;
 
@@ -215,12 +209,12 @@ void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStruct
   // 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);
@@ -234,7 +228,7 @@ void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStruct
 void Visual3d_ViewManager::Clear (const Handle(Graphic3d_Structure)& AStructure, const Standard_Boolean WithDestruction) {
 
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Clear (AStructure, WithDestruction);
 
@@ -247,7 +241,7 @@ void Visual3d_ViewManager::Clear (const Handle(Graphic3d_Structure)& AStructure,
 void Visual3d_ViewManager::Connect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
 
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Connect (AMother, ADaughter);
 
@@ -260,7 +254,7 @@ void Visual3d_ViewManager::Connect (const Handle(Graphic3d_Structure)& AMother,
 void Visual3d_ViewManager::Disconnect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
 
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Disconnect (AMother, ADaughter);
 
@@ -270,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
@@ -283,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);
 
@@ -308,7 +302,7 @@ void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure)
        // Erase structure in all defined views
        //
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Erase (AStructure);
 
@@ -317,7 +311,6 @@ void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure)
        }
 
        MyHighlightedStructure.Remove (AStructure);
-       MyVisibleStructure.Remove (AStructure);
        MyPickStructure.Remove (AStructure);
 
 }
@@ -325,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();
@@ -341,7 +334,7 @@ void Visual3d_ViewManager::Highlight (const Handle(Graphic3d_Structure)& AStruct
        // Highlight in all activated views
        //
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->Highlight (AStructure, AMethod);
 
@@ -354,7 +347,7 @@ void Visual3d_ViewManager::Highlight (const Handle(Graphic3d_Structure)& AStruct
 void Visual3d_ViewManager::SetTransform (const Handle(Graphic3d_Structure)& AStructure, const TColStd_Array2OfReal& ATrsf) {
 
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->SetTransform (AStructure, ATrsf);
 
@@ -367,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 ();
@@ -385,7 +378,7 @@ void Visual3d_ViewManager::UnHighlight (const Handle(Graphic3d_Structure)& AStru
        // UnHighlight in all activated views
        //
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                (MyIterator.Value ())->UnHighlight (AStructure);
 
@@ -395,61 +388,76 @@ 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 {
@@ -512,446 +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);
-
-      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.);
-           }
-       }
-
-}
-
-
 Standard_Boolean Visual3d_ViewManager::ViewExists (const Handle(Aspect_Window)& AWindow, Graphic3d_CView& TheCView) const {
 
 Standard_Boolean Exist = Standard_False;
@@ -959,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 ())) {
 
@@ -975,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 ()) */
 
@@ -1003,7 +576,7 @@ void Visual3d_ViewManager::Activate () {
        // Activates all deactivated views
        //
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                if (! (MyIterator.Value ())->IsActive ())
                        (MyIterator.Value ())->Activate ();
@@ -1020,7 +593,7 @@ void Visual3d_ViewManager::Deactivate () {
        // Deactivates all activated views
        //
        Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
+
        while (MyIterator.More ()) {
                if ((MyIterator.Value ())->IsActive ())
                        (MyIterator.Value ())->Deactivate ();
@@ -1047,7 +620,7 @@ Handle(Graphic3d_Structure) Visual3d_ViewManager::Identification (const Standard
 }
 
 Standard_Integer Visual3d_ViewManager::Identification () const {
+
        return (Graphic3d_StructureManager::Identification ());
 
 }
@@ -1061,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);
 }
 
@@ -1092,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
@@ -1158,7 +744,7 @@ const Handle(Visual3d_Layer)& Visual3d_ViewManager::OverLayer () const {
 
 //=======================================================================
 //function : ChangeZLayer
-//purpose  : 
+//purpose  :
 //=======================================================================
 
 void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
@@ -1166,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))
   {
@@ -1174,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);
 }
 
 //=======================================================================
@@ -1187,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 ());
 }
 
 //=======================================================================
@@ -1223,7 +805,7 @@ Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId)
 
 //=======================================================================
 //function : RemoveZLayer
-//purpose  : 
+//purpose  :
 //=======================================================================
 
 Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theLayerId)
@@ -1282,7 +864,7 @@ void Visual3d_ViewManager::InstallZLayers(const Handle(Visual3d_View)& theView)
 {
   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