]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/src/org/simantics/proconf/g3d/gizmo/RotateGizmo.java
Naming fixes.
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / proconf / g3d / gizmo / RotateGizmo.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
3  * All rights reserved. This program and the accompanying materials\r
4  * are made available under the terms of the Eclipse Public License v1.0\r
5  * which accompanies this distribution, and is available at\r
6  * http://www.eclipse.org/legal/epl-v10.html\r
7  *\r
8  * Contributors:\r
9  *     VTT Technical Research Centre of Finland - initial API and implementation\r
10  *******************************************************************************/\r
11 package org.simantics.proconf.g3d.gizmo;\r
12 \r
13 import javax.vecmath.Color4f;\r
14 import javax.vecmath.Point3f;\r
15 \r
16 import com.jme.bounding.BoundingBox;\r
17 import com.jme.renderer.Renderer;\r
18 import com.jme.scene.TriMesh;\r
19 import com.jme.scene.state.AlphaState;\r
20 import com.jme.scene.state.MaterialState;\r
21 import com.jme.scene.state.ZBufferState;\r
22 import com.jme.util.geom.BufferUtils;\r
23 \r
24 \r
25 \r
26 public class RotateGizmo extends MultiSelectionGizmo {\r
27 \r
28     \r
29     public static String PICK_NAME = "rotate";\r
30     public static String X_NAME = "rx";\r
31     public static String Y_NAME = "ry";\r
32     public static String Z_NAME = "rz";\r
33     public static String XYZ_NAME = "ra";\r
34     \r
35     public static final int X = 0;\r
36     public static final int Y = 1;\r
37     public static final int Z = 2;\r
38     public static final int XYZ = 3;\r
39     \r
40 \r
41     \r
42     \r
43     /* (non-Javadoc)\r
44      * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix()\r
45      */\r
46     public String getPickPrefix() {\r
47         return PICK_NAME;\r
48     }\r
49     \r
50     public int getIndexForName(String name) {\r
51         if (!name.startsWith(PICK_NAME)) {\r
52             return -1;\r
53         }\r
54         name = name.substring(PICK_NAME.length());\r
55         if (name.startsWith(X_NAME))\r
56             return X;\r
57         if (name.startsWith(Y_NAME))\r
58             return Y;\r
59         if (name.startsWith(Z_NAME))\r
60             return Z;\r
61         if (name.startsWith(XYZ_NAME))\r
62             return XYZ;\r
63         return -1;\r
64     }\r
65     \r
66 \r
67     @Override\r
68     public int getCount() {\r
69         return 4;\r
70     }\r
71 \r
72     public RotateGizmo(Renderer renderer) {\r
73         super();\r
74         float radius = 2.f;\r
75         float radius2 = 1.8f;\r
76         int div = 9;\r
77         \r
78         float x[] = new float[div+1];\r
79         float y[] = new float[div+1];\r
80         float x2[] = new float[div+1];\r
81         float y2[] = new float[div+1];\r
82         x[0] = radius;\r
83         y[0] = 0.f;\r
84         x[div] = 0.f;\r
85         y[div] = radius;\r
86         x2[0] = radius2;\r
87         y2[0] = 0.f;\r
88         x2[div] = 0.f;\r
89         y2[div] = radius2;\r
90         \r
91         for (int i = 1; i < div; i++) {\r
92             float angle = (float)i/(float)div;\r
93             angle *= Math.PI * 0.5f;\r
94             float c = (float)Math.cos(angle);\r
95             float s = (float)Math.sin(angle);\r
96             x[i] = radius * c;\r
97             y[i] = radius * s;\r
98             x2[i] = radius2 * c;\r
99             y2[i] = radius2 * s;\r
100 \r
101         }\r
102          \r
103         Color4f colorx = new Color4f(0.5f,0.f,0.f,0.5f);\r
104         Color4f colory = new Color4f(0.f,0.5f,0.f,0.5f);\r
105         Color4f colorz = new Color4f(0.f,0.f,0.5f,0.5f);\r
106         Color4f scolorx = new Color4f(1.f,0.f,0.f,0.7f);\r
107         Color4f scolory = new Color4f(0.f,1.f,0.f,0.7f);\r
108         Color4f scolorz = new Color4f(0.f,0.f,1.f,0.7f);\r
109 \r
110         \r
111         Color4f colorxyz = new Color4f();\r
112         colorxyz.x = colorx.x + colory.x + colorz.x;\r
113         colorxyz.y = colorx.y + colory.y + colorz.y;\r
114         colorxyz.z = colorx.z +colory.z + colorz.z;\r
115         colorxyz.w = 0.5f;\r
116         \r
117         Color4f scolorxyz = new Color4f();\r
118         scolorxyz.x = scolorx.x + scolory.x + scolorz.x;\r
119         scolorxyz.y = scolorx.y + scolory.y + scolorz.y;\r
120         scolorxyz.z = scolorx.z + scolory.z + scolorz.z;\r
121         scolorxyz.w = 0.5f;\r
122         \r
123         int  numVertices = div*2;\r
124         float coordinates[] = new float[numVertices*3 + numVertices*3];\r
125         float cols[] = new float[numVertices*4*2];\r
126         int[] indices = new int[numVertices*3-6+numVertices*3 - 12];\r
127         for (int i = 0; i < div; i++) {\r
128             if (i == 0) {\r
129                 indices[0] = 0;\r
130                 indices[1] = 1;\r
131                 indices[2] = 2;\r
132                 continue;\r
133             }\r
134             int vIndex = i * 2 - 1;\r
135             int index = i * 6 - 3;\r
136             if (i == div - 1) {\r
137                 indices[index] = vIndex;\r
138                 indices[index+1] = vIndex+1;\r
139                 indices[index+2] = vIndex+2;\r
140                \r
141             } else {\r
142                 indices[index] = vIndex;\r
143                 indices[index+1] = vIndex+1;\r
144                 indices[index+2] = vIndex+2;\r
145                 indices[index+3] = vIndex+1;\r
146                 indices[index+4] = vIndex+3;\r
147                 indices[index+5] = vIndex+2;\r
148             }\r
149         }\r
150         \r
151         for (int i = div+1; i < div * 2 - 1; i++) {\r
152             int vIndex = i * 2 - 1;\r
153             int index = i * 6 - 12;\r
154 \r
155                 indices[index] = vIndex;\r
156                 indices[index+1] = vIndex+1;\r
157                 indices[index+2] = vIndex+2;\r
158                 indices[index+3] = vIndex+1;\r
159                 indices[index+4] = vIndex+3;\r
160                 indices[index+5] = vIndex+2;\r
161         }\r
162         \r
163         for (int i = 0; i < numVertices*2; i++)\r
164           setColor(cols,i, colorx);\r
165         \r
166         setCoordinate(coordinates,0, new Point3f(0.f, x[0], 0.f));\r
167         for (int i = 1; i < div; i++) {\r
168             int index = i * 2 - 1;\r
169             setCoordinate(coordinates,index,new Point3f(0.f,x[i],y[i]));\r
170             setCoordinate(coordinates,index+1,new Point3f(y[1],x[i],y[i]));  \r
171         }\r
172         setCoordinate(coordinates,numVertices - 1, new Point3f(0.f, 0.f, y[div]));\r
173         \r
174         setCoordinate(coordinates,numVertices, new Point3f(0.f, x2[0], 0.f));\r
175         for (int i = 1; i < div; i++) {\r
176             int index = (div+i) * 2 - 1;\r
177             setCoordinate(coordinates,index,new Point3f(y[1],x[i],y[i]));\r
178             setCoordinate(coordinates,index+1,new Point3f(y2[1],x2[i],y2[i]));  \r
179         }\r
180         setCoordinate(coordinates,numVertices*2 - 1, new Point3f(0.f, 0.f, y2[div]));\r
181        \r
182         TriMesh linex = new TriMesh(PICK_NAME+X_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
183         \r
184         \r
185         for (int i = 0; i < numVertices*2; i++)\r
186           setColor(cols,i, colory);\r
187         \r
188         setCoordinate(coordinates,0, new Point3f(x[0], 0.f, 0.f));\r
189         for (int i = 1; i < div; i++) {\r
190             int index = i * 2 - 1;\r
191             setCoordinate(coordinates,index,new Point3f(x[i],0.f,y[i]));\r
192             setCoordinate(coordinates,index+1,new Point3f(x[i],y[1],y[i]));  \r
193         }\r
194         setCoordinate(coordinates,numVertices - 1, new Point3f(0.f, 0.f, y[div]));\r
195         \r
196         setCoordinate(coordinates,numVertices, new Point3f(x2[0], 0.f, 0.f));\r
197         for (int i = 1; i < div; i++) {\r
198             int index = (div+i) * 2 - 1;\r
199             setCoordinate(coordinates,index,new Point3f(x[i],y[1],y[i]));\r
200             setCoordinate(coordinates,index+1,new Point3f(x2[i],y2[1],y2[i]));  \r
201         }\r
202         setCoordinate(coordinates,numVertices*2 - 1, new Point3f(0.f, 0.f, y2[div]));\r
203 \r
204         TriMesh liney = new TriMesh(PICK_NAME+Y_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
205         \r
206         \r
207         for (int i = 0; i < numVertices*2; i++)\r
208           setColor(cols,i, colorz);\r
209         \r
210         setCoordinate(coordinates,0, new Point3f(0.f, x[0], 0.f));\r
211         for (int i = 1; i < div; i++) {\r
212             int index = i * 2 - 1;\r
213             setCoordinate(coordinates,index,new Point3f(y[i],x[i],0.f));\r
214             setCoordinate(coordinates,index+1,new Point3f(y[i],x[i],y[1]));  \r
215         }\r
216         setCoordinate(coordinates,numVertices - 1, new Point3f(y[div],0.f, 0.f));\r
217 \r
218         setCoordinate(coordinates,numVertices, new Point3f(0.f, x2[0], 0.f));\r
219         for (int i = 1; i < div; i++) {\r
220             int index = (div+i) * 2 - 1;\r
221             setCoordinate(coordinates,index,new Point3f(y[i],x[i],y[1]));\r
222             setCoordinate(coordinates,index+1,new Point3f(y2[i],x2[i],y2[1]));  \r
223         }\r
224         setCoordinate(coordinates,numVertices*2 - 1, new Point3f(y2[div],0.f, 0.f));\r
225 \r
226         TriMesh linez = new TriMesh(PICK_NAME+Z_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
227         \r
228         \r
229         numVertices = (div-2)*3+1;\r
230         coordinates = new float[numVertices*3];\r
231         cols = new float[numVertices*4];\r
232         indices = new int[(div-2)*3*3];\r
233         \r
234         for (int i = 0; i < numVertices; i++)\r
235             setColor(cols,i, colorxyz);\r
236         float center = radius * 0.5f;//(float)Math.cos(Math.PI*0.25);\r
237         setCoordinate(coordinates,0,new Point3f(center,center,center));\r
238         for (int i = 1; i < div; i++) {\r
239             int index = i;\r
240             setCoordinate(coordinates,index,new Point3f(y2[1],x2[i],y2[i]));\r
241         }\r
242         for (int i = 1; i < div; i++) {\r
243             int index = i + div-1 - 1;\r
244             setCoordinate(coordinates,index,new Point3f(y2[i],y2[1],x2[i]));\r
245         }\r
246         for (int i = 1; i < div-1; i++) {\r
247             int index = i + 2*(div-1) -2;\r
248             setCoordinate(coordinates,index,new Point3f(x2[i],y2[i],y2[1]));\r
249         }\r
250         for (int i = 0; i < (div-2)*3; i++) {\r
251             int index = i*3;\r
252             int iindex = i+1;\r
253             indices[index] = 0;\r
254             indices[index+1] = iindex;\r
255             indices[index+2] = iindex+1;\r
256             if (iindex == (numVertices -1))\r
257                 indices[index+2] = 1;\r
258             \r
259         }\r
260 \r
261         TriMesh trianglexyz = new TriMesh(PICK_NAME+XYZ_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
262         \r
263         \r
264         getGizmoNode().attachChild(linex);\r
265         getGizmoNode().attachChild(liney);\r
266         getGizmoNode().attachChild(linez);\r
267         getGizmoNode().attachChild(trianglexyz);\r
268         getGizmoNode().setModelBound(new BoundingBox());\r
269         getGizmoNode().updateModelBound();\r
270         \r
271         linex.getBatch(0).setCastsShadows(false);\r
272         liney.getBatch(0).setCastsShadows(false);\r
273         linez.getBatch(0).setCastsShadows(false);\r
274         trianglexyz.getBatch(0).setCastsShadows(false);\r
275         \r
276         setGeometry(0,linex);\r
277         setGeometry(1,liney);\r
278         setGeometry(2,linez);\r
279         setGeometry(3,trianglexyz);\r
280              \r
281         setColor(0,0,colorx);\r
282         setColor(0,1,scolorx);\r
283         setColor(1,0,colory);\r
284         setColor(1,1,scolory);\r
285         setColor(2,0,colorz);\r
286         setColor(2,1,scolorz);\r
287         setColor(3,0,colorxyz);\r
288         setColor(3,1,scolorxyz);\r
289         \r
290         AlphaState as = renderer.createAlphaState();\r
291         as.setBlendEnabled(true);\r
292         as.setSrcFunction(AlphaState.DB_SRC_ALPHA);\r
293         as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
294         as.setEnabled(true);\r
295         getGizmoNode().setRenderState(as);\r
296         MaterialState ms = renderer.createMaterialState();\r
297         ms.setColorMaterial(MaterialState.CM_AMBIENT_AND_DIFFUSE);\r
298         ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);\r
299         getGizmoNode().setRenderState(ms);\r
300         ZBufferState zs = renderer.createZBufferState();\r
301         zs.setFunction(ZBufferState.CF_ALWAYS);\r
302         zs.setEnabled(true);\r
303         getGizmoNode().setRenderState(zs);\r
304         \r
305         \r
306     }\r
307 \r
308 }