From 3db496cbf686d56c7a64d6f35fe568e2d4fee111 Mon Sep 17 00:00:00 2001 From: duv Date: Tue, 1 Apr 2014 18:51:41 +0400 Subject: [PATCH] 0024785: Visualization - Modifying z-layers concept to gain more control over OpenGl depth buffer. --- src/Graphic3d/FILES | 1 + src/Graphic3d/Graphic3d.cdl | 2 + src/Graphic3d/Graphic3d_GraphicDriver.cdl | 9 ++ src/Graphic3d/Graphic3d_StructureManager.cdl | 13 ++ src/Graphic3d/Graphic3d_ZLayerSettings.hxx | 79 ++++++++++ src/OpenGl/FILES | 2 + src/OpenGl/OpenGl_GraphicDriver.hxx | 5 + src/OpenGl/OpenGl_GraphicDriver_7.cxx | 14 +- src/OpenGl/OpenGl_Layer.cxx | 88 +++++++++++ src/OpenGl/OpenGl_Layer.hxx | 84 ++++++++++ src/OpenGl/OpenGl_LayerList.cxx | 49 ++++-- src/OpenGl/OpenGl_LayerList.hxx | 11 +- src/OpenGl/OpenGl_View.hxx | 5 + src/OpenGl/OpenGl_View_2.cxx | 18 +++ src/OpenGl/OpenGl_Workspace_Raytrace.cxx | 2 +- src/V3d/V3d_Viewer.cdl | 12 ++ src/V3d/V3d_Viewer.cxx | 21 +++ src/ViewerTest/ViewerTest_ViewerCommands.cxx | 146 +++++++++++++++++- src/Visual3d/FILES | 1 + src/Visual3d/Visual3d.cdl | 2 + src/Visual3d/Visual3d_MapOfZLayerSettings.hxx | 23 +++ src/Visual3d/Visual3d_View.cdl | 9 ++ src/Visual3d/Visual3d_View.cxx | 11 ++ src/Visual3d/Visual3d_ViewManager.cdl | 16 ++ src/Visual3d/Visual3d_ViewManager.cxx | 47 +++++- 25 files changed, 642 insertions(+), 28 deletions(-) create mode 100644 src/Graphic3d/Graphic3d_ZLayerSettings.hxx create mode 100644 src/OpenGl/OpenGl_Layer.cxx create mode 100644 src/OpenGl/OpenGl_Layer.hxx create mode 100644 src/Visual3d/Visual3d_MapOfZLayerSettings.hxx diff --git a/src/Graphic3d/FILES b/src/Graphic3d/FILES index 5698da7e12..cbb660aba2 100755 --- a/src/Graphic3d/FILES +++ b/src/Graphic3d/FILES @@ -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 diff --git a/src/Graphic3d/Graphic3d.cdl b/src/Graphic3d/Graphic3d.cdl index 4f5c5405bf..f3a49f6aaf 100644 --- a/src/Graphic3d/Graphic3d.cdl +++ b/src/Graphic3d/Graphic3d.cdl @@ -419,6 +419,8 @@ is primitive Mat4; primitive Mat4d; + primitive ZLayerSettings; + -------------------- -- Category: Classes -------------------- diff --git a/src/Graphic3d/Graphic3d_GraphicDriver.cdl b/src/Graphic3d/Graphic3d_GraphicDriver.cdl index c7e9c846c9..cf1e6f3739 100644 --- a/src/Graphic3d/Graphic3d_GraphicDriver.cdl +++ b/src/Graphic3d/Graphic3d_GraphicDriver.cdl @@ -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 ----------------------------- diff --git a/src/Graphic3d/Graphic3d_StructureManager.cdl b/src/Graphic3d/Graphic3d_StructureManager.cdl index 4f2db7bfd2..710b35c787 100644 --- a/src/Graphic3d/Graphic3d_StructureManager.cdl +++ b/src/Graphic3d/Graphic3d_StructureManager.cdl @@ -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 index 0000000000..e6a592a02b --- /dev/null +++ b/src/Graphic3d/Graphic3d_ZLayerSettings.hxx @@ -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 + +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 diff --git a/src/OpenGl/FILES b/src/OpenGl/FILES index 4a801950b3..41edb199c5 100755 --- a/src/OpenGl/FILES +++ b/src/OpenGl/FILES @@ -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 diff --git a/src/OpenGl/OpenGl_GraphicDriver.hxx b/src/OpenGl/OpenGl_GraphicDriver.hxx index ca4aede410..fedc272a54 100644 --- a/src/OpenGl/OpenGl_GraphicDriver.hxx +++ b/src/OpenGl/OpenGl_GraphicDriver.hxx @@ -305,6 +305,11 @@ public: //! 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 diff --git a/src/OpenGl/OpenGl_GraphicDriver_7.cxx b/src/OpenGl/OpenGl_GraphicDriver_7.cxx index 1cfee4ab7a..31f8198285 100644 --- a/src/OpenGl/OpenGl_GraphicDriver_7.cxx +++ b/src/OpenGl/OpenGl_GraphicDriver_7.cxx @@ -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 index 0000000000..bbaa546612 --- /dev/null +++ b/src/OpenGl/OpenGl_Layer.cxx @@ -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 + +#include + +//======================================================================= +//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 index 0000000000..d36fd9af2a --- /dev/null +++ b/src/OpenGl/OpenGl_Layer.hxx @@ -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 + +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 diff --git a/src/OpenGl/OpenGl_LayerList.cxx b/src/OpenGl/OpenGl_LayerList.cxx index b80d9d6b1b..e5cc9c0b45 100644 --- a/src/OpenGl/OpenGl_LayerList.cxx +++ b/src/OpenGl/OpenGl_LayerList.cxx @@ -35,7 +35,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()); } @@ -53,7 +53,7 @@ OpenGl_LayerList::~OpenGl_LayerList () //purpose : //======================================================================= -OpenGl_PriorityList& OpenGl_LayerList::defaultLayer() +OpenGl_Layer& OpenGl_LayerList::defaultLayer() { return myLayers.ChangeValue (1); } @@ -89,7 +89,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()); } @@ -104,6 +104,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 : @@ -117,8 +135,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); @@ -145,8 +163,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++; @@ -167,7 +185,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, @@ -191,7 +209,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; @@ -223,7 +241,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 @@ -264,14 +282,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); } } } diff --git a/src/OpenGl/OpenGl_LayerList.hxx b/src/OpenGl/OpenGl_LayerList.hxx index 32424495d2..98b05a50cd 100644 --- a/src/OpenGl/OpenGl_LayerList.hxx +++ b/src/OpenGl/OpenGl_LayerList.hxx @@ -17,6 +17,7 @@ #define _OpenGl_LayerList_Header #include +#include #include @@ -26,7 +27,7 @@ class OpenGl_Structure; class Handle(OpenGl_Workspace); -typedef NCollection_Sequence OpenGl_SequenceOfLayers; +typedef NCollection_Sequence OpenGl_SequenceOfLayers; typedef NCollection_DataMap 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; @@ -88,7 +95,7 @@ class OpenGl_LayerList private: //! Get default layer - OpenGl_PriorityList& defaultLayer (); + OpenGl_Layer& defaultLayer (); protected: diff --git a/src/OpenGl/OpenGl_View.hxx b/src/OpenGl/OpenGl_View.hxx index d3ee169ce0..8f3f989c14 100644 --- a/src/OpenGl/OpenGl_View.hxx +++ b/src/OpenGl/OpenGl_View.hxx @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -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); diff --git a/src/OpenGl/OpenGl_View_2.cxx b/src/OpenGl/OpenGl_View_2.cxx index 2bcfd37a8e..b9a0405c00 100644 --- a/src/OpenGl/OpenGl_View_2.cxx +++ b/src/OpenGl/OpenGl_View_2.cxx @@ -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); +} + diff --git a/src/OpenGl/OpenGl_Workspace_Raytrace.cxx b/src/OpenGl/OpenGl_Workspace_Raytrace.cxx index 2661fefccc..f1b5afe608 100755 --- a/src/OpenGl/OpenGl_Workspace_Raytrace.cxx +++ b/src/OpenGl/OpenGl_Workspace_Raytrace.cxx @@ -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; diff --git a/src/V3d/V3d_Viewer.cdl b/src/V3d/V3d_Viewer.cdl index 9d28516770..a0a25b762b 100644 --- a/src/V3d/V3d_Viewer.cdl +++ b/src/V3d/V3d_Viewer.cdl @@ -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; diff --git a/src/V3d/V3d_Viewer.cxx b/src/V3d/V3d_Viewer.cxx index 48a59bbcc9..5cb58472c1 100644 --- a/src/V3d/V3d_Viewer.cxx +++ b/src/V3d/V3d_Viewer.cxx @@ -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 : diff --git a/src/ViewerTest/ViewerTest_ViewerCommands.cxx b/src/ViewerTest/ViewerTest_ViewerCommands.cxx index 1e7f65cb49..83df6a86b9 100644 --- a/src/ViewerTest/ViewerTest_ViewerCommands.cxx +++ b/src/ViewerTest/ViewerTest_ViewerCommands.cxx @@ -3319,12 +3319,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; } @@ -3376,9 +3385,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 (Draw::Atof (argv[3])); + Standard_ShortReal aUnits = static_cast (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; } @@ -6118,7 +6241,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]" diff --git a/src/Visual3d/FILES b/src/Visual3d/FILES index d8666a981d..de7bfeebb8 100755 --- a/src/Visual3d/FILES +++ b/src/Visual3d/FILES @@ -6,3 +6,4 @@ EXTERNLIB Visual3d_WOKSteps.edl Visual3d_View_Print.cxx Visual3d_NListOfLayerItem.hxx +Visual3d_MapOfZLayerSettings.hxx diff --git a/src/Visual3d/Visual3d.cdl b/src/Visual3d/Visual3d.cdl index 680ab567c7..6509d00807 100644 --- a/src/Visual3d/Visual3d.cdl +++ b/src/Visual3d/Visual3d.cdl @@ -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 index 0000000000..e9e7947ee4 --- /dev/null +++ b/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx @@ -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 +#include +#include + +typedef NCollection_DataMap Visual3d_MapOfZLayerSettings; + +#endif // _Visual3d_MapOfZLayerSettings_HeaderFile diff --git a/src/Visual3d/Visual3d_View.cdl b/src/Visual3d/Visual3d_View.cdl index 25b70ea369..e2cc7c4a04 100644 --- a/src/Visual3d/Visual3d_View.cdl +++ b/src/Visual3d/Visual3d_View.cdl @@ -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 . ---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; diff --git a/src/Visual3d/Visual3d_View.cxx b/src/Visual3d/Visual3d_View.cxx index 9494dab258..e7f1457bbd 100644 --- a/src/Visual3d/Visual3d_View.cxx +++ b/src/Visual3d/Visual3d_View.cxx @@ -3668,6 +3668,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 : diff --git a/src/Visual3d/Visual3d_ViewManager.cdl b/src/Visual3d/Visual3d_ViewManager.cdl index 2e54486345..b6f08a8111 100644 --- a/src/Visual3d/Visual3d_ViewManager.cdl +++ b/src/Visual3d/Visual3d_ViewManager.cdl @@ -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, diff --git a/src/Visual3d/Visual3d_ViewManager.cxx b/src/Visual3d/Visual3d_ViewManager.cxx index df76c22a5b..21622ddd74 100644 --- a/src/Visual3d/Visual3d_ViewManager.cxx +++ b/src/Visual3d/Visual3d_ViewManager.cxx @@ -103,6 +103,7 @@ MyTransparency (Standard_False) myLayerSeq.Append (0); MyGraphicDriver = theDriver; + myMapOfZLayerSettings.Bind (0, Graphic3d_ZLayerSettings()); } //-Destructors @@ -1191,6 +1192,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 : @@ -1211,6 +1247,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 ()) @@ -1230,7 +1269,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); @@ -1238,11 +1277,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);