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
9 * VTT Technical Research Centre of Finland - initial API and implementation
\r
10 *******************************************************************************/
\r
11 package org.simantics.proconf.g3d.gizmo;
\r
13 import javax.vecmath.Color4f;
\r
14 import javax.vecmath.Point3f;
\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
25 public class TransformGizmo extends MultiSelectionGizmo {
\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
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
48 * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix()
\r
50 public String getPickPrefix() {
\r
54 public int getIndexForName(String name) {
\r
55 if (!name.startsWith(PICK_NAME)) {
\r
58 name = name.substring(PICK_NAME.length());
\r
59 if (name.startsWith(X_NAME))
\r
61 if (name.startsWith(Y_NAME))
\r
63 if (name.startsWith(Z_NAME))
\r
65 if (name.startsWith(XY_NAME))
\r
67 if (name.startsWith(XZ_NAME))
\r
69 if (name.startsWith(YZ_NAME))
\r
71 if (name.startsWith(XYZ_NAME))
\r
77 public int getCount() {
\r
83 public TransformGizmo() {
\r
85 public TransformGizmo(Renderer renderer) {
\r
89 float offset = 0.2f;
\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
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
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
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
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
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
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
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
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
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
153 for (int i = 0; i < 6; i++)
\r
154 setColor(cols,i, colorx);
\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
163 TriMesh linex = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\r
165 for (int i = 0; i < 6; i++)
\r
166 setColor(cols,i, colory);
\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
175 TriMesh liney = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\r
177 for (int i = 0; i < 6; i++)
\r
178 setColor(cols,i, colorz);
\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
187 TriMesh linez = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\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
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
201 TriMesh trianglexz = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\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
210 TriMesh trianglexy = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\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
219 TriMesh triangleyz = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\r
221 indices = new int[]{0,1,2,
\r
230 coordinates = new float[10*3];
\r
231 cols = new float[10*4];
\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
246 TriMesh trianglexyz = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\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
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
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
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
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
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