]> OCCT Git - occt-copy.git/commitdiff
0031579: Visualization - OpenGl_CappingAlgo performance on some clipping planes
authornds <natalia.ermolaeva@opencascade.com>
Tue, 26 May 2020 07:39:58 +0000 (10:39 +0300)
committersnn <sergey.nikonov@opencascade.com>
Thu, 20 May 2021 13:49:54 +0000 (16:49 +0300)
(cherry picked from commit 61d75276ea924e0fd22de0a2a927bce1d554de99)
(cherry picked from commit fa3bd5f2e598916906c28ac8789bdfb28ad42255)
(cherry picked from commit 2ab0ba846ac3ac073552997d030d51392dc82314)

src/OpenGl/OpenGl_CappingAlgo.cxx

index 6990d311eda90e7ddcfa0a23060451d4448081d3..ec3246c1ea1d3c7f936485e6d443344b0ba37314 100755 (executable)
@@ -177,6 +177,36 @@ namespace
     theWorkspace->SetAllowFaceCulling (wasCullAllowed);
   }
 
+  bool isGroupClipped (const Handle(Graphic3d_Group)& theGroup, const Handle(OpenGl_Context)& theContext)
+  {
+    const Graphic3d_BndBox4f& aBoxF = theGroup->BoundingBox();
+    Graphic3d_BndBox3d aBBox = Graphic3d_BndBox3d (Graphic3d_Vec3d ((Standard_Real )aBoxF.CornerMin().x(),
+                                                  (Standard_Real )aBoxF.CornerMin().y(),
+                                                  (Standard_Real )aBoxF.CornerMin().z()),
+                                 Graphic3d_Vec3d ((Standard_Real )aBoxF.CornerMax().x(),
+                                                  (Standard_Real )aBoxF.CornerMax().y(),
+                                                  (Standard_Real )aBoxF.CornerMax().z()));
+
+    Standard_Boolean isClipped = false;
+    for (OpenGl_ClippingIterator aPlaneIt (theContext->Clipping()); aPlaneIt.More(); aPlaneIt.Next())
+    {
+      const Handle(Graphic3d_ClipPlane)& aPlane = aPlaneIt.Value();
+      if (!aPlane->IsOn())
+      {
+        continue;
+      }
+
+      const Graphic3d_ClipState aBoxState = aPlane->ProbeBox (aBBox);
+      if (aBoxState == Graphic3d_ClipState_Out)
+      {
+        isClipped = true;
+        break;
+      }
+    }
+    return isClipped;
+  }
+
+
   //! Render capping for specific structure.
   static void renderCappingForStructure (StencilTestSentry& theStencilSentry,
                                          const Handle(OpenGl_Workspace)& theWorkspace,
@@ -207,6 +237,11 @@ namespace
         continue;
       }
 
+      if (isGroupClipped (aGroupIter.Value(), aContext))
+      {
+        continue;
+      }
+
       // clear stencil only if something has been actually drawn
       theStencilSentry.Init();