]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/src/org/simantics/proconf/g3d/gizmo/TransformInlineGizmo.java
git-svn-id: https://www.simantics.org/svn/simantics/3d/trunk@22280 ac1ea38d-2e2b...
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / proconf / g3d / gizmo / TransformInlineGizmo.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007- VTT Technical Research Centre of Finland.\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 java.nio.FloatBuffer;\r
14 \r
15 import javax.vecmath.Color4f;\r
16 import javax.vecmath.Point3f;\r
17 import javax.vecmath.Vector3f;\r
18 \r
19 import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
20 \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
29 \r
30 \r
31 public class TransformInlineGizmo extends AbstractGizmo {\r
32 \r
33         TriMesh geom = new TriMesh();\r
34         ColorRGBA colors[] = new ColorRGBA[2];\r
35    \r
36     \r
37     public static String PICK_NAME = "translate";\r
38     public static String X_NAME = "ax";\r
39     \r
40     public static final int X = 0;\r
41     \r
42     public static final int SELECTED = 1;\r
43     public static final int UNSELECTED = 0;\r
44       \r
45     private boolean selected = false;\r
46     \r
47     \r
48     /* (non-Javadoc)\r
49      * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix()\r
50      */\r
51     public String getPickPrefix() {\r
52         return PICK_NAME;\r
53     }\r
54     \r
55     public int getIndexForName(String name) {\r
56         if (!name.startsWith(PICK_NAME)) {\r
57             return -1;\r
58         }\r
59         name = name.substring(PICK_NAME.length());\r
60         if (name.startsWith(X_NAME))\r
61             return X;\r
62         return -1;\r
63     }\r
64     \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
69         }\r
70     }\r
71     \r
72     /* (non-Javadoc)\r
73      * @see fi.vtt.proconf.shapeeditor.common.Gizmo#changeSelected(java.lang.String)\r
74      */\r
75     public void setSelected(String name) {\r
76         \r
77         if (name == null) {\r
78                 setChanged(true);\r
79             updateColor(UNSELECTED);\r
80             selected = false;\r
81             return;\r
82         }\r
83         int index = getIndexForName(name);\r
84         if (index == -1) {\r
85             selected = false;\r
86             return;\r
87         }\r
88 \r
89         selected = true;\r
90         updateColor(SELECTED);\r
91         setChanged(true);\r
92         \r
93     }\r
94     \r
95     @Override\r
96     public void setScale(Vector3f scale) {\r
97         /**\r
98          * A bug in JME (?)\r
99          * Negative scaling breaks picking (ray hits the bounding box, but ray doesn't intersect any triangles) \r
100          */\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
104         \r
105         super.setScale(scale);\r
106     }\r
107     \r
108     \r
109     /*\r
110      public TransformInlineGizmo(){\r
111      */\r
112     public TransformInlineGizmo(Renderer renderer) {\r
113         super();\r
114         float size = 2.f;\r
115         float sizeD2 = 1.f;\r
116         float offset = 0.07f;\r
117         \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
120         \r
121 \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
125                                   0,3,2,\r
126                                   0,4,3,\r
127                                   0,1,4,\r
128                                   1,2,6,\r
129                                   1,6,5,\r
130                                   2,3,7,\r
131                                   2,7,6,\r
132                                   3,4,8,\r
133                                   3,8,7,\r
134                                   4,1,5,\r
135                                   4,5,8,\r
136                                   5,6,7,\r
137                                   5,7,8,\r
138                                   \r
139                                   9,11,10,\r
140                                   9,12,11,\r
141                                   9,13,12,\r
142                                   9,10,13,\r
143                                   10,11,15,\r
144                                   10,15,14,\r
145                                   11,12,16,\r
146                                   11,16,15,\r
147                                   12,13,17,\r
148                                   12,17,16,\r
149                                   13,10,14,\r
150                                   13,14,17,\r
151                                   14,15,16,\r
152                                   14,16,17\r
153                                   \r
154                                                           };\r
155         for (int i = 0; i < 18; i++)\r
156           setColor(cols,i, colorx);\r
157 \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
167         \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
177 \r
178         TriMesh linex = new TriMesh(PICK_NAME+X_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
179         \r
180         getGizmoNode().attachChild(linex);\r
181         getGizmoNode().setModelBound(new BoundingBox());\r
182         getGizmoNode().updateModelBound();\r
183 \r
184         geom = linex;\r
185         geom.getBatch(0).setCastsShadows(false);\r
186 \r
187         colors[0] = VecmathJmeTools.get(colorx);\r
188         colors[1] = VecmathJmeTools.get(scolorx);\r
189         \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
204         \r
205     }\r
206     \r
207 \r
208     public boolean isSelected() {\r
209         return selected;\r
210     }\r
211 \r
212     public void setSelected(boolean selected) {\r
213         this.selected = selected;\r
214     }\r
215 }