]> 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)
committernds <natalia.ermolaeva@opencascade.com>
Mon, 6 Jul 2020 16:57:12 +0000 (19:57 +0300)
(cherry picked from commit 61d75276ea924e0fd22de0a2a927bce1d554de99)
(cherry picked from commit b96cd2e4228d91b5b77bcf4706ec0abe8504cdbb)
(cherry picked from commit e2b1ade3635410fb778eb140117b28293872163b)

src/OpenGl/OpenGl_CappingAlgo.cxx

index 0e22c66d2cc0a83d168326135a8ed47ff39289b1..7a8fdec098a10931bb5681968f21f89ef68d2a1a 100755 (executable)
@@ -80,6 +80,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,
@@ -100,6 +130,11 @@ namespace
         continue;
       }
 
+      if (isGroupClipped (aGroupIter.Value(), aContext))
+      {
+        continue;
+      }
+
       // clear stencil only if something has been actually drawn
       theStencilSentry.Init();