0024394: Visualization - implement more general way for rendering of immediate objects
authorkgv <kgv@opencascade.com>
Thu, 22 Jan 2015 14:29:37 +0000 (17:29 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 22 Jan 2015 14:31:53 +0000 (17:31 +0300)
Move OpenGl_Structure::myZLayer to base class Graphic3d_CStructure.
Graphic3d_ZLayerId - introduce new pre-defined ZLayers.
Do not clear Depth buffer twice for default ZLayer.

AIS_InteractiveContext::Display() - add new argument AIS_DisplayStatus to specify displaying status.

Drop unused Graphic3d_CPick and related methods.
Drop OpenGl_Structure::myNamedStatus - use flags from parent class Graphic3d_CStructure directly.
OpenGl_LayerList ::ChangeLayer(), ::ChangePriority - fix structure remove from unexpected layer.
Merge class OpenGl_PriorityList into OpenGl_Layer.

PrsMgr_PresentationManager::mySelectionColor - store selection color as field of Presentation Manager.
PrsMgr_Presentation class - do not declare private methods as virtual.
PrsMgr_Presentation::Highlight() - extend method syntax and drop methods ::Color() and ::BoundBox().

PrsMgr_PresentableObject - store ZLayer in presentable object
to display object presentations in required layer directly
(without displaying it in wrong layer first).

test/mesh/end - force re-displaying the shape to compute mesh anew

Test-case for issue

72 files changed:
src/AIS/AIS_InteractiveContext.cdl
src/AIS/AIS_InteractiveContext.cxx
src/AIS/AIS_LocalContext.cdl
src/AIS/AIS_LocalContext.cxx
src/Graphic3d/FILES
src/Graphic3d/Graphic3d.cdl
src/Graphic3d/Graphic3d_CPick.hxx [deleted file]
src/Graphic3d/Graphic3d_CStructure.cxx
src/Graphic3d/Graphic3d_CStructure.hxx
src/Graphic3d/Graphic3d_GraphicDriver.cdl
src/Graphic3d/Graphic3d_GraphicDriver.cxx
src/Graphic3d/Graphic3d_MapIteratorOfMapOfStructure.hxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_MapOfStructure.hxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_Structure.cdl
src/Graphic3d/Graphic3d_Structure.cxx
src/Graphic3d/Graphic3d_StructureManager.cdl
src/Graphic3d/Graphic3d_StructureManager.cxx
src/Graphic3d/Graphic3d_ZLayerId.hxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_ZLayerSettings.hxx
src/InterfaceGraphic/InterfaceGraphic_Visual3d.hxx
src/OpenGl/FILES
src/OpenGl/OpenGl_BVHClipPrimitiveSet.cxx
src/OpenGl/OpenGl_BVHClipPrimitiveSet.hxx
src/OpenGl/OpenGl_GraphicDriver.cxx
src/OpenGl/OpenGl_GraphicDriver.hxx
src/OpenGl/OpenGl_GraphicDriver_4.cxx
src/OpenGl/OpenGl_GraphicDriver_7.cxx
src/OpenGl/OpenGl_Layer.cxx
src/OpenGl/OpenGl_Layer.hxx
src/OpenGl/OpenGl_LayerList.cxx
src/OpenGl/OpenGl_LayerList.hxx
src/OpenGl/OpenGl_NamedStatus.hxx
src/OpenGl/OpenGl_PriorityList.cxx [deleted file]
src/OpenGl/OpenGl_PriorityList.hxx [deleted file]
src/OpenGl/OpenGl_SequenceOfStructure.hxx [new file with mode: 0644]
src/OpenGl/OpenGl_Structure.cxx
src/OpenGl/OpenGl_Structure.hxx
src/OpenGl/OpenGl_View.hxx
src/OpenGl/OpenGl_View_2.cxx
src/OpenGl/OpenGl_Workspace.cxx
src/OpenGl/OpenGl_Workspace_Raytrace.cxx
src/Prs3d/Prs3d_Presentation.cdl
src/Prs3d/Prs3d_Presentation.cxx
src/PrsMgr/PrsMgr.cdl
src/PrsMgr/PrsMgr_PresentableObject.cdl
src/PrsMgr/PrsMgr_PresentableObject.cxx
src/PrsMgr/PrsMgr_Presentation.cdl
src/PrsMgr/PrsMgr_Presentation.cxx
src/PrsMgr/PrsMgr_PresentationManager.cdl
src/PrsMgr/PrsMgr_PresentationManager.cxx
src/SelectMgr/SelectMgr_EntityOwner.cdl
src/SelectMgr/SelectMgr_EntityOwner.cxx
src/SelectMgr/SelectMgr_SelectableObject.cdl
src/SelectMgr/SelectMgr_SelectableObject.cxx
src/StdSelect/StdSelect_BRepOwner.cdl
src/StdSelect/StdSelect_BRepOwner.cxx
src/V3d/V3d_CircularGrid.cxx
src/V3d/V3d_DirectionalLight.cxx
src/V3d/V3d_Plane.cxx
src/V3d/V3d_PositionLight.cxx
src/V3d/V3d_PositionalLight.cxx
src/V3d/V3d_RectangularGrid.cxx
src/V3d/V3d_SpotLight.cxx
src/ViewerTest/ViewerTest.cxx
src/ViewerTest/ViewerTest_ViewerCommands.cxx
src/Visual3d/Visual3d_MapOfZLayerSettings.hxx
src/Visual3d/Visual3d_View.cdl
src/Visual3d/Visual3d_View.cxx
src/Visual3d/Visual3d_ViewManager.cdl
src/Visual3d/Visual3d_ViewManager.cxx
tests/bugs/vis/bug24394 [new file with mode: 0644]
tests/mesh/end

index 50f9420..d8912b4 100644 (file)
@@ -172,30 +172,31 @@ is
        -- local context without selection, use the syntax below,
        -- setting aSelectionMode to -1.
 
-    Display(me                 : mutable;
-           anIobj             : InteractiveObject from AIS;
-           amode              : Integer from Standard ;
-           aSelectionMode     : Integer from Standard ;
-           updateviewer       : Boolean from Standard = Standard_True;
-           allowdecomposition : Boolean from Standard = Standard_True);
+    Display (me                      : mutable;
+             theIObj                 : InteractiveObject from AIS;
+             theDispMode             : Integer from Standard;
+             theSelectionMode        : Integer from Standard;
+             theToUpdateViewer       : Boolean from Standard = Standard_True;
+             theToAllowDecomposition : Boolean from Standard = Standard_True;
+             theDispStatus           : DisplayStatus from AIS = AIS_DS_None);
        ---Purpose: Controls the choice between the using the display
        -- and selection modes of open local context which you
        -- have defined and activating those available by default.
        -- If no Local Context is opened. and the Interactive
-       -- Object aniobj has no display mode of its own, the
-       -- default display mode, 0, is used. Likewise, if aniobj
+       -- Object theIObj has no display mode of its own, the
+       -- default display mode, 0, is used. Likewise, if theIObj
        -- has no selection mode of its own, the default one, 0, is used.
-       -- If a local context is open and if updateviewer equals
+       -- If a local context is open and if theToUpdateViewer equals
        -- Standard_False, the presentation of the Interactive
        -- Object activates the selection mode; the object is
        -- displayed but no viewer will be updated.
-       -- If aSelectionMode equals -1, anIobj will not be
+       -- If theSelectionMode equals -1, theIObj will not be
        -- activated: it will be displayed but will not be selectable.
        -- Use this if you want to view the object in open local
        -- context without selection. Note: This option is only
        -- available in Local Context.
-       -- If allowDecomposition equals true, anIObj can have
-       -- subshapes detected by selection mechanisms. anIObj
+       -- If theToAllowDecomposition equals true, theIObj can have
+       -- subshapes detected by selection mechanisms. theIObj
        -- must be able to give a shape selection modes which
        -- fit the AIS_Shape selection modes:
        -- -   vertices: 1
@@ -345,22 +346,14 @@ is
     SetZLayer( me         : mutable;
                theIObj    : InteractiveObject from AIS;
                theLayerId : Integer from Standard );
-    ---Purpose: Set Z layer id for interactive object. The layer can be
-    -- specified for displayed object only. The Z layers can be used to display
-    -- temporarily presentations of some object in front of the other objects
-    -- in the scene. The ids for Z layers are generated by V3d_Viewer.
-    -- Note that Z layers differ from under-/overlayer in V3d_View:
-    -- under-/overlayer are intended for specific 2D drawings that appear
-    -- behind/in front of all 3D presentations, while SetZLayer() method
-    -- applies to regular 3D presentations and does not imply any specific
-    -- drawing methods.
+    ---Purpose: Set Z layer id for interactive object.
+    -- The Z layers can be used to display temporarily presentations of some object in front of the other objects in the scene.
+    -- The ids for Z layers are generated by V3d_Viewer.
 
     GetZLayer( me;
                theIObj : InteractiveObject from AIS )
       returns Integer from Standard;
     ---Purpose: Get Z layer id set for displayed interactive object.
-    -- If the object doesn't exists in context or has no computed presentations,
-    -- the method returns -1.
 
     Redisplay(me     : mutable;
              aniobj : InteractiveObject from AIS;
index b8cb1cb..f5a00cf 100644 (file)
@@ -33,6 +33,7 @@
 #include <AIS_MapIteratorOfMapOfInteractive.hxx>
 #include <PrsMgr_ModedPresentation.hxx>
 #include <Visual3d_ViewManager.hxx>
+#include <Visual3d_View.hxx>
 #include <Prs3d_ShadingAspect.hxx>
 #include <AIS_Shape.hxx>
 #include <Graphic3d_AspectFillArea3d.hxx>
@@ -270,8 +271,12 @@ void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_KindOfInteractive
 {
   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
   {
-    if (anObjIter.Value()->GraphicStatus() != theStatus
-     || anObjIter.Key()->Type() != theKind)
+    if (theStatus != AIS_DS_None
+     && anObjIter.Value()->GraphicStatus() != theStatus)
+    {
+      continue;
+    }
+    else if (anObjIter.Key()->Type() != theKind)
     {
       continue;
     }
@@ -344,26 +349,43 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
                                       const Standard_Integer               theDispMode,
                                       const Standard_Integer               theSelectionMode,
                                       const Standard_Boolean               theToUpdateViewer,
-                                      const Standard_Boolean               theToAllowDecomposition)
+                                      const Standard_Boolean               theToAllowDecomposition,
+                                      const AIS_DisplayStatus              theDispStatus)
 {
   if (theIObj.IsNull())
   {
     return;
   }
 
+  if (theDispStatus == AIS_DS_Erased)
+  {
+    Erase  (theIObj, theToUpdateViewer);
+    Load (theIObj, theSelectionMode, theToAllowDecomposition);
+    return;
+  }
+
   if (!theIObj->HasInteractiveContext())
   {
     theIObj->SetContext (this);
   }
 
-  if (HasOpenedContext())
+  if (theDispStatus == AIS_DS_Temporary
+  && !HasOpenedContext())
   {
-    myLocalContexts (myCurLocalIndex)->Display (theIObj, theDispMode, theToAllowDecomposition, theSelectionMode);
-    if (theToUpdateViewer)
+    return;
+  }
+  else if (HasOpenedContext())
+  {
+    if (theDispStatus == AIS_DS_None
+     || theDispStatus == AIS_DS_Temporary)
     {
-      myMainVwr->Update();
+      myLocalContexts (myCurLocalIndex)->Display (theIObj, theDispMode, theToAllowDecomposition, theSelectionMode);
+      if (theToUpdateViewer)
+      {
+        myMainVwr->Update();
+      }
+      return;
     }
-    return;
   }
 
   if (!myObjects.IsBound (theIObj))
@@ -383,8 +405,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
   else
   {
     Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
-    if (aStatus->GraphicStatus() != AIS_DS_Displayed
-     && aStatus->GraphicStatus() != AIS_DS_Erased)
+    if (aStatus->GraphicStatus() == AIS_DS_Temporary)
     {
       return;
     }
@@ -418,10 +439,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
     }
 
     myMainPM->Display (theIObj, theDispMode);
-    if (aStatus->GraphicStatus() == AIS_DS_Erased)
-    {
-      aStatus->SetGraphicStatus (AIS_DS_Displayed);
-    }
+    aStatus->SetGraphicStatus (AIS_DS_Displayed);
     if (aStatus->IsHilighted())
     {
       const Standard_Integer aHiMod = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode;
@@ -874,14 +892,14 @@ void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject
   {
     if(!myObjects.IsBound(anIObj)) return;
 
-    const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
-    STATUS->SetHilightStatus (Standard_True);
+    const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
+    aStatus->SetHilightStatus (Standard_True);
 
-    if (STATUS->GraphicStatus() == AIS_DS_Displayed)
+    if (aStatus->GraphicStatus() == AIS_DS_Displayed)
     {
-      Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
+      const Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
       myMainPM->Color (anIObj, aCol, aHilightMode);
-      STATUS->SetHilightColor (aCol);
+      aStatus->SetHilightColor (aCol);
     }
   }
   else
@@ -904,11 +922,11 @@ void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIO
   {
     if(!myObjects.IsBound(anIObj)) return;
 
-    const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
-    STATUS->SetHilightStatus (Standard_False);
-    STATUS->SetHilightColor(Quantity_NOC_WHITE);
+    const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
+    aStatus->SetHilightStatus (Standard_False);
+    aStatus->SetHilightColor(Quantity_NOC_WHITE);
 
-    if (STATUS->GraphicStatus() == AIS_DS_Displayed)
+    if (aStatus->GraphicStatus() == AIS_DS_Displayed)
     {
       Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
       myMainPM->Unhighlight (anIObj, aHilightMode);
@@ -1444,12 +1462,12 @@ void AIS_InteractiveContext::SetDisplayMode (const AIS_DisplayMode  theMode,
     aStatus->AddDisplayMode (theMode);
     if (aStatus->GraphicStatus() == AIS_DS_Displayed)
     {
-      myMainPM->SetVisibility (anObj, myDisplayMode, Standard_False);
       myMainPM->Display (anObj, theMode);
       if (aStatus->IsSubIntensityOn())
       {
         myMainPM->Color (anObj, mySubIntensity, theMode);
       }
+      myMainPM->SetVisibility (anObj, myDisplayMode, Standard_False);
     }
   }
 
@@ -2241,35 +2259,39 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t
 
   Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
 
-  Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
-  if (aStatus->GraphicStatus() == AIS_DS_Displayed)
+  const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
+  if (aStatus->GraphicStatus() == AIS_DS_Temporary
+   || aStatus->GraphicStatus() == AIS_DS_Erased)
   {
-    for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
-    {
-      if (myMainPM->IsHighlighted (theIObj, aDispModeIter.Value()))
-      {
-        myMainPM->Unhighlight (theIObj, aDispModeIter.Value());
-      }
-      myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False);
-    }
+    return;
+  }
 
-    if (IsCurrent (theIObj)
-    && !aStatus->IsDModeIn (aDispMode))
+  for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
+  {
+    if (myMainPM->IsHighlighted (theIObj, aDispModeIter.Value()))
     {
-      myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
+      myMainPM->Unhighlight (theIObj, aDispModeIter.Value());
     }
 
-    for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
-    {
-      mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel);
-    }
+    myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False);
+  }
 
-    if (theToUpdateviewer)
-    {
-      myMainVwr->Update();
-    }
+  if (IsCurrent (theIObj)
+  && !aStatus->IsDModeIn (aDispMode))
+  {
+    myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
+  }
+
+  for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
+  {
+    mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel);
   }
   aStatus->SetGraphicStatus (AIS_DS_Erased);
+
+  if (theToUpdateviewer)
+  {
+    myMainVwr->Update();
+  }
 }
 
 //=======================================================================
@@ -2736,17 +2758,7 @@ void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& the
   if (theIObj.IsNull())
     return;
 
-  if (myObjects.IsBound (theIObj))
-  {
-    if (myObjects (theIObj)->GraphicStatus() == AIS_DS_Displayed || myObjects (theIObj)->GraphicStatus() == AIS_DS_Erased)
-    {
-      theIObj->SetZLayer (myMainPM, theLayerId);
-    }
-  }
-  else if (HasOpenedContext())
-  {
-    myLocalContexts (myCurLocalIndex)->SetZLayer (theIObj, theLayerId);
-  }
+  theIObj->SetZLayer (theLayerId);
 }
 
 //=======================================================================
@@ -2755,17 +2767,7 @@ void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& the
 //=======================================================================
 Standard_Integer AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
 {
-  if (theIObj.IsNull())
-    return -1;
-
-  if (myObjects.IsBound (theIObj))
-  {
-    return theIObj->GetZLayer (myMainPM);
-  }
-  else if (HasOpenedContext())
-  {
-    return myLocalContexts (myCurLocalIndex)->GetZLayer (theIObj);
-  }
-
-  return -1;
+  return !theIObj.IsNull()
+       ?  theIObj->ZLayer()
+       :  Graphic3d_ZLayerId_UNKNOWN;
 }
index 1d65dff..bc90fd3 100644 (file)
@@ -416,26 +416,6 @@ is
                        anObject: InteractiveObject from AIS;
                        Prior   : Integer from Standard);
 
-    SetZLayer( me         : mutable;
-               theIObj    : InteractiveObject from AIS;
-               theLayerId : Integer from Standard );
-    ---Purpose: Set Z layer id for interactive object. The layer can be
-    -- specified for displayed object only. The Z layers can be used to display
-    -- temporarily presentations of some object in front of the other objects
-    -- in the scene. The ids for Z layers are generated by V3d_Viewer.
-    -- Note that Z layers differ from under-/overlayer in V3d_View:
-    -- under-/overlayer are intended for specific 2D drawings that appear
-    -- behind/in front of all 3D presentations, while SetZLayer() method
-    -- applies to regular 3D presentations and does not imply any specific
-    -- drawing methods.
-
-    GetZLayer( me;
-               theIObj : InteractiveObject from AIS )
-      returns Integer from Standard;
-    ---Purpose: Get Z layer id set for displayed interactive object.
-    -- If the object doesn't exists in context or has no computed presentations,
-    -- the method returns -1.
-
     DisplayedObjects(me;theMapToFill : in out MapOfTransient from TColStd)
     returns Integer from Standard;
 
index bbad8b4..7fc6208 100644 (file)
@@ -1219,34 +1219,3 @@ Standard_Integer AIS_LocalContext::PixelTolerance() const {
 
   return myMainVS->PixelTolerance();
 }
-
-//=======================================================================
-//function : SetZLayer
-//purpose  :
-//=======================================================================
-
-void AIS_LocalContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
-                                  const Standard_Integer theLayerId)
-{
-  if (!myActiveObjects.IsBound (theIObj)) 
-    return;
-
-  const Handle(AIS_LocalStatus)& aStatus = myActiveObjects (theIObj);
-  if (aStatus->DisplayMode () == -1)
-    return;
-
-  theIObj->SetZLayer (myMainPM, theLayerId);
-}
-
-//=======================================================================
-//function : GetZLayer
-//purpose  : 
-//=======================================================================
-
-Standard_Integer AIS_LocalContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
-{
-  if (!myActiveObjects.IsBound (theIObj)) 
-    return -1;
-
-  return theIObj->GetZLayer (myMainPM);
-}
index 96a87af..272a3bd 100755 (executable)
@@ -19,7 +19,6 @@ Graphic3d_CBitFields8.hxx
 Graphic3d_CBitFields4.hxx
 Graphic3d_CTexture.hxx
 Graphic3d_CLight.hxx
-Graphic3d_CPick.hxx
 Graphic3d_CUserDraw.hxx
 Graphic3d_CView.hxx
 Graphic3d_CGraduatedTrihedron.hxx
@@ -35,6 +34,8 @@ Graphic3d_ShaderVariable.lxx
 Graphic3d_ShaderObject_Handle.hxx
 Graphic3d_ShaderProgram_Handle.hxx
 Graphic3d_ShaderVariable_Handle.hxx
+Graphic3d_MapOfStructure.hxx
+Graphic3d_MapIteratorOfMapOfStructure.hxx
 Graphic3d_TypeOfShaderObject.hxx
 Graphic3d_DataStructure.pxx
 Graphic3d_StructureManager.pxx
@@ -53,6 +54,7 @@ Graphic3d_Vec3.hxx
 Graphic3d_Vec4.hxx
 Graphic3d_Mat4.hxx
 Graphic3d_Mat4d.hxx
+Graphic3d_ZLayerId.hxx
 Graphic3d_ZLayerSettings.hxx
 Graphic3d_Vertex.hxx
 Graphic3d_Vertex.cxx
index 64ffa52..5acd620 100644 (file)
@@ -388,9 +388,6 @@ is
     imported CLight;
     ---Category: Imported types
 
-    imported CPick;
-    ---Category: Imported types
-
     imported CPlane;
     ---Category: Imported types
 
@@ -428,7 +425,8 @@ is
     imported  Mat4;
     imported  Mat4d;
 
-    imported ZLayerSettings;
+    imported  ZLayerSettings;
+    primitive ZLayerId;
 
     --------------------
     -- Category: Classes
@@ -493,20 +491,15 @@ is
     imported Vertex;
     ---Category: Classes
 
+    imported MapOfStructure;
+    imported SequenceOfDisplayedStructures;
+
     ---------------------------------
     -- Category: Instantiated classes
     ---------------------------------
 
     imported SequenceOfGroup;
 
-    ---Category: Instantiated classes
-
-    class MapOfStructure instantiates
-            Map from TCollection (Structure from Graphic3d,MapTransientHasher from TColStd);
-
-
-    ---Category: Instantiated classes
-
     class SequenceOfStructure instantiates
             Sequence from TCollection
             (Structure from Graphic3d);
diff --git a/src/Graphic3d/Graphic3d_CPick.hxx b/src/Graphic3d/Graphic3d_CPick.hxx
deleted file mode 100644 (file)
index 7f51502..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-// 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.
-
-/*============================================================================*/
-/*==== Titre: Graphic3d_CPick.hxx                                            */
-/*==== Role : The header file of primitive type "CPick" from Graphic3d       */
-/*====                                                                       */
-/*==== Implementation:  This is a primitive type implemented with typedef     */
-/*============================================================================*/
-
-#ifndef _Graphic3d_CPick_HeaderFile
-#define _Graphic3d_CPick_HeaderFile
-
-#include <InterfaceGraphic_Graphic3d.hxx>
-#include <InterfaceGraphic_Visual3d.hxx>
-typedef CALL_DEF_PICK Graphic3d_CPick;
-
-#endif /*Graphic3d_CPick_HeaderFile*/
index 5f71832..36343c0 100644 (file)
@@ -27,6 +27,7 @@ IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_CStructure, Standard_Transient)
 //=============================================================================
 Graphic3d_CStructure::Graphic3d_CStructure (const Handle(Graphic3d_StructureManager)& theManager)
 : Id               (theManager->NewIdentification()),
+  myZLayer         (Graphic3d_ZLayerId_Default),
   Priority         (Structure_MAX_PRIORITY / 2),
   PreviousPriority (Structure_MAX_PRIORITY / 2),
   Composition      (Graphic3d_TOC_REPLACE),
@@ -35,7 +36,6 @@ Graphic3d_CStructure::Graphic3d_CStructure (const Handle(Graphic3d_StructureMana
   stick            (0),
   highlight        (0),
   visible          (1),
-  pick             (1),
   HLRValidation    (0),
   IsForHighlight   (Standard_False),
   IsMutable        (Standard_False),
index 92fd2ff..d69510b 100644 (file)
@@ -22,6 +22,7 @@
 #include <Graphic3d_SequenceOfHClipPlane.hxx>
 #include <Graphic3d_TypeOfComposition.hxx>
 #include <Graphic3d_Vec3.hxx>
+#include <Graphic3d_ZLayerId.hxx>
 #include <Standard_Transient.hxx>
 #include <Handle_Graphic3d_GraphicDriver.hxx>
 
@@ -67,10 +68,19 @@ public:
     return myBndBox;
   }
 
+  //! Return structure visibility flag
+  bool IsVisible() const { return visible != 0; }
+
+  //! Set z layer ID to display the structure in specified layer
+  void SetZLayer (const Graphic3d_ZLayerId theLayerIndex) { myZLayer = theLayerIndex; }
+
+  //! Get z layer ID
+  Graphic3d_ZLayerId ZLayer() const { return myZLayer; }
+
 public:
 
   //! Update structure visibility state
-  virtual void UpdateNamedStatus() = 0;
+  virtual void OnVisibilityChanged() = 0;
 
   //! Clear graphic data
   virtual void Clear() = 0;
@@ -106,9 +116,10 @@ public:
 
 public:
 
-  int   Id;
-  int   Priority;
-  int   PreviousPriority;
+  int                      Id;
+  Graphic3d_ZLayerId       myZLayer;
+  int                      Priority;
+  int                      PreviousPriority;
 
   CALL_DEF_CONTEXTLINE     ContextLine;
   CALL_DEF_CONTEXTFILLAREA ContextFillArea;
@@ -123,10 +134,9 @@ public:
   int   ContainsFacet;
 
   unsigned IsInfinite     : 1;
-  unsigned stick          : 1;
+  unsigned stick          : 1; //!< displaying state - should be set when structure has been added to scene graph (but can be in hidden state)
   unsigned highlight      : 1;
-  unsigned visible        : 1;
-  unsigned pick           : 1;
+  unsigned visible        : 1; //!< visibility flag - can be used to suppress structure while leaving it in the scene graph
   unsigned HLRValidation  : 1;
   unsigned IsForHighlight : 1;
   unsigned IsMutable      : 1;
index 1145d25..eb31bcb 100644 (file)
@@ -50,6 +50,7 @@ uses
     PrintAlgo           from Aspect,
     DisplayConnection_Handle from Aspect,
 
+    ZLayerId            from Graphic3d,
     ZLayerSettings      from Graphic3d,
 
     AspectLine3d        from Graphic3d,
@@ -60,7 +61,6 @@ uses
     CBitFields20        from Graphic3d,
     Group               from Graphic3d,
     CLight              from Graphic3d,
-    CPick               from Graphic3d,
     CPlane              from Graphic3d,
     CStructure          from Graphic3d,
     CStructure_Handle   from Graphic3d,
@@ -123,16 +123,16 @@ is
     -- Category: Structure management methods
     -----------------------------------------
 
-    DisplayStructure ( me            : mutable;
-                       theCView      : CView from Graphic3d;
-                       theCStructure : in out CStructure from Graphic3d;
-                       thePriority   : Integer from Standard )
+    DisplayStructure ( me           : mutable;
+                       theCView     : CView from Graphic3d;
+                       theStructure : Structure from Graphic3d;
+                       thePriority  : Integer from Standard )
         is deferred;
     ---Purpose: call_togl_displaystructure
 
-    EraseStructure ( me            : mutable;
-                     theCView      : CView from Graphic3d;
-                     theCStructure : in out CStructure from Graphic3d )
+    EraseStructure ( me           : mutable;
+                     theCView     : CView from Graphic3d;
+                     theStructure : Structure from Graphic3d )
         is deferred;
     ---Purpose: call_togl_erasestructure
 
@@ -369,9 +369,9 @@ is
     --    But it works in any case and is especially useful for view dump because the dump image is read from the back buffer.
     -- @return previous mode.
 
-    DisplayImmediateStructure ( me            : mutable;
-                                theCView      : CView      from Graphic3d;
-                                theCStructure : CStructure from Graphic3d )
+    DisplayImmediateStructure ( me           : mutable;
+                                theCView     : CView      from Graphic3d;
+                                theStructure : Structure from Graphic3d )
     is deferred;
     ---Purpose: Display structure in immediate mode on top of general presentation
 
@@ -629,7 +629,7 @@ is
 
     AddZLayer( me         : mutable;
                theCView   : CView from Graphic3d;
-               theLayerId : Integer from Standard )
+               theLayerId : ZLayerId from Graphic3d )
         is deferred;
         ---Purpose: Add a new top-level z layer with ID <theLayerId> for
         -- the view. Z layers allow drawing structures in higher layers
@@ -639,7 +639,7 @@ is
 
     RemoveZLayer( me         : mutable;
                   theCView   : CView from Graphic3d;
-                  theLayerId : Integer from Standard )
+                  theLayerId : ZLayerId from Graphic3d )
         is deferred;
         ---Purpose: Remove Z layer from the specified view. All structures
         -- displayed at the moment in layer will be displayed in default layer
@@ -647,7 +647,7 @@ is
         -- structures use method UnsetZLayer (...).
 
     UnsetZLayer( me         : mutable;
-                 theLayerId : Integer from Standard ) 
+                 theLayerId : ZLayerId from Graphic3d )
         is deferred;
         ---Purpose: Unset Z layer ID for all structures. The structure
         -- indexes will be set to default layer ( the bottom-level z layer
@@ -655,27 +655,14 @@ is
 
     ChangeZLayer( me            : mutable;
                   theCStructure : CStructure from Graphic3d;
-                  theLayerId    : Integer from Standard )
-        is deferred;
-        ---Purpose: Change Z layer of a structure. The new z layer ID will
-        -- be used to define the associated layer for structure on display.
-
-    ChangeZLayer( me            : mutable;
-                  theCStructure : CStructure from Graphic3d;
                   theCView      : CView from Graphic3d;
-                  theNewLayerId : Integer from Standard )
+                  theNewLayerId : ZLayerId from Graphic3d )
         is deferred;
         ---Purpose: Change Z layer of a structure already presented in view.
 
-    GetZLayer( me;
-               theCStructure : CStructure from Graphic3d )
-        returns Integer from Standard is deferred;
-        ---Purpose: Get Z layer ID of structure. If the structure doesn't
-        -- exists in graphic driver, the method returns -1.
-
     SetZLayerSettings( me          : mutable;
                        theCView    : CView from Graphic3d;
-                       theLayerId  : Integer from Standard;
+                       theLayerId  : ZLayerId from Graphic3d;
                        theSettings : ZLayerSettings from Graphic3d)
         is deferred;
         ---Purpose:  Sets the settings for a single Z layer of specified view.
@@ -700,10 +687,6 @@ is
                   ACLight   : CLight from Graphic3d;
                   AField    : Integer from Standard );
 
-    PrintCPick ( me;
-                 ACPick    : CPick from Graphic3d;
-                 AField    : Integer from Standard );
-
     PrintCStructure ( me;
                       ACStructure   : CStructure from Graphic3d;
                       AField    : Integer from Standard );
index 5e418e5..eaa83ba 100644 (file)
@@ -60,18 +60,6 @@ void Graphic3d_GraphicDriver::PrintCLight (const Graphic3d_CLight& theCLight,
   }
 }
 
-void Graphic3d_GraphicDriver::PrintCPick (const Graphic3d_CPick& ACPick, const Standard_Integer AField) const {
-
-  if (AField) {
-    cout << "\tws id " << ACPick.WsId
-      << " view id " << ACPick.ViewId << "\n";
-    cout << "\twindow id " << ACPick.DefWindow.XWindow << "\n";
-    cout << "\tposition " << ACPick.x << " , " << ACPick.y << "\n";
-    cout << flush;
-  }
-
-}
-
 void Graphic3d_GraphicDriver::PrintCStructure (const Graphic3d_CStructure& ACStructure, const Standard_Integer AField) const {
 
   if (AField) {
diff --git a/src/Graphic3d/Graphic3d_MapIteratorOfMapOfStructure.hxx b/src/Graphic3d/Graphic3d_MapIteratorOfMapOfStructure.hxx
new file mode 100644 (file)
index 0000000..65368a5
--- /dev/null
@@ -0,0 +1,23 @@
+// Created on: 2014-12-18
+// Created by: Kirill Gavrilov
+// Copyright (c) 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.
+
+#ifndef _Graphic3d_MapIteratorOfMapOfStructure
+#define _Graphic3d_MapIteratorOfMapOfStructure
+
+#include <Graphic3d_MapOfStructure.hxx>
+
+typedef Graphic3d_MapOfStructure::Iterator Graphic3d_MapIteratorOfMapOfStructure;
+
+#endif // _Graphic3d_MapIteratorOfMapOfStructure
diff --git a/src/Graphic3d/Graphic3d_MapOfStructure.hxx b/src/Graphic3d/Graphic3d_MapOfStructure.hxx
new file mode 100644 (file)
index 0000000..6c8b230
--- /dev/null
@@ -0,0 +1,24 @@
+// Created on: 2014-12-18
+// Created by: Kirill Gavrilov
+// Copyright (c) 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.
+
+#ifndef _Graphic3d_MapOfStructure
+#define _Graphic3d_MapOfStructure
+
+#include <Handle_Graphic3d_Structure.hxx>
+#include <NCollection_Map.hxx>
+
+typedef NCollection_Map<Handle(Graphic3d_Structure)> Graphic3d_MapOfStructure;
+
+#endif // _Graphic3d_MapOfStructure
index 46e1f86..194e568 100644 (file)
@@ -70,6 +70,7 @@ uses
        Vector                  from Graphic3d,
        Vertex                  from Graphic3d,
        TransModeFlags          from Graphic3d,
+  ZLayerId from Graphic3d,
        Pnt                     from gp,
     SequenceOfHClipPlane from Graphic3d,
     BndBox4f from Graphic3d,
@@ -149,31 +150,10 @@ is
        ---Category: Methods to modify the class definition
        ---C++: alias ~
 
-       Display ( me    : mutable )
-               is virtual;
-       ---Level: Public
-       ---Purpose: Displays the structure <me> in all the views of
-       --          the visualiser.
-       ---Category: Methods to modify the class definition
-
-       Display ( me            : mutable;
-                 Priority      : Integer from Standard )
-       ---Level: Public
-       ---Purpose: Displays the structure <me> in all the views of
-       --          the visualiser, while modifying its current priority.
-       --          Note: Display Priorities
-       --          Structure display priorities control the order in which
-       --          structures are redrawn.   When you display a
-       --          structure, you specify its priority. The lower the value,
-       --          the lower the display priority. When the display is
-       --          regenerated, the structures with the lowest priority
-       --          are drawn first. For structures with the same display
-       --          priority, the order in which they were displayed
-       --          determines the drawing order. Open CASCADE
-       --          supports 11 structure display priorities, 0 to 10.
-       --          Warning: Raises PriorityDefinitionError if <Priority> is
-       --          greater than 10 or a negative value.
-       raises PriorityDefinitionError from Graphic3d is static;
+  Display ( me : mutable )
+  is virtual;
+  ---Level: Public
+  ---Purpose: Displays the structure <me> in all the views of the visualiser.
 
        DisplayPriority ( me )
                returns Integer from Standard
@@ -190,20 +170,15 @@ is
        --          of the visualiser.
        ---Category: Methods to modify the class definition
 
-       Highlight ( me          : mutable;
-                   Method      : TypeOfHighlightMethod from Aspect )
+  Highlight ( me : mutable;
+              theMethod : TypeOfHighlightMethod from Aspect;
+              theColor  : Color                 from Quantity;
+              theToUpdateMgr : Boolean from Standard = Standard_True)
                is static;
        ---Level: Public
-       ---Purpose: Highlights the structure <me> in all the
-       --          views of the visualiser, using the following methods:
-       --
-       --   TOHM_COLOR         = drawn in the highlight color
-       --                                (default white)
-       --          TOHM_BLINK          = blinking
-       --   TOHM_BOUNDBOX      = enclosed by the boundary box
-       --                                (default white)
-       --
-       ---Category: Methods to modify the class definition
+       ---Purpose: Highlights the structure <me> in all the views of the visualiser, using the following methods:
+       --  TOHM_COLOR    = drawn in the highlight color
+       --  TOHM_BOUNDBOX = enclosed by the boundary box
 
        Remove ( me     : mutable )
                is static;
@@ -219,14 +194,6 @@ is
        ---Purpose: Computes axis-aligned bounding box of a structure.
        --  Category: Methods to modify the class definition
 
-       SetHighlightColor ( me          : mutable;
-                           AColor      : Color from Quantity )
-               is static;
-       ---Level: Public
-       ---Purpose: Modifies the highlight color for the Highlight method
-       --          with the highlight method TOHM_COLOR or TOHM_BOUNDBOX.
-       ---Category: Methods to modify the class definition
-
     SetInfiniteState (me : mutable; theToSet : Boolean from Standard) is static;
     ---Level: Internal
     ---Purpose: If <theToSet> is Standard_True then <me> is infinite and
@@ -264,7 +231,7 @@ is
        --          previous priority.
         
         SetZLayer ( me         : mutable;
-                    theLayerId : Integer from Standard )
+                    theLayerId : ZLayerId from Graphic3d )
            is static;
         ---Purpose: Set Z layer ID for the structure. The Z layer mechanism
         -- allows to display structures presented in higher layers in overlay
@@ -272,7 +239,7 @@ is
         -- test between layers
 
         GetZLayer ( me )
-          returns Integer from Standard is static;
+          returns ZLayerId from Graphic3d is static;
         ---Purpose: Get Z layer ID of displayed structure. The method
         -- returns -1 if the structure has no ID (deleted from graphic driver).
 
@@ -285,16 +252,6 @@ is
     ---Purpose: Get clip planes slicing the structure on rendering.
     -- @return set of clip planes.
 
-       SetPick ( me            : mutable;
-                 AValue        : Boolean from Standard )
-               is static;
-       ---Level: Public
-       ---Purpose: Modifies the detectability indicator to Standard_True
-       --          or Standard_False for the structure <me>.
-       --          The default value at the definition of <me> is
-       --          Standard_True.
-       ---Category: Methods to modify the class definition
-
        SetPrimitivesAspect ( me        : mutable;
                              CTX       : AspectLine3d from Graphic3d )
                is static;
@@ -532,13 +489,6 @@ is
        ---Purpose: Returns the highlight indicator for the structure <me>.
        ---Category: Inquire methods
 
-       IsSelectable ( me )
-               returns Boolean from Standard
-               is static;
-       ---Level: Public
-       ---Purpose: Returns the detectability indicator for the structure <me>.
-       ---Category: Inquire methods
-
        IsRotated ( me )
                returns Boolean from Standard
                is static;
index 92a4250..1929d1b 100644 (file)
@@ -203,7 +203,11 @@ void Graphic3d_Structure::Display()
     myStructureManager->Display (this);
   }
 
-  myCStructure->visible = 1;
+  if (myCStructure->visible != 1)
+  {
+    myCStructure->visible = 1;
+    myCStructure->OnVisibilityChanged();
+  }
 }
 
 //=============================================================================
@@ -216,25 +220,6 @@ void Graphic3d_Structure::SetIsForHighlight (const Standard_Boolean isForHighlig
 }
 
 //=============================================================================
-//function : Display
-//purpose  :
-//=============================================================================
-void Graphic3d_Structure::Display (const Standard_Integer thePriority)
-{
-  if (IsDeleted()) return;
-
-  SetDisplayPriority (thePriority);
-
-  if (!myCStructure->stick)
-  {
-    myCStructure->stick = 1;
-    myStructureManager->Display (this);
-  }
-
-  myCStructure->visible = 1;
-}
-
-//=============================================================================
 //function : SetDisplayPriority
 //purpose  :
 //=============================================================================
@@ -312,13 +297,17 @@ void Graphic3d_Structure::Erase()
 //function : Highlight
 //purpose  :
 //=============================================================================
-void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMethod)
+void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMethod,
+                                     const Quantity_Color&              theColor,
+                                     const Standard_Boolean             theToUpdateMgr)
 {
   if (IsDeleted())
   {
     return;
   }
 
+  myHighlightColor = theColor;
+
   // Highlight on already Highlighted structure.
   if (myCStructure->highlight)
   {
@@ -340,47 +329,18 @@ void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMetho
   SetDisplayPriority (Structure_MAX_PRIORITY - 1);
 
   GraphicHighlight (theMethod);
-  if (myCStructure->stick)
-  {
-    myStructureManager->Highlight (this, theMethod);
-  }
 
-  Update();
-}
-
-//=============================================================================
-//function : SetHighlightColor
-//purpose  :
-//=============================================================================
-void Graphic3d_Structure::SetHighlightColor (const Quantity_Color& theColor)
-{
-  if (IsDeleted())
+  if (!theToUpdateMgr)
   {
     return;
   }
 
-  if (!myCStructure->highlight)
+  if (myCStructure->stick)
   {
-    myHighlightColor = theColor;
-    return;
+    myStructureManager->Highlight (this, theMethod);
   }
 
-  // Change highlight color on already Highlighted structure.
-  Aspect_TypeOfUpdate anUpdateMode  = myStructureManager->UpdateMode();
-  if (anUpdateMode == Aspect_TOU_WAIT)
-  {
-    UnHighlight();
-  }
-  else
-  {
-    // To avoid call of method : Update()
-    // Not useful and can be costly.
-    myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
-    UnHighlight();
-    myStructureManager->SetUpdateMode (anUpdateMode);
-  }
-  myHighlightColor = theColor;
-  Highlight (myHighlightMethod);
+  Update();
 }
 
 //=============================================================================
@@ -391,30 +351,14 @@ void Graphic3d_Structure::SetVisible (const Standard_Boolean theValue)
 {
   if (IsDeleted()) return;
 
-  myCStructure->visible = theValue ? 1 : 0;
-  myCStructure->UpdateNamedStatus();
-  Update();
-}
-
-//=============================================================================
-//function : SetPick
-//purpose  :
-//=============================================================================
-void Graphic3d_Structure::SetPick (const Standard_Boolean theValue)
-{
-  if (IsDeleted ()) return;
-
-  myCStructure->pick = theValue ? 1 : 0;
-  myCStructure->UpdateNamedStatus();
-
-  if (theValue)
+  const unsigned isVisible = theValue ? 1 : 0;
+  if (myCStructure->visible == isVisible)
   {
-    myStructureManager->Detectable (this);
-  }
-  else
-  {
-    myStructureManager->Undetectable (this);
+    return;
   }
+
+  myCStructure->visible = isVisible;
+  myCStructure->OnVisibilityChanged();
   Update();
 }
 
@@ -475,15 +419,6 @@ Standard_Boolean Graphic3d_Structure::IsHighlighted() const
 }
 
 //=============================================================================
-//function : IsSelectable
-//purpose  :
-//=============================================================================
-Standard_Boolean Graphic3d_Structure::IsSelectable() const
-{
-  return myCStructure->pick ? Standard_True : Standard_False;
-}
-
-//=============================================================================
 //function : IsVisible
 //purpose  :
 //=============================================================================
@@ -2281,7 +2216,6 @@ void Graphic3d_Structure::GraphicHighlight (const Aspect_TypeOfHighlightMethod t
     {
       myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
       myCStructure->HighlightWithColor (Graphic3d_Vec3 (float (anRGB[0]), float (anRGB[1]), float (anRGB[2])), Standard_True);
-      myCStructure->UpdateNamedStatus();
       break;
     }
     case Aspect_TOHM_BOUNDBOX:
@@ -2323,11 +2257,9 @@ void Graphic3d_Structure::GraphicUnHighlight()
   {
     case Aspect_TOHM_COLOR:
       myCStructure->HighlightWithColor (Graphic3d_Vec3 (0.0f, 0.0f, 0.0f), Standard_False);
-      myCStructure->UpdateNamedStatus();
       break;
     case Aspect_TOHM_BOUNDBOX:
       myCStructure->HighlightWithBndBox (this, Standard_False);
-      myCStructure->UpdateNamedStatus();
       break;
   }
 }
@@ -2381,22 +2313,23 @@ Standard_Boolean Graphic3d_Structure::HLRValidation() const
 //function : SetZLayer
 //purpose  :
 //=======================================================================
-void Graphic3d_Structure::SetZLayer (const Standard_Integer theLayerId)
+void Graphic3d_Structure::SetZLayer (const Graphic3d_ZLayerId theLayerId)
 {
   // if the structure is not displayed, unable to change its display layer
   if (IsDeleted ())
     return;
 
   myStructureManager->ChangeZLayer (this, theLayerId);
+  myCStructure->SetZLayer (theLayerId);
 }
 
 //=======================================================================
 //function : GetZLayer
 //purpose  :
 //=======================================================================
-Standard_Integer Graphic3d_Structure::GetZLayer () const
+Graphic3d_ZLayerId Graphic3d_Structure::GetZLayer() const
 {
-  return myStructureManager->GetZLayer (this);
+  return myCStructure->ZLayer();
 }
 
 //=======================================================================
index f800563..14516cf 100644 (file)
@@ -26,7 +26,7 @@ deferred class StructureManager from Graphic3d inherits TShared
        --          It allows them to be globally manipulated.
        --          It defines the global attributes.
        --  Keywords: Structure, Structure Manager, Update Mode,
-       --     Destroy, Highlight, Visible, Detectable
+       --     Destroy, Highlight, Visible
 
        ---Warning:
        ---References:
@@ -40,6 +40,7 @@ uses
        TypeOfHighlightMethod   from Aspect,
        TypeOfUpdate            from Aspect,
 
+  ZLayerId            from Graphic3d,
        ZLayerSettings      from Graphic3d,
 
        DataStructureManager    from Graphic3d,
@@ -193,13 +194,6 @@ is
        --          in a visualiser <me>.
        ---Category: Inquire methods, MapOfStructure
 
-       PickStructures ( me; SG: in out MapOfStructure from Graphic3d )
-               is static;
-       ---Level: Internal
-       ---Purpose: Returns the set of detectable structures
-       --          in a visualiser <me>.
-       ---Category: Inquire methods, MapOfStructure
-
        ----------------------------
        -- Category: Inquire methods
        ----------------------------
@@ -274,31 +268,25 @@ is
 
         ChangeZLayer ( me           : mutable;
                        theStructure : Structure from Graphic3d;
-                       theLayerId   : Integer from Standard )
+                       theLayerId   : ZLayerId  from Graphic3d )
            is deferred;
         ---Purpose: Change Z layer for structure. The z layer mechanism allows
         -- to display structures in higher layers in overlay of structures in
         -- lower layers.
 
-        GetZLayer ( me;
-                    theStructure : Structure from Graphic3d )
-           returns Integer from Standard is deferred;
-        ---Purpose: Get Z layer ID assigned to structure. If the structure
-        -- has no layer ID (deleted from graphic driver), the method returns -1.
-
         SetZLayerSettings ( me          : mutable;
-                            theLayerId  : Integer from Standard;
+                            theLayerId  : ZLayerId       from Graphic3d;
                             theSettings : ZLayerSettings from Graphic3d )
           is deferred;
         ---Purpose: Sets the settings for a single Z layer for all managed views.
 
         ZLayerSettings ( me          : mutable;
-                         theLayerId  : Integer from Standard )
+                         theLayerId  : ZLayerId from Graphic3d )
           returns ZLayerSettings from Graphic3d is deferred;
         ---Purpose: Returns the settings of a single Z layer.
         
         AddZLayer ( me : mutable;
-                    theLayerId : in out Integer from Standard )
+                    theLayerId : out ZLayerId from Graphic3d )
            returns Boolean from Standard is deferred;
         ---Purpose: Add a new top-level Z layer and get its ID as
         -- <theLayerId> value. The method returns Standard_False if the layer
@@ -306,7 +294,7 @@ is
         -- structures in higher layers in overlay of structures in lower layers.
 
         RemoveZLayer ( me : mutable;
-                       theLayerId : Integer from Standard )
+                       theLayerId : ZLayerId from Graphic3d )
            returns Boolean from Standard is deferred;
         ---Purpose: Remove Z layer with ID <theLayerId>. Method returns
         -- Standard_False if the layer can not be removed or doesn't exists.
@@ -343,13 +331,6 @@ is
        --          if <AStructure> is displayed in <AProjector> and TOS_COMPUTED.
        ---Category: Private methods
 
-       Detectable ( me         : mutable;
-                    AStructure : Structure from Graphic3d )
-               is static private;
-       ---Level: Internal
-       ---Purpose: Sets detectable the structure <AStructure>.
-       ---Category: Private methods
-
        Clear ( me              : mutable;
                AStructure      : Structure from Graphic3d;
                WithDestruction : Boolean from Standard )
@@ -441,13 +422,6 @@ is
        ---Purpose: Frees the identifieur <AnId>.
        ---Category: Private methods
 
-       Undetectable ( me               : mutable;
-                      AStructure       : Structure from Graphic3d )
-               is static private;
-       ---Level: Internal
-       ---Purpose: Sets no detectable the structure <AStructure>.
-       ---Category: Private methods
-
        UnHighlight ( me                : mutable )
                is deferred;
        ---Level: Internal
@@ -504,10 +478,6 @@ fields
        MyHighlightedStructure  :       MapOfStructure from Graphic3d
                                                                is protected;
 
-       -- the pickable structures
-       MyPickStructure         :       MapOfStructure from Graphic3d
-                                                               is protected;
-
        -- the structure identifier generator
        MyStructGenId           :       GenId from Aspect is protected;
 
index 8c7a92b..02abb50 100644 (file)
@@ -39,40 +39,8 @@ static Standard_Integer StructureManager_CurrentId = 0;
 #include <Graphic3d_Structure.pxx>
 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
 
-//-Aliases
-
-//-Global data definitions
-
-//      -- l'identifieur du manager
-//      MyId                    :       Standard_Integer;
-
-//      -- le mode de mise a jour de l'affichage
-//      MyUpdateMode            :       TypeOfUpdate;
-
-//      -- les differents contextes de primitives
-//      MyAspectLine3d          :       AspectLine3d;
-//      MyAspectText3d          :       AspectText3d;
-//      MyAspectMarker3d        :       AspectMarker3d;
-//      MyAspectFillArea3d      :       AspectFillArea3d;
-
-//      -- les structures affichees
-//      MyDisplayedStructure    :       SequenceOfStructure;
-
-//      -- les structures mises en evidence
-//      MyHighlightedStructure  :       SequenceOfStructure;
-
-//      -- les structures detectables
-//      MyPickStructure         :       SequenceOfStructure;
-
-//      -- le generateur d'identificateurs de structures
-//      MyStructGenId           :       GenId;
-
-//-Constructors
-
-Graphic3d_StructureManager::Graphic3d_StructureManager (const Handle(Graphic3d_GraphicDriver)& theDriver):
-MyDisplayedStructure (),
-MyHighlightedStructure (),
-MyPickStructure () {
+Graphic3d_StructureManager::Graphic3d_StructureManager (const Handle(Graphic3d_GraphicDriver)& theDriver)
+{
 
 Standard_Real Coef;
 Standard_Integer i;
@@ -136,7 +104,6 @@ void Graphic3d_StructureManager::Destroy () {
 
         MyDisplayedStructure.Clear ();
         MyHighlightedStructure.Clear ();
-        MyPickStructure.Clear ();
         StructureManager_ArrayId[MyId]  = 0;
 
 }
@@ -222,18 +189,6 @@ void Graphic3d_StructureManager::Remove (const Standard_Integer AnId) {
 
 }
 
-void Graphic3d_StructureManager::Detectable (const Handle(Graphic3d_Structure)& AStructure) {
-
-  MyPickStructure.Add(AStructure);
-
-}
-
-void Graphic3d_StructureManager::Undetectable (const Handle(Graphic3d_Structure)& AStructure) {
-
-  MyPickStructure.Remove(AStructure);
-}
-
 void Graphic3d_StructureManager::DisplayedStructures (Graphic3d_MapOfStructure& SG) const {
 
   SG.Assign(MyDisplayedStructure);
@@ -265,12 +220,6 @@ void Graphic3d_StructureManager::HighlightedStructures (Graphic3d_MapOfStructure
 
 }
 
-void Graphic3d_StructureManager::PickStructures (Graphic3d_MapOfStructure& SG) const {
-
-  SG.Assign(MyPickStructure);
-
-}
-
 Standard_Integer Graphic3d_StructureManager::NewIdentification () {
 
 Standard_Integer Id     = MyStructGenId.Next ();
diff --git a/src/Graphic3d/Graphic3d_ZLayerId.hxx b/src/Graphic3d/Graphic3d_ZLayerId.hxx
new file mode 100644 (file)
index 0000000..8eb3528
--- /dev/null
@@ -0,0 +1,33 @@
+// Created on: 2014-12-30
+// Created by: Kirill Gavrilov
+// Copyright (c) 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.
+
+#ifndef _Graphic3d_ZLayerId_HeaderFile
+#define _Graphic3d_ZLayerId_HeaderFile
+
+typedef Standard_Integer Graphic3d_ZLayerId;
+
+//! This enumeration defines the list of predefined layers, which can not be removed (but settings can be overridden).
+//! Custom layers might be added with positive index (>= 1) if standard list is insufficient for application needs;
+//! these layers will be displayed on top of predefined ones.
+enum
+{
+  Graphic3d_ZLayerId_UNKNOWN = -1, //!< identifier for invalid ZLayer
+  Graphic3d_ZLayerId_Default =  0, //!< default Z-layer for main presentations
+  Graphic3d_ZLayerId_Top     = -2, //!< overlay for 3D presentations which inherits Depth from previous ZLayer
+  Graphic3d_ZLayerId_Topmost = -3, //!< overlay for 3D presentations with independent Depth
+  Graphic3d_ZLayerId_TopOSD  = -4  //!< overlay for 2D presentations (On-Screen-Display)
+};
+
+#endif // _Graphic3d_ZLayerId_HeaderFile
index 4c3266c..4bb963a 100644 (file)
@@ -24,14 +24,18 @@ enum Graphic3d_ZLayerSetting
   Graphic3d_ZLayerDepthOffset = 8
 };
 
+//! Structure defines list of ZLayer properties.
 struct Graphic3d_ZLayerSettings
 {
+
+  //! Default settings.
   Graphic3d_ZLayerSettings()
     : DepthOffsetFactor (1.0f),
       DepthOffsetUnits  (1.0f),
       Flags (Graphic3d_ZLayerDepthTest
            | Graphic3d_ZLayerDepthWrite
-           | Graphic3d_ZLayerDepthClear)
+           | Graphic3d_ZLayerDepthClear),
+      IsImmediate (false)
   {}
 
   //! Returns true if theSetting is enabled.
@@ -70,10 +74,13 @@ struct Graphic3d_ZLayerSettings
     EnableSetting (Graphic3d_ZLayerDepthOffset);
   }
 
-  Standard_ShortReal DepthOffsetFactor; //!< Factor argument value for OpenGl glPolygonOffset function.
-  Standard_ShortReal DepthOffsetUnits;  //!< Units argument value for OpenGl glPolygonOffset function.
+public:
+
+  Standard_ShortReal DepthOffsetFactor; //!< factor argument value for OpenGl glPolygonOffset function
+  Standard_ShortReal DepthOffsetUnits;  //!< units  argument value for OpenGl glPolygonOffset function
+  Standard_Integer   Flags;             //!< storage field for settings
+  bool               IsImmediate;       //!< immediate layer will be drawn after all normal layers
 
-  Standard_Integer Flags; //!< Storage field for settings.
 };
 
 #endif // _Graphic3d_ZLayerSettings_HeaderFile
index 6cac4a0..240a8fe 100644 (file)
@@ -71,30 +71,4 @@ typedef struct {
 
 } CALL_DEF_VIEWMAPPING;
 
-/* REPERAGE */
-
-typedef struct {
-
-       int WsId;
-       int ViewId;
-
-       int x, y;
-
-       CALL_DEF_WINDOW DefWindow;
-
-       struct {
-               float aperture;
-               int order;
-               int depth;
-       } Context;
-
-       struct {
-               int depth;
-               int *listid;
-               int *listpickid;
-               int *listelem;
-       } Pick;
-
-} CALL_DEF_PICK;
-
 #endif /* InterfaceGraphic_Visual3dHeader */
index 77f0948..be3e8c3 100755 (executable)
@@ -60,8 +60,6 @@ Handle_OpenGl_Window.hxx
 OpenGl_Window.hxx
 OpenGl_Window.cxx
 OpenGl_Window_1.mm
-OpenGl_PriorityList.hxx
-OpenGl_PriorityList.cxx
 OpenGl_AVIWriter.hxx
 OpenGl_AVIWriter.cxx
 OpenGl_FrameBuffer.hxx
@@ -141,6 +139,7 @@ OpenGl_ShaderManager.hxx
 OpenGl_ShaderManager.cxx
 OpenGl_ShaderStates.hxx
 OpenGl_ShaderStates.cxx
+OpenGl_SequenceOfStructure.hxx
 Handle_OpenGl_ShaderObject.hxx
 Handle_OpenGl_ShaderProgram.hxx
 Handle_OpenGl_ShaderManager.hxx
index 4f3b9e8..cda8413 100644 (file)
@@ -81,11 +81,9 @@ void OpenGl_BVHClipPrimitiveSet::Assign (const OpenGl_ArrayOfStructure& theStruc
   myStructs.Clear();
 
   const Standard_Integer aNbPriorities = theStructs.Length();
-  OpenGl_SequenceOfStructure::Iterator aStructIter;
   for (Standard_Integer aPriorityIdx = 0; aPriorityIdx < aNbPriorities; ++aPriorityIdx)
   {
-    const OpenGl_SequenceOfStructure& aSeq = theStructs (aPriorityIdx);
-    for (aStructIter.Init (aSeq); aStructIter.More(); aStructIter.Next())
+    for (OpenGl_SequenceOfStructure::Iterator aStructIter (theStructs (aPriorityIdx)); aStructIter.More(); aStructIter.Next())
     {
       const OpenGl_Structure* aStruct = aStructIter.Value();
       if (!aStruct->IsAlwaysRendered())
index 9a5c18a..bf3b607 100644 (file)
 #define _OpenGl_BVHClipPrimitiveSet_HeaderFile
 
 #include <BVH_PrimitiveSet.hxx>
-
 #include <NCollection_Array1.hxx>
-#include <NCollection_Sequence.hxx>
 
 #include <OpenGl_Vec.hxx>
 #include <OpenGl_Structure.hxx>
+#include <OpenGl_SequenceOfStructure.hxx>
 
-typedef NCollection_Sequence<const OpenGl_Structure*> OpenGl_SequenceOfStructure;
 typedef NCollection_Array1<OpenGl_SequenceOfStructure> OpenGl_ArrayOfStructure;
 
 //! Set of OpenGl_Structures for building BVH tree.
index 574c82e..82010a1 100644 (file)
@@ -419,17 +419,16 @@ Standard_Boolean OpenGl_GraphicDriver::SetImmediateModeDrawToFront (const Graphi
 // function : DisplayImmediateStructure
 // purpose  :
 // =======================================================================
-void OpenGl_GraphicDriver::DisplayImmediateStructure (const Graphic3d_CView&      theCView,
-                                                      const Graphic3d_CStructure& theCStructure)
+void OpenGl_GraphicDriver::DisplayImmediateStructure (const Graphic3d_CView&             theCView,
+                                                      const Handle(Graphic3d_Structure)& theStructure)
 {
-  OpenGl_CView*     aCView     = (OpenGl_CView*     )theCView.ptrView;
-  OpenGl_Structure* aStructure = (OpenGl_Structure* )&theCStructure;
+  OpenGl_CView* aCView = (OpenGl_CView* )theCView.ptrView;
   if (aCView == NULL)
   {
     return;
   }
 
-  aCView->View->DisplayImmediateStructure (aStructure);
+  aCView->View->DisplayImmediateStructure (theStructure);
 }
 
 // =======================================================================
index 7eb94c1..6eb10a1 100644 (file)
@@ -42,7 +42,6 @@
 #include <gp_Ax2.hxx>
 #include <Graphic3d_CView.hxx>
 #include <Graphic3d_CStructure.hxx>
-#include <Graphic3d_CPick.hxx>
 #include <Graphic3d_TextPath.hxx>
 #include <Graphic3d_HorizontalTextAlignment.hxx>
 #include <Graphic3d_VerticalTextAlignment.hxx>
@@ -122,18 +121,18 @@ public:
 
 public: // Methods for graphical structures
 
-  Standard_EXPORT void DisplayStructure (const Graphic3d_CView& theCView,
-                                         Graphic3d_CStructure&  theCStructure,
-                                         const Standard_Integer thePriority);
-  Standard_EXPORT void EraseStructure (const Graphic3d_CView& theCView,
-                                       Graphic3d_CStructure&  theCStructure);
+  Standard_EXPORT void DisplayStructure (const Graphic3d_CView&             theCView,
+                                         const Handle(Graphic3d_Structure)& theStructure,
+                                         const Standard_Integer             thePriority);
+  Standard_EXPORT void EraseStructure (const Graphic3d_CView&             theCView,
+                                       const Handle(Graphic3d_Structure)& theStructure);
   Standard_EXPORT void RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure);
   Standard_EXPORT Handle(Graphic3d_CStructure) Structure (const Handle(Graphic3d_StructureManager)& theManager);
 
   Standard_EXPORT Standard_Boolean SetImmediateModeDrawToFront (const Graphic3d_CView& theCView,
                                                                 const Standard_Boolean theDrawToFrontBuffer);
-  Standard_EXPORT void DisplayImmediateStructure (const Graphic3d_CView&      theCView,
-                                                  const Graphic3d_CStructure& theCStructure);
+  Standard_EXPORT void DisplayImmediateStructure (const Graphic3d_CView&             theCView,
+                                                  const Handle(Graphic3d_Structure)& theStructure);
   Standard_EXPORT void EraseImmediateStructure (const Graphic3d_CView&      theCView,
                                                 const Graphic3d_CStructure& theCStructure);
 
@@ -259,39 +258,29 @@ public:
 
   //! Add a new top-level z layer with ID theLayerId for the view. Z layers allow drawing structures in higher layers in foreground of structures in lower layers.
   //! To add a structure to desired layer on display it is necessary to set the layer index for the structure.
-  Standard_EXPORT void AddZLayer (const Graphic3d_CView& theCView,
-                                  const Standard_Integer theLayerId);
+  Standard_EXPORT void AddZLayer (const Graphic3d_CView&   theCView,
+                                  const Graphic3d_ZLayerId theLayerId);
 
   //! Remove Z layer from the specified view.
   //! All structures displayed at the moment in layer will be displayed in default layer (the bottom-level z layer).
   //! To unset layer index from associated structures use method UnsetZLayer (...).
-  Standard_EXPORT void RemoveZLayer (const Graphic3d_CView& theCView,
-                                     const Standard_Integer theLayerId);
+  Standard_EXPORT void RemoveZLayer (const Graphic3d_CView&   theCView,
+                                     const Graphic3d_ZLayerId theLayerId);
 
   //! Unset Z layer ID for all structures.
   //! The structure indexes will be set to default layer (the bottom-level z layer with ID = 0).
-  Standard_EXPORT void UnsetZLayer (const Standard_Integer theLayerId);
-
-  //! Change Z layer of a structure.
-  //! The new z layer ID will be used to define the associated layer for structure on display.
-  //! It is recommended to take care of redisplaying the structures already presented in view with previously set layer index.
-  //! This is usually done by viewer manager. Z layers allow drawing structures in higher layers in foreground of structures in lower layers.
-  Standard_EXPORT void ChangeZLayer (const Graphic3d_CStructure& theCStructure,
-                                     const Standard_Integer      theLayerId);
+  Standard_EXPORT void UnsetZLayer (const Graphic3d_ZLayerId theLayerId);
 
   //! Change Z layer of a structure already presented in view.
   //! It is recommended to update z layer of already displayed structures with this method before setting new z layer index to the structure.
   //! This is usually done by viewer manager.
   Standard_EXPORT void ChangeZLayer (const Graphic3d_CStructure& theCStructure,
                                      const Graphic3d_CView&      theCView,
-                                     const Standard_Integer      theNewLayerId);
-
-  //! Get Z layer ID of the structure. If the structure doesn't exists in graphic driver, the method returns -1.
-  Standard_EXPORT Standard_Integer GetZLayer (const Graphic3d_CStructure& theCStructure) const;
+                                     const Graphic3d_ZLayerId    theNewLayerId);
 
   //! Sets the settings for a single Z layer of specified view.
-  Standard_EXPORT void SetZLayerSettings (const Graphic3d_CView& theCView,
-                                          const Standard_Integer theLayerId,
+  Standard_EXPORT void SetZLayerSettings (const Graphic3d_CView&          theCView,
+                                          const Graphic3d_ZLayerId        theLayerId,
                                           const Graphic3d_ZLayerSettings& theSettings);
 
   //! Changes priority of a structure within its Z layer for the specified view.
index 5e6a015..cc021b0 100644 (file)
 #include <OpenGl_Structure.hxx>
 #include <OpenGl_CView.hxx>
 
-void OpenGl_GraphicDriver::DisplayStructure (const Graphic3d_CView& theCView,
-                                             Graphic3d_CStructure&  theCStructure,
-                                             const Standard_Integer thePriority)
+void OpenGl_GraphicDriver::DisplayStructure (const Graphic3d_CView&             theCView,
+                                             const Handle(Graphic3d_Structure)& theStructure,
+                                             const Standard_Integer             thePriority)
 {
-  const OpenGl_CView* aCView     = (const OpenGl_CView* )theCView.ptrView;
-  OpenGl_Structure*   aStructure = (OpenGl_Structure* )&theCStructure;
+  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
   if (aCView == NULL)
     return;
 
-  aCView->View->DisplayStructure (aStructure, thePriority);
+  aCView->View->DisplayStructure (theStructure, thePriority);
 }
 
-void OpenGl_GraphicDriver::EraseStructure (const Graphic3d_CView& theCView,
-                                           Graphic3d_CStructure&  theCStructure)
+void OpenGl_GraphicDriver::EraseStructure (const Graphic3d_CView&             theCView,
+                                           const Handle(Graphic3d_Structure)& theStructure)
 {
-  const OpenGl_CView* aCView     = (const OpenGl_CView* )theCView.ptrView;
-  OpenGl_Structure*   aStructure = (OpenGl_Structure* )&theCStructure;
-  if (aCView == NULL || aStructure == NULL)
+  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
+  if (aCView == NULL)
     return;
 
-  aCView->View->EraseStructure (aStructure);
+  aCView->View->EraseStructure (theStructure);
 }
 
 void OpenGl_GraphicDriver::RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure)
@@ -68,24 +66,8 @@ Handle(Graphic3d_CStructure) OpenGl_GraphicDriver::Structure (const Handle(Graph
 //=======================================================================
 
 void OpenGl_GraphicDriver::ChangeZLayer (const Graphic3d_CStructure& theCStructure,
-                                         const Standard_Integer theLayer)
-{
-  if (!myMapOfStructure.IsBound (theCStructure.Id))
-    return;
-
-  OpenGl_Structure* aStructure = myMapOfStructure.Find (theCStructure.Id);
-
-  aStructure->SetZLayer (theLayer);
-}
-
-//=======================================================================
-//function : ChangeZLayer
-//purpose  :
-//=======================================================================
-
-void OpenGl_GraphicDriver::ChangeZLayer (const Graphic3d_CStructure& theCStructure,
-                                         const Graphic3d_CView& theCView,
-                                         const Standard_Integer theNewLayerId)
+                                         const Graphic3d_CView&      theCView,
+                                         const Graphic3d_ZLayerId    theNewLayerId)
 {
   const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
 
@@ -98,33 +80,18 @@ void OpenGl_GraphicDriver::ChangeZLayer (const Graphic3d_CStructure& theCStructu
 }
 
 //=======================================================================
-//function : GetZLayer
-//purpose  :
-//=======================================================================
-
-Standard_Integer OpenGl_GraphicDriver::GetZLayer (const Graphic3d_CStructure& theCStructure) const
-{
-  if (!myMapOfStructure.IsBound (theCStructure.Id))
-    return -1;
-
-  OpenGl_Structure* aStructure = myMapOfStructure.Find (theCStructure.Id);
-
-  return aStructure->GetZLayer();
-}
-
-//=======================================================================
 //function : UnsetZLayer
 //purpose  :
 //=======================================================================
 
-void OpenGl_GraphicDriver::UnsetZLayer (const Standard_Integer theLayerId)
+void OpenGl_GraphicDriver::UnsetZLayer (const Graphic3d_ZLayerId theLayerId)
 {
   NCollection_DataMap<Standard_Integer, OpenGl_Structure*>::Iterator aStructIt (myMapOfStructure);
   for( ; aStructIt.More (); aStructIt.Next ())
   {
     OpenGl_Structure* aStruct = aStructIt.ChangeValue ();
-    if (aStruct->GetZLayer () == theLayerId)
-      aStruct->SetZLayer (0);
+    if (aStruct->ZLayer() == theLayerId)
+      aStruct->SetZLayer (Graphic3d_ZLayerId_Default);
   }
 }
 
@@ -133,8 +100,8 @@ void OpenGl_GraphicDriver::UnsetZLayer (const Standard_Integer theLayerId)
 //purpose  :
 //=======================================================================
 void OpenGl_GraphicDriver::ChangePriority (const Graphic3d_CStructure& theCStructure,
-                                           const Graphic3d_CView& theCView,
-                                           const Standard_Integer theNewPriority)
+                                           const Graphic3d_CView&      theCView,
+                                           const Standard_Integer      theNewPriority)
 {
   const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
 
index 6340198..24dae48 100644 (file)
@@ -543,8 +543,8 @@ void OpenGl_GraphicDriver::SetBackFacingModel (const Graphic3d_CView& ACView)
 //purpose  :
 //=======================================================================
 
-void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView,
-                                      const Standard_Integer theLayerId)
+void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView&   theCView,
+                                      const Graphic3d_ZLayerId theLayerId)
 {
   const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
   if (aCView)
@@ -555,8 +555,8 @@ void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView,
 //function : RemoveZLayer
 //purpose  :
 //=======================================================================
-void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
-                                         const Standard_Integer theLayerId)
+void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView&   theCView,
+                                         const Graphic3d_ZLayerId theLayerId)
 {
   const OpenGl_CView* aCView = (const OpenGl_CView *)theCView.ptrView;
   if (aCView)
@@ -567,8 +567,8 @@ void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
 //function : SetZLayerSettings
 //purpose  :
 //=======================================================================
-Standard_EXPORT void OpenGl_GraphicDriver::SetZLayerSettings (const Graphic3d_CView& theCView,
-                                                              const Standard_Integer theLayerId,
+Standard_EXPORT void OpenGl_GraphicDriver::SetZLayerSettings (const Graphic3d_CView&          theCView,
+                                                              const Graphic3d_ZLayerId        theLayerId,
                                                               const Graphic3d_ZLayerSettings& theSettings)
 {
   const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
index e09a5b1..ff16243 100644 (file)
 // commercial license or contractual agreement.
 
 #include <OpenGl_Layer.hxx>
+
+#include <OpenGl_BVHTreeSelector.hxx>
+#include <OpenGl_Structure.hxx>
+#include <OpenGl_View.hxx>
 #include <OpenGl_Workspace.hxx>
-#include <OpenGl_GlCore11.hxx>
 
-//=======================================================================
-//function : OpenGl_Layer
-//purpose  : 
-//=======================================================================
+// =======================================================================
+// function : OpenGl_PriorityList
+// purpose  :
+// =======================================================================
 OpenGl_Layer::OpenGl_Layer (const Standard_Integer theNbPriorities)
-  : myPriorityList (theNbPriorities)
+: myArray (0, theNbPriorities - 1),
+  myNbStructures (0),
+  myBVHIsLeftChildQueuedFirst (Standard_True),
+  myIsBVHPrimitivesNeedsReset (Standard_False)
 {
   //
 }
 
+// =======================================================================
+// function : ~OpenGl_Layer
+// purpose  :
+// =======================================================================
+OpenGl_Layer::~OpenGl_Layer()
+{
+  //
+}
+
+// =======================================================================
+// function : Add
+// purpose  :
+// =======================================================================
+void OpenGl_Layer::Add (const OpenGl_Structure* theStruct,
+                        const Standard_Integer  thePriority,
+                        Standard_Boolean        isForChangePriority)
+{
+  const Standard_Integer anIndex = Min (Max (thePriority, 0), myArray.Length() - 1);
+  if (theStruct == NULL)
+  {
+    return;
+  }
+
+  myArray (anIndex).Append (theStruct);
+  if (theStruct->IsAlwaysRendered())
+  {
+    theStruct->MarkAsNotCulled();
+  }
+  else if (!isForChangePriority)
+  {
+    myBVHPrimitives.Add (theStruct);
+  }
+  ++myNbStructures;
+}
+
+// =======================================================================
+// function : Remove
+// purpose  :
+// =======================================================================
+bool OpenGl_Layer::Remove (const OpenGl_Structure* theStruct,
+                           Standard_Integer&       thePriority,
+                           Standard_Boolean        isForChangePriority)
+{
+  if (theStruct == NULL)
+  {
+    thePriority = -1;
+    return false;
+  }
+
+  const Standard_Integer aNbPriorities = myArray.Length();
+  for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
+  {
+    OpenGl_SequenceOfStructure& aSeq = myArray (aPriorityIter);
+    for (OpenGl_SequenceOfStructure::Iterator aStructIter (aSeq); aStructIter.More(); aStructIter.Next())
+    {
+      if (aStructIter.Value() == theStruct)
+      {
+        aSeq.Remove (aStructIter);
+        if (!theStruct->IsAlwaysRendered()
+         && !isForChangePriority)
+        {
+          myBVHPrimitives.Remove (theStruct);
+        }
+        --myNbStructures;
+        thePriority = aPriorityIter;
+        return true;
+      }
+    }
+  }
+
+  thePriority = -1;
+  return false;
+}
+
+// =======================================================================
+// function : InvalidateBVHData
+// purpose  :
+// =======================================================================
+void OpenGl_Layer::InvalidateBVHData()
+{
+  myIsBVHPrimitivesNeedsReset = Standard_True;
+}
+
+// =======================================================================
+// function : renderAll
+// purpose  :
+// =======================================================================
+void OpenGl_Layer::renderAll (const Handle(OpenGl_Workspace)& theWorkspace) const
+{
+  const Standard_Integer aNbPriorities = myArray.Length();
+  for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
+  {
+    for (OpenGl_SequenceOfStructure::Iterator aStructIter (myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next())
+    {
+      const OpenGl_Structure* aStruct = aStructIter.Value();
+      if (!aStruct->IsVisible())
+      {
+        continue;
+      }
+
+      aStruct->Render (theWorkspace);
+    }
+  }
+}
+
+// =======================================================================
+// function : renderTraverse
+// purpose  :
+// =======================================================================
+void OpenGl_Layer::renderTraverse (const Handle(OpenGl_Workspace)& theWorkspace) const
+{
+  if (myIsBVHPrimitivesNeedsReset)
+  {
+    myBVHPrimitives.Assign (myArray);
+    myIsBVHPrimitivesNeedsReset = Standard_False;
+  }
+
+  OpenGl_BVHTreeSelector& aSelector = theWorkspace->ActiveView()->BVHTreeSelector();
+  traverse (aSelector);
+
+  const Standard_Integer aNbPriorities = myArray.Length();
+  for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
+  {
+    for (OpenGl_SequenceOfStructure::Iterator aStructIter (myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next())
+    {
+      const OpenGl_Structure* aStruct = aStructIter.Value();
+      if (!aStruct->IsVisible()
+        || aStruct->IsCulled())
+      {
+        continue;
+      }
+
+      aStruct->Render (theWorkspace);
+      aStruct->ResetCullingStatus();
+    }
+  }
+}
+
+// =======================================================================
+// function : traverse
+// purpose  :
+// =======================================================================
+void OpenGl_Layer::traverse (OpenGl_BVHTreeSelector& theSelector) const
+{
+  // handle a case when all objects are infinite
+  if (myBVHPrimitives.Size() == 0)
+    return;
+
+  const NCollection_Handle<BVH_Tree<Standard_ShortReal, 4> >& aBVHTree = myBVHPrimitives.BVH();
+
+  Standard_Integer aNode = 0; // a root node
+  theSelector.CacheClipPtsProjections();
+  if (!theSelector.Intersect (aBVHTree->MinPoint (0),
+                              aBVHTree->MaxPoint (0)))
+  {
+    return;
+  }
+
+  Standard_Integer aStack[32];
+  Standard_Integer aHead = -1;
+  for (;;)
+  {
+    if (!aBVHTree->IsOuter (aNode))
+    {
+      const Standard_Integer aLeftChildIdx  = aBVHTree->LeftChild  (aNode);
+      const Standard_Integer aRightChildIdx = aBVHTree->RightChild (aNode);
+      const Standard_Boolean isLeftChildIn  = theSelector.Intersect (aBVHTree->MinPoint (aLeftChildIdx),
+                                                                     aBVHTree->MaxPoint (aLeftChildIdx));
+      const Standard_Boolean isRightChildIn = theSelector.Intersect (aBVHTree->MinPoint (aRightChildIdx),
+                                                                     aBVHTree->MaxPoint (aRightChildIdx));
+      if (isLeftChildIn
+       && isRightChildIn)
+      {
+        aNode = myBVHIsLeftChildQueuedFirst ? aLeftChildIdx : aRightChildIdx;
+        ++aHead;
+        aStack[aHead] = myBVHIsLeftChildQueuedFirst ? aRightChildIdx : aLeftChildIdx;
+        myBVHIsLeftChildQueuedFirst = !myBVHIsLeftChildQueuedFirst;
+      }
+      else if (isLeftChildIn
+            || isRightChildIn)
+      {
+        aNode = isLeftChildIn ? aLeftChildIdx : aRightChildIdx;
+      }
+      else
+      {
+        if (aHead < 0)
+        {
+          return;
+        }
+
+        aNode = aStack[aHead];
+        --aHead;
+      }
+    }
+    else
+    {
+      if (theSelector.Intersect (aBVHTree->MinPoint (aNode),
+                                 aBVHTree->MaxPoint (aNode)))
+      {
+        Standard_Integer aIdx = aBVHTree->BegPrimitive (aNode);
+        myBVHPrimitives.GetStructureById (aIdx)->MarkAsNotCulled();
+        if (aHead < 0)
+        {
+          return;
+        }
+
+        aNode = aStack[aHead];
+        --aHead;
+      }
+    }
+  }
+}
+
+// =======================================================================
+// function : Append
+// purpose  :
+// =======================================================================
+Standard_Boolean OpenGl_Layer::Append (const OpenGl_Layer& theOther)
+{
+  // the source priority list shouldn't have more priorities
+  const Standard_Integer aNbPriorities = theOther.NbPriorities();
+  if (aNbPriorities > NbPriorities())
+  {
+    return Standard_False;
+  }
+
+  // add all structures to destination priority list
+  for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
+  {
+    for (OpenGl_SequenceOfStructure::Iterator aStructIter (theOther.myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next())
+    {
+      Add (aStructIter.Value(), aPriorityIter);
+    }
+  }
+
+  return Standard_True;
+}
+
 //=======================================================================
 //function : Render
-//purpose  : 
+//purpose  :
 //=======================================================================
-void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &theWorkspace, const OpenGl_GlobalLayerSettings& theDefaultSettings) const
+void OpenGl_Layer::Render (const Handle(OpenGl_Workspace)&   theWorkspace,
+                           const OpenGl_GlobalLayerSettings& theDefaultSettings) const
 {
   TEL_POFFSET_PARAM anAppliedOffsetParams = theWorkspace->AppliedPolygonOffset();
 
@@ -67,17 +312,10 @@ void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &theWorkspace, const O
   }
 
   // handle depth write
-  if (IsSettingEnabled (Graphic3d_ZLayerDepthWrite))
-  {
-    glDepthMask (GL_TRUE);
-  }
-  else
-  {
-    glDepthMask (GL_FALSE);
-  }
+  glDepthMask (IsSettingEnabled (Graphic3d_ZLayerDepthWrite) ? GL_TRUE : GL_FALSE);
 
   // render priority list
-  myPriorityList.Render (theWorkspace);
+  theWorkspace->IsCullingEnabled() ? renderTraverse (theWorkspace) : renderAll (theWorkspace);
 
   // always restore polygon offset between layers rendering
   theWorkspace->SetPolygonOffset (anAppliedOffsetParams.mode,
index a3c5a6c..cc1697e 100644 (file)
@@ -1,6 +1,6 @@
-// Created on: 2014-03-31
-// Created by: Danila ULYANOV
-// Copyright (c) 2014 OPEN CASCADE SAS
+// Created on: 2011-11-02
+// Created by: Sergey ZERCHANINOV
+// Copyright (c) 2011-2015 OPEN CASCADE SAS
 //
 // This file is part of Open CASCADE Technology software library.
 //
 #ifndef _OpenGl_Layer_Header
 #define _OpenGl_Layer_Header
 
-#include <OpenGl_PriorityList.hxx>
+#include <NCollection_Sequence.hxx>
+#include <NCollection_Array1.hxx>
+
+#include <InterfaceGraphic_telem.hxx>
+
+#include <Handle_OpenGl_Workspace.hxx>
+#include <OpenGl_BVHClipPrimitiveSet.hxx>
+#include <OpenGl_BVHTreeSelector.hxx>
+
 #include <Graphic3d_ZLayerSettings.hxx>
 #include <OpenGl_GlCore11.hxx>
 
@@ -28,6 +36,7 @@ struct OpenGl_GlobalLayerSettings
   GLboolean DepthMask;
 };
 
+//! Presentations list sorted within priorities.
 class OpenGl_Layer
 {
 public:
@@ -35,11 +44,14 @@ public:
   //! Initializes associated priority list and layer properties
   OpenGl_Layer (const Standard_Integer theNbPriorities = 11);
 
+  //! Destructor.
+  virtual ~OpenGl_Layer();
+
   //! Returns settings of the layer object.
-  const Graphic3d_ZLayerSettings LayerSettings() const { return myLayerSettings; };
+  const Graphic3d_ZLayerSettings& LayerSettings() const { return myLayerSettings; };
 
   //! Sets settings of the layer object.
-  void SetLayerSettings (Graphic3d_ZLayerSettings theSettings)
+  void SetLayerSettings (const Graphic3d_ZLayerSettings& theSettings)
   {
     myLayerSettings = theSettings;
   }
@@ -50,18 +62,60 @@ public:
     return myLayerSettings.IsSettingEnabled (theSetting);
   }
 
-  //! Returns reference to associated priority list.
-  OpenGl_PriorityList& PriorityList() { return myPriorityList; }
+  void Add (const OpenGl_Structure* theStruct,
+            const Standard_Integer  thePriority,
+            Standard_Boolean        isForChangePriority = Standard_False);
+
+  //! Remove structure and returns its priority, if the structure is not found, method returns negative value
+  bool Remove (const OpenGl_Structure* theStruct,
+               Standard_Integer&       thePriority,
+               Standard_Boolean        isForChangePriority = Standard_False);
+
+  //! @return the number of structures
+  Standard_Integer NbStructures() const { return myNbStructures; }
+
+  //! Returns the number of available priority levels
+  Standard_Integer NbPriorities() const { return myArray.Length(); }
+
+  //! Append layer of acceptable type (with similar number of priorities or less).
+  //! Returns Standard_False if the list can not be accepted.
+  Standard_Boolean Append (const OpenGl_Layer& theOther);
+
+  //! Returns array of OpenGL structures.
+  const OpenGl_ArrayOfStructure& ArrayOfStructures() const { return myArray; }
 
-  //! Returns const reference to associated priority list.
-  const OpenGl_PriorityList& PriorityList() const { return myPriorityList; }
+  //! Marks BVH tree for given priority list as dirty and
+  //! marks primitive set for rebuild.
+  void InvalidateBVHData();
 
-  void Render (const Handle(OpenGl_Workspace) &AWorkspace, const OpenGl_GlobalLayerSettings& theDefaultSettings) const;
+  // Render all structures.
+  void Render (const Handle(OpenGl_Workspace)&   theWorkspace,
+               const OpenGl_GlobalLayerSettings& theDefaultSettings) const;
+
+protected:
+
+  //! Traverses through BVH tree to determine which structures are in view volume.
+  void traverse (OpenGl_BVHTreeSelector& theSelector) const;
+
+  //! Iterates through the hierarchical list of existing structures and renders them all.
+  void renderAll (const Handle(OpenGl_Workspace)& theWorkspace) const;
+
+  //! Iterates through the hierarchical list of existing structures and renders only overlapping ones.
+  void renderTraverse (const Handle(OpenGl_Workspace)& theWorkspace) const;
 
 private:
 
-  OpenGl_PriorityList myPriorityList;       //!< Associated priority list object.
+  OpenGl_ArrayOfStructure            myArray;
+  Standard_Integer                   myNbStructures;
+  Graphic3d_ZLayerSettings           myLayerSettings;             //!< Layer setting flags
+  mutable OpenGl_BVHClipPrimitiveSet myBVHPrimitives;             //<! Set of OpenGl_Structures for building BVH tree
+  mutable Standard_Boolean           myBVHIsLeftChildQueuedFirst; //<! Is needed for implementation of stochastic order of BVH traverse
+  mutable Standard_Boolean           myIsBVHPrimitivesNeedsReset; //<! Defines if the primitive set for BVH is outdated
+
+public:
+
+  DEFINE_STANDARD_ALLOC
 
-  Graphic3d_ZLayerSettings myLayerSettings; //!< Layer setting flags.
 };
+
 #endif //_OpenGl_Layer_Header
index 9389658..712a51c 100644 (file)
 //=======================================================================
 
 OpenGl_LayerList::OpenGl_LayerList (const Standard_Integer theNbPriorities)
- : myNbPriorities (theNbPriorities),
-   myNbStructures (0)
+: myNbPriorities (theNbPriorities),
+  myNbStructures (0),
+  myImmediateNbStructures (0)
 {
-  // insert default priority layer
+  // insert default priority layers
   myLayers.Append (OpenGl_Layer (myNbPriorities));
-  myLayerIds.Bind (0, myLayers.Length());
-}
-
-//=======================================================================
-//function : ~OpenGl_LayerList
-//purpose  : Destructor
-//=======================================================================
-
-OpenGl_LayerList::~OpenGl_LayerList ()
-{
-}
+  myLayerIds.Bind (Graphic3d_ZLayerId_Default, myLayers.Upper());
 
-//=======================================================================
-//function : defaultLayer
-//purpose  :
-//=======================================================================
-
-OpenGl_Layer& OpenGl_LayerList::defaultLayer()
-{
-  return myLayers.ChangeValue (1);
-}
+  myLayers.Append (OpenGl_Layer (myNbPriorities));
+  myLayerIds.Bind (Graphic3d_ZLayerId_Top,     myLayers.Upper());
 
-//=======================================================================
-//function : NbPriorities
-//purpose  : Method returns the number of available priorities
-//=======================================================================
+  myLayers.Append (OpenGl_Layer (myNbPriorities));
+  myLayerIds.Bind (Graphic3d_ZLayerId_Topmost, myLayers.Upper());
 
-Standard_Integer OpenGl_LayerList::NbPriorities () const
-{
-  return myNbPriorities;
+  myLayers.Append (OpenGl_Layer (myNbPriorities));
+  myLayerIds.Bind (Graphic3d_ZLayerId_TopOSD,  myLayers.Upper());
 }
 
 //=======================================================================
-//function : NbStructures
-//purpose  : Method returns the number of available structures
+//function : ~OpenGl_LayerList
+//purpose  : Destructor
 //=======================================================================
 
-Standard_Integer OpenGl_LayerList::NbStructures () const
+OpenGl_LayerList::~OpenGl_LayerList()
 {
-  return myNbStructures;
 }
 
 //=======================================================================
@@ -80,10 +60,12 @@ Standard_Integer OpenGl_LayerList::NbStructures () const
 //purpose  : 
 //=======================================================================
 
-void OpenGl_LayerList::AddLayer (const Standard_Integer theLayerId)
+void OpenGl_LayerList::AddLayer (const Graphic3d_ZLayerId theLayerId)
 {
-  if (HasLayer (theLayerId))
+  if (myLayerIds.IsBound (theLayerId))
+  {
     return;
+  }
 
   // add the new layer
   myLayers.Append (OpenGl_Layer (myNbPriorities));
@@ -91,21 +73,10 @@ void OpenGl_LayerList::AddLayer (const Standard_Integer theLayerId)
 }
 
 //=======================================================================
-//function : HasLayer
-//purpose  : 
-//=======================================================================
-
-Standard_Boolean OpenGl_LayerList::HasLayer 
-  (const Standard_Integer theLayerId) const
-{
-  return myLayerIds.IsBound (theLayerId);
-}
-
-//=======================================================================
 //function : Layer
 //purpose  : 
 //=======================================================================
-OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId)
+OpenGl_Layer& OpenGl_LayerList::Layer (const Graphic3d_ZLayerId theLayerId)
 {
   return myLayers.ChangeValue (myLayerIds.Find (theLayerId));
 }
@@ -114,7 +85,7 @@ OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId)
 //function : Layer
 //purpose  : 
 //=======================================================================
-const OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId) const
+const OpenGl_Layer& OpenGl_LayerList::Layer (const Graphic3d_ZLayerId theLayerId) const
 {
   return myLayers.Value (myLayerIds.Find (theLayerId));
 }
@@ -124,16 +95,19 @@ const OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId)
 //purpose  :
 //=======================================================================
 
-void OpenGl_LayerList::RemoveLayer (const Standard_Integer theLayerId)
+void OpenGl_LayerList::RemoveLayer (const Graphic3d_ZLayerId theLayerId)
 {
-  if (!HasLayer (theLayerId) || theLayerId == 0)
+  if (!myLayerIds.IsBound (theLayerId)
+    || theLayerId <= 0)
+  {
     return;
+  }
 
-  Standard_Integer aRemovePos = myLayerIds.Find (theLayerId);
+  const Standard_Integer aRemovePos = myLayerIds.Find (theLayerId);
   
   // move all displayed structures to first layer
-  const OpenGl_PriorityList& aList = myLayers.Value (aRemovePos).PriorityList();
-  defaultLayer ().PriorityList().Append (aList);
+  const OpenGl_Layer& aLayerToMove = myLayers.Value (aRemovePos);
+  myLayers.ChangeFirst().Append (aLayerToMove);
 
   // remove layer
   myLayers.Remove (aRemovePos);
@@ -154,18 +128,23 @@ void OpenGl_LayerList::RemoveLayer (const Standard_Integer theLayerId)
 //purpose  :
 //=======================================================================
 
-void OpenGl_LayerList::AddStructure (const OpenGl_Structure *theStructure,
-                                     const Standard_Integer  theLayerId,
-                                     const Standard_Integer  thePriority,
-                                     Standard_Boolean isForChangePriority)
+void OpenGl_LayerList::AddStructure (const OpenGl_Structure*  theStruct,
+                                     const Graphic3d_ZLayerId theLayerId,
+                                     const Standard_Integer   thePriority,
+                                     Standard_Boolean         isForChangePriority)
 {
   // add structure to associated layer,
   // if layer doesn't exists, display structure in default layer
-  OpenGl_PriorityList& aList = !HasLayer (theLayerId) ? defaultLayer ().PriorityList() :
-    myLayers.ChangeValue (myLayerIds.Find (theLayerId)).PriorityList();
+  Standard_Integer aSeqPos = myLayers.Lower();
+  myLayerIds.Find (theLayerId, aSeqPos);
 
-  aList.Add (theStructure, thePriority, isForChangePriority);
-  myNbStructures++;
+  OpenGl_Layer& aLayer = myLayers.ChangeValue (aSeqPos);
+  aLayer.Add (theStruct, thePriority, isForChangePriority);
+  ++myNbStructures;
+  if (aLayer.LayerSettings().IsImmediate)
+  {
+    ++myImmediateNbStructures;
+  }
 
   // Note: In ray-tracing mode we don't modify modification
   // state here. It is redundant, because the possible changes
@@ -174,50 +153,61 @@ void OpenGl_LayerList::AddStructure (const OpenGl_Structure *theStructure,
 
 //=======================================================================
 //function : RemoveStructure
-//purpose  : 
+//purpose  :
 //=======================================================================
 
-void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure,
-                                        const Standard_Integer  theLayerId)
+void OpenGl_LayerList::RemoveStructure (const Handle(Graphic3d_Structure)& theStructure)
 {
-  Standard_Integer aSeqPos = !HasLayer (theLayerId) ?
-    1 : myLayerIds.Find (theLayerId);
-  
-  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
+  const OpenGl_Structure*  aStruct  = reinterpret_cast<const OpenGl_Structure* > (theStructure->CStructure().operator->());
+  const Graphic3d_ZLayerId aLayerId = aStruct->ZLayer();
+
+  Standard_Integer aSeqPos = myLayers.Lower();
+  myLayerIds.Find (aLayerId, aSeqPos);
+
+  OpenGl_Layer&    aLayer    = myLayers.ChangeValue (aSeqPos);
+  Standard_Integer aPriority = -1;
 
   // remove structure from associated list
   // if the structure is not found there,
   // scan through layers and remove it
-  if (aList.Remove (theStructure) >= 0)
+  if (aLayer.Remove (aStruct, aPriority))
   {
-    myNbStructures--;
+    --myNbStructures;
+    if (aLayer.LayerSettings().IsImmediate)
+    {
+      --myImmediateNbStructures;
+    }
 
-    if (theStructure->IsRaytracable())
+    if (aStruct->IsRaytracable())
     {
-      myModificationState++;
+      ++myModificationState;
     }
 
     return;
   }
-  
+
   // scan through layers and remove it
   Standard_Integer aSeqId = 1;
-  OpenGl_SequenceOfLayers::Iterator anIts;
-  for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++)
+  for (OpenGl_SequenceOfLayers::Iterator anIts (myLayers); anIts.More(); anIts.Next(), ++aSeqId)
   {
-    OpenGl_PriorityList& aScanList = anIts.ChangeValue ().PriorityList();
+    OpenGl_Layer& aLayerEx = anIts.ChangeValue();
     if (aSeqPos == aSeqId)
-      continue;
-  
-    if (aScanList.Remove (theStructure) >= 0)
     {
-      myNbStructures--;
+      continue;
+    }
 
-      if (theStructure->IsRaytracable())
+    if (aLayerEx.Remove (aStruct, aPriority))
+    {
+      --myNbStructures;
+      if (aLayerEx.LayerSettings().IsImmediate)
       {
-        myModificationState++;
+        --myImmediateNbStructures;
       }
 
+      if (aStruct->IsRaytracable())
+      {
+        ++myModificationState;
+      }
       return;
     }
   }
@@ -227,14 +217,12 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure,
 //function : InvalidateBVHData
 //purpose  :
 //=======================================================================
-void OpenGl_LayerList::InvalidateBVHData (const Standard_Integer theLayerId)
+void OpenGl_LayerList::InvalidateBVHData (const Graphic3d_ZLayerId theLayerId)
 {
-  Standard_Integer aSeqPos = !HasLayer (theLayerId) ?
-    1 : myLayerIds.Find (theLayerId);
-
-  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
-
-  aList.InvalidateBVHData();
+  Standard_Integer aSeqPos = myLayers.Lower();
+  myLayerIds.Find (theLayerId, aSeqPos);
+  OpenGl_Layer& aLayer = myLayers.ChangeValue (aSeqPos);
+  aLayer.InvalidateBVHData();
 }
 
 //=======================================================================
@@ -242,44 +230,54 @@ void OpenGl_LayerList::InvalidateBVHData (const Standard_Integer theLayerId)
 //purpose  :
 //=======================================================================
 
-void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure,
-                                    const Standard_Integer  theOldLayerId,
-                                    const Standard_Integer  theNewLayerId)
+void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure*  theStructure,
+                                    const Graphic3d_ZLayerId theOldLayerId,
+                                    const Graphic3d_ZLayerId theNewLayerId)
 {
-  Standard_Integer aSeqPos = !HasLayer (theOldLayerId) ?
-    1 : myLayerIds.Find (theOldLayerId);
-  
-  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
-  Standard_Integer aPriority;
+  Standard_Integer aSeqPos = myLayers.Lower();
+  myLayerIds.Find (theOldLayerId, aSeqPos);
+  OpenGl_Layer&    aLayer    = myLayers.ChangeValue (aSeqPos);
+  Standard_Integer aPriority = -1;
 
   // take priority and remove structure from list found by <theOldLayerId>
   // if the structure is not found there, scan through all other layers
-  if ((aPriority = aList.Remove (theStructure, Standard_True)) >= 0)
+  if (aLayer.Remove (theStructure, aPriority, Standard_True))
   {
-    myNbStructures--;
+    --myNbStructures;
+    if (aLayer.LayerSettings().IsImmediate)
+    {
+      --myImmediateNbStructures;
+    }
+
     // isForChangePriority should be Standard_False below, because we want
     // the BVH tree in the target layer to be updated with theStructure
     AddStructure (theStructure, theNewLayerId, aPriority);
+    return;
   }
-  else
+
+  // scan through layers and remove it
+  Standard_Integer aSeqId = 1;
+  for (OpenGl_SequenceOfLayers::Iterator anIts (myLayers); anIts.More(); anIts.Next(), ++aSeqId)
   {
-    // scan through layers and remove it
-    Standard_Integer aSeqId = 1;
-    OpenGl_SequenceOfLayers::Iterator anIts;
-    for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++)
+    if (aSeqPos == aSeqId)
     {
-      if (aSeqPos == aSeqId)
-        continue;
+      continue;
+    }
   
-      // try to remove structure and get priority value from this layer
-      if ((aPriority = aList.Remove (theStructure, Standard_True)) >= 0)
+    // try to remove structure and get priority value from this layer
+    OpenGl_Layer& aLayerEx = anIts.ChangeValue();
+    if (aLayerEx.Remove (theStructure, aPriority, Standard_True))
+    {
+      --myNbStructures;
+      if (aLayerEx.LayerSettings().IsImmediate)
       {
-        myNbStructures--;
-        // isForChangePriority should be Standard_False below, because we want
-        // the BVH tree in the target layer to be updated with theStructure
-        AddStructure (theStructure, theNewLayerId, aPriority);
-        break;
+        --myImmediateNbStructures;
       }
+
+      // isForChangePriority should be Standard_False below, because we want
+      // the BVH tree in the target layer to be updated with theStructure
+      AddStructure (theStructure, theNewLayerId, aPriority);
+      return;
     }
   }
 }
@@ -288,62 +286,112 @@ void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure,
 //function : ChangePriority
 //purpose  :
 //=======================================================================
-void OpenGl_LayerList::ChangePriority (const OpenGl_Structure *theStructure,
-                                       const Standard_Integer theLayerId,
-                                       const Standard_Integer theNewPriority)
+void OpenGl_LayerList::ChangePriority (const OpenGl_Structure*  theStructure,
+                                       const Graphic3d_ZLayerId theLayerId,
+                                       const Standard_Integer   theNewPriority)
 {
-  Standard_Integer aSeqPos = !HasLayer (theLayerId) ?
-    1 : myLayerIds.Find (theLayerId);
-
-  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
+  Standard_Integer aSeqPos = myLayers.Lower();
+  myLayerIds.Find (theLayerId, aSeqPos);
+  OpenGl_Layer&    aLayer        = myLayers.ChangeValue (aSeqPos);
+  Standard_Integer anOldPriority = -1;
 
-  if (aList.Remove (theStructure, Standard_True) >= 0)
+  if (aLayer.Remove (theStructure, anOldPriority, Standard_True))
   {
-    myNbStructures--;
+    --myNbStructures;
+    if (aLayer.LayerSettings().IsImmediate)
+    {
+      --myImmediateNbStructures;
+    }
+
     AddStructure (theStructure, theLayerId, theNewPriority, Standard_True);
+    return;
   }
-  else
+
+  Standard_Integer aSeqId = 1;
+  for (OpenGl_SequenceOfLayers::Iterator anIts (myLayers); anIts.More(); anIts.Next(), ++aSeqId)
   {
-    Standard_Integer aSeqId = 1;
-    OpenGl_SequenceOfLayers::Iterator anIts;
-    for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++)
+    if (aSeqPos == aSeqId)
     {
-      if (aSeqPos == aSeqId)
-        continue;
+      continue;
+    }
 
-      if (aList.Remove (theStructure, Standard_True) >= 0)
+    OpenGl_Layer& aLayerEx = anIts.ChangeValue();
+    if (aLayerEx.Remove (theStructure, anOldPriority, Standard_True))
+    {
+      --myNbStructures;
+      if (aLayerEx.LayerSettings().IsImmediate)
       {
-        myNbStructures--;
-        AddStructure (theStructure, theLayerId, theNewPriority, Standard_True);
-        break;
+        --myImmediateNbStructures;
       }
+
+      AddStructure (theStructure, theLayerId, theNewPriority, Standard_True);
+      return;
     }
   }
 }
 
 //=======================================================================
-//function : Render
-//purpose  : Render this element
+//function : SetLayerSettings
+//purpose  :
 //=======================================================================
+void OpenGl_LayerList::SetLayerSettings (const Graphic3d_ZLayerId        theLayerId,
+                                         const Graphic3d_ZLayerSettings& theSettings)
+{
+  OpenGl_Layer& aLayer = Layer (theLayerId);
+  if (aLayer.LayerSettings().IsImmediate != theSettings.IsImmediate)
+  {
+    if (theSettings.IsImmediate)
+    {
+      myImmediateNbStructures += aLayer.NbStructures();
+    }
+    else
+    {
+      myImmediateNbStructures -= aLayer.NbStructures();
+    }
+  }
+  aLayer.SetLayerSettings (theSettings);
+}
 
-void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace) &theWorkspace) const
+//=======================================================================
+//function : Render
+//purpose  :
+//=======================================================================
+void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace)& theWorkspace,
+                               const Standard_Boolean          theToDrawImmediate) const
 {
   OpenGl_GlobalLayerSettings aDefaultSettings;
-  
-  glGetIntegerv (GL_DEPTH_FUNC, &aDefaultSettings.DepthFunc);
-  glGetBooleanv (GL_DEPTH_WRITEMASK, &aDefaultSettings.DepthMask);
 
-  OpenGl_SequenceOfLayers::Iterator anIts;
-  for (anIts.Init (myLayers); anIts.More(); anIts.Next())
+  const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext();
+  aCtx->core11fwd->glGetIntegerv (GL_DEPTH_FUNC,      &aDefaultSettings.DepthFunc);
+  aCtx->core11fwd->glGetBooleanv (GL_DEPTH_WRITEMASK, &aDefaultSettings.DepthMask);
+
+  Standard_Integer aSeqId = myLayers.Lower();
+  for (OpenGl_SequenceOfLayers::Iterator anIts (myLayers); anIts.More(); anIts.Next(), ++aSeqId)
   {
-    const OpenGl_Layer& aLayer = anIts.Value ();
-    if (aLayer.PriorityList().NbStructures () > 0)
+    const OpenGl_Layer& aLayer = anIts.Value();
+    if (aLayer.NbStructures() < 1)
+    {
+      continue;
+    }
+    else if (theToDrawImmediate)
     {
-      // render layer
-      aLayer.Render (theWorkspace, aDefaultSettings);
+      if (!aLayer.LayerSettings().IsImmediate)
+      {
+        continue;
+      }
     }
+    else
+    {
+      if (aLayer.LayerSettings().IsImmediate)
+      {
+        continue;
+      }
+    }
+
+    // render layer
+    aLayer.Render (theWorkspace, aDefaultSettings);
   }
 
-  glDepthMask (aDefaultSettings.DepthMask);
-  glDepthFunc (aDefaultSettings.DepthFunc);
+  aCtx->core11fwd->glDepthMask (aDefaultSettings.DepthMask);
+  aCtx->core11fwd->glDepthFunc (aDefaultSettings.DepthFunc);
 }
index c979feb..e7c20ac 100644 (file)
@@ -16,7 +16,6 @@
 #ifndef _OpenGl_LayerList_Header
 #define _OpenGl_LayerList_Header
 
-#include <OpenGl_PriorityList.hxx>
 #include <OpenGl_Layer.hxx>
 
 #include <InterfaceGraphic_telem.hxx>
@@ -32,89 +31,92 @@ typedef NCollection_DataMap<int, int> OpenGl_LayerSeqIds;
 
 class OpenGl_LayerList
 {
- public:
-  
+public:
+
   //! Constructor
   OpenGl_LayerList (const Standard_Integer theNbPriorities = 11);
-  
+
   //! Destructor
-  virtual ~OpenGl_LayerList ();
-  
+  virtual ~OpenGl_LayerList();
+
   //! Method returns the number of available priorities
-  Standard_Integer NbPriorities () const;
+  Standard_Integer NbPriorities() const { return myNbPriorities; }
 
   //! Number of displayed structures
-  Standard_Integer NbStructures () const;
+  Standard_Integer NbStructures() const { return myNbStructures; }
+
+  //! Return number of structures within immediate layers
+  Standard_Integer NbImmediateStructures() const { return myImmediateNbStructures; }
 
   //! Insert a new layer with id.
-  void AddLayer (const Standard_Integer theLayerId);
-  
-  //! Check whether the layer with given id is already created.
-  Standard_Boolean HasLayer (const Standard_Integer theLayerId) const;
-  
+  void AddLayer (const Graphic3d_ZLayerId theLayerId);
+
   //! Remove layer by its id.
-  void RemoveLayer (const Standard_Integer theLayerId);
-  
+  void RemoveLayer (const Graphic3d_ZLayerId theLayerId);
+
   //! Add structure to list with given priority. The structure will be inserted
   //! to specified layer. If the layer isn't found, the structure will be put
   //! to default bottom-level layer.
-  void AddStructure (const OpenGl_Structure *theStructure,
-                     const Standard_Integer  theLayerId,
-                     const Standard_Integer  thePriority,
-                     Standard_Boolean isForChangePriority = Standard_False);
-  
+  void AddStructure (const OpenGl_Structure*  theStruct,
+                     const Graphic3d_ZLayerId theLayerId,
+                     const Standard_Integer   thePriority,
+                     Standard_Boolean        isForChangePriority = Standard_False);
+
   //! Remove structure from structure list and return its previous priority
-  void RemoveStructure (const OpenGl_Structure *theStructure,
-                        const Standard_Integer  theZLayerId);
-  
+  void RemoveStructure (const Handle(Graphic3d_Structure)& theStructure);
+
   //! Change structure z layer
   //! If the new layer is not presented, the structure will be displayed
   //! in default z layer
-  void ChangeLayer (const OpenGl_Structure *theStructure,
-                    const Standard_Integer  theOldLayerId,
-                    const Standard_Integer  theNewLayerId);
+  void ChangeLayer (const OpenGl_Structure*  theStructure,
+                    const Graphic3d_ZLayerId theOldLayerId,
+                    const Graphic3d_ZLayerId theNewLayerId);
 
   //! Changes structure priority within its ZLayer
-  void ChangePriority (const OpenGl_Structure *theStructure,
-                       const Standard_Integer  theLayerId,
-                       const Standard_Integer theNewPriority);
+  void ChangePriority (const OpenGl_Structure*  theStructure,
+                       const Graphic3d_ZLayerId theLayerId,
+                       const Standard_Integer   theNewPriority);
 
   //! Returns reference to the layer with given ID.
-  OpenGl_Layer& Layer (const Standard_Integer theLayerId);
+  OpenGl_Layer& Layer (const Graphic3d_ZLayerId theLayerId);
 
   //! Returns reference to the layer with given ID.
-  const OpenGl_Layer& Layer (const Standard_Integer theLayerId) const;
-  
+  const OpenGl_Layer& Layer (const Graphic3d_ZLayerId theLayerId) const;
+
+  //! Assign new settings to the layer.
+  void SetLayerSettings (const Graphic3d_ZLayerId        theLayerId,
+                         const Graphic3d_ZLayerSettings& theSettings);
+
   //! Render this element
-  void Render (const Handle(OpenGl_Workspace) &theWorkspace) const;
+  void Render (const Handle(OpenGl_Workspace)& theWorkspace,
+               const Standard_Boolean          theToDrawImmediate) const;
 
   //! Returns the set of OpenGL Z-layers.
   const OpenGl_SequenceOfLayers& Layers() const { return myLayers; }
 
   //! Marks BVH tree for given priority list as dirty and
   //! marks primitive set for rebuild.
-  void InvalidateBVHData (const Standard_Integer theLayerId);
+  void InvalidateBVHData (const Graphic3d_ZLayerId theLayerId);
 
   //! Returns structure modification state (for ray-tracing).
   Standard_Size ModificationState() const { return myModificationState; }
 
- private:
-  
-  //! Get default layer
-  OpenGl_Layer& defaultLayer ();
-  
- protected:
+protected:
 
   // number of structures temporary put to default layer
   OpenGl_SequenceOfLayers myLayers;
   OpenGl_LayerSeqIds      myLayerIds;
+
   Standard_Integer        myNbPriorities;
   Standard_Integer        myNbStructures;
+  Standard_Integer        myImmediateNbStructures; //!< number of structures within immediate layers
 
   mutable Standard_Size   myModificationState;
 
- public:
+public:
+
   DEFINE_STANDARD_ALLOC
+
 };
 
 #endif //_OpenGl_LayerList_Header
index c2d3ade..0064259 100644 (file)
 #define _OpenGl_NamedStatus_Header
 
 // Dynamic fields
-#define OPENGL_NS_HIDE         (1<<0)
 #define OPENGL_NS_HIGHLIGHT    (1<<1)
 #define OPENGL_NS_RESMAT       (1<<2)
-#define OPENGL_NS_IMMEDIATE    (1<<3)
 #define OPENGL_NS_TEXTURE      (1<<4)
 #define OPENGL_NS_ANTIALIASING (1<<5)
 #define OPENGL_NS_2NDPASSNEED  (1<<6)
diff --git a/src/OpenGl/OpenGl_PriorityList.cxx b/src/OpenGl/OpenGl_PriorityList.cxx
deleted file mode 100644 (file)
index e6b8cc4..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-// Created on: 2011-11-02
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-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.
-
-#include <OpenGl_PriorityList.hxx>
-
-#include <OpenGl_BVHTreeSelector.hxx>
-#include <OpenGl_Structure.hxx>
-#include <OpenGl_View.hxx>
-
-// =======================================================================
-// function : OpenGl_PriorityList
-// purpose  :
-// =======================================================================
-OpenGl_PriorityList::OpenGl_PriorityList (const Standard_Integer theNbPriorities)
-: myArray (0, theNbPriorities - 1),
-  myNbStructures (0),
-  myBVHIsLeftChildQueuedFirst (Standard_True),
-  myIsBVHPrimitivesNeedsReset (Standard_False)
-{
-  //
-}
-
-// =======================================================================
-// function : ~OpenGl_PriorityList
-// purpose  :
-// =======================================================================
-OpenGl_PriorityList::~OpenGl_PriorityList()
-{
-  //
-}
-
-// =======================================================================
-// function : Add
-// purpose  :
-// =======================================================================
-void OpenGl_PriorityList::Add (const OpenGl_Structure* theStructure,
-                               const Standard_Integer  thePriority,
-                               Standard_Boolean isForChangePriority)
-{
-  const Standard_Integer anIndex = Min (Max (thePriority, 0), myArray.Length() - 1);
-
-  myArray (anIndex).Append (theStructure);
-  if (theStructure->IsAlwaysRendered())
-  {
-    theStructure->MarkAsNotCulled();
-  }
-  else if (!isForChangePriority)
-  {
-    myBVHPrimitives.Add (theStructure);
-  }
-  ++myNbStructures;
-}
-
-// =======================================================================
-// function : Remove
-// purpose  :
-// =======================================================================
-Standard_Integer OpenGl_PriorityList::Remove (const OpenGl_Structure* theStructure,
-                                              Standard_Boolean isForChangePriority)
-{
-  const Standard_Integer aNbPriorities = myArray.Length();
-  OpenGl_SequenceOfStructure::Iterator aStructIter;
-  for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
-  {
-    OpenGl_SequenceOfStructure& aSeq = myArray (aPriorityIter);
-    for (aStructIter.Init (aSeq); aStructIter.More(); aStructIter.Next())
-    {
-      if (aStructIter.Value() == theStructure)
-      {
-        aSeq.Remove (aStructIter);
-        if (!theStructure->IsAlwaysRendered()
-            && !isForChangePriority)
-        {
-          myBVHPrimitives.Remove (theStructure);
-        }
-        --myNbStructures;
-        return aPriorityIter;
-      }
-    }
-  }
-
-  return -1;
-}
-
-// =======================================================================
-// function : InvalidateBVHData
-// purpose  :
-// =======================================================================
-void OpenGl_PriorityList::InvalidateBVHData()
-{
-  myIsBVHPrimitivesNeedsReset = Standard_True;
-}
-
-// =======================================================================
-// function : Render
-// purpose  :
-// =======================================================================
-void OpenGl_PriorityList::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
-{
-  theWorkspace->IsCullingEnabled() ? renderTraverse (theWorkspace) : renderAll (theWorkspace);
-}
-
-// =======================================================================
-// function : renderAll
-// purpose  :
-// =======================================================================
-void OpenGl_PriorityList::renderAll (const Handle(OpenGl_Workspace)& theWorkspace) const
-{
-  const Standard_Integer aNbPriorities = myArray.Length();
-  OpenGl_SequenceOfStructure::Iterator aStructIter;
-  for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
-  {
-    for (aStructIter.Init (myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next())
-    {
-      aStructIter.Value()->Render (theWorkspace);
-    }
-  }
-}
-
-// =======================================================================
-// function : renderTraverse
-// purpose  :
-// =======================================================================
-void OpenGl_PriorityList::renderTraverse (const Handle(OpenGl_Workspace)& theWorkspace) const
-{
-  if (myIsBVHPrimitivesNeedsReset)
-  {
-    myBVHPrimitives.Assign (myArray);
-    myIsBVHPrimitivesNeedsReset = Standard_False;
-  }
-
-  OpenGl_BVHTreeSelector& aSelector = theWorkspace->ActiveView()->BVHTreeSelector();
-  traverse (aSelector);
-
-  const Standard_Integer aNbPriorities = myArray.Length();
-  OpenGl_SequenceOfStructure::Iterator aStructIter;
-  for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
-  {
-    for (aStructIter.Init (myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next())
-    {
-      if (!aStructIter.Value()->IsCulled())
-      {
-        aStructIter.Value()->Render (theWorkspace);
-        aStructIter.Value()->ResetCullingStatus();
-      }
-    }
-  }
-}
-
-// =======================================================================
-// function : traverse
-// purpose  :
-// =======================================================================
-void OpenGl_PriorityList::traverse (OpenGl_BVHTreeSelector& theSelector) const
-{
-  // handle a case when all objects are infinite
-  if (myBVHPrimitives.Size() == 0)
-    return;
-
-  const NCollection_Handle<BVH_Tree<Standard_ShortReal, 4> >& aBVHTree = myBVHPrimitives.BVH();
-
-  Standard_Integer aNode = 0; // a root node
-  theSelector.CacheClipPtsProjections();
-  if (!theSelector.Intersect (aBVHTree->MinPoint (0),
-                              aBVHTree->MaxPoint (0)))
-  {
-    return;
-  }
-
-  Standard_Integer aStack[32];
-  Standard_Integer aHead = -1;
-  for (;;)
-  {
-    if (!aBVHTree->IsOuter (aNode))
-    {
-      const Standard_Integer aLeftChildIdx  = aBVHTree->LeftChild  (aNode);
-      const Standard_Integer aRightChildIdx = aBVHTree->RightChild (aNode);
-      const Standard_Boolean isLeftChildIn  = theSelector.Intersect (aBVHTree->MinPoint (aLeftChildIdx),
-                                                                     aBVHTree->MaxPoint (aLeftChildIdx));
-      const Standard_Boolean isRightChildIn = theSelector.Intersect (aBVHTree->MinPoint (aRightChildIdx),
-                                                                     aBVHTree->MaxPoint (aRightChildIdx));
-      if (isLeftChildIn
-       && isRightChildIn)
-      {
-        aNode = myBVHIsLeftChildQueuedFirst ? aLeftChildIdx : aRightChildIdx;
-        ++aHead;
-        aStack[aHead] = myBVHIsLeftChildQueuedFirst ? aRightChildIdx : aLeftChildIdx;
-        myBVHIsLeftChildQueuedFirst = !myBVHIsLeftChildQueuedFirst;
-      }
-      else if (isLeftChildIn
-            || isRightChildIn)
-      {
-        aNode = isLeftChildIn ? aLeftChildIdx : aRightChildIdx;
-      }
-      else
-      {
-        if (aHead < 0)
-        {
-          return;
-        }
-
-        aNode = aStack[aHead];
-        --aHead;
-      }
-    }
-    else
-    {
-      if (theSelector.Intersect (aBVHTree->MinPoint (aNode),
-                                 aBVHTree->MaxPoint (aNode)))
-      {
-        Standard_Integer aIdx = aBVHTree->BegPrimitive (aNode);
-        myBVHPrimitives.GetStructureById (aIdx)->MarkAsNotCulled();
-        if (aHead < 0)
-        {
-          return;
-        }
-
-        aNode = aStack[aHead];
-        --aHead;
-      }
-    }
-  }
-}
-
-// =======================================================================
-// function : Append
-// purpose  :
-// =======================================================================
-Standard_Boolean OpenGl_PriorityList::Append (const OpenGl_PriorityList& theOther)
-{
-  // the source priority list shouldn't have more priorities
-  const Standard_Integer aNbPriorities = theOther.NbPriorities ();
-  if (aNbPriorities > NbPriorities())
-  {
-    return Standard_False;
-  }
-
-  // add all structures to destination priority list
-  OpenGl_SequenceOfStructure::Iterator aStructIter;
-  for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
-  {
-    const OpenGl_SequenceOfStructure& aSeq = theOther.myArray (aPriorityIter);
-    for (aStructIter.Init (aSeq); aStructIter.More(); aStructIter.Next())
-    {
-      Add (aStructIter.Value(), aPriorityIter);
-    }
-  }
-
-  return Standard_True;
-}
-
-// =======================================================================
-// function : NbPriorities
-// purpose  :
-// =======================================================================
-Standard_Integer OpenGl_PriorityList::NbPriorities() const
-{
-  return myArray.Length();
-}
diff --git a/src/OpenGl/OpenGl_PriorityList.hxx b/src/OpenGl/OpenGl_PriorityList.hxx
deleted file mode 100644 (file)
index dab5631..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-// Created on: 2011-11-02
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-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.
-
-#ifndef _OpenGl_PriorityList_Header
-#define _OpenGl_PriorityList_Header
-
-#include <NCollection_Sequence.hxx>
-#include <NCollection_Array1.hxx>
-
-#include <InterfaceGraphic_telem.hxx>
-
-#include <Handle_OpenGl_Workspace.hxx>
-#include <OpenGl_BVHClipPrimitiveSet.hxx>
-#include <OpenGl_BVHTreeSelector.hxx>
-
-class OpenGl_Structure;
-
-typedef NCollection_Sequence<const OpenGl_Structure*> OpenGl_SequenceOfStructure;
-typedef NCollection_Array1<OpenGl_SequenceOfStructure> OpenGl_ArrayOfStructure;
-
-class OpenGl_PriorityList
-{
-public:
-
-  // Empty constructor.
-  OpenGl_PriorityList (const Standard_Integer theNbPriorities = 11);
-
-  //! Destructor.
-  virtual ~OpenGl_PriorityList();
-
-  void Add (const OpenGl_Structure* theStructure,
-            const Standard_Integer  thePriority,
-            Standard_Boolean isForChangePriority = Standard_False);
-
-  //! Remove structure and returns its priority, if the structure is not found, method returns negative value
-  Standard_Integer Remove (const OpenGl_Structure* theStructure,
-                           Standard_Boolean isForChangePriority = Standard_False);
-
-  //! @return the number of structures
-  Standard_Integer NbStructures() const { return myNbStructures; }
-
-  // Render all structures.
-  void Render (const Handle(OpenGl_Workspace)& theWorkspace) const;
-
-  //! Returns the number of available priority levels
-  Standard_Integer NbPriorities() const;
-
-  //! Append priority list of acceptable type (with similar number of priorities
-  //! or less). Returns Standard_False if the list can not be accepted.
-  Standard_Boolean Append (const OpenGl_PriorityList& theOther);
-
-  //! Returns array of OpenGL structures.
-  const OpenGl_ArrayOfStructure& ArrayOfStructures() const { return myArray; }
-
-  //! Marks BVH tree for given priority list as dirty and
-  //! marks primitive set for rebuild.
-  void InvalidateBVHData();
-
-protected:
-
-  //! Traverses through BVH tree to determine which structures are in view volume.
-  void traverse (OpenGl_BVHTreeSelector& theSelector) const;
-
-  //! Iterates through the hierarchical list of existing structures and renders them all.
-  void renderAll (const Handle(OpenGl_Workspace)& theWorkspace) const;
-
-  //! Iterates through the hierarchical list of existing structures and renders only overlapping ones.
-  void renderTraverse (const Handle(OpenGl_Workspace)& theWorkspace) const;
-
-protected:
-
-  OpenGl_ArrayOfStructure            myArray;
-  Standard_Integer                   myNbStructures;
-  mutable OpenGl_BVHClipPrimitiveSet myBVHPrimitives;             //<! Set of OpenGl_Structures for building BVH tree
-  mutable Standard_Boolean           myBVHIsLeftChildQueuedFirst; //<! Is needed for implementation of stochastic order of BVH traverse
-  mutable Standard_Boolean           myIsBVHPrimitivesNeedsReset; //<! Defines if the primitive set for BVH is outdated
-
-public:
-
-  DEFINE_STANDARD_ALLOC
-
-};
-
-#endif // _OpenGl_PriorityList_Header
diff --git a/src/OpenGl/OpenGl_SequenceOfStructure.hxx b/src/OpenGl/OpenGl_SequenceOfStructure.hxx
new file mode 100644 (file)
index 0000000..3f33832
--- /dev/null
@@ -0,0 +1,24 @@
+// Created on: 2014-12-18
+// Created by: Kirill Gavrilov
+// Copyright (c) 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.
+
+#ifndef _OpenGl_SequenceOfStructure
+#define _OpenGl_SequenceOfStructure
+
+#include <NCollection_Sequence.hxx>
+
+class OpenGl_Structure;
+typedef NCollection_Sequence<const OpenGl_Structure*> OpenGl_SequenceOfStructure;
+
+#endif // _OpenGl_SequenceOfStructure
index a4013e8..d621ba5 100644 (file)
@@ -73,10 +73,6 @@ public:
     const Handle(OpenGl_Texture) aPrevTexture = theWorkspace->DisableTexture();
 
     glDisable (GL_LIGHTING);
-    if ((theWorkspace->NamedStatus & OPENGL_NS_IMMEDIATE) != 0)
-    {
-      glDepthMask (GL_FALSE);
-    }
 
     // Use highlight colors
     theWorkspace->GetGlContext()->core11->glColor3fv ((theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT) ? theWorkspace->HighlightColor->rgb : anAspectLine->Color().rgb);
@@ -130,14 +126,12 @@ OpenGl_Structure::OpenGl_Structure (const Handle(Graphic3d_StructureManager)& th
   myAspectMarker(NULL),
   myAspectText(NULL),
   myHighlightColor(NULL),
-  myNamedStatus(0),
-  myZLayer(0),
   myIsRaytracable (Standard_False),
   myModificationState (0),
   myIsCulled (Standard_True),
   myIsMirrored (Standard_False)
 {
-  UpdateNamedStatus();
+  //
 }
 
 // =======================================================================
@@ -366,15 +360,11 @@ void OpenGl_Structure::clearHighlightColor (const Handle(OpenGl_Context)& theGlC
 }
 
 // =======================================================================
-// function : UpdateNamedStatus
+// function : OnVisibilityChanged
 // purpose  :
 // =======================================================================
-void OpenGl_Structure::UpdateNamedStatus()
+void OpenGl_Structure::OnVisibilityChanged()
 {
-  myNamedStatus = 0;
-  if (highlight) myNamedStatus |= OPENGL_NS_HIGHLIGHT;
-  if (!visible)  myNamedStatus |= OPENGL_NS_HIDE;
-
   if (myIsRaytracable)
   {
     UpdateStateWithAncestorStructures();
@@ -627,7 +617,7 @@ void OpenGl_Structure::RenderGeometry (const Handle(OpenGl_Workspace) &theWorksp
 void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) const
 {
   // Process the structure only if visible
-  if (myNamedStatus & OPENGL_NS_HIDE)
+  if (!visible)
   {
     return;
   }
@@ -636,7 +626,10 @@ void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) con
 
   // Render named status
   const Standard_Integer aNamedStatus = theWorkspace->NamedStatus;
-  theWorkspace->NamedStatus |= myNamedStatus;
+  if (highlight)
+  {
+    theWorkspace->NamedStatus |= OPENGL_NS_HIGHLIGHT;
+  }
 
   // Do we need to restore GL_NORMALIZE?
   const Standard_Boolean anOldGlNormalize = aCtx->IsGlNormalizeEnabled();
@@ -861,24 +854,6 @@ void OpenGl_Structure::ReleaseGlResources (const Handle(OpenGl_Context)& theGlCt
 }
 
 //=======================================================================
-//function : SetZLayer
-//purpose  :
-//=======================================================================
-void OpenGl_Structure::SetZLayer (const Standard_Integer theLayerIndex)
-{
-  myZLayer = theLayerIndex;
-}
-
-//=======================================================================
-//function : GetZLayer
-//purpose  :
-//=======================================================================
-Standard_Integer OpenGl_Structure::GetZLayer () const
-{
-  return myZLayer;
-}
-
-//=======================================================================
 //function : ShadowLink
 //purpose  :
 //=======================================================================
index 24ce516..3305645 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <OpenGl_Group.hxx>
 #include <OpenGl_Matrix.hxx>
-#include <OpenGl_NamedStatus.hxx>
 #include <OpenGl_Vec.hxx>
 #include <OpenGl_Workspace.hxx>
 
@@ -67,7 +66,7 @@ public:
   Standard_EXPORT OpenGl_Structure (const Handle(Graphic3d_StructureManager)& theManager);
 
   //! Setup structure graphic state
-  Standard_EXPORT virtual void UpdateNamedStatus();
+  Standard_EXPORT virtual void OnVisibilityChanged() Standard_OVERRIDE;
 
   //! Clear graphic data
   Standard_EXPORT virtual void Clear();
@@ -129,16 +128,8 @@ public:
 
   void clearHighlightColor (const Handle(OpenGl_Context)& theGlCtx);
 
-  Standard_Boolean IsVisible() const { return !(myNamedStatus & OPENGL_NS_HIDE); }
-
   Standard_EXPORT void Clear (const Handle(OpenGl_Context)& theGlCtx);
 
-  //! Set z layer ID to display the structure in specified layer
-  Standard_EXPORT void SetZLayer (const Standard_Integer theLayerIndex);
-
-  //! Get z layer ID
-  Standard_EXPORT Standard_Integer GetZLayer() const;
-
   //! Renders groups of structure without applying any attributes (i.e. transform, material etc).
   virtual void RenderGeometry  (const Handle(OpenGl_Workspace)& theWorkspace) const;
 
@@ -239,9 +230,6 @@ protected:
   Handle(OpenGl_Group)       myHighlightBox;
   TEL_COLOUR*                myHighlightColor;
 
-  int                        myNamedStatus;
-  int                        myZLayer;
-
   OpenGl_ListOfStructure           myConnected;
 
   mutable OpenGl_ListOfStructure   myAncestorStructures;
index ff2885e..e1b1e86 100644 (file)
@@ -139,37 +139,37 @@ class OpenGl_View : public MMgt_TShared
   //! The structure will be added to associated with it z layer.
   //! If the z layer is not presented in the view, the structure will
   //! be displayed in default bottom-level z layer.
-  void DisplayStructure (const OpenGl_Structure* theStructure,
-                         const Standard_Integer  thePriority);
+  void DisplayStructure (const Handle(Graphic3d_Structure)& theStructure,
+                         const Standard_Integer             thePriority);
 
   //! Erase structure from display list.
-  void EraseStructure (const OpenGl_Structure* theStructure);
+  void EraseStructure (const Handle(Graphic3d_Structure)& theStructure);
 
   //! Add structure to the list of immediate structures.
-  void DisplayImmediateStructure (const OpenGl_Structure* theStructure);
+  void DisplayImmediateStructure (const Handle(Graphic3d_Structure)& theStructure);
 
   //! Erase structure from display list.
   void EraseImmediateStructure (const OpenGl_Structure* theStructure);
 
   //! Insert a new top-level z layer with ID <theLayerId>
-  void AddZLayer (const Standard_Integer theLayerId);
+  void AddZLayer (const Graphic3d_ZLayerId theLayerId);
 
   //! Remove a z layer with ID <theLayerId>
-  void RemoveZLayer (const Standard_Integer theLayerId);
+  void RemoveZLayer (const Graphic3d_ZLayerId theLayerId);
 
   //! Display structure in z layer with ID <theNewLayerId>
   //! If the layer with ID <theNewLayerId> is not presented in the view,
   //! the structure will be displayed in default bottom-level layer.
-  void ChangeZLayer (const OpenGl_Structure *theStructure,
-                     const Standard_Integer  theNewLayerId);
+  void ChangeZLayer (const OpenGl_Structure*  theStructure,
+                     const Graphic3d_ZLayerId theNewLayerId);
 
   //! Sets the settings for a single Z layer of specified view.
-  void SetZLayerSettings (const Standard_Integer theLayerId,
-                          const Graphic3d_ZLayerSettings theSettings);
+  void SetZLayerSettings (const Graphic3d_ZLayerId        theLayerId,
+                          const Graphic3d_ZLayerSettings& theSettings);
 
   //! Changes the priority of a structure within its ZLayer
-  void ChangePriority (const OpenGl_Structure *theStructure,
-                       const Standard_Integer theNewPriority);
+  void ChangePriority (const OpenGl_Structure* theStructure,
+                       const Standard_Integer  theNewPriority);
 
   void CreateBackgroundTexture (const Standard_CString AFileName, const Aspect_FillMethod AFillStyle);
   void SetBackgroundTextureStyle (const Aspect_FillMethod FillStyle);
@@ -180,7 +180,8 @@ class OpenGl_View : public MMgt_TShared
                const Handle(OpenGl_Workspace)&      theWorkspace,
                const Graphic3d_CView&               theCView,
                const Aspect_CLayer2d&               theCUnderLayer,
-               const Aspect_CLayer2d&               theCOverLayer);
+               const Aspect_CLayer2d&               theCOverLayer,
+               const Standard_Boolean               theToDrawImmediate);
 
 
   void DrawBackground (OpenGl_Workspace& theWorkspace);
@@ -215,12 +216,20 @@ class OpenGl_View : public MMgt_TShared
     return myImmediateList;
   }
 
+  //! Returns true if there are immediate structures to display
+  bool HasImmediateStructures() const
+  {
+    return !myImmediateList.IsEmpty()
+         || myZLayers.NbImmediateStructures() != 0;
+  }
+
   //! Returns modification state for ray-tracing.
   Standard_Size ModificationState() const { return myModificationState; }
 
 protected:
 
-  void RenderStructs (const Handle(OpenGl_Workspace) &AWorkspace);
+  void RenderStructs (const Handle(OpenGl_Workspace)& theWorkspace,
+                      const Standard_Boolean          theToDrawImmediate);
   void RedrawLayer2d (const Handle(OpenGl_PrinterContext)& thePrintContext,
                       const Handle(OpenGl_Workspace) &theWorkspace,
                       const Graphic3d_CView&               theCView,
@@ -231,13 +240,9 @@ protected:
   //! lights, structures. The peculiar properties of "scene" is that
   //! it requires empty Z-Buffer and uses projection and orientation
   //! matrices supplied by 3d view.
-  //! @param thePrintCtx [in] printer context which facilitates tiled printing.
-  //! @param theWorkspace [in] rendering workspace.
-  //! @param theCView [in] view data.
-  //! @param theProjection [in] view projection matrix.
-  //! @param theOrientation [in] view orientation matrix.
   void RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintContext,
-                    const Handle(OpenGl_Workspace)& theWorkspace);
+                    const Handle(OpenGl_Workspace)&      theWorkspace,
+                    const Standard_Boolean               theToDrawImmediate);
 
   Handle(OpenGl_LineAttributes) myLineAttribs;
   Handle(OpenGl_Texture)        myTextureEnv;
index ba6f1d1..e088cda 100644 (file)
@@ -360,10 +360,11 @@ void OpenGl_View::DrawBackground (OpenGl_Workspace& theWorkspace)
 
 //call_func_redraw_all_structs_proc
 void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
-                          const Handle(OpenGl_Workspace) &theWorkspace,
-                          const Graphic3d_CView& theCView,
-                          const Aspect_CLayer2d& theCUnderLayer,
-                          const Aspect_CLayer2d& theCOverLayer)
+                          const Handle(OpenGl_Workspace)&      theWorkspace,
+                          const Graphic3d_CView&               theCView,
+                          const Aspect_CLayer2d&               theCUnderLayer,
+                          const Aspect_CLayer2d&               theCOverLayer,
+                          const Standard_Boolean               theToDrawImmediate)
 {
   // ==================================
   //      Step 1: Prepare for redraw
@@ -448,7 +449,8 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
   // ====================================
 
   // Render background
-  if (theWorkspace->ToRedrawGL())
+  if (theWorkspace->ToRedrawGL()
+  && !theToDrawImmediate)
   {
     DrawBackground (*theWorkspace);
   }
@@ -461,8 +463,10 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
   // =================================
   //      Step 3: Draw underlayer
   // =================================
-
-  RedrawLayer2d (thePrintContext, theWorkspace, theCView, theCUnderLayer);
+  if (!theToDrawImmediate)
+  {
+    RedrawLayer2d (thePrintContext, theWorkspace, theCView, theCUnderLayer);
+  }
 
   // =================================
   //      Step 4: Redraw main plane
@@ -552,7 +556,7 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
   {
     // single-pass monographic rendering
     // redraw scene with normal orientation and projection
-    RedrawScene (thePrintContext, theWorkspace);
+    RedrawScene (thePrintContext, theWorkspace, theToDrawImmediate);
   }
   else
   {
@@ -565,7 +569,7 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
     aContext->ApplyProjectionMatrix();
 
     // redraw left Eye
-    RedrawScene (thePrintContext, theWorkspace);
+    RedrawScene (thePrintContext, theWorkspace, theToDrawImmediate);
 
     // reset depth buffer of first rendering pass
     if (theWorkspace->UseDepthTest())
@@ -579,7 +583,7 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
     aContext->ApplyProjectionMatrix();
 
     // redraw right Eye
-    RedrawScene (thePrintContext, theWorkspace);
+    RedrawScene (thePrintContext, theWorkspace, theToDrawImmediate);
 
     // switch back to monographic rendering
     aContext->SetDrawBufferMono();
@@ -609,7 +613,8 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
   }
 
   // Render trihedron
-  if (theWorkspace->ToRedrawGL())
+  if (theWorkspace->ToRedrawGL()
+  && !theToDrawImmediate)
   {
     RedrawTrihedron (theWorkspace);
 
@@ -629,13 +634,15 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
   // ===============================
   //      Step 6: Redraw overlay
   // ===============================
+  if (!theToDrawImmediate)
+  {
+    const int aMode = 0;
+    theWorkspace->DisplayCallback (theCView, (aMode | OCC_PRE_OVERLAY));
 
-  const int aMode = 0;
-  theWorkspace->DisplayCallback (theCView, (aMode | OCC_PRE_OVERLAY));
-
-  RedrawLayer2d (thePrintContext, theWorkspace, theCView, theCOverLayer);
+    RedrawLayer2d (thePrintContext, theWorkspace, theCView, theCOverLayer);
 
-  theWorkspace->DisplayCallback (theCView, aMode);
+    theWorkspace->DisplayCallback (theCView, aMode);
+  }
 
   // ===============================
   //      Step 7: Finalize
@@ -671,7 +678,7 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
 // function : InvalidateBVHData
 // purpose  :
 // =======================================================================
-void OpenGl_View::InvalidateBVHData (const Standard_Integer theLayerId)
+void OpenGl_View::InvalidateBVHData (const Graphic3d_ZLayerId theLayerId)
 {
   myZLayers.InvalidateBVHData (theLayerId);
 }
@@ -679,7 +686,8 @@ void OpenGl_View::InvalidateBVHData (const Standard_Integer theLayerId)
 /*----------------------------------------------------------------------*/
 
 //ExecuteViewDisplay
-void OpenGl_View::RenderStructs (const Handle(OpenGl_Workspace) &AWorkspace)
+void OpenGl_View::RenderStructs (const Handle(OpenGl_Workspace)& AWorkspace,
+                                 const Standard_Boolean          theToDrawImmediate)
 {
   if ( myZLayers.NbStructures() <= 0 )
     return;
@@ -718,7 +726,7 @@ void OpenGl_View::RenderStructs (const Handle(OpenGl_Workspace) &AWorkspace)
     }
   }
 
-  myZLayers.Render (AWorkspace);
+  myZLayers.Render (AWorkspace, theToDrawImmediate);
 
 #if !defined(GL_ES_VERSION_2_0)
   //TsmPopAttri(); /* restore previous graphics context; before update lights */
@@ -1004,7 +1012,7 @@ void OpenGl_View::SetBackgroundGradientType (const Aspect_GradientFillMethod ATy
 //purpose  :
 //=======================================================================
 
-void OpenGl_View::AddZLayer (const Standard_Integer theLayerId)
+void OpenGl_View::AddZLayer (const Graphic3d_ZLayerId theLayerId)
 {
   myZLayers.AddLayer (theLayerId);
 }
@@ -1014,7 +1022,7 @@ void OpenGl_View::AddZLayer (const Standard_Integer theLayerId)
 //purpose  :
 //=======================================================================
 
-void OpenGl_View::RemoveZLayer (const Standard_Integer theLayerId)
+void OpenGl_View::RemoveZLayer (const Graphic3d_ZLayerId theLayerId)
 {
   myZLayers.RemoveLayer (theLayerId);
 }
@@ -1024,11 +1032,12 @@ void OpenGl_View::RemoveZLayer (const Standard_Integer theLayerId)
 //purpose  :
 //=======================================================================
 
-void OpenGl_View::DisplayStructure (const OpenGl_Structure *theStructure,
-                                    const Standard_Integer  thePriority)
+void OpenGl_View::DisplayStructure (const Handle(Graphic3d_Structure)& theStructure,
+                                    const Standard_Integer             thePriority)
 {
-  Standard_Integer aZLayer = theStructure->GetZLayer ();
-  myZLayers.AddStructure (theStructure, aZLayer, thePriority);
+  const OpenGl_Structure*  aStruct = reinterpret_cast<const OpenGl_Structure*> (theStructure->CStructure().operator->());
+  const Graphic3d_ZLayerId aZLayer = aStruct->ZLayer();
+  myZLayers.AddStructure (aStruct, aZLayer, thePriority);
 }
 
 //=======================================================================
@@ -1036,18 +1045,19 @@ void OpenGl_View::DisplayStructure (const OpenGl_Structure *theStructure,
 //purpose  :
 //=======================================================================
 
-void OpenGl_View::DisplayImmediateStructure (const OpenGl_Structure* theStructure)
+void OpenGl_View::DisplayImmediateStructure (const Handle(Graphic3d_Structure)& theStructure)
 {
+  const OpenGl_Structure* aStruct = reinterpret_cast<const OpenGl_Structure*> (theStructure->CStructure().operator->());
   for (OpenGl_SequenceOfStructure::Iterator anIter (myImmediateList);
        anIter.More(); anIter.Next())
   {
-    if (anIter.Value() == theStructure)
+    if (anIter.Value() == aStruct)
     {
       return;
     }
   }
 
-  myImmediateList.Append (theStructure);
+  myImmediateList.Append (aStruct);
 }
 
 //=======================================================================
@@ -1055,10 +1065,9 @@ void OpenGl_View::DisplayImmediateStructure (const OpenGl_Structure* theStructur
 //purpose  :
 //=======================================================================
 
-void OpenGl_View::EraseStructure (const OpenGl_Structure *theStructure)
+void OpenGl_View::EraseStructure (const Handle(Graphic3d_Structure)& theStructure)
 {
-  Standard_Integer aZLayer = theStructure->GetZLayer ();
-  myZLayers.RemoveStructure (theStructure, aZLayer);
+  myZLayers.RemoveStructure (theStructure);
 }
 
 //=======================================================================
@@ -1084,10 +1093,10 @@ void OpenGl_View::EraseImmediateStructure (const OpenGl_Structure* theStructure)
 //purpose  :
 //=======================================================================
 
-void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure,
-                                const Standard_Integer  theNewLayerId)
+void OpenGl_View::ChangeZLayer (const OpenGl_Structure*  theStructure,
+                                const Graphic3d_ZLayerId theNewLayerId)
 {
-  Standard_Integer anOldLayer = theStructure->GetZLayer ();
+  const Graphic3d_ZLayerId anOldLayer = theStructure->ZLayer();
   myZLayers.ChangeLayer (theStructure, anOldLayer, theNewLayerId);
 }
 
@@ -1095,10 +1104,10 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure,
 //function : SetZLayerSettings
 //purpose  :
 //=======================================================================
-void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId,
-                                     const Graphic3d_ZLayerSettings theSettings)
+void OpenGl_View::SetZLayerSettings (const Graphic3d_ZLayerId        theLayerId,
+                                     const Graphic3d_ZLayerSettings& theSettings)
 {
-  myZLayers.Layer (theLayerId).SetLayerSettings (theSettings);
+  myZLayers.SetLayerSettings (theLayerId, theSettings);
 }
 
 //=======================================================================
@@ -1108,7 +1117,7 @@ void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId,
 void OpenGl_View::ChangePriority (const OpenGl_Structure *theStructure,
                                   const Standard_Integer theNewPriority)
 {
-  Standard_Integer aLayerId = theStructure->GetZLayer();
+  const Graphic3d_ZLayerId aLayerId = theStructure->ZLayer();
   myZLayers.ChangePriority (theStructure, aLayerId, theNewPriority);
 }
 
@@ -1118,7 +1127,8 @@ void OpenGl_View::ChangePriority (const OpenGl_Structure *theStructure,
 //=======================================================================
 
 void OpenGl_View::RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintContext,
-                               const Handle(OpenGl_Workspace)& theWorkspace)
+                               const Handle(OpenGl_Workspace)&      theWorkspace,
+                               const Standard_Boolean               theToDrawImmediate)
 {
   const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
 
@@ -1246,14 +1256,14 @@ void OpenGl_View::RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintCont
       theWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX;
       theWorkspace->DisableTexture();
       // Render the view
-      RenderStructs (theWorkspace);
+      RenderStructs (theWorkspace, theToDrawImmediate);
       break;
 
     case Visual3d_TOD_ENVIRONMENT:
       theWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX;
       theWorkspace->EnableTexture (myTextureEnv);
       // Render the view
-      RenderStructs (theWorkspace);
+      RenderStructs (theWorkspace, theToDrawImmediate);
       theWorkspace->DisableTexture();
       break;
 
@@ -1261,7 +1271,7 @@ void OpenGl_View::RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintCont
       // First pass
       theWorkspace->NamedStatus &= ~OPENGL_NS_FORBIDSETTEX;
       // Render the view
-      RenderStructs (theWorkspace);
+      RenderStructs (theWorkspace, theToDrawImmediate);
       theWorkspace->DisableTexture();
 
       // Second pass
@@ -1294,7 +1304,7 @@ void OpenGl_View::RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintCont
         theWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX;
 
         // Render the view
-        RenderStructs (theWorkspace);
+        RenderStructs (theWorkspace, theToDrawImmediate);
         theWorkspace->DisableTexture();
 
         // Restore properties back
index 75afc33..fdeaeb5 100644 (file)
@@ -684,7 +684,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView,
       redraw1 (theCView, anEmptyCLayer, anEmptyCLayer, 0);
       myOpenGlFBO->UnbindBuffer (aGlCtx);
 
-      const Standard_Boolean isImmediate = !myView->ImmediateStructures().IsEmpty();
+      const Standard_Boolean isImmediate = myView->HasImmediateStructures();
       Raytrace (theCView, aSizeX, aSizeY, isImmediate ? 0 : toSwap,
                 theCOverLayer, theCUnderLayer, aFrameBuffer);
 
@@ -707,7 +707,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView,
       aFrameBuffer->BindBuffer (aGlCtx);
     }
 
-    const Standard_Boolean isImmediate = !myView->ImmediateStructures().IsEmpty();
+    const Standard_Boolean isImmediate = myView->HasImmediateStructures();
     redraw1 (theCView, theCUnderLayer, theCOverLayer, isImmediate ? 0 : toSwap);
     if (isImmediate)
     {
@@ -811,7 +811,7 @@ void OpenGl_Workspace::redraw1 (const Graphic3d_CView& theCView,
   glClear (toClear);
 
   Handle(OpenGl_Workspace) aWS (this);
-  myView->Render (myPrintContext, aWS, theCView, theCUnderLayer, theCOverLayer);
+  myView->Render (myPrintContext, aWS, theCView, theCUnderLayer, theCOverLayer, Standard_False);
 
   // swap the buffers
   if (theToSwap)
@@ -856,6 +856,7 @@ void OpenGl_Workspace::copyBackToFront()
 
   glRasterPos2i (0, 0);
   glCopyPixels  (0, 0, myWidth + 1, myHeight + 1, GL_COLOR);
+  //glCopyPixels  (0, 0, myWidth + 1, myHeight + 1, GL_DEPTH);
 
   EnableFeatures();
 
@@ -906,7 +907,7 @@ void OpenGl_Workspace::RedrawImmediate (const Graphic3d_CView& theCView,
 #if !defined(GL_ES_VERSION_2_0)
   glGetBooleanv (GL_DOUBLEBUFFER, &isDoubleBuffer);
 #endif
-  if (myView->ImmediateStructures().IsEmpty())
+  if (!myView->HasImmediateStructures())
   {
     if (theToForce
      || !myIsImmediateDrawn)
@@ -944,20 +945,49 @@ void OpenGl_Workspace::RedrawImmediate (const Graphic3d_CView& theCView,
   }
   myIsImmediateDrawn = Standard_True;
 
-  NamedStatus |= OPENGL_NS_IMMEDIATE;
-  ///glDisable (GL_LIGHTING);
-  glDisable (GL_DEPTH_TEST);
-
   Handle(OpenGl_Workspace) aWS (this);
+
+  if (myUseZBuffer)
+  {
+    glDepthFunc (GL_LEQUAL);
+    glDepthMask (GL_TRUE);
+    if (myUseDepthTest)
+    {
+      glEnable (GL_DEPTH_TEST);
+    }
+    else
+    {
+      glDisable (GL_DEPTH_TEST);
+    }
+
+  #if !defined(GL_ES_VERSION_2_0)
+    glClearDepth (1.0);
+  #else
+    glClearDepthf (1.0f);
+  #endif
+  }
+  else
+  {
+    glDisable (GL_DEPTH_TEST);
+  }
+
+  myView->Render (myPrintContext, aWS, theCView, theCUnderLayer, theCOverLayer, Standard_True);
+  if (!myView->ImmediateStructures().IsEmpty())
+  {
+    glDisable (GL_DEPTH_TEST);
+  }
   for (OpenGl_SequenceOfStructure::Iterator anIter (myView->ImmediateStructures());
        anIter.More(); anIter.Next())
   {
     const OpenGl_Structure* aStructure = anIter.Value();
+    if (!aStructure->IsVisible())
+    {
+      continue;
+    }
+
     aStructure->Render (aWS);
   }
 
-  NamedStatus &= ~OPENGL_NS_IMMEDIATE;
-
   if (isDoubleBuffer && myTransientDrawToFront)
   {
     glFlush();
index 9f4e4fb..cff5b57 100644 (file)
@@ -71,18 +71,14 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceGeometry (GeomUpdateMode theMod
 
   for (OpenGl_SequenceOfLayers::Iterator anLayerIt (aList.Layers()); anLayerIt.More(); anLayerIt.Next())
   {
-    const OpenGl_PriorityList& aPriorityList = anLayerIt.Value().PriorityList();
-
-    if (aPriorityList.NbStructures() == 0)
+    const OpenGl_Layer& aLayer = anLayerIt.Value();
+    if (aLayer.NbStructures() == 0)
       continue;
 
-    const OpenGl_ArrayOfStructure& aStructArray = aPriorityList.ArrayOfStructures();
-
+    const OpenGl_ArrayOfStructure& aStructArray = aLayer.ArrayOfStructures();
     for (Standard_Integer anIndex = 0; anIndex < aStructArray.Length(); ++anIndex)
     {
-      OpenGl_SequenceOfStructure::Iterator aStructIt;
-
-      for (aStructIt.Init (aStructArray (anIndex)); aStructIt.More(); aStructIt.Next())
+      for (OpenGl_SequenceOfStructure::Iterator aStructIt (aStructArray (anIndex)); aStructIt.More(); aStructIt.Next())
       {
         const OpenGl_Structure* aStructure = aStructIt.Value();
 
@@ -97,7 +93,9 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceGeometry (GeomUpdateMode theMod
         {
           if (!aStructure->IsRaytracable()
            || !aStructure->IsVisible())
+          {
             continue;
+          }
 
           for (OpenGl_Structure::GroupIterator aGroupIter (aStructure->DrawGroups()); aGroupIter.More(); aGroupIter.Next())
           {
index 4a59f66..a484fb1 100644 (file)
@@ -82,27 +82,9 @@ is
        ---Purpose: Returns the new Structure defined for the new visualization
        ---Category: Methods to modify the class definition
 
-
----Category: Highlighting methods.
---           
-    Highlight(me: mutable) is static;
-       ---Purpose: displays the whole content of the presentation in white.
-    Color(me: mutable; aColor: NameOfColor from Quantity) is static;
-       ---Purpose: displays the whole content of the presentation in the specified color.
-    BoundBox(me: mutable) is static;
-
-    SetIsForHighlight (me             : mutable;
-                       isForHighlight : Boolean from Standard)
-        is virtual;
-    ---Purpose: marks the structure <me> representing wired structure needed for
-    --          highlight only so it won't be added to BVH tree.
-
 ---Category: Global modification methods.
     SetShadingAspect(me: mutable; aShadingAspect: ShadingAspect from Prs3d);
-    
----Category: Inquire methods.
-    IsPickable(me) returns Boolean from Standard;
-    
+
 ---Category: Transformation methods.
     Transform   (me: mutable; aTransformation: Transformation from Geom);
     Place       (me: mutable; X,Y,Z: Length from Quantity);
@@ -116,9 +98,6 @@ is
     Remove (me: mutable; aPresentation: Presentation from Prs3d);
     RemoveAll (me: mutable);
 
-    SetPickable(me: mutable) is static;
-    SetUnPickable(me: mutable) is static;
-
     CurrentGroup(me) returns Group from Graphic3d is static private;
 
 friends
index 57bcb11..ae0262d 100644 (file)
@@ -100,38 +100,6 @@ Prs3d_Presentation::Prs3d_Presentation (const Handle(Graphic3d_StructureManager)
 }
 
 //=======================================================================
-//function : Highlight
-//purpose  : 
-//=======================================================================
-void Prs3d_Presentation::Highlight()
-{
-  SetHighlightColor(Quantity_Color(Quantity_NOC_GRAY99));
-  Aspect_TypeOfHighlightMethod Method = Aspect_TOHM_COLOR;
-  Graphic3d_Structure::Highlight(Method);
-}
-
-//=======================================================================
-//function : Color
-//purpose  : 
-//=======================================================================
-void Prs3d_Presentation::Color(const Quantity_NameOfColor aColor) 
-{
-  SetHighlightColor(Quantity_Color(aColor));
-  Graphic3d_Structure::Highlight(Aspect_TOHM_COLOR);
-}
-
-//=======================================================================
-//function : BoundBox
-//purpose  : 
-//=======================================================================
-void Prs3d_Presentation::BoundBox()
-{ 
-  SetHighlightColor(Quantity_Color(Quantity_NOC_GRAY99));
-  Graphic3d_Structure::Highlight(Aspect_TOHM_BOUNDBOX);
-}
-
-
-//=======================================================================
 //function : SetShadingAspect
 //purpose  : 
 //=======================================================================
@@ -141,34 +109,6 @@ void Prs3d_Presentation::SetShadingAspect(const Handle(Prs3d_ShadingAspect)& aSh
 }
 
 //=======================================================================
-//function : IsPickable
-//purpose  : 
-//=======================================================================
-Standard_Boolean Prs3d_Presentation::IsPickable () const 
-{
-  return Graphic3d_Structure::IsSelectable();
-}
-
-//=======================================================================
-//function : SetPickable
-//purpose  : 
-//=======================================================================
-
-void Prs3d_Presentation::SetPickable() 
-{
-  SetPick(Standard_True);
-}
-
-//=======================================================================
-//function : SetUnPickable
-//purpose  : 
-//=======================================================================
-void Prs3d_Presentation::SetUnPickable() 
-{
-  SetPick(Standard_False);
-}
-
-//=======================================================================
 //function : Transform
 //purpose  : 
 //=======================================================================
@@ -287,15 +227,6 @@ Handle(Graphic3d_Group) Prs3d_Presentation::CurrentGroup () const
 }
 
 //=======================================================================
-//=======================================================================
-//function : SetIsForHighlight
-//purpose  :
-//=======================================================================
-void Prs3d_Presentation::SetIsForHighlight (const Standard_Boolean isForHighlight)
-{
-  Graphic3d_Structure::SetIsForHighlight (isForHighlight);
-}
-
 //function : Compute
 //purpose  : 
 //=======================================================================
index 990c749..db39877 100644 (file)
@@ -33,9 +33,12 @@ uses
 
     MMgt,TCollection,
     TopLoc,
-    Prs3d,Graphic3d,
+    Aspect,
+    Prs3d,
+    Graphic3d,
     Quantity,Geom,
-    V3d, 
+    Visual3d,
+    V3d,
     TColStd, 
     gp
  
index c4a26f7..a0d1a92 100644 (file)
@@ -63,12 +63,11 @@ uses
     Location               from TopLoc, 
     ClipPlane_Handle       from Graphic3d,
     SequenceOfHClipPlane   from Graphic3d,
-    --   ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate )
     TransModeFlags         from Graphic3d, 
     Pnt                    from gp,
     Trsf                   from gp, 
-    CTransPersStruct       from  Graphic3d      
-    --   ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate )
+    CTransPersStruct       from  Graphic3d,
+    ZLayerId from Graphic3d
 
 raises
     NotImplemented from Standard
@@ -246,22 +245,16 @@ is
    UpdateTransformation(me:mutable) is virtual;
     
    UpdateTransformation(me:mutable;P : Presentation from Prs3d) is virtual;
-    
+
    SetZLayer ( me         : mutable;
-               thePrsMgr  : PresentationManager from PrsMgr;
-               theLayerId : Integer from Standard )
+               theLayerId : ZLayerId from Graphic3d )
      is virtual;
-   ---Purpose: Set Z layer ID and update all presentations of
-   -- the presentable object. The layer can be set only for displayed object.
-   -- If all object presentations are removed, the layer ID will be set to 
-   -- default value when computing presentation. The layers mechanism allows
-   -- drawing objects in higher layers in overlay of objects in lower layers.
-    
-   GetZLayer ( me;
-               thePrsMgr  : PresentationManager from PrsMgr )
-     returns Integer from Standard is static;
-   ---Purpose: Get ID of Z layer. If no presentations of object is displayed,
-   -- and layer ID is unavailable, the -1 value is returned.
+   ---Purpose: Set Z layer ID and update all presentations of the presentable object.
+   -- The layers mechanism allows drawing objects in higher layers in overlay of objects in lower layers.
+
+   ZLayer ( me )
+     returns ZLayerId from Graphic3d is static;
+   ---Purpose: Get ID of Z layer.
 
    AddClipPlane (me : mutable; thePlane : ClipPlane_Handle from Graphic3d) is virtual;
    ---Purpose: Adds clip plane for graphical clipping for all display mode
@@ -333,7 +326,7 @@ fields
     myClipPlanes : SequenceOfHClipPlane from Graphic3d is protected;
     myTransformPersistence  :  CTransPersStruct  from  Graphic3d;
     myIsMutable : Boolean from Standard is protected;
-
+    myZLayer    : ZLayerId from Graphic3d is protected;
 
     myHasOwnPresentations : Boolean from Standard is protected; -- shows if object should have own presentations.
 
index 84c9284..be68dd8 100644 (file)
@@ -30,6 +30,7 @@
 PrsMgr_PresentableObject::PrsMgr_PresentableObject (const PrsMgr_TypeOfPresentation3d theType)
 : myTypeOfPresentation3d (theType),
   myIsMutable (Standard_False),
+  myZLayer (Graphic3d_ZLayerId_Default),
   myHasOwnPresentations (Standard_True),
   myParent (NULL)
 {
@@ -384,25 +385,34 @@ void PrsMgr_PresentableObject::RemoveChild (const Handle(PrsMgr_PresentableObjec
 //function : SetZLayer
 //purpose  :
 //=======================================================================
-void PrsMgr_PresentableObject::SetZLayer 
-  (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
-   const Standard_Integer theLayerId)
+void PrsMgr_PresentableObject::SetZLayer (const Graphic3d_ZLayerId theLayerId)
 {
-  if (!thePrsMgr.IsNull())
-    thePrsMgr->SetZLayer (this, theLayerId);
+  if (myZLayer == theLayerId)
+  {
+    return;
+  }
+
+  myZLayer = theLayerId;
+  for (Standard_Integer aPrsIter = 1; aPrsIter <= myPresentations.Length(); ++aPrsIter)
+  {
+    const PrsMgr_ModedPresentation& aModedPrs = myPresentations (aPrsIter);
+    if (aModedPrs.Presentation().IsNull()
+     || aModedPrs.Presentation()->Presentation().IsNull())
+    {
+      continue;
+    }
+
+    aModedPrs.Presentation()->Presentation()->SetZLayer (theLayerId);
+  }
 }
 
 //=======================================================================
-//function : GetZLayer
+//function : ZLayer
 //purpose  :
 //=======================================================================
-Standard_Integer PrsMgr_PresentableObject::GetZLayer 
-  (const Handle(PrsMgr_PresentationManager)& thePrsMgr) const
+Graphic3d_ZLayerId PrsMgr_PresentableObject::ZLayer() const
 {
-  if (!thePrsMgr.IsNull())
-    return thePrsMgr->GetZLayer (this);
-
-  return -1;
+  return myZLayer;
 }
 
 // =======================================================================
index 96f2767..c1923e2 100644 (file)
@@ -21,9 +21,11 @@ uses
 
   PresentationManager from PrsMgr,
   NameOfColor from Quantity,
+  Color       from Quantity,
   Transformation from Geom,
   Length from Quantity,
   ShadingAspect from Prs3d,
+  TypeOfHighlightMethod from Aspect,
   TypeOfPresentation3d from PrsMgr,
   DataStructureManager from Graphic3d,
   Structure from Graphic3d,
@@ -45,57 +47,52 @@ is
   ---C++:     alias ~
 
   Display (me : mutable)
-  is virtual private;
+  is private;
 
-  Display (me : mutable;
+  display (me : mutable;
            theIsHighlight : Boolean from Standard)
   is static private;
   ---Purpose: Displays myStructure.
 
   Erase (me : mutable)
-  is virtual private;
+  is private;
 
   SetVisible (me       : mutable;
               theValue : Boolean from Standard)
-  is virtual private;
+  is private;
 
-  Highlight (me : mutable) is virtual private;
+  Highlight (me : mutable;
+             theMethod : TypeOfHighlightMethod from Aspect;
+             theColor  : Color                 from Quantity) is private;
 
-  Unhighlight (me) is virtual private;
+  Unhighlight (me) is private;
 
   IsHighlighted (me) returns Boolean from Standard
-  is virtual private;
+  is private;
 
   IsDisplayed (me) returns Boolean from Standard
-  is virtual private;
+  is private;
 
   DisplayPriority(me) returns Integer from Standard
-  is virtual private;
+  is private;
 
   SetDisplayPriority(me:mutable;aNewPrior:Integer from Standard)
-  is virtual private;
+  is private;
 
   SetZLayer (me         : mutable;
              theLayerId : Integer from Standard)
-  is virtual private;
+  is private;
   ---Purpose: Set Z layer ID for the presentation
 
   GetZLayer (me) returns Integer from Standard
-  is virtual private;
+  is private;
   ---Purpose: Get Z layer ID for the presentation
 
   Clear (me : mutable)
-  is virtual private;
+  is private;
   ---Purpose: removes the whole content of the presentation.
   --          Does not remove the other connected presentations.
 
-  Color (me       : mutable;
-         theColor : NameOfColor from Quantity)
-  is virtual private;
-
-  BoundBox (me)
-  is static private;
-
 ---Category: references to other presentation.
 
   Connect (me;
index facc71e..b9c165a 100644 (file)
@@ -30,7 +30,7 @@ namespace
     State_Visible
   };
 
-  static BeforeHighlightState StructureState(const Handle(PrsMgr_Prs) theStructure)
+  static BeforeHighlightState StructureState(const Handle(PrsMgr_Prs)& theStructure)
   {
     return !theStructure->IsDisplayed() ?
       State_Empty : !theStructure->IsVisible() ?
@@ -61,15 +61,15 @@ PrsMgr_Presentation::PrsMgr_Presentation (const Handle(PrsMgr_PresentationManage
 //=======================================================================
 void PrsMgr_Presentation::Display()
 {
-  Display (Standard_False);
+  display (Standard_False);
   myBeforeHighlightState = State_Visible;
 }
 
 //=======================================================================
-//function : Display
+//function : display
 //purpose  :
 //=======================================================================
-void PrsMgr_Presentation::Display (const Standard_Boolean theIsHighlight)
+void PrsMgr_Presentation::display (const Standard_Boolean theIsHighlight)
 {
   if (!myStructure->IsDisplayed())
   {
@@ -116,15 +116,16 @@ void PrsMgr_Presentation::SetVisible (const Standard_Boolean theValue)
 //function : Highlight
 //purpose  :
 //=======================================================================
-void PrsMgr_Presentation::Highlight()
+void PrsMgr_Presentation::Highlight (const Aspect_TypeOfHighlightMethod theMethod,
+                                     const Quantity_Color&              theColor)
 {
   if (!IsHighlighted())
   {
     myBeforeHighlightState = StructureState (myStructure);
   }
 
-  Display (Standard_True);
-  myStructure->Highlight();
+  display (Standard_True);
+  myStructure->Highlight (theMethod, theColor);
 }
 
 //=======================================================================
@@ -170,30 +171,6 @@ void PrsMgr_Presentation::Clear()
 }
 
 //=======================================================================
-//function : Color
-//purpose  :
-//=======================================================================
-void PrsMgr_Presentation::Color (const Quantity_NameOfColor theColor)
-{
-  if (!IsHighlighted())
-  {
-    myBeforeHighlightState = StructureState (myStructure);
-  }
-
-  Display (Standard_True);
-  myStructure->Color (theColor);
-}
-
-//=======================================================================
-//function : BoundBox
-//purpose  :
-//=======================================================================
-void PrsMgr_Presentation::BoundBox() const
-{
-  myStructure->BoundBox();
-}
-
-//=======================================================================
 //function : IsDisplayed
 //purpose  :
 //=======================================================================
index 970982d..52dfb93 100644 (file)
@@ -28,10 +28,12 @@ uses
   PresentableObject   from PrsMgr,
   ListOfPresentations from PrsMgr,
   Length,NameOfColor  from Quantity,
+  Color               from Quantity,
   Transformation      from Geom,
   NameOfMaterial      from Graphic3d,
   Presentation        from PrsMgr,
   View                from V3d,
+  ViewManager         from Visual3d,
   ShadingAspect       from Prs3d,
   Presentation        from Prs3d
 
@@ -41,7 +43,7 @@ raises
 
 is
 
-  Create (theStructureManager : StructureManager from Graphic3d)
+  Create (theStructureManager : ViewManager from Visual3d)
   returns PresentationManager from PrsMgr;
   ---Purpose:
   -- Creates a framework to manage displays and graphic entities with the 3D view theStructureManager.
@@ -232,30 +234,26 @@ is
 
   Presentation (me;
                 thePrsObject : PresentableObject from PrsMgr;
-                theMode      : Integer from Standard = 0)
+                theMode      : Integer from Standard = 0;
+                theToCreate  : Boolean from Standard = Standard_False)
   returns Presentation from PrsMgr
-  raises NoSuchObject from Standard
   is static;
-  ---Purpose: Returns the presentation Presentation of the presentable object thePrsObject in this framework. thePrsObject has the display mode theMode.
-
-  AddPresentation (me           : mutable;
-                   thePrsObject : PresentableObject from PrsMgr;
-                   theMode      : Integer from Standard = 0)
-  ---Purpose: Adds a presentation of the presentable object thePrsObject to this framework.
-  -- thePrsObject has the display mode theMode.
-  is protected;
+  ---Purpose: Returns the presentation Presentation of the presentable object thePrsObject in this framework.
+  -- When theToCreate is true - automatically creates presentation for specified mode when not exist.
 
   RemovePresentation (me           : mutable;
                       thePrsObject : PresentableObject from PrsMgr;
                       theMode      : Integer from Standard = 0)
+  returns Boolean from Standard
   ---Purpose: Removes a presentation of the presentable object thePrsObject to this framework. thePrsObject has the display mode theMode.
   is protected;
 
 fields
 
-  myStructureManager : StructureManager    from Graphic3d is protected;
+  myStructureManager : ViewManager         from Visual3d  is protected;
   myImmediateModeOn  : Integer             from Standard  is protected;
   myImmediateList    : ListOfPresentations from PrsMgr    is protected;
   myImmediateView    : View                from V3d       is protected;
+  mySelectionColor   : Color               from Quantity  is protected;
 
 end PresentationManager from PrsMgr;
index 79fca1f..83bb668 100644 (file)
 // function : PrsMgr_PresentationManager
 // purpose  :
 // =======================================================================
-PrsMgr_PresentationManager::PrsMgr_PresentationManager (const Handle(Graphic3d_StructureManager)& theStructureManager)
+PrsMgr_PresentationManager::PrsMgr_PresentationManager (const Handle(Visual3d_ViewManager)& theStructureManager)
 : myStructureManager (theStructureManager),
-  myImmediateModeOn  (0)
+  myImmediateModeOn  (0),
+  mySelectionColor   (Quantity_NOC_GRAY99)
 {
   //
 }
@@ -45,15 +46,7 @@ void PrsMgr_PresentationManager::Display (const Handle(PrsMgr_PresentableObject)
 {
   if (thePrsObj->HasOwnPresentations())
   {
-    if (!HasPresentation (thePrsObj, theMode))
-    {
-      AddPresentation (thePrsObj, theMode);
-    }
-
-    Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
-
-    if (aPrs.IsNull()) return;
-
+    Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True);
     if (aPrs->MustBeUpdated())
     {
       Update (thePrsObj, theMode);
@@ -91,10 +84,21 @@ void PrsMgr_PresentationManager::Erase (const Handle(PrsMgr_PresentableObject)&
     Erase (anIter.Value(), theMode);
   }
 
-  if (HasPresentation (thePrsObj, theMode))
+  PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
+  for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
   {
-    Presentation (thePrsObj, theMode)->Erase();
-    RemovePresentation (thePrsObj, theMode);
+    const PrsMgr_ModedPresentation&           aModedPrs = aPrsList.Value (aPrsIter);
+    const Handle(PrsMgr_PresentationManager)& aPrsMgr   = aModedPrs.Presentation()->PresentationManager();
+    if (theMode == aPrsList (aPrsIter).Mode()
+     && this    == aPrsMgr)
+    {
+      if (!aModedPrs.Presentation().IsNull())
+      {
+        aModedPrs.Presentation()->Erase();
+      }
+      aPrsList.Remove (aPrsIter);
+      return;
+    }
   }
 }
 
@@ -110,9 +114,10 @@ void PrsMgr_PresentationManager::Clear (const Handle(PrsMgr_PresentableObject)&
     Clear (anIter.Value(), theMode);
   }
 
-  if (HasPresentation (thePrsObj, theMode))
+  const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
+  if (!aPrs.IsNull())
   {
-    Presentation (thePrsObj, theMode)->Clear();
+    aPrs->Clear();
   }
 }
 
@@ -152,14 +157,7 @@ void PrsMgr_PresentationManager::Highlight (const Handle(PrsMgr_PresentableObjec
     return;
   }
 
-  if (!HasPresentation (thePrsObj, theMode))
-  {
-    AddPresentation (thePrsObj, theMode);
-  }
-
-  if (!HasPresentation (thePrsObj, theMode)) return;
-
-  Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
+  Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True);
   if (aPrs->MustBeUpdated())
   {
     Update (thePrsObj, theMode);
@@ -168,12 +166,12 @@ void PrsMgr_PresentationManager::Highlight (const Handle(PrsMgr_PresentableObjec
   if (myImmediateModeOn > 0)
   {
     Handle(Prs3d_PresentationShadow) aShadow = new Prs3d_PresentationShadow (myStructureManager, aPrs->Presentation());
-    aShadow->Highlight();
+    aShadow->Highlight (Aspect_TOHM_COLOR, mySelectionColor);
     AddToImmediateList (aShadow);
   }
   else
   {
-    aPrs->Highlight();
+    aPrs->Highlight (Aspect_TOHM_COLOR, mySelectionColor);
   }
 }
 
@@ -189,9 +187,10 @@ void PrsMgr_PresentationManager::Unhighlight (const Handle(PrsMgr_PresentableObj
     Unhighlight (anIter.Value(), theMode);
   }
 
-  if (HasPresentation (thePrsObj, theMode))
+  const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
+  if (!aPrs.IsNull())
   {
-    Presentation (thePrsObj, theMode)->Unhighlight();
+    aPrs->Unhighlight();
   }
 }
 
@@ -208,9 +207,10 @@ void PrsMgr_PresentationManager::SetDisplayPriority (const Handle(PrsMgr_Present
     SetDisplayPriority (anIter.Value(), theMode, theNewPrior);
   }
 
-  if (HasPresentation (thePrsObj, theMode))
+  const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
+  if (!aPrs.IsNull())
   {
-    Presentation (thePrsObj, theMode)->SetDisplayPriority (theNewPrior);
+    aPrs->SetDisplayPriority (theNewPrior);
   }
 }
 
@@ -230,9 +230,10 @@ Standard_Integer PrsMgr_PresentationManager::DisplayPriority (const Handle(PrsMg
     }
   }
 
-  return HasPresentation (thePrsObj, theMode)
-       ? Presentation (thePrsObj, theMode)->DisplayPriority()
-       : 0;
+  const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
+  return !aPrs.IsNull()
+        ? aPrs->DisplayPriority()
+        : 0;
 }
 
 // =======================================================================
@@ -250,8 +251,9 @@ Standard_Boolean PrsMgr_PresentationManager::IsDisplayed (const Handle(PrsMgr_Pr
     }
   }
 
-  return HasPresentation (thePrsObj, theMode)
-      && Presentation    (thePrsObj, theMode)->IsDisplayed();
+  const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
+  return !aPrs.IsNull()
+       && aPrs->IsDisplayed();
 }
 
 // =======================================================================
@@ -269,8 +271,9 @@ Standard_Boolean PrsMgr_PresentationManager::IsHighlighted (const Handle(PrsMgr_
     }
   }
 
-  return HasPresentation (thePrsObj, theMode)
-      && Presentation    (thePrsObj, theMode)->IsHighlighted();
+  const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
+  return !aPrs.IsNull()
+       && aPrs->IsHighlighted();
 }
 
 // =======================================================================
@@ -284,10 +287,6 @@ void PrsMgr_PresentationManager::Update (const Handle(PrsMgr_PresentableObject)&
   {
     Update (anIter.Value(), theMode);
   }
-  if (!HasPresentation(thePrsObj, theMode))
-  {
-    return;
-  }
 
   Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
   if (!aPrs.IsNull())
@@ -405,14 +404,10 @@ Standard_Boolean PrsMgr_PresentationManager::HasPresentation (const Handle(PrsMg
 // purpose  :
 // =======================================================================
 Handle(PrsMgr_Presentation) PrsMgr_PresentationManager::Presentation (const Handle(PrsMgr_PresentableObject)& thePrsObj,
-                                                                      const Standard_Integer                  theMode) const
+                                                                      const Standard_Integer                  theMode,
+                                                                      const Standard_Boolean                  theToCreate) const
 {
   const PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
-  if (aPrsList.IsEmpty())
-  {
-    return Handle(PrsMgr_Presentation)();
-  }
-
   for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
   {
     const PrsMgr_ModedPresentation&           aModedPrs = aPrsList.Value (aPrsIter);
@@ -424,46 +419,41 @@ Handle(PrsMgr_Presentation) PrsMgr_PresentationManager::Presentation (const Hand
     }
   }
 
-  return Handle(PrsMgr_Presentation)();
-}
+  if (!theToCreate)
+  {
+    return Handle(PrsMgr_Presentation)();
+  }
 
-// =======================================================================
-// function : AddPresentation
-// purpose  :
-// =======================================================================
-void PrsMgr_PresentationManager::AddPresentation (const Handle(PrsMgr_PresentableObject)& thePrsObj,
-                                                  const Standard_Integer                  theMode)
-{
   Handle(PrsMgr_Presentation) aPrs = new PrsMgr_Presentation (this, thePrsObj);
+  aPrs->SetZLayer (thePrsObj->ZLayer());
   thePrsObj->Presentations().Append (PrsMgr_ModedPresentation (aPrs, theMode));
   thePrsObj->Fill (this, aPrs, theMode);
 
   // set layer index accordingly to object's presentations
-  const Standard_Integer aZLayerId = GetZLayer (thePrsObj);
-  if (aZLayerId >= 0)
-  {
-    aPrs->SetZLayer (aZLayerId);
-  }
   aPrs->SetUpdateStatus (Standard_False);
+  return aPrs;
 }
 
 // =======================================================================
 // function : RemovePresentation
 // purpose  :
 // =======================================================================
-void PrsMgr_PresentationManager::RemovePresentation (const Handle(PrsMgr_PresentableObject)& thePrsObj,
-                                                     const Standard_Integer                  theMode)
+Standard_Boolean PrsMgr_PresentationManager::RemovePresentation (const Handle(PrsMgr_PresentableObject)& thePrsObj,
+                                                                 const Standard_Integer                  theMode)
 {
   PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
   for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
   {
-    if (theMode == aPrsList (aPrsIter).Mode())
-    //  && this    == aPrsMgr) ??
+    const PrsMgr_ModedPresentation&           aModedPrs = aPrsList.Value (aPrsIter);
+    const Handle(PrsMgr_PresentationManager)& aPrsMgr   = aModedPrs.Presentation()->PresentationManager();
+    if (theMode == aPrsList (aPrsIter).Mode()
+     && this    == aPrsMgr)
     {
       aPrsList.Remove (aPrsIter);
-      break;
+      return Standard_True;
     }
   }
+  return Standard_False;
 }
 
 // =======================================================================
@@ -481,15 +471,8 @@ void PrsMgr_PresentationManager::SetZLayer (const Handle(PrsMgr_PresentableObjec
   {
     return;
   }
-  PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
-  for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
-  {
-    Handle(PrsMgr_Presentation) aPrs = aPrsList.ChangeValue (aPrsIter).Presentation();
-    if (aPrs->PresentationManager() == this)
-    {
-      aPrs->SetZLayer (theLayerId);
-    }
-  }
+
+  thePrsObj->SetZLayer (theLayerId);
 }
 
 // =======================================================================
@@ -498,28 +481,7 @@ void PrsMgr_PresentationManager::SetZLayer (const Handle(PrsMgr_PresentableObjec
 // =======================================================================
 Standard_Integer PrsMgr_PresentationManager::GetZLayer (const Handle(PrsMgr_PresentableObject)& thePrsObj) const
 {
-  for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
-  {
-    Standard_Integer aLayer = GetZLayer (anIter.Value());
-    if (aLayer != -1)
-    {
-      return aLayer;
-    }
-  }
-  if (!thePrsObj->HasOwnPresentations())
-  {
-    return -1;
-  }
-  const PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
-  for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
-  {
-    Handle(PrsMgr_Presentation) aPrs = aPrsList.Value (aPrsIter).Presentation();
-    if (aPrs->PresentationManager() == this)
-    {
-      return aPrs->GetZLayer();
-    }
-  }
-  return -1;
+  return thePrsObj->ZLayer();
 }
 
 // =======================================================================
@@ -531,15 +493,9 @@ void PrsMgr_PresentationManager::Connect (const Handle(PrsMgr_PresentableObject)
                                           const Standard_Integer                  theMode,
                                           const Standard_Integer                  theOtherMode)
 {
-  if (!HasPresentation (thePrsObject, theMode))
-  {
-    AddPresentation (thePrsObject, theMode);
-  }
-  if (!HasPresentation (theOtherObject, theOtherMode))
-  {
-    AddPresentation (theOtherObject, theOtherMode);
-  }
-  Presentation (thePrsObject, theMode)->Connect (Presentation (theOtherObject, theOtherMode));
+  Handle(PrsMgr_Presentation) aPrs      = Presentation (thePrsObject,   theMode,      Standard_True);
+  Handle(PrsMgr_Presentation) aPrsOther = Presentation (theOtherObject, theOtherMode, Standard_True);
+  aPrs->Connect (aPrsOther);
 }
 
 // =======================================================================
@@ -571,14 +527,7 @@ void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)&
     return;
   }
 
-  if (!HasPresentation (thePrsObj, theMode))
-  {
-    AddPresentation (thePrsObj, theMode);
-  }
-
-  if (!HasPresentation (thePrsObj, theMode)) return;
-
-  Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
+  Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True);
   if (aPrs->MustBeUpdated())
   {
     Update (thePrsObj, theMode);
@@ -587,12 +536,12 @@ void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)&
   if (myImmediateModeOn > 0)
   {
     Handle(Prs3d_PresentationShadow) aShadow = new Prs3d_PresentationShadow (myStructureManager, aPrs->Presentation());
-    aShadow->Color (theColor);
+    aShadow->Highlight (Aspect_TOHM_COLOR, theColor);
     AddToImmediateList (aShadow);
   }
   else
   {
-    aPrs->Color (theColor);
+    aPrs->Highlight (Aspect_TOHM_COLOR, theColor);
   }
 }
 
@@ -600,18 +549,15 @@ void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)&
 // function : BoundBox
 // purpose  :
 // =======================================================================
-void PrsMgr_PresentationManager::BoundBox (const Handle(PrsMgr_PresentableObject)& thePrsObject,
+void PrsMgr_PresentationManager::BoundBox (const Handle(PrsMgr_PresentableObject)& thePrsObj,
                                            const Standard_Integer                  theMode)
 {
-  if (!HasPresentation (thePrsObject, theMode))
-  {
-    AddPresentation (thePrsObject, theMode);
-  }
-  else if (Presentation (thePrsObject, theMode)->MustBeUpdated())
+  Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True);
+  if (aPrs->MustBeUpdated())
   {
-    Update (thePrsObject, theMode);
+    Update (thePrsObj, theMode);
   }
-  Presentation (thePrsObject, theMode)->BoundBox();
+  aPrs->Highlight (Aspect_TOHM_BOUNDBOX, mySelectionColor);
 }
 
 // =======================================================================
@@ -633,12 +579,13 @@ void PrsMgr_PresentationManager::SetShadingAspect (const Handle(PrsMgr_Presentab
 // function : SetShadingAspect
 // purpose  :
 // =======================================================================
-void PrsMgr_PresentationManager::SetShadingAspect (const Handle(PrsMgr_PresentableObject)& thePrsObject,
+void PrsMgr_PresentationManager::SetShadingAspect (const Handle(PrsMgr_PresentableObject)& thePrsObj,
                                                    const Handle(Prs3d_ShadingAspect)&      theShadingAspect,
                                                    const Standard_Integer                  theMode)
 {
-  if (HasPresentation (thePrsObject, theMode))
+  const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
+  if (!aPrs.IsNull())
   {
-    Presentation (thePrsObject, theMode)->SetShadingAspect (theShadingAspect);
+    aPrs->SetShadingAspect (theShadingAspect);
   }
 }
index 38a5ca2..14812cb 100644 (file)
@@ -36,7 +36,8 @@ uses
     NameOfColor            from Quantity,
     Location               from TopLoc,
     PresentationManager    from PrsMgr,
-    PresentationManager3d  from PrsMgr
+    PresentationManager3d  from PrsMgr,
+    ZLayerId               from Graphic3d
 
 raises
     NoSuchObject from Standard
@@ -161,8 +162,7 @@ is
     --          it always return FALSE.  
 
     SetZLayer ( me         : mutable;
-                thePrsMgr  : PresentationManager from PrsMgr;
-                theLayerId : Integer from Standard )
+                theLayerId : ZLayerId from Graphic3d )
       is virtual;
     ---Purpose: Set Z layer ID and update all presentations.
 
index 3517545..de07861 100644 (file)
@@ -153,8 +153,7 @@ Standard_Boolean SelectMgr_EntityOwner::IsForcedHilight () const
 //function : SetZLayer
 //purpose  :
 //=======================================================================
-void SelectMgr_EntityOwner::SetZLayer 
-  (const Handle(PrsMgr_PresentationManager)&,
-   const Standard_Integer)
+void SelectMgr_EntityOwner::SetZLayer (const Standard_Integer )
 {
+  //
 }
index 7ef3da8..624e401 100644 (file)
@@ -39,7 +39,8 @@ uses
     SequenceOfOwner       from SelectMgr,
     NameOfColor           from Quantity,
     EntityOwner           from SelectMgr, 
-    TransModeFlags        from Graphic3d
+    TransModeFlags        from Graphic3d,
+    ZLayerId              from Graphic3d
 
 raises 
     NotImplemented from Standard
@@ -178,16 +179,12 @@ is
     
     GetSelectPresentation(   me: mutable;
                             TheMgr:  PresentationManager3d from PrsMgr )  returns Presentation from Prs3d  is  static; 
-       
+
    SetZLayer ( me         : mutable;
-               thePrsMgr  : PresentationManager from PrsMgr;
-               theLayerId : Integer from Standard )
+               theLayerId : ZLayerId from Graphic3d )
      is redefined virtual;
-   ---Purpose: Set Z layer ID and update all presentations of
-   -- the selectable object. The layer can be set only for displayed object.
-   -- If all object presentations are removed, the layer ID will be set to 
-   -- default value when computing presentation. The layers mechanism allows 
-   -- drawing objects in higher layers in overlay of objects in lower layers.
+   ---Purpose: Set Z layer ID and update all presentations of the selectable object.
+   -- The layers mechanism allows drawing objects in higher layers in overlay of objects in lower layers.
 
 fields
 
@@ -199,6 +196,3 @@ fields
     myHilightPrs        : Presentation from Prs3d;
 
 end SelectableObject;
-
-
-
index 764306e..070b52a 100644 (file)
@@ -322,15 +322,10 @@ Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetSelectPresentation( co
 //function : SetZLayer
 //purpose  :
 //=======================================================================
-void SelectMgr_SelectableObject::SetZLayer 
-  (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
-   const Standard_Integer theLayerId)
+void SelectMgr_SelectableObject::SetZLayer (const Graphic3d_ZLayerId theLayerId)
 {
-  if (thePrsMgr.IsNull())
-    return;
-
   // update own presentations
-  PrsMgr_PresentableObject::SetZLayer (thePrsMgr, theLayerId);
+  PrsMgr_PresentableObject::SetZLayer (theLayerId);
 
   // update selection presentations
   if (!mySelectionPrs.IsNull())
@@ -352,7 +347,7 @@ void SelectMgr_SelectableObject::SetZLayer
         Handle(SelectMgr_EntityOwner) aOwner = 
           Handle(SelectMgr_EntityOwner)::DownCast (aEntity->OwnerId());
         if (!aOwner.IsNull())
-          aOwner->SetZLayer (thePrsMgr, theLayerId);
+          aOwner->SetZLayer (theLayerId);
       }
     }
   }
index 7ea2e9e..2398868 100644 (file)
@@ -34,7 +34,8 @@ uses
     PresentationManager3d from PrsMgr,
     NameOfColor           from Quantity,
     Drawer                from Prs3d,
-    Shape                 from StdSelect
+    Shape                 from StdSelect,
+    ZLayerId              from Graphic3d
 is
 
 
@@ -145,8 +146,7 @@ is
     ResetLocation(me:mutable) is redefined;
 
     SetZLayer ( me         : mutable;
-                thePrsMgr  : PresentationManager from PrsMgr;
-                theLayerId : Integer from Standard )
+                theLayerId : ZLayerId from Graphic3d )
       is redefined virtual;
     ---Purpose: Set Z layer ID and update all presentations.
 
index a91bf45..36e3d1d 100644 (file)
@@ -87,6 +87,7 @@ void StdSelect_BRepOwner::Hilight(const Handle(PrsMgr_PresentationManager)& PM,
 #else
   Standard_Integer M = (myCurMode==-1) ? aMode:myCurMode;
 #endif
+  Handle(SelectMgr_SelectableObject) aSel = Selectable();
   if (myFromDecomposition)
   {
     // do the update flag check
@@ -99,23 +100,23 @@ void StdSelect_BRepOwner::Hilight(const Handle(PrsMgr_PresentationManager)& PM,
     }
 
     // generate new presentable shape
-    if(myPrsSh.IsNull())
+    if (myPrsSh.IsNull())
+    {
       myPrsSh = new StdSelect_Shape (myShape);
-
-    // highlight and set layer
-    PM->Highlight (myPrsSh, M);
-    Handle(SelectMgr_SelectableObject) aSel = Selectable();
+    }
     if (!aSel.IsNull())
     {
-      Standard_Integer aLayer = aSel->GetZLayer (PM);
-      if (aLayer >= 0)
-        PM->SetZLayer (myPrsSh, aLayer);
+      myPrsSh->SetZLayer (aSel->ZLayer());
     }
+
+    // highlight and set layer
+    PM->Highlight (myPrsSh, M);
+
   }  
   else
   {
     if(myPrsSh.IsNull())
-      PM->Highlight(Selectable(),M);
+      PM->Highlight(aSel,M);
     else
       PM->Highlight(myPrsSh,M);
   }
@@ -133,6 +134,7 @@ void StdSelect_BRepOwner::HilightWithColor(const Handle(PrsMgr_PresentationManag
 #else
   Standard_Integer M = (myCurMode==-1) ? aMode:myCurMode;
 #endif
+  Handle(SelectMgr_SelectableObject) aSel = Selectable();
   if (myFromDecomposition)
   {
     // do the update flag check
@@ -156,21 +158,18 @@ void StdSelect_BRepOwner::HilightWithColor(const Handle(PrsMgr_PresentationManag
       else
         myPrsSh = new StdSelect_Shape(myShape);
     }
-
-    // highlight with color and set layer
-    PM->Color (myPrsSh, aCol, M);
-    Handle(SelectMgr_SelectableObject) aSel = Selectable();
     if (!aSel.IsNull())
     {
-      Standard_Integer aLayer = aSel->GetZLayer (PM);
-      if (aLayer >= 0)
-        PM->SetZLayer (myPrsSh, aLayer);
+      myPrsSh->SetZLayer (aSel->ZLayer());
     }
+
+    // highlight with color and set layer
+    PM->Color (myPrsSh, aCol, M);
   }
   else
   {
     if(myPrsSh.IsNull())
-      PM->Color(Selectable(),aCol,M);
+      PM->Color(aSel, aCol, M);
     else
       PM->Color(myPrsSh,aCol,M);
   }
@@ -227,10 +226,10 @@ void StdSelect_BRepOwner::ResetLocation()
 //function : SetZLayer
 //purpose  :
 //=======================================================================
-void StdSelect_BRepOwner::SetZLayer 
-  (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
-   const Standard_Integer theLayerId)
+void StdSelect_BRepOwner::SetZLayer (const Graphic3d_ZLayerId theLayerId)
 {
   if (!myPrsSh.IsNull())
-    thePrsMgr->SetZLayer (myPrsSh, theLayerId);
+  {
+    myPrsSh->SetZLayer (theLayerId);
+  }
 }
index 9dd9627..9d3a567 100644 (file)
@@ -96,7 +96,8 @@ void V3d_CircularGrid::SetColors (const Quantity_Color& aColor, const Quantity_C
 
 void V3d_CircularGrid::Display ()
 {
-  myStructure->Display (1);
+  myStructure->SetDisplayPriority (1);
+  myStructure->Display();
 }
 
 void V3d_CircularGrid::Erase () const
index 91b7676..3dae2b6 100644 (file)
@@ -236,7 +236,6 @@ void V3d_DirectionalLight::Display( const Handle(V3d_View)& aView,
   }
   
   Handle(Graphic3d_Group) gnopick = MyGraphicStructure1->NewGroup();
-  MyGraphicStructure1->SetPick(Standard_False);
   
   X0 = MyTarget.X();
   Y0 = MyTarget.Y();
index 9af803b..5b3ce17 100755 (executable)
@@ -85,7 +85,8 @@ void V3d_Plane::Display (const Handle(V3d_View)& theView,
   aPrims->AddVertex ( aSize,-aSize, anOffset);
   aGroup->AddPrimitiveArray(aPrims);
 
-  myGraphicStructure->Display(0);
+  myGraphicStructure->SetDisplayPriority (0);
+  myGraphicStructure->Display();
   Update();
 }
 
index 1fc845e..72e311f 100644 (file)
@@ -180,7 +180,6 @@ void V3d_PositionLight::Display( const Handle(V3d_View)& aView,
   }
   
   Handle(Graphic3d_Group) gnopick = MyGraphicStructure1->NewGroup();
-  MyGraphicStructure1->SetPick(Standard_False);
   
   X0 = MyTarget.X();
   Y0 = MyTarget.Y();
index a0c8c40..0c58b94 100644 (file)
@@ -228,7 +228,6 @@ void V3d_PositionalLight::Display( const Handle(V3d_View)& aView,
   }
   
   Handle(Graphic3d_Group) gnopick = MyGraphicStructure1->NewGroup();
-  MyGraphicStructure1->SetPick(Standard_False);
   
   X0 = MyTarget.X();
   Y0 = MyTarget.Y();
index ae546a3..cf38481 100644 (file)
@@ -96,7 +96,8 @@ void V3d_RectangularGrid::SetColors (const Quantity_Color& aColor, const Quantit
 
 void V3d_RectangularGrid::Display ()
 {
-  myStructure->Display (1);
+  myStructure->SetDisplayPriority (1);
+  myStructure->Display();
 }
 
 void V3d_RectangularGrid::Erase () const
index f82cd62..ed29477 100644 (file)
@@ -246,7 +246,6 @@ void V3d_SpotLight::Display( const Handle(V3d_View)& aView,
   }
   
   Handle(Graphic3d_Group) gnopick = MyGraphicStructure1->NewGroup();
-  MyGraphicStructure1->SetPick(Standard_False);
   
   X0 = MyTarget.X();
   Y0 = MyTarget.Y();
index 8afa766..2b3a5ce 100644 (file)
@@ -55,6 +55,7 @@
 #include <Aspect_Window.hxx>
 #include <Graphic3d_AspectFillArea3d.hxx>
 #include <Graphic3d_AspectLine3d.hxx>
+#include <Graphic3d_CStructure.hxx>
 #include <Graphic3d_TextureRoot.hxx>
 #include <Image_AlienPixMap.hxx>
 #include <Prs3d_ShadingAspect.hxx>
@@ -2223,8 +2224,9 @@ int VErase (Draw_Interpretor& theDI,
             Standard_Integer  theArgNb,
             const char**      theArgVec)
 {
-  const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
-  ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView());
+  const Handle(AIS_InteractiveContext)& aCtx  = ViewerTest::GetAISContext();
+  const Handle(V3d_View)&               aView = ViewerTest::CurrentView();
+  ViewerTest_AutoUpdater anUpdateTool (aCtx, aView);
   if (aCtx.IsNull())
   {
     std::cerr << "Error: no active view!\n";
@@ -2473,7 +2475,11 @@ inline void bndPresentation (Draw_Interpretor&                  theDI,
     }
     case BndAction_Show:
     {
-      thePrs->Presentation()->BoundBox();
+      Handle(Graphic3d_Structure) aPrs = thePrs->Presentation();
+      aPrs->CStructure()->HighlightColor.r = 0.988235f;
+      aPrs->CStructure()->HighlightColor.g = 0.988235f;
+      aPrs->CStructure()->HighlightColor.b = 0.988235f;
+      aPrs->CStructure()->HighlightWithBndBox (aPrs, Standard_True);
       break;
     }
     case BndAction_Print:
@@ -2905,9 +2911,12 @@ static int VDisplay2 (Draw_Interpretor& theDI,
 
   // Parse input arguments
   ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView());
-  Standard_Integer isMutable = -1;
-  Standard_Boolean toDisplayLocal = Standard_False;
+  Standard_Integer   isMutable      = -1;
+  Graphic3d_ZLayerId aZLayer        = Graphic3d_ZLayerId_UNKNOWN;
+  Standard_Boolean   toDisplayLocal = Standard_False;
+  Standard_Boolean   toReDisplay    = Standard_False;
   TColStd_SequenceOfAsciiString aNamesOfDisplayIO;
+  AIS_DisplayStatus aDispStatus = AIS_DS_None;
   for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
   {
     const TCollection_AsciiString aName     = theArgVec[anArgIter];
@@ -2921,10 +2930,50 @@ static int VDisplay2 (Draw_Interpretor& theDI,
     {
       isMutable = 1;
     }
+    else if (aNameCase == "-neutral")
+    {
+      aDispStatus = AIS_DS_Displayed;
+    }
+    else if (aNameCase == "-immediate"
+          || aNameCase == "-top")
+    {
+      aZLayer = Graphic3d_ZLayerId_Top;
+    }
+    else if (aNameCase == "-topmost")
+    {
+      aZLayer = Graphic3d_ZLayerId_Topmost;
+    }
+    else if (aNameCase == "-osd"
+          || aNameCase == "-toposd")
+    {
+      aZLayer = Graphic3d_ZLayerId_TopOSD;
+    }
+    else if (aNameCase == "-layer")
+    {
+      if (++anArgIter >= theArgNb)
+      {
+        std::cerr << "Error: wrong syntax at " << aName << ".\n";
+        return 1;
+      }
+
+      TCollection_AsciiString aValue (theArgVec[anArgIter]);
+      if (!aValue.IsIntegerValue())
+      {
+        std::cerr << "Error: wrong syntax at " << aName << ".\n";
+        return 1;
+      }
+
+      aZLayer = aValue.IntegerValue();
+    }
     else if (aNameCase == "-local")
     {
+      aDispStatus = AIS_DS_Temporary;
       toDisplayLocal = Standard_True;
     }
+    else if (aNameCase == "-redisplay")
+    {
+      toReDisplay = Standard_True;
+    }
     else
     {
       aNamesOfDisplayIO.Append (aName);
@@ -2962,8 +3011,23 @@ static int VDisplay2 (Draw_Interpretor& theDI,
         {
           aShape->SetMutable (isMutable == 1);
         }
+        if (aZLayer != Graphic3d_ZLayerId_UNKNOWN)
+        {
+          aShape->SetZLayer (aZLayer);
+        }
         GetMapOfAIS().Bind (aShape, aName);
-        aCtx->Display (aShape, Standard_False);
+
+        Standard_Integer aDispMode = aShape->HasDisplayMode()
+                                   ? aShape->DisplayMode()
+                                   : (aShape->AcceptDisplayMode (aCtx->DisplayMode())
+                                    ? aCtx->DisplayMode()
+                                    : 0);
+        Standard_Integer aSelMode = aShape->HasSelectionMode() && aCtx->GetAutoActivateSelection()
+                                  ? aShape->SelectionMode() : -1;
+
+        aCtx->Display (aShape, aDispMode, aSelMode,
+                       Standard_False, aShape->AcceptShapeDecomposition(),
+                       aDispStatus);
       }
       continue;
     }
@@ -2976,6 +3040,18 @@ static int VDisplay2 (Draw_Interpretor& theDI,
       {
         aShape->SetMutable (isMutable == 1);
       }
+      if (aZLayer != Graphic3d_ZLayerId_UNKNOWN)
+      {
+        aShape->SetZLayer (aZLayer);
+      }
+
+      Standard_Integer aDispMode = aShape->HasDisplayMode()
+                                  ? aShape->DisplayMode()
+                                  : (aShape->AcceptDisplayMode (aCtx->DisplayMode())
+                                  ? aCtx->DisplayMode()
+                                  : 0);
+      Standard_Integer aSelMode = aShape->HasSelectionMode() && aCtx->GetAutoActivateSelection()
+                                ? aShape->SelectionMode() : -1;
 
       if (aShape->Type() == AIS_KOI_Datum)
       {
@@ -2984,17 +3060,26 @@ static int VDisplay2 (Draw_Interpretor& theDI,
       else
       {
         theDI << "Display " << aName.ToCString() << "\n";
-        // get the Shape from a name
-        TopoDS_Shape aNewShape = GetShapeFromName (aName.ToCString());
 
         // update the Shape in the AIS_Shape
+        TopoDS_Shape      aNewShape = GetShapeFromName (aName.ToCString());
         Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aShape);
         if (!aShapePrs.IsNull())
         {
+          if (!aShapePrs->Shape().IsEqual (aNewShape))
+          {
+            toReDisplay = Standard_True;
+          }
           aShapePrs->Set (aNewShape);
         }
-        aCtx->Redisplay (aShape, Standard_False);
-        aCtx->Display   (aShape, Standard_False);
+        if (toReDisplay)
+        {
+          aCtx->Redisplay (aShape, Standard_False);
+        }
+
+        aCtx->Display (aShape, aDispMode, aSelMode,
+                       Standard_False, aShape->AcceptShapeDecomposition(),
+                       aDispStatus);
       }
     }
     else if (anObj->IsKind (STANDARD_TYPE (NIS_InteractiveObject)))
index a2b4ebf..395e3d9 100644 (file)
@@ -3517,6 +3517,18 @@ static int VZLayer (Draw_Interpretor& di, Standard_Integer argc, const char** ar
       return 1;
     }
 
+    for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anObjIter (GetMapOfAIS());
+         anObjIter.More(); anObjIter.Next())
+    {
+      Handle(PrsMgr_PresentableObject) aPrs = Handle(PrsMgr_PresentableObject)::DownCast (anObjIter.Key1());
+      if (aPrs.IsNull()
+       || aPrs->ZLayer() != aDelId)
+      {
+        continue;
+      }
+      aPrs->SetZLayer (Graphic3d_ZLayerId_Default);
+    }
+
     di << "Z layer " << aDelId << " has been removed\n";
   }
   else if (anOp == "get")
index 172f951..af99f59 100644 (file)
@@ -16,8 +16,9 @@
 
 #include <Standard_TypeDef.hxx>
 #include <NCollection_Map.hxx>
+#include <Graphic3d_ZLayerId.hxx>
 #include <Graphic3d_ZLayerSettings.hxx>
 
-typedef NCollection_DataMap<Standard_Integer, Graphic3d_ZLayerSettings> Visual3d_MapOfZLayerSettings;
+typedef NCollection_DataMap<Graphic3d_ZLayerId, Graphic3d_ZLayerSettings> Visual3d_MapOfZLayerSettings;
 
 #endif // _Visual3d_MapOfZLayerSettings_HeaderFile
index 30db5d4..1badb4a 100644 (file)
@@ -85,6 +85,7 @@ uses
     MapOfStructure          from Graphic3d,
     Camera_Handle           from Graphic3d,
 
+    ZLayerId                from Graphic3d,
     ZLayerSettings          from Graphic3d,
 
     ContextView             from Visual3d,
@@ -107,6 +108,7 @@ uses
     AsciiString             from TCollection,
     ExtendedString          from TCollection,
     CGraduatedTrihedron     from Graphic3d,
+    TypeOfStructure         from Graphic3d,
 
     PixMap                  from Image,
     Box                     from Bnd
@@ -752,14 +754,12 @@ is
        -- Category: Private methods
        ----------------------------
 
-       AcceptDisplay ( me;
-                       AStructure      : Structure from Graphic3d )
-               returns TypeOfAnswer from Visual3d
-               is static private;
-       ---Level: Internal
-       ---Purpose: Is it possible to display the structure
-       --          <AStructure> in the view <me> ?
-       ---Category: Private methods
+  acceptDisplay ( me;
+                  theStructType : TypeOfStructure from Graphic3d )
+  returns TypeOfAnswer from Visual3d
+  is static private;
+  ---Level: Internal
+  ---Purpose: Is it possible to display the structure in the view?
 
        ReCompute ( me  : mutable;
                    AStructure  : Structure from Graphic3d );
@@ -787,13 +787,13 @@ is
 
 
         SetZLayerSettings ( me          : mutable;
-                            theLayerId  : Integer from Standard;
+                            theLayerId  : ZLayerId       from Graphic3d;
                             theSettings : ZLayerSettings from Graphic3d )
           is static private;
         ---Purpose: Sets the settings for a single Z layer of specified view.
 
         AddZLayer ( me         : mutable;
-                    theLayerId : Integer from Standard )
+                    theLayerId : ZLayerId from Graphic3d )
           is static private;
         ---Purpose: Add a new top-level Z layer to the view with ID
         -- <theLayerId>. The z layer mechanism allows to display
@@ -803,13 +803,13 @@ is
         -- display of graphics in all views.
 
         RemoveZLayer ( me         : mutable;
-                       theLayerId : Integer from Standard )
+                       theLayerId : ZLayerId from Graphic3d )
           is static private;
         ---Purpose: Remove z layer from the view by its ID.
 
         ChangeZLayer ( me           : mutable;
                        theStructure : Structure from Graphic3d;
-                       theLayerId   : Integer from Standard )
+                       theLayerId   : ZLayerId  from Graphic3d )
            is static private;
         ---Purpose: Change Z layer of already displayed structure in the view.
 
index 05b0f49..a25e99d 100644 (file)
@@ -28,7 +28,6 @@
 #include <Graphic3d_Vertex.hxx>
 #include <Visual3d_DepthCueingDefinitionError.hxx>
 #include <Visual3d_Light.hxx>
-#include <Visual3d_HSequenceOfView.hxx>
 #include <Visual3d_ZClippingDefinitionError.hxx>
 #include <OSD.hxx>
 #include <TColStd_HArray2OfReal.hxx>
@@ -712,10 +711,10 @@ void Visual3d_View::SetContext (const Visual3d_ContextView& theViewCtx)
     // 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())
+    for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
     {
       const Handle(Graphic3d_Structure)& aStruct  = aStructIter.Key();
-      const Visual3d_TypeOfAnswer        anAnswer = AcceptDisplay (aStruct);
+      const Visual3d_TypeOfAnswer        anAnswer = acceptDisplay (aStruct->Visual());
       if (anAnswer == Visual3d_TOA_NO
        || anAnswer == Visual3d_TOA_COMPUTE)
       {
@@ -743,7 +742,7 @@ void Visual3d_View::SetContext (const Visual3d_ContextView& theViewCtx)
         continue;
       }
 
-      const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct);
+      const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual());
       if (anAnswer == Visual3d_TOA_YES
        || anAnswer == Visual3d_TOA_COMPUTE)
       {
@@ -780,7 +779,7 @@ void Visual3d_View::DisplayedStructures (Graphic3d_MapOfStructure& theStructures
     return;
   }
 
-  for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+  for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
   {
     theStructures.Add (aStructIter.Key());
   }
@@ -825,7 +824,7 @@ void Visual3d_View::Activate()
       }
 
       // If the structure can be displayed in the new context of the view, it is displayed.
-      const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct);
+      const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual());
       if (anAnswer == Visual3d_TOA_YES
        || anAnswer == Visual3d_TOA_COMPUTE)
       {
@@ -898,7 +897,7 @@ void Visual3d_View::Deactivate()
         continue;
       }
 
-      const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct);
+      const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual());
       if (anAnswer == Visual3d_TOA_YES
        || anAnswer == Visual3d_TOA_COMPUTE)
       {
@@ -1131,13 +1130,13 @@ void Visual3d_View::ZFitAll (const Standard_Real theScaleFactor)
 }
 
 // ========================================================================
-// function : AcceptDisplay
+// function : acceptDisplay
 // purpose  :
 // ========================================================================
-Visual3d_TypeOfAnswer Visual3d_View::AcceptDisplay (const Handle(Graphic3d_Structure)& theStruct) const
+Visual3d_TypeOfAnswer Visual3d_View::acceptDisplay (const Graphic3d_TypeOfStructure theStructType) const
 {
-  const Visual3d_TypeOfVisualization ViewType = MyContext.Visualization();
-  switch (theStruct->Visual())
+  const Visual3d_TypeOfVisualization aViewType = MyContext.Visualization();
+  switch (theStructType)
   {
     case Graphic3d_TOS_ALL:
     {
@@ -1145,19 +1144,19 @@ Visual3d_TypeOfAnswer Visual3d_View::AcceptDisplay (const Handle(Graphic3d_Struc
     }
     case Graphic3d_TOS_SHADING:
     {
-      return ViewType == Visual3d_TOV_SHADING
+      return aViewType == Visual3d_TOV_SHADING
            ? Visual3d_TOA_YES
            : Visual3d_TOA_NO;
     }
     case Graphic3d_TOS_WIREFRAME:
     {
-      return ViewType == Visual3d_TOV_WIREFRAME
+      return aViewType == Visual3d_TOV_WIREFRAME
            ? Visual3d_TOA_YES
            : Visual3d_TOA_NO;
     }
     case Graphic3d_TOS_COMPUTED:
     {
-      return (ViewType == Visual3d_TOV_SHADING || ViewType == Visual3d_TOV_WIREFRAME)
+      return (aViewType == Visual3d_TOV_SHADING || aViewType == Visual3d_TOV_WIREFRAME)
            ?  Visual3d_TOA_COMPUTE
            :  Visual3d_TOA_NO;
     }
@@ -1260,18 +1259,18 @@ Standard_Boolean Visual3d_View::DisplayImmediate (const Handle(Graphic3d_Structu
 
   if (theIsSingleView)
   {
-    Handle(Visual3d_HSequenceOfView) aViews = myViewManager->DefinedView();
-
-    for (int i=1;i<=aViews->Length();i++)
+    const Visual3d_SequenceOfView& aViews = myViewManager->DefinedViews();
+    for (Standard_Integer aViewIter = 1; aViewIter <= aViews.Length(); ++aViewIter)
     {
-      if (aViews->Value(i).Access() != this)
+      const Handle(Visual3d_View)& aView = aViews.Value (aViewIter);
+      if (aView.Access() != this)
       {
-        aViews->Value(i)->EraseImmediate (theStructure);
+        aView->EraseImmediate (theStructure);
       }
     }
   }
 
-  myGraphicDriver->DisplayImmediateStructure (MyCView, *theStructure->CStructure());
+  myGraphicDriver->DisplayImmediateStructure (MyCView, theStructure);
   return Standard_True;
 }
 
@@ -1301,9 +1300,9 @@ Standard_Boolean Visual3d_View::ClearImmediate()
     return Standard_False;
   }
 
-  for (Graphic3d_MapIteratorOfMapOfStructure anIter (myImmediateStructures); anIter.More(); anIter.Next())
+  for (Graphic3d_MapOfStructure::Iterator aStructIter (myImmediateStructures); aStructIter.More(); aStructIter.Next())
   {
-    myGraphicDriver->EraseImmediateStructure (MyCView, *anIter.Key()->CStructure());
+    myGraphicDriver->EraseImmediateStructure (MyCView, *aStructIter.Key()->CStructure());
   }
   myImmediateStructures.Clear();
   return Standard_True;
@@ -1345,7 +1344,7 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct,
     anIndex = 0;
   }
 
-  Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (theStruct);
+  Visual3d_TypeOfAnswer anAnswer = acceptDisplay (theStruct->Visual());
   if (anAnswer == Visual3d_TOA_NO)
   {
     return;
@@ -1358,14 +1357,13 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct,
 
   if (anAnswer == Visual3d_TOA_YES)
   {
-    if (IsDisplayed (theStruct))
+    if (!myStructsDisplayed.Add (theStruct))
     {
       return;
     }
 
     theStruct->CalculateBoundBox();
-    myGraphicDriver->DisplayStructure (MyCView, *theStruct->CStructure(), theStruct->DisplayPriority());
-    myStructsDisplayed.Add (theStruct);
+    myGraphicDriver->DisplayStructure (MyCView, theStruct, theStruct->DisplayPriority());
     Update (theUpdateMode);
     return;
   }
@@ -1380,14 +1378,14 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct,
     const Handle(Graphic3d_Structure)& anOldStruct = myStructsComputed.Value (anIndex);
     if (anOldStruct->HLRValidation())
     {
-      // Case COMPUTED valid
-      // to be displayed
-      if (!IsDisplayed (theStruct))
+      // Case COMPUTED valid, to be displayed
+      if (!myStructsDisplayed.Add (theStruct))
       {
-        myStructsDisplayed.Add (theStruct);
-        myGraphicDriver->DisplayStructure (MyCView, *anOldStruct->CStructure(), theStruct->DisplayPriority());
-        Update (theUpdateMode);
+        return;
       }
+
+      myGraphicDriver->DisplayStructure (MyCView, anOldStruct, theStruct->DisplayPriority());
+      Update (theUpdateMode);
       return;
     }
     else
@@ -1401,25 +1399,25 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct,
       const Standard_Integer aNewIndex = HaveTheSameOwner (theStruct);
       if (aNewIndex != 0)
       {
-        // Case of COMPUTED invalid, WITH a valid of replacement
-        // to be displayed
-        if (!IsDisplayed (theStruct))
+        // Case of COMPUTED invalid, WITH a valid of replacement; to be displayed
+        if (!myStructsDisplayed.Add (theStruct))
         {
-          const Handle(Graphic3d_Structure)& aNewStruct = myStructsComputed.Value (aNewIndex);
-          myStructsComputed.SetValue (anIndex, aNewStruct);
-          myStructsDisplayed.Add (theStruct);
-          myGraphicDriver->DisplayStructure (MyCView, *aNewStruct->CStructure(), theStruct->DisplayPriority());
-          Update (theUpdateMode);
+          return;
         }
+
+        const Handle(Graphic3d_Structure)& aNewStruct = myStructsComputed.Value (aNewIndex);
+        myStructsComputed.SetValue (anIndex, aNewStruct);
+        myGraphicDriver->DisplayStructure (MyCView, aNewStruct, theStruct->DisplayPriority());
+        Update (theUpdateMode);
         return;
       }
       else
       {
         // Case COMPUTED invalid, WITHOUT a valid of replacement
         // COMPUTED is removed if displayed
-        if (IsDisplayed (theStruct))
+        if (myStructsDisplayed.Contains (theStruct))
         {
-          myGraphicDriver->EraseStructure (MyCView, *anOldStruct->CStructure());
+          myGraphicDriver->EraseStructure (MyCView, anOldStruct);
         }
       }
     }
@@ -1484,26 +1482,25 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct,
   else
   {
     aStruct->SetVisual (toComputeWireframe ? Graphic3d_TOS_WIREFRAME : Graphic3d_TOS_SHADING);
-    anAnswer = AcceptDisplay (aStruct);
+    anAnswer = acceptDisplay (aStruct->Visual());
   }
 
   if (theStruct->IsHighlighted())
   {
-    aStruct->SetHighlightColor (theStruct->HighlightColor());
-    aStruct->GraphicHighlight (Aspect_TOHM_COLOR);
+    aStruct->Highlight (Aspect_TOHM_COLOR, theStruct->HighlightColor(), Standard_False);
   }
 
   // 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 (anAnswer == Visual3d_TOA_NO)
   {
-    if (!IsDisplayed (theStruct))
-    {
-      myStructsDisplayed.Add (theStruct);
-    }
-    myGraphicDriver->DisplayStructure (MyCView, *aStruct->CStructure(), theStruct->DisplayPriority());
-    Update (theUpdateMode);
+    return;
   }
+
+  myStructsDisplayed.Add (theStruct);
+  myGraphicDriver->DisplayStructure (MyCView, aStruct, theStruct->DisplayPriority());
+
+  Update (theUpdateMode);
 }
 
 // ========================================================================
@@ -1525,13 +1522,14 @@ void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct)
 void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct,
                            const Aspect_TypeOfUpdate          theUpdateMode)
 {
-  if (IsDeleted()
-  || !IsDisplayed (theStruct))
+  if ( IsDeleted()
+   ||  EraseImmediate (theStruct)
+   || !IsDisplayed (theStruct))
   {
     return;
   }
 
-  Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (theStruct);
+  Visual3d_TypeOfAnswer anAnswer = acceptDisplay (theStruct->Visual());
   if (!ComputedMode())
   {
     anAnswer = Visual3d_TOA_YES;
@@ -1539,7 +1537,7 @@ void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct,
 
   if (anAnswer != Visual3d_TOA_COMPUTE)
   {
-    myGraphicDriver->EraseStructure (MyCView, *theStruct->CStructure());
+    myGraphicDriver->EraseStructure (MyCView, theStruct);
   }
   else if (anAnswer == Visual3d_TOA_COMPUTE
        && myIsInComputedMode)
@@ -1548,7 +1546,7 @@ void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct,
     if (anIndex != 0)
     {
       const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
-      myGraphicDriver->EraseStructure (MyCView, *aCompStruct->CStructure());
+      myGraphicDriver->EraseStructure (MyCView, aCompStruct);
     }
   }
   myStructsDisplayed.Remove (theStruct);
@@ -1566,8 +1564,7 @@ void Visual3d_View::Highlight (const Handle(Graphic3d_Structure)& theStruct,
   if (anIndex != 0)
   {
     const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
-    aCompStruct->SetHighlightColor (theStruct->HighlightColor());
-    aCompStruct->GraphicHighlight (theMethod);
+    aCompStruct->Highlight (theMethod, theStruct->HighlightColor(), Standard_False);
   }
 }
 
@@ -1603,7 +1600,7 @@ void Visual3d_View::SetTransform (const Handle(Graphic3d_Structure)& theStruct,
    && !theStruct->CStructure()->IsForHighlight
    && !theStruct->CStructure()->IsInfinite)
   {
-    const Standard_Integer aLayerId = theStruct->GetZLayer();
+    const Graphic3d_ZLayerId aLayerId = theStruct->GetZLayer();
     myGraphicDriver->InvalidateBVHData (MyCView, aLayerId);
   }
 }
@@ -1657,7 +1654,14 @@ Standard_Boolean Visual3d_View::IsDisplayed (const Handle(Graphic3d_Structure)&
 // ========================================================================
 Standard_Boolean Visual3d_View::ContainsFacet() const
 {
-  return ContainsFacet (myStructsDisplayed);
+  for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+  {
+    if (aStructIter.Key()->ContainsFacet())
+    {
+      return Standard_True;
+    }
+  }
+  return Standard_False;
 }
 
 // ========================================================================
@@ -1676,14 +1680,51 @@ Standard_Boolean Visual3d_View::ContainsFacet (const Graphic3d_MapOfStructure& t
   return Standard_False;
 }
 
+//! Auxiliary method for MinMaxValues() method
+inline void addStructureBndBox (const Handle(Graphic3d_Structure)& theStruct,
+                                const Standard_Boolean             theToIgnoreInfiniteFlag,
+                                Bnd_Box&                           theBndBox)
+{
+  if (!theStruct->IsVisible())
+  {
+    return;
+  }
+  else if (theStruct->IsInfinite()
+       && !theToIgnoreInfiniteFlag)
+  {
+    // XMin, YMin .... ZMax are initialized by means of infinite line data
+    const Bnd_Box aBox = theStruct->MinMaxValues (Standard_False);
+    if (!aBox.IsWhole()
+     && !aBox.IsVoid())
+    {
+      theBndBox.Add (aBox);
+    }
+    return;
+  }
+
+  // Only non-empty and non-infinite structures
+  // are taken into account for calculation of MinMax
+  if (theStruct->IsEmpty()
+   || theStruct->TransformPersistenceMode() != Graphic3d_TMF_None)
+  {
+    return;
+  }
+
+  // "FitAll" operation ignores object with transform persistence parameter
+  const Bnd_Box aBox = theStruct->MinMaxValues (theToIgnoreInfiniteFlag);
+  theBndBox.Add (aBox);
+}
+
 // ========================================================================
 // function : MinMaxValues
 // purpose  :
 // ========================================================================
 Bnd_Box Visual3d_View::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag) const
 {
-  return MinMaxValues (myStructsDisplayed,
-                       theToIgnoreInfiniteFlag);
+  Bnd_Box aResult     = MinMaxValues (myStructsDisplayed,    theToIgnoreInfiniteFlag);
+  Bnd_Box anImmediate = MinMaxValues (myImmediateStructures, theToIgnoreInfiniteFlag);
+  aResult.Add (anImmediate);
+  return aResult;
 }
 
 // ========================================================================
@@ -1691,45 +1732,18 @@ Bnd_Box Visual3d_View::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteF
 // purpose  :
 // ========================================================================
 Bnd_Box Visual3d_View::MinMaxValues (const Graphic3d_MapOfStructure& theSet,
-                                     const Standard_Boolean theToIgnoreInfiniteFlag) const
+                                     const Standard_Boolean          theToIgnoreInfiniteFlag) const
 {
   Bnd_Box aResult;
-  if (theSet.IsEmpty ())
-  {
-    // Return an empty box.
-    return aResult;
-  }
-  Graphic3d_MapIteratorOfMapOfStructure anIterator (theSet);
-  for (anIterator.Initialize (theSet); anIterator.More(); anIterator.Next())
+  for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (theSet); aStructIter.More(); aStructIter.Next())
   {
-    const Handle(Graphic3d_Structure)& aStructure = anIterator.Key();
-
-    if (!aStructure->IsVisible())
-      continue;
-
-    if (aStructure->IsInfinite() && !theToIgnoreInfiniteFlag)
+    const Handle(Graphic3d_Structure)& aStructure = aStructIter.Key();
+    if (!aStructIter.Value()->IsVisible())
     {
-      //XMin, YMin .... ZMax are initialized by means of infinite line data
-      Bnd_Box aBox = aStructure->MinMaxValues (Standard_False);
-      if (!aBox.IsWhole() && !aBox.IsVoid())
-      {
-        aResult.Add (aBox);
-      }
+      continue;
     }
 
-    // Only non-empty and non-infinite structures
-    // are taken into account for calculation of MinMax
-    if ((!aStructure->IsInfinite() || theToIgnoreInfiniteFlag) && !aStructure->IsEmpty())
-    {
-      Bnd_Box aBox = aStructure->MinMaxValues (theToIgnoreInfiniteFlag);
-
-      /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
-      //"FitAll" operation ignores object with transform persitence parameter
-      if(aStructure->TransformPersistenceMode() == Graphic3d_TMF_None )
-      {
-          aResult.Add (aBox);
-      }
-    }
+    addStructureBndBox (aStructure, theToIgnoreInfiniteFlag, aResult);
   }
   return aResult;
 }
@@ -1862,9 +1876,9 @@ void Visual3d_View::Compute()
   // 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())
+  for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
   {
-    const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStructIter.Key());
+    const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStructIter.Key()->Visual());
     if (anAnswer == Visual3d_TOA_COMPUTE)
     {
       aStructsSeq.Append (aStructIter.Key()); // if the structure was calculated, it is recalculated
@@ -1902,7 +1916,7 @@ void Visual3d_View::ReCompute (const Handle(Graphic3d_Structure)& theStruct)
     return;
   }
 
-  const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (theStruct);
+  const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (theStruct->Visual());
   if (anAnswer != Visual3d_TOA_COMPUTE)
   {
     return;
@@ -1950,13 +1964,12 @@ void Visual3d_View::ReCompute (const Handle(Graphic3d_Structure)& theStruct)
 
   if (theStruct->IsHighlighted())
   {
-    aCompStruct->SetHighlightColor (theStruct->HighlightColor());
-    aCompStruct->GraphicHighlight (Aspect_TOHM_COLOR);
+    aCompStruct->Highlight (Aspect_TOHM_COLOR, theStruct->HighlightColor(), Standard_False);
   }
 
-  // The previous calculation is removed and the new one is dislayed
-  myGraphicDriver->EraseStructure   (MyCView, *aCompStructOld->CStructure());
-  myGraphicDriver->DisplayStructure (MyCView, *aCompStruct->CStructure(), theStruct->DisplayPriority());
+  // The previous calculation is removed and the new one is displayed
+  myGraphicDriver->EraseStructure   (MyCView, aCompStructOld);
+  myGraphicDriver->DisplayStructure (MyCView, aCompStruct, theStruct->DisplayPriority());
 
   // why not just replace existing items?
   //myStructsToCompute.ChangeValue (anIndex) = theStruct;
@@ -2324,10 +2337,10 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode)
   myIsInComputedMode = theMode;
   if (!myIsInComputedMode)
   {
-    for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
+    for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next())
     {
       const Handle(Graphic3d_Structure)& aStruct  = aStructIter.Key();
-      const Visual3d_TypeOfAnswer        anAnswer = AcceptDisplay (aStruct);
+      const Visual3d_TypeOfAnswer        anAnswer = acceptDisplay (aStruct->Visual());
       if (anAnswer != Visual3d_TOA_COMPUTE)
       {
         continue;
@@ -2337,17 +2350,17 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode)
       if (anIndex != 0)
       {
         const Handle(Graphic3d_Structure)& aStructComp = myStructsComputed.Value (anIndex);
-        myGraphicDriver->EraseStructure   (MyCView, *aStructComp->CStructure());
-        myGraphicDriver->DisplayStructure (MyCView, *aStruct->CStructure(), aStruct->DisplayPriority());
+        myGraphicDriver->EraseStructure   (MyCView, aStructComp);
+        myGraphicDriver->DisplayStructure (MyCView, aStruct, aStruct->DisplayPriority());
       }
     }
     return;
   }
 
-  for (Graphic3d_MapIteratorOfMapOfStructure aDispStructIter (myStructsDisplayed); aDispStructIter.More(); aDispStructIter.Next())
+  for (Graphic3d_MapOfStructure::Iterator aDispStructIter (myStructsDisplayed); aDispStructIter.More(); aDispStructIter.Next())
   {
-    Handle(Graphic3d_Structure) aStruct = aDispStructIter.Key();
-    const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct);
+    Handle(Graphic3d_Structure) aStruct  = aDispStructIter.Key();
+    const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual());
     if (anAnswer != Visual3d_TOA_COMPUTE)
     {
       continue;
@@ -2356,8 +2369,8 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode)
     const Standard_Integer anIndex = IsComputed (aStruct);
     if (anIndex != 0)
     {
-      myGraphicDriver->EraseStructure   (MyCView, *aStruct->CStructure());
-      myGraphicDriver->DisplayStructure (MyCView, *(myStructsComputed.Value (anIndex)->CStructure()), aStruct->DisplayPriority());
+      myGraphicDriver->EraseStructure   (MyCView, aStruct);
+      myGraphicDriver->DisplayStructure (MyCView, myStructsComputed.Value (anIndex), aStruct->DisplayPriority());
 
       Display (aStruct, Aspect_TOU_WAIT);
       if (aStruct->IsHighlighted())
@@ -2365,8 +2378,7 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode)
         const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.Value (anIndex);
         if (!aCompStruct->IsHighlighted())
         {
-          aCompStruct->SetHighlightColor (aStruct->HighlightColor());
-          aCompStruct->GraphicHighlight (Aspect_TOHM_COLOR);
+          aCompStruct->Highlight (Aspect_TOHM_COLOR, aStruct->HighlightColor(), Standard_False);
         }
       }
     }
@@ -2387,8 +2399,7 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode)
 
       if (aStruct->IsHighlighted())
       {
-        aCompStruct->SetHighlightColor (aStruct->HighlightColor());
-        aCompStruct->GraphicHighlight (Aspect_TOHM_COLOR);
+        aCompStruct->Highlight (Aspect_TOHM_COLOR, aStruct->HighlightColor(), Standard_False);
       }
 
       Standard_Boolean hasResult = Standard_False;
@@ -2410,8 +2421,8 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode)
         myStructsComputed .Append (aCompStruct);
       }
 
-      myGraphicDriver->EraseStructure   (MyCView, *aStruct->CStructure());
-      myGraphicDriver->DisplayStructure (MyCView, *aCompStruct->CStructure(), aStruct->DisplayPriority());
+      myGraphicDriver->EraseStructure   (MyCView, aStruct);
+      myGraphicDriver->DisplayStructure (MyCView, aCompStruct, aStruct->DisplayPriority());
     }
   }
   Update (myViewManager->UpdateMode());
@@ -2599,7 +2610,7 @@ Standard_Boolean Visual3d_View::Export (const Standard_CString       theFileName
 // function : SetZLayerSettings
 // purpose  :
 // =======================================================================
-void Visual3d_View::SetZLayerSettings (const Standard_Integer theLayerId,
+void Visual3d_View::SetZLayerSettings (const Graphic3d_ZLayerId        theLayerId,
                                        const Graphic3d_ZLayerSettings& theSettings)
 {
   myGraphicDriver->SetZLayerSettings (MyCView, theLayerId, theSettings);
@@ -2609,7 +2620,7 @@ void Visual3d_View::SetZLayerSettings (const Standard_Integer theLayerId,
 // function : AddZLayer
 // purpose  :
 // =======================================================================
-void Visual3d_View::AddZLayer (const Standard_Integer theLayerId)
+void Visual3d_View::AddZLayer (const Graphic3d_ZLayerId theLayerId)
 {
   myGraphicDriver->AddZLayer (MyCView, theLayerId);
 }
@@ -2618,7 +2629,7 @@ void Visual3d_View::AddZLayer (const Standard_Integer theLayerId)
 // function : RemoveZLayer
 // purpose  :
 // =======================================================================
-void Visual3d_View::RemoveZLayer (const Standard_Integer theLayerId)
+void Visual3d_View::RemoveZLayer (const Graphic3d_ZLayerId theLayerId)
 {
   myGraphicDriver->RemoveZLayer (MyCView, theLayerId);
 }
@@ -2628,7 +2639,7 @@ void Visual3d_View::RemoveZLayer (const Standard_Integer theLayerId)
 // purpose  :
 // =======================================================================
 void Visual3d_View::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
-                                  const Standard_Integer theLayerId)
+                                  const Graphic3d_ZLayerId           theLayerId)
 {
   myGraphicDriver->ChangeZLayer (*(theStructure->CStructure()), MyCView, theLayerId);
 }
index 967611b..9279b27 100644 (file)
@@ -22,7 +22,6 @@ class ViewManager from Visual3d inherits StructureManager from Graphic3d
        ---Purpose: This class allows the definition of a manager to
        --          which the views are associated.
        --          It allows them to be globally manipulated.
-       --          It activates the pick.
 
 uses
 
@@ -41,10 +40,10 @@ uses
        CView                   from Graphic3d,
        Vector                  from Graphic3d,
 
+  ZLayerId        from Graphic3d,
        ZLayerSettings  from Graphic3d,
        MapOfZLayerSettings from Visual3d,
 
-       ContextPick             from Visual3d,
        Layer                   from Visual3d,
        SequenceOfView          from Visual3d,
        HSequenceOfView         from Visual3d,
@@ -129,9 +128,10 @@ is
        ---Purpose: Returns the group of views activated in the visualiser <me>.
        ---Category: Inquire methods
 
-       DefinedView ( me )
-               returns HSequenceOfView from Visual3d
-               is static;
+  DefinedViews (me)
+  returns SequenceOfView from Visual3d
+  is static;
+  ---C++: return const &
        ---Level: Internal
        ---Purpose: Returns the group of views defined in the visualiser <me>.
        ---Category: Inquire methods
@@ -163,29 +163,6 @@ is
        ---Purpose: Release a unique ID of the view reserved for the view on its creation.
         is static;
 
-       -------------------------------------------------
-       -- Summary of Pick Input                       --
-       --                                             --
-       -- Picking returns information about an        --
-       -- object pointed to on the display.           --
-       --                                             --
-       -- To be picked, a structure must be :         --
-       --                                             --
-       --      Visible                                --
-       --      Within the pick aperture               --
-       --      Pickable as determined by the method   --
-       --      Graphic3d_Structure::SetPick           --
-       --                                             --
-       -- To insert a Pick Identification use the     --
-       -- method Graphic3d_Group::SetPickId           --
-       --                                             --
-       -- The pick search order tends to select the   --
-       -- "top" object :                              --
-       --      High to low structure display priority --
-       --      Most recently displayed to least       --
-       --      recently displayed.                    --
-       -------------------------------------------------
-
        ------------------------------
        -- Category: Redefined methods
        ------------------------------
@@ -232,30 +209,25 @@ is
 
         ChangeZLayer ( me           : mutable;
                        theStructure : Structure from Graphic3d;
-                       theLayerId   : Integer from Standard )
+                       theLayerId   : ZLayerId  from Graphic3d )
            is redefined static;
         ---Purpose: Change Z layer for structure. The layer mechanism allows
         -- to display structures in higher layers in overlay of structures in
         -- lower layers.
 
-        GetZLayer ( me;
-                    theStructure : Structure from Graphic3d )
-           returns Integer from Standard is redefined static;
-        ---Purpose: Get Z layer ID assigned for the structure.
-
         SetZLayerSettings ( me          : mutable;
-                            theLayerId  : Integer from Standard;
+                            theLayerId  : ZLayerId       from Graphic3d;
                             theSettings : ZLayerSettings from Graphic3d )
           is redefined static;
         ---Purpose: Sets the settings for a single Z layer for all managed views.
 
         ZLayerSettings ( me          : mutable;
-                         theLayerId  : Integer from Standard )
+                         theLayerId  : ZLayerId from Graphic3d )
           returns ZLayerSettings from Graphic3d is redefined static;
         ---Purpose: Returns the settings of a single Z layer.
 
         AddZLayer ( me : mutable;
-                    theLayerId : in out Integer from Standard )
+                    theLayerId : out ZLayerId from Graphic3d )
            returns Boolean from Standard is redefined static;
         ---Purpose: Add a new top-level Z layer and get its ID as
         -- <theLayerId> value. The method returns Standard_False if the layer
@@ -263,7 +235,7 @@ is
         -- structures in higher layers in overlay of structures in lower layers.
 
         RemoveZLayer ( me : mutable;
-                       theLayerId : Integer from Standard )
+                       theLayerId : ZLayerId from Graphic3d )
            returns Boolean from Standard is redefined static;
         ---Purpose: Remove Z layer with ID <theLayerId>. Method returns
         -- Standard_False if the layer can not be removed or doesn't exists.
@@ -284,12 +256,6 @@ is
         -- controlled view. This method used on the view initialization to
         -- make the layer lists consistent.
 
-        getZLayerGenId ( myclass )
-        ---Purpose: Returns global instance of z layer ids generator.
-        ---C++: return &
-           returns GenId from Aspect is protected;
-        
-
        Clear ( me              : mutable;
                AStructure      : Structure from Graphic3d;
                WithDestruction : Boolean from Standard )
@@ -457,8 +423,9 @@ fields
        MyZBufferAuto                   :       Boolean from Standard;
 
         -- Z layer indexes
-        myLayerIds                      :       MapOfInteger from TColStd;
-        myLayerSeq                      :       SequenceOfInteger from TColStd;
+        myZLayerGenId          : GenId from Aspect;
+        myLayerIds            : MapOfInteger from TColStd;
+        myLayerSeq            : SequenceOfInteger from TColStd;
 
         myMapOfZLayerSettings : MapOfZLayerSettings from Visual3d;
 
index 9bfa0f5..daa6b79 100644 (file)
@@ -82,15 +82,43 @@ Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Graphic3d_GraphicDriver
 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)
+MyZBufferAuto (Standard_False),
+myZLayerGenId (1, IntegerLast())
 {
-  // default layer is always presented in display layer sequence
-  // it can not be removed
-  myLayerIds.Add (0);
-  myLayerSeq.Append (0);
-
   MyGraphicDriver = theDriver;
-  myMapOfZLayerSettings.Bind (0, Graphic3d_ZLayerSettings());
+
+  // default layers are always presented in display layer sequence it can not be removed
+  Graphic3d_ZLayerSettings aDefSettings;
+  aDefSettings.Flags = Graphic3d_ZLayerDepthTest
+                     | Graphic3d_ZLayerDepthWrite;
+  aDefSettings.IsImmediate = false;
+  myLayerIds.Add             (Graphic3d_ZLayerId_Default);
+  myLayerSeq.Append          (Graphic3d_ZLayerId_Default);
+  myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Default, aDefSettings);
+
+  Graphic3d_ZLayerSettings aTopSettings;
+  aTopSettings.Flags = Graphic3d_ZLayerDepthTest
+                     | Graphic3d_ZLayerDepthWrite;
+  aTopSettings.IsImmediate = true;
+  myLayerIds.Add             (Graphic3d_ZLayerId_Top);
+  myLayerSeq.Append          (Graphic3d_ZLayerId_Top);
+  myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Top, aTopSettings);
+
+  Graphic3d_ZLayerSettings aTopmostSettings;
+  aTopmostSettings.Flags = Graphic3d_ZLayerDepthTest
+                         | Graphic3d_ZLayerDepthWrite
+                         | Graphic3d_ZLayerDepthClear;
+  aTopmostSettings.IsImmediate = true;
+  myLayerIds.Add             (Graphic3d_ZLayerId_Topmost);
+  myLayerSeq.Append          (Graphic3d_ZLayerId_Topmost);
+  myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Topmost, aTopmostSettings);
+
+  Graphic3d_ZLayerSettings anOsdSettings;
+  anOsdSettings.Flags = 0;
+  anOsdSettings.IsImmediate = true;
+  myLayerIds.Add             (Graphic3d_ZLayerId_TopOSD);
+  myLayerSeq.Append          (Graphic3d_ZLayerId_TopOSD);
+  myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_TopOSD, anOsdSettings);
 }
 
 //-Destructors
@@ -124,7 +152,6 @@ void Visual3d_ViewManager::Remove () {
   // 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();
@@ -255,7 +282,6 @@ void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure)
   }
 
   MyHighlightedStructure.Remove (AStructure);
-  MyPickStructure.Remove (AStructure);
 }
 
 void Visual3d_ViewManager::Erase () {
@@ -423,16 +449,9 @@ Standard_Boolean Visual3d_ViewManager::ContainsComputedStructure () const
 }
 #endif
 
-Handle(Visual3d_HSequenceOfView) Visual3d_ViewManager::DefinedView () const
+const Visual3d_SequenceOfView& Visual3d_ViewManager::DefinedViews() const
 {
-  Handle (Visual3d_HSequenceOfView) SG = new Visual3d_HSequenceOfView();
-
-  for(int i=1; i<=MyDefinedView.Length(); i++)
-  {
-    SG->Append(MyDefinedView.Value(i));
-  }
-
-  return (SG);
+  return MyDefinedView;
 }
 
 Standard_Boolean Visual3d_ViewManager::ViewExists (const Handle(Aspect_Window)& AWindow, Graphic3d_CView& TheCView) const
@@ -629,39 +648,26 @@ const Handle(Visual3d_Layer)& Visual3d_ViewManager::OverLayer () const {
 //=======================================================================
 
 void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
-                                         const Standard_Integer theLayerId)
+                                         const Graphic3d_ZLayerId           theLayerId)
 {
-  if (!myLayerIds.Contains (theLayerId))
+  if (!myLayerIds.Contains (theLayerId)
+   || !MyDisplayedStructure.Contains (theStructure))
+  {
     return;
+  }
 
   // change display layer for structure in all views
-  if (MyDisplayedStructure.Contains (theStructure))
+  for (int aViewIter = 1; aViewIter <= MyDefinedView.Length(); ++aViewIter)
   {
-    for(int i=1; i<=MyDefinedView.Length(); i++)
-    {
-      (MyDefinedView.Value(i))->ChangeZLayer(theStructure, theLayerId);
-    }
+    MyDefinedView.Value (aViewIter)->ChangeZLayer (theStructure, theLayerId);
   }
-
-  // tell graphic driver to update the structure's display layer
-  MyGraphicDriver->ChangeZLayer (*(theStructure->CStructure()), theLayerId);
-}
-
-//=======================================================================
-//function : GetZLayer
-//purpose  :
-//=======================================================================
-
-Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structure)& theStructure) const
-{
-  return MyGraphicDriver->GetZLayer (*theStructure->CStructure ());
 }
 
 //=======================================================================
 //function : SetZLayerSettings
 //purpose  :
 //=======================================================================
-void Visual3d_ViewManager::SetZLayerSettings (const Standard_Integer theLayerId,
+void Visual3d_ViewManager::SetZLayerSettings (const Graphic3d_ZLayerId        theLayerId,
                                               const Graphic3d_ZLayerSettings& theSettings)
 {
   // tell all managed views to set zlayer settings
@@ -685,7 +691,7 @@ void Visual3d_ViewManager::SetZLayerSettings (const Standard_Integer theLayerId,
 //function : ZLayerSettings
 //purpose  :
 //=======================================================================
-Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Standard_Integer theLayerId)
+Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Graphic3d_ZLayerId theLayerId)
 {
   if (!myLayerIds.Contains (theLayerId))
   {
@@ -700,13 +706,13 @@ Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Standard_In
 //purpose  :
 //=======================================================================
 
-Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId)
+Standard_Boolean Visual3d_ViewManager::AddZLayer (Graphic3d_ZLayerId& theLayerId)
 {
   try
   {
     OCC_CATCH_SIGNALS
-    theLayerId = getZLayerGenId ().Next ();
-    myLayerIds.Add (theLayerId);
+    theLayerId = myZLayerGenId.Next();
+    myLayerIds.Add    (theLayerId);
     myLayerSeq.Append (theLayerId);
   }
   catch (Aspect_IdentDefinitionError)
@@ -732,10 +738,14 @@ Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId)
 //purpose  :
 //=======================================================================
 
-Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theLayerId)
+Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Graphic3d_ZLayerId theLayerId)
 {
-  if (!myLayerIds.Contains (theLayerId) || theLayerId == 0)
+  if (!myLayerIds.Contains (theLayerId)
+    || theLayerId < myZLayerGenId.Lower()
+    || theLayerId > myZLayerGenId.Upper())
+  {
     return Standard_False;
+  }
 
   // tell all managed views to remove display layers
   for(int i=1; i<=MyDefinedView.Length(); i++)
@@ -757,8 +767,8 @@ Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theL
 
   myMapOfZLayerSettings.UnBind (theLayerId);
 
-  myLayerIds.Remove (theLayerId);
-  getZLayerGenId ().Free (theLayerId);
+  myLayerIds.Remove  (theLayerId);
+  myZLayerGenId.Free (theLayerId);
 
   return Standard_True;
 }
@@ -774,17 +784,6 @@ void Visual3d_ViewManager::GetAllZLayers (TColStd_SequenceOfInteger& theLayerSeq
 }
 
 //=======================================================================
-//function : getZLayerGenId
-//purpose  :
-//=======================================================================
-
-Aspect_GenId& Visual3d_ViewManager::getZLayerGenId ()
-{
-  static Aspect_GenId aGenId (1, IntegerLast());
-  return aGenId;
-}
-
-//=======================================================================
 //function : InstallZLayers
 //purpose  :
 //=======================================================================
@@ -808,10 +807,19 @@ void Visual3d_ViewManager::InstallZLayers(const Handle(Visual3d_View)& theView)
   // 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++)
+  for (Standard_Integer aSeqIdx = 1; aSeqIdx <= myLayerSeq.Length(); ++aSeqIdx)
   {
-    Standard_Integer aLayerID = myLayerSeq.Value (aSeqIdx);
-    theView->RemoveZLayer (aLayerID);
-    theView->AddZLayer (aLayerID);
+    const Graphic3d_ZLayerId        aLayerID  = myLayerSeq.Value (aSeqIdx);
+    const Graphic3d_ZLayerSettings& aSettings = myMapOfZLayerSettings.Find (aLayerID);
+    if (aLayerID < myZLayerGenId.Lower()
+     || aLayerID > myZLayerGenId.Upper())
+    {
+      theView->SetZLayerSettings (aLayerID, aSettings);
+      continue;
+    }
+
+    theView->RemoveZLayer      (aLayerID);
+    theView->AddZLayer         (aLayerID);
+    theView->SetZLayerSettings (aLayerID, aSettings);
   }
 }
diff --git a/tests/bugs/vis/bug24394 b/tests/bugs/vis/bug24394
new file mode 100644 (file)
index 0000000..43751f8
--- /dev/null
@@ -0,0 +1,19 @@
+puts "========"
+puts "OCC24394"
+puts "========"
+puts ""
+#################################################################################
+# Visualization - implement more general way for rendering of immediate objects
+#################################################################################
+
+box b1 0 0 0 1 2 3
+box b2 3 0 0 2 3 1
+vinit View1
+vclear
+vaxo
+vsetdispmode 1
+vdisplay b1
+vdisplay -top b1
+vfit
+
+set only_screen 1
index 6598eb6..0f8acd8 100644 (file)
@@ -22,8 +22,8 @@ puts [checkshape res]
 tclean res
 
 if { [string compare $command "shading"] == 0 } {
-    vinit
-    vdisplay res
+    vinit View1
+    vdisplay -noupdate -redisplay res
     vsetdispmode res 1
     vfit
 }