0030081: Visualization - selection does not work when two clipping planes cut object...
authorkgv <kgv@opencascade.com>
Thu, 23 Aug 2018 13:26:12 +0000 (22:26 +0900)
committerbugmaster <bugmaster@opencascade.com>
Fri, 24 Aug 2018 10:08:31 +0000 (13:08 +0300)
Fixed combining independent clipping planes into single range within SelectMgr_RectangularFrustum::computeClippingRange().

src/SelectMgr/SelectMgr_RectangularFrustum.cxx
src/SelectMgr/SelectMgr_ViewClipRange.hxx

index 8d1b856..f95a6d1 100644 (file)
@@ -710,11 +710,11 @@ void SelectMgr_RectangularFrustum::computeClippingRange (const Graphic3d_Sequenc
       {
         if (aDotProduct < 0.0)
         {
-          theRange.ChangeMain().Add (Bnd_Range (aDistToPln, RealLast()));
+          theRange.ChangeUnclipRange().TrimTo (aDistToPln);
         }
         else
         {
-          theRange.ChangeMain().Add (Bnd_Range (RealFirst(), aDistToPln));
+          theRange.ChangeUnclipRange().TrimFrom (aDistToPln);
         }
       }
       else
@@ -733,7 +733,7 @@ void SelectMgr_RectangularFrustum::computeClippingRange (const Graphic3d_Sequenc
     if (!aSubRange.IsVoid()
       && aClipPlane->IsChain())
     {
-      theRange.AddSubRange (aSubRange);
+      theRange.AddClipSubRange (aSubRange);
     }
   }
 }
index 77abb97..97deae0 100644 (file)
@@ -35,9 +35,13 @@ public:
   //! e.g. TRUE means depth is clipped.
   Standard_Boolean IsClipped (const Standard_Real theDepth) const
   {
-    for (size_t aRangeIter = 0; aRangeIter < myRanges.size(); ++aRangeIter)
+    if (myUnclipRange.IsOut (theDepth))
     {
-      if (!myRanges[aRangeIter].IsOut (theDepth))
+      return Standard_True;
+    }
+    for (size_t aRangeIter = 0; aRangeIter < myClipRanges.size(); ++aRangeIter)
+    {
+      if (!myClipRanges[aRangeIter].IsOut (theDepth))
       {
         return Standard_True;
       }
@@ -48,19 +52,20 @@ public:
   //! Clears clipping range.
   void SetVoid()
   {
-    myRanges.resize (1);
-    myRanges[0].SetVoid();
+    myClipRanges.resize (0);
+    myUnclipRange = Bnd_Range (RealFirst(), RealLast());
   }
 
-  //! Returns the main range.
-  Bnd_Range& ChangeMain() { return myRanges[0]; }
+  //! Returns the main unclipped range; [-inf, inf] by default.
+  Bnd_Range& ChangeUnclipRange() { return myUnclipRange; }
 
-  //! Adds a sub-range.
-  void AddSubRange (const Bnd_Range& theRange) { myRanges.push_back (theRange); }
+  //! Adds a clipping sub-range (for clipping chains).
+  void AddClipSubRange (const Bnd_Range& theRange) { myClipRanges.push_back (theRange); }
 
 private:
 
-  std::vector<Bnd_Range> myRanges;
+  std::vector<Bnd_Range> myClipRanges;
+  Bnd_Range myUnclipRange;
 
 };