]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.proconf.g3d/src/org/simantics/proconf/g3d/gizmo/AbstractGizmo.java
51b65af12d96e796f8931021dfe8be8018d72a13
[simantics/3d.git] / org.simantics.proconf.g3d / src / org / simantics / proconf / g3d / gizmo / AbstractGizmo.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 javax.vecmath.AxisAngle4f;\r
14 import javax.vecmath.Color4f;\r
15 import javax.vecmath.Quat4f;\r
16 import javax.vecmath.Tuple3d;\r
17 import javax.vecmath.Tuple3f;\r
18 import javax.vecmath.Vector3d;\r
19 import javax.vecmath.Vector3f;\r
20 \r
21 import org.simantics.proconf.g3d.Activator;\r
22 import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
23 import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
24 import org.simantics.proconf.g3d.preferences.PreferenceConstants;\r
25 \r
26 import com.jme.renderer.Renderer;\r
27 import com.jme.scene.Node;\r
28 \r
29 \r
30 public abstract class AbstractGizmo implements Gizmo{\r
31     \r
32         private Node position;\r
33         private Node rotate;\r
34         private Node scale;\r
35         \r
36     private boolean changed = false;\r
37     \r
38     private double userScale = 1.0;\r
39     \r
40     public AbstractGizmo() {\r
41         createGroups();\r
42     }\r
43     \r
44     public void setChanged(boolean b) {\r
45         changed = b;\r
46     }\r
47     \r
48     public boolean isChanged() {\r
49         return changed;\r
50     }\r
51     \r
52     public double getUserScale() {\r
53         return Activator.getDefault().getPreferenceStore().getDouble(PreferenceConstants.GIZMO_SCALE);\r
54     }\r
55     \r
56     \r
57     public void setScale(float scale) {\r
58         this.scale.setLocalScale(scale);\r
59     }\r
60     \r
61     public void setScale(Vector3f scale) {\r
62         this.scale.setLocalScale(VecmathJmeTools.get(scale));\r
63     }\r
64     \r
65     public Vector3d getPosition() {\r
66        return VecmathJmeTools.getD(position.getWorldTranslation());\r
67     }\r
68     \r
69     public Vector3f getPositionFloat() {\r
70         return VecmathJmeTools.get(position.getWorldTranslation());\r
71     }\r
72     \r
73     public void setPosition(Tuple3d position) {\r
74         this.position.setLocalTranslation(VecmathJmeTools.get(position));\r
75     }\r
76     \r
77     public void setPosition(Vector3f position) {\r
78         this.position.setLocalTranslation(VecmathJmeTools.get(position));\r
79     }\r
80     \r
81     public void setRotation(Quat4f q) {\r
82         rotate.setLocalRotation(VecmathJmeTools.get(q));\r
83     }\r
84     \r
85     public void setRotation(AxisAngle4f q) {\r
86         rotate.setLocalRotation(VecmathJmeTools.get(q));\r
87     }\r
88     \r
89     public Node getNode() {\r
90         userScale = getUserScale();\r
91         return position;\r
92     }\r
93     \r
94     protected Node getGizmoNode() {\r
95         return scale;\r
96     }\r
97     \r
98     private void createGroups() {\r
99 \r
100         position = new Node();\r
101         rotate = new Node();\r
102         scale = new Node();\r
103         position.attachChild(rotate);\r
104         rotate.attachChild(scale);\r
105         position.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
106     }\r
107 \r
108     public void update(Tuple3d position, Tuple3d cameraPosition, JmeRenderingComponent component) {\r
109         setPosition(position);\r
110         com.jme.math.Vector3f p = VecmathJmeTools.get(position);\r
111         p.subtractLocal(VecmathJmeTools.get(cameraPosition));\r
112         rotate.getLocalRotation().inverse().multLocal(p);\r
113         if (component.getProjectionPolicy() == JmeRenderingComponent.PERSPECTIVE_PROJECTION) {\r
114 \r
115             double distance = p.length();\r
116             // (bug caused in Xith->JME translation ?)\r
117             p.negateLocal();\r
118             double fov = component.getFieldOfView();\r
119             float s = (float) (Math.sin(fov) * distance * 0.1); // scaling factor was 0.2 with Xith\r
120             s *= (float)userScale;\r
121             Vector3f scale = new Vector3f(1.f, 1.f, 1.f);\r
122             \r
123             if (p.x > 0.f)\r
124                 scale.x = -1.f;\r
125             if (p.y > 0.f)\r
126                 scale.y = -1.f;\r
127             if (p.z > 0.f)\r
128                 scale.z = -1.f;\r
129             scale.scale(s);\r
130             setScale(scale);\r
131         } else {\r
132             Vector3f scale = new Vector3f(1.f, 1.f, 1.f);\r
133             float s = component.getScreenScale() / 5.f;\r
134             s *= (float)userScale;\r
135             if (p.x > 0.f)\r
136                 scale.x = -1.f;\r
137             if (p.y > 0.f)\r
138                 scale.y = -1.f;\r
139             if (p.z > 0.f)\r
140                 scale.z = -1.f;\r
141             scale.scale(s);\r
142             setScale(scale);\r
143 \r
144         }\r
145     }\r
146 \r
147     public void update(Tuple3d cameraPosition, JmeRenderingComponent component) {\r
148 \r
149         com.jme.math.Vector3f p = VecmathJmeTools.get(getPosition());\r
150         p.subtractLocal(VecmathJmeTools.get(cameraPosition));\r
151         rotate.getLocalRotation().inverse().multLocal(p);\r
152         if (component.getProjectionPolicy() == JmeRenderingComponent.PERSPECTIVE_PROJECTION) {\r
153 \r
154             double distance = p.length();\r
155             double fov = component.getFieldOfView();\r
156             float s = (float)(Math.sin(fov) * distance * 0.1); // scaling factor was 0.2 with Xith\r
157             s *= (float)userScale;\r
158             Vector3f scale = new Vector3f(1.f,1.f,1.f);\r
159             if (p.x > 0.f)\r
160                 scale.x = -1.f;\r
161             if (p.y > 0.f)\r
162                 scale.y = -1.f;\r
163             if (p.z > 0.f)\r
164                 scale.z = -1.f;\r
165             scale.scale(s);\r
166             setScale(scale);\r
167         } else {\r
168             \r
169             Vector3f scale = new Vector3f(1.f,1.f,1.f);\r
170             float s = component.getScreenScale()/5.f;\r
171             s *= (float)userScale;\r
172             if (p.x > 0.f)\r
173                 scale.x = -1.f;\r
174             if (p.y > 0.f)\r
175                 scale.y = -1.f;\r
176             if (p.z > 0.f)\r
177                 scale.z = -1.f;\r
178             scale.scale(s);\r
179             setScale(scale);\r
180             \r
181         }\r
182     }\r
183     \r
184     protected void setCoordinate(float array[], int index, Tuple3f c) {\r
185         index *= 3;\r
186         array[index++] = c.x;\r
187         array[index++] = c.y;\r
188         array[index] = c.z;\r
189     }\r
190     \r
191     protected void setColor(float array[], int index, Color4f c) {\r
192         index *= 4;\r
193         array[index++] = c.x;\r
194         array[index++] = c.y;\r
195         array[index++] = c.z;\r
196         array[index] = c.w;\r
197     }\r
198 }\r