Salome HOME
refs #441: crash in digue construction
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ZLayers.cxx
index 2e9fad629670439b417130c7e1ed28070a8ac9d0..3e06521d5a25fb67c97bb38117e65d6b76787148 100644 (file)
@@ -48,6 +48,45 @@ void SetPrsZLayer( const Handle_PrsMgr_PresentableObject& thePresentableObject,
   PrsMgr_PresentationManager::SetZLayer( thePresentableObject, theMode, theLayerId );
 }
 
+void SetZLayerSettings( const Handle_V3d_Viewer& theViewer3d, int theLayerId, bool theIsOrdered )
+{
+  if ( theViewer3d.IsNull() || theLayerId < 0 ) {
+    return;
+  }
+
+  Graphic3d_ZLayerSettings aSettings = theViewer3d->ZLayerSettings( theLayerId );
+  // enable depth write
+  aSettings.EnableSetting( Graphic3d_ZLayerDepthWrite );
+  // disable depth clear
+  aSettings.DisableSetting( Graphic3d_ZLayerDepthClear );
+  if ( theIsOrdered ) {
+    // disable depth test
+    aSettings.DisableSetting( Graphic3d_ZLayerDepthTest );
+    // disable depth offset
+    aSettings.DisableSetting( Graphic3d_ZLayerDepthOffset );
+  } else {
+    // enable depth test
+    aSettings.EnableSetting( Graphic3d_ZLayerDepthTest );
+    // set depth offset
+    aSettings.SetDepthOffsetPositive();
+  }
+
+  // set new settings
+  theViewer3d->SetZLayerSettings( theLayerId, aSettings );
+}
+
+int CreateTopZLayer( const Handle_V3d_Viewer& theViewer3d )
+{
+  int aTopZLayer = -1;
+
+  if ( theViewer3d && !theViewer3d->AddZLayer( aTopZLayer ) ) {
+    aTopZLayer = -1;
+  }
+
+  return aTopZLayer;
+}
+
+
 HYDROGUI_ZLayersIterator::HYDROGUI_ZLayersIterator( const Handle_V3d_Viewer& theViewer )
   : myIndex( 0 ), myNewZLayer( -1 ), myViewer( theViewer )
 {
@@ -73,34 +112,36 @@ void HYDROGUI_ZLayersIterator::Init( const Handle_V3d_Viewer& theViewer )
 
 bool HYDROGUI_ZLayersIterator::More() const
 {
-  return myIndex <= (int)myZLayers.size() || myNewZLayer >= 0;
+  return myIndex < (int)myZLayers.size() || myNewZLayer >= 0;
 }
 
 void HYDROGUI_ZLayersIterator::Next()
 {
-  if( myIndex < (int)myZLayers.size() )
-    myIndex++;
-  else if( !myViewer.IsNull() )
-  {
-    bool isOK = myViewer->AddZLayer( myNewZLayer )==Standard_True;
-    if( !isOK )
-      myNewZLayer = -1;
+  myIndex++;
+
+  if( myIndex >= (int)myZLayers.size() && 
+      !myViewer.IsNull() ) {
+    myNewZLayer = CreateTopZLayer( myViewer );
   }
 }
 
-int HYDROGUI_ZLayersIterator::MaxLayer() const
+int HYDROGUI_ZLayersIterator::TopLayer() const
 {
-  int aMaxLayer = -1;
-  for( int i=0, n=myZLayers.size(); i<n; i++ )
-    if( myZLayers[i] > aMaxLayer )
-      aMaxLayer = myZLayers[i];
-  return aMaxLayer;
+  int aTopLayer = -1;
+
+  if ( myNewZLayer >= 0 ) {
+    aTopLayer = myNewZLayer;
+  } else if ( !myZLayers.empty() ) {
+    aTopLayer = myZLayers.back();
+  }
+
+  return aTopLayer;
 }
 
 
 int HYDROGUI_ZLayersIterator::LayerId() const
 {
-  if( More() )
+  if( myIndex < (int)myZLayers.size() )
     return myZLayers[myIndex];
   else
     return myNewZLayer;