af09bce0eeb73d1752351e97c9fa0e4a24401b8c
[scilab.git] / scilab / modules / graphic_objects / src / java / org / scilab / modules / graphic_objects / axes / Camera.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Manuel JULIACHS
4  * Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 package org.scilab.modules.graphic_objects.axes;
15
16 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject.UpdateStatus;
17
18 /**
19  * Camera class
20  * @author Manuel JULIACHS
21  */
22 public class Camera {
23     /** Default rotation angles */
24     public static final double[] DEFAULT_ROTATION_ANGLES = {0.0, 270.0};
25
26     /** Camera properties names */
27     public enum CameraProperty { VIEW, ISOVIEW, CUBESCALING, ROTATIONANGLES, ROTATIONANGLES3D };
28
29     /** View type */
30     public enum ViewType { VIEW_2D, VIEW_3D;
31
32                            /**
33                             * Converts an integer to the corresponding enum
34                             * @param intValue the integer value
35                             * @return the view type type enum
36                             */
37     public static ViewType intToEnum(Integer intValue) {
38         switch (intValue) {
39             case 0:
40                 return ViewType.VIEW_2D;
41             case 1:
42                 return ViewType.VIEW_3D;
43             default:
44                 return null;
45         }
46     }
47                          }
48
49     /** Specifies whether the projection must be performed for a 2D or a 3D scene */
50     private ViewType view;
51
52     /** Specifies whether an isoview transformation must be applied or not */
53     private boolean isoview;
54
55     /** Specifies whether a unit cube transformation must be performed */
56     private boolean cubeScaling;
57
58     /** 2-element array (alpha and theta rotation angles) */
59     private double[] rotationAngles;
60
61     /**
62      * Last know values of the rotation angles when View was equal to VIEW_3D
63      * 2-element array (alpha and theta)
64      */
65     private double[] rotationAngles3d;
66
67     /** Constructor */
68     public Camera() {
69         view = ViewType.VIEW_2D;
70         isoview = false;
71         cubeScaling = false;
72         rotationAngles = new double[2];
73         rotationAngles3d = new double[2];
74     }
75
76     /**
77      * Copy constructor
78      * @param camera the Camera to copy
79      */
80     public Camera(Camera camera) {
81         view = camera.view;
82         isoview = camera.isoview;
83         cubeScaling = camera.cubeScaling;
84
85         rotationAngles = new double[2];
86
87         rotationAngles[0] = camera.rotationAngles[0];
88         rotationAngles[1] = camera.rotationAngles[1];
89
90         rotationAngles3d = new double[2];
91
92         rotationAngles3d[0] = camera.rotationAngles3d[0];
93         rotationAngles3d[1] = camera.rotationAngles3d[1];
94     }
95
96     @Override
97     public boolean equals(Object o) {
98         if (o instanceof Camera) {
99             Camera c = (Camera) o;
100             return view == c.view && isoview == c.isoview && cubeScaling == c.cubeScaling && rotationAngles[0] == c.rotationAngles[0] && rotationAngles[1] == c.rotationAngles[1] && rotationAngles3d[0] == c.rotationAngles3d[0] && rotationAngles3d[1] == c.rotationAngles3d[1];
101         }
102
103         return false;
104     }
105
106     /**
107      * @return the cubeScaling
108      */
109     public Boolean getCubeScaling() {
110         return cubeScaling;
111     }
112
113     /**
114      * @param cubeScaling the cubeScaling to set
115      */
116     public UpdateStatus setCubeScaling(Boolean cubeScaling) {
117         if (this.cubeScaling != cubeScaling) {
118             this.cubeScaling = cubeScaling;
119             return UpdateStatus.Success;
120         }
121
122         return UpdateStatus.NoChange;
123     }
124
125     /**
126      * @return the isoview
127      */
128     public Boolean getIsoview() {
129         return isoview;
130     }
131
132     /**
133      * @param isoview the isoview to set
134      */
135     public UpdateStatus setIsoview(Boolean isoview) {
136         if (this.isoview = isoview) {
137             this.isoview = isoview;
138             return UpdateStatus.Success;
139         }
140
141         return UpdateStatus.NoChange;
142     }
143
144     /**
145      * @return the rotationAngles in degree
146      */
147     public Double[] getRotationAngles() {
148         Double [] retRotationAngles = new Double[2];
149
150         retRotationAngles[0] = rotationAngles[0];
151         retRotationAngles[1] = rotationAngles[1];
152
153         return retRotationAngles;
154     }
155
156     /**
157      * @param rotationAngles the rotationAngles to set
158      * @return true if the rotation angles have changed.
159      */
160     public boolean setRotationAngles(Double[] rotationAngles) {
161         if ((this.rotationAngles[0] != rotationAngles[0]) || (this.rotationAngles[1] != rotationAngles[1])) {
162             if (rotationAngles[0] == DEFAULT_ROTATION_ANGLES[0] && rotationAngles[1] == DEFAULT_ROTATION_ANGLES[1]) {
163                 view = ViewType.VIEW_2D;
164             } else if (view == ViewType.VIEW_2D) {
165                 view = ViewType.VIEW_3D;
166             }
167
168             this.rotationAngles[0] = rotationAngles[0];
169             this.rotationAngles[1] = rotationAngles[1];
170             return true;
171         } else {
172             return false;
173         }
174     }
175
176     /**
177      * @return the 3d rotationAngles
178      */
179     public Double[] getRotationAngles3d() {
180         Double [] retRotationAngles3d = new Double[2];
181
182         retRotationAngles3d[0] = rotationAngles3d[0];
183         retRotationAngles3d[1] = rotationAngles3d[1];
184
185         return retRotationAngles3d;
186     }
187
188     /**
189      * @param rotationAngles3d the 3d rotationAngles to set
190      */
191     public UpdateStatus setRotationAngles3d(Double[] rotationAngles3d) {
192         if (this.rotationAngles3d[0] != rotationAngles3d[0] || this.rotationAngles3d[1] != rotationAngles3d[1]) {
193             this.rotationAngles3d[0] = rotationAngles3d[0];
194             this.rotationAngles3d[1] = rotationAngles3d[1];
195             return UpdateStatus.Success;
196         }
197
198         return UpdateStatus.NoChange;
199     }
200
201     /**
202      * @return the view
203      */
204     public ViewType getView() {
205         return view;
206     }
207
208     /**
209      * @param view the view to set
210      */
211     public UpdateStatus setView(ViewType view) {
212         if (this.view != view) {
213             if (view == ViewType.VIEW_2D) {
214                 rotationAngles3d[0] = rotationAngles[0];
215                 rotationAngles3d[1] = rotationAngles[1];
216
217                 rotationAngles[0] = DEFAULT_ROTATION_ANGLES[0];
218                 rotationAngles[1] = DEFAULT_ROTATION_ANGLES[1];
219             } else if (view == ViewType.VIEW_3D && this.view == ViewType.VIEW_2D) {
220                 rotationAngles[0] = rotationAngles3d[0];
221                 rotationAngles[1] = rotationAngles3d[1];
222             }
223             this.view = view;
224             return UpdateStatus.Success;
225         }
226
227         return UpdateStatus.NoChange;
228     }
229 }