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
26 public class RotateGizmo extends MultiSelectionGizmo {
\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
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
44 * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix()
\r
46 public String getPickPrefix() {
\r
50 public int getIndexForName(String name) {
\r
51 if (!name.startsWith(PICK_NAME)) {
\r
54 name = name.substring(PICK_NAME.length());
\r
55 if (name.startsWith(X_NAME))
\r
57 if (name.startsWith(Y_NAME))
\r
59 if (name.startsWith(Z_NAME))
\r
61 if (name.startsWith(XYZ_NAME))
\r
68 public int getCount() {
\r
72 public RotateGizmo(Renderer renderer) {
\r
75 float radius2 = 1.8f;
\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
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
98 x2[i] = radius2 * c;
\r
99 y2[i] = radius2 * s;
\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
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
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
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
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
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
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
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
163 for (int i = 0; i < numVertices*2; i++)
\r
164 setColor(cols,i, colorx);
\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
172 setCoordinate(coordinates,numVertices - 1, new Point3f(0.f, 0.f, y[div]));
\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
180 setCoordinate(coordinates,numVertices*2 - 1, new Point3f(0.f, 0.f, y2[div]));
\r
182 TriMesh linex = new TriMesh(PICK_NAME+X_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\r
185 for (int i = 0; i < numVertices*2; i++)
\r
186 setColor(cols,i, colory);
\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
194 setCoordinate(coordinates,numVertices - 1, new Point3f(0.f, 0.f, y[div]));
\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
202 setCoordinate(coordinates,numVertices*2 - 1, new Point3f(0.f, 0.f, y2[div]));
\r
204 TriMesh liney = new TriMesh(PICK_NAME+Y_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\r
207 for (int i = 0; i < numVertices*2; i++)
\r
208 setColor(cols,i, colorz);
\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
216 setCoordinate(coordinates,numVertices - 1, new Point3f(y[div],0.f, 0.f));
\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
224 setCoordinate(coordinates,numVertices*2 - 1, new Point3f(y2[div],0.f, 0.f));
\r
226 TriMesh linez = new TriMesh(PICK_NAME+Z_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\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
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
240 setCoordinate(coordinates,index,new Point3f(y2[1],x2[i],y2[i]));
\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
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
250 for (int i = 0; i < (div-2)*3; i++) {
\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
261 TriMesh trianglexyz = new TriMesh(PICK_NAME+XYZ_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\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
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
276 setGeometry(0,linex);
\r
277 setGeometry(1,liney);
\r
278 setGeometry(2,linez);
\r
279 setGeometry(3,trianglexyz);
\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
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