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