0024785: Visualization - Modifying z-layers concept to gain more control over OpenGl...
authorduv <duv@opencascade.com>
Thu, 17 Apr 2014 11:56:41 +0000 (15:56 +0400)
committerapn <apn@opencascade.com>
Thu, 17 Apr 2014 11:57:28 +0000 (15:57 +0400)
Cosmetic fixes.
glDepthFunc fix.

26 files changed:
src/Graphic3d/FILES
src/Graphic3d/Graphic3d.cdl
src/Graphic3d/Graphic3d_GraphicDriver.cdl
src/Graphic3d/Graphic3d_StructureManager.cdl
src/Graphic3d/Graphic3d_ZLayerSettings.hxx [new file with mode: 0644]
src/OpenGl/FILES
src/OpenGl/OpenGl_GraphicDriver.hxx
src/OpenGl/OpenGl_GraphicDriver_7.cxx
src/OpenGl/OpenGl_Layer.cxx [new file with mode: 0644]
src/OpenGl/OpenGl_Layer.hxx [new file with mode: 0644]
src/OpenGl/OpenGl_LayerList.cxx
src/OpenGl/OpenGl_LayerList.hxx
src/OpenGl/OpenGl_View.hxx
src/OpenGl/OpenGl_View_2.cxx
src/OpenGl/OpenGl_Workspace_Raytrace.cxx
src/V3d/V3d_Viewer.cdl
src/V3d/V3d_Viewer.cxx
src/ViewerTest/ViewerTest_ViewerCommands.cxx
src/Visual3d/FILES
src/Visual3d/Visual3d.cdl
src/Visual3d/Visual3d_MapOfZLayerSettings.hxx [new file with mode: 0644]
src/Visual3d/Visual3d_View.cdl
src/Visual3d/Visual3d_View.cxx
src/Visual3d/Visual3d_ViewManager.cdl
src/Visual3d/Visual3d_ViewManager.cxx
tests/bugs/vis/bug24785 [new file with mode: 0644]

index 2a952a0..30797b3 100755 (executable)
@@ -59,6 +59,7 @@ Graphic3d_Vec3.hxx
 Graphic3d_Vec4.hxx
 Graphic3d_Mat4.hxx
 Graphic3d_Mat4d.hxx
+Graphic3d_ZLayerSettings.hxx
 Graphic3d_Vertex.hxx
 Graphic3d_Vertex.cxx
 Graphic3d_MarkerImage.hxx
index 3401511..dd2567c 100644 (file)
@@ -421,6 +421,8 @@ is
     imported  Mat4;
     imported  Mat4d;
 
+    imported ZLayerSettings;
+
     --------------------
     -- Category: Classes
     --------------------
index d72d961..acdcb19 100644 (file)
@@ -53,6 +53,8 @@ uses
     PrintAlgo           from Aspect,
     DisplayConnection_Handle from Aspect,
 
+    ZLayerSettings      from Graphic3d,
+
     AspectLine3d        from Graphic3d,
     AspectMarker3d      from Graphic3d,
     AspectText3d        from Graphic3d,
@@ -688,6 +690,13 @@ is
         ---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;
+                       theSettings : ZLayerSettings from Graphic3d)
+        is deferred;
+        ---Purpose:  Sets the settings for a single Z layer of specified view.
+
     -----------------------------
     -- Category: Internal methods
     -----------------------------
index b2a092b..557fe41 100644 (file)
@@ -40,6 +40,8 @@ uses
        TypeOfHighlightMethod   from Aspect,
        TypeOfUpdate            from Aspect,
 
+       ZLayerSettings      from Graphic3d,
+
        DataStructureManager    from Graphic3d,
        AspectFillArea3d        from Graphic3d,
        AspectLine3d            from Graphic3d,
@@ -293,6 +295,17 @@ is
         ---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;
+                            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 )
+          returns ZLayerSettings from Graphic3d is deferred;
+        ---Purpose: Returns the settings of a single Z layer.
+        
         AddZLayer ( me : mutable;
                     theLayerId : in out Integer from Standard )
            returns Boolean from Standard is deferred;
diff --git a/src/Graphic3d/Graphic3d_ZLayerSettings.hxx b/src/Graphic3d/Graphic3d_ZLayerSettings.hxx
new file mode 100644 (file)
index 0000000..e6a592a
--- /dev/null
@@ -0,0 +1,79 @@
+// 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 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_ZLayerSettings_HeaderFile
+#define _Graphic3d_ZLayerSettings_HeaderFile
+
+#include <Standard_TypeDef.hxx>
+
+enum Graphic3d_ZLayerSetting
+{
+  Graphic3d_ZLayerDepthTest = 1,
+  Graphic3d_ZLayerDepthWrite = 2,
+  Graphic3d_ZLayerDepthClear = 4,
+  Graphic3d_ZLayerDepthOffset = 8
+};
+
+struct Graphic3d_ZLayerSettings
+{
+  Graphic3d_ZLayerSettings()
+    : DepthOffsetFactor (1.0f),
+      DepthOffsetUnits  (1.0f),
+      Flags (Graphic3d_ZLayerDepthTest
+           | Graphic3d_ZLayerDepthWrite
+           | Graphic3d_ZLayerDepthClear)
+  {}
+
+  //! Returns true if theSetting is enabled.
+  const Standard_Boolean IsSettingEnabled (const Graphic3d_ZLayerSetting theSetting) const
+  {
+    return (Flags & theSetting) == theSetting;
+  }
+
+  //! Enables theSetting
+  void EnableSetting (const Graphic3d_ZLayerSetting theSetting)
+  {
+    Flags = Flags | theSetting;
+  }
+
+  //! Disables theSetting
+  void DisableSetting (const Graphic3d_ZLayerSetting theSetting)
+  {
+    Flags = Flags & (~theSetting);
+  }
+
+  //! Sets minimal possible positive depth offset.
+  //! Access DepthOffsetFactor and DepthOffsetUnits values for manual offset control.
+  void SetDepthOffsetPositive()
+  {
+    DepthOffsetFactor = 1.f;
+    DepthOffsetUnits  = 1.f;
+    EnableSetting (Graphic3d_ZLayerDepthOffset);
+  }
+
+  //! Sets minimal possible negative depth offset.
+  //! Access DepthOffsetFactor and DepthOffsetUnits values for manual offset control.
+  void SetDepthOffsetNegative()
+  {
+    DepthOffsetFactor =  1.f;
+    DepthOffsetUnits  = -1.f;
+    EnableSetting (Graphic3d_ZLayerDepthOffset);
+  }
+
+  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.
+};
+
+#endif // _Graphic3d_ZLayerSettings_HeaderFile
index 5619791..9b31318 100755 (executable)
@@ -113,6 +113,8 @@ OpenGl_LayerList.cxx
 OpenGl_LayerList.hxx
 OpenGl_IndexBuffer.hxx
 OpenGl_IndexBuffer.cxx
+OpenGl_Layer.cxx
+OpenGl_Layer.hxx
 OpenGl_TextureBufferArb.hxx
 OpenGl_TextureBufferArb.cxx
 OpenGl_Vec.hxx
index 8492e55..0c561e0 100644 (file)
@@ -277,6 +277,11 @@ public:
   //! 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;
 
+  //! Sets the settings for a single Z layer of specified view.
+  Standard_EXPORT void SetZLayerSettings (const Graphic3d_CView& theCView,
+                                          const Standard_Integer theLayerId,
+                                          const Graphic3d_ZLayerSettings& theSettings);
+
 public:
 
   //! @return the visualization options
index dc5b191..654f9ee 100644 (file)
@@ -508,7 +508,6 @@ void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView,
 //function : RemoveZLayer
 //purpose  :
 //=======================================================================
-
 void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
                                          const Standard_Integer theLayerId)
 {
@@ -516,3 +515,16 @@ void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
   if (aCView)
     aCView->View->RemoveZLayer (theLayerId);
 }
+
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+Standard_EXPORT void OpenGl_GraphicDriver::SetZLayerSettings (const Graphic3d_CView& theCView,
+                                                              const Standard_Integer theLayerId,
+                                                              const Graphic3d_ZLayerSettings& theSettings)
+{
+  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
+  if (aCView)
+    aCView->View->SetZLayerSettings (theLayerId, theSettings);
+}
diff --git a/src/OpenGl/OpenGl_Layer.cxx b/src/OpenGl/OpenGl_Layer.cxx
new file mode 100644 (file)
index 0000000..dadd699
--- /dev/null
@@ -0,0 +1,74 @@
+// Created on: 2014-03-31
+// Created by: Danila ULYANOV
+// 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 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_Layer.hxx>
+
+#include <OpenGl_GlCore11.hxx>
+
+//=======================================================================
+//function : OpenGl_Layer
+//purpose  : 
+//=======================================================================
+OpenGl_Layer::OpenGl_Layer (const Standard_Integer theNbPriorities)
+  : myPriorityList (theNbPriorities)
+{
+  //
+}
+
+//=======================================================================
+//function : Render
+//purpose  : 
+//=======================================================================
+void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &AWorkspace, int theDefaultDepthFunc) const
+{
+  // separate depth buffers
+  if (IsSettingEnabled (Graphic3d_ZLayerDepthClear))
+  {
+    glClear (GL_DEPTH_BUFFER_BIT);
+  }
+
+  // handle depth test
+  if (IsSettingEnabled (Graphic3d_ZLayerDepthTest))
+  {
+    glDepthFunc (theDefaultDepthFunc);
+  }
+  else
+  {
+    glDepthFunc (GL_ALWAYS);
+  }
+
+  // handle depth offset
+  if (IsSettingEnabled (Graphic3d_ZLayerDepthOffset))
+  {
+    glPolygonOffset (myLayerSettings.DepthOffsetFactor, myLayerSettings.DepthOffsetUnits);
+  }
+  else
+  {
+    glPolygonOffset (0.0f, 0.0f);
+  }
+
+  // handle depth write
+  if (IsSettingEnabled (Graphic3d_ZLayerDepthWrite))
+  {
+    glDepthMask (GL_TRUE);
+  }
+  else
+  {
+    glDepthMask (GL_FALSE);
+  }
+
+  // render priority list
+  myPriorityList.Render (AWorkspace);
+}
diff --git a/src/OpenGl/OpenGl_Layer.hxx b/src/OpenGl/OpenGl_Layer.hxx
new file mode 100644 (file)
index 0000000..abe88cb
--- /dev/null
@@ -0,0 +1,60 @@
+// Created on: 2014-03-31
+// Created by: Danila ULYANOV
+// 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 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_Layer_Header
+#define _OpenGl_Layer_Header
+
+#include <OpenGl_PriorityList.hxx>
+#include <Graphic3d_ZLayerSettings.hxx>
+
+class Handle(OpenGl_Workspace);
+
+class OpenGl_Layer
+{
+public:
+
+  //! Initializes associated priority list and layer properties
+  OpenGl_Layer (const Standard_Integer theNbPriorities = 11);
+
+  //! Returns settings of the layer object.
+  const Graphic3d_ZLayerSettings LayerSettings() const { return myLayerSettings; };
+
+  //! Sets settings of the layer object.
+  void SetLayerSettings (Graphic3d_ZLayerSettings theSettings)
+  {
+    myLayerSettings = theSettings;
+  }
+
+  //! Returns true if theSetting is enabled for the layer.
+  const Standard_Boolean IsSettingEnabled (const Graphic3d_ZLayerSetting theSetting) const
+  {
+    return myLayerSettings.IsSettingEnabled (theSetting);
+  }
+
+  //! Returns reference to associated priority list.
+  OpenGl_PriorityList& PriorityList() { return myPriorityList; }
+
+  //! Returns const reference to associated priority list.
+  const OpenGl_PriorityList& PriorityList() const { return myPriorityList; }
+
+  void Render (const Handle(OpenGl_Workspace) &AWorkspace, int theDefaultDepthFunc) const;
+
+private:
+
+  OpenGl_PriorityList myPriorityList;       //!< Associated priority list object.
+
+  Graphic3d_ZLayerSettings myLayerSettings; //!< Layer setting flags.
+};
+#endif //_OpenGl_Layer_Header
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());
 }
 
@@ -101,6 +101,24 @@ Standard_Boolean OpenGl_LayerList::HasLayer
 }
 
 //=======================================================================
+//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);
     }
   }
 }
index 848337d..210ebe2 100644 (file)
@@ -17,6 +17,7 @@
 #define _OpenGl_LayerList_Header
 
 #include <OpenGl_PriorityList.hxx>
+#include <OpenGl_Layer.hxx>
 
 #include <InterfaceGraphic_telem.hxx>
 
@@ -26,7 +27,7 @@
 class OpenGl_Structure;
 class Handle(OpenGl_Workspace);
 
-typedef NCollection_Sequence<OpenGl_PriorityList> OpenGl_SequenceOfLayers;
+typedef NCollection_Sequence<OpenGl_Layer> OpenGl_SequenceOfLayers;
 typedef NCollection_DataMap<int, int> OpenGl_LayerSeqIds;
 
 class OpenGl_LayerList
@@ -71,6 +72,12 @@ class OpenGl_LayerList
   void ChangeLayer (const OpenGl_Structure *theStructure,
                     const Standard_Integer  theOldLayerId,
                     const Standard_Integer  theNewLayerId);
+
+  //! Returns reference to the layer with given ID.
+  OpenGl_Layer& Layer (const Standard_Integer theLayerId);
+
+  //! Returns reference to the layer with given ID.
+  const OpenGl_Layer& Layer (const Standard_Integer theLayerId) const;
   
   //! Render this element
   void Render (const Handle(OpenGl_Workspace) &theWorkspace) const;
@@ -84,7 +91,7 @@ class OpenGl_LayerList
  private:
   
   //! Get default layer
-  OpenGl_PriorityList& defaultLayer ();
+  OpenGl_Layer& defaultLayer ();
   
  protected:
 
index ef3dd2c..6eeaee4 100644 (file)
@@ -34,6 +34,7 @@
 #include <Graphic3d_CView.hxx>
 #include <Graphic3d_CGraduatedTrihedron.hxx>
 #include <Graphic3d_SequenceOfHClipPlane.hxx>
+#include <Graphic3d_ZLayerSettings.hxx>
 #include <Visual3d_TypeOfSurfaceDetail.hxx>
 
 #include <OpenGl_LayerList.hxx>
@@ -159,6 +160,10 @@ class OpenGl_View : public MMgt_TShared
   void ChangeZLayer (const OpenGl_Structure *theStructure,
                      const Standard_Integer  theNewLayerId);
 
+  //! Sets the settings for a single Z layer of specified view.
+  void SetZLayerSettings (const Standard_Integer theLayerId,
+                          const Graphic3d_ZLayerSettings theSettings);
+
   void CreateBackgroundTexture (const Standard_CString AFileName, const Aspect_FillMethod AFillStyle);
   void SetBackgroundTextureStyle (const Aspect_FillMethod FillStyle);
   void SetBackgroundGradient (const Quantity_Color& AColor1, const Quantity_Color& AColor2, const Aspect_GradientFillMethod AType);
index 5110e24..a7f2962 100644 (file)
@@ -1029,6 +1029,17 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure,
 }
 
 //=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId,
+                                     const Graphic3d_ZLayerSettings theSettings)
+{
+  myZLayers.Layer (theLayerId).SetLayerSettings (theSettings);
+}
+
+
+//=======================================================================
 //function : RedrawScene
 //purpose  :
 //=======================================================================
index 602576f..b280ff8 100755 (executable)
@@ -90,7 +90,7 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceGeometry (GeomUpdateMode theMod
 
   for (OpenGl_SequenceOfLayers::Iterator anLayerIt (aList.Layers()); anLayerIt.More(); anLayerIt.Next())
   {
-    const OpenGl_PriorityList& aPriorityList = anLayerIt.Value();
+    const OpenGl_PriorityList& aPriorityList = anLayerIt.Value().PriorityList();
 
     if (aPriorityList.NbStructures() == 0)
       continue;
index 86f759b..13809c1 100644 (file)
@@ -40,6 +40,7 @@ class Viewer from V3d inherits TShared from MMgt
 uses
 
         GraphicDriver from Graphic3d,
+        ZLayerSettings from Graphic3d,
         TypeOfUpdate from V3d,
         TypeOfVisualization from V3d,
         TypeOfShadingModel from V3d,
@@ -643,6 +644,17 @@ is
         ---Purpose:
         -- Temporarly hide grid echo.
 
+        SetZLayerSettings ( me          : mutable;
+                            theLayerId  : Integer from Standard;
+                            theSettings : ZLayerSettings from Graphic3d )
+          is static;
+        ---Purpose: Sets the settings for a single Z layer.
+
+        ZLayerSettings ( me          : mutable;
+                         theLayerId  : Integer from Standard )
+          returns ZLayerSettings from Graphic3d is static;
+        ---Purpose: Returns the settings of a single Z layer.
+
         AddZLayer ( me : mutable;
                     theLayerId : in out Integer from Standard )
            returns Boolean from Standard is static;
index 6b43f08..2078206 100644 (file)
@@ -333,6 +333,27 @@ void V3d_Viewer::DelView( const Handle(V3d_View)& TheView ) {
 }
 
 //=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+
+void V3d_Viewer::SetZLayerSettings (const Standard_Integer theLayerId,
+                                    const Graphic3d_ZLayerSettings& theSettings)
+{
+  MyViewer->SetZLayerSettings (theLayerId, theSettings);
+}
+
+//=======================================================================
+//function : ZLayerSettings
+//purpose  :
+//=======================================================================
+
+Graphic3d_ZLayerSettings V3d_Viewer::ZLayerSettings (const Standard_Integer theLayerId)
+{
+  return MyViewer->ZLayerSettings (theLayerId);
+}
+
+//=======================================================================
 //function : AddZLayer
 //purpose  :
 //=======================================================================
index b002336..aecf926 100644 (file)
@@ -3369,12 +3369,21 @@ static int VZLayer (Draw_Interpretor& di, Standard_Integer argc, const char** ar
   }
   else if (argc < 2)
   {
-    di << "Use: vzlayer " << argv[0];
-    di << " add/del/get [id]\n";
+    di << "Use: vzlayer ";
+    di << " add/del/get/settings/enable/disable [id]\n";
     di << " add - add new z layer to viewer and print its id\n";
     di << " del - del z layer by its id\n";
     di << " get - print sequence of z layers in increasing order of their overlay level\n";
-    di << "id - the layer identificator value defined when removing z layer\n";
+    di << " settings - print status of z layer settings\n";
+    di << " enable ([depth]test/[depth]write/[depth]clear/[depth]offset) \n    enables given setting for the z layer\n";
+    di << " enable (p[ositive]offset/n[egative]offset) \n    enables given setting for the z layer\n";
+    di << " disable ([depth]test/[depth]write/[depth]clear/[depth]offset) \n    disables given setting for the z layer\n";
+    di << "\nWhere id is the layer identificator\n";
+    di << "\nExamples:\n";
+    di << "   vzlayer add\n";
+    di << "   vzlayer enable poffset 1\n";
+    di << "   vzlayer disable depthtest 1\n";
+    di << "   vzlayer del 1\n";
     return 1;
   }
 
@@ -3426,9 +3435,123 @@ static int VZLayer (Draw_Interpretor& di, Standard_Integer argc, const char** ar
 
     di << "\n";
   }
+  else if (anOp == "settings")
+  {
+    if (argc < 3)
+    {
+      di << "Please also provide an id\n";
+      return 1;
+    }
+
+    Standard_Integer anId = Draw::Atoi (argv[2]);
+    Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (anId);
+
+    di << "Depth test - " << (aSettings.IsSettingEnabled (Graphic3d_ZLayerDepthTest) ? "enabled" : "disabled") << "\n";
+    di << "Depth write - " << (aSettings.IsSettingEnabled (Graphic3d_ZLayerDepthWrite) ? "enabled" : "disabled") << "\n";
+    di << "Depth buffer clearing - " << (aSettings.IsSettingEnabled (Graphic3d_ZLayerDepthClear) ? "enabled" : "disabled") << "\n";
+    di << "Depth offset - " << (aSettings.IsSettingEnabled (Graphic3d_ZLayerDepthOffset) ? "enabled" : "disabled") << "\n";
+
+  }
+  else if (anOp == "enable")
+  {
+    if (argc < 3)
+    {
+      di << "Please also provide an option to enable\n";
+      return 1;
+    }
+
+    if (argc < 4)
+    {
+      di << "Please also provide a layer id\n";
+      return 1;
+    }
+
+    TCollection_AsciiString aSubOp = TCollection_AsciiString (argv[2]);
+    Standard_Integer anId = Draw::Atoi (argv[3]);
+    Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (anId);
+
+    if (aSubOp == "depthtest" || aSubOp == "test")
+    {
+      aSettings.EnableSetting (Graphic3d_ZLayerDepthTest);
+    }
+    else if (aSubOp == "depthwrite" || aSubOp == "write")
+    {
+      aSettings.EnableSetting (Graphic3d_ZLayerDepthWrite);
+    }
+    else if (aSubOp == "depthclear" || aSubOp == "clear")
+    {
+      aSettings.EnableSetting (Graphic3d_ZLayerDepthClear);
+    }
+    else if (aSubOp == "depthoffset" || aSubOp == "offset")
+    {
+      if (argc < 6)
+      {
+        di << "Please also provide a factor and units values for depth offset\n";
+        di << "Format is: vzlayer enable offset [factor] [units] [layerId]\n";
+        return 1;
+      }
+
+      Standard_ShortReal aFactor = static_cast<Standard_ShortReal> (Draw::Atof (argv[3]));
+      Standard_ShortReal aUnits  = static_cast<Standard_ShortReal> (Draw::Atof (argv[4]));
+      anId = Draw::Atoi (argv[5]);
+      aSettings = aViewer->ZLayerSettings (anId);
+
+      aSettings.DepthOffsetFactor = aFactor;
+      aSettings.DepthOffsetUnits  = aUnits;
+
+      aSettings.EnableSetting (Graphic3d_ZLayerDepthOffset);
+    }
+    else if (aSubOp == "positiveoffset" || aSubOp == "poffset")
+    {
+      aSettings.SetDepthOffsetPositive();
+    }
+    else if (aSubOp == "negativeoffset" || aSubOp == "noffset")
+    {
+      aSettings.SetDepthOffsetNegative();
+    }
+
+    aViewer->SetZLayerSettings (anId, aSettings);
+  }
+  else if (anOp == "disable")
+  {
+    if (argc < 3)
+    {
+      di << "Please also provide an option to disable\n";
+      return 1;
+    }
+
+    if (argc < 4)
+    {
+      di << "Please also provide a layer id\n";
+      return 1;
+    }
+
+    TCollection_AsciiString aSubOp = TCollection_AsciiString (argv[2]);
+    Standard_Integer anId = Draw::Atoi (argv[3]);
+    Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (anId);
+
+    if (aSubOp == "depthtest" || aSubOp == "test")
+    {
+      aSettings.DisableSetting (Graphic3d_ZLayerDepthTest);
+    }
+    else if (aSubOp == "depthwrite" || aSubOp == "write")
+    {
+      aSettings.DisableSetting (Graphic3d_ZLayerDepthWrite);
+    }
+    else if (aSubOp == "depthclear" || aSubOp == "clear")
+    {
+      aSettings.DisableSetting (Graphic3d_ZLayerDepthClear);
+    }
+    else if (aSubOp == "depthoffset" || aSubOp == "offset")
+    {
+      aSettings.DisableSetting (Graphic3d_ZLayerDepthOffset);
+    }
+
+    aViewer->SetZLayerSettings (anId, aSettings);
+  }
   else
   {
-    di << "Invalid operation, please use { add / del / get }\n";
+    di << "Invalid operation, please use { add / del / get / settings / enable / disable}\n";
     return 1;
   }
 
@@ -6506,7 +6629,20 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
     "vprintview : width height filename [algo=0] [tile_width tile_height] : Test print algorithm: algo = 0 - stretch, algo = 1 - tile",
     __FILE__,VPrintView,group);
   theCommands.Add("vzlayer",
-    "vzlayer : add/del/get [id] : Z layer operations in v3d viewer: add new z layer, delete z layer, get z layer ids",
+    "vzlayer add/del/get/settings/enable/disable [id]\n"
+    " add - add new z layer to viewer and print its id\n"
+    " del - del z layer by its id\n"
+    " get - print sequence of z layers in increasing order of their overlay level\n"
+    " settings - print status of z layer settings\n"
+    " enable ([depth]test/[depth]write/[depth]clear/[depth]offset) \n    enables given setting for the z layer\n"
+    " enable (p[ositive]offset/n[egative]offset) \n    enables given setting for the z layer\n"
+    " disable ([depth]test/[depth]write/[depth]clear/[depth]offset) \n    disables given setting for the z layer\n"
+    "\nWhere id is the layer identificator\n"
+    "\nExamples:\n"
+    "   vzlayer add\n"
+    "   vzlayer enable poffset 1\n"
+    "   vzlayer disable depthtest 1\n"
+    "   vzlayer del 1\n",
     __FILE__,VZLayer,group);
   theCommands.Add("voverlaytext",
     "voverlaytext : text x y [height] [font_name] [text_color: R G B] [display_type] [background_color: R G B]"
index d8666a9..de7bfee 100755 (executable)
@@ -6,3 +6,4 @@ EXTERNLIB
 Visual3d_WOKSteps.edl 
 Visual3d_View_Print.cxx
 Visual3d_NListOfLayerItem.hxx
+Visual3d_MapOfZLayerSettings.hxx
index fff61bf..f1007d8 100644 (file)
@@ -278,6 +278,8 @@ is
     -- Category: Instantiated classes
     ---------------------------------
 
+    primitive MapOfZLayerSettings;
+
         imported NListOfLayerItem;
     
     class SequenceOfPickPath instantiates
diff --git a/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx b/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx
new file mode 100644 (file)
index 0000000..e9e7947
--- /dev/null
@@ -0,0 +1,23 @@
+// 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 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 _Visual3d_MapOfZLayerSettings_HeaderFile
+#define _Visual3d_MapOfZLayerSettings_HeaderFile
+
+#include <Standard_TypeDef.hxx>
+#include <NCollection_Map.hxx>
+#include <Graphic3d_ZLayerSettings.hxx>
+
+typedef NCollection_DataMap<Standard_Integer, Graphic3d_ZLayerSettings> Visual3d_MapOfZLayerSettings;
+
+#endif // _Visual3d_MapOfZLayerSettings_HeaderFile
index 63f9192..b4e202b 100644 (file)
@@ -86,6 +86,8 @@ uses
     MapOfStructure          from Graphic3d,
     Camera_Handle           from Graphic3d,
 
+    ZLayerSettings          from Graphic3d,
+
     ContextView             from Visual3d,
     Layer                   from Visual3d,
     Light                   from Visual3d,
@@ -796,6 +798,13 @@ is
        ---Purpose: Changes the display priority of the structure <AStructure>.
        ---Category: Private methods
 
+
+        SetZLayerSettings ( me          : mutable;
+                            theLayerId  : Integer from Standard;
+                            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 )
           is static private;
index 658997b..a21e8bc 100644 (file)
@@ -2930,6 +2930,17 @@ Standard_Boolean Visual3d_View::Export (const Standard_CString       theFileName
 }
 
 //=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+
+void Visual3d_View::SetZLayerSettings (const Standard_Integer theLayerId,
+                                       const Graphic3d_ZLayerSettings& theSettings)
+{
+  MyGraphicDriver->SetZLayerSettings (MyCView, theLayerId, theSettings);
+}
+
+//=======================================================================
 //function : AddZLayer
 //purpose  :
 //=======================================================================
index 3f88292..5a60dfd 100644 (file)
@@ -41,6 +41,9 @@ uses
        CView                   from Graphic3d,
        Vector                  from Graphic3d,
 
+       ZLayerSettings  from Graphic3d,
+       MapOfZLayerSettings from Visual3d,
+
        ContextPick             from Visual3d,
        Layer                   from Visual3d,
        PickDescriptor          from Visual3d,
@@ -249,6 +252,17 @@ is
            returns Integer from Standard is redefined static;
         ---Purpose: Get Z layer ID assigned for the structure.
 
+        SetZLayerSettings ( me          : mutable;
+                            theLayerId  : Integer from Standard;
+                            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 )
+          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 )
            returns Boolean from Standard is redefined static;
@@ -474,6 +488,8 @@ fields
         myLayerIds                      :       MapOfInteger from TColStd;
         myLayerSeq                      :       SequenceOfInteger from TColStd;
 
+        myMapOfZLayerSettings : MapOfZLayerSettings from Visual3d;
+
 friends
 
        class View from Visual3d,
index 0c79703..19666b9 100644 (file)
@@ -103,6 +103,7 @@ MyTransparency (Standard_False)
   myLayerSeq.Append (0);
 
   MyGraphicDriver = theDriver;
+  myMapOfZLayerSettings.Bind (0, Graphic3d_ZLayerSettings());
 }
 
 //-Destructors
@@ -776,6 +777,45 @@ Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structu
 }
 
 //=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+void Visual3d_ViewManager::SetZLayerSettings (const Standard_Integer theLayerId,
+                                              const Graphic3d_ZLayerSettings& theSettings)
+{
+  // tell all managed views to set zlayer settings
+  Visual3d_SetIteratorOfSetOfView aViewIt (MyDefinedView);
+  for (; aViewIt.More (); aViewIt.Next ())
+  {
+    (aViewIt.Value ())->SetZLayerSettings (theLayerId, theSettings);
+  }
+
+  if (myMapOfZLayerSettings.IsBound (theLayerId))
+  {
+    myMapOfZLayerSettings.ChangeFind (theLayerId) = theSettings;
+  }
+  else
+  {
+    myMapOfZLayerSettings.Bind (theLayerId, theSettings);
+  }
+  
+}
+
+//=======================================================================
+//function : ZLayerSettings
+//purpose  :
+//=======================================================================
+Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Standard_Integer theLayerId)
+{
+  if (!myLayerIds.Contains (theLayerId))
+  {
+    return Graphic3d_ZLayerSettings();
+  }
+
+  return myMapOfZLayerSettings.Find (theLayerId);
+}
+
+//=======================================================================
 //function : AddZLayer
 //purpose  :
 //=======================================================================
@@ -795,6 +835,9 @@ Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId)
     return Standard_False;
   }
 
+  // default z-layer settings
+  myMapOfZLayerSettings.Bind (theLayerId, Graphic3d_ZLayerSettings());
+
   // tell all managed views to remove display layers
   Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
   for ( ; aViewIt.More (); aViewIt.Next ())
@@ -814,7 +857,7 @@ Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theL
     return Standard_False;
 
   // tell all managed views to remove display layers
-  Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
+  Visual3d_SetIteratorOfSetOfView aViewIt (MyDefinedView);
   for ( ; aViewIt.More (); aViewIt.Next ())
     (aViewIt.Value ())->RemoveZLayer (theLayerId);
 
@@ -822,11 +865,15 @@ Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theL
 
   // remove index
   for (int aIdx = 1; aIdx <= myLayerSeq.Length (); aIdx++)
-    if (myLayerSeq(aIdx) == theLayerId)
+  {
+    if (myLayerSeq (aIdx) == theLayerId)
     {
       myLayerSeq.Remove (aIdx);
       break;
     }
+  }
+
+  myMapOfZLayerSettings.UnBind (theLayerId);
 
   myLayerIds.Remove (theLayerId);
   getZLayerGenId ().Free (theLayerId);
diff --git a/tests/bugs/vis/bug24785 b/tests/bugs/vis/bug24785
new file mode 100644 (file)
index 0000000..4ef46dd
--- /dev/null
@@ -0,0 +1,51 @@
+# This test case handles a specific task:
+# to draw 2d objects in same scene with 3d objects while 
+# 2d objects need to be drawn in specific order on 3d plane and
+# overlap correctly with 3d objects.
+
+pload ALL
+vinit
+# Thin boxes represent overlapping 2d objects in same plane
+# Normally such configuration would cause z-fighting noise (flickering)
+box b1 -0.75 -0.75 0 1 1 0.01
+box b2 -0.5 -0.5 0 1 1 0.01
+box b3 -0.25 -0.25 0 1 1 0.01
+vdisplay b1
+vdisplay b2
+vdisplay b3
+vsetmaterial b2 silver
+vsetmaterial b3 copper
+
+psphere s 0.3
+vdisplay s
+
+# Create new z-layer for 3d objects
+vzlayer add
+vobjzlayer set s 1 
+
+vsetdispmode 1
+
+# Disable OpenGl depth test for layer 0 (to eliminate flickering)
+# But depth write is still enabled
+vzlayer disable depthtest 0
+
+# Disable depth buffer clearing for layer 1 (we want correct overlapping with 3d objects)
+vzlayer disable depthclear 1
+
+# List currently enabled settings of each layer
+vzlayer settings 0
+vzlayer settings 1
+
+# "3d" box with one of its faces on same plane with "2d" objects
+# Normally this also would cause flickering because new box is
+# supposed to be in layer 1 as "3d" structure, thus depth test between
+# new box and "2d" objects will be enabled.
+box b 0 0 0.01 0.5 0.5 -0.5
+vdisplay b
+vobjzlayer set b 1 
+
+# To handle this situation, depth offset setting was introduced.
+# It implemented with glPolygonOffset calls per layer.
+vzlayer enable positiveoffset 1
+
+vfit