From 6ffdcc2141d103dc07bb7512a82fe8eb7fbe02e2 Mon Sep 17 00:00:00 2001 From: nds Date: Tue, 26 May 2020 10:39:58 +0300 Subject: [PATCH] 0031579: Visualization - OpenGl_CappingAlgo performance on some clipping planes (cherry picked from commit 61d75276ea924e0fd22de0a2a927bce1d554de99) (cherry picked from commit b96cd2e4228d91b5b77bcf4706ec0abe8504cdbb) (cherry picked from commit e2b1ade3635410fb778eb140117b28293872163b) --- src/OpenGl/OpenGl_CappingAlgo.cxx | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/OpenGl/OpenGl_CappingAlgo.cxx b/src/OpenGl/OpenGl_CappingAlgo.cxx index 0e22c66d2c..7a8fdec098 100755 --- a/src/OpenGl/OpenGl_CappingAlgo.cxx +++ b/src/OpenGl/OpenGl_CappingAlgo.cxx @@ -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(); -- 2.39.5