]> OCCT Git - occt-copy.git/commitdiff
0031579: Visualization - OpenGl_CappingAlgo performance on some clipping planes CR0_DMUReviewer_IR-2019-08-30_CR30791 CR0_DMUReviewer_IR-2019-08-30_DR1.0
authornds <natalia.ermolaeva@opencascade.com>
Tue, 26 May 2020 07:39:58 +0000 (10:39 +0300)
committernds <natalia.ermolaeva@opencascade.com>
Tue, 26 May 2020 19:32:53 +0000 (22:32 +0300)
(cherry picked from commit 61d75276ea924e0fd22de0a2a927bce1d554de99)
(cherry picked from commit e1a923082213307bad65a89909ad3ba750cb3dc8)

src/OpenGl/OpenGl_CappingAlgo.cxx

index cbf076694fc2d5512ba49355e717ebd8ea495672..45a8a702225c19db6e6b89c39e0e0a48d378f80b 100755 (executable)
@@ -199,6 +199,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,
@@ -230,6 +260,11 @@ namespace
         continue;
       }
 
+      if (isGroupClipped (aGroupIter.Value(), aContext))
+      {
+        continue;
+      }
+
       // clear stencil only if something has been actually drawn
       theStencilSentry.Init();