]> OCCT Git - occt-copy.git/commitdiff
0024785: Visualization - Modifying z-layers concept to gain more control over OpenGl...
authorduv <duv@opencascade.com>
Tue, 1 Apr 2014 14:51:41 +0000 (18:51 +0400)
committerduv <duv@opencascade.com>
Wed, 2 Apr 2014 07:16:25 +0000 (11:16 +0400)
25 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

index 5698da7e12d4f51f9025a52efdb3380b93fadd4f..cbb660aba2d7ab5ce911b9a61163581ea9e0e3ac 100755 (executable)
@@ -61,6 +61,7 @@ Graphic3d_Vec2.hxx
 Graphic3d_Vec3.hxx
 Graphic3d_Vec4.hxx
 Graphic3d_Mat4.hxx
+Graphic3d_ZLayerSettings.hxx
 Graphic3d_Vertex.hxx
 Graphic3d_Vertex.cxx
 Graphic3d_MarkerImage.hxx
index d219be487f5e8b2f37f0c5be3a37bc6f66dbc46d..ed7d272b58e64a7fc9775994e03caeab91cd9860 100644 (file)
@@ -419,6 +419,8 @@ is
     primitive Mat4;
     primitive Mat4d;
 
+    primitive ZLayerSettings;
+
     --------------------
     -- Category: Classes
     --------------------
index ab353cab8591d5d582ee9b5c5d3c740d4968862c..c9f71098f779790252f843962044002b66359891 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,
@@ -945,6 +947,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 187548bfad8a9d8b505e7322e234e0c23fd40fa3..fb4e48bdbdf1368c400c7d1753601c6d0ea783d5 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 4a801950b318f0da21eb905a3a356253cbd6d1ce..41edb199c575e70736657300446c5e4b0d9dc96b 100755 (executable)
@@ -108,6 +108,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 15ff6b423c975fe9548c0a4771ef881132539d0e..f91b4f58c9dc2b654dc08e7226b9a188c761de0e 100644 (file)
@@ -305,6 +305,11 @@ public:
   //! graphic driver, the method returns -1. <br>
   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 5ae09a16a80315cb8edf5461da1973c71fe0ce6f..16ad66dfcc858be18e6aa6f853c4524aa4190366 100644 (file)
@@ -618,7 +618,6 @@ void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView,
 //function : RemoveZLayer
 //purpose  :
 //=======================================================================
-
 void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
                                          const Standard_Integer theLayerId)
 {
@@ -626,3 +625,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..bbaa546
--- /dev/null
@@ -0,0 +1,88 @@
+// 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_LayerSettings
+//purpose  : 
+//=======================================================================
+OpenGl_LayerSettings::OpenGl_LayerSettings()
+  : DepthOffsetFactor (1.0f),
+    DepthOffsetUnits  (1.0f),
+    Flags (OpenGl_LayerDepthTest
+          | OpenGl_LayerDepthWrite
+          | OpenGl_LayerDepthClear)
+{
+  //
+}
+
+//=======================================================================
+//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) const
+{
+  // separate depth buffers
+  if (IsSettingEnabled (OpenGl_LayerDepthClear))
+  {
+    glClear (GL_DEPTH_BUFFER_BIT);
+  }
+
+  // handle depth test
+  if (IsSettingEnabled (OpenGl_LayerDepthTest))
+  {
+    glDepthFunc (GL_LESS);
+  }
+  else
+  {
+    glDepthFunc (GL_ALWAYS);
+  }
+
+  // handle depth offset
+  if (IsSettingEnabled (OpenGl_LayerDepthOffset))
+  {
+    glPolygonOffset (myLayerSettings.DepthOffsetFactor, myLayerSettings.DepthOffsetUnits);
+  }
+  else
+  {
+    glPolygonOffset (0.f, 0.f);
+  }
+
+  // handle depth write
+  if (IsSettingEnabled (OpenGl_LayerDepthWrite))
+  {
+    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..d36fd9a
--- /dev/null
@@ -0,0 +1,84 @@
+// 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>
+
+class Handle(OpenGl_Workspace);
+
+enum OpenGl_LayerSetting
+{
+  OpenGl_LayerDepthTest = 1,
+  OpenGl_LayerDepthWrite = 2,
+  OpenGl_LayerDepthClear = 4,
+  OpenGl_LayerDepthOffset = 8
+};
+
+struct OpenGl_LayerSettings
+{
+  //! Initializes settings
+  OpenGl_LayerSettings();
+
+  //! Returns true if theSetting is enabled.
+  const Standard_Boolean IsSettingEnabled (const OpenGl_LayerSetting theSetting) const
+  {
+    return (Flags & theSetting) == theSetting;
+  }
+
+  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.
+};
+
+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 OpenGl_LayerSettings LayerSettings() const { return myLayerSettings; };
+
+  //! Sets settings of the layer object.
+  void SetLayerSettings (OpenGl_LayerSettings theSettings)
+  {
+    myLayerSettings = theSettings;
+  }
+
+  //! Returns true if theSetting is enabled for the layer.
+  const Standard_Boolean IsSettingEnabled (const OpenGl_LayerSetting 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) const;
+
+private:
+
+  OpenGl_PriorityList myPriorityList;   //!< Associated priority list object.
+
+  OpenGl_LayerSettings myLayerSettings; //!< Layer setting flags.
+};
+#endif //_OpenGl_Layer_Header
index 736464a0104cd1f861e50135f6fbedde25167555..2395b21f6cafaab2fbe4949fb108c0f1b05b74d2 100644 (file)
@@ -36,7 +36,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());
 }
 
@@ -54,7 +54,7 @@ OpenGl_LayerList::~OpenGl_LayerList ()
 //purpose  :
 //=======================================================================
 
-OpenGl_PriorityList& OpenGl_LayerList::defaultLayer()
+OpenGl_Layer& OpenGl_LayerList::defaultLayer()
 {
   return myLayers.ChangeValue (1);
 }
@@ -90,7 +90,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());
 }
 
@@ -105,6 +105,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  :
@@ -118,8 +136,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);
@@ -146,8 +164,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++;
@@ -168,7 +186,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,
@@ -192,7 +210,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;
   
@@ -224,7 +242,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>
@@ -265,14 +283,11 @@ void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace) &theWorkspace) con
   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);
     }
   }
 }
index 70761ef195336060144b5ed95fc80deb5cdbb9cc..7a2090881e54f827ef5ba126a9ddae528eea062f 100644 (file)
@@ -18,6 +18,7 @@
 #define _OpenGl_LayerList_Header
 
 #include <OpenGl_PriorityList.hxx>
+#include <OpenGl_Layer.hxx>
 
 #include <InterfaceGraphic_telem.hxx>
 
@@ -27,7 +28,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
@@ -72,6 +73,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;
@@ -89,7 +96,7 @@ class OpenGl_LayerList
  private:
   
   //! Get default layer
-  OpenGl_PriorityList& defaultLayer ();
+  OpenGl_Layer& defaultLayer ();
   
  protected:
 
index 6a3faa680a1ec6ac3ab9d22489f32d544073527c..0b1a8aac07d7fa72a2c72ff5269cfa63df6ef510 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_telem_view.hxx>
@@ -176,6 +177,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 dd726401199f75c1d2e57696085d71c2ceff4f70..5e13a9886ffcb58bcb3b1a980bf8d5c3dbaaa818 100644 (file)
@@ -1510,3 +1510,21 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure,
   Standard_Integer anOldLayer = theStructure->GetZLayer ();
   myZLayers.ChangeLayer (theStructure, anOldLayer, theNewLayerId);
 }
+
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId,
+                                     const Graphic3d_ZLayerSettings theSettings)
+{
+  // Convert Graphic3d_ZLayerSettings to OpenGl_LayerSettings
+  OpenGl_LayerSettings aConvertedSettings;
+
+  aConvertedSettings.DepthOffsetFactor = theSettings.DepthOffsetFactor;
+  aConvertedSettings.DepthOffsetUnits  = theSettings.DepthOffsetUnits;
+  aConvertedSettings.Flags             = theSettings.Flags;
+
+  myZLayers.Layer (theLayerId).SetLayerSettings (aConvertedSettings);
+}
+
index 2661fefccc025d7355fa093af6d79239b74801b7..f1b5afe608078ded3000d7e4fb1a74621c9e1c9d 100755 (executable)
@@ -188,7 +188,7 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceGeometry (Standard_Boolean theC
 
   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 0312c240d606ab30d69e2ce72b7607a2c34fddfa..d7d9743ebe62e336345ba9473f7293d80e16ba64 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,
@@ -632,6 +633,17 @@ is
         ---Purpose:
         -- Display grid echo at requested point in the view.
 
+        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 c75ecb2d18aec21426c0c6afc4315d3160101b09..f4df8ddc410d002eadefe12e21d6550a77f29cb5 100644 (file)
@@ -353,6 +353,27 @@ void V3d_Viewer::DelView( const Handle(V3d_View)& TheView ) {
   MyDefinedViews.Remove(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 389e6b8f58bf2f515c33192a146d1cad1874372a..d18a711848a5430634f284db61db7f0e411b4903 100644 (file)
@@ -3280,12 +3280,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;
   }
 
@@ -3337,9 +3346,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;
   }
 
@@ -6079,7 +6202,20 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
     "vprintview : width height filename [algo=0] : 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 d8666a981d710fae59efdc0a8d1d6b3f3807fcf1..de7bfeebb85c8332dcd736f3da338a0ad34b353d 100755 (executable)
@@ -6,3 +6,4 @@ EXTERNLIB
 Visual3d_WOKSteps.edl 
 Visual3d_View_Print.cxx
 Visual3d_NListOfLayerItem.hxx
+Visual3d_MapOfZLayerSettings.hxx
index f8788869c5a7eee4ed869a5ca96c656460542381..2e74a40650679c7a4b93d02c93748f300aa709e6 100644 (file)
@@ -297,6 +297,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 bbfd49eb9fd97386221bc3ed6a2ea6e9fe40bf13..9402b7eb481c4ac40d89caa75e5581a8c257c4a0 100644 (file)
@@ -85,6 +85,8 @@ uses
     SequenceOfStructure     from Graphic3d,
     MapOfStructure          from Graphic3d,
 
+    ZLayerSettings          from Graphic3d,
+
     ContextView             from Visual3d,
     Layer                   from Visual3d,
     Light                   from Visual3d,
@@ -799,6 +801,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 ab03d7820a67562246148c4290abde98ffed4fd1..021091f02b758a84d9234fd93ccda568b598f909 100644 (file)
@@ -3670,6 +3670,17 @@ Standard_Boolean Visual3d_View::Export (const Standard_CString       theFileName
                                   thePrecision, theProgressBarFunc, theProgressObject);
 }
 
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+
+void Visual3d_View::SetZLayerSettings (const Standard_Integer theLayerId,
+                                       const Graphic3d_ZLayerSettings theSettings)
+{
+  MyGraphicDriver->SetZLayerSettings (MyCView, theLayerId, theSettings);
+}
+
 //=======================================================================
 //function : AddZLayer
 //purpose  :
index 61aa20c3aef56eea735aff745238186c18dc93e6..7a1f97a1becf090185ed91c41199b90de55dede0 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,
@@ -290,6 +293,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;
@@ -515,6 +529,8 @@ fields
         myLayerIds                      :       MapOfInteger from TColStd;
         myLayerSeq                      :       SequenceOfInteger from TColStd;
 
+        myMapOfZLayerSettings : MapOfZLayerSettings from Visual3d;
+
 friends
 
        class View from Visual3d,
index c12775a5da01052e2538061304b28ba3c81e2e5f..3d13bc9e0b51da903eb354e036e70c15949ccd55 100644 (file)
@@ -103,6 +103,7 @@ MyTransparency (Standard_False)
   myLayerSeq.Append (0);
 
   MyGraphicDriver = theDriver;
+  myMapOfZLayerSettings.Bind (0, Graphic3d_ZLayerSettings());
 }
 
 //-Destructors
@@ -1201,6 +1202,41 @@ Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structu
   return MyGraphicDriver->GetZLayer (aStructure);
 }
 
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+void Visual3d_ViewManager::SetZLayerSettings (const Standard_Integer theLayerId,
+                                              const Graphic3d_ZLayerSettings theSettings)
+{
+  // tell all managed views to set zlayer settings display layers
+  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  :
@@ -1221,6 +1257,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 ())
@@ -1240,7 +1279,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);
 
@@ -1248,11 +1287,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);