]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.proconf.g3d/src/org/simantics/proconf/g3d/gizmo/TransformGizmo.java
latest release (0.41), third attempt
[simantics/3d.git] / org.simantics.proconf.g3d / src / org / simantics / proconf / g3d / gizmo / TransformGizmo.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.\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 public class TransformGizmo extends MultiSelectionGizmo {\r
26 \r
27     \r
28     public static String PICK_NAME = "translate";\r
29     public static String X_NAME = "ax";\r
30     public static String Y_NAME = "ay";\r
31     public static String Z_NAME = "az";\r
32     public static String XZ_NAME = "xz";\r
33     public static String XY_NAME = "xy";\r
34     public static String YZ_NAME = "yz";\r
35     public static String XYZ_NAME = "aa";\r
36     \r
37     public static final int X = 0;\r
38     public static final int Y = 1;\r
39     public static final int Z = 2;\r
40     public static final int XY = 3;\r
41     public static final int XZ = 4;\r
42     public static final int YZ = 5;\r
43     public static final int XYZ = 6;\r
44 \r
45     \r
46     \r
47     /* (non-Javadoc)\r
48      * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix()\r
49      */\r
50     public String getPickPrefix() {\r
51         return PICK_NAME;\r
52     }\r
53     \r
54     public int getIndexForName(String name) {\r
55         if (!name.startsWith(PICK_NAME)) {\r
56             return -1;\r
57         }\r
58         name = name.substring(PICK_NAME.length());\r
59         if (name.startsWith(X_NAME))\r
60             return X;\r
61         if (name.startsWith(Y_NAME))\r
62             return Y;\r
63         if (name.startsWith(Z_NAME))\r
64             return Z;\r
65         if (name.startsWith(XY_NAME))\r
66             return XY;\r
67         if (name.startsWith(XZ_NAME))\r
68             return XZ;\r
69         if (name.startsWith(YZ_NAME))\r
70             return YZ;\r
71         if (name.startsWith(XYZ_NAME))\r
72             return XYZ;\r
73         return -1;\r
74     }\r
75     \r
76     @Override\r
77     public int getCount() {\r
78         return 7;\r
79     }\r
80 \r
81     \r
82     /*\r
83      public TransformGizmo() {\r
84      */\r
85     public TransformGizmo(Renderer renderer) {\r
86         super();\r
87         float size = 2.f;\r
88         float sizeD2 = 1.f;\r
89         float offset = 0.2f;\r
90         \r
91         Color4f colorx = new Color4f(0.5f,0.f,0.f,0.5f);\r
92         Color4f colory = new Color4f(0.f,0.5f,0.f,0.5f);\r
93         Color4f colorz = new Color4f(0.f,0.f,0.5f,0.5f);\r
94         Color4f scolorx = new Color4f(1.f,0.f,0.f,0.7f);\r
95         Color4f scolory = new Color4f(0.f,1.f,0.f,0.7f);\r
96         Color4f scolorz = new Color4f(0.f,0.f,1.f,0.7f);\r
97         \r
98         Color4f colorxy = new Color4f();\r
99         colorxy.x = colorx.x + colory.x;\r
100         colorxy.y = colorx.y + colory.y;\r
101         colorxy.z = colorx.z + colory.z;\r
102         colorxy.w = 0.5f;\r
103         \r
104         Color4f colorxz = new Color4f();\r
105         colorxz.x = colorx.x + colorz.x;\r
106         colorxz.y = colorx.y + colorz.y;\r
107         colorxz.z = colorx.z + colorz.z;\r
108         colorxz.w = 0.5f;\r
109         \r
110         Color4f coloryz = new Color4f();\r
111         coloryz.x = colory.x + colorz.x;\r
112         coloryz.y = colory.y + colorz.y;\r
113         coloryz.z = colory.z + colorz.z;\r
114         coloryz.w = 0.5f;\r
115         \r
116         Color4f colorxyz = new Color4f();\r
117         colorxyz.x = colorx.x + colory.x + colorz.x;\r
118         colorxyz.y = colorx.y + colory.y + colorz.y;\r
119         colorxyz.z = colorx.z +colory.z + colorz.z;\r
120         colorxyz.w = 0.5f;\r
121         \r
122         Color4f scolorxy = new Color4f();\r
123         scolorxy.x = scolory.x + scolorx.x;\r
124         scolorxy.y = scolory.y + scolorx.y;\r
125         scolorxy.z = scolory.z + scolorx.z;\r
126         scolorxy.w = 0.5f;\r
127         \r
128         Color4f scolorxz = new Color4f();\r
129         scolorxz.x = scolorx.x + scolorz.x;\r
130         scolorxz.y = scolorx.y + scolorz.y;\r
131         scolorxz.z = scolorx.z + scolorz.z;\r
132         scolorxz.w = 0.5f;\r
133         \r
134         Color4f scoloryz = new Color4f();\r
135         scoloryz.x = scolory.x + scolorz.x;\r
136         scoloryz.y = scolory.y + scolorz.y;\r
137         scoloryz.z = scolory.z + scolorz.z;\r
138         scoloryz.w = 0.5f;\r
139         \r
140         Color4f scolorxyz = new Color4f();\r
141         scolorxyz.x = scolorx.x + scolory.x + scolorz.x;\r
142         scolorxyz.y = scolorx.y + scolory.y + scolorz.y;\r
143         scolorxyz.z = scolorx.z + scolory.z + scolorz.z;\r
144         scolorxyz.w = 0.5f;\r
145         \r
146         \r
147         float coordinates[] = new float[6*3];\r
148         float cols[] = new float[6*4];\r
149         int[] indices = new int[]{0,1,3,\r
150                                   1,2,3,\r
151                                   0,3,5,\r
152                                   3,4,5};\r
153         for (int i = 0; i < 6; i++)\r
154           setColor(cols,i, colorx);\r
155 \r
156         setCoordinate(coordinates,0, new Point3f(size, 0.f, 0.f));\r
157         setCoordinate(coordinates,1, new Point3f(size - offset, offset, 0.f));\r
158         setCoordinate(coordinates,2, new Point3f(sizeD2 - offset, offset, 0.f));\r
159         setCoordinate(coordinates,3, new Point3f(sizeD2, 0.f, 0.f));\r
160         setCoordinate(coordinates,4, new Point3f(sizeD2 - offset, 0.f, offset));\r
161         setCoordinate(coordinates,5, new Point3f(size - offset, 0.f, offset));\r
162 \r
163         TriMesh linex = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
164         \r
165         for (int i = 0; i < 6; i++)\r
166           setColor(cols,i, colory);\r
167 \r
168         setCoordinate(coordinates,0, new Point3f(0.f, size, 0.f));\r
169         setCoordinate(coordinates,1, new Point3f(offset, size - offset, 0.f));\r
170         setCoordinate(coordinates,2, new Point3f(offset, sizeD2 - offset, 0.f));\r
171         setCoordinate(coordinates,3, new Point3f(0.f, sizeD2, 0.f));\r
172         setCoordinate(coordinates,4, new Point3f(0.f, sizeD2 - offset, offset));\r
173         setCoordinate(coordinates,5, new Point3f(0.f, size - offset, offset));\r
174 \r
175         TriMesh liney = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
176         \r
177         for (int i = 0; i < 6; i++)\r
178           setColor(cols,i, colorz);\r
179 \r
180         setCoordinate(coordinates,0, new Point3f(0.f, 0.f,size));\r
181         setCoordinate(coordinates,1, new Point3f(offset, 0.f, size - offset));\r
182         setCoordinate(coordinates,2, new Point3f(offset, 0.f, sizeD2 - offset));\r
183         setCoordinate(coordinates,3, new Point3f(0.f, 0.f, sizeD2));\r
184         setCoordinate(coordinates,4, new Point3f(0.f, offset, sizeD2 - offset));\r
185         setCoordinate(coordinates,5, new Point3f(0.f, offset, size - offset));\r
186 \r
187         TriMesh linez = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
188         \r
189         // TODO : picking did not work properly without chancing indices; this must be investigated \r
190         indices = new int[]{2,1,3,0,1,3};//{0,1,3,1,2,3};\r
191         coordinates = new float[4*3];\r
192         cols = new float[4*4];\r
193         \r
194         for (int i = 0; i < 4; i++)\r
195            setColor(cols,i, colorxz);\r
196         setCoordinate(coordinates,0, new Point3f(offset, 0.f, size-offset));\r
197         setCoordinate(coordinates,1, new Point3f(offset, 0.f, sizeD2 - offset));\r
198         setCoordinate(coordinates,2, new Point3f(sizeD2 - offset, 0.f, offset));\r
199         setCoordinate(coordinates,3, new Point3f(size-offset, 0.f, offset));\r
200 \r
201         TriMesh trianglexz = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
202         \r
203         for (int i = 0; i < 4; i++)\r
204             setColor(cols,i, colorxy);\r
205         setCoordinate(coordinates,0, new Point3f(offset, size-offset, 0.f));\r
206         setCoordinate(coordinates,1, new Point3f(offset, sizeD2 - offset, 0.f));\r
207         setCoordinate(coordinates,2, new Point3f(sizeD2 - offset, offset, 0.f));\r
208         setCoordinate(coordinates,3, new Point3f(size-offset, offset, 0.f));\r
209 \r
210         TriMesh trianglexy = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
211         \r
212         for (int i = 0; i < 4; i++)\r
213             setColor(cols,i, coloryz);\r
214         setCoordinate(coordinates,0, new Point3f( 0.f,offset, size-offset));\r
215         setCoordinate(coordinates,1, new Point3f( 0.f,offset, sizeD2 - offset));\r
216         setCoordinate(coordinates,2, new Point3f( 0.f,sizeD2 - offset, offset));\r
217         setCoordinate(coordinates,3, new Point3f( 0.f,size-offset, offset));\r
218 \r
219         TriMesh triangleyz = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
220         \r
221         indices = new int[]{0,1,2,\r
222                             0,2,3,\r
223                             0,3,4,\r
224                             0,4,5,\r
225                             0,5,6,\r
226                             0,6,7,\r
227                             0,7,8,\r
228                             0,8,9,\r
229                             0,9,1};\r
230         coordinates = new float[10*3];\r
231         cols = new float[10*4];\r
232         \r
233         for (int i = 0; i < 10; i++)\r
234             setColor(cols,i, colorxyz);\r
235         setCoordinate(coordinates,0, new Point3f(0.f, 0.f, 0.f));\r
236         setCoordinate(coordinates,1, new Point3f(sizeD2, 0.f, 0.f));\r
237         setCoordinate(coordinates,2, new Point3f(sizeD2 - offset, offset, 0.f));\r
238         setCoordinate(coordinates,3, new Point3f(offset, sizeD2 - offset, 0.f));\r
239         setCoordinate(coordinates,4, new Point3f(0.f, sizeD2, 0.f));\r
240         setCoordinate(coordinates,5, new Point3f(0.f, sizeD2 - offset, offset));\r
241         setCoordinate(coordinates,6, new Point3f(0.f, offset, sizeD2-offset));\r
242         setCoordinate(coordinates,7, new Point3f(0.f, 0.f, sizeD2));\r
243         setCoordinate(coordinates,8, new Point3f(offset, 0.f, sizeD2-offset));\r
244         setCoordinate(coordinates,9, new Point3f(sizeD2-offset, 0.f, offset));\r
245         \r
246         TriMesh trianglexyz = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
247         \r
248         linex.setName(PICK_NAME+X_NAME);\r
249         liney.setName(PICK_NAME+Y_NAME);\r
250         linez.setName(PICK_NAME+Z_NAME);\r
251         trianglexy.setName(PICK_NAME+XY_NAME);\r
252         trianglexz.setName(PICK_NAME+XZ_NAME);\r
253         triangleyz.setName(PICK_NAME+YZ_NAME);\r
254         trianglexyz.setName(PICK_NAME+XYZ_NAME);\r
255         \r
256         linex.getBatch(0).setCastsShadows(false);\r
257         liney.getBatch(0).setCastsShadows(false);\r
258         linez.getBatch(0).setCastsShadows(false);\r
259         trianglexy.getBatch(0).setCastsShadows(false);\r
260         trianglexz.getBatch(0).setCastsShadows(false);\r
261         triangleyz.getBatch(0).setCastsShadows(false);\r
262         trianglexyz.getBatch(0).setCastsShadows(false);\r
263 \r
264         getGizmoNode().attachChild(linex);\r
265         getGizmoNode().attachChild(liney);\r
266         getGizmoNode().attachChild(linez);\r
267         getGizmoNode().attachChild(trianglexy);\r
268         getGizmoNode().attachChild(trianglexz);\r
269         getGizmoNode().attachChild(triangleyz);\r
270         getGizmoNode().attachChild(trianglexyz);\r
271         getGizmoNode().setModelBound(new BoundingBox());\r
272         getGizmoNode().updateModelBound();\r
273 \r
274         setGeometry(0,linex);\r
275         setGeometry(1,liney);\r
276         setGeometry(2,linez);\r
277         setGeometry(3,trianglexy);\r
278         setGeometry(4,trianglexz);\r
279         setGeometry(5,triangleyz);\r
280         setGeometry(6,trianglexyz);\r
281        \r
282         \r
283         setColor(0,0,colorx);\r
284         setColor(0,1,scolorx);\r
285         setColor(1,0,colory);\r
286         setColor(1,1,scolory);\r
287         setColor(2,0,colorz);\r
288         setColor(2,1,scolorz);\r
289         setColor(3,0,colorxy);\r
290         setColor(3,1,scolorxy);\r
291         setColor(4,0,colorxz);\r
292         setColor(4,1,scolorxz);\r
293         setColor(5,0,coloryz);\r
294         setColor(5,1,scoloryz);\r
295         setColor(6,0,colorxyz);\r
296         setColor(6,1,scolorxyz);\r
297         \r
298 \r
299         AlphaState as = renderer.createAlphaState();   \r
300         as.setBlendEnabled(true);\r
301         as.setSrcFunction(AlphaState.DB_SRC_ALPHA);\r
302         as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
303         as.setEnabled(true);\r
304         getGizmoNode().setRenderState(as);\r
305         MaterialState ms = renderer.createMaterialState();\r
306         ms.setColorMaterial(MaterialState.CM_AMBIENT_AND_DIFFUSE);\r
307         ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);\r
308         getGizmoNode().setRenderState(ms);\r
309         ZBufferState zs = renderer.createZBufferState();\r
310         zs.setFunction(ZBufferState.CF_ALWAYS);\r
311         zs.setEnabled(true);\r
312         zs.setWritable(false);\r
313         getGizmoNode().setRenderState(zs);\r
314     }\r
315 \r
316 }