1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-04 13:13:25 +03:00

0024867: Visualization - polygon offsets look broken

If specific layer setting is not enabled, default value extracted from current OpenGl state will be used.
This commit is contained in:
duv 2014-04-24 10:18:28 +04:00 committed by abv
parent c34795d6ff
commit aa125c5ae6
10 changed files with 126 additions and 88 deletions

View File

@ -44,7 +44,6 @@ namespace
{{ 1.0F, 1.0F, 1.0F, 1.0F }} // material color {{ 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; static const TCollection_AsciiString THE_EMPTY_KEY;
}; };

View File

@ -18,6 +18,7 @@
#include <InterfaceGraphic_telem.hxx> #include <InterfaceGraphic_telem.hxx>
#include <Aspect_InteriorStyle.hxx> #include <Aspect_InteriorStyle.hxx>
#include <Aspect_PolygonOffsetMode.hxx>
#include <TCollection_AsciiString.hxx> #include <TCollection_AsciiString.hxx>
#include <Handle_Graphic3d_TextureParams.hxx> #include <Handle_Graphic3d_TextureParams.hxx>
@ -35,6 +36,8 @@
#define OPENGL_SPECULAR_MASK (1<<2) #define OPENGL_SPECULAR_MASK (1<<2)
#define OPENGL_EMISSIVE_MASK (1<<3) #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; class CALL_DEF_CONTEXTFILLAREA;
struct OPENGL_SURF_PROP struct OPENGL_SURF_PROP

View File

@ -14,23 +14,9 @@
// commercial license or contractual agreement. // commercial license or contractual agreement.
#include <OpenGl_Layer.hxx> #include <OpenGl_Layer.hxx>
#include <OpenGl_Workspace.hxx>
#include <OpenGl_GlCore11.hxx> #include <OpenGl_GlCore11.hxx>
//=======================================================================
//function : OpenGl_LayerSettings
//purpose :
//=======================================================================
OpenGl_LayerSettings::OpenGl_LayerSettings()
: DepthOffsetFactor (1.0f),
DepthOffsetUnits (1.0f),
Flags (OpenGl_LayerDepthTest
| OpenGl_LayerDepthWrite
| OpenGl_LayerDepthClear)
{
//
}
//======================================================================= //=======================================================================
//function : OpenGl_Layer //function : OpenGl_Layer
//purpose : //purpose :
@ -45,18 +31,21 @@ OpenGl_Layer::OpenGl_Layer (const Standard_Integer theNbPriorities)
//function : Render //function : Render
//purpose : //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 // separate depth buffers
if (IsSettingEnabled (OpenGl_LayerDepthClear)) if (IsSettingEnabled (Graphic3d_ZLayerDepthClear))
{ {
glClear (GL_DEPTH_BUFFER_BIT); glClear (GL_DEPTH_BUFFER_BIT);
} }
// handle depth test // 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 else
{ {
@ -64,17 +53,21 @@ void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
} }
// handle depth offset // 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 else
{ {
glPolygonOffset (0.f, 0.f); theWorkspace->SetPolygonOffset (anAppliedOffsetParams.mode,
anAppliedOffsetParams.factor,
anAppliedOffsetParams.units);
} }
// handle depth write // handle depth write
if (IsSettingEnabled (OpenGl_LayerDepthWrite)) if (IsSettingEnabled (Graphic3d_ZLayerDepthWrite))
{ {
glDepthMask (GL_TRUE); glDepthMask (GL_TRUE);
} }
@ -84,5 +77,10 @@ void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
} }
// render priority list // render priority list
myPriorityList.Render (AWorkspace); myPriorityList.Render (theWorkspace);
// always restore polygon offset between layers rendering
theWorkspace->SetPolygonOffset (anAppliedOffsetParams.mode,
anAppliedOffsetParams.factor,
anAppliedOffsetParams.units);
} }

View File

@ -17,32 +17,15 @@
#define _OpenGl_Layer_Header #define _OpenGl_Layer_Header
#include <OpenGl_PriorityList.hxx> #include <OpenGl_PriorityList.hxx>
#include <Graphic3d_ZLayerSettings.hxx>
#include <OpenGl_GlCore11.hxx>
class Handle(OpenGl_Workspace); class Handle(OpenGl_Workspace);
enum OpenGl_LayerSetting struct OpenGl_GlobalLayerSettings
{ {
OpenGl_LayerDepthTest = 1, GLint DepthFunc;
OpenGl_LayerDepthWrite = 2, GLboolean DepthMask;
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 class OpenGl_Layer
@ -53,16 +36,16 @@ public:
OpenGl_Layer (const Standard_Integer theNbPriorities = 11); OpenGl_Layer (const Standard_Integer theNbPriorities = 11);
//! Returns settings of the layer object. //! 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. //! Sets settings of the layer object.
void SetLayerSettings (OpenGl_LayerSettings theSettings) void SetLayerSettings (Graphic3d_ZLayerSettings theSettings)
{ {
myLayerSettings = theSettings; myLayerSettings = theSettings;
} }
//! Returns true if theSetting is enabled for the layer. //! 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); return myLayerSettings.IsSettingEnabled (theSetting);
} }
@ -73,12 +56,12 @@ public:
//! Returns const reference to associated priority list. //! Returns const reference to associated priority list.
const OpenGl_PriorityList& PriorityList() const { return myPriorityList; } 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: private:
OpenGl_PriorityList myPriorityList; //!< Associated priority list object. OpenGl_PriorityList myPriorityList; //!< Associated priority list object.
OpenGl_LayerSettings myLayerSettings; //!< Layer setting flags. Graphic3d_ZLayerSettings myLayerSettings; //!< Layer setting flags.
}; };
#endif //_OpenGl_Layer_Header #endif //_OpenGl_Layer_Header

View File

@ -21,6 +21,7 @@
#include <OpenGl_LayerList.hxx> #include <OpenGl_LayerList.hxx>
#include <OpenGl_Structure.hxx> #include <OpenGl_Structure.hxx>
#include <OpenGl_Workspace.hxx>
#include <InterfaceGraphic_Graphic3d.hxx> #include <InterfaceGraphic_Graphic3d.hxx>
#include <InterfaceGraphic.hxx> #include <InterfaceGraphic.hxx>
@ -279,14 +280,22 @@ void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure,
void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace) &theWorkspace) const 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; 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 (); const OpenGl_Layer& aLayer = anIts.Value ();
if (aLayer.PriorityList().NbStructures () > 0) if (aLayer.PriorityList().NbStructures () > 0)
{ {
// render layer // render layer
aLayer.Render (theWorkspace); aLayer.Render (theWorkspace, aDefaultSettings);
} }
} }
glDepthMask (aDefaultSettings.DepthMask);
glDepthFunc (aDefaultSettings.DepthFunc);
} }

View File

@ -1518,13 +1518,6 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure,
void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId, void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId,
const Graphic3d_ZLayerSettings theSettings) const Graphic3d_ZLayerSettings theSettings)
{ {
// Convert Graphic3d_ZLayerSettings to OpenGl_LayerSettings myZLayers.Layer (theLayerId).SetLayerSettings (theSettings);
OpenGl_LayerSettings aConvertedSettings;
aConvertedSettings.DepthOffsetFactor = theSettings.DepthOffsetFactor;
aConvertedSettings.DepthOffsetUnits = theSettings.DepthOffsetUnits;
aConvertedSettings.Flags = theSettings.Flags;
myZLayers.Layer (theLayerId).SetLayerSettings (aConvertedSettings);
} }

View File

@ -166,8 +166,8 @@ OpenGl_Workspace::OpenGl_Workspace (const Handle(OpenGl_Display)& theDisplay,
TextParam_applied (NULL), TextParam_applied (NULL),
ViewMatrix_applied (&myDefaultMatrix), ViewMatrix_applied (&myDefaultMatrix),
StructureMatrix_applied (&myDefaultMatrix), StructureMatrix_applied (&myDefaultMatrix),
myModelViewMatrix (myDefaultMatrix), PolygonOffset_applied (THE_DEFAULT_POFFSET),
PolygonOffset_applied (NULL) myModelViewMatrix (myDefaultMatrix)
{ {
theDisplay->InitAttributes(); theDisplay->InitAttributes();
@ -268,7 +268,7 @@ void OpenGl_Workspace::ResetAppliedAspect()
AspectText_applied = NULL; AspectText_applied = NULL;
TextParam_set = &myDefaultTextParam; TextParam_set = &myDefaultTextParam;
TextParam_applied = NULL; TextParam_applied = NULL;
PolygonOffset_applied = NULL; PolygonOffset_applied = THE_DEFAULT_POFFSET;
AspectLine(Standard_True); AspectLine(Standard_True);
AspectFace(Standard_True); AspectFace(Standard_True);

View File

@ -38,6 +38,7 @@
#include <Aspect_CLayer2d.hxx> #include <Aspect_CLayer2d.hxx>
#include <Aspect_Handle.hxx> #include <Aspect_Handle.hxx>
#include <Aspect_PrintAlgo.hxx> #include <Aspect_PrintAlgo.hxx>
#include <Aspect_PolygonOffsetMode.hxx>
#include <InterfaceGraphic_Graphic3d.hxx> #include <InterfaceGraphic_Graphic3d.hxx>
#include <InterfaceGraphic_Visual3d.hxx> #include <InterfaceGraphic_Visual3d.hxx>
@ -227,6 +228,12 @@ public:
//! @return applied model structure matrix. //! @return applied model structure matrix.
inline const OpenGl_Matrix* ModelMatrix() const { return StructureMatrix_applied; } 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: protected:
void CopyBuffers (const Standard_Boolean theFrontToBack); 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 myMatBack; //!< current back material state
OpenGl_Material myMatTmp; //!< temporary variable OpenGl_Material myMatTmp; //!< temporary variable
//! Model matrix with applied structure transformations OpenGl_Matrix myModelViewMatrix; //!< Model matrix with applied structure transformations
OpenGl_Matrix myModelViewMatrix;
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 public: //! @name type definition

View File

@ -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 ) if ((theOffsetData.mode & Aspect_POM_Fill) == Aspect_POM_Fill)
glEnable ( GL_POLYGON_OFFSET_FILL ); {
glEnable (GL_POLYGON_OFFSET_FILL);
}
else else
glDisable ( GL_POLYGON_OFFSET_FILL ); {
glDisable (GL_POLYGON_OFFSET_FILL);
}
if ( ( pdata->mode & Aspect_POM_Line ) == Aspect_POM_Line ) if ((theOffsetData.mode & Aspect_POM_Line) == Aspect_POM_Line)
glEnable ( GL_POLYGON_OFFSET_LINE ); {
glEnable (GL_POLYGON_OFFSET_LINE);
}
else else
glDisable( GL_POLYGON_OFFSET_LINE ); {
glDisable (GL_POLYGON_OFFSET_LINE);
}
if ( ( pdata->mode & Aspect_POM_Point ) == Aspect_POM_Point ) if ((theOffsetData.mode & Aspect_POM_Point) == Aspect_POM_Point)
glEnable ( GL_POLYGON_OFFSET_POINT ); {
glEnable (GL_POLYGON_OFFSET_POINT);
}
else 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 // Aspect_POM_None means: do not change current settings
if ((AspectFace_set->PolygonOffset().mode & Aspect_POM_None) != Aspect_POM_None) if ((AspectFace_set->PolygonOffset().mode & Aspect_POM_None) != Aspect_POM_None)
{ {
if (PolygonOffset_applied == NULL if (PolygonOffset_applied.mode != AspectFace_set->PolygonOffset().mode
|| PolygonOffset_applied->mode != AspectFace_set->PolygonOffset().mode || PolygonOffset_applied.factor != AspectFace_set->PolygonOffset().factor
|| PolygonOffset_applied->factor != AspectFace_set->PolygonOffset().factor || PolygonOffset_applied.units != AspectFace_set->PolygonOffset().units)
|| PolygonOffset_applied->units != AspectFace_set->PolygonOffset().units)
{ {
PolygonOffset_applied = &AspectFace_set->PolygonOffset(); SetPolygonOffset (AspectFace_set->PolygonOffset().mode,
TelUpdatePolygonOffsets (PolygonOffset_applied); 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; 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) const OpenGl_AspectMarker* OpenGl_Workspace::AspectMarker (const Standard_Boolean theToApply)

20
tests/bugs/vis/bug24867 Normal file
View File

@ -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