0029791: Visualization - Wrong result of SelectMgr_RectangularFrustum::IsClipped
authorkgv <kgv@opencascade.com>
Thu, 24 May 2018 17:10:32 +0000 (20:10 +0300)
committerabv <abv@opencascade.com>
Fri, 25 May 2018 18:54:57 +0000 (21:54 +0300)
SelectMgr_RectangularFrustum::computeClippingRange() fix skipping depth range starting behind the ray.

src/SelectMgr/SelectMgr_RectangularFrustum.cxx
tests/bugs/vis/bug29791 [new file with mode: 0644]

index 82bb7b0..d191a41 100644 (file)
@@ -675,18 +675,15 @@ void SelectMgr_RectangularFrustum::computeClippingRange (const Graphic3d_Sequenc
     }
 
     // compute distance to point of pick line intersection with the plane
-    Standard_Real aParam = aDistance / aDotProduct;
-
-    // check if ray intersects the plane, in case aIntDist < 0
-    // the plane is "behind" the ray
+    const Standard_Real aParam = aDistance / aDotProduct;
+    const gp_Pnt anIntersectionPt = myNearPickedPnt.XYZ() + myViewRayDir.XYZ() * aParam;
+    Standard_Real aDistToPln = anIntersectionPt.Distance (myNearPickedPnt);
     if (aParam < 0.0)
     {
-      continue;
+      // the plane is "behind" the ray
+      aDistToPln = -aDistToPln;
     }
 
-    const gp_Pnt anIntersectionPt = myNearPickedPnt.XYZ() + myViewRayDir.XYZ() * aParam;
-    const Standard_Real aDistToPln = anIntersectionPt.Distance (myNearPickedPnt);
-
     // change depth limits for case of opposite and directed planes
     if (aDotProduct < 0.0)
     {
diff --git a/tests/bugs/vis/bug29791 b/tests/bugs/vis/bug29791
new file mode 100644 (file)
index 0000000..64190c1
--- /dev/null
@@ -0,0 +1,21 @@
+puts "============"
+puts "0029791: Visualization - Wrong result of SelectMgr_RectangularFrustum::IsClipped"
+puts "============"
+puts ""
+
+pload MODELING VISUALIZATION
+restore [locate_data_file occ/bottle.brep] b
+vclear
+vinit View1
+vdisplay -dispMode 1 -highMode 1 b
+vfit
+vzbufftrihedron
+vviewparams -scale 14.7435 -proj 0.193921 -0.891229 0.410007 -up -0.0205984 0.414149 0.909976 -at 11.3689 1.32152 24.9954
+vclipplane p -equation 1 0 0 -20 -set
+vmoveto 150 200
+vstate -entities
+vselect 150 200
+if { [vreadpixel 150 200 rgb name] != "BLACK"      } { puts "Error: object is not clipped" }
+if { [vreadpixel 300 200 rgb name] != "GOLDENROD1" } { puts "Error: object should NOT be selected" }
+
+vdump $imagedir/${casename}.png