0029365: Visualization, TKOpenGl - do not include hidden structures to Rendered withi...
authorkgv <kgv@opencascade.com>
Mon, 4 Dec 2017 12:16:34 +0000 (15:16 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 8 Dec 2017 13:39:19 +0000 (16:39 +0300)
OpenGl_Layer::UpdateCulling() now considers structure as culled in case if it has Hidden state.

src/OpenGl/OpenGl_FrameStats.cxx
src/OpenGl/OpenGl_FrameStats.hxx
src/OpenGl/OpenGl_Layer.cxx
src/OpenGl/OpenGl_Layer.hxx
src/OpenGl/OpenGl_LayerList.cxx

index 17b040d..c321dab 100644 (file)
@@ -304,11 +304,14 @@ void OpenGl_FrameStats::FrameEnd (const Handle(OpenGl_Workspace)& theWorkspace)
                                        || (aBits & Graphic3d_RenderingParams::PerfCounters_Points)    != 0;
   const Standard_Boolean toCountElems   = (aBits & Graphic3d_RenderingParams::PerfCounters_GroupArrays) != 0 || toCountTris || toCountMem;
   const Standard_Boolean toCountGroups  = (aBits & Graphic3d_RenderingParams::PerfCounters_Groups)      != 0 || toCountElems;
-  const Standard_Boolean toCountStructs = (aBits & Graphic3d_RenderingParams::PerfCounters_Structures)  != 0 || toCountGroups;
-  
-  if (toCountStructs)
+  const Standard_Boolean toCountStructs = (aBits & Graphic3d_RenderingParams::PerfCounters_Structures)  != 0
+                                       || (aBits & Graphic3d_RenderingParams::PerfCounters_Layers)      != 0 || toCountGroups;
+
+  myCountersTmp[Counter_NbLayers] = theWorkspace->View()->LayerList().Layers().Size();
+  if (toCountStructs
+   || (aBits & Graphic3d_RenderingParams::PerfCounters_Layers)    != 0)
   {
-    myCountersTmp[Counter_NbLayers] = theWorkspace->View()->LayerList().Layers().Size();
+    const Standard_Integer aViewId = theWorkspace->View()->Identification();
     for (OpenGl_SequenceOfLayers::Iterator aLayerIter (theWorkspace->View()->LayerList().Layers()); aLayerIter.More(); aLayerIter.Next())
     {
       const Handle(OpenGl_Layer)& aLayer = aLayerIter.Value();
@@ -320,9 +323,9 @@ void OpenGl_FrameStats::FrameEnd (const Handle(OpenGl_Workspace)& theWorkspace)
       myCountersTmp[Counter_NbStructsNotCulled] += aLayer->NbStructuresNotCulled();
       if (toCountGroups)
       {
-        updateStructures (aLayer->CullableStructuresBVH().Structures(), toCountStructs, toCountTris, toCountMem);
-        updateStructures (aLayer->CullableTrsfPersStructuresBVH().Structures(), toCountStructs, toCountTris, toCountMem);
-        updateStructures (aLayer->NonCullableStructures(), toCountStructs, toCountTris, toCountMem);
+        updateStructures (aViewId, aLayer->CullableStructuresBVH().Structures(), toCountElems, toCountTris, toCountMem);
+        updateStructures (aViewId, aLayer->CullableTrsfPersStructuresBVH().Structures(), toCountElems, toCountTris, toCountMem);
+        updateStructures (aViewId, aLayer->NonCullableStructures(), toCountElems, toCountTris, toCountMem);
       }
     }
   }
@@ -387,7 +390,8 @@ void OpenGl_FrameStats::FrameEnd (const Handle(OpenGl_Workspace)& theWorkspace)
 // function : updateStructures
 // purpose  :
 // =======================================================================
-void OpenGl_FrameStats::updateStructures (const OpenGl_IndexedMapOfStructure& theStructures,
+void OpenGl_FrameStats::updateStructures (Standard_Integer theViewId,
+                                          const OpenGl_IndexedMapOfStructure& theStructures,
                                           Standard_Boolean theToCountElems,
                                           Standard_Boolean theToCountTris,
                                           Standard_Boolean theToCountMem)
@@ -395,7 +399,8 @@ void OpenGl_FrameStats::updateStructures (const OpenGl_IndexedMapOfStructure& th
   for (OpenGl_IndexedMapOfStructure::Iterator aStructIter (theStructures); aStructIter.More(); aStructIter.Next())
   {
     const OpenGl_Structure* aStruct = aStructIter.Value();
-    if (aStruct->IsCulled())
+    if (aStruct->IsCulled()
+    || !aStruct->IsVisible (theViewId))
     {
       if (theToCountMem)
       {
index 0ed9361..adcbb01 100644 (file)
@@ -136,7 +136,8 @@ public:
 protected:
 
   //! Updates counters for structures.
-  Standard_EXPORT virtual void updateStructures (const OpenGl_IndexedMapOfStructure& theStructures,
+  Standard_EXPORT virtual void updateStructures (Standard_Integer theViewId,
+                                                 const OpenGl_IndexedMapOfStructure& theStructures,
                                                  Standard_Boolean theToCountElems,
                                                  Standard_Boolean theToCountTris,
                                                  Standard_Boolean theToCountMem);
index 2879617..a564d9b 100644 (file)
@@ -483,7 +483,8 @@ void OpenGl_Layer::updateBVH() const
 // function : UpdateCulling
 // purpose  :
 // =======================================================================
-void OpenGl_Layer::UpdateCulling (const OpenGl_BVHTreeSelector& theSelector,
+void OpenGl_Layer::UpdateCulling (const Standard_Integer theViewId,
+                                  const OpenGl_BVHTreeSelector& theSelector,
                                   const Standard_Boolean theToTraverse)
 {
   updateBVH();
@@ -583,8 +584,11 @@ void OpenGl_Layer::UpdateCulling (const OpenGl_BVHTreeSelector& theSelector,
         const OpenGl_Structure* aStruct = isTrsfPers
                                         ? myBVHPrimitivesTrsfPers.GetStructureById (aIdx)
                                         : myBVHPrimitives.GetStructureById (aIdx);
-        aStruct->MarkAsNotCulled();
-        ++myNbStructuresNotCulled;
+        if (aStruct->IsVisible (theViewId))
+        {
+          aStruct->MarkAsNotCulled();
+          ++myNbStructuresNotCulled;
+        }
         if (aHead < 0)
         {
           break;
index 636ec6f..613e46d 100644 (file)
@@ -124,7 +124,8 @@ public:
 
   //! Update culling state - should be called before rendering.
   //! Traverses through BVH tree to determine which structures are in view volume.
-  void UpdateCulling (const OpenGl_BVHTreeSelector& theSelector,
+  void UpdateCulling (const Standard_Integer theViewId,
+                      const OpenGl_BVHTreeSelector& theSelector,
                       const Standard_Boolean theToTraverse);
 
   //! Returns TRUE if layer is empty or has been discarded entirely by culling test.
index 4bcd58a..6a0856d 100644 (file)
@@ -516,6 +516,7 @@ void OpenGl_LayerList::SetLayerSettings (const Graphic3d_ZLayerId        theLaye
 void OpenGl_LayerList::UpdateCulling (const Handle(OpenGl_Workspace)& theWorkspace,
                                       const Standard_Boolean theToDrawImmediate)
 {
+  const Standard_Integer aViewId = theWorkspace->View()->Identification();
   const OpenGl_BVHTreeSelector& aSelector = theWorkspace->View()->BVHTreeSelector();
   for (OpenGl_IndexedLayerIterator anIts (myLayers); anIts.More(); anIts.Next())
   {
@@ -525,7 +526,7 @@ void OpenGl_LayerList::UpdateCulling (const Handle(OpenGl_Workspace)& theWorkspa
       continue;
     }
 
-    aLayer.UpdateCulling (aSelector, theWorkspace->IsCullingEnabled());
+    aLayer.UpdateCulling (aViewId, aSelector, theWorkspace->IsCullingEnabled());
   }
 }