If specific layer setting is not enabled, default value extracted from current OpenGl state will be used.
{{ 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;
};
#include <InterfaceGraphic_telem.hxx>
#include <Aspect_InteriorStyle.hxx>
+#include <Aspect_PolygonOffsetMode.hxx>
#include <TCollection_AsciiString.hxx>
#include <Handle_Graphic3d_TextureParams.hxx>
#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
// 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 :
//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);
}
}
// render priority list
- myPriorityList.Render (AWorkspace);
+ myPriorityList.Render (theWorkspace);
+
+ // always restore polygon offset between layers rendering
+ theWorkspace->SetPolygonOffset (anAppliedOffsetParams.mode,
+ anAppliedOffsetParams.factor,
+ anAppliedOffsetParams.units);
}
#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
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);
}
//! 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
#include <OpenGl_LayerList.hxx>
#include <OpenGl_Structure.hxx>
+#include <OpenGl_Workspace.hxx>
#include <InterfaceGraphic_Graphic3d.hxx>
#include <InterfaceGraphic.hxx>
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);
}
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);
}
TextParam_applied (NULL),
ViewMatrix_applied (&myDefaultMatrix),
StructureMatrix_applied (&myDefaultMatrix),
- myModelViewMatrix (myDefaultMatrix),
- PolygonOffset_applied (NULL)
+ PolygonOffset_applied (THE_DEFAULT_POFFSET),
+ myModelViewMatrix (myDefaultMatrix)
{
theDisplay->InitAttributes();
AspectText_applied = NULL;
TextParam_set = &myDefaultTextParam;
TextParam_applied = NULL;
- PolygonOffset_applied = NULL;
+ PolygonOffset_applied = THE_DEFAULT_POFFSET;
AspectLine(Standard_True);
AspectFace(Standard_True);
#include <Aspect_CLayer2d.hxx>
#include <Aspect_Handle.hxx>
#include <Aspect_PrintAlgo.hxx>
+#include <Aspect_PolygonOffsetMode.hxx>
#include <InterfaceGraphic_Graphic3d.hxx>
#include <InterfaceGraphic_Visual3d.hxx>
//! @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);
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
/*----------------------------------------------------------------------*/
-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);
}
/*----------------------------------------------------------------------*/
// 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);
}
}
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)
--- /dev/null
+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