]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/utils/vtkEffect.java
0d00c2a919509c412070bcbb35ccc9c9135dbe2e
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / utils / vtkEffect.java
1 package org.simantics.g3d.vtk.utils;\r
2 \r
3 import javax.vecmath.AxisAngle4d;\r
4 import javax.vecmath.Vector3d;\r
5 \r
6 import org.simantics.g3d.math.MathTools;\r
7 import org.simantics.g3d.vtk.shape.IvtkVisualObject;\r
8 \r
9 import vtk.vtkActor;\r
10 import vtk.vtkCamera;\r
11 import vtk.vtkContourFilter;\r
12 import vtk.vtkDataObject;\r
13 import vtk.vtkOutlineFilter;\r
14 import vtk.vtkOutlineSource;\r
15 import vtk.vtkPolyData;\r
16 import vtk.vtkPolyDataMapper;\r
17 import vtk.vtkPolyDataSilhouette;\r
18 import vtk.vtkProp3D;\r
19 import vtk.vtkRenderWindow;\r
20 import vtk.vtkRenderer;\r
21 import vtk.vtkTransform;\r
22 import vtk.vtkTransformPolyDataFilter;\r
23 import vtk.vtkWindowToImageFilter;\r
24 \r
25 public class vtkEffect {\r
26 \r
27         private static vtkRenderer tmpRenderer;\r
28         \r
29         public static vtkRenderer getRenderer() {\r
30                 if (tmpRenderer == null)\r
31                         tmpRenderer = new vtkRenderer();\r
32                 return tmpRenderer;\r
33         }\r
34         public static vtkActor createContour(vtkProp3D tmpProp) {\r
35                 \r
36                 vtkRenderer tmpRenderer = getRenderer();\r
37                 tmpRenderer.SetBackground(1,1,1);\r
38                 \r
39                 \r
40                 if (tmpProp instanceof IvtkVisualObject) {\r
41                         ((IvtkVisualObject)tmpProp).addToRenderer();\r
42                 } else {\r
43                         tmpRenderer.AddActor(tmpProp);\r
44                 }\r
45                 \r
46                 if (tmpProp instanceof vtkActor) {\r
47                         ((vtkActor)tmpProp).GetProperty().SetColor(0, 0, 0);\r
48                 }\r
49                 \r
50                 \r
51                 double bounds_data[] = tmpProp.GetBounds();\r
52                 double center_data[] = tmpProp.GetCenter();\r
53                 \r
54                 tmpRenderer.ResetCamera();\r
55                 tmpRenderer.GetActiveCamera().SetParallelProjection(1);\r
56                 \r
57                 vtkRenderWindow tmpRenderWindow = new vtkRenderWindow();\r
58                 tmpRenderWindow.SetOffScreenRendering(1);\r
59                 tmpRenderWindow.AddRenderer(tmpRenderer);\r
60                 tmpRenderWindow.Render();\r
61                 \r
62                 vtkWindowToImageFilter windowToImageFilter = new vtkWindowToImageFilter();\r
63                 windowToImageFilter.SetInput(tmpRenderWindow);\r
64                 windowToImageFilter.SetMagnification(2);\r
65                 windowToImageFilter.Update();\r
66                 \r
67                 vtkContourFilter contourFilter = new vtkContourFilter();\r
68                 contourFilter.SetInputConnection(windowToImageFilter.GetOutputPort());\r
69                 \r
70                 contourFilter.SetValue(0, 255);\r
71                 contourFilter.Update();\r
72                 \r
73                 vtkPolyData contour = contourFilter.GetOutput();\r
74                 \r
75                 double bounds_contour[] = new double[6]; \r
76                 double center_contour[] = new double[3];\r
77                 double trans_x=0., trans_y=0., trans_z=0., ratio_x=0., ratio_y=0.;\r
78                 contour.GetBounds(bounds_contour);\r
79          \r
80                 ratio_x = (bounds_data[1]-bounds_data[0])/(bounds_contour[1]-bounds_contour[0]);\r
81                 ratio_y = (bounds_data[3]-bounds_data[2])/(bounds_contour[3]-bounds_contour[2]);\r
82                 \r
83                 vtkTransform transform1 = new vtkTransform();\r
84                 transform1.Scale(ratio_x,ratio_y,1);\r
85                 \r
86                 vtkTransformPolyDataFilter tFilter1 = new vtkTransformPolyDataFilter();\r
87                 tFilter1.SetInput(contour);\r
88                 tFilter1.SetTransform(transform1);\r
89                 tFilter1.Update();\r
90                 \r
91                 contour = tFilter1.GetOutput();\r
92                 \r
93                 contour.GetCenter(center_contour);\r
94                 trans_x = center_data[0]-center_contour[0];\r
95                 trans_y = center_data[1]-center_contour[1];\r
96                 trans_z = center_data[2]-center_contour[2];\r
97 \r
98                 vtkTransform transform2 = new vtkTransform();\r
99                 transform2.Translate( trans_x, trans_y, trans_z);\r
100                 \r
101                 vtkTransformPolyDataFilter tFilter2 = new vtkTransformPolyDataFilter();\r
102                 tFilter2.SetInput(contour);\r
103                 tFilter2.SetTransform(transform2);\r
104                 tFilter2.Update();\r
105                 \r
106                 contour = tFilter2.GetOutput();\r
107                 \r
108                 vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
109                 mapper.SetInput(contour);\r
110                 \r
111                  \r
112                 vtkActor actor =new vtkActor();\r
113                 actor.SetMapper(mapper);\r
114                 actor.GetProperty().SetLineWidth(2.);\r
115                 \r
116                 tmpRenderer.RemoveActor(tmpProp);\r
117                 \r
118                 tFilter1.Delete();\r
119                 tFilter2.Delete();\r
120                 contour.Delete();\r
121                 contourFilter.Delete();\r
122                 mapper.Delete();\r
123                 tmpRenderWindow.Delete();\r
124                 transform1.Delete();\r
125                 transform2.Delete();\r
126                 windowToImageFilter.Delete();\r
127                 \r
128                 return actor;\r
129         }\r
130         \r
131         public static vtkActor createContour(vtkProp3D tmpProp, vtkRenderer ren) {\r
132                 \r
133                 vtkRenderer tmpRenderer = getRenderer();\r
134                 tmpRenderer.SetBackground(1,1,1);\r
135                 \r
136                 \r
137                 if (tmpProp instanceof IvtkVisualObject) {\r
138                         ((IvtkVisualObject)tmpProp).addToRenderer();\r
139                 } else {\r
140                         tmpRenderer.AddActor(tmpProp);\r
141                 }\r
142                 \r
143                 if (tmpProp instanceof vtkActor) {\r
144                         ((vtkActor)tmpProp).GetProperty().SetColor(0, 0, 0);\r
145                 }\r
146                 \r
147                 \r
148                 //double bounds_data[] = tmpProp.GetBounds();\r
149                 double center_data[] = tmpProp.GetCenter();\r
150                 \r
151                 tmpRenderer.ResetCamera();\r
152                 \r
153                 vtkCamera camera = ren.GetActiveCamera();\r
154                 \r
155                 vtkCamera tmpCamera = tmpRenderer.GetActiveCamera(); \r
156                 tmpCamera.SetParallelProjection(camera.GetParallelProjection());\r
157                 \r
158                 \r
159                 Vector3d pos = new Vector3d(camera.GetPosition());\r
160                 Vector3d foc = new Vector3d(camera.GetFocalPoint());\r
161                 Vector3d dir = new Vector3d();\r
162                 dir.sub(pos,foc);\r
163                 double l = dir.length();\r
164 //              dir.scale(1.0/l);\r
165 //              \r
166 //              \r
167 //\r
168 //              \r
169 //              dir.scale(2.0);\r
170 //              Vector3d tmpFoc = new Vector3d(tmpCamera.GetFocalPoint());\r
171 //              tmpFoc.add(dir);\r
172 //              tmpCamera.SetPosition(tmpFoc.x,tmpFoc.y,tmpFoc.z);\r
173 //              tmpCamera.SetRoll(camera.GetRoll());\r
174                 \r
175                 tmpCamera.DeepCopy(camera);\r
176                 //tmpCamera.SetModelTransformMatrix(camera.GetModelTransformMatrix());\r
177                 tmpCamera.UpdateViewport(tmpRenderer);\r
178                 \r
179                 vtkRenderWindow tmpRenderWindow = new vtkRenderWindow();\r
180                 tmpRenderWindow.SetOffScreenRendering(1);\r
181                 tmpRenderWindow.AddRenderer(tmpRenderer);\r
182                 tmpRenderWindow.Render();\r
183                 \r
184                 vtkWindowToImageFilter windowToImageFilter = new vtkWindowToImageFilter();\r
185                 windowToImageFilter.SetInput(tmpRenderWindow);\r
186                 windowToImageFilter.SetMagnification(2);\r
187                 windowToImageFilter.Update();\r
188                 \r
189                 vtkContourFilter contourFilter = new vtkContourFilter();\r
190                 contourFilter.SetInputConnection(windowToImageFilter.GetOutputPort());\r
191                 \r
192                 contourFilter.SetValue(0, 255);\r
193                 contourFilter.Update();\r
194                 \r
195                 vtkPolyData contour = contourFilter.GetOutput();\r
196                 \r
197                 \r
198                 double or[] = camera.GetOrientationWXYZ();\r
199                 AxisAngle4d aa = new AxisAngle4d();\r
200                 aa.angle = -MathTools.degToRad(or[0]);\r
201                 aa.x = or[1];\r
202                 aa.y = or[2];\r
203                 aa.z = or[3];\r
204                 \r
205                 vtkTransform transform0 = new vtkTransform();\r
206                 transform0.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
207                 \r
208                 vtkTransformPolyDataFilter tFilter0 = new vtkTransformPolyDataFilter();\r
209                 tFilter0.SetInput(contour);\r
210                 tFilter0.SetTransform(transform0);\r
211                 tFilter0.Update();\r
212                 \r
213                 contour.Delete();\r
214                 contour = tFilter0.GetOutput();\r
215                 \r
216                 double bounds_contour[] = new double[6]; \r
217                 \r
218                 double trans_x=0., trans_y=0., trans_z=0., ratio_x=0.002, ratio_y=0.002, ratio_z=0.002;\r
219                 contour.GetBounds(bounds_contour);\r
220 //       \r
221 //              ratio_x = (bounds_data[1]-bounds_data[0])/(bounds_contour[1]-bounds_contour[0]);\r
222 //              ratio_y = (bounds_data[3]-bounds_data[2])/(bounds_contour[3]-bounds_contour[2]);\r
223 //              ratio_z = (bounds_data[5]-bounds_data[4])/(bounds_contour[5]-bounds_contour[4]);\r
224                 ratio_x = l*0.0008;\r
225                 ratio_y = l*0.0008;\r
226                 ratio_z = l*0.0008;\r
227                 \r
228                 \r
229                 System.out.println(ratio_x + " " + ratio_y);\r
230                 \r
231                 \r
232 //              \r
233                 vtkTransform transform1 = new vtkTransform();\r
234                 transform1.Scale(ratio_x,ratio_y,ratio_z);\r
235                 \r
236                 vtkTransformPolyDataFilter tFilter1 = new vtkTransformPolyDataFilter();\r
237                 tFilter1.SetInput(contour);\r
238                 tFilter1.SetTransform(transform1);\r
239                 tFilter1.Update();\r
240                 \r
241                 contour.Delete();\r
242                 contour = tFilter1.GetOutput();\r
243                 \r
244                 double center_contour[] = new double[3];\r
245                 contour.GetCenter(center_contour);\r
246                 trans_x = center_data[0]-center_contour[0];\r
247                 trans_y = center_data[1]-center_contour[1];\r
248                 trans_z = center_data[2]-center_contour[2];\r
249 //              \r
250                 System.out.println(trans_x + " " + trans_y + " " + trans_z);\r
251 //\r
252                 vtkTransform transform2 = new vtkTransform();\r
253                 transform2.Translate( trans_x, trans_y, trans_z);\r
254                 \r
255                 vtkTransformPolyDataFilter tFilter2 = new vtkTransformPolyDataFilter();\r
256                 tFilter2.SetInput(contour);\r
257                 tFilter2.SetTransform(transform2);\r
258                 tFilter2.Update();\r
259                 \r
260                 contour.Delete();\r
261                 contour = tFilter2.GetOutput();\r
262                 \r
263                 vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
264                 mapper.SetInput(contour);\r
265                 \r
266                  \r
267                 vtkActor actor =new vtkActor();\r
268                 actor.SetMapper(mapper);\r
269                 actor.GetProperty().SetLineWidth(2.);\r
270                 actor.GetProperty().SetColor(0,0,1);\r
271                 actor.GetProperty().Delete();\r
272                 \r
273                 tmpRenderer.RemoveActor(tmpProp);\r
274                 \r
275                 tFilter0.Delete();\r
276                 tFilter1.Delete();\r
277                 tFilter2.Delete();\r
278                 contour.Delete();\r
279                 contourFilter.Delete();\r
280                 mapper.Delete();\r
281                 tmpRenderWindow.Delete();\r
282                 transform0.Delete();\r
283                 transform1.Delete();\r
284                 transform2.Delete();\r
285                 windowToImageFilter.GetOutputPort().Delete();\r
286                 windowToImageFilter.Delete();\r
287                 \r
288                 ren.AddActor(actor);\r
289                 \r
290 //              vtkMatrix4x4 m = camera.GetModelTransformMatrix();\r
291 //              m.Invert();\r
292 //              actor.SetUserMatrix(m);\r
293                 //m.Delete();\r
294                 //actor.SetPosition(trans_x,trans_y, trans_z);\r
295                 //actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
296                 //\r
297                 return actor;\r
298         }\r
299         \r
300         public static vtkActor createSilhouette(vtkRenderer ren, vtkDataObject data) {\r
301                 \r
302                 \r
303                 vtkPolyDataSilhouette silhouette = new vtkPolyDataSilhouette();\r
304                 \r
305                 silhouette.SetInput(data);\r
306                 silhouette.SetCamera(ren.GetActiveCamera());\r
307                 silhouette.SetEnableFeatureAngle(0);\r
308                 vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
309                 \r
310                 mapper.SetInputConnection(silhouette.GetOutputPort());\r
311                 \r
312                 vtkActor actor = new vtkActor();\r
313                 actor.SetMapper(mapper);\r
314                 \r
315                 silhouette.GetOutputPort().Delete();\r
316                 silhouette.Delete();\r
317                 mapper.Delete();\r
318                 \r
319                 return actor;\r
320         }\r
321         \r
322         public static vtkActor createOutline(vtkDataObject data) {\r
323                 vtkOutlineFilter filter = new vtkOutlineFilter();\r
324                 filter.SetInput(data);\r
325                 vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
326                 mapper.SetInputConnection(filter.GetOutputPort());\r
327                 \r
328                 vtkActor actor = new vtkActor();\r
329                 actor.SetMapper(mapper);\r
330                 \r
331                 filter.GetOutputPort().Delete();\r
332                 filter.Delete();\r
333                 mapper.Delete();\r
334                 \r
335                 return actor;\r
336         }\r
337         \r
338         public static vtkActor createOutline(vtkProp3D prop) {\r
339 \r
340                 double bounds[] = prop.GetBounds();\r
341 \r
342                 vtkOutlineSource source = new vtkOutlineSource();\r
343                 source.SetBounds(bounds);\r
344                 \r
345                 vtkOutlineFilter filter = new vtkOutlineFilter();\r
346                 filter.SetInput(source.GetOutput());\r
347                 vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
348                 mapper.SetInputConnection(filter.GetOutputPort());\r
349                 \r
350                 vtkActor actor = new vtkActor();\r
351                 actor.SetMapper(mapper);\r
352                 \r
353                 source.GetOutput().Delete();\r
354                 source.Delete();\r
355                 filter.GetOutputPort().Delete();\r
356                 filter.Delete();\r
357                 mapper.Delete();\r
358                 \r
359                 actor.SetPickable(0);\r
360                 return actor;\r
361         }\r
362 }\r