/******************************************************************************* * Copyright (c) 2007- VTT Technical Research Centre of Finland. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.proconf.g3d.gizmo; import javax.vecmath.Color4f; import javax.vecmath.Point3f; import com.jme.bounding.BoundingBox; import com.jme.renderer.Renderer; import com.jme.scene.TriMesh; import com.jme.scene.state.AlphaState; import com.jme.scene.state.MaterialState; import com.jme.scene.state.ZBufferState; import com.jme.util.geom.BufferUtils; public class RotateGizmo extends MultiSelectionGizmo { public static String PICK_NAME = "rotate"; public static String X_NAME = "rx"; public static String Y_NAME = "ry"; public static String Z_NAME = "rz"; public static String XYZ_NAME = "ra"; public static final int X = 0; public static final int Y = 1; public static final int Z = 2; public static final int XYZ = 3; /* (non-Javadoc) * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix() */ public String getPickPrefix() { return PICK_NAME; } public int getIndexForName(String name) { if (!name.startsWith(PICK_NAME)) { return -1; } name = name.substring(PICK_NAME.length()); if (name.startsWith(X_NAME)) return X; if (name.startsWith(Y_NAME)) return Y; if (name.startsWith(Z_NAME)) return Z; if (name.startsWith(XYZ_NAME)) return XYZ; return -1; } @Override public int getCount() { return 4; } public RotateGizmo(Renderer renderer) { super(); float radius = 2.f; float radius2 = 1.8f; int div = 9; float x[] = new float[div+1]; float y[] = new float[div+1]; float x2[] = new float[div+1]; float y2[] = new float[div+1]; x[0] = radius; y[0] = 0.f; x[div] = 0.f; y[div] = radius; x2[0] = radius2; y2[0] = 0.f; x2[div] = 0.f; y2[div] = radius2; for (int i = 1; i < div; i++) { float angle = (float)i/(float)div; angle *= Math.PI * 0.5f; float c = (float)Math.cos(angle); float s = (float)Math.sin(angle); x[i] = radius * c; y[i] = radius * s; x2[i] = radius2 * c; y2[i] = radius2 * s; } Color4f colorx = new Color4f(0.5f,0.f,0.f,0.5f); Color4f colory = new Color4f(0.f,0.5f,0.f,0.5f); Color4f colorz = new Color4f(0.f,0.f,0.5f,0.5f); Color4f scolorx = new Color4f(1.f,0.f,0.f,0.7f); Color4f scolory = new Color4f(0.f,1.f,0.f,0.7f); Color4f scolorz = new Color4f(0.f,0.f,1.f,0.7f); Color4f colorxyz = new Color4f(); colorxyz.x = colorx.x + colory.x + colorz.x; colorxyz.y = colorx.y + colory.y + colorz.y; colorxyz.z = colorx.z +colory.z + colorz.z; colorxyz.w = 0.5f; Color4f scolorxyz = new Color4f(); scolorxyz.x = scolorx.x + scolory.x + scolorz.x; scolorxyz.y = scolorx.y + scolory.y + scolorz.y; scolorxyz.z = scolorx.z + scolory.z + scolorz.z; scolorxyz.w = 0.5f; int numVertices = div*2; float coordinates[] = new float[numVertices*3 + numVertices*3]; float cols[] = new float[numVertices*4*2]; int[] indices = new int[numVertices*3-6+numVertices*3 - 12]; for (int i = 0; i < div; i++) { if (i == 0) { indices[0] = 0; indices[1] = 1; indices[2] = 2; continue; } int vIndex = i * 2 - 1; int index = i * 6 - 3; if (i == div - 1) { indices[index] = vIndex; indices[index+1] = vIndex+1; indices[index+2] = vIndex+2; } else { indices[index] = vIndex; indices[index+1] = vIndex+1; indices[index+2] = vIndex+2; indices[index+3] = vIndex+1; indices[index+4] = vIndex+3; indices[index+5] = vIndex+2; } } for (int i = div+1; i < div * 2 - 1; i++) { int vIndex = i * 2 - 1; int index = i * 6 - 12; indices[index] = vIndex; indices[index+1] = vIndex+1; indices[index+2] = vIndex+2; indices[index+3] = vIndex+1; indices[index+4] = vIndex+3; indices[index+5] = vIndex+2; } for (int i = 0; i < numVertices*2; i++) setColor(cols,i, colorx); setCoordinate(coordinates,0, new Point3f(0.f, x[0], 0.f)); for (int i = 1; i < div; i++) { int index = i * 2 - 1; setCoordinate(coordinates,index,new Point3f(0.f,x[i],y[i])); setCoordinate(coordinates,index+1,new Point3f(y[1],x[i],y[i])); } setCoordinate(coordinates,numVertices - 1, new Point3f(0.f, 0.f, y[div])); setCoordinate(coordinates,numVertices, new Point3f(0.f, x2[0], 0.f)); for (int i = 1; i < div; i++) { int index = (div+i) * 2 - 1; setCoordinate(coordinates,index,new Point3f(y[1],x[i],y[i])); setCoordinate(coordinates,index+1,new Point3f(y2[1],x2[i],y2[i])); } setCoordinate(coordinates,numVertices*2 - 1, new Point3f(0.f, 0.f, y2[div])); TriMesh linex = new TriMesh(PICK_NAME+X_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices)); for (int i = 0; i < numVertices*2; i++) setColor(cols,i, colory); setCoordinate(coordinates,0, new Point3f(x[0], 0.f, 0.f)); for (int i = 1; i < div; i++) { int index = i * 2 - 1; setCoordinate(coordinates,index,new Point3f(x[i],0.f,y[i])); setCoordinate(coordinates,index+1,new Point3f(x[i],y[1],y[i])); } setCoordinate(coordinates,numVertices - 1, new Point3f(0.f, 0.f, y[div])); setCoordinate(coordinates,numVertices, new Point3f(x2[0], 0.f, 0.f)); for (int i = 1; i < div; i++) { int index = (div+i) * 2 - 1; setCoordinate(coordinates,index,new Point3f(x[i],y[1],y[i])); setCoordinate(coordinates,index+1,new Point3f(x2[i],y2[1],y2[i])); } setCoordinate(coordinates,numVertices*2 - 1, new Point3f(0.f, 0.f, y2[div])); TriMesh liney = new TriMesh(PICK_NAME+Y_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices)); for (int i = 0; i < numVertices*2; i++) setColor(cols,i, colorz); setCoordinate(coordinates,0, new Point3f(0.f, x[0], 0.f)); for (int i = 1; i < div; i++) { int index = i * 2 - 1; setCoordinate(coordinates,index,new Point3f(y[i],x[i],0.f)); setCoordinate(coordinates,index+1,new Point3f(y[i],x[i],y[1])); } setCoordinate(coordinates,numVertices - 1, new Point3f(y[div],0.f, 0.f)); setCoordinate(coordinates,numVertices, new Point3f(0.f, x2[0], 0.f)); for (int i = 1; i < div; i++) { int index = (div+i) * 2 - 1; setCoordinate(coordinates,index,new Point3f(y[i],x[i],y[1])); setCoordinate(coordinates,index+1,new Point3f(y2[i],x2[i],y2[1])); } setCoordinate(coordinates,numVertices*2 - 1, new Point3f(y2[div],0.f, 0.f)); TriMesh linez = new TriMesh(PICK_NAME+Z_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices)); numVertices = (div-2)*3+1; coordinates = new float[numVertices*3]; cols = new float[numVertices*4]; indices = new int[(div-2)*3*3]; for (int i = 0; i < numVertices; i++) setColor(cols,i, colorxyz); float center = radius * 0.5f;//(float)Math.cos(Math.PI*0.25); setCoordinate(coordinates,0,new Point3f(center,center,center)); for (int i = 1; i < div; i++) { int index = i; setCoordinate(coordinates,index,new Point3f(y2[1],x2[i],y2[i])); } for (int i = 1; i < div; i++) { int index = i + div-1 - 1; setCoordinate(coordinates,index,new Point3f(y2[i],y2[1],x2[i])); } for (int i = 1; i < div-1; i++) { int index = i + 2*(div-1) -2; setCoordinate(coordinates,index,new Point3f(x2[i],y2[i],y2[1])); } for (int i = 0; i < (div-2)*3; i++) { int index = i*3; int iindex = i+1; indices[index] = 0; indices[index+1] = iindex; indices[index+2] = iindex+1; if (iindex == (numVertices -1)) indices[index+2] = 1; } TriMesh trianglexyz = new TriMesh(PICK_NAME+XYZ_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices)); getGizmoNode().attachChild(linex); getGizmoNode().attachChild(liney); getGizmoNode().attachChild(linez); getGizmoNode().attachChild(trianglexyz); getGizmoNode().setModelBound(new BoundingBox()); getGizmoNode().updateModelBound(); linex.getBatch(0).setCastsShadows(false); liney.getBatch(0).setCastsShadows(false); linez.getBatch(0).setCastsShadows(false); trianglexyz.getBatch(0).setCastsShadows(false); setGeometry(0,linex); setGeometry(1,liney); setGeometry(2,linez); setGeometry(3,trianglexyz); setColor(0,0,colorx); setColor(0,1,scolorx); setColor(1,0,colory); setColor(1,1,scolory); setColor(2,0,colorz); setColor(2,1,scolorz); setColor(3,0,colorxyz); setColor(3,1,scolorxyz); AlphaState as = renderer.createAlphaState(); as.setBlendEnabled(true); as.setSrcFunction(AlphaState.DB_SRC_ALPHA); as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA); as.setEnabled(true); getGizmoNode().setRenderState(as); MaterialState ms = renderer.createMaterialState(); ms.setColorMaterial(MaterialState.CM_AMBIENT_AND_DIFFUSE); ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK); getGizmoNode().setRenderState(ms); ZBufferState zs = renderer.createZBufferState(); zs.setFunction(ZBufferState.CF_ALWAYS); zs.setEnabled(true); getGizmoNode().setRenderState(zs); } }