1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-07-30 13:05:50 +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
};
static TEL_POFFSET_PARAM THE_DEFAULT_POFFSET = { Aspect_POM_Fill, 1.0F, 0.0F };
static const TCollection_AsciiString THE_EMPTY_KEY;
};

View File

@ -18,6 +18,7 @@
#include <InterfaceGraphic_telem.hxx>
#include <Aspect_InteriorStyle.hxx>
#include <Aspect_PolygonOffsetMode.hxx>
#include <TCollection_AsciiString.hxx>
#include <Handle_Graphic3d_TextureParams.hxx>
@ -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

View File

@ -14,23 +14,9 @@
// commercial license or contractual agreement.
#include <OpenGl_Layer.hxx>
#include <OpenGl_Workspace.hxx>
#include <OpenGl_GlCore11.hxx>
//=======================================================================
//function : OpenGl_LayerSettings
//purpose :
//=======================================================================
OpenGl_LayerSettings::OpenGl_LayerSettings()
: DepthOffsetFactor (1.0f),
DepthOffsetUnits (1.0f),
Flags (OpenGl_LayerDepthTest
| OpenGl_LayerDepthWrite
| OpenGl_LayerDepthClear)
{
//
}
//=======================================================================
//function : OpenGl_Layer
//purpose :
@ -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);
}

View File

@ -17,32 +17,15 @@
#define _OpenGl_Layer_Header
#include <OpenGl_PriorityList.hxx>
#include <Graphic3d_ZLayerSettings.hxx>
#include <OpenGl_GlCore11.hxx>
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

View File

@ -21,6 +21,7 @@
#include <OpenGl_LayerList.hxx>
#include <OpenGl_Structure.hxx>
#include <OpenGl_Workspace.hxx>
#include <InterfaceGraphic_Graphic3d.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
{
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);
}

View File

@ -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);
}

View File

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

View File

@ -38,6 +38,7 @@
#include <Aspect_CLayer2d.hxx>
#include <Aspect_Handle.hxx>
#include <Aspect_PrintAlgo.hxx>
#include <Aspect_PolygonOffsetMode.hxx>
#include <InterfaceGraphic_Graphic3d.hxx>
#include <InterfaceGraphic_Visual3d.hxx>
@ -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

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

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