From a195430212bd128a9bedba9e27f019cfb67b5398 Mon Sep 17 00:00:00 2001 From: kgv Date: Thu, 22 Jan 2015 17:29:37 +0300 Subject: [PATCH] 0024394: Visualization - implement more general way for rendering of immediate objects Move OpenGl_Structure::myZLayer to base class Graphic3d_CStructure. Graphic3d_ZLayerId - introduce new pre-defined ZLayers. Do not clear Depth buffer twice for default ZLayer. AIS_InteractiveContext::Display() - add new argument AIS_DisplayStatus to specify displaying status. Drop unused Graphic3d_CPick and related methods. Drop OpenGl_Structure::myNamedStatus - use flags from parent class Graphic3d_CStructure directly. OpenGl_LayerList ::ChangeLayer(), ::ChangePriority - fix structure remove from unexpected layer. Merge class OpenGl_PriorityList into OpenGl_Layer. PrsMgr_PresentationManager::mySelectionColor - store selection color as field of Presentation Manager. PrsMgr_Presentation class - do not declare private methods as virtual. PrsMgr_Presentation::Highlight() - extend method syntax and drop methods ::Color() and ::BoundBox(). PrsMgr_PresentableObject - store ZLayer in presentable object to display object presentations in required layer directly (without displaying it in wrong layer first). test/mesh/end - force re-displaying the shape to compute mesh anew Test-case for issue --- src/AIS/AIS_InteractiveContext.cdl | 39 +- src/AIS/AIS_InteractiveContext.cxx | 140 +++---- src/AIS/AIS_LocalContext.cdl | 20 - src/AIS/AIS_LocalContext.cxx | 31 -- src/Graphic3d/FILES | 4 +- src/Graphic3d/Graphic3d.cdl | 17 +- src/Graphic3d/Graphic3d_CPick.hxx | 28 -- src/Graphic3d/Graphic3d_CStructure.cxx | 2 +- src/Graphic3d/Graphic3d_CStructure.hxx | 24 +- src/Graphic3d/Graphic3d_GraphicDriver.cdl | 49 +-- src/Graphic3d/Graphic3d_GraphicDriver.cxx | 12 - .../Graphic3d_MapIteratorOfMapOfStructure.hxx | 23 ++ src/Graphic3d/Graphic3d_MapOfStructure.hxx | 24 ++ src/Graphic3d/Graphic3d_Structure.cdl | 78 +--- src/Graphic3d/Graphic3d_Structure.cxx | 115 ++---- src/Graphic3d/Graphic3d_StructureManager.cdl | 44 +-- src/Graphic3d/Graphic3d_StructureManager.cxx | 55 +-- src/Graphic3d/Graphic3d_ZLayerId.hxx | 33 ++ src/Graphic3d/Graphic3d_ZLayerSettings.hxx | 15 +- .../InterfaceGraphic_Visual3d.hxx | 26 -- src/OpenGl/FILES | 3 +- src/OpenGl/OpenGl_BVHClipPrimitiveSet.cxx | 4 +- src/OpenGl/OpenGl_BVHClipPrimitiveSet.hxx | 4 +- src/OpenGl/OpenGl_GraphicDriver.cxx | 9 +- src/OpenGl/OpenGl_GraphicDriver.hxx | 41 +-- src/OpenGl/OpenGl_GraphicDriver_4.cxx | 67 +--- src/OpenGl/OpenGl_GraphicDriver_7.cxx | 12 +- src/OpenGl/OpenGl_Layer.cxx | 272 +++++++++++++- src/OpenGl/OpenGl_Layer.hxx | 80 +++- src/OpenGl/OpenGl_LayerList.cxx | 342 ++++++++++-------- src/OpenGl/OpenGl_LayerList.hxx | 84 ++--- src/OpenGl/OpenGl_NamedStatus.hxx | 2 - src/OpenGl/OpenGl_PriorityList.cxx | 271 -------------- src/OpenGl/OpenGl_PriorityList.hxx | 96 ----- src/OpenGl/OpenGl_SequenceOfStructure.hxx | 24 ++ src/OpenGl/OpenGl_Structure.cxx | 41 +-- src/OpenGl/OpenGl_Structure.hxx | 14 +- src/OpenGl/OpenGl_View.hxx | 45 ++- src/OpenGl/OpenGl_View_2.cxx | 96 ++--- src/OpenGl/OpenGl_Workspace.cxx | 50 ++- src/OpenGl/OpenGl_Workspace_Raytrace.cxx | 14 +- src/Prs3d/Prs3d_Presentation.cdl | 23 +- src/Prs3d/Prs3d_Presentation.cxx | 69 ---- src/PrsMgr/PrsMgr.cdl | 7 +- src/PrsMgr/PrsMgr_PresentableObject.cdl | 29 +- src/PrsMgr/PrsMgr_PresentableObject.cxx | 34 +- src/PrsMgr/PrsMgr_Presentation.cdl | 37 +- src/PrsMgr/PrsMgr_Presentation.cxx | 39 +- src/PrsMgr/PrsMgr_PresentationManager.cdl | 22 +- src/PrsMgr/PrsMgr_PresentationManager.cxx | 201 ++++------ src/SelectMgr/SelectMgr_EntityOwner.cdl | 6 +- src/SelectMgr/SelectMgr_EntityOwner.cxx | 5 +- src/SelectMgr/SelectMgr_SelectableObject.cdl | 18 +- src/SelectMgr/SelectMgr_SelectableObject.cxx | 11 +- src/StdSelect/StdSelect_BRepOwner.cdl | 6 +- src/StdSelect/StdSelect_BRepOwner.cxx | 41 +-- src/V3d/V3d_CircularGrid.cxx | 3 +- src/V3d/V3d_DirectionalLight.cxx | 1 - src/V3d/V3d_Plane.cxx | 3 +- src/V3d/V3d_PositionLight.cxx | 1 - src/V3d/V3d_PositionalLight.cxx | 1 - src/V3d/V3d_RectangularGrid.cxx | 3 +- src/V3d/V3d_SpotLight.cxx | 1 - src/ViewerTest/ViewerTest.cxx | 105 +++++- src/ViewerTest/ViewerTest_ViewerCommands.cxx | 12 + src/Visual3d/Visual3d_MapOfZLayerSettings.hxx | 3 +- src/Visual3d/Visual3d_View.cdl | 24 +- src/Visual3d/Visual3d_View.cxx | 257 ++++++------- src/Visual3d/Visual3d_ViewManager.cdl | 59 +-- src/Visual3d/Visual3d_ViewManager.cxx | 132 +++---- tests/bugs/vis/bug24394 | 19 + tests/mesh/end | 4 +- 72 files changed, 1579 insertions(+), 1947 deletions(-) delete mode 100644 src/Graphic3d/Graphic3d_CPick.hxx create mode 100644 src/Graphic3d/Graphic3d_MapIteratorOfMapOfStructure.hxx create mode 100644 src/Graphic3d/Graphic3d_MapOfStructure.hxx create mode 100644 src/Graphic3d/Graphic3d_ZLayerId.hxx delete mode 100644 src/OpenGl/OpenGl_PriorityList.cxx delete mode 100644 src/OpenGl/OpenGl_PriorityList.hxx create mode 100644 src/OpenGl/OpenGl_SequenceOfStructure.hxx create mode 100644 tests/bugs/vis/bug24394 diff --git a/src/AIS/AIS_InteractiveContext.cdl b/src/AIS/AIS_InteractiveContext.cdl index 50f94200e4..d8912b4503 100644 --- a/src/AIS/AIS_InteractiveContext.cdl +++ b/src/AIS/AIS_InteractiveContext.cdl @@ -172,30 +172,31 @@ is -- local context without selection, use the syntax below, -- setting aSelectionMode to -1. - Display(me : mutable; - anIobj : InteractiveObject from AIS; - amode : Integer from Standard ; - aSelectionMode : Integer from Standard ; - updateviewer : Boolean from Standard = Standard_True; - allowdecomposition : Boolean from Standard = Standard_True); + Display (me : mutable; + theIObj : InteractiveObject from AIS; + theDispMode : Integer from Standard; + theSelectionMode : Integer from Standard; + theToUpdateViewer : Boolean from Standard = Standard_True; + theToAllowDecomposition : Boolean from Standard = Standard_True; + theDispStatus : DisplayStatus from AIS = AIS_DS_None); ---Purpose: Controls the choice between the using the display -- and selection modes of open local context which you -- have defined and activating those available by default. -- If no Local Context is opened. and the Interactive - -- Object aniobj has no display mode of its own, the - -- default display mode, 0, is used. Likewise, if aniobj + -- Object theIObj has no display mode of its own, the + -- default display mode, 0, is used. Likewise, if theIObj -- has no selection mode of its own, the default one, 0, is used. - -- If a local context is open and if updateviewer equals + -- If a local context is open and if theToUpdateViewer equals -- Standard_False, the presentation of the Interactive -- Object activates the selection mode; the object is -- displayed but no viewer will be updated. - -- If aSelectionMode equals -1, anIobj will not be + -- If theSelectionMode equals -1, theIObj will not be -- activated: it will be displayed but will not be selectable. -- Use this if you want to view the object in open local -- context without selection. Note: This option is only -- available in Local Context. - -- If allowDecomposition equals true, anIObj can have - -- subshapes detected by selection mechanisms. anIObj + -- If theToAllowDecomposition equals true, theIObj can have + -- subshapes detected by selection mechanisms. theIObj -- must be able to give a shape selection modes which -- fit the AIS_Shape selection modes: -- - vertices: 1 @@ -345,22 +346,14 @@ is SetZLayer( me : mutable; theIObj : InteractiveObject from AIS; theLayerId : Integer from Standard ); - ---Purpose: Set Z layer id for interactive object. The layer can be - -- specified for displayed object only. The Z layers can be used to display - -- temporarily presentations of some object in front of the other objects - -- in the scene. The ids for Z layers are generated by V3d_Viewer. - -- Note that Z layers differ from under-/overlayer in V3d_View: - -- under-/overlayer are intended for specific 2D drawings that appear - -- behind/in front of all 3D presentations, while SetZLayer() method - -- applies to regular 3D presentations and does not imply any specific - -- drawing methods. + ---Purpose: Set Z layer id for interactive object. + -- The Z layers can be used to display temporarily presentations of some object in front of the other objects in the scene. + -- The ids for Z layers are generated by V3d_Viewer. GetZLayer( me; theIObj : InteractiveObject from AIS ) returns Integer from Standard; ---Purpose: Get Z layer id set for displayed interactive object. - -- If the object doesn't exists in context or has no computed presentations, - -- the method returns -1. Redisplay(me : mutable; aniobj : InteractiveObject from AIS; diff --git a/src/AIS/AIS_InteractiveContext.cxx b/src/AIS/AIS_InteractiveContext.cxx index b8cb1cb323..f5a00cfb5c 100644 --- a/src/AIS/AIS_InteractiveContext.cxx +++ b/src/AIS/AIS_InteractiveContext.cxx @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -270,8 +271,12 @@ void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_KindOfInteractive { for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next()) { - if (anObjIter.Value()->GraphicStatus() != theStatus - || anObjIter.Key()->Type() != theKind) + if (theStatus != AIS_DS_None + && anObjIter.Value()->GraphicStatus() != theStatus) + { + continue; + } + else if (anObjIter.Key()->Type() != theKind) { continue; } @@ -344,26 +349,43 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO const Standard_Integer theDispMode, const Standard_Integer theSelectionMode, const Standard_Boolean theToUpdateViewer, - const Standard_Boolean theToAllowDecomposition) + const Standard_Boolean theToAllowDecomposition, + const AIS_DisplayStatus theDispStatus) { if (theIObj.IsNull()) { return; } + if (theDispStatus == AIS_DS_Erased) + { + Erase (theIObj, theToUpdateViewer); + Load (theIObj, theSelectionMode, theToAllowDecomposition); + return; + } + if (!theIObj->HasInteractiveContext()) { theIObj->SetContext (this); } - if (HasOpenedContext()) + if (theDispStatus == AIS_DS_Temporary + && !HasOpenedContext()) { - myLocalContexts (myCurLocalIndex)->Display (theIObj, theDispMode, theToAllowDecomposition, theSelectionMode); - if (theToUpdateViewer) + return; + } + else if (HasOpenedContext()) + { + if (theDispStatus == AIS_DS_None + || theDispStatus == AIS_DS_Temporary) { - myMainVwr->Update(); + myLocalContexts (myCurLocalIndex)->Display (theIObj, theDispMode, theToAllowDecomposition, theSelectionMode); + if (theToUpdateViewer) + { + myMainVwr->Update(); + } + return; } - return; } if (!myObjects.IsBound (theIObj)) @@ -383,8 +405,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO else { Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj); - if (aStatus->GraphicStatus() != AIS_DS_Displayed - && aStatus->GraphicStatus() != AIS_DS_Erased) + if (aStatus->GraphicStatus() == AIS_DS_Temporary) { return; } @@ -418,10 +439,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO } myMainPM->Display (theIObj, theDispMode); - if (aStatus->GraphicStatus() == AIS_DS_Erased) - { - aStatus->SetGraphicStatus (AIS_DS_Displayed); - } + aStatus->SetGraphicStatus (AIS_DS_Displayed); if (aStatus->IsHilighted()) { const Standard_Integer aHiMod = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode; @@ -874,14 +892,14 @@ void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject { if(!myObjects.IsBound(anIObj)) return; - const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj); - STATUS->SetHilightStatus (Standard_True); + const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj); + aStatus->SetHilightStatus (Standard_True); - if (STATUS->GraphicStatus() == AIS_DS_Displayed) + if (aStatus->GraphicStatus() == AIS_DS_Displayed) { - Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0; + const Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0; myMainPM->Color (anIObj, aCol, aHilightMode); - STATUS->SetHilightColor (aCol); + aStatus->SetHilightColor (aCol); } } else @@ -904,11 +922,11 @@ void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIO { if(!myObjects.IsBound(anIObj)) return; - const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj); - STATUS->SetHilightStatus (Standard_False); - STATUS->SetHilightColor(Quantity_NOC_WHITE); + const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj); + aStatus->SetHilightStatus (Standard_False); + aStatus->SetHilightColor(Quantity_NOC_WHITE); - if (STATUS->GraphicStatus() == AIS_DS_Displayed) + if (aStatus->GraphicStatus() == AIS_DS_Displayed) { Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0; myMainPM->Unhighlight (anIObj, aHilightMode); @@ -1444,12 +1462,12 @@ void AIS_InteractiveContext::SetDisplayMode (const AIS_DisplayMode theMode, aStatus->AddDisplayMode (theMode); if (aStatus->GraphicStatus() == AIS_DS_Displayed) { - myMainPM->SetVisibility (anObj, myDisplayMode, Standard_False); myMainPM->Display (anObj, theMode); if (aStatus->IsSubIntensityOn()) { myMainPM->Color (anObj, mySubIntensity, theMode); } + myMainPM->SetVisibility (anObj, myDisplayMode, Standard_False); } } @@ -2241,35 +2259,39 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj); - Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0; - if (aStatus->GraphicStatus() == AIS_DS_Displayed) + const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0; + if (aStatus->GraphicStatus() == AIS_DS_Temporary + || aStatus->GraphicStatus() == AIS_DS_Erased) { - for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next()) - { - if (myMainPM->IsHighlighted (theIObj, aDispModeIter.Value())) - { - myMainPM->Unhighlight (theIObj, aDispModeIter.Value()); - } - myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False); - } + return; + } - if (IsCurrent (theIObj) - && !aStatus->IsDModeIn (aDispMode)) + for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next()) + { + if (myMainPM->IsHighlighted (theIObj, aDispModeIter.Value())) { - myMainPM->SetVisibility (theIObj, aDispMode, Standard_False); + myMainPM->Unhighlight (theIObj, aDispModeIter.Value()); } - for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next()) - { - mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel); - } + myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False); + } - if (theToUpdateviewer) - { - myMainVwr->Update(); - } + if (IsCurrent (theIObj) + && !aStatus->IsDModeIn (aDispMode)) + { + myMainPM->SetVisibility (theIObj, aDispMode, Standard_False); + } + + for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next()) + { + mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel); } aStatus->SetGraphicStatus (AIS_DS_Erased); + + if (theToUpdateviewer) + { + myMainVwr->Update(); + } } //======================================================================= @@ -2736,17 +2758,7 @@ void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& the if (theIObj.IsNull()) return; - if (myObjects.IsBound (theIObj)) - { - if (myObjects (theIObj)->GraphicStatus() == AIS_DS_Displayed || myObjects (theIObj)->GraphicStatus() == AIS_DS_Erased) - { - theIObj->SetZLayer (myMainPM, theLayerId); - } - } - else if (HasOpenedContext()) - { - myLocalContexts (myCurLocalIndex)->SetZLayer (theIObj, theLayerId); - } + theIObj->SetZLayer (theLayerId); } //======================================================================= @@ -2755,17 +2767,7 @@ void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& the //======================================================================= Standard_Integer AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const { - if (theIObj.IsNull()) - return -1; - - if (myObjects.IsBound (theIObj)) - { - return theIObj->GetZLayer (myMainPM); - } - else if (HasOpenedContext()) - { - return myLocalContexts (myCurLocalIndex)->GetZLayer (theIObj); - } - - return -1; + return !theIObj.IsNull() + ? theIObj->ZLayer() + : Graphic3d_ZLayerId_UNKNOWN; } diff --git a/src/AIS/AIS_LocalContext.cdl b/src/AIS/AIS_LocalContext.cdl index 1d65dff7a2..bc90fd3e1c 100644 --- a/src/AIS/AIS_LocalContext.cdl +++ b/src/AIS/AIS_LocalContext.cdl @@ -416,26 +416,6 @@ is anObject: InteractiveObject from AIS; Prior : Integer from Standard); - SetZLayer( me : mutable; - theIObj : InteractiveObject from AIS; - theLayerId : Integer from Standard ); - ---Purpose: Set Z layer id for interactive object. The layer can be - -- specified for displayed object only. The Z layers can be used to display - -- temporarily presentations of some object in front of the other objects - -- in the scene. The ids for Z layers are generated by V3d_Viewer. - -- Note that Z layers differ from under-/overlayer in V3d_View: - -- under-/overlayer are intended for specific 2D drawings that appear - -- behind/in front of all 3D presentations, while SetZLayer() method - -- applies to regular 3D presentations and does not imply any specific - -- drawing methods. - - GetZLayer( me; - theIObj : InteractiveObject from AIS ) - returns Integer from Standard; - ---Purpose: Get Z layer id set for displayed interactive object. - -- If the object doesn't exists in context or has no computed presentations, - -- the method returns -1. - DisplayedObjects(me;theMapToFill : in out MapOfTransient from TColStd) returns Integer from Standard; diff --git a/src/AIS/AIS_LocalContext.cxx b/src/AIS/AIS_LocalContext.cxx index bbad8b46d4..7fc6208715 100644 --- a/src/AIS/AIS_LocalContext.cxx +++ b/src/AIS/AIS_LocalContext.cxx @@ -1219,34 +1219,3 @@ Standard_Integer AIS_LocalContext::PixelTolerance() const { return myMainVS->PixelTolerance(); } - -//======================================================================= -//function : SetZLayer -//purpose : -//======================================================================= - -void AIS_LocalContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj, - const Standard_Integer theLayerId) -{ - if (!myActiveObjects.IsBound (theIObj)) - return; - - const Handle(AIS_LocalStatus)& aStatus = myActiveObjects (theIObj); - if (aStatus->DisplayMode () == -1) - return; - - theIObj->SetZLayer (myMainPM, theLayerId); -} - -//======================================================================= -//function : GetZLayer -//purpose : -//======================================================================= - -Standard_Integer AIS_LocalContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const -{ - if (!myActiveObjects.IsBound (theIObj)) - return -1; - - return theIObj->GetZLayer (myMainPM); -} diff --git a/src/Graphic3d/FILES b/src/Graphic3d/FILES index 96a87af006..272a3bd094 100755 --- a/src/Graphic3d/FILES +++ b/src/Graphic3d/FILES @@ -19,7 +19,6 @@ Graphic3d_CBitFields8.hxx Graphic3d_CBitFields4.hxx Graphic3d_CTexture.hxx Graphic3d_CLight.hxx -Graphic3d_CPick.hxx Graphic3d_CUserDraw.hxx Graphic3d_CView.hxx Graphic3d_CGraduatedTrihedron.hxx @@ -35,6 +34,8 @@ Graphic3d_ShaderVariable.lxx Graphic3d_ShaderObject_Handle.hxx Graphic3d_ShaderProgram_Handle.hxx Graphic3d_ShaderVariable_Handle.hxx +Graphic3d_MapOfStructure.hxx +Graphic3d_MapIteratorOfMapOfStructure.hxx Graphic3d_TypeOfShaderObject.hxx Graphic3d_DataStructure.pxx Graphic3d_StructureManager.pxx @@ -53,6 +54,7 @@ Graphic3d_Vec3.hxx Graphic3d_Vec4.hxx Graphic3d_Mat4.hxx Graphic3d_Mat4d.hxx +Graphic3d_ZLayerId.hxx Graphic3d_ZLayerSettings.hxx Graphic3d_Vertex.hxx Graphic3d_Vertex.cxx diff --git a/src/Graphic3d/Graphic3d.cdl b/src/Graphic3d/Graphic3d.cdl index 64ffa52639..5acd620525 100644 --- a/src/Graphic3d/Graphic3d.cdl +++ b/src/Graphic3d/Graphic3d.cdl @@ -388,9 +388,6 @@ is imported CLight; ---Category: Imported types - imported CPick; - ---Category: Imported types - imported CPlane; ---Category: Imported types @@ -428,7 +425,8 @@ is imported Mat4; imported Mat4d; - imported ZLayerSettings; + imported ZLayerSettings; + primitive ZLayerId; -------------------- -- Category: Classes @@ -493,20 +491,15 @@ is imported Vertex; ---Category: Classes + imported MapOfStructure; + imported SequenceOfDisplayedStructures; + --------------------------------- -- Category: Instantiated classes --------------------------------- imported SequenceOfGroup; - ---Category: Instantiated classes - - class MapOfStructure instantiates - Map from TCollection (Structure from Graphic3d,MapTransientHasher from TColStd); - - - ---Category: Instantiated classes - class SequenceOfStructure instantiates Sequence from TCollection (Structure from Graphic3d); diff --git a/src/Graphic3d/Graphic3d_CPick.hxx b/src/Graphic3d/Graphic3d_CPick.hxx deleted file mode 100644 index 7f51502730..0000000000 --- a/src/Graphic3d/Graphic3d_CPick.hxx +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 1999-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 License 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. - -/*============================================================================*/ -/*==== Titre: Graphic3d_CPick.hxx */ -/*==== Role : The header file of primitive type "CPick" from Graphic3d */ -/*==== */ -/*==== Implementation: This is a primitive type implemented with typedef */ -/*============================================================================*/ - -#ifndef _Graphic3d_CPick_HeaderFile -#define _Graphic3d_CPick_HeaderFile - -#include -#include -typedef CALL_DEF_PICK Graphic3d_CPick; - -#endif /*Graphic3d_CPick_HeaderFile*/ diff --git a/src/Graphic3d/Graphic3d_CStructure.cxx b/src/Graphic3d/Graphic3d_CStructure.cxx index 5f71832ada..36343c0c66 100644 --- a/src/Graphic3d/Graphic3d_CStructure.cxx +++ b/src/Graphic3d/Graphic3d_CStructure.cxx @@ -27,6 +27,7 @@ IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_CStructure, Standard_Transient) //============================================================================= Graphic3d_CStructure::Graphic3d_CStructure (const Handle(Graphic3d_StructureManager)& theManager) : Id (theManager->NewIdentification()), + myZLayer (Graphic3d_ZLayerId_Default), Priority (Structure_MAX_PRIORITY / 2), PreviousPriority (Structure_MAX_PRIORITY / 2), Composition (Graphic3d_TOC_REPLACE), @@ -35,7 +36,6 @@ Graphic3d_CStructure::Graphic3d_CStructure (const Handle(Graphic3d_StructureMana stick (0), highlight (0), visible (1), - pick (1), HLRValidation (0), IsForHighlight (Standard_False), IsMutable (Standard_False), diff --git a/src/Graphic3d/Graphic3d_CStructure.hxx b/src/Graphic3d/Graphic3d_CStructure.hxx index 92fd2ff186..d69510b7da 100644 --- a/src/Graphic3d/Graphic3d_CStructure.hxx +++ b/src/Graphic3d/Graphic3d_CStructure.hxx @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -67,10 +68,19 @@ public: return myBndBox; } + //! Return structure visibility flag + bool IsVisible() const { return visible != 0; } + + //! Set z layer ID to display the structure in specified layer + void SetZLayer (const Graphic3d_ZLayerId theLayerIndex) { myZLayer = theLayerIndex; } + + //! Get z layer ID + Graphic3d_ZLayerId ZLayer() const { return myZLayer; } + public: //! Update structure visibility state - virtual void UpdateNamedStatus() = 0; + virtual void OnVisibilityChanged() = 0; //! Clear graphic data virtual void Clear() = 0; @@ -106,9 +116,10 @@ public: public: - int Id; - int Priority; - int PreviousPriority; + int Id; + Graphic3d_ZLayerId myZLayer; + int Priority; + int PreviousPriority; CALL_DEF_CONTEXTLINE ContextLine; CALL_DEF_CONTEXTFILLAREA ContextFillArea; @@ -123,10 +134,9 @@ public: int ContainsFacet; unsigned IsInfinite : 1; - unsigned stick : 1; + unsigned stick : 1; //!< displaying state - should be set when structure has been added to scene graph (but can be in hidden state) unsigned highlight : 1; - unsigned visible : 1; - unsigned pick : 1; + unsigned visible : 1; //!< visibility flag - can be used to suppress structure while leaving it in the scene graph unsigned HLRValidation : 1; unsigned IsForHighlight : 1; unsigned IsMutable : 1; diff --git a/src/Graphic3d/Graphic3d_GraphicDriver.cdl b/src/Graphic3d/Graphic3d_GraphicDriver.cdl index 1145d25b89..eb31bcb699 100644 --- a/src/Graphic3d/Graphic3d_GraphicDriver.cdl +++ b/src/Graphic3d/Graphic3d_GraphicDriver.cdl @@ -50,6 +50,7 @@ uses PrintAlgo from Aspect, DisplayConnection_Handle from Aspect, + ZLayerId from Graphic3d, ZLayerSettings from Graphic3d, AspectLine3d from Graphic3d, @@ -60,7 +61,6 @@ uses CBitFields20 from Graphic3d, Group from Graphic3d, CLight from Graphic3d, - CPick from Graphic3d, CPlane from Graphic3d, CStructure from Graphic3d, CStructure_Handle from Graphic3d, @@ -123,16 +123,16 @@ is -- Category: Structure management methods ----------------------------------------- - DisplayStructure ( me : mutable; - theCView : CView from Graphic3d; - theCStructure : in out CStructure from Graphic3d; - thePriority : Integer from Standard ) + DisplayStructure ( me : mutable; + theCView : CView from Graphic3d; + theStructure : Structure from Graphic3d; + thePriority : Integer from Standard ) is deferred; ---Purpose: call_togl_displaystructure - EraseStructure ( me : mutable; - theCView : CView from Graphic3d; - theCStructure : in out CStructure from Graphic3d ) + EraseStructure ( me : mutable; + theCView : CView from Graphic3d; + theStructure : Structure from Graphic3d ) is deferred; ---Purpose: call_togl_erasestructure @@ -369,9 +369,9 @@ is -- But it works in any case and is especially useful for view dump because the dump image is read from the back buffer. -- @return previous mode. - DisplayImmediateStructure ( me : mutable; - theCView : CView from Graphic3d; - theCStructure : CStructure from Graphic3d ) + DisplayImmediateStructure ( me : mutable; + theCView : CView from Graphic3d; + theStructure : Structure from Graphic3d ) is deferred; ---Purpose: Display structure in immediate mode on top of general presentation @@ -629,7 +629,7 @@ is AddZLayer( me : mutable; theCView : CView from Graphic3d; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is deferred; ---Purpose: Add a new top-level z layer with ID for -- the view. Z layers allow drawing structures in higher layers @@ -639,7 +639,7 @@ is RemoveZLayer( me : mutable; theCView : CView from Graphic3d; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is deferred; ---Purpose: Remove Z layer from the specified view. All structures -- displayed at the moment in layer will be displayed in default layer @@ -647,35 +647,22 @@ is -- structures use method UnsetZLayer (...). UnsetZLayer( me : mutable; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is deferred; ---Purpose: Unset Z layer ID for all structures. The structure -- indexes will be set to default layer ( the bottom-level z layer -- with ID = 0 ). - ChangeZLayer( me : mutable; - theCStructure : CStructure from Graphic3d; - theLayerId : Integer from Standard ) - is deferred; - ---Purpose: Change Z layer of a structure. The new z layer ID will - -- be used to define the associated layer for structure on display. - ChangeZLayer( me : mutable; theCStructure : CStructure from Graphic3d; theCView : CView from Graphic3d; - theNewLayerId : Integer from Standard ) + theNewLayerId : ZLayerId from Graphic3d ) is deferred; ---Purpose: Change Z layer of a structure already presented in view. - GetZLayer( me; - theCStructure : CStructure from Graphic3d ) - returns Integer from Standard is deferred; - ---Purpose: Get Z layer ID of structure. If the structure doesn't - -- exists in graphic driver, the method returns -1. - SetZLayerSettings( me : mutable; theCView : CView from Graphic3d; - theLayerId : Integer from Standard; + theLayerId : ZLayerId from Graphic3d; theSettings : ZLayerSettings from Graphic3d) is deferred; ---Purpose: Sets the settings for a single Z layer of specified view. @@ -700,10 +687,6 @@ is ACLight : CLight from Graphic3d; AField : Integer from Standard ); - PrintCPick ( me; - ACPick : CPick from Graphic3d; - AField : Integer from Standard ); - PrintCStructure ( me; ACStructure : CStructure from Graphic3d; AField : Integer from Standard ); diff --git a/src/Graphic3d/Graphic3d_GraphicDriver.cxx b/src/Graphic3d/Graphic3d_GraphicDriver.cxx index 5e418e5a0b..eaa83ba948 100644 --- a/src/Graphic3d/Graphic3d_GraphicDriver.cxx +++ b/src/Graphic3d/Graphic3d_GraphicDriver.cxx @@ -60,18 +60,6 @@ void Graphic3d_GraphicDriver::PrintCLight (const Graphic3d_CLight& theCLight, } } -void Graphic3d_GraphicDriver::PrintCPick (const Graphic3d_CPick& ACPick, const Standard_Integer AField) const { - - if (AField) { - cout << "\tws id " << ACPick.WsId - << " view id " << ACPick.ViewId << "\n"; - cout << "\twindow id " << ACPick.DefWindow.XWindow << "\n"; - cout << "\tposition " << ACPick.x << " , " << ACPick.y << "\n"; - cout << flush; - } - -} - void Graphic3d_GraphicDriver::PrintCStructure (const Graphic3d_CStructure& ACStructure, const Standard_Integer AField) const { if (AField) { diff --git a/src/Graphic3d/Graphic3d_MapIteratorOfMapOfStructure.hxx b/src/Graphic3d/Graphic3d_MapIteratorOfMapOfStructure.hxx new file mode 100644 index 0000000000..65368a5ad1 --- /dev/null +++ b/src/Graphic3d/Graphic3d_MapIteratorOfMapOfStructure.hxx @@ -0,0 +1,23 @@ +// Created on: 2014-12-18 +// Created by: Kirill Gavrilov +// 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 License 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_MapIteratorOfMapOfStructure +#define _Graphic3d_MapIteratorOfMapOfStructure + +#include + +typedef Graphic3d_MapOfStructure::Iterator Graphic3d_MapIteratorOfMapOfStructure; + +#endif // _Graphic3d_MapIteratorOfMapOfStructure diff --git a/src/Graphic3d/Graphic3d_MapOfStructure.hxx b/src/Graphic3d/Graphic3d_MapOfStructure.hxx new file mode 100644 index 0000000000..6c8b230137 --- /dev/null +++ b/src/Graphic3d/Graphic3d_MapOfStructure.hxx @@ -0,0 +1,24 @@ +// Created on: 2014-12-18 +// Created by: Kirill Gavrilov +// 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 License 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_MapOfStructure +#define _Graphic3d_MapOfStructure + +#include +#include + +typedef NCollection_Map Graphic3d_MapOfStructure; + +#endif // _Graphic3d_MapOfStructure diff --git a/src/Graphic3d/Graphic3d_Structure.cdl b/src/Graphic3d/Graphic3d_Structure.cdl index 46e1f86142..194e568e7d 100644 --- a/src/Graphic3d/Graphic3d_Structure.cdl +++ b/src/Graphic3d/Graphic3d_Structure.cdl @@ -70,6 +70,7 @@ uses Vector from Graphic3d, Vertex from Graphic3d, TransModeFlags from Graphic3d, + ZLayerId from Graphic3d, Pnt from gp, SequenceOfHClipPlane from Graphic3d, BndBox4f from Graphic3d, @@ -149,31 +150,10 @@ is ---Category: Methods to modify the class definition ---C++: alias ~ - Display ( me : mutable ) - is virtual; - ---Level: Public - ---Purpose: Displays the structure in all the views of - -- the visualiser. - ---Category: Methods to modify the class definition - - Display ( me : mutable; - Priority : Integer from Standard ) - ---Level: Public - ---Purpose: Displays the structure in all the views of - -- the visualiser, while modifying its current priority. - -- Note: Display Priorities - -- Structure display priorities control the order in which - -- structures are redrawn. When you display a - -- structure, you specify its priority. The lower the value, - -- the lower the display priority. When the display is - -- regenerated, the structures with the lowest priority - -- are drawn first. For structures with the same display - -- priority, the order in which they were displayed - -- determines the drawing order. Open CASCADE - -- supports 11 structure display priorities, 0 to 10. - -- Warning: Raises PriorityDefinitionError if is - -- greater than 10 or a negative value. - raises PriorityDefinitionError from Graphic3d is static; + Display ( me : mutable ) + is virtual; + ---Level: Public + ---Purpose: Displays the structure in all the views of the visualiser. DisplayPriority ( me ) returns Integer from Standard @@ -190,20 +170,15 @@ is -- of the visualiser. ---Category: Methods to modify the class definition - Highlight ( me : mutable; - Method : TypeOfHighlightMethod from Aspect ) + Highlight ( me : mutable; + theMethod : TypeOfHighlightMethod from Aspect; + theColor : Color from Quantity; + theToUpdateMgr : Boolean from Standard = Standard_True) is static; ---Level: Public - ---Purpose: Highlights the structure in all the - -- views of the visualiser, using the following methods: - -- - -- TOHM_COLOR = drawn in the highlight color - -- (default white) - -- TOHM_BLINK = blinking - -- TOHM_BOUNDBOX = enclosed by the boundary box - -- (default white) - -- - ---Category: Methods to modify the class definition + ---Purpose: Highlights the structure in all the views of the visualiser, using the following methods: + -- TOHM_COLOR = drawn in the highlight color + -- TOHM_BOUNDBOX = enclosed by the boundary box Remove ( me : mutable ) is static; @@ -219,14 +194,6 @@ is ---Purpose: Computes axis-aligned bounding box of a structure. -- Category: Methods to modify the class definition - SetHighlightColor ( me : mutable; - AColor : Color from Quantity ) - is static; - ---Level: Public - ---Purpose: Modifies the highlight color for the Highlight method - -- with the highlight method TOHM_COLOR or TOHM_BOUNDBOX. - ---Category: Methods to modify the class definition - SetInfiniteState (me : mutable; theToSet : Boolean from Standard) is static; ---Level: Internal ---Purpose: If is Standard_True then is infinite and @@ -264,7 +231,7 @@ is -- previous priority. SetZLayer ( me : mutable; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is static; ---Purpose: Set Z layer ID for the structure. The Z layer mechanism -- allows to display structures presented in higher layers in overlay @@ -272,7 +239,7 @@ is -- test between layers GetZLayer ( me ) - returns Integer from Standard is static; + returns ZLayerId from Graphic3d is static; ---Purpose: Get Z layer ID of displayed structure. The method -- returns -1 if the structure has no ID (deleted from graphic driver). @@ -285,16 +252,6 @@ is ---Purpose: Get clip planes slicing the structure on rendering. -- @return set of clip planes. - SetPick ( me : mutable; - AValue : Boolean from Standard ) - is static; - ---Level: Public - ---Purpose: Modifies the detectability indicator to Standard_True - -- or Standard_False for the structure . - -- The default value at the definition of is - -- Standard_True. - ---Category: Methods to modify the class definition - SetPrimitivesAspect ( me : mutable; CTX : AspectLine3d from Graphic3d ) is static; @@ -532,13 +489,6 @@ is ---Purpose: Returns the highlight indicator for the structure . ---Category: Inquire methods - IsSelectable ( me ) - returns Boolean from Standard - is static; - ---Level: Public - ---Purpose: Returns the detectability indicator for the structure . - ---Category: Inquire methods - IsRotated ( me ) returns Boolean from Standard is static; diff --git a/src/Graphic3d/Graphic3d_Structure.cxx b/src/Graphic3d/Graphic3d_Structure.cxx index 92a42502f9..1929d1b00e 100644 --- a/src/Graphic3d/Graphic3d_Structure.cxx +++ b/src/Graphic3d/Graphic3d_Structure.cxx @@ -203,7 +203,11 @@ void Graphic3d_Structure::Display() myStructureManager->Display (this); } - myCStructure->visible = 1; + if (myCStructure->visible != 1) + { + myCStructure->visible = 1; + myCStructure->OnVisibilityChanged(); + } } //============================================================================= @@ -215,25 +219,6 @@ void Graphic3d_Structure::SetIsForHighlight (const Standard_Boolean isForHighlig myCStructure->IsForHighlight = isForHighlight; } -//============================================================================= -//function : Display -//purpose : -//============================================================================= -void Graphic3d_Structure::Display (const Standard_Integer thePriority) -{ - if (IsDeleted()) return; - - SetDisplayPriority (thePriority); - - if (!myCStructure->stick) - { - myCStructure->stick = 1; - myStructureManager->Display (this); - } - - myCStructure->visible = 1; -} - //============================================================================= //function : SetDisplayPriority //purpose : @@ -312,13 +297,17 @@ void Graphic3d_Structure::Erase() //function : Highlight //purpose : //============================================================================= -void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMethod) +void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMethod, + const Quantity_Color& theColor, + const Standard_Boolean theToUpdateMgr) { if (IsDeleted()) { return; } + myHighlightColor = theColor; + // Highlight on already Highlighted structure. if (myCStructure->highlight) { @@ -340,47 +329,18 @@ void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMetho SetDisplayPriority (Structure_MAX_PRIORITY - 1); GraphicHighlight (theMethod); - if (myCStructure->stick) - { - myStructureManager->Highlight (this, theMethod); - } - Update(); -} - -//============================================================================= -//function : SetHighlightColor -//purpose : -//============================================================================= -void Graphic3d_Structure::SetHighlightColor (const Quantity_Color& theColor) -{ - if (IsDeleted()) + if (!theToUpdateMgr) { return; } - if (!myCStructure->highlight) + if (myCStructure->stick) { - myHighlightColor = theColor; - return; + myStructureManager->Highlight (this, theMethod); } - // Change highlight color on already Highlighted structure. - Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode(); - if (anUpdateMode == Aspect_TOU_WAIT) - { - UnHighlight(); - } - else - { - // To avoid call of method : Update() - // Not useful and can be costly. - myStructureManager->SetUpdateMode (Aspect_TOU_WAIT); - UnHighlight(); - myStructureManager->SetUpdateMode (anUpdateMode); - } - myHighlightColor = theColor; - Highlight (myHighlightMethod); + Update(); } //============================================================================= @@ -391,30 +351,14 @@ void Graphic3d_Structure::SetVisible (const Standard_Boolean theValue) { if (IsDeleted()) return; - myCStructure->visible = theValue ? 1 : 0; - myCStructure->UpdateNamedStatus(); - Update(); -} - -//============================================================================= -//function : SetPick -//purpose : -//============================================================================= -void Graphic3d_Structure::SetPick (const Standard_Boolean theValue) -{ - if (IsDeleted ()) return; - - myCStructure->pick = theValue ? 1 : 0; - myCStructure->UpdateNamedStatus(); - - if (theValue) + const unsigned isVisible = theValue ? 1 : 0; + if (myCStructure->visible == isVisible) { - myStructureManager->Detectable (this); - } - else - { - myStructureManager->Undetectable (this); + return; } + + myCStructure->visible = isVisible; + myCStructure->OnVisibilityChanged(); Update(); } @@ -474,15 +418,6 @@ Standard_Boolean Graphic3d_Structure::IsHighlighted() const return myCStructure->highlight ? Standard_True : Standard_False; } -//============================================================================= -//function : IsSelectable -//purpose : -//============================================================================= -Standard_Boolean Graphic3d_Structure::IsSelectable() const -{ - return myCStructure->pick ? Standard_True : Standard_False; -} - //============================================================================= //function : IsVisible //purpose : @@ -2281,7 +2216,6 @@ void Graphic3d_Structure::GraphicHighlight (const Aspect_TypeOfHighlightMethod t { myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB); myCStructure->HighlightWithColor (Graphic3d_Vec3 (float (anRGB[0]), float (anRGB[1]), float (anRGB[2])), Standard_True); - myCStructure->UpdateNamedStatus(); break; } case Aspect_TOHM_BOUNDBOX: @@ -2323,11 +2257,9 @@ void Graphic3d_Structure::GraphicUnHighlight() { case Aspect_TOHM_COLOR: myCStructure->HighlightWithColor (Graphic3d_Vec3 (0.0f, 0.0f, 0.0f), Standard_False); - myCStructure->UpdateNamedStatus(); break; case Aspect_TOHM_BOUNDBOX: myCStructure->HighlightWithBndBox (this, Standard_False); - myCStructure->UpdateNamedStatus(); break; } } @@ -2381,22 +2313,23 @@ Standard_Boolean Graphic3d_Structure::HLRValidation() const //function : SetZLayer //purpose : //======================================================================= -void Graphic3d_Structure::SetZLayer (const Standard_Integer theLayerId) +void Graphic3d_Structure::SetZLayer (const Graphic3d_ZLayerId theLayerId) { // if the structure is not displayed, unable to change its display layer if (IsDeleted ()) return; myStructureManager->ChangeZLayer (this, theLayerId); + myCStructure->SetZLayer (theLayerId); } //======================================================================= //function : GetZLayer //purpose : //======================================================================= -Standard_Integer Graphic3d_Structure::GetZLayer () const +Graphic3d_ZLayerId Graphic3d_Structure::GetZLayer() const { - return myStructureManager->GetZLayer (this); + return myCStructure->ZLayer(); } //======================================================================= diff --git a/src/Graphic3d/Graphic3d_StructureManager.cdl b/src/Graphic3d/Graphic3d_StructureManager.cdl index f800563d4e..14516cfe81 100644 --- a/src/Graphic3d/Graphic3d_StructureManager.cdl +++ b/src/Graphic3d/Graphic3d_StructureManager.cdl @@ -26,7 +26,7 @@ deferred class StructureManager from Graphic3d inherits TShared -- It allows them to be globally manipulated. -- It defines the global attributes. -- Keywords: Structure, Structure Manager, Update Mode, - -- Destroy, Highlight, Visible, Detectable + -- Destroy, Highlight, Visible ---Warning: ---References: @@ -40,6 +40,7 @@ uses TypeOfHighlightMethod from Aspect, TypeOfUpdate from Aspect, + ZLayerId from Graphic3d, ZLayerSettings from Graphic3d, DataStructureManager from Graphic3d, @@ -193,13 +194,6 @@ is -- in a visualiser . ---Category: Inquire methods, MapOfStructure - PickStructures ( me; SG: in out MapOfStructure from Graphic3d ) - is static; - ---Level: Internal - ---Purpose: Returns the set of detectable structures - -- in a visualiser . - ---Category: Inquire methods, MapOfStructure - ---------------------------- -- Category: Inquire methods ---------------------------- @@ -274,31 +268,25 @@ is ChangeZLayer ( me : mutable; theStructure : Structure from Graphic3d; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is deferred; ---Purpose: Change Z layer for structure. The z layer mechanism allows -- to display structures in higher layers in overlay of structures in -- lower layers. - GetZLayer ( me; - theStructure : Structure from Graphic3d ) - returns Integer from Standard is deferred; - ---Purpose: Get Z layer ID assigned to structure. If the structure - -- has no layer ID (deleted from graphic driver), the method returns -1. - SetZLayerSettings ( me : mutable; - theLayerId : Integer from Standard; + theLayerId : ZLayerId from Graphic3d; 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 ) + theLayerId : ZLayerId from Graphic3d ) returns ZLayerSettings from Graphic3d is deferred; ---Purpose: Returns the settings of a single Z layer. AddZLayer ( me : mutable; - theLayerId : in out Integer from Standard ) + theLayerId : out ZLayerId from Graphic3d ) returns Boolean from Standard is deferred; ---Purpose: Add a new top-level Z layer and get its ID as -- value. The method returns Standard_False if the layer @@ -306,7 +294,7 @@ is -- structures in higher layers in overlay of structures in lower layers. RemoveZLayer ( me : mutable; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) returns Boolean from Standard is deferred; ---Purpose: Remove Z layer with ID . Method returns -- Standard_False if the layer can not be removed or doesn't exists. @@ -343,13 +331,6 @@ is -- if is displayed in and TOS_COMPUTED. ---Category: Private methods - Detectable ( me : mutable; - AStructure : Structure from Graphic3d ) - is static private; - ---Level: Internal - ---Purpose: Sets detectable the structure . - ---Category: Private methods - Clear ( me : mutable; AStructure : Structure from Graphic3d; WithDestruction : Boolean from Standard ) @@ -441,13 +422,6 @@ is ---Purpose: Frees the identifieur . ---Category: Private methods - Undetectable ( me : mutable; - AStructure : Structure from Graphic3d ) - is static private; - ---Level: Internal - ---Purpose: Sets no detectable the structure . - ---Category: Private methods - UnHighlight ( me : mutable ) is deferred; ---Level: Internal @@ -504,10 +478,6 @@ fields MyHighlightedStructure : MapOfStructure from Graphic3d is protected; - -- the pickable structures - MyPickStructure : MapOfStructure from Graphic3d - is protected; - -- the structure identifier generator MyStructGenId : GenId from Aspect is protected; diff --git a/src/Graphic3d/Graphic3d_StructureManager.cxx b/src/Graphic3d/Graphic3d_StructureManager.cxx index 8c7a92b364..02abb50559 100644 --- a/src/Graphic3d/Graphic3d_StructureManager.cxx +++ b/src/Graphic3d/Graphic3d_StructureManager.cxx @@ -39,40 +39,8 @@ static Standard_Integer StructureManager_CurrentId = 0; #include #include -//-Aliases - -//-Global data definitions - -// -- l'identifieur du manager -// MyId : Standard_Integer; - -// -- le mode de mise a jour de l'affichage -// MyUpdateMode : TypeOfUpdate; - -// -- les differents contextes de primitives -// MyAspectLine3d : AspectLine3d; -// MyAspectText3d : AspectText3d; -// MyAspectMarker3d : AspectMarker3d; -// MyAspectFillArea3d : AspectFillArea3d; - -// -- les structures affichees -// MyDisplayedStructure : SequenceOfStructure; - -// -- les structures mises en evidence -// MyHighlightedStructure : SequenceOfStructure; - -// -- les structures detectables -// MyPickStructure : SequenceOfStructure; - -// -- le generateur d'identificateurs de structures -// MyStructGenId : GenId; - -//-Constructors - -Graphic3d_StructureManager::Graphic3d_StructureManager (const Handle(Graphic3d_GraphicDriver)& theDriver): -MyDisplayedStructure (), -MyHighlightedStructure (), -MyPickStructure () { +Graphic3d_StructureManager::Graphic3d_StructureManager (const Handle(Graphic3d_GraphicDriver)& theDriver) +{ Standard_Real Coef; Standard_Integer i; @@ -136,7 +104,6 @@ void Graphic3d_StructureManager::Destroy () { MyDisplayedStructure.Clear (); MyHighlightedStructure.Clear (); - MyPickStructure.Clear (); StructureManager_ArrayId[MyId] = 0; } @@ -222,18 +189,6 @@ void Graphic3d_StructureManager::Remove (const Standard_Integer AnId) { } -void Graphic3d_StructureManager::Detectable (const Handle(Graphic3d_Structure)& AStructure) { - - MyPickStructure.Add(AStructure); - -} - -void Graphic3d_StructureManager::Undetectable (const Handle(Graphic3d_Structure)& AStructure) { - - MyPickStructure.Remove(AStructure); - -} - void Graphic3d_StructureManager::DisplayedStructures (Graphic3d_MapOfStructure& SG) const { SG.Assign(MyDisplayedStructure); @@ -265,12 +220,6 @@ void Graphic3d_StructureManager::HighlightedStructures (Graphic3d_MapOfStructure } -void Graphic3d_StructureManager::PickStructures (Graphic3d_MapOfStructure& SG) const { - - SG.Assign(MyPickStructure); - -} - Standard_Integer Graphic3d_StructureManager::NewIdentification () { Standard_Integer Id = MyStructGenId.Next (); diff --git a/src/Graphic3d/Graphic3d_ZLayerId.hxx b/src/Graphic3d/Graphic3d_ZLayerId.hxx new file mode 100644 index 0000000000..8eb3528f96 --- /dev/null +++ b/src/Graphic3d/Graphic3d_ZLayerId.hxx @@ -0,0 +1,33 @@ +// Created on: 2014-12-30 +// Created by: Kirill Gavrilov +// 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 License 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_ZLayerId_HeaderFile +#define _Graphic3d_ZLayerId_HeaderFile + +typedef Standard_Integer Graphic3d_ZLayerId; + +//! This enumeration defines the list of predefined layers, which can not be removed (but settings can be overridden). +//! Custom layers might be added with positive index (>= 1) if standard list is insufficient for application needs; +//! these layers will be displayed on top of predefined ones. +enum +{ + Graphic3d_ZLayerId_UNKNOWN = -1, //!< identifier for invalid ZLayer + Graphic3d_ZLayerId_Default = 0, //!< default Z-layer for main presentations + Graphic3d_ZLayerId_Top = -2, //!< overlay for 3D presentations which inherits Depth from previous ZLayer + Graphic3d_ZLayerId_Topmost = -3, //!< overlay for 3D presentations with independent Depth + Graphic3d_ZLayerId_TopOSD = -4 //!< overlay for 2D presentations (On-Screen-Display) +}; + +#endif // _Graphic3d_ZLayerId_HeaderFile diff --git a/src/Graphic3d/Graphic3d_ZLayerSettings.hxx b/src/Graphic3d/Graphic3d_ZLayerSettings.hxx index 4c3266c593..4bb963a157 100644 --- a/src/Graphic3d/Graphic3d_ZLayerSettings.hxx +++ b/src/Graphic3d/Graphic3d_ZLayerSettings.hxx @@ -24,14 +24,18 @@ enum Graphic3d_ZLayerSetting Graphic3d_ZLayerDepthOffset = 8 }; +//! Structure defines list of ZLayer properties. struct Graphic3d_ZLayerSettings { + + //! Default settings. Graphic3d_ZLayerSettings() : DepthOffsetFactor (1.0f), DepthOffsetUnits (1.0f), Flags (Graphic3d_ZLayerDepthTest | Graphic3d_ZLayerDepthWrite - | Graphic3d_ZLayerDepthClear) + | Graphic3d_ZLayerDepthClear), + IsImmediate (false) {} //! Returns true if theSetting is enabled. @@ -70,10 +74,13 @@ struct Graphic3d_ZLayerSettings EnableSetting (Graphic3d_ZLayerDepthOffset); } - Standard_ShortReal DepthOffsetFactor; //!< Factor argument value for OpenGl glPolygonOffset function. - Standard_ShortReal DepthOffsetUnits; //!< Units argument value for OpenGl glPolygonOffset function. +public: + + 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 + bool IsImmediate; //!< immediate layer will be drawn after all normal layers - Standard_Integer Flags; //!< Storage field for settings. }; #endif // _Graphic3d_ZLayerSettings_HeaderFile diff --git a/src/InterfaceGraphic/InterfaceGraphic_Visual3d.hxx b/src/InterfaceGraphic/InterfaceGraphic_Visual3d.hxx index 6cac4a09f0..240a8fe8c2 100644 --- a/src/InterfaceGraphic/InterfaceGraphic_Visual3d.hxx +++ b/src/InterfaceGraphic/InterfaceGraphic_Visual3d.hxx @@ -71,30 +71,4 @@ typedef struct { } CALL_DEF_VIEWMAPPING; -/* REPERAGE */ - -typedef struct { - - int WsId; - int ViewId; - - int x, y; - - CALL_DEF_WINDOW DefWindow; - - struct { - float aperture; - int order; - int depth; - } Context; - - struct { - int depth; - int *listid; - int *listpickid; - int *listelem; - } Pick; - -} CALL_DEF_PICK; - #endif /* InterfaceGraphic_Visual3dHeader */ diff --git a/src/OpenGl/FILES b/src/OpenGl/FILES index 77f0948000..be3e8c3388 100755 --- a/src/OpenGl/FILES +++ b/src/OpenGl/FILES @@ -60,8 +60,6 @@ Handle_OpenGl_Window.hxx OpenGl_Window.hxx OpenGl_Window.cxx OpenGl_Window_1.mm -OpenGl_PriorityList.hxx -OpenGl_PriorityList.cxx OpenGl_AVIWriter.hxx OpenGl_AVIWriter.cxx OpenGl_FrameBuffer.hxx @@ -141,6 +139,7 @@ OpenGl_ShaderManager.hxx OpenGl_ShaderManager.cxx OpenGl_ShaderStates.hxx OpenGl_ShaderStates.cxx +OpenGl_SequenceOfStructure.hxx Handle_OpenGl_ShaderObject.hxx Handle_OpenGl_ShaderProgram.hxx Handle_OpenGl_ShaderManager.hxx diff --git a/src/OpenGl/OpenGl_BVHClipPrimitiveSet.cxx b/src/OpenGl/OpenGl_BVHClipPrimitiveSet.cxx index 4f3b9e83a9..cda8413d10 100644 --- a/src/OpenGl/OpenGl_BVHClipPrimitiveSet.cxx +++ b/src/OpenGl/OpenGl_BVHClipPrimitiveSet.cxx @@ -81,11 +81,9 @@ void OpenGl_BVHClipPrimitiveSet::Assign (const OpenGl_ArrayOfStructure& theStruc myStructs.Clear(); const Standard_Integer aNbPriorities = theStructs.Length(); - OpenGl_SequenceOfStructure::Iterator aStructIter; for (Standard_Integer aPriorityIdx = 0; aPriorityIdx < aNbPriorities; ++aPriorityIdx) { - const OpenGl_SequenceOfStructure& aSeq = theStructs (aPriorityIdx); - for (aStructIter.Init (aSeq); aStructIter.More(); aStructIter.Next()) + for (OpenGl_SequenceOfStructure::Iterator aStructIter (theStructs (aPriorityIdx)); aStructIter.More(); aStructIter.Next()) { const OpenGl_Structure* aStruct = aStructIter.Value(); if (!aStruct->IsAlwaysRendered()) diff --git a/src/OpenGl/OpenGl_BVHClipPrimitiveSet.hxx b/src/OpenGl/OpenGl_BVHClipPrimitiveSet.hxx index 9a5c18a2fe..bf3b607f4e 100644 --- a/src/OpenGl/OpenGl_BVHClipPrimitiveSet.hxx +++ b/src/OpenGl/OpenGl_BVHClipPrimitiveSet.hxx @@ -17,14 +17,12 @@ #define _OpenGl_BVHClipPrimitiveSet_HeaderFile #include - #include -#include #include #include +#include -typedef NCollection_Sequence OpenGl_SequenceOfStructure; typedef NCollection_Array1 OpenGl_ArrayOfStructure; //! Set of OpenGl_Structures for building BVH tree. diff --git a/src/OpenGl/OpenGl_GraphicDriver.cxx b/src/OpenGl/OpenGl_GraphicDriver.cxx index 574c82e441..82010a1304 100644 --- a/src/OpenGl/OpenGl_GraphicDriver.cxx +++ b/src/OpenGl/OpenGl_GraphicDriver.cxx @@ -419,17 +419,16 @@ Standard_Boolean OpenGl_GraphicDriver::SetImmediateModeDrawToFront (const Graphi // function : DisplayImmediateStructure // purpose : // ======================================================================= -void OpenGl_GraphicDriver::DisplayImmediateStructure (const Graphic3d_CView& theCView, - const Graphic3d_CStructure& theCStructure) +void OpenGl_GraphicDriver::DisplayImmediateStructure (const Graphic3d_CView& theCView, + const Handle(Graphic3d_Structure)& theStructure) { - OpenGl_CView* aCView = (OpenGl_CView* )theCView.ptrView; - OpenGl_Structure* aStructure = (OpenGl_Structure* )&theCStructure; + OpenGl_CView* aCView = (OpenGl_CView* )theCView.ptrView; if (aCView == NULL) { return; } - aCView->View->DisplayImmediateStructure (aStructure); + aCView->View->DisplayImmediateStructure (theStructure); } // ======================================================================= diff --git a/src/OpenGl/OpenGl_GraphicDriver.hxx b/src/OpenGl/OpenGl_GraphicDriver.hxx index 7eb94c14cd..6eb10a146b 100644 --- a/src/OpenGl/OpenGl_GraphicDriver.hxx +++ b/src/OpenGl/OpenGl_GraphicDriver.hxx @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -122,18 +121,18 @@ public: public: // Methods for graphical structures - Standard_EXPORT void DisplayStructure (const Graphic3d_CView& theCView, - Graphic3d_CStructure& theCStructure, - const Standard_Integer thePriority); - Standard_EXPORT void EraseStructure (const Graphic3d_CView& theCView, - Graphic3d_CStructure& theCStructure); + Standard_EXPORT void DisplayStructure (const Graphic3d_CView& theCView, + const Handle(Graphic3d_Structure)& theStructure, + const Standard_Integer thePriority); + Standard_EXPORT void EraseStructure (const Graphic3d_CView& theCView, + const Handle(Graphic3d_Structure)& theStructure); Standard_EXPORT void RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure); Standard_EXPORT Handle(Graphic3d_CStructure) Structure (const Handle(Graphic3d_StructureManager)& theManager); Standard_EXPORT Standard_Boolean SetImmediateModeDrawToFront (const Graphic3d_CView& theCView, const Standard_Boolean theDrawToFrontBuffer); - Standard_EXPORT void DisplayImmediateStructure (const Graphic3d_CView& theCView, - const Graphic3d_CStructure& theCStructure); + Standard_EXPORT void DisplayImmediateStructure (const Graphic3d_CView& theCView, + const Handle(Graphic3d_Structure)& theStructure); Standard_EXPORT void EraseImmediateStructure (const Graphic3d_CView& theCView, const Graphic3d_CStructure& theCStructure); @@ -259,39 +258,29 @@ public: //! Add a new top-level z layer with ID theLayerId for the view. Z layers allow drawing structures in higher layers in foreground of structures in lower layers. //! To add a structure to desired layer on display it is necessary to set the layer index for the structure. - Standard_EXPORT void AddZLayer (const Graphic3d_CView& theCView, - const Standard_Integer theLayerId); + Standard_EXPORT void AddZLayer (const Graphic3d_CView& theCView, + const Graphic3d_ZLayerId theLayerId); //! Remove Z layer from the specified view. //! All structures displayed at the moment in layer will be displayed in default layer (the bottom-level z layer). //! To unset layer index from associated structures use method UnsetZLayer (...). - Standard_EXPORT void RemoveZLayer (const Graphic3d_CView& theCView, - const Standard_Integer theLayerId); + Standard_EXPORT void RemoveZLayer (const Graphic3d_CView& theCView, + const Graphic3d_ZLayerId theLayerId); //! Unset Z layer ID for all structures. //! The structure indexes will be set to default layer (the bottom-level z layer with ID = 0). - Standard_EXPORT void UnsetZLayer (const Standard_Integer theLayerId); - - //! Change Z layer of a structure. - //! The new z layer ID will be used to define the associated layer for structure on display. - //! It is recommended to take care of redisplaying the structures already presented in view with previously set layer index. - //! This is usually done by viewer manager. Z layers allow drawing structures in higher layers in foreground of structures in lower layers. - Standard_EXPORT void ChangeZLayer (const Graphic3d_CStructure& theCStructure, - const Standard_Integer theLayerId); + Standard_EXPORT void UnsetZLayer (const Graphic3d_ZLayerId theLayerId); //! Change Z layer of a structure already presented in view. //! It is recommended to update z layer of already displayed structures with this method before setting new z layer index to the structure. //! This is usually done by viewer manager. Standard_EXPORT void ChangeZLayer (const Graphic3d_CStructure& theCStructure, const Graphic3d_CView& theCView, - const Standard_Integer theNewLayerId); - - //! 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; + const Graphic3d_ZLayerId theNewLayerId); //! Sets the settings for a single Z layer of specified view. - Standard_EXPORT void SetZLayerSettings (const Graphic3d_CView& theCView, - const Standard_Integer theLayerId, + Standard_EXPORT void SetZLayerSettings (const Graphic3d_CView& theCView, + const Graphic3d_ZLayerId theLayerId, const Graphic3d_ZLayerSettings& theSettings); //! Changes priority of a structure within its Z layer for the specified view. diff --git a/src/OpenGl/OpenGl_GraphicDriver_4.cxx b/src/OpenGl/OpenGl_GraphicDriver_4.cxx index 5e6a01514a..cc021b0655 100644 --- a/src/OpenGl/OpenGl_GraphicDriver_4.cxx +++ b/src/OpenGl/OpenGl_GraphicDriver_4.cxx @@ -19,27 +19,25 @@ #include #include -void OpenGl_GraphicDriver::DisplayStructure (const Graphic3d_CView& theCView, - Graphic3d_CStructure& theCStructure, - const Standard_Integer thePriority) +void OpenGl_GraphicDriver::DisplayStructure (const Graphic3d_CView& theCView, + const Handle(Graphic3d_Structure)& theStructure, + const Standard_Integer thePriority) { - const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView; - OpenGl_Structure* aStructure = (OpenGl_Structure* )&theCStructure; + const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView; if (aCView == NULL) return; - aCView->View->DisplayStructure (aStructure, thePriority); + aCView->View->DisplayStructure (theStructure, thePriority); } -void OpenGl_GraphicDriver::EraseStructure (const Graphic3d_CView& theCView, - Graphic3d_CStructure& theCStructure) +void OpenGl_GraphicDriver::EraseStructure (const Graphic3d_CView& theCView, + const Handle(Graphic3d_Structure)& theStructure) { - const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView; - OpenGl_Structure* aStructure = (OpenGl_Structure* )&theCStructure; - if (aCView == NULL || aStructure == NULL) + const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView; + if (aCView == NULL) return; - aCView->View->EraseStructure (aStructure); + aCView->View->EraseStructure (theStructure); } void OpenGl_GraphicDriver::RemoveStructure (Handle(Graphic3d_CStructure)& theCStructure) @@ -68,24 +66,8 @@ Handle(Graphic3d_CStructure) OpenGl_GraphicDriver::Structure (const Handle(Graph //======================================================================= void OpenGl_GraphicDriver::ChangeZLayer (const Graphic3d_CStructure& theCStructure, - const Standard_Integer theLayer) -{ - if (!myMapOfStructure.IsBound (theCStructure.Id)) - return; - - OpenGl_Structure* aStructure = myMapOfStructure.Find (theCStructure.Id); - - aStructure->SetZLayer (theLayer); -} - -//======================================================================= -//function : ChangeZLayer -//purpose : -//======================================================================= - -void OpenGl_GraphicDriver::ChangeZLayer (const Graphic3d_CStructure& theCStructure, - const Graphic3d_CView& theCView, - const Standard_Integer theNewLayerId) + const Graphic3d_CView& theCView, + const Graphic3d_ZLayerId theNewLayerId) { const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView; @@ -97,34 +79,19 @@ void OpenGl_GraphicDriver::ChangeZLayer (const Graphic3d_CStructure& theCStructu aCView->View->ChangeZLayer (aStructure, theNewLayerId); } -//======================================================================= -//function : GetZLayer -//purpose : -//======================================================================= - -Standard_Integer OpenGl_GraphicDriver::GetZLayer (const Graphic3d_CStructure& theCStructure) const -{ - if (!myMapOfStructure.IsBound (theCStructure.Id)) - return -1; - - OpenGl_Structure* aStructure = myMapOfStructure.Find (theCStructure.Id); - - return aStructure->GetZLayer(); -} - //======================================================================= //function : UnsetZLayer //purpose : //======================================================================= -void OpenGl_GraphicDriver::UnsetZLayer (const Standard_Integer theLayerId) +void OpenGl_GraphicDriver::UnsetZLayer (const Graphic3d_ZLayerId theLayerId) { NCollection_DataMap::Iterator aStructIt (myMapOfStructure); for( ; aStructIt.More (); aStructIt.Next ()) { OpenGl_Structure* aStruct = aStructIt.ChangeValue (); - if (aStruct->GetZLayer () == theLayerId) - aStruct->SetZLayer (0); + if (aStruct->ZLayer() == theLayerId) + aStruct->SetZLayer (Graphic3d_ZLayerId_Default); } } @@ -133,8 +100,8 @@ void OpenGl_GraphicDriver::UnsetZLayer (const Standard_Integer theLayerId) //purpose : //======================================================================= void OpenGl_GraphicDriver::ChangePriority (const Graphic3d_CStructure& theCStructure, - const Graphic3d_CView& theCView, - const Standard_Integer theNewPriority) + const Graphic3d_CView& theCView, + const Standard_Integer theNewPriority) { const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView; diff --git a/src/OpenGl/OpenGl_GraphicDriver_7.cxx b/src/OpenGl/OpenGl_GraphicDriver_7.cxx index 6340198045..24dae48e52 100644 --- a/src/OpenGl/OpenGl_GraphicDriver_7.cxx +++ b/src/OpenGl/OpenGl_GraphicDriver_7.cxx @@ -543,8 +543,8 @@ void OpenGl_GraphicDriver::SetBackFacingModel (const Graphic3d_CView& ACView) //purpose : //======================================================================= -void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView, - const Standard_Integer theLayerId) +void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView, + const Graphic3d_ZLayerId theLayerId) { const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView; if (aCView) @@ -555,8 +555,8 @@ void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView, //function : RemoveZLayer //purpose : //======================================================================= -void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView, - const Standard_Integer theLayerId) +void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView, + const Graphic3d_ZLayerId theLayerId) { const OpenGl_CView* aCView = (const OpenGl_CView *)theCView.ptrView; if (aCView) @@ -567,8 +567,8 @@ void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView, //function : SetZLayerSettings //purpose : //======================================================================= -Standard_EXPORT void OpenGl_GraphicDriver::SetZLayerSettings (const Graphic3d_CView& theCView, - const Standard_Integer theLayerId, +Standard_EXPORT void OpenGl_GraphicDriver::SetZLayerSettings (const Graphic3d_CView& theCView, + const Graphic3d_ZLayerId theLayerId, const Graphic3d_ZLayerSettings& theSettings) { const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView; diff --git a/src/OpenGl/OpenGl_Layer.cxx b/src/OpenGl/OpenGl_Layer.cxx index e09a5b1a89..ff1624362b 100644 --- a/src/OpenGl/OpenGl_Layer.cxx +++ b/src/OpenGl/OpenGl_Layer.cxx @@ -14,24 +14,269 @@ // commercial license or contractual agreement. #include + +#include +#include +#include #include -#include -//======================================================================= -//function : OpenGl_Layer -//purpose : -//======================================================================= +// ======================================================================= +// function : OpenGl_PriorityList +// purpose : +// ======================================================================= OpenGl_Layer::OpenGl_Layer (const Standard_Integer theNbPriorities) - : myPriorityList (theNbPriorities) +: myArray (0, theNbPriorities - 1), + myNbStructures (0), + myBVHIsLeftChildQueuedFirst (Standard_True), + myIsBVHPrimitivesNeedsReset (Standard_False) { // } +// ======================================================================= +// function : ~OpenGl_Layer +// purpose : +// ======================================================================= +OpenGl_Layer::~OpenGl_Layer() +{ + // +} + +// ======================================================================= +// function : Add +// purpose : +// ======================================================================= +void OpenGl_Layer::Add (const OpenGl_Structure* theStruct, + const Standard_Integer thePriority, + Standard_Boolean isForChangePriority) +{ + const Standard_Integer anIndex = Min (Max (thePriority, 0), myArray.Length() - 1); + if (theStruct == NULL) + { + return; + } + + myArray (anIndex).Append (theStruct); + if (theStruct->IsAlwaysRendered()) + { + theStruct->MarkAsNotCulled(); + } + else if (!isForChangePriority) + { + myBVHPrimitives.Add (theStruct); + } + ++myNbStructures; +} + +// ======================================================================= +// function : Remove +// purpose : +// ======================================================================= +bool OpenGl_Layer::Remove (const OpenGl_Structure* theStruct, + Standard_Integer& thePriority, + Standard_Boolean isForChangePriority) +{ + if (theStruct == NULL) + { + thePriority = -1; + return false; + } + + const Standard_Integer aNbPriorities = myArray.Length(); + for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter) + { + OpenGl_SequenceOfStructure& aSeq = myArray (aPriorityIter); + for (OpenGl_SequenceOfStructure::Iterator aStructIter (aSeq); aStructIter.More(); aStructIter.Next()) + { + if (aStructIter.Value() == theStruct) + { + aSeq.Remove (aStructIter); + if (!theStruct->IsAlwaysRendered() + && !isForChangePriority) + { + myBVHPrimitives.Remove (theStruct); + } + --myNbStructures; + thePriority = aPriorityIter; + return true; + } + } + } + + thePriority = -1; + return false; +} + +// ======================================================================= +// function : InvalidateBVHData +// purpose : +// ======================================================================= +void OpenGl_Layer::InvalidateBVHData() +{ + myIsBVHPrimitivesNeedsReset = Standard_True; +} + +// ======================================================================= +// function : renderAll +// purpose : +// ======================================================================= +void OpenGl_Layer::renderAll (const Handle(OpenGl_Workspace)& theWorkspace) const +{ + const Standard_Integer aNbPriorities = myArray.Length(); + for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter) + { + for (OpenGl_SequenceOfStructure::Iterator aStructIter (myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next()) + { + const OpenGl_Structure* aStruct = aStructIter.Value(); + if (!aStruct->IsVisible()) + { + continue; + } + + aStruct->Render (theWorkspace); + } + } +} + +// ======================================================================= +// function : renderTraverse +// purpose : +// ======================================================================= +void OpenGl_Layer::renderTraverse (const Handle(OpenGl_Workspace)& theWorkspace) const +{ + if (myIsBVHPrimitivesNeedsReset) + { + myBVHPrimitives.Assign (myArray); + myIsBVHPrimitivesNeedsReset = Standard_False; + } + + OpenGl_BVHTreeSelector& aSelector = theWorkspace->ActiveView()->BVHTreeSelector(); + traverse (aSelector); + + const Standard_Integer aNbPriorities = myArray.Length(); + for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter) + { + for (OpenGl_SequenceOfStructure::Iterator aStructIter (myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next()) + { + const OpenGl_Structure* aStruct = aStructIter.Value(); + if (!aStruct->IsVisible() + || aStruct->IsCulled()) + { + continue; + } + + aStruct->Render (theWorkspace); + aStruct->ResetCullingStatus(); + } + } +} + +// ======================================================================= +// function : traverse +// purpose : +// ======================================================================= +void OpenGl_Layer::traverse (OpenGl_BVHTreeSelector& theSelector) const +{ + // handle a case when all objects are infinite + if (myBVHPrimitives.Size() == 0) + return; + + const NCollection_Handle >& aBVHTree = myBVHPrimitives.BVH(); + + Standard_Integer aNode = 0; // a root node + theSelector.CacheClipPtsProjections(); + if (!theSelector.Intersect (aBVHTree->MinPoint (0), + aBVHTree->MaxPoint (0))) + { + return; + } + + Standard_Integer aStack[32]; + Standard_Integer aHead = -1; + for (;;) + { + if (!aBVHTree->IsOuter (aNode)) + { + const Standard_Integer aLeftChildIdx = aBVHTree->LeftChild (aNode); + const Standard_Integer aRightChildIdx = aBVHTree->RightChild (aNode); + const Standard_Boolean isLeftChildIn = theSelector.Intersect (aBVHTree->MinPoint (aLeftChildIdx), + aBVHTree->MaxPoint (aLeftChildIdx)); + const Standard_Boolean isRightChildIn = theSelector.Intersect (aBVHTree->MinPoint (aRightChildIdx), + aBVHTree->MaxPoint (aRightChildIdx)); + if (isLeftChildIn + && isRightChildIn) + { + aNode = myBVHIsLeftChildQueuedFirst ? aLeftChildIdx : aRightChildIdx; + ++aHead; + aStack[aHead] = myBVHIsLeftChildQueuedFirst ? aRightChildIdx : aLeftChildIdx; + myBVHIsLeftChildQueuedFirst = !myBVHIsLeftChildQueuedFirst; + } + else if (isLeftChildIn + || isRightChildIn) + { + aNode = isLeftChildIn ? aLeftChildIdx : aRightChildIdx; + } + else + { + if (aHead < 0) + { + return; + } + + aNode = aStack[aHead]; + --aHead; + } + } + else + { + if (theSelector.Intersect (aBVHTree->MinPoint (aNode), + aBVHTree->MaxPoint (aNode))) + { + Standard_Integer aIdx = aBVHTree->BegPrimitive (aNode); + myBVHPrimitives.GetStructureById (aIdx)->MarkAsNotCulled(); + if (aHead < 0) + { + return; + } + + aNode = aStack[aHead]; + --aHead; + } + } + } +} + +// ======================================================================= +// function : Append +// purpose : +// ======================================================================= +Standard_Boolean OpenGl_Layer::Append (const OpenGl_Layer& theOther) +{ + // the source priority list shouldn't have more priorities + const Standard_Integer aNbPriorities = theOther.NbPriorities(); + if (aNbPriorities > NbPriorities()) + { + return Standard_False; + } + + // add all structures to destination priority list + for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter) + { + for (OpenGl_SequenceOfStructure::Iterator aStructIter (theOther.myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next()) + { + Add (aStructIter.Value(), aPriorityIter); + } + } + + return Standard_True; +} + //======================================================================= //function : Render -//purpose : +//purpose : //======================================================================= -void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &theWorkspace, const OpenGl_GlobalLayerSettings& theDefaultSettings) const +void OpenGl_Layer::Render (const Handle(OpenGl_Workspace)& theWorkspace, + const OpenGl_GlobalLayerSettings& theDefaultSettings) const { TEL_POFFSET_PARAM anAppliedOffsetParams = theWorkspace->AppliedPolygonOffset(); @@ -67,17 +312,10 @@ void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &theWorkspace, const O } // handle depth write - if (IsSettingEnabled (Graphic3d_ZLayerDepthWrite)) - { - glDepthMask (GL_TRUE); - } - else - { - glDepthMask (GL_FALSE); - } + glDepthMask (IsSettingEnabled (Graphic3d_ZLayerDepthWrite) ? GL_TRUE : GL_FALSE); // render priority list - myPriorityList.Render (theWorkspace); + theWorkspace->IsCullingEnabled() ? renderTraverse (theWorkspace) : renderAll (theWorkspace); // always restore polygon offset between layers rendering theWorkspace->SetPolygonOffset (anAppliedOffsetParams.mode, diff --git a/src/OpenGl/OpenGl_Layer.hxx b/src/OpenGl/OpenGl_Layer.hxx index a3c5a6c087..cc1697ee0d 100644 --- a/src/OpenGl/OpenGl_Layer.hxx +++ b/src/OpenGl/OpenGl_Layer.hxx @@ -1,6 +1,6 @@ -// Created on: 2014-03-31 -// Created by: Danila ULYANOV -// Copyright (c) 2014 OPEN CASCADE SAS +// Created on: 2011-11-02 +// Created by: Sergey ZERCHANINOV +// Copyright (c) 2011-2015 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -16,7 +16,15 @@ #ifndef _OpenGl_Layer_Header #define _OpenGl_Layer_Header -#include +#include +#include + +#include + +#include +#include +#include + #include #include @@ -28,6 +36,7 @@ struct OpenGl_GlobalLayerSettings GLboolean DepthMask; }; +//! Presentations list sorted within priorities. class OpenGl_Layer { public: @@ -35,11 +44,14 @@ public: //! Initializes associated priority list and layer properties OpenGl_Layer (const Standard_Integer theNbPriorities = 11); + //! Destructor. + virtual ~OpenGl_Layer(); + //! Returns settings of the layer object. - const Graphic3d_ZLayerSettings LayerSettings() const { return myLayerSettings; }; + const Graphic3d_ZLayerSettings& LayerSettings() const { return myLayerSettings; }; //! Sets settings of the layer object. - void SetLayerSettings (Graphic3d_ZLayerSettings theSettings) + void SetLayerSettings (const Graphic3d_ZLayerSettings& theSettings) { myLayerSettings = theSettings; } @@ -50,18 +62,60 @@ public: return myLayerSettings.IsSettingEnabled (theSetting); } - //! Returns reference to associated priority list. - OpenGl_PriorityList& PriorityList() { return myPriorityList; } + void Add (const OpenGl_Structure* theStruct, + const Standard_Integer thePriority, + Standard_Boolean isForChangePriority = Standard_False); + + //! Remove structure and returns its priority, if the structure is not found, method returns negative value + bool Remove (const OpenGl_Structure* theStruct, + Standard_Integer& thePriority, + Standard_Boolean isForChangePriority = Standard_False); + + //! @return the number of structures + Standard_Integer NbStructures() const { return myNbStructures; } + + //! Returns the number of available priority levels + Standard_Integer NbPriorities() const { return myArray.Length(); } + + //! Append layer of acceptable type (with similar number of priorities or less). + //! Returns Standard_False if the list can not be accepted. + Standard_Boolean Append (const OpenGl_Layer& theOther); + + //! Returns array of OpenGL structures. + const OpenGl_ArrayOfStructure& ArrayOfStructures() const { return myArray; } - //! Returns const reference to associated priority list. - const OpenGl_PriorityList& PriorityList() const { return myPriorityList; } + //! Marks BVH tree for given priority list as dirty and + //! marks primitive set for rebuild. + void InvalidateBVHData(); - void Render (const Handle(OpenGl_Workspace) &AWorkspace, const OpenGl_GlobalLayerSettings& theDefaultSettings) const; + // Render all structures. + void Render (const Handle(OpenGl_Workspace)& theWorkspace, + const OpenGl_GlobalLayerSettings& theDefaultSettings) const; + +protected: + + //! Traverses through BVH tree to determine which structures are in view volume. + void traverse (OpenGl_BVHTreeSelector& theSelector) const; + + //! Iterates through the hierarchical list of existing structures and renders them all. + void renderAll (const Handle(OpenGl_Workspace)& theWorkspace) const; + + //! Iterates through the hierarchical list of existing structures and renders only overlapping ones. + void renderTraverse (const Handle(OpenGl_Workspace)& theWorkspace) const; private: - OpenGl_PriorityList myPriorityList; //!< Associated priority list object. + OpenGl_ArrayOfStructure myArray; + Standard_Integer myNbStructures; + Graphic3d_ZLayerSettings myLayerSettings; //!< Layer setting flags + mutable OpenGl_BVHClipPrimitiveSet myBVHPrimitives; // (theStructure->CStructure().operator->()); + const Graphic3d_ZLayerId aLayerId = aStruct->ZLayer(); + + Standard_Integer aSeqPos = myLayers.Lower(); + myLayerIds.Find (aLayerId, aSeqPos); + + OpenGl_Layer& aLayer = myLayers.ChangeValue (aSeqPos); + Standard_Integer aPriority = -1; // remove structure from associated list // if the structure is not found there, // scan through layers and remove it - if (aList.Remove (theStructure) >= 0) + if (aLayer.Remove (aStruct, aPriority)) { - myNbStructures--; + --myNbStructures; + if (aLayer.LayerSettings().IsImmediate) + { + --myImmediateNbStructures; + } - if (theStructure->IsRaytracable()) + if (aStruct->IsRaytracable()) { - myModificationState++; + ++myModificationState; } return; } - + // scan through layers and remove it Standard_Integer aSeqId = 1; - OpenGl_SequenceOfLayers::Iterator anIts; - for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++) + for (OpenGl_SequenceOfLayers::Iterator anIts (myLayers); anIts.More(); anIts.Next(), ++aSeqId) { - OpenGl_PriorityList& aScanList = anIts.ChangeValue ().PriorityList(); + OpenGl_Layer& aLayerEx = anIts.ChangeValue(); if (aSeqPos == aSeqId) - continue; - - if (aScanList.Remove (theStructure) >= 0) { - myNbStructures--; + continue; + } - if (theStructure->IsRaytracable()) + if (aLayerEx.Remove (aStruct, aPriority)) + { + --myNbStructures; + if (aLayerEx.LayerSettings().IsImmediate) { - myModificationState++; + --myImmediateNbStructures; } + if (aStruct->IsRaytracable()) + { + ++myModificationState; + } return; } } @@ -227,14 +217,12 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure, //function : InvalidateBVHData //purpose : //======================================================================= -void OpenGl_LayerList::InvalidateBVHData (const Standard_Integer theLayerId) +void OpenGl_LayerList::InvalidateBVHData (const Graphic3d_ZLayerId theLayerId) { - Standard_Integer aSeqPos = !HasLayer (theLayerId) ? - 1 : myLayerIds.Find (theLayerId); - - OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList(); - - aList.InvalidateBVHData(); + Standard_Integer aSeqPos = myLayers.Lower(); + myLayerIds.Find (theLayerId, aSeqPos); + OpenGl_Layer& aLayer = myLayers.ChangeValue (aSeqPos); + aLayer.InvalidateBVHData(); } //======================================================================= @@ -242,44 +230,54 @@ void OpenGl_LayerList::InvalidateBVHData (const Standard_Integer theLayerId) //purpose : //======================================================================= -void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure, - const Standard_Integer theOldLayerId, - const Standard_Integer theNewLayerId) +void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure* theStructure, + const Graphic3d_ZLayerId theOldLayerId, + const Graphic3d_ZLayerId theNewLayerId) { - Standard_Integer aSeqPos = !HasLayer (theOldLayerId) ? - 1 : myLayerIds.Find (theOldLayerId); - - OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList(); - Standard_Integer aPriority; + Standard_Integer aSeqPos = myLayers.Lower(); + myLayerIds.Find (theOldLayerId, aSeqPos); + OpenGl_Layer& aLayer = myLayers.ChangeValue (aSeqPos); + Standard_Integer aPriority = -1; // take priority and remove structure from list found by // if the structure is not found there, scan through all other layers - if ((aPriority = aList.Remove (theStructure, Standard_True)) >= 0) + if (aLayer.Remove (theStructure, aPriority, Standard_True)) { - myNbStructures--; + --myNbStructures; + if (aLayer.LayerSettings().IsImmediate) + { + --myImmediateNbStructures; + } + // isForChangePriority should be Standard_False below, because we want // the BVH tree in the target layer to be updated with theStructure AddStructure (theStructure, theNewLayerId, aPriority); + return; } - else + + // scan through layers and remove it + Standard_Integer aSeqId = 1; + for (OpenGl_SequenceOfLayers::Iterator anIts (myLayers); anIts.More(); anIts.Next(), ++aSeqId) { - // scan through layers and remove it - Standard_Integer aSeqId = 1; - OpenGl_SequenceOfLayers::Iterator anIts; - for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++) + if (aSeqPos == aSeqId) { - if (aSeqPos == aSeqId) - continue; + continue; + } - // try to remove structure and get priority value from this layer - if ((aPriority = aList.Remove (theStructure, Standard_True)) >= 0) + // try to remove structure and get priority value from this layer + OpenGl_Layer& aLayerEx = anIts.ChangeValue(); + if (aLayerEx.Remove (theStructure, aPriority, Standard_True)) + { + --myNbStructures; + if (aLayerEx.LayerSettings().IsImmediate) { - myNbStructures--; - // isForChangePriority should be Standard_False below, because we want - // the BVH tree in the target layer to be updated with theStructure - AddStructure (theStructure, theNewLayerId, aPriority); - break; + --myImmediateNbStructures; } + + // isForChangePriority should be Standard_False below, because we want + // the BVH tree in the target layer to be updated with theStructure + AddStructure (theStructure, theNewLayerId, aPriority); + return; } } } @@ -288,62 +286,112 @@ void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure, //function : ChangePriority //purpose : //======================================================================= -void OpenGl_LayerList::ChangePriority (const OpenGl_Structure *theStructure, - const Standard_Integer theLayerId, - const Standard_Integer theNewPriority) +void OpenGl_LayerList::ChangePriority (const OpenGl_Structure* theStructure, + const Graphic3d_ZLayerId theLayerId, + const Standard_Integer theNewPriority) { - Standard_Integer aSeqPos = !HasLayer (theLayerId) ? - 1 : myLayerIds.Find (theLayerId); - - OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList(); + Standard_Integer aSeqPos = myLayers.Lower(); + myLayerIds.Find (theLayerId, aSeqPos); + OpenGl_Layer& aLayer = myLayers.ChangeValue (aSeqPos); + Standard_Integer anOldPriority = -1; - if (aList.Remove (theStructure, Standard_True) >= 0) + if (aLayer.Remove (theStructure, anOldPriority, Standard_True)) { - myNbStructures--; + --myNbStructures; + if (aLayer.LayerSettings().IsImmediate) + { + --myImmediateNbStructures; + } + AddStructure (theStructure, theLayerId, theNewPriority, Standard_True); + return; } - else + + Standard_Integer aSeqId = 1; + for (OpenGl_SequenceOfLayers::Iterator anIts (myLayers); anIts.More(); anIts.Next(), ++aSeqId) { - Standard_Integer aSeqId = 1; - OpenGl_SequenceOfLayers::Iterator anIts; - for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++) + if (aSeqPos == aSeqId) { - if (aSeqPos == aSeqId) - continue; + continue; + } - if (aList.Remove (theStructure, Standard_True) >= 0) + OpenGl_Layer& aLayerEx = anIts.ChangeValue(); + if (aLayerEx.Remove (theStructure, anOldPriority, Standard_True)) + { + --myNbStructures; + if (aLayerEx.LayerSettings().IsImmediate) { - myNbStructures--; - AddStructure (theStructure, theLayerId, theNewPriority, Standard_True); - break; + --myImmediateNbStructures; } + + AddStructure (theStructure, theLayerId, theNewPriority, Standard_True); + return; } } } //======================================================================= -//function : Render -//purpose : Render this element +//function : SetLayerSettings +//purpose : //======================================================================= +void OpenGl_LayerList::SetLayerSettings (const Graphic3d_ZLayerId theLayerId, + const Graphic3d_ZLayerSettings& theSettings) +{ + OpenGl_Layer& aLayer = Layer (theLayerId); + if (aLayer.LayerSettings().IsImmediate != theSettings.IsImmediate) + { + if (theSettings.IsImmediate) + { + myImmediateNbStructures += aLayer.NbStructures(); + } + else + { + myImmediateNbStructures -= aLayer.NbStructures(); + } + } + aLayer.SetLayerSettings (theSettings); +} -void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace) &theWorkspace) const +//======================================================================= +//function : Render +//purpose : +//======================================================================= +void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace)& theWorkspace, + const Standard_Boolean theToDrawImmediate) 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()) + const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); + aCtx->core11fwd->glGetIntegerv (GL_DEPTH_FUNC, &aDefaultSettings.DepthFunc); + aCtx->core11fwd->glGetBooleanv (GL_DEPTH_WRITEMASK, &aDefaultSettings.DepthMask); + + Standard_Integer aSeqId = myLayers.Lower(); + for (OpenGl_SequenceOfLayers::Iterator anIts (myLayers); anIts.More(); anIts.Next(), ++aSeqId) { - const OpenGl_Layer& aLayer = anIts.Value (); - if (aLayer.PriorityList().NbStructures () > 0) + const OpenGl_Layer& aLayer = anIts.Value(); + if (aLayer.NbStructures() < 1) + { + continue; + } + else if (theToDrawImmediate) { - // render layer - aLayer.Render (theWorkspace, aDefaultSettings); + if (!aLayer.LayerSettings().IsImmediate) + { + continue; + } } + else + { + if (aLayer.LayerSettings().IsImmediate) + { + continue; + } + } + + // render layer + aLayer.Render (theWorkspace, aDefaultSettings); } - glDepthMask (aDefaultSettings.DepthMask); - glDepthFunc (aDefaultSettings.DepthFunc); + aCtx->core11fwd->glDepthMask (aDefaultSettings.DepthMask); + aCtx->core11fwd->glDepthFunc (aDefaultSettings.DepthFunc); } diff --git a/src/OpenGl/OpenGl_LayerList.hxx b/src/OpenGl/OpenGl_LayerList.hxx index c979feb1e7..e7c20accf8 100644 --- a/src/OpenGl/OpenGl_LayerList.hxx +++ b/src/OpenGl/OpenGl_LayerList.hxx @@ -16,7 +16,6 @@ #ifndef _OpenGl_LayerList_Header #define _OpenGl_LayerList_Header -#include #include #include @@ -32,89 +31,92 @@ typedef NCollection_DataMap OpenGl_LayerSeqIds; class OpenGl_LayerList { - public: - +public: + //! Constructor OpenGl_LayerList (const Standard_Integer theNbPriorities = 11); - + //! Destructor - virtual ~OpenGl_LayerList (); - + virtual ~OpenGl_LayerList(); + //! Method returns the number of available priorities - Standard_Integer NbPriorities () const; + Standard_Integer NbPriorities() const { return myNbPriorities; } //! Number of displayed structures - Standard_Integer NbStructures () const; + Standard_Integer NbStructures() const { return myNbStructures; } + + //! Return number of structures within immediate layers + Standard_Integer NbImmediateStructures() const { return myImmediateNbStructures; } //! Insert a new layer with id. - void AddLayer (const Standard_Integer theLayerId); - - //! Check whether the layer with given id is already created. - Standard_Boolean HasLayer (const Standard_Integer theLayerId) const; - + void AddLayer (const Graphic3d_ZLayerId theLayerId); + //! Remove layer by its id. - void RemoveLayer (const Standard_Integer theLayerId); - + void RemoveLayer (const Graphic3d_ZLayerId theLayerId); + //! Add structure to list with given priority. The structure will be inserted //! to specified layer. If the layer isn't found, the structure will be put //! to default bottom-level layer. - void AddStructure (const OpenGl_Structure *theStructure, - const Standard_Integer theLayerId, - const Standard_Integer thePriority, - Standard_Boolean isForChangePriority = Standard_False); - + void AddStructure (const OpenGl_Structure* theStruct, + const Graphic3d_ZLayerId theLayerId, + const Standard_Integer thePriority, + Standard_Boolean isForChangePriority = Standard_False); + //! Remove structure from structure list and return its previous priority - void RemoveStructure (const OpenGl_Structure *theStructure, - const Standard_Integer theZLayerId); - + void RemoveStructure (const Handle(Graphic3d_Structure)& theStructure); + //! Change structure z layer //! If the new layer is not presented, the structure will be displayed //! in default z layer - void ChangeLayer (const OpenGl_Structure *theStructure, - const Standard_Integer theOldLayerId, - const Standard_Integer theNewLayerId); + void ChangeLayer (const OpenGl_Structure* theStructure, + const Graphic3d_ZLayerId theOldLayerId, + const Graphic3d_ZLayerId theNewLayerId); //! Changes structure priority within its ZLayer - void ChangePriority (const OpenGl_Structure *theStructure, - const Standard_Integer theLayerId, - const Standard_Integer theNewPriority); + void ChangePriority (const OpenGl_Structure* theStructure, + const Graphic3d_ZLayerId theLayerId, + const Standard_Integer theNewPriority); //! Returns reference to the layer with given ID. - OpenGl_Layer& Layer (const Standard_Integer theLayerId); + OpenGl_Layer& Layer (const Graphic3d_ZLayerId theLayerId); //! Returns reference to the layer with given ID. - const OpenGl_Layer& Layer (const Standard_Integer theLayerId) const; - + const OpenGl_Layer& Layer (const Graphic3d_ZLayerId theLayerId) const; + + //! Assign new settings to the layer. + void SetLayerSettings (const Graphic3d_ZLayerId theLayerId, + const Graphic3d_ZLayerSettings& theSettings); + //! Render this element - void Render (const Handle(OpenGl_Workspace) &theWorkspace) const; + void Render (const Handle(OpenGl_Workspace)& theWorkspace, + const Standard_Boolean theToDrawImmediate) const; //! Returns the set of OpenGL Z-layers. const OpenGl_SequenceOfLayers& Layers() const { return myLayers; } //! Marks BVH tree for given priority list as dirty and //! marks primitive set for rebuild. - void InvalidateBVHData (const Standard_Integer theLayerId); + void InvalidateBVHData (const Graphic3d_ZLayerId theLayerId); //! Returns structure modification state (for ray-tracing). Standard_Size ModificationState() const { return myModificationState; } - private: - - //! Get default layer - OpenGl_Layer& defaultLayer (); - - protected: +protected: // number of structures temporary put to default layer OpenGl_SequenceOfLayers myLayers; OpenGl_LayerSeqIds myLayerIds; + Standard_Integer myNbPriorities; Standard_Integer myNbStructures; + Standard_Integer myImmediateNbStructures; //!< number of structures within immediate layers mutable Standard_Size myModificationState; - public: +public: + DEFINE_STANDARD_ALLOC + }; #endif //_OpenGl_LayerList_Header diff --git a/src/OpenGl/OpenGl_NamedStatus.hxx b/src/OpenGl/OpenGl_NamedStatus.hxx index c2d3ade486..0064259c35 100644 --- a/src/OpenGl/OpenGl_NamedStatus.hxx +++ b/src/OpenGl/OpenGl_NamedStatus.hxx @@ -17,10 +17,8 @@ #define _OpenGl_NamedStatus_Header // Dynamic fields -#define OPENGL_NS_HIDE (1<<0) #define OPENGL_NS_HIGHLIGHT (1<<1) #define OPENGL_NS_RESMAT (1<<2) -#define OPENGL_NS_IMMEDIATE (1<<3) #define OPENGL_NS_TEXTURE (1<<4) #define OPENGL_NS_ANTIALIASING (1<<5) #define OPENGL_NS_2NDPASSNEED (1<<6) diff --git a/src/OpenGl/OpenGl_PriorityList.cxx b/src/OpenGl/OpenGl_PriorityList.cxx deleted file mode 100644 index e6b8cc4d39..0000000000 --- a/src/OpenGl/OpenGl_PriorityList.cxx +++ /dev/null @@ -1,271 +0,0 @@ -// Created on: 2011-11-02 -// Created by: Sergey ZERCHANINOV -// Copyright (c) 2011-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 License 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 - -#include -#include -#include - -// ======================================================================= -// function : OpenGl_PriorityList -// purpose : -// ======================================================================= -OpenGl_PriorityList::OpenGl_PriorityList (const Standard_Integer theNbPriorities) -: myArray (0, theNbPriorities - 1), - myNbStructures (0), - myBVHIsLeftChildQueuedFirst (Standard_True), - myIsBVHPrimitivesNeedsReset (Standard_False) -{ - // -} - -// ======================================================================= -// function : ~OpenGl_PriorityList -// purpose : -// ======================================================================= -OpenGl_PriorityList::~OpenGl_PriorityList() -{ - // -} - -// ======================================================================= -// function : Add -// purpose : -// ======================================================================= -void OpenGl_PriorityList::Add (const OpenGl_Structure* theStructure, - const Standard_Integer thePriority, - Standard_Boolean isForChangePriority) -{ - const Standard_Integer anIndex = Min (Max (thePriority, 0), myArray.Length() - 1); - - myArray (anIndex).Append (theStructure); - if (theStructure->IsAlwaysRendered()) - { - theStructure->MarkAsNotCulled(); - } - else if (!isForChangePriority) - { - myBVHPrimitives.Add (theStructure); - } - ++myNbStructures; -} - -// ======================================================================= -// function : Remove -// purpose : -// ======================================================================= -Standard_Integer OpenGl_PriorityList::Remove (const OpenGl_Structure* theStructure, - Standard_Boolean isForChangePriority) -{ - const Standard_Integer aNbPriorities = myArray.Length(); - OpenGl_SequenceOfStructure::Iterator aStructIter; - for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter) - { - OpenGl_SequenceOfStructure& aSeq = myArray (aPriorityIter); - for (aStructIter.Init (aSeq); aStructIter.More(); aStructIter.Next()) - { - if (aStructIter.Value() == theStructure) - { - aSeq.Remove (aStructIter); - if (!theStructure->IsAlwaysRendered() - && !isForChangePriority) - { - myBVHPrimitives.Remove (theStructure); - } - --myNbStructures; - return aPriorityIter; - } - } - } - - return -1; -} - -// ======================================================================= -// function : InvalidateBVHData -// purpose : -// ======================================================================= -void OpenGl_PriorityList::InvalidateBVHData() -{ - myIsBVHPrimitivesNeedsReset = Standard_True; -} - -// ======================================================================= -// function : Render -// purpose : -// ======================================================================= -void OpenGl_PriorityList::Render (const Handle(OpenGl_Workspace)& theWorkspace) const -{ - theWorkspace->IsCullingEnabled() ? renderTraverse (theWorkspace) : renderAll (theWorkspace); -} - -// ======================================================================= -// function : renderAll -// purpose : -// ======================================================================= -void OpenGl_PriorityList::renderAll (const Handle(OpenGl_Workspace)& theWorkspace) const -{ - const Standard_Integer aNbPriorities = myArray.Length(); - OpenGl_SequenceOfStructure::Iterator aStructIter; - for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter) - { - for (aStructIter.Init (myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next()) - { - aStructIter.Value()->Render (theWorkspace); - } - } -} - -// ======================================================================= -// function : renderTraverse -// purpose : -// ======================================================================= -void OpenGl_PriorityList::renderTraverse (const Handle(OpenGl_Workspace)& theWorkspace) const -{ - if (myIsBVHPrimitivesNeedsReset) - { - myBVHPrimitives.Assign (myArray); - myIsBVHPrimitivesNeedsReset = Standard_False; - } - - OpenGl_BVHTreeSelector& aSelector = theWorkspace->ActiveView()->BVHTreeSelector(); - traverse (aSelector); - - const Standard_Integer aNbPriorities = myArray.Length(); - OpenGl_SequenceOfStructure::Iterator aStructIter; - for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter) - { - for (aStructIter.Init (myArray (aPriorityIter)); aStructIter.More(); aStructIter.Next()) - { - if (!aStructIter.Value()->IsCulled()) - { - aStructIter.Value()->Render (theWorkspace); - aStructIter.Value()->ResetCullingStatus(); - } - } - } -} - -// ======================================================================= -// function : traverse -// purpose : -// ======================================================================= -void OpenGl_PriorityList::traverse (OpenGl_BVHTreeSelector& theSelector) const -{ - // handle a case when all objects are infinite - if (myBVHPrimitives.Size() == 0) - return; - - const NCollection_Handle >& aBVHTree = myBVHPrimitives.BVH(); - - Standard_Integer aNode = 0; // a root node - theSelector.CacheClipPtsProjections(); - if (!theSelector.Intersect (aBVHTree->MinPoint (0), - aBVHTree->MaxPoint (0))) - { - return; - } - - Standard_Integer aStack[32]; - Standard_Integer aHead = -1; - for (;;) - { - if (!aBVHTree->IsOuter (aNode)) - { - const Standard_Integer aLeftChildIdx = aBVHTree->LeftChild (aNode); - const Standard_Integer aRightChildIdx = aBVHTree->RightChild (aNode); - const Standard_Boolean isLeftChildIn = theSelector.Intersect (aBVHTree->MinPoint (aLeftChildIdx), - aBVHTree->MaxPoint (aLeftChildIdx)); - const Standard_Boolean isRightChildIn = theSelector.Intersect (aBVHTree->MinPoint (aRightChildIdx), - aBVHTree->MaxPoint (aRightChildIdx)); - if (isLeftChildIn - && isRightChildIn) - { - aNode = myBVHIsLeftChildQueuedFirst ? aLeftChildIdx : aRightChildIdx; - ++aHead; - aStack[aHead] = myBVHIsLeftChildQueuedFirst ? aRightChildIdx : aLeftChildIdx; - myBVHIsLeftChildQueuedFirst = !myBVHIsLeftChildQueuedFirst; - } - else if (isLeftChildIn - || isRightChildIn) - { - aNode = isLeftChildIn ? aLeftChildIdx : aRightChildIdx; - } - else - { - if (aHead < 0) - { - return; - } - - aNode = aStack[aHead]; - --aHead; - } - } - else - { - if (theSelector.Intersect (aBVHTree->MinPoint (aNode), - aBVHTree->MaxPoint (aNode))) - { - Standard_Integer aIdx = aBVHTree->BegPrimitive (aNode); - myBVHPrimitives.GetStructureById (aIdx)->MarkAsNotCulled(); - if (aHead < 0) - { - return; - } - - aNode = aStack[aHead]; - --aHead; - } - } - } -} - -// ======================================================================= -// function : Append -// purpose : -// ======================================================================= -Standard_Boolean OpenGl_PriorityList::Append (const OpenGl_PriorityList& theOther) -{ - // the source priority list shouldn't have more priorities - const Standard_Integer aNbPriorities = theOther.NbPriorities (); - if (aNbPriorities > NbPriorities()) - { - return Standard_False; - } - - // add all structures to destination priority list - OpenGl_SequenceOfStructure::Iterator aStructIter; - for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter) - { - const OpenGl_SequenceOfStructure& aSeq = theOther.myArray (aPriorityIter); - for (aStructIter.Init (aSeq); aStructIter.More(); aStructIter.Next()) - { - Add (aStructIter.Value(), aPriorityIter); - } - } - - return Standard_True; -} - -// ======================================================================= -// function : NbPriorities -// purpose : -// ======================================================================= -Standard_Integer OpenGl_PriorityList::NbPriorities() const -{ - return myArray.Length(); -} diff --git a/src/OpenGl/OpenGl_PriorityList.hxx b/src/OpenGl/OpenGl_PriorityList.hxx deleted file mode 100644 index dab5631f4f..0000000000 --- a/src/OpenGl/OpenGl_PriorityList.hxx +++ /dev/null @@ -1,96 +0,0 @@ -// Created on: 2011-11-02 -// Created by: Sergey ZERCHANINOV -// Copyright (c) 2011-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 License 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_PriorityList_Header -#define _OpenGl_PriorityList_Header - -#include -#include - -#include - -#include -#include -#include - -class OpenGl_Structure; - -typedef NCollection_Sequence OpenGl_SequenceOfStructure; -typedef NCollection_Array1 OpenGl_ArrayOfStructure; - -class OpenGl_PriorityList -{ -public: - - // Empty constructor. - OpenGl_PriorityList (const Standard_Integer theNbPriorities = 11); - - //! Destructor. - virtual ~OpenGl_PriorityList(); - - void Add (const OpenGl_Structure* theStructure, - const Standard_Integer thePriority, - Standard_Boolean isForChangePriority = Standard_False); - - //! Remove structure and returns its priority, if the structure is not found, method returns negative value - Standard_Integer Remove (const OpenGl_Structure* theStructure, - Standard_Boolean isForChangePriority = Standard_False); - - //! @return the number of structures - Standard_Integer NbStructures() const { return myNbStructures; } - - // Render all structures. - void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; - - //! Returns the number of available priority levels - Standard_Integer NbPriorities() const; - - //! Append priority list of acceptable type (with similar number of priorities - //! or less). Returns Standard_False if the list can not be accepted. - Standard_Boolean Append (const OpenGl_PriorityList& theOther); - - //! Returns array of OpenGL structures. - const OpenGl_ArrayOfStructure& ArrayOfStructures() const { return myArray; } - - //! Marks BVH tree for given priority list as dirty and - //! marks primitive set for rebuild. - void InvalidateBVHData(); - -protected: - - //! Traverses through BVH tree to determine which structures are in view volume. - void traverse (OpenGl_BVHTreeSelector& theSelector) const; - - //! Iterates through the hierarchical list of existing structures and renders them all. - void renderAll (const Handle(OpenGl_Workspace)& theWorkspace) const; - - //! Iterates through the hierarchical list of existing structures and renders only overlapping ones. - void renderTraverse (const Handle(OpenGl_Workspace)& theWorkspace) const; - -protected: - - OpenGl_ArrayOfStructure myArray; - Standard_Integer myNbStructures; - mutable OpenGl_BVHClipPrimitiveSet myBVHPrimitives; // + +class OpenGl_Structure; +typedef NCollection_Sequence OpenGl_SequenceOfStructure; + +#endif // _OpenGl_SequenceOfStructure diff --git a/src/OpenGl/OpenGl_Structure.cxx b/src/OpenGl/OpenGl_Structure.cxx index a4013e8b5d..d621ba5e93 100644 --- a/src/OpenGl/OpenGl_Structure.cxx +++ b/src/OpenGl/OpenGl_Structure.cxx @@ -73,10 +73,6 @@ public: const Handle(OpenGl_Texture) aPrevTexture = theWorkspace->DisableTexture(); glDisable (GL_LIGHTING); - if ((theWorkspace->NamedStatus & OPENGL_NS_IMMEDIATE) != 0) - { - glDepthMask (GL_FALSE); - } // Use highlight colors theWorkspace->GetGlContext()->core11->glColor3fv ((theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT) ? theWorkspace->HighlightColor->rgb : anAspectLine->Color().rgb); @@ -130,14 +126,12 @@ OpenGl_Structure::OpenGl_Structure (const Handle(Graphic3d_StructureManager)& th myAspectMarker(NULL), myAspectText(NULL), myHighlightColor(NULL), - myNamedStatus(0), - myZLayer(0), myIsRaytracable (Standard_False), myModificationState (0), myIsCulled (Standard_True), myIsMirrored (Standard_False) { - UpdateNamedStatus(); + // } // ======================================================================= @@ -366,15 +360,11 @@ void OpenGl_Structure::clearHighlightColor (const Handle(OpenGl_Context)& theGlC } // ======================================================================= -// function : UpdateNamedStatus +// function : OnVisibilityChanged // purpose : // ======================================================================= -void OpenGl_Structure::UpdateNamedStatus() +void OpenGl_Structure::OnVisibilityChanged() { - myNamedStatus = 0; - if (highlight) myNamedStatus |= OPENGL_NS_HIGHLIGHT; - if (!visible) myNamedStatus |= OPENGL_NS_HIDE; - if (myIsRaytracable) { UpdateStateWithAncestorStructures(); @@ -627,7 +617,7 @@ void OpenGl_Structure::RenderGeometry (const Handle(OpenGl_Workspace) &theWorksp void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) const { // Process the structure only if visible - if (myNamedStatus & OPENGL_NS_HIDE) + if (!visible) { return; } @@ -636,7 +626,10 @@ void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) con // Render named status const Standard_Integer aNamedStatus = theWorkspace->NamedStatus; - theWorkspace->NamedStatus |= myNamedStatus; + if (highlight) + { + theWorkspace->NamedStatus |= OPENGL_NS_HIGHLIGHT; + } // Do we need to restore GL_NORMALIZE? const Standard_Boolean anOldGlNormalize = aCtx->IsGlNormalizeEnabled(); @@ -860,24 +853,6 @@ void OpenGl_Structure::ReleaseGlResources (const Handle(OpenGl_Context)& theGlCt } } -//======================================================================= -//function : SetZLayer -//purpose : -//======================================================================= -void OpenGl_Structure::SetZLayer (const Standard_Integer theLayerIndex) -{ - myZLayer = theLayerIndex; -} - -//======================================================================= -//function : GetZLayer -//purpose : -//======================================================================= -Standard_Integer OpenGl_Structure::GetZLayer () const -{ - return myZLayer; -} - //======================================================================= //function : ShadowLink //purpose : diff --git a/src/OpenGl/OpenGl_Structure.hxx b/src/OpenGl/OpenGl_Structure.hxx index 24ce51603d..33056452f1 100644 --- a/src/OpenGl/OpenGl_Structure.hxx +++ b/src/OpenGl/OpenGl_Structure.hxx @@ -26,7 +26,6 @@ #include #include -#include #include #include @@ -67,7 +66,7 @@ public: Standard_EXPORT OpenGl_Structure (const Handle(Graphic3d_StructureManager)& theManager); //! Setup structure graphic state - Standard_EXPORT virtual void UpdateNamedStatus(); + Standard_EXPORT virtual void OnVisibilityChanged() Standard_OVERRIDE; //! Clear graphic data Standard_EXPORT virtual void Clear(); @@ -129,16 +128,8 @@ public: void clearHighlightColor (const Handle(OpenGl_Context)& theGlCtx); - Standard_Boolean IsVisible() const { return !(myNamedStatus & OPENGL_NS_HIDE); } - Standard_EXPORT void Clear (const Handle(OpenGl_Context)& theGlCtx); - //! Set z layer ID to display the structure in specified layer - Standard_EXPORT void SetZLayer (const Standard_Integer theLayerIndex); - - //! Get z layer ID - Standard_EXPORT Standard_Integer GetZLayer() const; - //! Renders groups of structure without applying any attributes (i.e. transform, material etc). virtual void RenderGeometry (const Handle(OpenGl_Workspace)& theWorkspace) const; @@ -239,9 +230,6 @@ protected: Handle(OpenGl_Group) myHighlightBox; TEL_COLOUR* myHighlightColor; - int myNamedStatus; - int myZLayer; - OpenGl_ListOfStructure myConnected; mutable OpenGl_ListOfStructure myAncestorStructures; diff --git a/src/OpenGl/OpenGl_View.hxx b/src/OpenGl/OpenGl_View.hxx index ff2885e6d0..e1b1e8661c 100644 --- a/src/OpenGl/OpenGl_View.hxx +++ b/src/OpenGl/OpenGl_View.hxx @@ -139,37 +139,37 @@ class OpenGl_View : public MMgt_TShared //! The structure will be added to associated with it z layer. //! If the z layer is not presented in the view, the structure will //! be displayed in default bottom-level z layer. - void DisplayStructure (const OpenGl_Structure* theStructure, - const Standard_Integer thePriority); + void DisplayStructure (const Handle(Graphic3d_Structure)& theStructure, + const Standard_Integer thePriority); //! Erase structure from display list. - void EraseStructure (const OpenGl_Structure* theStructure); + void EraseStructure (const Handle(Graphic3d_Structure)& theStructure); //! Add structure to the list of immediate structures. - void DisplayImmediateStructure (const OpenGl_Structure* theStructure); + void DisplayImmediateStructure (const Handle(Graphic3d_Structure)& theStructure); //! Erase structure from display list. void EraseImmediateStructure (const OpenGl_Structure* theStructure); //! Insert a new top-level z layer with ID - void AddZLayer (const Standard_Integer theLayerId); + void AddZLayer (const Graphic3d_ZLayerId theLayerId); //! Remove a z layer with ID - void RemoveZLayer (const Standard_Integer theLayerId); + void RemoveZLayer (const Graphic3d_ZLayerId theLayerId); //! Display structure in z layer with ID //! If the layer with ID is not presented in the view, //! the structure will be displayed in default bottom-level layer. - void ChangeZLayer (const OpenGl_Structure *theStructure, - const Standard_Integer theNewLayerId); + void ChangeZLayer (const OpenGl_Structure* theStructure, + const Graphic3d_ZLayerId theNewLayerId); //! Sets the settings for a single Z layer of specified view. - void SetZLayerSettings (const Standard_Integer theLayerId, - const Graphic3d_ZLayerSettings theSettings); + void SetZLayerSettings (const Graphic3d_ZLayerId theLayerId, + const Graphic3d_ZLayerSettings& theSettings); //! Changes the priority of a structure within its ZLayer - void ChangePriority (const OpenGl_Structure *theStructure, - const Standard_Integer theNewPriority); + void ChangePriority (const OpenGl_Structure* theStructure, + const Standard_Integer theNewPriority); void CreateBackgroundTexture (const Standard_CString AFileName, const Aspect_FillMethod AFillStyle); void SetBackgroundTextureStyle (const Aspect_FillMethod FillStyle); @@ -180,7 +180,8 @@ class OpenGl_View : public MMgt_TShared const Handle(OpenGl_Workspace)& theWorkspace, const Graphic3d_CView& theCView, const Aspect_CLayer2d& theCUnderLayer, - const Aspect_CLayer2d& theCOverLayer); + const Aspect_CLayer2d& theCOverLayer, + const Standard_Boolean theToDrawImmediate); void DrawBackground (OpenGl_Workspace& theWorkspace); @@ -215,12 +216,20 @@ class OpenGl_View : public MMgt_TShared return myImmediateList; } + //! Returns true if there are immediate structures to display + bool HasImmediateStructures() const + { + return !myImmediateList.IsEmpty() + || myZLayers.NbImmediateStructures() != 0; + } + //! Returns modification state for ray-tracing. Standard_Size ModificationState() const { return myModificationState; } protected: - void RenderStructs (const Handle(OpenGl_Workspace) &AWorkspace); + void RenderStructs (const Handle(OpenGl_Workspace)& theWorkspace, + const Standard_Boolean theToDrawImmediate); void RedrawLayer2d (const Handle(OpenGl_PrinterContext)& thePrintContext, const Handle(OpenGl_Workspace) &theWorkspace, const Graphic3d_CView& theCView, @@ -231,13 +240,9 @@ protected: //! lights, structures. The peculiar properties of "scene" is that //! it requires empty Z-Buffer and uses projection and orientation //! matrices supplied by 3d view. - //! @param thePrintCtx [in] printer context which facilitates tiled printing. - //! @param theWorkspace [in] rendering workspace. - //! @param theCView [in] view data. - //! @param theProjection [in] view projection matrix. - //! @param theOrientation [in] view orientation matrix. void RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintContext, - const Handle(OpenGl_Workspace)& theWorkspace); + const Handle(OpenGl_Workspace)& theWorkspace, + const Standard_Boolean theToDrawImmediate); Handle(OpenGl_LineAttributes) myLineAttribs; Handle(OpenGl_Texture) myTextureEnv; diff --git a/src/OpenGl/OpenGl_View_2.cxx b/src/OpenGl/OpenGl_View_2.cxx index ba6f1d17c5..e088cda8ad 100644 --- a/src/OpenGl/OpenGl_View_2.cxx +++ b/src/OpenGl/OpenGl_View_2.cxx @@ -360,10 +360,11 @@ void OpenGl_View::DrawBackground (OpenGl_Workspace& theWorkspace) //call_func_redraw_all_structs_proc void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext, - const Handle(OpenGl_Workspace) &theWorkspace, - const Graphic3d_CView& theCView, - const Aspect_CLayer2d& theCUnderLayer, - const Aspect_CLayer2d& theCOverLayer) + const Handle(OpenGl_Workspace)& theWorkspace, + const Graphic3d_CView& theCView, + const Aspect_CLayer2d& theCUnderLayer, + const Aspect_CLayer2d& theCOverLayer, + const Standard_Boolean theToDrawImmediate) { // ================================== // Step 1: Prepare for redraw @@ -448,7 +449,8 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext, // ==================================== // Render background - if (theWorkspace->ToRedrawGL()) + if (theWorkspace->ToRedrawGL() + && !theToDrawImmediate) { DrawBackground (*theWorkspace); } @@ -461,8 +463,10 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext, // ================================= // Step 3: Draw underlayer // ================================= - - RedrawLayer2d (thePrintContext, theWorkspace, theCView, theCUnderLayer); + if (!theToDrawImmediate) + { + RedrawLayer2d (thePrintContext, theWorkspace, theCView, theCUnderLayer); + } // ================================= // Step 4: Redraw main plane @@ -552,7 +556,7 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext, { // single-pass monographic rendering // redraw scene with normal orientation and projection - RedrawScene (thePrintContext, theWorkspace); + RedrawScene (thePrintContext, theWorkspace, theToDrawImmediate); } else { @@ -565,7 +569,7 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext, aContext->ApplyProjectionMatrix(); // redraw left Eye - RedrawScene (thePrintContext, theWorkspace); + RedrawScene (thePrintContext, theWorkspace, theToDrawImmediate); // reset depth buffer of first rendering pass if (theWorkspace->UseDepthTest()) @@ -579,7 +583,7 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext, aContext->ApplyProjectionMatrix(); // redraw right Eye - RedrawScene (thePrintContext, theWorkspace); + RedrawScene (thePrintContext, theWorkspace, theToDrawImmediate); // switch back to monographic rendering aContext->SetDrawBufferMono(); @@ -609,7 +613,8 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext, } // Render trihedron - if (theWorkspace->ToRedrawGL()) + if (theWorkspace->ToRedrawGL() + && !theToDrawImmediate) { RedrawTrihedron (theWorkspace); @@ -629,13 +634,15 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext, // =============================== // Step 6: Redraw overlay // =============================== + if (!theToDrawImmediate) + { + const int aMode = 0; + theWorkspace->DisplayCallback (theCView, (aMode | OCC_PRE_OVERLAY)); - const int aMode = 0; - theWorkspace->DisplayCallback (theCView, (aMode | OCC_PRE_OVERLAY)); - - RedrawLayer2d (thePrintContext, theWorkspace, theCView, theCOverLayer); + RedrawLayer2d (thePrintContext, theWorkspace, theCView, theCOverLayer); - theWorkspace->DisplayCallback (theCView, aMode); + theWorkspace->DisplayCallback (theCView, aMode); + } // =============================== // Step 7: Finalize @@ -671,7 +678,7 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext, // function : InvalidateBVHData // purpose : // ======================================================================= -void OpenGl_View::InvalidateBVHData (const Standard_Integer theLayerId) +void OpenGl_View::InvalidateBVHData (const Graphic3d_ZLayerId theLayerId) { myZLayers.InvalidateBVHData (theLayerId); } @@ -679,7 +686,8 @@ void OpenGl_View::InvalidateBVHData (const Standard_Integer theLayerId) /*----------------------------------------------------------------------*/ //ExecuteViewDisplay -void OpenGl_View::RenderStructs (const Handle(OpenGl_Workspace) &AWorkspace) +void OpenGl_View::RenderStructs (const Handle(OpenGl_Workspace)& AWorkspace, + const Standard_Boolean theToDrawImmediate) { if ( myZLayers.NbStructures() <= 0 ) return; @@ -718,7 +726,7 @@ void OpenGl_View::RenderStructs (const Handle(OpenGl_Workspace) &AWorkspace) } } - myZLayers.Render (AWorkspace); + myZLayers.Render (AWorkspace, theToDrawImmediate); #if !defined(GL_ES_VERSION_2_0) //TsmPopAttri(); /* restore previous graphics context; before update lights */ @@ -1004,7 +1012,7 @@ void OpenGl_View::SetBackgroundGradientType (const Aspect_GradientFillMethod ATy //purpose : //======================================================================= -void OpenGl_View::AddZLayer (const Standard_Integer theLayerId) +void OpenGl_View::AddZLayer (const Graphic3d_ZLayerId theLayerId) { myZLayers.AddLayer (theLayerId); } @@ -1014,7 +1022,7 @@ void OpenGl_View::AddZLayer (const Standard_Integer theLayerId) //purpose : //======================================================================= -void OpenGl_View::RemoveZLayer (const Standard_Integer theLayerId) +void OpenGl_View::RemoveZLayer (const Graphic3d_ZLayerId theLayerId) { myZLayers.RemoveLayer (theLayerId); } @@ -1024,11 +1032,12 @@ void OpenGl_View::RemoveZLayer (const Standard_Integer theLayerId) //purpose : //======================================================================= -void OpenGl_View::DisplayStructure (const OpenGl_Structure *theStructure, - const Standard_Integer thePriority) +void OpenGl_View::DisplayStructure (const Handle(Graphic3d_Structure)& theStructure, + const Standard_Integer thePriority) { - Standard_Integer aZLayer = theStructure->GetZLayer (); - myZLayers.AddStructure (theStructure, aZLayer, thePriority); + const OpenGl_Structure* aStruct = reinterpret_cast (theStructure->CStructure().operator->()); + const Graphic3d_ZLayerId aZLayer = aStruct->ZLayer(); + myZLayers.AddStructure (aStruct, aZLayer, thePriority); } //======================================================================= @@ -1036,18 +1045,19 @@ void OpenGl_View::DisplayStructure (const OpenGl_Structure *theStructure, //purpose : //======================================================================= -void OpenGl_View::DisplayImmediateStructure (const OpenGl_Structure* theStructure) +void OpenGl_View::DisplayImmediateStructure (const Handle(Graphic3d_Structure)& theStructure) { + const OpenGl_Structure* aStruct = reinterpret_cast (theStructure->CStructure().operator->()); for (OpenGl_SequenceOfStructure::Iterator anIter (myImmediateList); anIter.More(); anIter.Next()) { - if (anIter.Value() == theStructure) + if (anIter.Value() == aStruct) { return; } } - myImmediateList.Append (theStructure); + myImmediateList.Append (aStruct); } //======================================================================= @@ -1055,10 +1065,9 @@ void OpenGl_View::DisplayImmediateStructure (const OpenGl_Structure* theStructur //purpose : //======================================================================= -void OpenGl_View::EraseStructure (const OpenGl_Structure *theStructure) +void OpenGl_View::EraseStructure (const Handle(Graphic3d_Structure)& theStructure) { - Standard_Integer aZLayer = theStructure->GetZLayer (); - myZLayers.RemoveStructure (theStructure, aZLayer); + myZLayers.RemoveStructure (theStructure); } //======================================================================= @@ -1084,10 +1093,10 @@ void OpenGl_View::EraseImmediateStructure (const OpenGl_Structure* theStructure) //purpose : //======================================================================= -void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure, - const Standard_Integer theNewLayerId) +void OpenGl_View::ChangeZLayer (const OpenGl_Structure* theStructure, + const Graphic3d_ZLayerId theNewLayerId) { - Standard_Integer anOldLayer = theStructure->GetZLayer (); + const Graphic3d_ZLayerId anOldLayer = theStructure->ZLayer(); myZLayers.ChangeLayer (theStructure, anOldLayer, theNewLayerId); } @@ -1095,10 +1104,10 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure, //function : SetZLayerSettings //purpose : //======================================================================= -void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId, - const Graphic3d_ZLayerSettings theSettings) +void OpenGl_View::SetZLayerSettings (const Graphic3d_ZLayerId theLayerId, + const Graphic3d_ZLayerSettings& theSettings) { - myZLayers.Layer (theLayerId).SetLayerSettings (theSettings); + myZLayers.SetLayerSettings (theLayerId, theSettings); } //======================================================================= @@ -1108,7 +1117,7 @@ void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId, void OpenGl_View::ChangePriority (const OpenGl_Structure *theStructure, const Standard_Integer theNewPriority) { - Standard_Integer aLayerId = theStructure->GetZLayer(); + const Graphic3d_ZLayerId aLayerId = theStructure->ZLayer(); myZLayers.ChangePriority (theStructure, aLayerId, theNewPriority); } @@ -1118,7 +1127,8 @@ void OpenGl_View::ChangePriority (const OpenGl_Structure *theStructure, //======================================================================= void OpenGl_View::RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintContext, - const Handle(OpenGl_Workspace)& theWorkspace) + const Handle(OpenGl_Workspace)& theWorkspace, + const Standard_Boolean theToDrawImmediate) { const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext(); @@ -1246,14 +1256,14 @@ void OpenGl_View::RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintCont theWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX; theWorkspace->DisableTexture(); // Render the view - RenderStructs (theWorkspace); + RenderStructs (theWorkspace, theToDrawImmediate); break; case Visual3d_TOD_ENVIRONMENT: theWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX; theWorkspace->EnableTexture (myTextureEnv); // Render the view - RenderStructs (theWorkspace); + RenderStructs (theWorkspace, theToDrawImmediate); theWorkspace->DisableTexture(); break; @@ -1261,7 +1271,7 @@ void OpenGl_View::RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintCont // First pass theWorkspace->NamedStatus &= ~OPENGL_NS_FORBIDSETTEX; // Render the view - RenderStructs (theWorkspace); + RenderStructs (theWorkspace, theToDrawImmediate); theWorkspace->DisableTexture(); // Second pass @@ -1294,7 +1304,7 @@ void OpenGl_View::RedrawScene (const Handle(OpenGl_PrinterContext)& thePrintCont theWorkspace->NamedStatus |= OPENGL_NS_FORBIDSETTEX; // Render the view - RenderStructs (theWorkspace); + RenderStructs (theWorkspace, theToDrawImmediate); theWorkspace->DisableTexture(); // Restore properties back diff --git a/src/OpenGl/OpenGl_Workspace.cxx b/src/OpenGl/OpenGl_Workspace.cxx index 75afc337ad..fdeaeb52d1 100644 --- a/src/OpenGl/OpenGl_Workspace.cxx +++ b/src/OpenGl/OpenGl_Workspace.cxx @@ -684,7 +684,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView, redraw1 (theCView, anEmptyCLayer, anEmptyCLayer, 0); myOpenGlFBO->UnbindBuffer (aGlCtx); - const Standard_Boolean isImmediate = !myView->ImmediateStructures().IsEmpty(); + const Standard_Boolean isImmediate = myView->HasImmediateStructures(); Raytrace (theCView, aSizeX, aSizeY, isImmediate ? 0 : toSwap, theCOverLayer, theCUnderLayer, aFrameBuffer); @@ -707,7 +707,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView, aFrameBuffer->BindBuffer (aGlCtx); } - const Standard_Boolean isImmediate = !myView->ImmediateStructures().IsEmpty(); + const Standard_Boolean isImmediate = myView->HasImmediateStructures(); redraw1 (theCView, theCUnderLayer, theCOverLayer, isImmediate ? 0 : toSwap); if (isImmediate) { @@ -811,7 +811,7 @@ void OpenGl_Workspace::redraw1 (const Graphic3d_CView& theCView, glClear (toClear); Handle(OpenGl_Workspace) aWS (this); - myView->Render (myPrintContext, aWS, theCView, theCUnderLayer, theCOverLayer); + myView->Render (myPrintContext, aWS, theCView, theCUnderLayer, theCOverLayer, Standard_False); // swap the buffers if (theToSwap) @@ -856,6 +856,7 @@ void OpenGl_Workspace::copyBackToFront() glRasterPos2i (0, 0); glCopyPixels (0, 0, myWidth + 1, myHeight + 1, GL_COLOR); + //glCopyPixels (0, 0, myWidth + 1, myHeight + 1, GL_DEPTH); EnableFeatures(); @@ -906,7 +907,7 @@ void OpenGl_Workspace::RedrawImmediate (const Graphic3d_CView& theCView, #if !defined(GL_ES_VERSION_2_0) glGetBooleanv (GL_DOUBLEBUFFER, &isDoubleBuffer); #endif - if (myView->ImmediateStructures().IsEmpty()) + if (!myView->HasImmediateStructures()) { if (theToForce || !myIsImmediateDrawn) @@ -944,20 +945,49 @@ void OpenGl_Workspace::RedrawImmediate (const Graphic3d_CView& theCView, } myIsImmediateDrawn = Standard_True; - NamedStatus |= OPENGL_NS_IMMEDIATE; - ///glDisable (GL_LIGHTING); - glDisable (GL_DEPTH_TEST); - Handle(OpenGl_Workspace) aWS (this); + + if (myUseZBuffer) + { + glDepthFunc (GL_LEQUAL); + glDepthMask (GL_TRUE); + if (myUseDepthTest) + { + glEnable (GL_DEPTH_TEST); + } + else + { + glDisable (GL_DEPTH_TEST); + } + + #if !defined(GL_ES_VERSION_2_0) + glClearDepth (1.0); + #else + glClearDepthf (1.0f); + #endif + } + else + { + glDisable (GL_DEPTH_TEST); + } + + myView->Render (myPrintContext, aWS, theCView, theCUnderLayer, theCOverLayer, Standard_True); + if (!myView->ImmediateStructures().IsEmpty()) + { + glDisable (GL_DEPTH_TEST); + } for (OpenGl_SequenceOfStructure::Iterator anIter (myView->ImmediateStructures()); anIter.More(); anIter.Next()) { const OpenGl_Structure* aStructure = anIter.Value(); + if (!aStructure->IsVisible()) + { + continue; + } + aStructure->Render (aWS); } - NamedStatus &= ~OPENGL_NS_IMMEDIATE; - if (isDoubleBuffer && myTransientDrawToFront) { glFlush(); diff --git a/src/OpenGl/OpenGl_Workspace_Raytrace.cxx b/src/OpenGl/OpenGl_Workspace_Raytrace.cxx index 9f4e4fb3e8..cff5b57b65 100644 --- a/src/OpenGl/OpenGl_Workspace_Raytrace.cxx +++ b/src/OpenGl/OpenGl_Workspace_Raytrace.cxx @@ -71,18 +71,14 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceGeometry (GeomUpdateMode theMod for (OpenGl_SequenceOfLayers::Iterator anLayerIt (aList.Layers()); anLayerIt.More(); anLayerIt.Next()) { - const OpenGl_PriorityList& aPriorityList = anLayerIt.Value().PriorityList(); - - if (aPriorityList.NbStructures() == 0) + const OpenGl_Layer& aLayer = anLayerIt.Value(); + if (aLayer.NbStructures() == 0) continue; - const OpenGl_ArrayOfStructure& aStructArray = aPriorityList.ArrayOfStructures(); - + const OpenGl_ArrayOfStructure& aStructArray = aLayer.ArrayOfStructures(); for (Standard_Integer anIndex = 0; anIndex < aStructArray.Length(); ++anIndex) { - OpenGl_SequenceOfStructure::Iterator aStructIt; - - for (aStructIt.Init (aStructArray (anIndex)); aStructIt.More(); aStructIt.Next()) + for (OpenGl_SequenceOfStructure::Iterator aStructIt (aStructArray (anIndex)); aStructIt.More(); aStructIt.Next()) { const OpenGl_Structure* aStructure = aStructIt.Value(); @@ -97,7 +93,9 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceGeometry (GeomUpdateMode theMod { if (!aStructure->IsRaytracable() || !aStructure->IsVisible()) + { continue; + } for (OpenGl_Structure::GroupIterator aGroupIter (aStructure->DrawGroups()); aGroupIter.More(); aGroupIter.Next()) { diff --git a/src/Prs3d/Prs3d_Presentation.cdl b/src/Prs3d/Prs3d_Presentation.cdl index 4a59f66445..a484fb12b4 100644 --- a/src/Prs3d/Prs3d_Presentation.cdl +++ b/src/Prs3d/Prs3d_Presentation.cdl @@ -82,27 +82,9 @@ is ---Purpose: Returns the new Structure defined for the new visualization ---Category: Methods to modify the class definition - ----Category: Highlighting methods. --- - Highlight(me: mutable) is static; - ---Purpose: displays the whole content of the presentation in white. - Color(me: mutable; aColor: NameOfColor from Quantity) is static; - ---Purpose: displays the whole content of the presentation in the specified color. - BoundBox(me: mutable) is static; - - SetIsForHighlight (me : mutable; - isForHighlight : Boolean from Standard) - is virtual; - ---Purpose: marks the structure representing wired structure needed for - -- highlight only so it won't be added to BVH tree. - ---Category: Global modification methods. SetShadingAspect(me: mutable; aShadingAspect: ShadingAspect from Prs3d); - ----Category: Inquire methods. - IsPickable(me) returns Boolean from Standard; - + ---Category: Transformation methods. Transform (me: mutable; aTransformation: Transformation from Geom); Place (me: mutable; X,Y,Z: Length from Quantity); @@ -116,9 +98,6 @@ is Remove (me: mutable; aPresentation: Presentation from Prs3d); RemoveAll (me: mutable); - SetPickable(me: mutable) is static; - SetUnPickable(me: mutable) is static; - CurrentGroup(me) returns Group from Graphic3d is static private; friends diff --git a/src/Prs3d/Prs3d_Presentation.cxx b/src/Prs3d/Prs3d_Presentation.cxx index 57bcb11348..ae0262d8b3 100644 --- a/src/Prs3d/Prs3d_Presentation.cxx +++ b/src/Prs3d/Prs3d_Presentation.cxx @@ -99,38 +99,6 @@ Prs3d_Presentation::Prs3d_Presentation (const Handle(Graphic3d_StructureManager) SetPrimitivesAspect (aDefAspect); } -//======================================================================= -//function : Highlight -//purpose : -//======================================================================= -void Prs3d_Presentation::Highlight() -{ - SetHighlightColor(Quantity_Color(Quantity_NOC_GRAY99)); - Aspect_TypeOfHighlightMethod Method = Aspect_TOHM_COLOR; - Graphic3d_Structure::Highlight(Method); -} - -//======================================================================= -//function : Color -//purpose : -//======================================================================= -void Prs3d_Presentation::Color(const Quantity_NameOfColor aColor) -{ - SetHighlightColor(Quantity_Color(aColor)); - Graphic3d_Structure::Highlight(Aspect_TOHM_COLOR); -} - -//======================================================================= -//function : BoundBox -//purpose : -//======================================================================= -void Prs3d_Presentation::BoundBox() -{ - SetHighlightColor(Quantity_Color(Quantity_NOC_GRAY99)); - Graphic3d_Structure::Highlight(Aspect_TOHM_BOUNDBOX); -} - - //======================================================================= //function : SetShadingAspect //purpose : @@ -140,34 +108,6 @@ void Prs3d_Presentation::SetShadingAspect(const Handle(Prs3d_ShadingAspect)& aSh SetPrimitivesAspect(aShadingAspect->Aspect()); } -//======================================================================= -//function : IsPickable -//purpose : -//======================================================================= -Standard_Boolean Prs3d_Presentation::IsPickable () const -{ - return Graphic3d_Structure::IsSelectable(); -} - -//======================================================================= -//function : SetPickable -//purpose : -//======================================================================= - -void Prs3d_Presentation::SetPickable() -{ - SetPick(Standard_True); -} - -//======================================================================= -//function : SetUnPickable -//purpose : -//======================================================================= -void Prs3d_Presentation::SetUnPickable() -{ - SetPick(Standard_False); -} - //======================================================================= //function : Transform //purpose : @@ -287,15 +227,6 @@ Handle(Graphic3d_Group) Prs3d_Presentation::CurrentGroup () const } //======================================================================= -//======================================================================= -//function : SetIsForHighlight -//purpose : -//======================================================================= -void Prs3d_Presentation::SetIsForHighlight (const Standard_Boolean isForHighlight) -{ - Graphic3d_Structure::SetIsForHighlight (isForHighlight); -} - //function : Compute //purpose : //======================================================================= diff --git a/src/PrsMgr/PrsMgr.cdl b/src/PrsMgr/PrsMgr.cdl index 990c74914d..db39877ca4 100644 --- a/src/PrsMgr/PrsMgr.cdl +++ b/src/PrsMgr/PrsMgr.cdl @@ -33,9 +33,12 @@ uses MMgt,TCollection, TopLoc, - Prs3d,Graphic3d, + Aspect, + Prs3d, + Graphic3d, Quantity,Geom, - V3d, + Visual3d, + V3d, TColStd, gp diff --git a/src/PrsMgr/PrsMgr_PresentableObject.cdl b/src/PrsMgr/PrsMgr_PresentableObject.cdl index c4a26f70de..a0d1a92066 100644 --- a/src/PrsMgr/PrsMgr_PresentableObject.cdl +++ b/src/PrsMgr/PrsMgr_PresentableObject.cdl @@ -63,12 +63,11 @@ uses Location from TopLoc, ClipPlane_Handle from Graphic3d, SequenceOfHClipPlane from Graphic3d, - -- ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) TransModeFlags from Graphic3d, Pnt from gp, Trsf from gp, - CTransPersStruct from Graphic3d - -- ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) + CTransPersStruct from Graphic3d, + ZLayerId from Graphic3d raises NotImplemented from Standard @@ -246,22 +245,16 @@ is UpdateTransformation(me:mutable) is virtual; UpdateTransformation(me:mutable;P : Presentation from Prs3d) is virtual; - + SetZLayer ( me : mutable; - thePrsMgr : PresentationManager from PrsMgr; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is virtual; - ---Purpose: Set Z layer ID and update all presentations of - -- the presentable object. The layer can be set only for displayed object. - -- If all object presentations are removed, the layer ID will be set to - -- default value when computing presentation. The layers mechanism allows - -- drawing objects in higher layers in overlay of objects in lower layers. - - GetZLayer ( me; - thePrsMgr : PresentationManager from PrsMgr ) - returns Integer from Standard is static; - ---Purpose: Get ID of Z layer. If no presentations of object is displayed, - -- and layer ID is unavailable, the -1 value is returned. + ---Purpose: Set Z layer ID and update all presentations of the presentable object. + -- The layers mechanism allows drawing objects in higher layers in overlay of objects in lower layers. + + ZLayer ( me ) + returns ZLayerId from Graphic3d is static; + ---Purpose: Get ID of Z layer. AddClipPlane (me : mutable; thePlane : ClipPlane_Handle from Graphic3d) is virtual; ---Purpose: Adds clip plane for graphical clipping for all display mode @@ -333,7 +326,7 @@ fields myClipPlanes : SequenceOfHClipPlane from Graphic3d is protected; myTransformPersistence : CTransPersStruct from Graphic3d; myIsMutable : Boolean from Standard is protected; - + myZLayer : ZLayerId from Graphic3d is protected; myHasOwnPresentations : Boolean from Standard is protected; -- shows if object should have own presentations. diff --git a/src/PrsMgr/PrsMgr_PresentableObject.cxx b/src/PrsMgr/PrsMgr_PresentableObject.cxx index 84c928485e..be68dd8920 100644 --- a/src/PrsMgr/PrsMgr_PresentableObject.cxx +++ b/src/PrsMgr/PrsMgr_PresentableObject.cxx @@ -30,6 +30,7 @@ PrsMgr_PresentableObject::PrsMgr_PresentableObject (const PrsMgr_TypeOfPresentation3d theType) : myTypeOfPresentation3d (theType), myIsMutable (Standard_False), + myZLayer (Graphic3d_ZLayerId_Default), myHasOwnPresentations (Standard_True), myParent (NULL) { @@ -384,25 +385,34 @@ void PrsMgr_PresentableObject::RemoveChild (const Handle(PrsMgr_PresentableObjec //function : SetZLayer //purpose : //======================================================================= -void PrsMgr_PresentableObject::SetZLayer - (const Handle(PrsMgr_PresentationManager)& thePrsMgr, - const Standard_Integer theLayerId) +void PrsMgr_PresentableObject::SetZLayer (const Graphic3d_ZLayerId theLayerId) { - if (!thePrsMgr.IsNull()) - thePrsMgr->SetZLayer (this, theLayerId); + if (myZLayer == theLayerId) + { + return; + } + + myZLayer = theLayerId; + for (Standard_Integer aPrsIter = 1; aPrsIter <= myPresentations.Length(); ++aPrsIter) + { + const PrsMgr_ModedPresentation& aModedPrs = myPresentations (aPrsIter); + if (aModedPrs.Presentation().IsNull() + || aModedPrs.Presentation()->Presentation().IsNull()) + { + continue; + } + + aModedPrs.Presentation()->Presentation()->SetZLayer (theLayerId); + } } //======================================================================= -//function : GetZLayer +//function : ZLayer //purpose : //======================================================================= -Standard_Integer PrsMgr_PresentableObject::GetZLayer - (const Handle(PrsMgr_PresentationManager)& thePrsMgr) const +Graphic3d_ZLayerId PrsMgr_PresentableObject::ZLayer() const { - if (!thePrsMgr.IsNull()) - return thePrsMgr->GetZLayer (this); - - return -1; + return myZLayer; } // ======================================================================= diff --git a/src/PrsMgr/PrsMgr_Presentation.cdl b/src/PrsMgr/PrsMgr_Presentation.cdl index 96f2767198..c1923e239d 100644 --- a/src/PrsMgr/PrsMgr_Presentation.cdl +++ b/src/PrsMgr/PrsMgr_Presentation.cdl @@ -21,9 +21,11 @@ uses PresentationManager from PrsMgr, NameOfColor from Quantity, + Color from Quantity, Transformation from Geom, Length from Quantity, ShadingAspect from Prs3d, + TypeOfHighlightMethod from Aspect, TypeOfPresentation3d from PrsMgr, DataStructureManager from Graphic3d, Structure from Graphic3d, @@ -45,57 +47,52 @@ is ---C++: alias ~ Display (me : mutable) - is virtual private; + is private; - Display (me : mutable; + display (me : mutable; theIsHighlight : Boolean from Standard) is static private; ---Purpose: Displays myStructure. Erase (me : mutable) - is virtual private; + is private; SetVisible (me : mutable; theValue : Boolean from Standard) - is virtual private; + is private; - Highlight (me : mutable) is virtual private; + Highlight (me : mutable; + theMethod : TypeOfHighlightMethod from Aspect; + theColor : Color from Quantity) is private; - Unhighlight (me) is virtual private; + Unhighlight (me) is private; IsHighlighted (me) returns Boolean from Standard - is virtual private; + is private; IsDisplayed (me) returns Boolean from Standard - is virtual private; + is private; DisplayPriority(me) returns Integer from Standard - is virtual private; + is private; SetDisplayPriority(me:mutable;aNewPrior:Integer from Standard) - is virtual private; + is private; SetZLayer (me : mutable; theLayerId : Integer from Standard) - is virtual private; + is private; ---Purpose: Set Z layer ID for the presentation GetZLayer (me) returns Integer from Standard - is virtual private; + is private; ---Purpose: Get Z layer ID for the presentation Clear (me : mutable) - is virtual private; + is private; ---Purpose: removes the whole content of the presentation. -- Does not remove the other connected presentations. - Color (me : mutable; - theColor : NameOfColor from Quantity) - is virtual private; - - BoundBox (me) - is static private; - ---Category: references to other presentation. Connect (me; diff --git a/src/PrsMgr/PrsMgr_Presentation.cxx b/src/PrsMgr/PrsMgr_Presentation.cxx index facc71efbb..b9c165afef 100644 --- a/src/PrsMgr/PrsMgr_Presentation.cxx +++ b/src/PrsMgr/PrsMgr_Presentation.cxx @@ -30,7 +30,7 @@ namespace State_Visible }; - static BeforeHighlightState StructureState(const Handle(PrsMgr_Prs) theStructure) + static BeforeHighlightState StructureState(const Handle(PrsMgr_Prs)& theStructure) { return !theStructure->IsDisplayed() ? State_Empty : !theStructure->IsVisible() ? @@ -61,15 +61,15 @@ PrsMgr_Presentation::PrsMgr_Presentation (const Handle(PrsMgr_PresentationManage //======================================================================= void PrsMgr_Presentation::Display() { - Display (Standard_False); + display (Standard_False); myBeforeHighlightState = State_Visible; } //======================================================================= -//function : Display +//function : display //purpose : //======================================================================= -void PrsMgr_Presentation::Display (const Standard_Boolean theIsHighlight) +void PrsMgr_Presentation::display (const Standard_Boolean theIsHighlight) { if (!myStructure->IsDisplayed()) { @@ -116,15 +116,16 @@ void PrsMgr_Presentation::SetVisible (const Standard_Boolean theValue) //function : Highlight //purpose : //======================================================================= -void PrsMgr_Presentation::Highlight() +void PrsMgr_Presentation::Highlight (const Aspect_TypeOfHighlightMethod theMethod, + const Quantity_Color& theColor) { if (!IsHighlighted()) { myBeforeHighlightState = StructureState (myStructure); } - Display (Standard_True); - myStructure->Highlight(); + display (Standard_True); + myStructure->Highlight (theMethod, theColor); } //======================================================================= @@ -169,30 +170,6 @@ void PrsMgr_Presentation::Clear() myStructure->RemoveAll(); } -//======================================================================= -//function : Color -//purpose : -//======================================================================= -void PrsMgr_Presentation::Color (const Quantity_NameOfColor theColor) -{ - if (!IsHighlighted()) - { - myBeforeHighlightState = StructureState (myStructure); - } - - Display (Standard_True); - myStructure->Color (theColor); -} - -//======================================================================= -//function : BoundBox -//purpose : -//======================================================================= -void PrsMgr_Presentation::BoundBox() const -{ - myStructure->BoundBox(); -} - //======================================================================= //function : IsDisplayed //purpose : diff --git a/src/PrsMgr/PrsMgr_PresentationManager.cdl b/src/PrsMgr/PrsMgr_PresentationManager.cdl index 970982d2b2..52dfb9394b 100644 --- a/src/PrsMgr/PrsMgr_PresentationManager.cdl +++ b/src/PrsMgr/PrsMgr_PresentationManager.cdl @@ -28,10 +28,12 @@ uses PresentableObject from PrsMgr, ListOfPresentations from PrsMgr, Length,NameOfColor from Quantity, + Color from Quantity, Transformation from Geom, NameOfMaterial from Graphic3d, Presentation from PrsMgr, View from V3d, + ViewManager from Visual3d, ShadingAspect from Prs3d, Presentation from Prs3d @@ -41,7 +43,7 @@ raises is - Create (theStructureManager : StructureManager from Graphic3d) + Create (theStructureManager : ViewManager from Visual3d) returns PresentationManager from PrsMgr; ---Purpose: -- Creates a framework to manage displays and graphic entities with the 3D view theStructureManager. @@ -232,30 +234,26 @@ is Presentation (me; thePrsObject : PresentableObject from PrsMgr; - theMode : Integer from Standard = 0) + theMode : Integer from Standard = 0; + theToCreate : Boolean from Standard = Standard_False) returns Presentation from PrsMgr - raises NoSuchObject from Standard is static; - ---Purpose: Returns the presentation Presentation of the presentable object thePrsObject in this framework. thePrsObject has the display mode theMode. - - AddPresentation (me : mutable; - thePrsObject : PresentableObject from PrsMgr; - theMode : Integer from Standard = 0) - ---Purpose: Adds a presentation of the presentable object thePrsObject to this framework. - -- thePrsObject has the display mode theMode. - is protected; + ---Purpose: Returns the presentation Presentation of the presentable object thePrsObject in this framework. + -- When theToCreate is true - automatically creates presentation for specified mode when not exist. RemovePresentation (me : mutable; thePrsObject : PresentableObject from PrsMgr; theMode : Integer from Standard = 0) + returns Boolean from Standard ---Purpose: Removes a presentation of the presentable object thePrsObject to this framework. thePrsObject has the display mode theMode. is protected; fields - myStructureManager : StructureManager from Graphic3d is protected; + myStructureManager : ViewManager from Visual3d is protected; myImmediateModeOn : Integer from Standard is protected; myImmediateList : ListOfPresentations from PrsMgr is protected; myImmediateView : View from V3d is protected; + mySelectionColor : Color from Quantity is protected; end PresentationManager from PrsMgr; diff --git a/src/PrsMgr/PrsMgr_PresentationManager.cxx b/src/PrsMgr/PrsMgr_PresentationManager.cxx index 79fca1fd81..83bb668a39 100644 --- a/src/PrsMgr/PrsMgr_PresentationManager.cxx +++ b/src/PrsMgr/PrsMgr_PresentationManager.cxx @@ -29,9 +29,10 @@ // function : PrsMgr_PresentationManager // purpose : // ======================================================================= -PrsMgr_PresentationManager::PrsMgr_PresentationManager (const Handle(Graphic3d_StructureManager)& theStructureManager) +PrsMgr_PresentationManager::PrsMgr_PresentationManager (const Handle(Visual3d_ViewManager)& theStructureManager) : myStructureManager (theStructureManager), - myImmediateModeOn (0) + myImmediateModeOn (0), + mySelectionColor (Quantity_NOC_GRAY99) { // } @@ -45,15 +46,7 @@ void PrsMgr_PresentationManager::Display (const Handle(PrsMgr_PresentableObject) { if (thePrsObj->HasOwnPresentations()) { - if (!HasPresentation (thePrsObj, theMode)) - { - AddPresentation (thePrsObj, theMode); - } - - Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); - - if (aPrs.IsNull()) return; - + Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True); if (aPrs->MustBeUpdated()) { Update (thePrsObj, theMode); @@ -91,10 +84,21 @@ void PrsMgr_PresentationManager::Erase (const Handle(PrsMgr_PresentableObject)& Erase (anIter.Value(), theMode); } - if (HasPresentation (thePrsObj, theMode)) + PrsMgr_Presentations& aPrsList = thePrsObj->Presentations(); + for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter) { - Presentation (thePrsObj, theMode)->Erase(); - RemovePresentation (thePrsObj, theMode); + const PrsMgr_ModedPresentation& aModedPrs = aPrsList.Value (aPrsIter); + const Handle(PrsMgr_PresentationManager)& aPrsMgr = aModedPrs.Presentation()->PresentationManager(); + if (theMode == aPrsList (aPrsIter).Mode() + && this == aPrsMgr) + { + if (!aModedPrs.Presentation().IsNull()) + { + aModedPrs.Presentation()->Erase(); + } + aPrsList.Remove (aPrsIter); + return; + } } } @@ -110,9 +114,10 @@ void PrsMgr_PresentationManager::Clear (const Handle(PrsMgr_PresentableObject)& Clear (anIter.Value(), theMode); } - if (HasPresentation (thePrsObj, theMode)) + const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); + if (!aPrs.IsNull()) { - Presentation (thePrsObj, theMode)->Clear(); + aPrs->Clear(); } } @@ -152,14 +157,7 @@ void PrsMgr_PresentationManager::Highlight (const Handle(PrsMgr_PresentableObjec return; } - if (!HasPresentation (thePrsObj, theMode)) - { - AddPresentation (thePrsObj, theMode); - } - - if (!HasPresentation (thePrsObj, theMode)) return; - - Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); + Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True); if (aPrs->MustBeUpdated()) { Update (thePrsObj, theMode); @@ -168,12 +166,12 @@ void PrsMgr_PresentationManager::Highlight (const Handle(PrsMgr_PresentableObjec if (myImmediateModeOn > 0) { Handle(Prs3d_PresentationShadow) aShadow = new Prs3d_PresentationShadow (myStructureManager, aPrs->Presentation()); - aShadow->Highlight(); + aShadow->Highlight (Aspect_TOHM_COLOR, mySelectionColor); AddToImmediateList (aShadow); } else { - aPrs->Highlight(); + aPrs->Highlight (Aspect_TOHM_COLOR, mySelectionColor); } } @@ -189,9 +187,10 @@ void PrsMgr_PresentationManager::Unhighlight (const Handle(PrsMgr_PresentableObj Unhighlight (anIter.Value(), theMode); } - if (HasPresentation (thePrsObj, theMode)) + const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); + if (!aPrs.IsNull()) { - Presentation (thePrsObj, theMode)->Unhighlight(); + aPrs->Unhighlight(); } } @@ -208,9 +207,10 @@ void PrsMgr_PresentationManager::SetDisplayPriority (const Handle(PrsMgr_Present SetDisplayPriority (anIter.Value(), theMode, theNewPrior); } - if (HasPresentation (thePrsObj, theMode)) + const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); + if (!aPrs.IsNull()) { - Presentation (thePrsObj, theMode)->SetDisplayPriority (theNewPrior); + aPrs->SetDisplayPriority (theNewPrior); } } @@ -230,9 +230,10 @@ Standard_Integer PrsMgr_PresentationManager::DisplayPriority (const Handle(PrsMg } } - return HasPresentation (thePrsObj, theMode) - ? Presentation (thePrsObj, theMode)->DisplayPriority() - : 0; + const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); + return !aPrs.IsNull() + ? aPrs->DisplayPriority() + : 0; } // ======================================================================= @@ -250,8 +251,9 @@ Standard_Boolean PrsMgr_PresentationManager::IsDisplayed (const Handle(PrsMgr_Pr } } - return HasPresentation (thePrsObj, theMode) - && Presentation (thePrsObj, theMode)->IsDisplayed(); + const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); + return !aPrs.IsNull() + && aPrs->IsDisplayed(); } // ======================================================================= @@ -269,8 +271,9 @@ Standard_Boolean PrsMgr_PresentationManager::IsHighlighted (const Handle(PrsMgr_ } } - return HasPresentation (thePrsObj, theMode) - && Presentation (thePrsObj, theMode)->IsHighlighted(); + const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); + return !aPrs.IsNull() + && aPrs->IsHighlighted(); } // ======================================================================= @@ -284,10 +287,6 @@ void PrsMgr_PresentationManager::Update (const Handle(PrsMgr_PresentableObject)& { Update (anIter.Value(), theMode); } - if (!HasPresentation(thePrsObj, theMode)) - { - return; - } Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); if (!aPrs.IsNull()) @@ -405,14 +404,10 @@ Standard_Boolean PrsMgr_PresentationManager::HasPresentation (const Handle(PrsMg // purpose : // ======================================================================= Handle(PrsMgr_Presentation) PrsMgr_PresentationManager::Presentation (const Handle(PrsMgr_PresentableObject)& thePrsObj, - const Standard_Integer theMode) const + const Standard_Integer theMode, + const Standard_Boolean theToCreate) const { const PrsMgr_Presentations& aPrsList = thePrsObj->Presentations(); - if (aPrsList.IsEmpty()) - { - return Handle(PrsMgr_Presentation)(); - } - for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter) { const PrsMgr_ModedPresentation& aModedPrs = aPrsList.Value (aPrsIter); @@ -424,46 +419,41 @@ Handle(PrsMgr_Presentation) PrsMgr_PresentationManager::Presentation (const Hand } } - return Handle(PrsMgr_Presentation)(); -} + if (!theToCreate) + { + return Handle(PrsMgr_Presentation)(); + } -// ======================================================================= -// function : AddPresentation -// purpose : -// ======================================================================= -void PrsMgr_PresentationManager::AddPresentation (const Handle(PrsMgr_PresentableObject)& thePrsObj, - const Standard_Integer theMode) -{ Handle(PrsMgr_Presentation) aPrs = new PrsMgr_Presentation (this, thePrsObj); + aPrs->SetZLayer (thePrsObj->ZLayer()); thePrsObj->Presentations().Append (PrsMgr_ModedPresentation (aPrs, theMode)); thePrsObj->Fill (this, aPrs, theMode); // set layer index accordingly to object's presentations - const Standard_Integer aZLayerId = GetZLayer (thePrsObj); - if (aZLayerId >= 0) - { - aPrs->SetZLayer (aZLayerId); - } aPrs->SetUpdateStatus (Standard_False); + return aPrs; } // ======================================================================= // function : RemovePresentation // purpose : // ======================================================================= -void PrsMgr_PresentationManager::RemovePresentation (const Handle(PrsMgr_PresentableObject)& thePrsObj, - const Standard_Integer theMode) +Standard_Boolean PrsMgr_PresentationManager::RemovePresentation (const Handle(PrsMgr_PresentableObject)& thePrsObj, + const Standard_Integer theMode) { PrsMgr_Presentations& aPrsList = thePrsObj->Presentations(); for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter) { - if (theMode == aPrsList (aPrsIter).Mode()) - // && this == aPrsMgr) ?? + const PrsMgr_ModedPresentation& aModedPrs = aPrsList.Value (aPrsIter); + const Handle(PrsMgr_PresentationManager)& aPrsMgr = aModedPrs.Presentation()->PresentationManager(); + if (theMode == aPrsList (aPrsIter).Mode() + && this == aPrsMgr) { aPrsList.Remove (aPrsIter); - break; + return Standard_True; } } + return Standard_False; } // ======================================================================= @@ -481,15 +471,8 @@ void PrsMgr_PresentationManager::SetZLayer (const Handle(PrsMgr_PresentableObjec { return; } - PrsMgr_Presentations& aPrsList = thePrsObj->Presentations(); - for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter) - { - Handle(PrsMgr_Presentation) aPrs = aPrsList.ChangeValue (aPrsIter).Presentation(); - if (aPrs->PresentationManager() == this) - { - aPrs->SetZLayer (theLayerId); - } - } + + thePrsObj->SetZLayer (theLayerId); } // ======================================================================= @@ -498,28 +481,7 @@ void PrsMgr_PresentationManager::SetZLayer (const Handle(PrsMgr_PresentableObjec // ======================================================================= Standard_Integer PrsMgr_PresentationManager::GetZLayer (const Handle(PrsMgr_PresentableObject)& thePrsObj) const { - for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next()) - { - Standard_Integer aLayer = GetZLayer (anIter.Value()); - if (aLayer != -1) - { - return aLayer; - } - } - if (!thePrsObj->HasOwnPresentations()) - { - return -1; - } - const PrsMgr_Presentations& aPrsList = thePrsObj->Presentations(); - for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter) - { - Handle(PrsMgr_Presentation) aPrs = aPrsList.Value (aPrsIter).Presentation(); - if (aPrs->PresentationManager() == this) - { - return aPrs->GetZLayer(); - } - } - return -1; + return thePrsObj->ZLayer(); } // ======================================================================= @@ -531,15 +493,9 @@ void PrsMgr_PresentationManager::Connect (const Handle(PrsMgr_PresentableObject) const Standard_Integer theMode, const Standard_Integer theOtherMode) { - if (!HasPresentation (thePrsObject, theMode)) - { - AddPresentation (thePrsObject, theMode); - } - if (!HasPresentation (theOtherObject, theOtherMode)) - { - AddPresentation (theOtherObject, theOtherMode); - } - Presentation (thePrsObject, theMode)->Connect (Presentation (theOtherObject, theOtherMode)); + Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObject, theMode, Standard_True); + Handle(PrsMgr_Presentation) aPrsOther = Presentation (theOtherObject, theOtherMode, Standard_True); + aPrs->Connect (aPrsOther); } // ======================================================================= @@ -571,14 +527,7 @@ void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)& return; } - if (!HasPresentation (thePrsObj, theMode)) - { - AddPresentation (thePrsObj, theMode); - } - - if (!HasPresentation (thePrsObj, theMode)) return; - - Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); + Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True); if (aPrs->MustBeUpdated()) { Update (thePrsObj, theMode); @@ -587,12 +536,12 @@ void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)& if (myImmediateModeOn > 0) { Handle(Prs3d_PresentationShadow) aShadow = new Prs3d_PresentationShadow (myStructureManager, aPrs->Presentation()); - aShadow->Color (theColor); + aShadow->Highlight (Aspect_TOHM_COLOR, theColor); AddToImmediateList (aShadow); } else { - aPrs->Color (theColor); + aPrs->Highlight (Aspect_TOHM_COLOR, theColor); } } @@ -600,18 +549,15 @@ void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)& // function : BoundBox // purpose : // ======================================================================= -void PrsMgr_PresentationManager::BoundBox (const Handle(PrsMgr_PresentableObject)& thePrsObject, +void PrsMgr_PresentationManager::BoundBox (const Handle(PrsMgr_PresentableObject)& thePrsObj, const Standard_Integer theMode) { - if (!HasPresentation (thePrsObject, theMode)) - { - AddPresentation (thePrsObject, theMode); - } - else if (Presentation (thePrsObject, theMode)->MustBeUpdated()) + Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True); + if (aPrs->MustBeUpdated()) { - Update (thePrsObject, theMode); + Update (thePrsObj, theMode); } - Presentation (thePrsObject, theMode)->BoundBox(); + aPrs->Highlight (Aspect_TOHM_BOUNDBOX, mySelectionColor); } // ======================================================================= @@ -633,12 +579,13 @@ void PrsMgr_PresentationManager::SetShadingAspect (const Handle(PrsMgr_Presentab // function : SetShadingAspect // purpose : // ======================================================================= -void PrsMgr_PresentationManager::SetShadingAspect (const Handle(PrsMgr_PresentableObject)& thePrsObject, +void PrsMgr_PresentationManager::SetShadingAspect (const Handle(PrsMgr_PresentableObject)& thePrsObj, const Handle(Prs3d_ShadingAspect)& theShadingAspect, const Standard_Integer theMode) { - if (HasPresentation (thePrsObject, theMode)) + const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode); + if (!aPrs.IsNull()) { - Presentation (thePrsObject, theMode)->SetShadingAspect (theShadingAspect); + aPrs->SetShadingAspect (theShadingAspect); } } diff --git a/src/SelectMgr/SelectMgr_EntityOwner.cdl b/src/SelectMgr/SelectMgr_EntityOwner.cdl index 38a5ca2398..14812cb331 100644 --- a/src/SelectMgr/SelectMgr_EntityOwner.cdl +++ b/src/SelectMgr/SelectMgr_EntityOwner.cdl @@ -36,7 +36,8 @@ uses NameOfColor from Quantity, Location from TopLoc, PresentationManager from PrsMgr, - PresentationManager3d from PrsMgr + PresentationManager3d from PrsMgr, + ZLayerId from Graphic3d raises NoSuchObject from Standard @@ -161,8 +162,7 @@ is -- it always return FALSE. SetZLayer ( me : mutable; - thePrsMgr : PresentationManager from PrsMgr; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is virtual; ---Purpose: Set Z layer ID and update all presentations. diff --git a/src/SelectMgr/SelectMgr_EntityOwner.cxx b/src/SelectMgr/SelectMgr_EntityOwner.cxx index 351754590f..de07861a84 100644 --- a/src/SelectMgr/SelectMgr_EntityOwner.cxx +++ b/src/SelectMgr/SelectMgr_EntityOwner.cxx @@ -153,8 +153,7 @@ Standard_Boolean SelectMgr_EntityOwner::IsForcedHilight () const //function : SetZLayer //purpose : //======================================================================= -void SelectMgr_EntityOwner::SetZLayer - (const Handle(PrsMgr_PresentationManager)&, - const Standard_Integer) +void SelectMgr_EntityOwner::SetZLayer (const Standard_Integer ) { + // } diff --git a/src/SelectMgr/SelectMgr_SelectableObject.cdl b/src/SelectMgr/SelectMgr_SelectableObject.cdl index 7ef3da878f..624e4019ad 100644 --- a/src/SelectMgr/SelectMgr_SelectableObject.cdl +++ b/src/SelectMgr/SelectMgr_SelectableObject.cdl @@ -39,7 +39,8 @@ uses SequenceOfOwner from SelectMgr, NameOfColor from Quantity, EntityOwner from SelectMgr, - TransModeFlags from Graphic3d + TransModeFlags from Graphic3d, + ZLayerId from Graphic3d raises NotImplemented from Standard @@ -178,16 +179,12 @@ is GetSelectPresentation( me: mutable; TheMgr: PresentationManager3d from PrsMgr ) returns Presentation from Prs3d is static; - + SetZLayer ( me : mutable; - thePrsMgr : PresentationManager from PrsMgr; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is redefined virtual; - ---Purpose: Set Z layer ID and update all presentations of - -- the selectable object. The layer can be set only for displayed object. - -- If all object presentations are removed, the layer ID will be set to - -- default value when computing presentation. The layers mechanism allows - -- drawing objects in higher layers in overlay of objects in lower layers. + ---Purpose: Set Z layer ID and update all presentations of the selectable object. + -- The layers mechanism allows drawing objects in higher layers in overlay of objects in lower layers. fields @@ -199,6 +196,3 @@ fields myHilightPrs : Presentation from Prs3d; end SelectableObject; - - - diff --git a/src/SelectMgr/SelectMgr_SelectableObject.cxx b/src/SelectMgr/SelectMgr_SelectableObject.cxx index 764306e481..070b52aa97 100644 --- a/src/SelectMgr/SelectMgr_SelectableObject.cxx +++ b/src/SelectMgr/SelectMgr_SelectableObject.cxx @@ -322,15 +322,10 @@ Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetSelectPresentation( co //function : SetZLayer //purpose : //======================================================================= -void SelectMgr_SelectableObject::SetZLayer - (const Handle(PrsMgr_PresentationManager)& thePrsMgr, - const Standard_Integer theLayerId) +void SelectMgr_SelectableObject::SetZLayer (const Graphic3d_ZLayerId theLayerId) { - if (thePrsMgr.IsNull()) - return; - // update own presentations - PrsMgr_PresentableObject::SetZLayer (thePrsMgr, theLayerId); + PrsMgr_PresentableObject::SetZLayer (theLayerId); // update selection presentations if (!mySelectionPrs.IsNull()) @@ -352,7 +347,7 @@ void SelectMgr_SelectableObject::SetZLayer Handle(SelectMgr_EntityOwner) aOwner = Handle(SelectMgr_EntityOwner)::DownCast (aEntity->OwnerId()); if (!aOwner.IsNull()) - aOwner->SetZLayer (thePrsMgr, theLayerId); + aOwner->SetZLayer (theLayerId); } } } diff --git a/src/StdSelect/StdSelect_BRepOwner.cdl b/src/StdSelect/StdSelect_BRepOwner.cdl index 7ea2e9e7cd..23988683b4 100644 --- a/src/StdSelect/StdSelect_BRepOwner.cdl +++ b/src/StdSelect/StdSelect_BRepOwner.cdl @@ -34,7 +34,8 @@ uses PresentationManager3d from PrsMgr, NameOfColor from Quantity, Drawer from Prs3d, - Shape from StdSelect + Shape from StdSelect, + ZLayerId from Graphic3d is @@ -145,8 +146,7 @@ is ResetLocation(me:mutable) is redefined; SetZLayer ( me : mutable; - thePrsMgr : PresentationManager from PrsMgr; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is redefined virtual; ---Purpose: Set Z layer ID and update all presentations. diff --git a/src/StdSelect/StdSelect_BRepOwner.cxx b/src/StdSelect/StdSelect_BRepOwner.cxx index a91bf45e1f..36e3d1dea1 100644 --- a/src/StdSelect/StdSelect_BRepOwner.cxx +++ b/src/StdSelect/StdSelect_BRepOwner.cxx @@ -87,6 +87,7 @@ void StdSelect_BRepOwner::Hilight(const Handle(PrsMgr_PresentationManager)& PM, #else Standard_Integer M = (myCurMode==-1) ? aMode:myCurMode; #endif + Handle(SelectMgr_SelectableObject) aSel = Selectable(); if (myFromDecomposition) { // do the update flag check @@ -99,23 +100,23 @@ void StdSelect_BRepOwner::Hilight(const Handle(PrsMgr_PresentationManager)& PM, } // generate new presentable shape - if(myPrsSh.IsNull()) + if (myPrsSh.IsNull()) + { myPrsSh = new StdSelect_Shape (myShape); - - // highlight and set layer - PM->Highlight (myPrsSh, M); - Handle(SelectMgr_SelectableObject) aSel = Selectable(); + } if (!aSel.IsNull()) { - Standard_Integer aLayer = aSel->GetZLayer (PM); - if (aLayer >= 0) - PM->SetZLayer (myPrsSh, aLayer); + myPrsSh->SetZLayer (aSel->ZLayer()); } + + // highlight and set layer + PM->Highlight (myPrsSh, M); + } else { if(myPrsSh.IsNull()) - PM->Highlight(Selectable(),M); + PM->Highlight(aSel,M); else PM->Highlight(myPrsSh,M); } @@ -133,6 +134,7 @@ void StdSelect_BRepOwner::HilightWithColor(const Handle(PrsMgr_PresentationManag #else Standard_Integer M = (myCurMode==-1) ? aMode:myCurMode; #endif + Handle(SelectMgr_SelectableObject) aSel = Selectable(); if (myFromDecomposition) { // do the update flag check @@ -156,21 +158,18 @@ void StdSelect_BRepOwner::HilightWithColor(const Handle(PrsMgr_PresentationManag else myPrsSh = new StdSelect_Shape(myShape); } - - // highlight with color and set layer - PM->Color (myPrsSh, aCol, M); - Handle(SelectMgr_SelectableObject) aSel = Selectable(); if (!aSel.IsNull()) { - Standard_Integer aLayer = aSel->GetZLayer (PM); - if (aLayer >= 0) - PM->SetZLayer (myPrsSh, aLayer); + myPrsSh->SetZLayer (aSel->ZLayer()); } + + // highlight with color and set layer + PM->Color (myPrsSh, aCol, M); } else { if(myPrsSh.IsNull()) - PM->Color(Selectable(),aCol,M); + PM->Color(aSel, aCol, M); else PM->Color(myPrsSh,aCol,M); } @@ -227,10 +226,10 @@ void StdSelect_BRepOwner::ResetLocation() //function : SetZLayer //purpose : //======================================================================= -void StdSelect_BRepOwner::SetZLayer - (const Handle(PrsMgr_PresentationManager)& thePrsMgr, - const Standard_Integer theLayerId) +void StdSelect_BRepOwner::SetZLayer (const Graphic3d_ZLayerId theLayerId) { if (!myPrsSh.IsNull()) - thePrsMgr->SetZLayer (myPrsSh, theLayerId); + { + myPrsSh->SetZLayer (theLayerId); + } } diff --git a/src/V3d/V3d_CircularGrid.cxx b/src/V3d/V3d_CircularGrid.cxx index 9dd96274b2..9d3a5670d9 100644 --- a/src/V3d/V3d_CircularGrid.cxx +++ b/src/V3d/V3d_CircularGrid.cxx @@ -96,7 +96,8 @@ void V3d_CircularGrid::SetColors (const Quantity_Color& aColor, const Quantity_C void V3d_CircularGrid::Display () { - myStructure->Display (1); + myStructure->SetDisplayPriority (1); + myStructure->Display(); } void V3d_CircularGrid::Erase () const diff --git a/src/V3d/V3d_DirectionalLight.cxx b/src/V3d/V3d_DirectionalLight.cxx index 91b76763bb..3dae2b6d21 100644 --- a/src/V3d/V3d_DirectionalLight.cxx +++ b/src/V3d/V3d_DirectionalLight.cxx @@ -236,7 +236,6 @@ void V3d_DirectionalLight::Display( const Handle(V3d_View)& aView, } Handle(Graphic3d_Group) gnopick = MyGraphicStructure1->NewGroup(); - MyGraphicStructure1->SetPick(Standard_False); X0 = MyTarget.X(); Y0 = MyTarget.Y(); diff --git a/src/V3d/V3d_Plane.cxx b/src/V3d/V3d_Plane.cxx index 9af803b87e..5b3ce17f81 100755 --- a/src/V3d/V3d_Plane.cxx +++ b/src/V3d/V3d_Plane.cxx @@ -85,7 +85,8 @@ void V3d_Plane::Display (const Handle(V3d_View)& theView, aPrims->AddVertex ( aSize,-aSize, anOffset); aGroup->AddPrimitiveArray(aPrims); - myGraphicStructure->Display(0); + myGraphicStructure->SetDisplayPriority (0); + myGraphicStructure->Display(); Update(); } diff --git a/src/V3d/V3d_PositionLight.cxx b/src/V3d/V3d_PositionLight.cxx index 1fc845e988..72e311fdf1 100644 --- a/src/V3d/V3d_PositionLight.cxx +++ b/src/V3d/V3d_PositionLight.cxx @@ -180,7 +180,6 @@ void V3d_PositionLight::Display( const Handle(V3d_View)& aView, } Handle(Graphic3d_Group) gnopick = MyGraphicStructure1->NewGroup(); - MyGraphicStructure1->SetPick(Standard_False); X0 = MyTarget.X(); Y0 = MyTarget.Y(); diff --git a/src/V3d/V3d_PositionalLight.cxx b/src/V3d/V3d_PositionalLight.cxx index a0c8c40804..0c58b9435f 100644 --- a/src/V3d/V3d_PositionalLight.cxx +++ b/src/V3d/V3d_PositionalLight.cxx @@ -228,7 +228,6 @@ void V3d_PositionalLight::Display( const Handle(V3d_View)& aView, } Handle(Graphic3d_Group) gnopick = MyGraphicStructure1->NewGroup(); - MyGraphicStructure1->SetPick(Standard_False); X0 = MyTarget.X(); Y0 = MyTarget.Y(); diff --git a/src/V3d/V3d_RectangularGrid.cxx b/src/V3d/V3d_RectangularGrid.cxx index ae546a3201..cf38481c2b 100644 --- a/src/V3d/V3d_RectangularGrid.cxx +++ b/src/V3d/V3d_RectangularGrid.cxx @@ -96,7 +96,8 @@ void V3d_RectangularGrid::SetColors (const Quantity_Color& aColor, const Quantit void V3d_RectangularGrid::Display () { - myStructure->Display (1); + myStructure->SetDisplayPriority (1); + myStructure->Display(); } void V3d_RectangularGrid::Erase () const diff --git a/src/V3d/V3d_SpotLight.cxx b/src/V3d/V3d_SpotLight.cxx index f82cd6290d..ed294772a3 100644 --- a/src/V3d/V3d_SpotLight.cxx +++ b/src/V3d/V3d_SpotLight.cxx @@ -246,7 +246,6 @@ void V3d_SpotLight::Display( const Handle(V3d_View)& aView, } Handle(Graphic3d_Group) gnopick = MyGraphicStructure1->NewGroup(); - MyGraphicStructure1->SetPick(Standard_False); X0 = MyTarget.X(); Y0 = MyTarget.Y(); diff --git a/src/ViewerTest/ViewerTest.cxx b/src/ViewerTest/ViewerTest.cxx index 8afa76689c..2b3a5ceb4b 100644 --- a/src/ViewerTest/ViewerTest.cxx +++ b/src/ViewerTest/ViewerTest.cxx @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -2223,8 +2224,9 @@ int VErase (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec) { - const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext(); - ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView()); + const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext(); + const Handle(V3d_View)& aView = ViewerTest::CurrentView(); + ViewerTest_AutoUpdater anUpdateTool (aCtx, aView); if (aCtx.IsNull()) { std::cerr << "Error: no active view!\n"; @@ -2473,7 +2475,11 @@ inline void bndPresentation (Draw_Interpretor& theDI, } case BndAction_Show: { - thePrs->Presentation()->BoundBox(); + Handle(Graphic3d_Structure) aPrs = thePrs->Presentation(); + aPrs->CStructure()->HighlightColor.r = 0.988235f; + aPrs->CStructure()->HighlightColor.g = 0.988235f; + aPrs->CStructure()->HighlightColor.b = 0.988235f; + aPrs->CStructure()->HighlightWithBndBox (aPrs, Standard_True); break; } case BndAction_Print: @@ -2905,9 +2911,12 @@ static int VDisplay2 (Draw_Interpretor& theDI, // Parse input arguments ViewerTest_AutoUpdater anUpdateTool (aCtx, ViewerTest::CurrentView()); - Standard_Integer isMutable = -1; - Standard_Boolean toDisplayLocal = Standard_False; + Standard_Integer isMutable = -1; + Graphic3d_ZLayerId aZLayer = Graphic3d_ZLayerId_UNKNOWN; + Standard_Boolean toDisplayLocal = Standard_False; + Standard_Boolean toReDisplay = Standard_False; TColStd_SequenceOfAsciiString aNamesOfDisplayIO; + AIS_DisplayStatus aDispStatus = AIS_DS_None; for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) { const TCollection_AsciiString aName = theArgVec[anArgIter]; @@ -2921,10 +2930,50 @@ static int VDisplay2 (Draw_Interpretor& theDI, { isMutable = 1; } + else if (aNameCase == "-neutral") + { + aDispStatus = AIS_DS_Displayed; + } + else if (aNameCase == "-immediate" + || aNameCase == "-top") + { + aZLayer = Graphic3d_ZLayerId_Top; + } + else if (aNameCase == "-topmost") + { + aZLayer = Graphic3d_ZLayerId_Topmost; + } + else if (aNameCase == "-osd" + || aNameCase == "-toposd") + { + aZLayer = Graphic3d_ZLayerId_TopOSD; + } + else if (aNameCase == "-layer") + { + if (++anArgIter >= theArgNb) + { + std::cerr << "Error: wrong syntax at " << aName << ".\n"; + return 1; + } + + TCollection_AsciiString aValue (theArgVec[anArgIter]); + if (!aValue.IsIntegerValue()) + { + std::cerr << "Error: wrong syntax at " << aName << ".\n"; + return 1; + } + + aZLayer = aValue.IntegerValue(); + } else if (aNameCase == "-local") { + aDispStatus = AIS_DS_Temporary; toDisplayLocal = Standard_True; } + else if (aNameCase == "-redisplay") + { + toReDisplay = Standard_True; + } else { aNamesOfDisplayIO.Append (aName); @@ -2962,8 +3011,23 @@ static int VDisplay2 (Draw_Interpretor& theDI, { aShape->SetMutable (isMutable == 1); } + if (aZLayer != Graphic3d_ZLayerId_UNKNOWN) + { + aShape->SetZLayer (aZLayer); + } GetMapOfAIS().Bind (aShape, aName); - aCtx->Display (aShape, Standard_False); + + Standard_Integer aDispMode = aShape->HasDisplayMode() + ? aShape->DisplayMode() + : (aShape->AcceptDisplayMode (aCtx->DisplayMode()) + ? aCtx->DisplayMode() + : 0); + Standard_Integer aSelMode = aShape->HasSelectionMode() && aCtx->GetAutoActivateSelection() + ? aShape->SelectionMode() : -1; + + aCtx->Display (aShape, aDispMode, aSelMode, + Standard_False, aShape->AcceptShapeDecomposition(), + aDispStatus); } continue; } @@ -2976,6 +3040,18 @@ static int VDisplay2 (Draw_Interpretor& theDI, { aShape->SetMutable (isMutable == 1); } + if (aZLayer != Graphic3d_ZLayerId_UNKNOWN) + { + aShape->SetZLayer (aZLayer); + } + + Standard_Integer aDispMode = aShape->HasDisplayMode() + ? aShape->DisplayMode() + : (aShape->AcceptDisplayMode (aCtx->DisplayMode()) + ? aCtx->DisplayMode() + : 0); + Standard_Integer aSelMode = aShape->HasSelectionMode() && aCtx->GetAutoActivateSelection() + ? aShape->SelectionMode() : -1; if (aShape->Type() == AIS_KOI_Datum) { @@ -2984,17 +3060,26 @@ static int VDisplay2 (Draw_Interpretor& theDI, else { theDI << "Display " << aName.ToCString() << "\n"; - // get the Shape from a name - TopoDS_Shape aNewShape = GetShapeFromName (aName.ToCString()); // update the Shape in the AIS_Shape + TopoDS_Shape aNewShape = GetShapeFromName (aName.ToCString()); Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aShape); if (!aShapePrs.IsNull()) { + if (!aShapePrs->Shape().IsEqual (aNewShape)) + { + toReDisplay = Standard_True; + } aShapePrs->Set (aNewShape); } - aCtx->Redisplay (aShape, Standard_False); - aCtx->Display (aShape, Standard_False); + if (toReDisplay) + { + aCtx->Redisplay (aShape, Standard_False); + } + + aCtx->Display (aShape, aDispMode, aSelMode, + Standard_False, aShape->AcceptShapeDecomposition(), + aDispStatus); } } else if (anObj->IsKind (STANDARD_TYPE (NIS_InteractiveObject))) diff --git a/src/ViewerTest/ViewerTest_ViewerCommands.cxx b/src/ViewerTest/ViewerTest_ViewerCommands.cxx index a2b4ebfbcb..395e3d99b8 100644 --- a/src/ViewerTest/ViewerTest_ViewerCommands.cxx +++ b/src/ViewerTest/ViewerTest_ViewerCommands.cxx @@ -3517,6 +3517,18 @@ static int VZLayer (Draw_Interpretor& di, Standard_Integer argc, const char** ar return 1; } + for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anObjIter (GetMapOfAIS()); + anObjIter.More(); anObjIter.Next()) + { + Handle(PrsMgr_PresentableObject) aPrs = Handle(PrsMgr_PresentableObject)::DownCast (anObjIter.Key1()); + if (aPrs.IsNull() + || aPrs->ZLayer() != aDelId) + { + continue; + } + aPrs->SetZLayer (Graphic3d_ZLayerId_Default); + } + di << "Z layer " << aDelId << " has been removed\n"; } else if (anOp == "get") diff --git a/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx b/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx index 172f951450..af99f593d6 100644 --- a/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx +++ b/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx @@ -16,8 +16,9 @@ #include #include +#include #include -typedef NCollection_DataMap Visual3d_MapOfZLayerSettings; +typedef NCollection_DataMap Visual3d_MapOfZLayerSettings; #endif // _Visual3d_MapOfZLayerSettings_HeaderFile diff --git a/src/Visual3d/Visual3d_View.cdl b/src/Visual3d/Visual3d_View.cdl index 30db5d4c63..1badb4a558 100644 --- a/src/Visual3d/Visual3d_View.cdl +++ b/src/Visual3d/Visual3d_View.cdl @@ -85,6 +85,7 @@ uses MapOfStructure from Graphic3d, Camera_Handle from Graphic3d, + ZLayerId from Graphic3d, ZLayerSettings from Graphic3d, ContextView from Visual3d, @@ -107,6 +108,7 @@ uses AsciiString from TCollection, ExtendedString from TCollection, CGraduatedTrihedron from Graphic3d, + TypeOfStructure from Graphic3d, PixMap from Image, Box from Bnd @@ -752,14 +754,12 @@ is -- Category: Private methods ---------------------------- - AcceptDisplay ( me; - AStructure : Structure from Graphic3d ) - returns TypeOfAnswer from Visual3d - is static private; - ---Level: Internal - ---Purpose: Is it possible to display the structure - -- in the view ? - ---Category: Private methods + acceptDisplay ( me; + theStructType : TypeOfStructure from Graphic3d ) + returns TypeOfAnswer from Visual3d + is static private; + ---Level: Internal + ---Purpose: Is it possible to display the structure in the view? ReCompute ( me : mutable; AStructure : Structure from Graphic3d ); @@ -787,13 +787,13 @@ is SetZLayerSettings ( me : mutable; - theLayerId : Integer from Standard; + theLayerId : ZLayerId from Graphic3d; theSettings : ZLayerSettings from Graphic3d ) is static private; ---Purpose: Sets the settings for a single Z layer of specified view. AddZLayer ( me : mutable; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is static private; ---Purpose: Add a new top-level Z layer to the view with ID -- . The z layer mechanism allows to display @@ -803,13 +803,13 @@ is -- display of graphics in all views. RemoveZLayer ( me : mutable; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is static private; ---Purpose: Remove z layer from the view by its ID. ChangeZLayer ( me : mutable; theStructure : Structure from Graphic3d; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is static private; ---Purpose: Change Z layer of already displayed structure in the view. diff --git a/src/Visual3d/Visual3d_View.cxx b/src/Visual3d/Visual3d_View.cxx index 05b0f49fc0..a25e99d561 100644 --- a/src/Visual3d/Visual3d_View.cxx +++ b/src/Visual3d/Visual3d_View.cxx @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -712,10 +711,10 @@ void Visual3d_View::SetContext (const Visual3d_ContextView& theViewCtx) // It is not necessary to warn ViewManager as this structure should not disappear from // the list of structures displayed in it. NCollection_Sequence aStructs; - for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next()) + for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next()) { const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key(); - const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct); + const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual()); if (anAnswer == Visual3d_TOA_NO || anAnswer == Visual3d_TOA_COMPUTE) { @@ -743,7 +742,7 @@ void Visual3d_View::SetContext (const Visual3d_ContextView& theViewCtx) continue; } - const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct); + const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual()); if (anAnswer == Visual3d_TOA_YES || anAnswer == Visual3d_TOA_COMPUTE) { @@ -780,7 +779,7 @@ void Visual3d_View::DisplayedStructures (Graphic3d_MapOfStructure& theStructures return; } - for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next()) + for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next()) { theStructures.Add (aStructIter.Key()); } @@ -825,7 +824,7 @@ void Visual3d_View::Activate() } // If the structure can be displayed in the new context of the view, it is displayed. - const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct); + const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual()); if (anAnswer == Visual3d_TOA_YES || anAnswer == Visual3d_TOA_COMPUTE) { @@ -898,7 +897,7 @@ void Visual3d_View::Deactivate() continue; } - const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct); + const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual()); if (anAnswer == Visual3d_TOA_YES || anAnswer == Visual3d_TOA_COMPUTE) { @@ -1131,13 +1130,13 @@ void Visual3d_View::ZFitAll (const Standard_Real theScaleFactor) } // ======================================================================== -// function : AcceptDisplay +// function : acceptDisplay // purpose : // ======================================================================== -Visual3d_TypeOfAnswer Visual3d_View::AcceptDisplay (const Handle(Graphic3d_Structure)& theStruct) const +Visual3d_TypeOfAnswer Visual3d_View::acceptDisplay (const Graphic3d_TypeOfStructure theStructType) const { - const Visual3d_TypeOfVisualization ViewType = MyContext.Visualization(); - switch (theStruct->Visual()) + const Visual3d_TypeOfVisualization aViewType = MyContext.Visualization(); + switch (theStructType) { case Graphic3d_TOS_ALL: { @@ -1145,19 +1144,19 @@ Visual3d_TypeOfAnswer Visual3d_View::AcceptDisplay (const Handle(Graphic3d_Struc } case Graphic3d_TOS_SHADING: { - return ViewType == Visual3d_TOV_SHADING + return aViewType == Visual3d_TOV_SHADING ? Visual3d_TOA_YES : Visual3d_TOA_NO; } case Graphic3d_TOS_WIREFRAME: { - return ViewType == Visual3d_TOV_WIREFRAME + return aViewType == Visual3d_TOV_WIREFRAME ? Visual3d_TOA_YES : Visual3d_TOA_NO; } case Graphic3d_TOS_COMPUTED: { - return (ViewType == Visual3d_TOV_SHADING || ViewType == Visual3d_TOV_WIREFRAME) + return (aViewType == Visual3d_TOV_SHADING || aViewType == Visual3d_TOV_WIREFRAME) ? Visual3d_TOA_COMPUTE : Visual3d_TOA_NO; } @@ -1260,18 +1259,18 @@ Standard_Boolean Visual3d_View::DisplayImmediate (const Handle(Graphic3d_Structu if (theIsSingleView) { - Handle(Visual3d_HSequenceOfView) aViews = myViewManager->DefinedView(); - - for (int i=1;i<=aViews->Length();i++) + const Visual3d_SequenceOfView& aViews = myViewManager->DefinedViews(); + for (Standard_Integer aViewIter = 1; aViewIter <= aViews.Length(); ++aViewIter) { - if (aViews->Value(i).Access() != this) + const Handle(Visual3d_View)& aView = aViews.Value (aViewIter); + if (aView.Access() != this) { - aViews->Value(i)->EraseImmediate (theStructure); + aView->EraseImmediate (theStructure); } } } - myGraphicDriver->DisplayImmediateStructure (MyCView, *theStructure->CStructure()); + myGraphicDriver->DisplayImmediateStructure (MyCView, theStructure); return Standard_True; } @@ -1301,9 +1300,9 @@ Standard_Boolean Visual3d_View::ClearImmediate() return Standard_False; } - for (Graphic3d_MapIteratorOfMapOfStructure anIter (myImmediateStructures); anIter.More(); anIter.Next()) + for (Graphic3d_MapOfStructure::Iterator aStructIter (myImmediateStructures); aStructIter.More(); aStructIter.Next()) { - myGraphicDriver->EraseImmediateStructure (MyCView, *anIter.Key()->CStructure()); + myGraphicDriver->EraseImmediateStructure (MyCView, *aStructIter.Key()->CStructure()); } myImmediateStructures.Clear(); return Standard_True; @@ -1345,7 +1344,7 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct, anIndex = 0; } - Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (theStruct); + Visual3d_TypeOfAnswer anAnswer = acceptDisplay (theStruct->Visual()); if (anAnswer == Visual3d_TOA_NO) { return; @@ -1358,14 +1357,13 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct, if (anAnswer == Visual3d_TOA_YES) { - if (IsDisplayed (theStruct)) + if (!myStructsDisplayed.Add (theStruct)) { return; } theStruct->CalculateBoundBox(); - myGraphicDriver->DisplayStructure (MyCView, *theStruct->CStructure(), theStruct->DisplayPriority()); - myStructsDisplayed.Add (theStruct); + myGraphicDriver->DisplayStructure (MyCView, theStruct, theStruct->DisplayPriority()); Update (theUpdateMode); return; } @@ -1380,14 +1378,14 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct, const Handle(Graphic3d_Structure)& anOldStruct = myStructsComputed.Value (anIndex); if (anOldStruct->HLRValidation()) { - // Case COMPUTED valid - // to be displayed - if (!IsDisplayed (theStruct)) + // Case COMPUTED valid, to be displayed + if (!myStructsDisplayed.Add (theStruct)) { - myStructsDisplayed.Add (theStruct); - myGraphicDriver->DisplayStructure (MyCView, *anOldStruct->CStructure(), theStruct->DisplayPriority()); - Update (theUpdateMode); + return; } + + myGraphicDriver->DisplayStructure (MyCView, anOldStruct, theStruct->DisplayPriority()); + Update (theUpdateMode); return; } else @@ -1401,25 +1399,25 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct, const Standard_Integer aNewIndex = HaveTheSameOwner (theStruct); if (aNewIndex != 0) { - // Case of COMPUTED invalid, WITH a valid of replacement - // to be displayed - if (!IsDisplayed (theStruct)) + // Case of COMPUTED invalid, WITH a valid of replacement; to be displayed + if (!myStructsDisplayed.Add (theStruct)) { - const Handle(Graphic3d_Structure)& aNewStruct = myStructsComputed.Value (aNewIndex); - myStructsComputed.SetValue (anIndex, aNewStruct); - myStructsDisplayed.Add (theStruct); - myGraphicDriver->DisplayStructure (MyCView, *aNewStruct->CStructure(), theStruct->DisplayPriority()); - Update (theUpdateMode); + return; } + + const Handle(Graphic3d_Structure)& aNewStruct = myStructsComputed.Value (aNewIndex); + myStructsComputed.SetValue (anIndex, aNewStruct); + myGraphicDriver->DisplayStructure (MyCView, aNewStruct, theStruct->DisplayPriority()); + Update (theUpdateMode); return; } else { // Case COMPUTED invalid, WITHOUT a valid of replacement // COMPUTED is removed if displayed - if (IsDisplayed (theStruct)) + if (myStructsDisplayed.Contains (theStruct)) { - myGraphicDriver->EraseStructure (MyCView, *anOldStruct->CStructure()); + myGraphicDriver->EraseStructure (MyCView, anOldStruct); } } } @@ -1484,26 +1482,25 @@ void Visual3d_View::Display (const Handle(Graphic3d_Structure)& theStruct, else { aStruct->SetVisual (toComputeWireframe ? Graphic3d_TOS_WIREFRAME : Graphic3d_TOS_SHADING); - anAnswer = AcceptDisplay (aStruct); + anAnswer = acceptDisplay (aStruct->Visual()); } if (theStruct->IsHighlighted()) { - aStruct->SetHighlightColor (theStruct->HighlightColor()); - aStruct->GraphicHighlight (Aspect_TOHM_COLOR); + aStruct->Highlight (Aspect_TOHM_COLOR, theStruct->HighlightColor(), Standard_False); } // It is displayed only if the calculated structure // has a proper type corresponding to the one of the view. - if (anAnswer != Visual3d_TOA_NO) + if (anAnswer == Visual3d_TOA_NO) { - if (!IsDisplayed (theStruct)) - { - myStructsDisplayed.Add (theStruct); - } - myGraphicDriver->DisplayStructure (MyCView, *aStruct->CStructure(), theStruct->DisplayPriority()); - Update (theUpdateMode); + return; } + + myStructsDisplayed.Add (theStruct); + myGraphicDriver->DisplayStructure (MyCView, aStruct, theStruct->DisplayPriority()); + + Update (theUpdateMode); } // ======================================================================== @@ -1525,13 +1522,14 @@ void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct) void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct, const Aspect_TypeOfUpdate theUpdateMode) { - if (IsDeleted() - || !IsDisplayed (theStruct)) + if ( IsDeleted() + || EraseImmediate (theStruct) + || !IsDisplayed (theStruct)) { return; } - Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (theStruct); + Visual3d_TypeOfAnswer anAnswer = acceptDisplay (theStruct->Visual()); if (!ComputedMode()) { anAnswer = Visual3d_TOA_YES; @@ -1539,7 +1537,7 @@ void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct, if (anAnswer != Visual3d_TOA_COMPUTE) { - myGraphicDriver->EraseStructure (MyCView, *theStruct->CStructure()); + myGraphicDriver->EraseStructure (MyCView, theStruct); } else if (anAnswer == Visual3d_TOA_COMPUTE && myIsInComputedMode) @@ -1548,7 +1546,7 @@ void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct, if (anIndex != 0) { const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex); - myGraphicDriver->EraseStructure (MyCView, *aCompStruct->CStructure()); + myGraphicDriver->EraseStructure (MyCView, aCompStruct); } } myStructsDisplayed.Remove (theStruct); @@ -1566,8 +1564,7 @@ void Visual3d_View::Highlight (const Handle(Graphic3d_Structure)& theStruct, if (anIndex != 0) { const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex); - aCompStruct->SetHighlightColor (theStruct->HighlightColor()); - aCompStruct->GraphicHighlight (theMethod); + aCompStruct->Highlight (theMethod, theStruct->HighlightColor(), Standard_False); } } @@ -1603,7 +1600,7 @@ void Visual3d_View::SetTransform (const Handle(Graphic3d_Structure)& theStruct, && !theStruct->CStructure()->IsForHighlight && !theStruct->CStructure()->IsInfinite) { - const Standard_Integer aLayerId = theStruct->GetZLayer(); + const Graphic3d_ZLayerId aLayerId = theStruct->GetZLayer(); myGraphicDriver->InvalidateBVHData (MyCView, aLayerId); } } @@ -1657,7 +1654,14 @@ Standard_Boolean Visual3d_View::IsDisplayed (const Handle(Graphic3d_Structure)& // ======================================================================== Standard_Boolean Visual3d_View::ContainsFacet() const { - return ContainsFacet (myStructsDisplayed); + for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next()) + { + if (aStructIter.Key()->ContainsFacet()) + { + return Standard_True; + } + } + return Standard_False; } // ======================================================================== @@ -1676,14 +1680,51 @@ Standard_Boolean Visual3d_View::ContainsFacet (const Graphic3d_MapOfStructure& t return Standard_False; } +//! Auxiliary method for MinMaxValues() method +inline void addStructureBndBox (const Handle(Graphic3d_Structure)& theStruct, + const Standard_Boolean theToIgnoreInfiniteFlag, + Bnd_Box& theBndBox) +{ + if (!theStruct->IsVisible()) + { + return; + } + else if (theStruct->IsInfinite() + && !theToIgnoreInfiniteFlag) + { + // XMin, YMin .... ZMax are initialized by means of infinite line data + const Bnd_Box aBox = theStruct->MinMaxValues (Standard_False); + if (!aBox.IsWhole() + && !aBox.IsVoid()) + { + theBndBox.Add (aBox); + } + return; + } + + // Only non-empty and non-infinite structures + // are taken into account for calculation of MinMax + if (theStruct->IsEmpty() + || theStruct->TransformPersistenceMode() != Graphic3d_TMF_None) + { + return; + } + + // "FitAll" operation ignores object with transform persistence parameter + const Bnd_Box aBox = theStruct->MinMaxValues (theToIgnoreInfiniteFlag); + theBndBox.Add (aBox); +} + // ======================================================================== // function : MinMaxValues // purpose : // ======================================================================== Bnd_Box Visual3d_View::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag) const { - return MinMaxValues (myStructsDisplayed, - theToIgnoreInfiniteFlag); + Bnd_Box aResult = MinMaxValues (myStructsDisplayed, theToIgnoreInfiniteFlag); + Bnd_Box anImmediate = MinMaxValues (myImmediateStructures, theToIgnoreInfiniteFlag); + aResult.Add (anImmediate); + return aResult; } // ======================================================================== @@ -1691,45 +1732,18 @@ Bnd_Box Visual3d_View::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteF // purpose : // ======================================================================== Bnd_Box Visual3d_View::MinMaxValues (const Graphic3d_MapOfStructure& theSet, - const Standard_Boolean theToIgnoreInfiniteFlag) const + const Standard_Boolean theToIgnoreInfiniteFlag) const { Bnd_Box aResult; - if (theSet.IsEmpty ()) - { - // Return an empty box. - return aResult; - } - Graphic3d_MapIteratorOfMapOfStructure anIterator (theSet); - for (anIterator.Initialize (theSet); anIterator.More(); anIterator.Next()) + for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (theSet); aStructIter.More(); aStructIter.Next()) { - const Handle(Graphic3d_Structure)& aStructure = anIterator.Key(); - - if (!aStructure->IsVisible()) - continue; - - if (aStructure->IsInfinite() && !theToIgnoreInfiniteFlag) + const Handle(Graphic3d_Structure)& aStructure = aStructIter.Key(); + if (!aStructIter.Value()->IsVisible()) { - //XMin, YMin .... ZMax are initialized by means of infinite line data - Bnd_Box aBox = aStructure->MinMaxValues (Standard_False); - if (!aBox.IsWhole() && !aBox.IsVoid()) - { - aResult.Add (aBox); - } + continue; } - // Only non-empty and non-infinite structures - // are taken into account for calculation of MinMax - if ((!aStructure->IsInfinite() || theToIgnoreInfiniteFlag) && !aStructure->IsEmpty()) - { - Bnd_Box aBox = aStructure->MinMaxValues (theToIgnoreInfiniteFlag); - - /* ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) */ - //"FitAll" operation ignores object with transform persitence parameter - if(aStructure->TransformPersistenceMode() == Graphic3d_TMF_None ) - { - aResult.Add (aBox); - } - } + addStructureBndBox (aStructure, theToIgnoreInfiniteFlag, aResult); } return aResult; } @@ -1862,9 +1876,9 @@ void Visual3d_View::Compute() // Remove structures that were calculated for the previous orientation. // Recalculation of new structures. NCollection_Sequence aStructsSeq; - for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next()) + for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next()) { - const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStructIter.Key()); + const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStructIter.Key()->Visual()); if (anAnswer == Visual3d_TOA_COMPUTE) { aStructsSeq.Append (aStructIter.Key()); // if the structure was calculated, it is recalculated @@ -1902,7 +1916,7 @@ void Visual3d_View::ReCompute (const Handle(Graphic3d_Structure)& theStruct) return; } - const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (theStruct); + const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (theStruct->Visual()); if (anAnswer != Visual3d_TOA_COMPUTE) { return; @@ -1950,13 +1964,12 @@ void Visual3d_View::ReCompute (const Handle(Graphic3d_Structure)& theStruct) if (theStruct->IsHighlighted()) { - aCompStruct->SetHighlightColor (theStruct->HighlightColor()); - aCompStruct->GraphicHighlight (Aspect_TOHM_COLOR); + aCompStruct->Highlight (Aspect_TOHM_COLOR, theStruct->HighlightColor(), Standard_False); } - // The previous calculation is removed and the new one is dislayed - myGraphicDriver->EraseStructure (MyCView, *aCompStructOld->CStructure()); - myGraphicDriver->DisplayStructure (MyCView, *aCompStruct->CStructure(), theStruct->DisplayPriority()); + // The previous calculation is removed and the new one is displayed + myGraphicDriver->EraseStructure (MyCView, aCompStructOld); + myGraphicDriver->DisplayStructure (MyCView, aCompStruct, theStruct->DisplayPriority()); // why not just replace existing items? //myStructsToCompute.ChangeValue (anIndex) = theStruct; @@ -2324,10 +2337,10 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode) myIsInComputedMode = theMode; if (!myIsInComputedMode) { - for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next()) + for (Graphic3d_MapOfStructure::Iterator aStructIter (myStructsDisplayed); aStructIter.More(); aStructIter.Next()) { const Handle(Graphic3d_Structure)& aStruct = aStructIter.Key(); - const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct); + const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual()); if (anAnswer != Visual3d_TOA_COMPUTE) { continue; @@ -2337,17 +2350,17 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode) if (anIndex != 0) { const Handle(Graphic3d_Structure)& aStructComp = myStructsComputed.Value (anIndex); - myGraphicDriver->EraseStructure (MyCView, *aStructComp->CStructure()); - myGraphicDriver->DisplayStructure (MyCView, *aStruct->CStructure(), aStruct->DisplayPriority()); + myGraphicDriver->EraseStructure (MyCView, aStructComp); + myGraphicDriver->DisplayStructure (MyCView, aStruct, aStruct->DisplayPriority()); } } return; } - for (Graphic3d_MapIteratorOfMapOfStructure aDispStructIter (myStructsDisplayed); aDispStructIter.More(); aDispStructIter.Next()) + for (Graphic3d_MapOfStructure::Iterator aDispStructIter (myStructsDisplayed); aDispStructIter.More(); aDispStructIter.Next()) { - Handle(Graphic3d_Structure) aStruct = aDispStructIter.Key(); - const Visual3d_TypeOfAnswer anAnswer = AcceptDisplay (aStruct); + Handle(Graphic3d_Structure) aStruct = aDispStructIter.Key(); + const Visual3d_TypeOfAnswer anAnswer = acceptDisplay (aStruct->Visual()); if (anAnswer != Visual3d_TOA_COMPUTE) { continue; @@ -2356,8 +2369,8 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode) const Standard_Integer anIndex = IsComputed (aStruct); if (anIndex != 0) { - myGraphicDriver->EraseStructure (MyCView, *aStruct->CStructure()); - myGraphicDriver->DisplayStructure (MyCView, *(myStructsComputed.Value (anIndex)->CStructure()), aStruct->DisplayPriority()); + myGraphicDriver->EraseStructure (MyCView, aStruct); + myGraphicDriver->DisplayStructure (MyCView, myStructsComputed.Value (anIndex), aStruct->DisplayPriority()); Display (aStruct, Aspect_TOU_WAIT); if (aStruct->IsHighlighted()) @@ -2365,8 +2378,7 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode) const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.Value (anIndex); if (!aCompStruct->IsHighlighted()) { - aCompStruct->SetHighlightColor (aStruct->HighlightColor()); - aCompStruct->GraphicHighlight (Aspect_TOHM_COLOR); + aCompStruct->Highlight (Aspect_TOHM_COLOR, aStruct->HighlightColor(), Standard_False); } } } @@ -2387,8 +2399,7 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode) if (aStruct->IsHighlighted()) { - aCompStruct->SetHighlightColor (aStruct->HighlightColor()); - aCompStruct->GraphicHighlight (Aspect_TOHM_COLOR); + aCompStruct->Highlight (Aspect_TOHM_COLOR, aStruct->HighlightColor(), Standard_False); } Standard_Boolean hasResult = Standard_False; @@ -2410,8 +2421,8 @@ void Visual3d_View::SetComputedMode (const Standard_Boolean theMode) myStructsComputed .Append (aCompStruct); } - myGraphicDriver->EraseStructure (MyCView, *aStruct->CStructure()); - myGraphicDriver->DisplayStructure (MyCView, *aCompStruct->CStructure(), aStruct->DisplayPriority()); + myGraphicDriver->EraseStructure (MyCView, aStruct); + myGraphicDriver->DisplayStructure (MyCView, aCompStruct, aStruct->DisplayPriority()); } } Update (myViewManager->UpdateMode()); @@ -2599,7 +2610,7 @@ Standard_Boolean Visual3d_View::Export (const Standard_CString theFileName // function : SetZLayerSettings // purpose : // ======================================================================= -void Visual3d_View::SetZLayerSettings (const Standard_Integer theLayerId, +void Visual3d_View::SetZLayerSettings (const Graphic3d_ZLayerId theLayerId, const Graphic3d_ZLayerSettings& theSettings) { myGraphicDriver->SetZLayerSettings (MyCView, theLayerId, theSettings); @@ -2609,7 +2620,7 @@ void Visual3d_View::SetZLayerSettings (const Standard_Integer theLayerId, // function : AddZLayer // purpose : // ======================================================================= -void Visual3d_View::AddZLayer (const Standard_Integer theLayerId) +void Visual3d_View::AddZLayer (const Graphic3d_ZLayerId theLayerId) { myGraphicDriver->AddZLayer (MyCView, theLayerId); } @@ -2618,7 +2629,7 @@ void Visual3d_View::AddZLayer (const Standard_Integer theLayerId) // function : RemoveZLayer // purpose : // ======================================================================= -void Visual3d_View::RemoveZLayer (const Standard_Integer theLayerId) +void Visual3d_View::RemoveZLayer (const Graphic3d_ZLayerId theLayerId) { myGraphicDriver->RemoveZLayer (MyCView, theLayerId); } @@ -2628,7 +2639,7 @@ void Visual3d_View::RemoveZLayer (const Standard_Integer theLayerId) // purpose : // ======================================================================= void Visual3d_View::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure, - const Standard_Integer theLayerId) + const Graphic3d_ZLayerId theLayerId) { myGraphicDriver->ChangeZLayer (*(theStructure->CStructure()), MyCView, theLayerId); } diff --git a/src/Visual3d/Visual3d_ViewManager.cdl b/src/Visual3d/Visual3d_ViewManager.cdl index 967611b88e..9279b278eb 100644 --- a/src/Visual3d/Visual3d_ViewManager.cdl +++ b/src/Visual3d/Visual3d_ViewManager.cdl @@ -22,7 +22,6 @@ class ViewManager from Visual3d inherits StructureManager from Graphic3d ---Purpose: This class allows the definition of a manager to -- which the views are associated. -- It allows them to be globally manipulated. - -- It activates the pick. uses @@ -41,10 +40,10 @@ uses CView from Graphic3d, Vector from Graphic3d, + ZLayerId from Graphic3d, ZLayerSettings from Graphic3d, MapOfZLayerSettings from Visual3d, - ContextPick from Visual3d, Layer from Visual3d, SequenceOfView from Visual3d, HSequenceOfView from Visual3d, @@ -129,9 +128,10 @@ is ---Purpose: Returns the group of views activated in the visualiser . ---Category: Inquire methods - DefinedView ( me ) - returns HSequenceOfView from Visual3d - is static; + DefinedViews (me) + returns SequenceOfView from Visual3d + is static; + ---C++: return const & ---Level: Internal ---Purpose: Returns the group of views defined in the visualiser . ---Category: Inquire methods @@ -163,29 +163,6 @@ is ---Purpose: Release a unique ID of the view reserved for the view on its creation. is static; - ------------------------------------------------- - -- Summary of Pick Input -- - -- -- - -- Picking returns information about an -- - -- object pointed to on the display. -- - -- -- - -- To be picked, a structure must be : -- - -- -- - -- Visible -- - -- Within the pick aperture -- - -- Pickable as determined by the method -- - -- Graphic3d_Structure::SetPick -- - -- -- - -- To insert a Pick Identification use the -- - -- method Graphic3d_Group::SetPickId -- - -- -- - -- The pick search order tends to select the -- - -- "top" object : -- - -- High to low structure display priority -- - -- Most recently displayed to least -- - -- recently displayed. -- - ------------------------------------------------- - ------------------------------ -- Category: Redefined methods ------------------------------ @@ -232,30 +209,25 @@ is ChangeZLayer ( me : mutable; theStructure : Structure from Graphic3d; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) is redefined static; ---Purpose: Change Z layer for structure. The layer mechanism allows -- to display structures in higher layers in overlay of structures in -- lower layers. - GetZLayer ( me; - theStructure : Structure from Graphic3d ) - returns Integer from Standard is redefined static; - ---Purpose: Get Z layer ID assigned for the structure. - SetZLayerSettings ( me : mutable; - theLayerId : Integer from Standard; + theLayerId : ZLayerId from Graphic3d; 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 ) + theLayerId : ZLayerId from Graphic3d ) returns ZLayerSettings from Graphic3d is redefined static; ---Purpose: Returns the settings of a single Z layer. AddZLayer ( me : mutable; - theLayerId : in out Integer from Standard ) + theLayerId : out ZLayerId from Graphic3d ) returns Boolean from Standard is redefined static; ---Purpose: Add a new top-level Z layer and get its ID as -- value. The method returns Standard_False if the layer @@ -263,7 +235,7 @@ is -- structures in higher layers in overlay of structures in lower layers. RemoveZLayer ( me : mutable; - theLayerId : Integer from Standard ) + theLayerId : ZLayerId from Graphic3d ) returns Boolean from Standard is redefined static; ---Purpose: Remove Z layer with ID . Method returns -- Standard_False if the layer can not be removed or doesn't exists. @@ -284,12 +256,6 @@ is -- controlled view. This method used on the view initialization to -- make the layer lists consistent. - getZLayerGenId ( myclass ) - ---Purpose: Returns global instance of z layer ids generator. - ---C++: return & - returns GenId from Aspect is protected; - - Clear ( me : mutable; AStructure : Structure from Graphic3d; WithDestruction : Boolean from Standard ) @@ -457,8 +423,9 @@ fields MyZBufferAuto : Boolean from Standard; -- Z layer indexes - myLayerIds : MapOfInteger from TColStd; - myLayerSeq : SequenceOfInteger from TColStd; + myZLayerGenId : GenId from Aspect; + myLayerIds : MapOfInteger from TColStd; + myLayerSeq : SequenceOfInteger from TColStd; myMapOfZLayerSettings : MapOfZLayerSettings from Visual3d; diff --git a/src/Visual3d/Visual3d_ViewManager.cxx b/src/Visual3d/Visual3d_ViewManager.cxx index 9bfa0f5bb4..daa6b793d9 100644 --- a/src/Visual3d/Visual3d_ViewManager.cxx +++ b/src/Visual3d/Visual3d_ViewManager.cxx @@ -82,15 +82,43 @@ Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Graphic3d_GraphicDriver Graphic3d_StructureManager (theDriver), MyDefinedView (), MyViewGenId (View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*(Visual3d_ViewManager::CurrentId ()-1),View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*Visual3d_ViewManager::CurrentId ()-1), -MyZBufferAuto (Standard_False) +MyZBufferAuto (Standard_False), +myZLayerGenId (1, IntegerLast()) { - // default layer is always presented in display layer sequence - // it can not be removed - myLayerIds.Add (0); - myLayerSeq.Append (0); - MyGraphicDriver = theDriver; - myMapOfZLayerSettings.Bind (0, Graphic3d_ZLayerSettings()); + + // default layers are always presented in display layer sequence it can not be removed + Graphic3d_ZLayerSettings aDefSettings; + aDefSettings.Flags = Graphic3d_ZLayerDepthTest + | Graphic3d_ZLayerDepthWrite; + aDefSettings.IsImmediate = false; + myLayerIds.Add (Graphic3d_ZLayerId_Default); + myLayerSeq.Append (Graphic3d_ZLayerId_Default); + myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Default, aDefSettings); + + Graphic3d_ZLayerSettings aTopSettings; + aTopSettings.Flags = Graphic3d_ZLayerDepthTest + | Graphic3d_ZLayerDepthWrite; + aTopSettings.IsImmediate = true; + myLayerIds.Add (Graphic3d_ZLayerId_Top); + myLayerSeq.Append (Graphic3d_ZLayerId_Top); + myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Top, aTopSettings); + + Graphic3d_ZLayerSettings aTopmostSettings; + aTopmostSettings.Flags = Graphic3d_ZLayerDepthTest + | Graphic3d_ZLayerDepthWrite + | Graphic3d_ZLayerDepthClear; + aTopmostSettings.IsImmediate = true; + myLayerIds.Add (Graphic3d_ZLayerId_Topmost); + myLayerSeq.Append (Graphic3d_ZLayerId_Topmost); + myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Topmost, aTopmostSettings); + + Graphic3d_ZLayerSettings anOsdSettings; + anOsdSettings.Flags = 0; + anOsdSettings.IsImmediate = true; + myLayerIds.Add (Graphic3d_ZLayerId_TopOSD); + myLayerSeq.Append (Graphic3d_ZLayerId_TopOSD); + myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_TopOSD, anOsdSettings); } //-Destructors @@ -124,7 +152,6 @@ void Visual3d_ViewManager::Remove () { // clear all structures whilst views are alive for correct GPU memory management MyDisplayedStructure.Clear(); MyHighlightedStructure.Clear(); - MyPickStructure.Clear(); // clear list of managed views MyDefinedView.Clear(); @@ -255,7 +282,6 @@ void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure) } MyHighlightedStructure.Remove (AStructure); - MyPickStructure.Remove (AStructure); } void Visual3d_ViewManager::Erase () { @@ -423,16 +449,9 @@ Standard_Boolean Visual3d_ViewManager::ContainsComputedStructure () const } #endif -Handle(Visual3d_HSequenceOfView) Visual3d_ViewManager::DefinedView () const +const Visual3d_SequenceOfView& Visual3d_ViewManager::DefinedViews() const { - Handle (Visual3d_HSequenceOfView) SG = new Visual3d_HSequenceOfView(); - - for(int i=1; i<=MyDefinedView.Length(); i++) - { - SG->Append(MyDefinedView.Value(i)); - } - - return (SG); + return MyDefinedView; } Standard_Boolean Visual3d_ViewManager::ViewExists (const Handle(Aspect_Window)& AWindow, Graphic3d_CView& TheCView) const @@ -629,39 +648,26 @@ const Handle(Visual3d_Layer)& Visual3d_ViewManager::OverLayer () const { //======================================================================= void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure, - const Standard_Integer theLayerId) + const Graphic3d_ZLayerId theLayerId) { - if (!myLayerIds.Contains (theLayerId)) + if (!myLayerIds.Contains (theLayerId) + || !MyDisplayedStructure.Contains (theStructure)) + { return; + } // change display layer for structure in all views - if (MyDisplayedStructure.Contains (theStructure)) + for (int aViewIter = 1; aViewIter <= MyDefinedView.Length(); ++aViewIter) { - for(int i=1; i<=MyDefinedView.Length(); i++) - { - (MyDefinedView.Value(i))->ChangeZLayer(theStructure, theLayerId); - } + MyDefinedView.Value (aViewIter)->ChangeZLayer (theStructure, theLayerId); } - - // tell graphic driver to update the structure's display layer - MyGraphicDriver->ChangeZLayer (*(theStructure->CStructure()), theLayerId); -} - -//======================================================================= -//function : GetZLayer -//purpose : -//======================================================================= - -Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structure)& theStructure) const -{ - return MyGraphicDriver->GetZLayer (*theStructure->CStructure ()); } //======================================================================= //function : SetZLayerSettings //purpose : //======================================================================= -void Visual3d_ViewManager::SetZLayerSettings (const Standard_Integer theLayerId, +void Visual3d_ViewManager::SetZLayerSettings (const Graphic3d_ZLayerId theLayerId, const Graphic3d_ZLayerSettings& theSettings) { // tell all managed views to set zlayer settings @@ -685,7 +691,7 @@ void Visual3d_ViewManager::SetZLayerSettings (const Standard_Integer theLayerId, //function : ZLayerSettings //purpose : //======================================================================= -Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Standard_Integer theLayerId) +Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Graphic3d_ZLayerId theLayerId) { if (!myLayerIds.Contains (theLayerId)) { @@ -700,13 +706,13 @@ Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Standard_In //purpose : //======================================================================= -Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId) +Standard_Boolean Visual3d_ViewManager::AddZLayer (Graphic3d_ZLayerId& theLayerId) { try { OCC_CATCH_SIGNALS - theLayerId = getZLayerGenId ().Next (); - myLayerIds.Add (theLayerId); + theLayerId = myZLayerGenId.Next(); + myLayerIds.Add (theLayerId); myLayerSeq.Append (theLayerId); } catch (Aspect_IdentDefinitionError) @@ -732,10 +738,14 @@ Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId) //purpose : //======================================================================= -Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theLayerId) +Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Graphic3d_ZLayerId theLayerId) { - if (!myLayerIds.Contains (theLayerId) || theLayerId == 0) + if (!myLayerIds.Contains (theLayerId) + || theLayerId < myZLayerGenId.Lower() + || theLayerId > myZLayerGenId.Upper()) + { return Standard_False; + } // tell all managed views to remove display layers for(int i=1; i<=MyDefinedView.Length(); i++) @@ -757,8 +767,8 @@ Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theL myMapOfZLayerSettings.UnBind (theLayerId); - myLayerIds.Remove (theLayerId); - getZLayerGenId ().Free (theLayerId); + myLayerIds.Remove (theLayerId); + myZLayerGenId.Free (theLayerId); return Standard_True; } @@ -773,17 +783,6 @@ void Visual3d_ViewManager::GetAllZLayers (TColStd_SequenceOfInteger& theLayerSeq theLayerSeq.Assign (myLayerSeq); } -//======================================================================= -//function : getZLayerGenId -//purpose : -//======================================================================= - -Aspect_GenId& Visual3d_ViewManager::getZLayerGenId () -{ - static Aspect_GenId aGenId (1, IntegerLast()); - return aGenId; -} - //======================================================================= //function : InstallZLayers //purpose : @@ -808,10 +807,19 @@ void Visual3d_ViewManager::InstallZLayers(const Handle(Visual3d_View)& theView) // order: the new layers are always appended to the end of the list // inside of view, while layer remove operation doesn't affect the order. // Starting from second layer : no need to change the default z layer. - for (Standard_Integer aSeqIdx = 2; aSeqIdx <= myLayerSeq.Length (); aSeqIdx++) + for (Standard_Integer aSeqIdx = 1; aSeqIdx <= myLayerSeq.Length(); ++aSeqIdx) { - Standard_Integer aLayerID = myLayerSeq.Value (aSeqIdx); - theView->RemoveZLayer (aLayerID); - theView->AddZLayer (aLayerID); + const Graphic3d_ZLayerId aLayerID = myLayerSeq.Value (aSeqIdx); + const Graphic3d_ZLayerSettings& aSettings = myMapOfZLayerSettings.Find (aLayerID); + if (aLayerID < myZLayerGenId.Lower() + || aLayerID > myZLayerGenId.Upper()) + { + theView->SetZLayerSettings (aLayerID, aSettings); + continue; + } + + theView->RemoveZLayer (aLayerID); + theView->AddZLayer (aLayerID); + theView->SetZLayerSettings (aLayerID, aSettings); } } diff --git a/tests/bugs/vis/bug24394 b/tests/bugs/vis/bug24394 new file mode 100644 index 0000000000..43751f8941 --- /dev/null +++ b/tests/bugs/vis/bug24394 @@ -0,0 +1,19 @@ +puts "========" +puts "OCC24394" +puts "========" +puts "" +################################################################################# +# Visualization - implement more general way for rendering of immediate objects +################################################################################# + +box b1 0 0 0 1 2 3 +box b2 3 0 0 2 3 1 +vinit View1 +vclear +vaxo +vsetdispmode 1 +vdisplay b1 +vdisplay -top b1 +vfit + +set only_screen 1 diff --git a/tests/mesh/end b/tests/mesh/end index 6598eb6e9a..0f8acd80f6 100644 --- a/tests/mesh/end +++ b/tests/mesh/end @@ -22,8 +22,8 @@ puts [checkshape res] tclean res if { [string compare $command "shading"] == 0 } { - vinit - vdisplay res + vinit View1 + vdisplay -noupdate -redisplay res vsetdispmode res 1 vfit } -- 2.20.1