diff --git a/src/Graphic3d/FILES b/src/Graphic3d/FILES index 2a952a03f9..30797b356a 100755 --- a/src/Graphic3d/FILES +++ b/src/Graphic3d/FILES @@ -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 diff --git a/src/Graphic3d/Graphic3d.cdl b/src/Graphic3d/Graphic3d.cdl index 3401511b3f..dd2567c964 100644 --- a/src/Graphic3d/Graphic3d.cdl +++ b/src/Graphic3d/Graphic3d.cdl @@ -421,6 +421,8 @@ is imported Mat4; imported Mat4d; + imported ZLayerSettings; + -------------------- -- Category: Classes -------------------- diff --git a/src/Graphic3d/Graphic3d_GraphicDriver.cdl b/src/Graphic3d/Graphic3d_GraphicDriver.cdl index d72d961669..acdcb19ac2 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, @@ -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 ----------------------------- diff --git a/src/Graphic3d/Graphic3d_StructureManager.cdl b/src/Graphic3d/Graphic3d_StructureManager.cdl index b2a092b205..557fe41453 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 5619791097..9b31318456 100755 --- a/src/OpenGl/FILES +++ b/src/OpenGl/FILES @@ -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 diff --git a/src/OpenGl/OpenGl_GraphicDriver.hxx b/src/OpenGl/OpenGl_GraphicDriver.hxx index 8492e551e4..0c561e0eb6 100644 --- a/src/OpenGl/OpenGl_GraphicDriver.hxx +++ b/src/OpenGl/OpenGl_GraphicDriver.hxx @@ -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 diff --git a/src/OpenGl/OpenGl_GraphicDriver_7.cxx b/src/OpenGl/OpenGl_GraphicDriver_7.cxx index dc5b191b1f..654f9ee41a 100644 --- a/src/OpenGl/OpenGl_GraphicDriver_7.cxx +++ b/src/OpenGl/OpenGl_GraphicDriver_7.cxx @@ -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 index 0000000000..dadd6993ce --- /dev/null +++ b/src/OpenGl/OpenGl_Layer.cxx @@ -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 + +#include + +//======================================================================= +//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 index 0000000000..abe88cb61e --- /dev/null +++ b/src/OpenGl/OpenGl_Layer.hxx @@ -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 +#include + +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 diff --git a/src/OpenGl/OpenGl_LayerList.cxx b/src/OpenGl/OpenGl_LayerList.cxx index f494bf19e9..c1efed5379 100644 --- a/src/OpenGl/OpenGl_LayerList.cxx +++ b/src/OpenGl/OpenGl_LayerList.cxx @@ -31,7 +31,7 @@ OpenGl_LayerList::OpenGl_LayerList (const Standard_Integer theNbPriorities) myNbStructures (0) { // insert default priority layer - myLayers.Append (OpenGl_PriorityList (myNbPriorities)); + myLayers.Append (OpenGl_Layer (myNbPriorities)); myLayerIds.Bind (0, myLayers.Length()); } @@ -49,7 +49,7 @@ OpenGl_LayerList::~OpenGl_LayerList () //purpose : //======================================================================= -OpenGl_PriorityList& OpenGl_LayerList::defaultLayer() +OpenGl_Layer& OpenGl_LayerList::defaultLayer() { return myLayers.ChangeValue (1); } @@ -85,7 +85,7 @@ void OpenGl_LayerList::AddLayer (const Standard_Integer theLayerId) return; // add the new layer - myLayers.Append (OpenGl_PriorityList (myNbPriorities)); + myLayers.Append (OpenGl_Layer (myNbPriorities)); myLayerIds.Bind (theLayerId, myLayers.Length()); } @@ -100,6 +100,24 @@ Standard_Boolean OpenGl_LayerList::HasLayer return myLayerIds.IsBound (theLayerId); } +//======================================================================= +//function : Layer +//purpose : +//======================================================================= +OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId) +{ + return myLayers.ChangeValue (myLayerIds.Find (theLayerId)); +} + +//======================================================================= +//function : Layer +//purpose : +//======================================================================= +const OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId) const +{ + return myLayers.Value (myLayerIds.Find (theLayerId)); +} + //======================================================================= //function : RemoveLayer //purpose : @@ -113,8 +131,8 @@ void OpenGl_LayerList::RemoveLayer (const Standard_Integer theLayerId) Standard_Integer aRemovePos = myLayerIds.Find (theLayerId); // move all displayed structures to first layer - const OpenGl_PriorityList& aList = myLayers.Value (aRemovePos); - defaultLayer ().Append (aList); + const OpenGl_PriorityList& aList = myLayers.Value (aRemovePos).PriorityList(); + defaultLayer ().PriorityList().Append (aList); // remove layer myLayers.Remove (aRemovePos); @@ -141,8 +159,8 @@ void OpenGl_LayerList::AddStructure (const OpenGl_Structure *theStructure, { // add structure to associated layer, // if layer doesn't exists, display structure in default layer - OpenGl_PriorityList& aList = !HasLayer (theLayerId) ? defaultLayer () : - myLayers.ChangeValue (myLayerIds.Find (theLayerId)); + OpenGl_PriorityList& aList = !HasLayer (theLayerId) ? defaultLayer ().PriorityList() : + myLayers.ChangeValue (myLayerIds.Find (theLayerId)).PriorityList(); aList.Add (theStructure, thePriority); myNbStructures++; @@ -163,7 +181,7 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure, Standard_Integer aSeqPos = !HasLayer (theLayerId) ? 1 : myLayerIds.Find (theLayerId); - OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos); + OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList(); // remove structure from associated list // if the structure is not found there, @@ -185,7 +203,7 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure, OpenGl_SequenceOfLayers::Iterator anIts; for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++) { - OpenGl_PriorityList& aScanList = anIts.ChangeValue (); + OpenGl_PriorityList& aScanList = anIts.ChangeValue ().PriorityList(); if (aSeqPos == aSeqId) continue; @@ -215,7 +233,7 @@ void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure, Standard_Integer aSeqPos = !HasLayer (theOldLayerId) ? 1 : myLayerIds.Find (theOldLayerId); - OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos); + OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList(); Standard_Integer aPriority; // take priority and remove structure from list found by @@ -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); } } } diff --git a/src/OpenGl/OpenGl_LayerList.hxx b/src/OpenGl/OpenGl_LayerList.hxx index 848337d305..210ebe25c9 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; @@ -84,7 +91,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 ef3dd2c7eb..6eeaee4bcb 100644 --- a/src/OpenGl/OpenGl_View.hxx +++ b/src/OpenGl/OpenGl_View.hxx @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -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); diff --git a/src/OpenGl/OpenGl_View_2.cxx b/src/OpenGl/OpenGl_View_2.cxx index 5110e24b4d..a7f29627c2 100644 --- a/src/OpenGl/OpenGl_View_2.cxx +++ b/src/OpenGl/OpenGl_View_2.cxx @@ -1028,6 +1028,17 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure, myZLayers.ChangeLayer (theStructure, anOldLayer, theNewLayerId); } +//======================================================================= +//function : SetZLayerSettings +//purpose : +//======================================================================= +void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId, + const Graphic3d_ZLayerSettings theSettings) +{ + myZLayers.Layer (theLayerId).SetLayerSettings (theSettings); +} + + //======================================================================= //function : RedrawScene //purpose : diff --git a/src/OpenGl/OpenGl_Workspace_Raytrace.cxx b/src/OpenGl/OpenGl_Workspace_Raytrace.cxx index 602576fc96..b280ff8c83 100755 --- a/src/OpenGl/OpenGl_Workspace_Raytrace.cxx +++ b/src/OpenGl/OpenGl_Workspace_Raytrace.cxx @@ -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; diff --git a/src/V3d/V3d_Viewer.cdl b/src/V3d/V3d_Viewer.cdl index 86f759bfb8..13809c1b50 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, @@ -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; diff --git a/src/V3d/V3d_Viewer.cxx b/src/V3d/V3d_Viewer.cxx index 6b43f0892e..2078206ea3 100644 --- a/src/V3d/V3d_Viewer.cxx +++ b/src/V3d/V3d_Viewer.cxx @@ -332,6 +332,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 b002336435..aecf92600c 100644 --- a/src/ViewerTest/ViewerTest_ViewerCommands.cxx +++ b/src/ViewerTest/ViewerTest_ViewerCommands.cxx @@ -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 (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; } @@ -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]" 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 fff61bfbb0..f1007d8a25 100644 --- a/src/Visual3d/Visual3d.cdl +++ b/src/Visual3d/Visual3d.cdl @@ -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 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 63f9192cee..b4e202bd05 100644 --- a/src/Visual3d/Visual3d_View.cdl +++ b/src/Visual3d/Visual3d_View.cdl @@ -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 . ---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 658997b3ce..a21e8bc21a 100644 --- a/src/Visual3d/Visual3d_View.cxx +++ b/src/Visual3d/Visual3d_View.cxx @@ -2929,6 +2929,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 3f8829253c..5a60dfd5c3 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, @@ -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, diff --git a/src/Visual3d/Visual3d_ViewManager.cxx b/src/Visual3d/Visual3d_ViewManager.cxx index 0c797036e2..19666b9468 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 @@ -775,6 +776,45 @@ Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structu return MyGraphicDriver->GetZLayer (*theStructure->CStructure ()); } +//======================================================================= +//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 index 0000000000..4ef46dda3b --- /dev/null +++ b/tests/bugs/vis/bug24785 @@ -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