1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00

0024785: Visualization - Modifying z-layers concept to gain more control over OpenGl depth buffer.

Cosmetic fixes.
glDepthFunc fix.
This commit is contained in:
duv 2014-04-17 15:56:41 +04:00 committed by apn
parent 1a457208fe
commit c5751993f2
26 changed files with 655 additions and 28 deletions

View File

@ -59,6 +59,7 @@ Graphic3d_Vec3.hxx
Graphic3d_Vec4.hxx Graphic3d_Vec4.hxx
Graphic3d_Mat4.hxx Graphic3d_Mat4.hxx
Graphic3d_Mat4d.hxx Graphic3d_Mat4d.hxx
Graphic3d_ZLayerSettings.hxx
Graphic3d_Vertex.hxx Graphic3d_Vertex.hxx
Graphic3d_Vertex.cxx Graphic3d_Vertex.cxx
Graphic3d_MarkerImage.hxx Graphic3d_MarkerImage.hxx

View File

@ -421,6 +421,8 @@ is
imported Mat4; imported Mat4;
imported Mat4d; imported Mat4d;
imported ZLayerSettings;
-------------------- --------------------
-- Category: Classes -- Category: Classes
-------------------- --------------------

View File

@ -53,6 +53,8 @@ uses
PrintAlgo from Aspect, PrintAlgo from Aspect,
DisplayConnection_Handle from Aspect, DisplayConnection_Handle from Aspect,
ZLayerSettings from Graphic3d,
AspectLine3d from Graphic3d, AspectLine3d from Graphic3d,
AspectMarker3d from Graphic3d, AspectMarker3d from Graphic3d,
AspectText3d from Graphic3d, AspectText3d from Graphic3d,
@ -688,6 +690,13 @@ is
---Purpose: Get Z layer ID of structure. If the structure doesn't ---Purpose: Get Z layer ID of structure. If the structure doesn't
-- exists in graphic driver, the method returns -1. -- 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 -- Category: Internal methods
----------------------------- -----------------------------

View File

@ -40,6 +40,8 @@ uses
TypeOfHighlightMethod from Aspect, TypeOfHighlightMethod from Aspect,
TypeOfUpdate from Aspect, TypeOfUpdate from Aspect,
ZLayerSettings from Graphic3d,
DataStructureManager from Graphic3d, DataStructureManager from Graphic3d,
AspectFillArea3d from Graphic3d, AspectFillArea3d from Graphic3d,
AspectLine3d from Graphic3d, AspectLine3d from Graphic3d,
@ -293,6 +295,17 @@ is
---Purpose: Get Z layer ID assigned to structure. If the structure ---Purpose: Get Z layer ID assigned to structure. If the structure
-- has no layer ID (deleted from graphic driver), the method returns -1. -- 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; AddZLayer ( me : mutable;
theLayerId : in out Integer from Standard ) theLayerId : in out Integer from Standard )
returns Boolean from Standard is deferred; returns Boolean from Standard is deferred;

View File

@ -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 <Standard_TypeDef.hxx>
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

View File

@ -113,6 +113,8 @@ OpenGl_LayerList.cxx
OpenGl_LayerList.hxx OpenGl_LayerList.hxx
OpenGl_IndexBuffer.hxx OpenGl_IndexBuffer.hxx
OpenGl_IndexBuffer.cxx OpenGl_IndexBuffer.cxx
OpenGl_Layer.cxx
OpenGl_Layer.hxx
OpenGl_TextureBufferArb.hxx OpenGl_TextureBufferArb.hxx
OpenGl_TextureBufferArb.cxx OpenGl_TextureBufferArb.cxx
OpenGl_Vec.hxx OpenGl_Vec.hxx

View File

@ -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. //! 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; 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: public:
//! @return the visualization options //! @return the visualization options

View File

@ -508,7 +508,6 @@ void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView,
//function : RemoveZLayer //function : RemoveZLayer
//purpose : //purpose :
//======================================================================= //=======================================================================
void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView, void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
const Standard_Integer theLayerId) const Standard_Integer theLayerId)
{ {
@ -516,3 +515,16 @@ void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
if (aCView) if (aCView)
aCView->View->RemoveZLayer (theLayerId); 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);
}

View File

@ -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 <OpenGl_Layer.hxx>
#include <OpenGl_GlCore11.hxx>
//=======================================================================
//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);
}

View File

@ -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 <OpenGl_PriorityList.hxx>
#include <Graphic3d_ZLayerSettings.hxx>
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

View File

@ -31,7 +31,7 @@ OpenGl_LayerList::OpenGl_LayerList (const Standard_Integer theNbPriorities)
myNbStructures (0) myNbStructures (0)
{ {
// insert default priority layer // insert default priority layer
myLayers.Append (OpenGl_PriorityList (myNbPriorities)); myLayers.Append (OpenGl_Layer (myNbPriorities));
myLayerIds.Bind (0, myLayers.Length()); myLayerIds.Bind (0, myLayers.Length());
} }
@ -49,7 +49,7 @@ OpenGl_LayerList::~OpenGl_LayerList ()
//purpose : //purpose :
//======================================================================= //=======================================================================
OpenGl_PriorityList& OpenGl_LayerList::defaultLayer() OpenGl_Layer& OpenGl_LayerList::defaultLayer()
{ {
return myLayers.ChangeValue (1); return myLayers.ChangeValue (1);
} }
@ -85,7 +85,7 @@ void OpenGl_LayerList::AddLayer (const Standard_Integer theLayerId)
return; return;
// add the new layer // add the new layer
myLayers.Append (OpenGl_PriorityList (myNbPriorities)); myLayers.Append (OpenGl_Layer (myNbPriorities));
myLayerIds.Bind (theLayerId, myLayers.Length()); myLayerIds.Bind (theLayerId, myLayers.Length());
} }
@ -100,6 +100,24 @@ Standard_Boolean OpenGl_LayerList::HasLayer
return myLayerIds.IsBound (theLayerId); 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 //function : RemoveLayer
//purpose : //purpose :
@ -113,8 +131,8 @@ void OpenGl_LayerList::RemoveLayer (const Standard_Integer theLayerId)
Standard_Integer aRemovePos = myLayerIds.Find (theLayerId); Standard_Integer aRemovePos = myLayerIds.Find (theLayerId);
// move all displayed structures to first layer // move all displayed structures to first layer
const OpenGl_PriorityList& aList = myLayers.Value (aRemovePos); const OpenGl_PriorityList& aList = myLayers.Value (aRemovePos).PriorityList();
defaultLayer ().Append (aList); defaultLayer ().PriorityList().Append (aList);
// remove layer // remove layer
myLayers.Remove (aRemovePos); myLayers.Remove (aRemovePos);
@ -141,8 +159,8 @@ void OpenGl_LayerList::AddStructure (const OpenGl_Structure *theStructure,
{ {
// add structure to associated layer, // add structure to associated layer,
// if layer doesn't exists, display structure in default layer // if layer doesn't exists, display structure in default layer
OpenGl_PriorityList& aList = !HasLayer (theLayerId) ? defaultLayer () : OpenGl_PriorityList& aList = !HasLayer (theLayerId) ? defaultLayer ().PriorityList() :
myLayers.ChangeValue (myLayerIds.Find (theLayerId)); myLayers.ChangeValue (myLayerIds.Find (theLayerId)).PriorityList();
aList.Add (theStructure, thePriority); aList.Add (theStructure, thePriority);
myNbStructures++; myNbStructures++;
@ -163,7 +181,7 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure,
Standard_Integer aSeqPos = !HasLayer (theLayerId) ? Standard_Integer aSeqPos = !HasLayer (theLayerId) ?
1 : myLayerIds.Find (theLayerId); 1 : myLayerIds.Find (theLayerId);
OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos); OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
// remove structure from associated list // remove structure from associated list
// if the structure is not found there, // if the structure is not found there,
@ -185,7 +203,7 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure,
OpenGl_SequenceOfLayers::Iterator anIts; OpenGl_SequenceOfLayers::Iterator anIts;
for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++) for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++)
{ {
OpenGl_PriorityList& aScanList = anIts.ChangeValue (); OpenGl_PriorityList& aScanList = anIts.ChangeValue ().PriorityList();
if (aSeqPos == aSeqId) if (aSeqPos == aSeqId)
continue; continue;
@ -215,7 +233,7 @@ void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure,
Standard_Integer aSeqPos = !HasLayer (theOldLayerId) ? Standard_Integer aSeqPos = !HasLayer (theOldLayerId) ?
1 : myLayerIds.Find (theOldLayerId); 1 : myLayerIds.Find (theOldLayerId);
OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos); OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
Standard_Integer aPriority; Standard_Integer aPriority;
// take priority and remove structure from list found by <theOldLayerId> // take priority and remove structure from list found by <theOldLayerId>
@ -253,17 +271,17 @@ 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
{ {
int aDefaultDepthFunc;
glGetIntegerv (GL_DEPTH_FUNC, &aDefaultDepthFunc);
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_PriorityList& aList = anIts.Value (); const OpenGl_Layer& aLayer = anIts.Value ();
if (aList.NbStructures () > 0) if (aLayer.PriorityList().NbStructures () > 0)
{ {
// separate depth buffers // render layer
glClear (GL_DEPTH_BUFFER_BIT); aLayer.Render (theWorkspace, aDefaultDepthFunc);
// render priority list
aList.Render (theWorkspace);
} }
} }
} }

View File

@ -17,6 +17,7 @@
#define _OpenGl_LayerList_Header #define _OpenGl_LayerList_Header
#include <OpenGl_PriorityList.hxx> #include <OpenGl_PriorityList.hxx>
#include <OpenGl_Layer.hxx>
#include <InterfaceGraphic_telem.hxx> #include <InterfaceGraphic_telem.hxx>
@ -26,7 +27,7 @@
class OpenGl_Structure; class OpenGl_Structure;
class Handle(OpenGl_Workspace); class Handle(OpenGl_Workspace);
typedef NCollection_Sequence<OpenGl_PriorityList> OpenGl_SequenceOfLayers; typedef NCollection_Sequence<OpenGl_Layer> OpenGl_SequenceOfLayers;
typedef NCollection_DataMap<int, int> OpenGl_LayerSeqIds; typedef NCollection_DataMap<int, int> OpenGl_LayerSeqIds;
class OpenGl_LayerList class OpenGl_LayerList
@ -71,6 +72,12 @@ class OpenGl_LayerList
void ChangeLayer (const OpenGl_Structure *theStructure, void ChangeLayer (const OpenGl_Structure *theStructure,
const Standard_Integer theOldLayerId, const Standard_Integer theOldLayerId,
const Standard_Integer theNewLayerId); 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 //! Render this element
void Render (const Handle(OpenGl_Workspace) &theWorkspace) const; void Render (const Handle(OpenGl_Workspace) &theWorkspace) const;
@ -84,7 +91,7 @@ class OpenGl_LayerList
private: private:
//! Get default layer //! Get default layer
OpenGl_PriorityList& defaultLayer (); OpenGl_Layer& defaultLayer ();
protected: protected:

View File

@ -34,6 +34,7 @@
#include <Graphic3d_CView.hxx> #include <Graphic3d_CView.hxx>
#include <Graphic3d_CGraduatedTrihedron.hxx> #include <Graphic3d_CGraduatedTrihedron.hxx>
#include <Graphic3d_SequenceOfHClipPlane.hxx> #include <Graphic3d_SequenceOfHClipPlane.hxx>
#include <Graphic3d_ZLayerSettings.hxx>
#include <Visual3d_TypeOfSurfaceDetail.hxx> #include <Visual3d_TypeOfSurfaceDetail.hxx>
#include <OpenGl_LayerList.hxx> #include <OpenGl_LayerList.hxx>
@ -159,6 +160,10 @@ class OpenGl_View : public MMgt_TShared
void ChangeZLayer (const OpenGl_Structure *theStructure, void ChangeZLayer (const OpenGl_Structure *theStructure,
const Standard_Integer theNewLayerId); 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 CreateBackgroundTexture (const Standard_CString AFileName, const Aspect_FillMethod AFillStyle);
void SetBackgroundTextureStyle (const Aspect_FillMethod FillStyle); void SetBackgroundTextureStyle (const Aspect_FillMethod FillStyle);
void SetBackgroundGradient (const Quantity_Color& AColor1, const Quantity_Color& AColor2, const Aspect_GradientFillMethod AType); void SetBackgroundGradient (const Quantity_Color& AColor1, const Quantity_Color& AColor2, const Aspect_GradientFillMethod AType);

View File

@ -1028,6 +1028,17 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure,
myZLayers.ChangeLayer (theStructure, anOldLayer, theNewLayerId); 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 //function : RedrawScene
//purpose : //purpose :

View File

@ -90,7 +90,7 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceGeometry (GeomUpdateMode theMod
for (OpenGl_SequenceOfLayers::Iterator anLayerIt (aList.Layers()); anLayerIt.More(); anLayerIt.Next()) 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) if (aPriorityList.NbStructures() == 0)
continue; continue;

View File

@ -40,6 +40,7 @@ class Viewer from V3d inherits TShared from MMgt
uses uses
GraphicDriver from Graphic3d, GraphicDriver from Graphic3d,
ZLayerSettings from Graphic3d,
TypeOfUpdate from V3d, TypeOfUpdate from V3d,
TypeOfVisualization from V3d, TypeOfVisualization from V3d,
TypeOfShadingModel from V3d, TypeOfShadingModel from V3d,
@ -643,6 +644,17 @@ is
---Purpose: ---Purpose:
-- Temporarly hide grid echo. -- 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; AddZLayer ( me : mutable;
theLayerId : in out Integer from Standard ) theLayerId : in out Integer from Standard )
returns Boolean from Standard is static; returns Boolean from Standard is static;

View File

@ -332,6 +332,27 @@ void V3d_Viewer::DelView( const Handle(V3d_View)& TheView ) {
MyDefinedViews.Remove(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 //function : AddZLayer
//purpose : //purpose :

View File

@ -3369,12 +3369,21 @@ static int VZLayer (Draw_Interpretor& di, Standard_Integer argc, const char** ar
} }
else if (argc < 2) else if (argc < 2)
{ {
di << "Use: vzlayer " << argv[0]; di << "Use: vzlayer ";
di << " add/del/get [id]\n"; di << " add/del/get/settings/enable/disable [id]\n";
di << " add - add new z layer to viewer and print its 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 << " del - del z layer by its id\n";
di << " get - print sequence of z layers in increasing order of their overlay level\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; return 1;
} }
@ -3426,9 +3435,123 @@ static int VZLayer (Draw_Interpretor& di, Standard_Integer argc, const char** ar
di << "\n"; 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<Standard_ShortReal> (Draw::Atof (argv[3]));
Standard_ShortReal aUnits = static_cast<Standard_ShortReal> (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 else
{ {
di << "Invalid operation, please use { add / del / get }\n"; di << "Invalid operation, please use { add / del / get / settings / enable / disable}\n";
return 1; 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", "vprintview : width height filename [algo=0] [tile_width tile_height] : Test print algorithm: algo = 0 - stretch, algo = 1 - tile",
__FILE__,VPrintView,group); __FILE__,VPrintView,group);
theCommands.Add("vzlayer", 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); __FILE__,VZLayer,group);
theCommands.Add("voverlaytext", theCommands.Add("voverlaytext",
"voverlaytext : text x y [height] [font_name] [text_color: R G B] [display_type] [background_color: R G B]" "voverlaytext : text x y [height] [font_name] [text_color: R G B] [display_type] [background_color: R G B]"

View File

@ -6,3 +6,4 @@ EXTERNLIB
Visual3d_WOKSteps.edl Visual3d_WOKSteps.edl
Visual3d_View_Print.cxx Visual3d_View_Print.cxx
Visual3d_NListOfLayerItem.hxx Visual3d_NListOfLayerItem.hxx
Visual3d_MapOfZLayerSettings.hxx

View File

@ -278,6 +278,8 @@ is
-- Category: Instantiated classes -- Category: Instantiated classes
--------------------------------- ---------------------------------
primitive MapOfZLayerSettings;
imported NListOfLayerItem; imported NListOfLayerItem;
class SequenceOfPickPath instantiates class SequenceOfPickPath instantiates

View File

@ -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 <Standard_TypeDef.hxx>
#include <NCollection_Map.hxx>
#include <Graphic3d_ZLayerSettings.hxx>
typedef NCollection_DataMap<Standard_Integer, Graphic3d_ZLayerSettings> Visual3d_MapOfZLayerSettings;
#endif // _Visual3d_MapOfZLayerSettings_HeaderFile

View File

@ -86,6 +86,8 @@ uses
MapOfStructure from Graphic3d, MapOfStructure from Graphic3d,
Camera_Handle from Graphic3d, Camera_Handle from Graphic3d,
ZLayerSettings from Graphic3d,
ContextView from Visual3d, ContextView from Visual3d,
Layer from Visual3d, Layer from Visual3d,
Light from Visual3d, Light from Visual3d,
@ -796,6 +798,13 @@ is
---Purpose: Changes the display priority of the structure <AStructure>. ---Purpose: Changes the display priority of the structure <AStructure>.
---Category: Private methods ---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; AddZLayer ( me : mutable;
theLayerId : Integer from Standard ) theLayerId : Integer from Standard )
is static private; is static private;

View File

@ -2929,6 +2929,17 @@ Standard_Boolean Visual3d_View::Export (const Standard_CString theFileName
thePrecision, theProgressBarFunc, theProgressObject); 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 //function : AddZLayer
//purpose : //purpose :

View File

@ -41,6 +41,9 @@ uses
CView from Graphic3d, CView from Graphic3d,
Vector from Graphic3d, Vector from Graphic3d,
ZLayerSettings from Graphic3d,
MapOfZLayerSettings from Visual3d,
ContextPick from Visual3d, ContextPick from Visual3d,
Layer from Visual3d, Layer from Visual3d,
PickDescriptor from Visual3d, PickDescriptor from Visual3d,
@ -249,6 +252,17 @@ is
returns Integer from Standard is redefined static; returns Integer from Standard is redefined static;
---Purpose: Get Z layer ID assigned for the structure. ---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; AddZLayer ( me : mutable;
theLayerId : in out Integer from Standard ) theLayerId : in out Integer from Standard )
returns Boolean from Standard is redefined static; returns Boolean from Standard is redefined static;
@ -474,6 +488,8 @@ fields
myLayerIds : MapOfInteger from TColStd; myLayerIds : MapOfInteger from TColStd;
myLayerSeq : SequenceOfInteger from TColStd; myLayerSeq : SequenceOfInteger from TColStd;
myMapOfZLayerSettings : MapOfZLayerSettings from Visual3d;
friends friends
class View from Visual3d, class View from Visual3d,

View File

@ -103,6 +103,7 @@ MyTransparency (Standard_False)
myLayerSeq.Append (0); myLayerSeq.Append (0);
MyGraphicDriver = theDriver; MyGraphicDriver = theDriver;
myMapOfZLayerSettings.Bind (0, Graphic3d_ZLayerSettings());
} }
//-Destructors //-Destructors
@ -775,6 +776,45 @@ Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structu
return MyGraphicDriver->GetZLayer (*theStructure->CStructure ()); 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 //function : AddZLayer
//purpose : //purpose :
@ -795,6 +835,9 @@ Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId)
return Standard_False; return Standard_False;
} }
// default z-layer settings
myMapOfZLayerSettings.Bind (theLayerId, Graphic3d_ZLayerSettings());
// tell all managed views to remove display layers // tell all managed views to remove display layers
Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView); Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
for ( ; aViewIt.More (); aViewIt.Next ()) for ( ; aViewIt.More (); aViewIt.Next ())
@ -814,7 +857,7 @@ Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theL
return Standard_False; return Standard_False;
// tell all managed views to remove display layers // tell all managed views to remove display layers
Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView); Visual3d_SetIteratorOfSetOfView aViewIt (MyDefinedView);
for ( ; aViewIt.More (); aViewIt.Next ()) for ( ; aViewIt.More (); aViewIt.Next ())
(aViewIt.Value ())->RemoveZLayer (theLayerId); (aViewIt.Value ())->RemoveZLayer (theLayerId);
@ -822,11 +865,15 @@ Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theL
// remove index // remove index
for (int aIdx = 1; aIdx <= myLayerSeq.Length (); aIdx++) for (int aIdx = 1; aIdx <= myLayerSeq.Length (); aIdx++)
if (myLayerSeq(aIdx) == theLayerId) {
if (myLayerSeq (aIdx) == theLayerId)
{ {
myLayerSeq.Remove (aIdx); myLayerSeq.Remove (aIdx);
break; break;
} }
}
myMapOfZLayerSettings.UnBind (theLayerId);
myLayerIds.Remove (theLayerId); myLayerIds.Remove (theLayerId);
getZLayerGenId ().Free (theLayerId); getZLayerGenId ().Free (theLayerId);

51
tests/bugs/vis/bug24785 Normal file
View File

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