From aa125c5ae6bdb3756c8eb50729c845ee86a84059 Mon Sep 17 00:00:00 2001 From: duv Date: Thu, 24 Apr 2014 10:18:28 +0400 Subject: [PATCH] 0024867: Visualization - polygon offsets look broken If specific layer setting is not enabled, default value extracted from current OpenGl state will be used. --- src/OpenGl/OpenGl_AspectFace.cxx | 1 - src/OpenGl/OpenGl_AspectFace.hxx | 3 ++ src/OpenGl/OpenGl_Layer.cxx | 50 ++++++++++++------------- src/OpenGl/OpenGl_Layer.hxx | 37 +++++-------------- src/OpenGl/OpenGl_LayerList.cxx | 13 ++++++- src/OpenGl/OpenGl_View_2.cxx | 9 +---- src/OpenGl/OpenGl_Workspace.cxx | 6 +-- src/OpenGl/OpenGl_Workspace.hxx | 14 +++++-- src/OpenGl/OpenGl_Workspace_5.cxx | 61 ++++++++++++++++++++++--------- tests/bugs/vis/bug24867 | 20 ++++++++++ 10 files changed, 126 insertions(+), 88 deletions(-) create mode 100644 tests/bugs/vis/bug24867 diff --git a/src/OpenGl/OpenGl_AspectFace.cxx b/src/OpenGl/OpenGl_AspectFace.cxx index 6912030a0c..337e117954 100644 --- a/src/OpenGl/OpenGl_AspectFace.cxx +++ b/src/OpenGl/OpenGl_AspectFace.cxx @@ -44,7 +44,6 @@ namespace {{ 1.0F, 1.0F, 1.0F, 1.0F }} // material color }; - static TEL_POFFSET_PARAM THE_DEFAULT_POFFSET = { Aspect_POM_Fill, 1.0F, 0.0F }; static const TCollection_AsciiString THE_EMPTY_KEY; }; diff --git a/src/OpenGl/OpenGl_AspectFace.hxx b/src/OpenGl/OpenGl_AspectFace.hxx index 0d5e14f0a1..ba0d4f1ab6 100644 --- a/src/OpenGl/OpenGl_AspectFace.hxx +++ b/src/OpenGl/OpenGl_AspectFace.hxx @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -35,6 +36,8 @@ #define OPENGL_SPECULAR_MASK (1<<2) #define OPENGL_EMISSIVE_MASK (1<<3) +static const TEL_POFFSET_PARAM THE_DEFAULT_POFFSET = { Aspect_POM_Fill, 1.0F, 0.0F }; + class CALL_DEF_CONTEXTFILLAREA; struct OPENGL_SURF_PROP diff --git a/src/OpenGl/OpenGl_Layer.cxx b/src/OpenGl/OpenGl_Layer.cxx index bbaa546612..ca3c425397 100644 --- a/src/OpenGl/OpenGl_Layer.cxx +++ b/src/OpenGl/OpenGl_Layer.cxx @@ -14,23 +14,9 @@ // commercial license or contractual agreement. #include - +#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 : @@ -45,36 +31,43 @@ OpenGl_Layer::OpenGl_Layer (const Standard_Integer theNbPriorities) //function : Render //purpose : //======================================================================= -void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &AWorkspace) const +void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &theWorkspace, const OpenGl_GlobalLayerSettings& theDefaultSettings) const { + TEL_POFFSET_PARAM anAppliedOffsetParams = theWorkspace->AppliedPolygonOffset(); + // separate depth buffers - if (IsSettingEnabled (OpenGl_LayerDepthClear)) + if (IsSettingEnabled (Graphic3d_ZLayerDepthClear)) { glClear (GL_DEPTH_BUFFER_BIT); } - + // handle depth test - if (IsSettingEnabled (OpenGl_LayerDepthTest)) + if (IsSettingEnabled (Graphic3d_ZLayerDepthTest)) { - glDepthFunc (GL_LESS); + // assuming depth test is enabled by default + glDepthFunc (theDefaultSettings.DepthFunc); } else { glDepthFunc (GL_ALWAYS); } - + // handle depth offset - if (IsSettingEnabled (OpenGl_LayerDepthOffset)) + if (IsSettingEnabled (Graphic3d_ZLayerDepthOffset)) { - glPolygonOffset (myLayerSettings.DepthOffsetFactor, myLayerSettings.DepthOffsetUnits); + theWorkspace->SetPolygonOffset (Aspect_POM_Fill, + myLayerSettings.DepthOffsetFactor, + myLayerSettings.DepthOffsetUnits); } else { - glPolygonOffset (0.f, 0.f); + theWorkspace->SetPolygonOffset (anAppliedOffsetParams.mode, + anAppliedOffsetParams.factor, + anAppliedOffsetParams.units); } // handle depth write - if (IsSettingEnabled (OpenGl_LayerDepthWrite)) + if (IsSettingEnabled (Graphic3d_ZLayerDepthWrite)) { glDepthMask (GL_TRUE); } @@ -84,5 +77,10 @@ void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &AWorkspace) const } // render priority list - myPriorityList.Render (AWorkspace); + myPriorityList.Render (theWorkspace); + + // always restore polygon offset between layers rendering + theWorkspace->SetPolygonOffset (anAppliedOffsetParams.mode, + anAppliedOffsetParams.factor, + anAppliedOffsetParams.units); } diff --git a/src/OpenGl/OpenGl_Layer.hxx b/src/OpenGl/OpenGl_Layer.hxx index d36fd9af2a..97410cc239 100644 --- a/src/OpenGl/OpenGl_Layer.hxx +++ b/src/OpenGl/OpenGl_Layer.hxx @@ -17,32 +17,15 @@ #define _OpenGl_Layer_Header #include +#include +#include class Handle(OpenGl_Workspace); -enum OpenGl_LayerSetting +struct OpenGl_GlobalLayerSettings { - 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. + GLint DepthFunc; + GLboolean DepthMask; }; class OpenGl_Layer @@ -53,16 +36,16 @@ public: OpenGl_Layer (const Standard_Integer theNbPriorities = 11); //! Returns settings of the layer object. - const OpenGl_LayerSettings LayerSettings() const { return myLayerSettings; }; + const Graphic3d_ZLayerSettings LayerSettings() const { return myLayerSettings; }; //! Sets settings of the layer object. - void SetLayerSettings (OpenGl_LayerSettings theSettings) + void SetLayerSettings (Graphic3d_ZLayerSettings theSettings) { myLayerSettings = theSettings; } //! Returns true if theSetting is enabled for the layer. - const Standard_Boolean IsSettingEnabled (const OpenGl_LayerSetting theSetting) const + const Standard_Boolean IsSettingEnabled (const Graphic3d_ZLayerSetting theSetting) const { return myLayerSettings.IsSettingEnabled (theSetting); } @@ -73,12 +56,12 @@ public: //! Returns const reference to associated priority list. const OpenGl_PriorityList& PriorityList() const { return myPriorityList; } - void Render (const Handle(OpenGl_Workspace) &AWorkspace) const; + void Render (const Handle(OpenGl_Workspace) &AWorkspace, const OpenGl_GlobalLayerSettings& theDefaultSettings) const; private: OpenGl_PriorityList myPriorityList; //!< Associated priority list object. - OpenGl_LayerSettings myLayerSettings; //!< Layer setting flags. + 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 e5cc9c0b45..65b2c44c91 100644 --- a/src/OpenGl/OpenGl_LayerList.cxx +++ b/src/OpenGl/OpenGl_LayerList.cxx @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -279,14 +280,22 @@ void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure, void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace) &theWorkspace) const { + OpenGl_GlobalLayerSettings aDefaultSettings; + + glGetIntegerv (GL_DEPTH_FUNC, &aDefaultSettings.DepthFunc); + glGetBooleanv (GL_DEPTH_WRITEMASK, &aDefaultSettings.DepthMask); + OpenGl_SequenceOfLayers::Iterator anIts; - for(anIts.Init (myLayers); anIts.More (); anIts.Next ()) + for (anIts.Init (myLayers); anIts.More(); anIts.Next()) { const OpenGl_Layer& aLayer = anIts.Value (); if (aLayer.PriorityList().NbStructures () > 0) { // render layer - aLayer.Render (theWorkspace); + aLayer.Render (theWorkspace, aDefaultSettings); } } + + glDepthMask (aDefaultSettings.DepthMask); + glDepthFunc (aDefaultSettings.DepthFunc); } diff --git a/src/OpenGl/OpenGl_View_2.cxx b/src/OpenGl/OpenGl_View_2.cxx index b9a0405c00..89c3d2f910 100644 --- a/src/OpenGl/OpenGl_View_2.cxx +++ b/src/OpenGl/OpenGl_View_2.cxx @@ -1518,13 +1518,6 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure, 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); + myZLayers.Layer (theLayerId).SetLayerSettings (theSettings); } diff --git a/src/OpenGl/OpenGl_Workspace.cxx b/src/OpenGl/OpenGl_Workspace.cxx index 48b5c615e3..422bf8d3e9 100644 --- a/src/OpenGl/OpenGl_Workspace.cxx +++ b/src/OpenGl/OpenGl_Workspace.cxx @@ -166,8 +166,8 @@ OpenGl_Workspace::OpenGl_Workspace (const Handle(OpenGl_Display)& theDisplay, TextParam_applied (NULL), ViewMatrix_applied (&myDefaultMatrix), StructureMatrix_applied (&myDefaultMatrix), - myModelViewMatrix (myDefaultMatrix), - PolygonOffset_applied (NULL) + PolygonOffset_applied (THE_DEFAULT_POFFSET), + myModelViewMatrix (myDefaultMatrix) { theDisplay->InitAttributes(); @@ -268,7 +268,7 @@ void OpenGl_Workspace::ResetAppliedAspect() AspectText_applied = NULL; TextParam_set = &myDefaultTextParam; TextParam_applied = NULL; - PolygonOffset_applied = NULL; + PolygonOffset_applied = THE_DEFAULT_POFFSET; AspectLine(Standard_True); AspectFace(Standard_True); diff --git a/src/OpenGl/OpenGl_Workspace.hxx b/src/OpenGl/OpenGl_Workspace.hxx index 965f142942..b8c2f8131c 100755 --- a/src/OpenGl/OpenGl_Workspace.hxx +++ b/src/OpenGl/OpenGl_Workspace.hxx @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -227,6 +228,12 @@ public: //! @return applied model structure matrix. inline const OpenGl_Matrix* ModelMatrix() const { return StructureMatrix_applied; } + //! Sets and applies current polygon offset. + void SetPolygonOffset (int theMode, Standard_ShortReal theFactor, Standard_ShortReal theUnits); + + //! Returns currently applied polygon offset params. + const TEL_POFFSET_PARAM& AppliedPolygonOffset() { return PolygonOffset_applied; } + protected: void CopyBuffers (const Standard_Boolean theFrontToBack); @@ -443,12 +450,11 @@ protected: //! @name fields related to status OpenGl_Material myMatBack; //!< current back material state OpenGl_Material myMatTmp; //!< temporary variable - //! Model matrix with applied structure transformations - OpenGl_Matrix myModelViewMatrix; + OpenGl_Matrix myModelViewMatrix; //!< Model matrix with applied structure transformations - const TEL_POFFSET_PARAM* PolygonOffset_applied; + TEL_POFFSET_PARAM PolygonOffset_applied; //!< Currently applied polygon offset. - OpenGl_AspectFace myAspectFaceHl; // Hiddenline aspect + OpenGl_AspectFace myAspectFaceHl; //!< Hiddenline aspect public: //! @name type definition diff --git a/src/OpenGl/OpenGl_Workspace_5.cxx b/src/OpenGl/OpenGl_Workspace_5.cxx index d88f2d0b32..d2f493a366 100644 --- a/src/OpenGl/OpenGl_Workspace_5.cxx +++ b/src/OpenGl/OpenGl_Workspace_5.cxx @@ -44,24 +44,36 @@ /*----------------------------------------------------------------------*/ -static void TelUpdatePolygonOffsets( const TEL_POFFSET_PARAM *pdata ) +static void TelUpdatePolygonOffsets (const TEL_POFFSET_PARAM& theOffsetData) { - if ( ( pdata->mode & Aspect_POM_Fill ) == Aspect_POM_Fill ) - glEnable ( GL_POLYGON_OFFSET_FILL ); + if ((theOffsetData.mode & Aspect_POM_Fill) == Aspect_POM_Fill) + { + glEnable (GL_POLYGON_OFFSET_FILL); + } else - glDisable ( GL_POLYGON_OFFSET_FILL ); + { + glDisable (GL_POLYGON_OFFSET_FILL); + } - if ( ( pdata->mode & Aspect_POM_Line ) == Aspect_POM_Line ) - glEnable ( GL_POLYGON_OFFSET_LINE ); + if ((theOffsetData.mode & Aspect_POM_Line) == Aspect_POM_Line) + { + glEnable (GL_POLYGON_OFFSET_LINE); + } else - glDisable( GL_POLYGON_OFFSET_LINE ); + { + glDisable (GL_POLYGON_OFFSET_LINE); + } - if ( ( pdata->mode & Aspect_POM_Point ) == Aspect_POM_Point ) - glEnable ( GL_POLYGON_OFFSET_POINT ); + if ((theOffsetData.mode & Aspect_POM_Point) == Aspect_POM_Point) + { + glEnable (GL_POLYGON_OFFSET_POINT); + } else - glDisable( GL_POLYGON_OFFSET_POINT ); + { + glDisable (GL_POLYGON_OFFSET_POINT); + } - glPolygonOffset( pdata->factor, pdata->units ); + glPolygonOffset (theOffsetData.factor, theOffsetData.units); } /*----------------------------------------------------------------------*/ @@ -396,13 +408,13 @@ const OpenGl_AspectFace* OpenGl_Workspace::AspectFace (const Standard_Boolean th // Aspect_POM_None means: do not change current settings if ((AspectFace_set->PolygonOffset().mode & Aspect_POM_None) != Aspect_POM_None) { - if (PolygonOffset_applied == NULL - || PolygonOffset_applied->mode != AspectFace_set->PolygonOffset().mode - || PolygonOffset_applied->factor != AspectFace_set->PolygonOffset().factor - || PolygonOffset_applied->units != AspectFace_set->PolygonOffset().units) + if (PolygonOffset_applied.mode != AspectFace_set->PolygonOffset().mode + || PolygonOffset_applied.factor != AspectFace_set->PolygonOffset().factor + || PolygonOffset_applied.units != AspectFace_set->PolygonOffset().units) { - PolygonOffset_applied = &AspectFace_set->PolygonOffset(); - TelUpdatePolygonOffsets (PolygonOffset_applied); + SetPolygonOffset (AspectFace_set->PolygonOffset().mode, + AspectFace_set->PolygonOffset().factor, + AspectFace_set->PolygonOffset().units); } } @@ -429,6 +441,21 @@ const OpenGl_AspectFace* OpenGl_Workspace::AspectFace (const Standard_Boolean th return AspectFace_set; } +//======================================================================= +//function : SetPolygonOffset +//purpose : +//======================================================================= +void OpenGl_Workspace::SetPolygonOffset (int theMode, + Standard_ShortReal theFactor, + Standard_ShortReal theUnits) +{ + PolygonOffset_applied.mode = theMode; + PolygonOffset_applied.factor = theFactor; + PolygonOffset_applied.units = theUnits; + + TelUpdatePolygonOffsets (PolygonOffset_applied); +} + /*----------------------------------------------------------------------*/ const OpenGl_AspectMarker* OpenGl_Workspace::AspectMarker (const Standard_Boolean theToApply) diff --git a/tests/bugs/vis/bug24867 b/tests/bugs/vis/bug24867 new file mode 100644 index 0000000000..b25617231e --- /dev/null +++ b/tests/bugs/vis/bug24867 @@ -0,0 +1,20 @@ +puts "============" +puts "CR24867" +puts "============" +puts "" + +####################################################################### +# Test for displaying highlighted representation of a complex shape +####################################################################### + +restore [locate_data_file Bottom.brep] obj +vinit +vdisplay obj +vsetdispmode 1 +vfit + +vmoveto 235 213 +vdump $imagedir/${casename}_highlighted.png + +vselect 235 213 +vdump $imagedir/${casename}_selected.png -- 2.39.5