]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/shape/axisActor.java
a9e507eec597ee9111521a9bef3ed868338e426f
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / shape / axisActor.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012, 2013 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g3d.vtk.shape;\r
13 \r
14 import javax.vecmath.AxisAngle4d;\r
15 import javax.vecmath.Matrix4d;\r
16 import javax.vecmath.Point3d;\r
17 import javax.vecmath.Vector3d;\r
18 \r
19 import org.simantics.g3d.math.MathTools;\r
20 import org.simantics.utils.threads.AWTThread;\r
21 import org.simantics.utils.threads.ThreadUtils;\r
22 \r
23 import vtk.vtkActor;\r
24 import vtk.vtkAssembly;\r
25 import vtk.vtkConeSource;\r
26 import vtk.vtkLineSource;\r
27 import vtk.vtkLinearTransform;\r
28 import vtk.vtkMatrix4x4;\r
29 import vtk.vtkPolyDataMapper;\r
30 import vtk.vtkProp3D;\r
31 import vtk.vtkRenderer;\r
32 import vtk.vtkTextActor;\r
33 import vtk.vtkTubeFilter;\r
34 \r
35 public class axisActor extends vtkAssembly implements IvtkVisualObject{\r
36 \r
37         private vtkRenderer ren;\r
38         private Vector3d axisDir = new Vector3d(1,0,0);\r
39         private vtkTextActor tactor;\r
40         private vtkActor tubeActor;\r
41         private vtkActor coneActor;\r
42         private boolean rendered = false;\r
43 \r
44         public axisActor(vtkRenderer _ren, String label) {\r
45                 super();\r
46                 ren = _ren;\r
47                 createAxis(label);\r
48         }\r
49         \r
50         public axisActor(vtkRenderer _ren, String label, Vector3d dir) {\r
51                 super();\r
52                 ren = _ren;\r
53                 this.axisDir = dir;\r
54                 createAxis(label);\r
55         }\r
56 \r
57         public void createAxis(String label) {\r
58                 vtkLineSource line = new vtkLineSource();\r
59                 line.SetPoint1(0.0,0.0,0.0);\r
60                 line.SetPoint2(axisDir.x,axisDir.y,axisDir.z);\r
61                 \r
62                 tactor = new vtkTextActor();\r
63                 \r
64                 tactor.SetInput(label);\r
65                 \r
66                 tactor.SetTextScaleModeToNone();\r
67                 tactor.GetTextProperty().SetColor(0.0, 0.0, 0.0);\r
68                 tactor.GetTextProperty().ShadowOff();\r
69                 tactor.GetTextProperty().ItalicOff();\r
70                 tactor.GetTextProperty().BoldOff();\r
71                 \r
72                 tactor.GetTextProperty().Delete();\r
73                 \r
74                 tactor.SetMaximumLineHeight(0.25);\r
75                 \r
76                 tactor.SetPickable(0);\r
77                 \r
78                 vtkTubeFilter tube = new vtkTubeFilter();\r
79                 tube.SetInput(line.GetOutput());\r
80                 tube.SetRadius(0.05 * axisDir.length());\r
81                 tube.SetNumberOfSides(8);\r
82 \r
83                 vtkPolyDataMapper tubeMapper = new vtkPolyDataMapper();\r
84                 tubeMapper.SetInput(tube.GetOutput());\r
85 \r
86                 tubeActor = new vtkActor();\r
87                 tubeActor.SetMapper(tubeMapper);\r
88                 tubeActor.PickableOff();\r
89 \r
90                 int coneRes = 12;\r
91                 double coneScale = 0.3 * axisDir.length();\r
92 \r
93                 // --- x-Cone\r
94                 vtkConeSource cone = new vtkConeSource();\r
95                 cone.SetResolution(coneRes);\r
96                 vtkPolyDataMapper coneMapper = new vtkPolyDataMapper();\r
97                 coneMapper.SetInput(cone.GetOutput());\r
98                 coneActor = new vtkActor();\r
99                 coneActor.SetMapper(coneMapper);\r
100                 coneActor.GetProperty().SetColor(1, 0, 0);\r
101                 coneActor.SetScale(coneScale, coneScale, coneScale);\r
102                 coneActor.SetPosition(axisDir.x,axisDir.y,axisDir.z);\r
103                 coneActor.SetPickable(0);\r
104                 \r
105                 AxisAngle4d aa = MathTools.createRotation(new Vector3d(1,0,0), new Vector3d(axisDir));\r
106                 if (aa != null)\r
107                         coneActor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
108                 \r
109                 this.AddPart(tubeActor);\r
110                 this.AddPart(coneActor);\r
111                 \r
112                 tube.GetOutput().Delete();\r
113                 cone.GetOutput().Delete();\r
114                 line.GetOutput().Delete();\r
115                 \r
116                 tubeMapper.Delete();\r
117                 tube.Delete();\r
118                 cone.Delete();\r
119                 line.Delete();\r
120 \r
121                 coneMapper.Delete();\r
122                 \r
123                 coneActor.GetProperty().Delete();\r
124         }\r
125         \r
126         public void addToRenderer() {\r
127                 if (rendered)\r
128                         return;\r
129                 rendered = true;\r
130                 \r
131                 ren.AddActor2D(tactor);\r
132                 \r
133                 ren.AddActor(this);\r
134         }\r
135         \r
136         public void removeFromRenderer() {\r
137                 if (!rendered)\r
138                         return;\r
139                 rendered = false;\r
140                 ren.RemoveActor2D(tactor);\r
141                 ren.RemoveActor(this);\r
142         }\r
143         \r
144         public boolean isRendered() {\r
145                 return rendered;\r
146         }\r
147 \r
148         public void setAxesVisibility(boolean ison) {\r
149                 this.SetVisibility(ison ? 1 : 0);\r
150                 tactor.SetVisibility(ison ? 1 : 0);\r
151         }\r
152         \r
153         public void setLabelVisibility(boolean ison) {\r
154                 tactor.SetVisibility(ison ? 1 : 0);\r
155         }\r
156         \r
157         double mat[] = new double[16];\r
158         Matrix4d m = new Matrix4d();\r
159         Point3d p = new Point3d();\r
160         private void updateTextLoc() {\r
161                 tactor.GetPositionCoordinate().SetCoordinateSystemToWorld();\r
162                 \r
163                 \r
164                 GetMatrix(mat);\r
165                 MathTools.set(m, mat);\r
166                 p.set(axisDir.x, axisDir.y,axisDir.z);\r
167                 m.transform(p);\r
168                 tactor.GetPositionCoordinate().SetValue(p.x, p.y, p.z);\r
169                 \r
170                 tactor.GetPositionCoordinate().Delete();\r
171         }\r
172         \r
173         @Override\r
174         public void SetPickable(int id0) {\r
175                 super.SetPickable(id0);\r
176                 tubeActor.SetPickable(id0);\r
177                 coneActor.SetPickable(id0);\r
178         }\r
179         \r
180         @Override\r
181         public void SetOrientation(double id0, double id1, double id2) {\r
182                 super.SetOrientation(id0, id1, id2);\r
183                 updateTextLoc();\r
184         }\r
185         \r
186         @Override\r
187         public void RotateWXYZ(double id0, double id1, double id2, double id3) {\r
188                 super.RotateWXYZ(id0, id1, id2, id3);\r
189                 updateTextLoc();\r
190         }\r
191         \r
192         @Override\r
193         public void SetPosition(double[] id0) {\r
194                 super.SetPosition(id0);\r
195                 updateTextLoc();\r
196         }\r
197         \r
198         @Override\r
199         public void SetPosition(double id0, double id1, double id2) {\r
200                 super.SetPosition(id0, id1, id2);\r
201                 updateTextLoc();\r
202         }\r
203         \r
204         @Override\r
205         public void SetOrientation(double[] id0) {\r
206                 super.SetOrientation(id0);\r
207                 updateTextLoc();\r
208         }\r
209         \r
210         @Override\r
211         public void SetScale(double id0) {\r
212                 super.SetScale(id0);\r
213                 updateTextLoc();\r
214         }\r
215         \r
216         @Override\r
217         public void SetScale(double id0, double id1, double id2) {\r
218                 super.SetScale(id0, id1, id2);\r
219                 updateTextLoc();\r
220         }\r
221         \r
222         @Override\r
223         public void SetScale(double[] id0) {\r
224                 super.SetScale(id0);\r
225                 updateTextLoc();\r
226         }\r
227         \r
228         public void SetColor(double r, double g, double b) {\r
229                 coneActor.GetProperty().SetColor(r, g, b);\r
230                 tubeActor.GetProperty().SetColor(r, g, b);\r
231                 coneActor.GetProperty().Delete();\r
232                 tubeActor.GetProperty().Delete();\r
233         }\r
234         \r
235         public void SetTextColor(double r, double g, double b) {\r
236                 tactor.GetTextProperty().SetColor(r, g, b);\r
237                 tactor.GetTextProperty().Delete();\r
238         }\r
239         \r
240         @Override\r
241         public void SetUserMatrix(vtkMatrix4x4 id0) {\r
242                 super.SetUserMatrix(id0);\r
243                 updateTextLoc();\r
244         }\r
245         \r
246         @Override\r
247         public void SetUserTransform(vtkLinearTransform id0) {\r
248                 super.SetUserTransform(id0);\r
249                 updateTextLoc();\r
250         }\r
251         \r
252         @Override\r
253         public void Delete() {\r
254                 ren.RemoveActor(tactor);\r
255                 ren.RemoveActor(tubeActor);\r
256                 ren.RemoveActor(coneActor);\r
257                 tactor.Delete();\r
258                 tubeActor.Delete();\r
259                 coneActor.Delete();\r
260                 super.Delete();\r
261         }\r
262 \r
263         public void dispose() {\r
264                 ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {\r
265                         \r
266                         @Override\r
267                         public void run() {\r
268                                 removeFromRenderer();\r
269                                 Delete();\r
270                         }\r
271                 });\r
272         }\r
273         \r
274         @Override\r
275         public vtkProp3D getVtkProp() {\r
276                 return this;\r
277         }\r
278         \r
279 }\r