0024785: Visualization - Modifying z-layers concept to gain more control over OpenGl...
[occt.git] / src / OpenGl / OpenGl_LayerList.cxx
index f494bf1..c1efed5 100644 (file)
@@ -31,7 +31,7 @@ OpenGl_LayerList::OpenGl_LayerList (const Standard_Integer theNbPriorities)
    myNbStructures (0)
 {
   // insert default priority layer
-  myLayers.Append (OpenGl_PriorityList (myNbPriorities));
+  myLayers.Append (OpenGl_Layer (myNbPriorities));
   myLayerIds.Bind (0, myLayers.Length());
 }
 
@@ -49,7 +49,7 @@ OpenGl_LayerList::~OpenGl_LayerList ()
 //purpose  :
 //=======================================================================
 
-OpenGl_PriorityList& OpenGl_LayerList::defaultLayer()
+OpenGl_Layer& OpenGl_LayerList::defaultLayer()
 {
   return myLayers.ChangeValue (1);
 }
@@ -85,7 +85,7 @@ void OpenGl_LayerList::AddLayer (const Standard_Integer theLayerId)
     return;
 
   // add the new layer
-  myLayers.Append (OpenGl_PriorityList (myNbPriorities));
+  myLayers.Append (OpenGl_Layer (myNbPriorities));
   myLayerIds.Bind (theLayerId, myLayers.Length());
 }
 
@@ -100,6 +100,24 @@ Standard_Boolean OpenGl_LayerList::HasLayer
   return myLayerIds.IsBound (theLayerId);
 }
 
+//=======================================================================
+//function : Layer
+//purpose  : 
+//=======================================================================
+OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId)
+{
+  return myLayers.ChangeValue (myLayerIds.Find (theLayerId));
+}
+
+//=======================================================================
+//function : Layer
+//purpose  : 
+//=======================================================================
+const OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId) const
+{
+  return myLayers.Value (myLayerIds.Find (theLayerId));
+}
+
 //=======================================================================
 //function : RemoveLayer
 //purpose  :
@@ -113,8 +131,8 @@ void OpenGl_LayerList::RemoveLayer (const Standard_Integer theLayerId)
   Standard_Integer aRemovePos = myLayerIds.Find (theLayerId);
   
   // move all displayed structures to first layer
-  const OpenGl_PriorityList& aList = myLayers.Value (aRemovePos);
-  defaultLayer ().Append (aList);
+  const OpenGl_PriorityList& aList = myLayers.Value (aRemovePos).PriorityList();
+  defaultLayer ().PriorityList().Append (aList);
 
   // remove layer
   myLayers.Remove (aRemovePos);
@@ -141,8 +159,8 @@ void OpenGl_LayerList::AddStructure (const OpenGl_Structure *theStructure,
 {
   // add structure to associated layer,
   // if layer doesn't exists, display structure in default layer
-  OpenGl_PriorityList& aList = !HasLayer (theLayerId) ? defaultLayer () :
-    myLayers.ChangeValue (myLayerIds.Find (theLayerId));
+  OpenGl_PriorityList& aList = !HasLayer (theLayerId) ? defaultLayer ().PriorityList() :
+    myLayers.ChangeValue (myLayerIds.Find (theLayerId)).PriorityList();
 
   aList.Add (theStructure, thePriority);
   myNbStructures++;
@@ -163,7 +181,7 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure,
   Standard_Integer aSeqPos = !HasLayer (theLayerId) ?
     1 : myLayerIds.Find (theLayerId);
   
-  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos);
+  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
 
   // remove structure from associated list
   // if the structure is not found there,
@@ -185,7 +203,7 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure,
   OpenGl_SequenceOfLayers::Iterator anIts;
   for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++)
   {
-    OpenGl_PriorityList& aScanList = anIts.ChangeValue ();
+    OpenGl_PriorityList& aScanList = anIts.ChangeValue ().PriorityList();
     if (aSeqPos == aSeqId)
       continue;
   
@@ -215,7 +233,7 @@ void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure,
   Standard_Integer aSeqPos = !HasLayer (theOldLayerId) ?
     1 : myLayerIds.Find (theOldLayerId);
   
-  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos);
+  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
   Standard_Integer aPriority;
 
   // take priority and remove structure from list found by <theOldLayerId>
@@ -253,17 +271,17 @@ void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure,
 
 void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace) &theWorkspace) const
 {
+  int aDefaultDepthFunc;
+  glGetIntegerv (GL_DEPTH_FUNC, &aDefaultDepthFunc);
+
   OpenGl_SequenceOfLayers::Iterator anIts;
   for(anIts.Init (myLayers); anIts.More (); anIts.Next ())
   {
-    const OpenGl_PriorityList& aList = anIts.Value ();
-    if (aList.NbStructures () > 0)
+    const OpenGl_Layer& aLayer = anIts.Value ();
+    if (aLayer.PriorityList().NbStructures () > 0)
     {
-      // separate depth buffers
-      glClear (GL_DEPTH_BUFFER_BIT);
-
-      // render priority list
-      aList.Render (theWorkspace);
+      // render layer
+      aLayer.Render (theWorkspace, aDefaultDepthFunc);
     }
   }
 }