Fix some Coverity issues after 33b80b 50fe1d 5f73e9 and c473f9
[scilab.git] / scilab / modules / renderer / src / java / org / scilab / modules / renderer / utils / PolylineHandler.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Pedro Arthur dos S. Souza
4  * Copyright (C) 2012 - Caio Lucas dos S. Souza
5  * Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
6  *
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15  *
16  */
17
18 package org.scilab.modules.renderer.utils;
19
20 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
21 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
22
23 import org.scilab.modules.graphic_objects.PolylineData;
24 import org.scilab.forge.scirenderer.tranformations.Vector3d;
25 import org.scilab.modules.renderer.JoGLView.axes.AxesDrawer;
26 import org.scilab.modules.renderer.CallRenderer;
27 import org.scilab.modules.graphic_objects.axes.Axes;
28
29 /**
30  * Implements all polyline manipulation functions for the editor.
31  *
32  * @author Caio Souza <caioc2bolado@gmail.com>
33  * @author Pedro Souza <bygrandao@gmail.com>
34  *
35  * @since 2012-06-01
36  */
37
38 public class PolylineHandler {
39
40     static PolylineHandler instance = null;
41
42     public PolylineHandler() {
43     }
44
45     public static PolylineHandler getInstance() {
46         if (instance == null) {
47             instance = new PolylineHandler();
48         }
49         return instance;
50     }
51
52     /**
53      * Deletes all child entities from the given object.
54      *
55      * @param uid Object unique identifier.
56      */
57     public void deleteAll(Integer uid) {
58
59         Integer type = (Integer)GraphicController.getController().getProperty(uid, GraphicObjectProperties.__GO_TYPE__);
60         Integer childCount = (Integer)GraphicController.getController().getProperty(uid, GraphicObjectProperties.__GO_CHILDREN_COUNT__);
61         Integer[] child = (Integer[])GraphicController.getController().getProperty(uid, GraphicObjectProperties.__GO_CHILDREN__);
62         if (type == GraphicObjectProperties.__GO_AXES__) {
63             for (Integer i = 0; i < childCount; ++i) {
64                 Integer cType = (Integer)GraphicController.getController().getProperty(child[i], GraphicObjectProperties.__GO_TYPE__);
65                 if (cType != GraphicObjectProperties.__GO_LABEL__) {
66                     CommonHandler.delete(child[i]);
67                 } else {
68                     String[] text = { "" };
69                     GraphicController.getController().setProperty(child[i], GraphicObjectProperties.__GO_TEXT_STRINGS__, text);
70                 }
71             }
72         } else {
73
74             for (Integer i = 0; i < childCount; ++i) {
75                 deleteAll(child[i]);
76             }
77         }
78
79     }
80
81     private Integer[] searchCompound(Integer uid) {
82         return (new ObjectSearcher()).search(uid, GraphicObjectProperties.__GO_COMPOUND__);
83     }
84
85     /**
86      * Drag the given polyline, add the difference of the click position to the polyline data
87      *
88      * @param polyline The uid of the polyline
89      * @param position The click position
90      * @param nextPosition The drag position
91      */
92     public void dragPolyline(Integer polyline, Integer[] position, Integer[] nextPosition) {
93
94         Integer axes = (Integer) GraphicController.getController().getProperty(polyline, GraphicObjectProperties.__GO_PARENT_AXES__);
95         if (polyline != null && axes != null) {
96             double[] datax = (double[])PolylineData.getDataX(polyline);
97             double[] datay = (double[])PolylineData.getDataY(polyline);
98             double[] dataz = (double[])PolylineData.getDataZ(polyline);
99
100             //Current point
101             Vector3d planePoint = new Vector3d(datax[0], datay[0], dataz[0]);
102             Vector3d planeNorm = new Vector3d(0.0, 0.0, 1.0);
103             //2d coords for current click
104             double[] pos = {nextPosition[0].doubleValue(), nextPosition[1].doubleValue(), 1.0};
105             double[] c2d = CallRenderer.get2dViewFromPixelCoordinates(axes, pos);
106             //2d position for last click
107             double[] pos2 = {position[0].doubleValue(), position[1].doubleValue(), 1.0};
108             double[] c2d2 = CallRenderer.get2dViewFromPixelCoordinates(axes, pos2);
109
110             Axes axesObj = AxesHandler.getAxesFromUid(axes);
111             //3d ray for the current click
112             double[] c3d1 = AxesDrawer.compute3dViewCoordinates(axesObj, c2d);
113             c2d[2] += 1.0;
114             double[] c3d2 = AxesDrawer.compute3dViewCoordinates(axesObj, c2d);
115             //3d ray for last click
116             double[] c3d3 = AxesDrawer.compute3dViewCoordinates(axesObj, c2d2);
117             c2d2[2] += 1.0;
118             double[] c3d4 = AxesDrawer.compute3dViewCoordinates(axesObj, c2d2);
119
120             //3d current click point and dir
121             Vector3d v0 = new Vector3d(c3d1);
122             Vector3d v1 = new Vector3d(c3d2);
123             Vector3d vdir = v1.minus(v0);
124             //3d old click point and dir
125             Vector3d w0 = new Vector3d(c3d3);
126             Vector3d wdir = v1.minus(v0);
127
128             //if the dir is parallel to the plane there isn't intersection
129             if (wdir.getZ() == 0 || vdir.getZ() == 0) {
130                 return;
131             }
132             //General plane intersection
133             double v = (planePoint.getZ() - v0.getZ()) / vdir.getZ();
134             Vector3d pointNew = vdir.times(v);
135             pointNew = pointNew.plus(v0);
136
137             double w = (planePoint.getZ() - w0.getZ()) / wdir.getZ();
138             Vector3d pointOld = wdir.times(w);
139             pointOld = pointOld.plus(w0);
140
141             PolylineData.translatePolyline(polyline, pointNew.getX() - pointOld.getX(), pointNew.getY() - pointOld.getY(), 0.0, 0, 0, 0);
142             GraphicController.getController().setProperty(polyline, GraphicObjectProperties.__GO_DATA_MODEL__, polyline);
143         }
144     }
145 }