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 java.nio.FloatBuffer;
\r
15 import javax.vecmath.Color4f;
\r
16 import javax.vecmath.Point3f;
\r
17 import javax.vecmath.Vector3f;
\r
19 import org.simantics.proconf.g3d.base.VecmathJmeTools;
\r
21 import com.jme.bounding.BoundingBox;
\r
22 import com.jme.renderer.ColorRGBA;
\r
23 import com.jme.renderer.Renderer;
\r
24 import com.jme.scene.TriMesh;
\r
25 import com.jme.scene.state.AlphaState;
\r
26 import com.jme.scene.state.MaterialState;
\r
27 import com.jme.scene.state.ZBufferState;
\r
28 import com.jme.util.geom.BufferUtils;
\r
31 public class TransformInlineGizmo extends AbstractGizmo {
\r
33 TriMesh geom = new TriMesh();
\r
34 ColorRGBA colors[] = new ColorRGBA[2];
\r
37 public static String PICK_NAME = "translate";
\r
38 public static String X_NAME = "ax";
\r
40 public static final int X = 0;
\r
42 public static final int SELECTED = 1;
\r
43 public static final int UNSELECTED = 0;
\r
45 private boolean selected = false;
\r
49 * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix()
\r
51 public String getPickPrefix() {
\r
55 public int getIndexForName(String name) {
\r
56 if (!name.startsWith(PICK_NAME)) {
\r
59 name = name.substring(PICK_NAME.length());
\r
60 if (name.startsWith(X_NAME))
\r
65 private void updateColor(int sel) {
\r
66 FloatBuffer buff = geom.getColorBuffer(0);
\r
67 for (int i = 0; i < geom.getBatch(0).getVertexCount(); i++) {
\r
68 BufferUtils.setInBuffer(colors[sel], buff, i);
\r
73 * @see fi.vtt.proconf.shapeeditor.common.Gizmo#changeSelected(java.lang.String)
\r
75 public void setSelected(String name) {
\r
79 updateColor(UNSELECTED);
\r
83 int index = getIndexForName(name);
\r
90 updateColor(SELECTED);
\r
96 public void setScale(Vector3f scale) {
\r
99 * Negative scaling breaks picking (ray hits the bounding box, but ray doesn't intersect any triangles)
\r
101 scale.x = Math.abs(scale.x);
\r
102 scale.y = Math.abs(scale.y);
\r
103 scale.z = Math.abs(scale.z);
\r
105 super.setScale(scale);
\r
110 public TransformInlineGizmo(){
\r
112 public TransformInlineGizmo(Renderer renderer) {
\r
115 float sizeD2 = 1.f;
\r
116 float offset = 0.07f;
\r
118 Color4f colorx = new Color4f(0.5f,0.f,0.f,0.5f);
\r
119 Color4f scolorx = new Color4f(1.f,0.f,0.f,0.7f);
\r
122 float coordinates[] = new float[18*3];
\r
123 float cols[] = new float[18*4];
\r
124 int[] indices = new int[]{0,2,1,
\r
155 for (int i = 0; i < 18; i++)
\r
156 setColor(cols,i, colorx);
\r
158 setCoordinate(coordinates,0, new Point3f(size, 0.f, 0.f));
\r
159 setCoordinate(coordinates,1, new Point3f(size - offset*2, offset, offset));
\r
160 setCoordinate(coordinates,2, new Point3f(size - offset*2, offset, -offset));
\r
161 setCoordinate(coordinates,3, new Point3f(size - offset*2, -offset, -offset));
\r
162 setCoordinate(coordinates,4, new Point3f(size - offset*2, -offset, offset));
\r
163 setCoordinate(coordinates,5, new Point3f(sizeD2, offset, offset));
\r
164 setCoordinate(coordinates,6, new Point3f(sizeD2, offset, -offset));
\r
165 setCoordinate(coordinates,7, new Point3f(sizeD2, -offset, -offset));
\r
166 setCoordinate(coordinates,8, new Point3f(sizeD2, -offset, offset));
\r
168 setCoordinate(coordinates,9, new Point3f(-size, 0.f, 0.f));
\r
169 setCoordinate(coordinates,10, new Point3f(-size + offset*2, offset, offset));
\r
170 setCoordinate(coordinates,11, new Point3f(-size + offset*2, offset, -offset));
\r
171 setCoordinate(coordinates,12, new Point3f(-size + offset*2, -offset, -offset));
\r
172 setCoordinate(coordinates,13, new Point3f(-size + offset*2, -offset, offset));
\r
173 setCoordinate(coordinates,14, new Point3f(-sizeD2, offset, offset));
\r
174 setCoordinate(coordinates,15, new Point3f(-sizeD2, offset, -offset));
\r
175 setCoordinate(coordinates,16, new Point3f(-sizeD2, -offset, -offset));
\r
176 setCoordinate(coordinates,17, new Point3f(-sizeD2, -offset, offset));
\r
178 TriMesh linex = new TriMesh(PICK_NAME+X_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));
\r
180 getGizmoNode().attachChild(linex);
\r
181 getGizmoNode().setModelBound(new BoundingBox());
\r
182 getGizmoNode().updateModelBound();
\r
185 geom.getBatch(0).setCastsShadows(false);
\r
187 colors[0] = VecmathJmeTools.get(colorx);
\r
188 colors[1] = VecmathJmeTools.get(scolorx);
\r
190 AlphaState as = renderer.createAlphaState();
\r
191 as.setBlendEnabled(true);
\r
192 as.setSrcFunction(AlphaState.DB_SRC_ALPHA);
\r
193 as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);
\r
194 as.setEnabled(true);
\r
195 getGizmoNode().setRenderState(as);
\r
196 MaterialState ms = renderer.createMaterialState();
\r
197 ms.setColorMaterial(MaterialState.CM_AMBIENT_AND_DIFFUSE);
\r
198 ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);
\r
199 getGizmoNode().setRenderState(ms);
\r
200 ZBufferState zs = renderer.createZBufferState();
\r
201 zs.setFunction(ZBufferState.CF_ALWAYS);
\r
202 zs.setEnabled(true);
\r
203 getGizmoNode().setRenderState(zs);
\r
208 public boolean isSelected() {
\r
212 public void setSelected(boolean selected) {
\r
213 this.selected = selected;
\r