* Bug 16003 fixed: now mousewheel zoom works with triangles 99/20899/4
St├ęphane Mottelet [Thu, 14 Mar 2019 16:26:35 +0000 (17:26 +0100)]
http://bugzilla.scilab.org/show_bug.cgi?id=16003

In fact Fac3d triangle entities were not considered at all by
the entity picker (I was not aware of this). The failsafe
(no intersection claimed) was broken by
https://codereview.scilab.org/#/c/20581, which added
true "smart" 3D zoom.

Change-Id: Ic7562efed44b6fe880d7c29feadadfdfeab81136

scilab/CHANGES.md
scilab/modules/graphic_objects/src/cpp/pickSurface.cpp
scilab/modules/renderer/src/java/org/scilab/modules/renderer/JoGLView/interaction/DragZoomRotateInteraction.java
scilab/modules/renderer/tests/nonreg_tests/bug_16003.tst [new file with mode: 0644]

index ec61cc1..3f56eb9 100644 (file)
@@ -156,6 +156,7 @@ Bug Fixes
 * [#15964](http://bugzilla.scilab.org/show_bug.cgi?id=15954): A complex empty sparse matrix could be obtained after insertion.
 * [#15983](http://bugzilla.scilab.org/show_bug.cgi?id=15983): `group()` regressed in 5.5.2 due to a too intrusive fix.
 * [#15995](http://bugzilla.scilab.org/show_bug.cgi?id=15995): patch was missing in surface plot (regression)
+* [#16003](http://bugzilla.scilab.org/show_bug.cgi?id=16003): Zoom with mouse scroll wheel was broken on simple surfaces.
 * [#16005](http://bugzilla.scilab.org/show_bug.cgi?id=16005): The `intdec` example was biased and not robust when changing sampling frequencies.
 * [#16007](http://bugzilla.scilab.org/show_bug.cgi?id=16007): Non-integer index in sparse makes Scilab crash.
 * [#16012](http://bugzilla.scilab.org/show_bug.cgi?id=16012): `[struct() struct()]` crashed Scilab.
index dd44bb5..c3e0e23 100644 (file)
@@ -22,7 +22,6 @@ extern "C"
 
 #include "getGraphicObjectProperty.h"
 #include "graphicObjectProperties.h"
-#include "sciprint.h"
 
 double pickSurface(int uid, double x, double y,  double z, double dx, double dy, double dz);
 
@@ -98,6 +97,7 @@ public:
 
 int test_tri(Vec3 V1, Vec3 V2, Vec3 V3, Vec3 Dir, Vec3 P0, Vec3 &ret);
 void QuadTestAndSaveT(double *bounds, Vec3 P0, Vec3 P1, Vec3 P2, Vec3 P3, Vec3 direction, Vec3 point, double &retT);
+void TriTestAndSaveT(double *bounds, Vec3 P0, Vec3 P1, Vec3 P2, Vec3 direction, Vec3 point, double &retT);
 
 /*
  * Given a ray (point(x, y,z) and direction(dx, dy, dz))
@@ -123,8 +123,6 @@ double pickSurface(int uid, double x, double y,  double z, double dx, double dy,
     getGraphicObjectProperty(uid, __GO_DATA_MODEL_Y__, jni_double_vector, (void**) &Y);
     getGraphicObjectProperty(uid, __GO_DATA_MODEL_Z__, jni_double_vector, (void**) &Z);
 
-
-
     int axes_uid = 0;
     int * paxes_uid = &axes_uid;
     int zoom_enabled = 0;
@@ -142,7 +140,6 @@ double pickSurface(int uid, double x, double y,  double z, double dx, double dy,
         getGraphicObjectProperty(axes_uid, __GO_DATA_BOUNDS__, jni_double_vector, (void**) &bounds);
     }
 
-
     getGraphicObjectProperty(uid, __GO_TYPE__, jni_int, (void**) &pType);
     if (type == __GO_PLOT3D__)
     {
@@ -180,31 +177,46 @@ double pickSurface(int uid, double x, double y,  double z, double dx, double dy,
         getGraphicObjectProperty(uid, __GO_DATA_MODEL_NUM_GONS__, jni_int, (void**) &png);
         getGraphicObjectProperty(uid, __GO_DATA_MODEL_NUM_VERTICES_PER_GON__, jni_int, (void**) &pnvg);
 
-        if (nvg != 4)
+        // Fac3d data model is made by gons
+        // each gon can be a quad
+        if (nvg == 4)
         {
-            return 2.0;
-        }
+             /* ordered in the vector
+             * X = [ p1, p2, p3, p4, p1, p2, p3, p4, ...]
+             * Y = [ p1, p2, p3, p4, p1, p2, p3, p4, ...]
+             * Z = [ p1, p2, p3, p4, p1, p2, p3, p4, ...]
+             * where a point is given by (x, y, z)
+             */
+            for (int i = 0; i < ng * nvg; i += nvg)
+            {
+                Vec3 P0 = Vec3(X[i],   Y[i],   Z[i]);
+                Vec3 P1 = Vec3(X[i + 1], Y[i + 1], Z[i + 1]);
+                Vec3 P2 = Vec3(X[i + 2], Y[i + 2], Z[i + 2]);
+                Vec3 P3 = Vec3(X[i + 3], Y[i + 3], Z[i + 3]);
 
-        /*
-         * Fac3d data model is made by gons
-         * each gon should be a quad
-         * ordered in the vector
-         * X = [ p1, p2, p3, p4, p1, p2, p3, p4, ...]
-         * Y = [ p1, p2, p3, p4, p1, p2, p3, p4, ...]
-         * Z = [ p1, p2, p3, p4, p1, p2, p3, p4, ...]
-         * where a point is given by (x, y, z)
-         */
-        for (int i = 0; i < ng * nvg; i += nvg)
+                QuadTestAndSaveT(bounds, P0, P1, P2, P3, direction, point, lastT);
+            }
+        }
+        // or a triangle
+        else if (nvg == 3)
         {
-            Vec3 P0 = Vec3(X[i],   Y[i],   Z[i]);
-            Vec3 P1 = Vec3(X[i + 1], Y[i + 1], Z[i + 1]);
-            Vec3 P2 = Vec3(X[i + 2], Y[i + 2], Z[i + 2]);
-            Vec3 P3 = Vec3(X[i + 3], Y[i + 3], Z[i + 3]);
+            /* ordered in the vector
+            * X = [ p1, p2, p3, p1, p2, p3, ...]
+            * Y = [ p1, p2, p3, p1, p2, p3, ...]
+            * Z = [ p1, p2, p3, p1, p2, p3, ...]
+            * where a point is given by (x, y, z)
+            */
+            for (int i = 0; i < ng * nvg; i += nvg)
+            {
+                Vec3 P0 = Vec3(X[i],   Y[i],   Z[i]);
+                Vec3 P1 = Vec3(X[i + 1], Y[i + 1], Z[i + 1]);
+                Vec3 P2 = Vec3(X[i + 2], Y[i + 2], Z[i + 2]);
 
-            QuadTestAndSaveT(bounds, P0, P1, P2, P3, direction, point, lastT);
+                TriTestAndSaveT(bounds, P0, P1, P2, direction, point, lastT);
+            }            
         }
     }
-    if (type == __GO_GRAYPLOT__)
+    else if (type == __GO_GRAYPLOT__)
     {
 
         int numX = 0;
@@ -226,7 +238,7 @@ double pickSurface(int uid, double x, double y,  double z, double dx, double dy,
 
         QuadTestAndSaveT(bounds, P0, P1, P2, P3, direction, point, lastT);
     }
-    if (type == __GO_MATPLOT__)
+    else if (type == __GO_MATPLOT__)
     {
         double* scale = NULL;
         double* translate = NULL;
@@ -316,6 +328,12 @@ bool isInViewBox(double * bounds, Vec3 point)
 
 void QuadTestAndSaveT(double *bounds, Vec3 P0, Vec3 P1, Vec3 P2, Vec3 P3, Vec3 direction, Vec3 point, double &retT)
 {
+    TriTestAndSaveT(bounds, P0, P1, P2, direction, point, retT);
+    TriTestAndSaveT(bounds, P0, P2, P3, direction, point, retT);
+}
+
+void TriTestAndSaveT(double *bounds, Vec3 P0, Vec3 P1, Vec3 P2, Vec3 direction, Vec3 point, double &retT)
+{
     Vec3 intersectionPoint;
     double t;
     /*test first triangle*/
@@ -329,17 +347,7 @@ void QuadTestAndSaveT(double *bounds, Vec3 P0, Vec3 P1, Vec3 P2, Vec3 P3, Vec3 d
             retT = retT > t ? retT : t;
         }
     }
-    /*test second triangle*/
-    if (test_tri(P0, P2, P3, direction, point, t) == 1)
-    {
-        intersectionPoint = point + direction * t;        
-        if (isInViewBox(bounds, intersectionPoint))
-        {
-            retT = retT > t ? retT : t;
-        }
-    }
 }
 
 
 
-
index 0a68152..ad3d7bf 100644 (file)
@@ -152,16 +152,17 @@ public class DragZoomRotateInteraction extends FigureInteraction {
                 Double[] bounds = axes.getDisplayedBounds();
                 double[][] factors = axes.getScaleTranslateFactors();
                 // Zoom only if position of mouse cursor is inside the bounds
-                if (position[0] > bounds[0] && position[0] < bounds[1] &&
-                        position[1] > bounds[2] && position[1] < bounds[3] &&
-                        position[2] > bounds[4] && position[2] < bounds[5]) {
+                if (position[0] >= bounds[0] && position[0] <= bounds[1] &&
+                        position[1] >= bounds[2] && position[1] <= bounds[3] &&
+                        position[2] >= bounds[4] && position[2] <= bounds[5]) {
                     bounds[0] = position[0] + (bounds[0] - position[0]) * scale;
                     bounds[1] = position[0]  + (bounds[1] - position[0]) * scale;
                     bounds[2] = position[1] + (bounds[2] - position[1]) * scale;
                     bounds[3] = position[1] + (bounds[3] - position[1]) * scale;
-                    bounds[4] = position[2] + (bounds[4] - position[2]) * scale;
-                    bounds[5] = position[2] + (bounds[5] - position[2]) * scale;
-
+                    if (axes.getView() != 0) {
+                        bounds[4] = position[2] + (bounds[4] - position[2]) * scale;
+                        bounds[5] = position[2] + (bounds[5] - position[2]) * scale;
+                    }
                     bounds[0] = bounds[0] * factors[0][0] + factors[1][0];
                     bounds[1] = bounds[1] * factors[0][0] + factors[1][0];
                     bounds[2] = bounds[2] * factors[0][1] + factors[1][1];
diff --git a/scilab/modules/renderer/tests/nonreg_tests/bug_16003.tst b/scilab/modules/renderer/tests/nonreg_tests/bug_16003.tst
new file mode 100644 (file)
index 0000000..a1923f4
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - St├ęphane MOTTELET
+//
+//// This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+// <-- INTERACTIVE TEST -->
+//
+// <-- Non-regression test for bug 16003 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16003
+//
+// <-- Short Description -->
+// Zoom with mouse scroll wheel is broken on simple surfaces
+
+// after running the following two lines verify that you can
+// zoom with the mouse wheel on the triangle and on the square
+plot3d([0 1 1 0]',[1 1 0 0]',[1 1 0 0]');
+plot3d(2+[0 1 1]',[1 0 0]',[1 0 1]');