]> gerrit.simantics Code Review - simantics/3d.git/blob - vtk/src/vtk/vtkPanel.java
6747f92417dd5f1c2abd6c82d1cb3331fcd83180
[simantics/3d.git] / vtk / src / vtk / vtkPanel.java
1 package vtk;
2
3 import java.awt.Canvas;
4 import java.awt.Graphics;
5 import java.awt.event.InputEvent;
6 import java.awt.event.KeyEvent;
7 import java.awt.event.KeyListener;
8 import java.awt.event.MouseEvent;
9 import java.awt.event.MouseListener;
10 import java.awt.event.MouseMotionListener;
11 import java.awt.event.MouseWheelEvent;
12 import java.awt.event.MouseWheelListener;
13
14 import javax.swing.SwingUtilities;
15
16 /**
17  * Java AWT component that encapsulate vtkRenderWindow, vtkRenderer, vtkCamera,
18  * vtkLight.
19  *
20  * If a vtkInteractor is needed, use vtkCanvas instead. This is necessary when
21  * Widget and Picker are used.
22  *
23  * @author Kitware
24  */
25 public class vtkPanel extends Canvas implements MouseListener, MouseMotionListener, MouseWheelListener, KeyListener {
26   private static final long serialVersionUID = 1L;
27   protected vtkRenderWindow rw = new vtkRenderWindow();
28   protected vtkRenderer ren = new vtkRenderer();
29   protected vtkCamera cam = null;
30   protected vtkLight lgt = new vtkLight();
31   protected int lastX;
32   protected int lastY;
33   protected int windowset = 0;
34   protected int lightingset = 0;
35   protected int LightFollowCamera = 1;
36   protected int InteractionMode = 1;
37   protected boolean rendering = false;
38   
39   static String[] libs = new String[] {
40                   "vtksys",
41                   "vtkCommonCore",
42               "vtkWrappingJava",
43               "vtkCommonCoreJava",
44               "vtkCommonMath",
45               "vtkCommonMathJava",
46               "vtkCommonSystem",
47               "vtkCommonSystemJava",
48               "vtkCommonMisc",
49               "vtkCommonMiscJava",
50               "vtkCommonTransforms",
51               "vtkCommonTransformsJava",
52               "vtkCommonDataModel",
53               "vtkCommonDataModelJava",
54               "vtkCommonColor",
55               "vtkCommonColorJava",
56               "vtkCommonExecutionModel",
57               "vtkCommonExecutionModelJava",
58               "vtkCommonComputationalGeometry",
59               "vtkCommonComputationalGeometryJava",
60               "vtkexpat",
61               "vtkdoubleconversion",
62               "vtkjpeg",
63               "vtkzlib",
64               "vtklz4",
65               "vtklzma",
66               "vtktiff",
67               "vtkpng",
68               "vtkexpat",
69               "vtkhdf5",
70               "vtkhdf5_hl",
71               "vtkmetaio",
72               "vtkpugixml",
73               "vtksqlite",
74               "vtkogg",
75               "vtktheora",
76               "vtkverdict",
77               "vtkglew",
78               "vtkproj",
79               "vtkfreetype",
80               
81               "vtkImagingCore",
82               "vtkImagingCoreJava",
83               "vtkImagingMath",
84               "vtkImagingMathJava",
85               "vtkImagingFourier",
86               "vtkImagingFourierJava",
87               "vtkImagingSources",
88               "vtkImagingSourcesJava",
89               "vtkImagingHybrid",
90               "vtkImagingHybridJava",
91               "vtkImagingColor",
92               "vtkImagingColorJava",
93               "vtkImagingGeneral",
94               "vtkImagingGeneralJava",
95               
96               "vtkFiltersCore",
97               "vtkFiltersCoreJava",
98               "vtkFiltersGeometry",
99               "vtkFiltersGeometryJava",
100               "vtkFiltersGeneral",
101               "vtkFiltersGeneralJava",
102               "vtkFiltersSources",
103               "vtkFiltersSourcesJava",
104               "vtkFiltersGeneric",
105               "vtkFiltersGenericJava",
106               "vtkFiltersStatistics",
107               "vtkFiltersStatisticsJava",
108               "vtkFiltersExtraction",
109               "vtkFiltersExtractionJava",
110               "vtkFiltersModeling",
111               "vtkFiltersModelingJava",
112               
113               "vtkRenderingCore",
114               "vtkRenderingCoreJava",
115               "vtkRenderingOpenGL2",
116               "vtkRenderingOpenGL2Java",
117               "vtkRenderingVolume",
118               "vtkRenderingVolumeJava",
119               "vtkRenderingVolumeOpenGL2",
120               "vtkRenderingVolumeOpenGL2Java",
121               
122               "vtkRenderingFreeType",
123               "vtkRenderingFreeTypeJava",
124               "vtkRenderingAnnotation",
125               "vtkRenderingAnnotationJava",
126               
127               "vtkFiltersHybrid",
128               "vtkFiltersHybridJava",
129               
130               "vtkInteractionStyle",
131               "vtkInteractionStyleJava",
132               "vtkInteractionWidgets",
133               "vtkInteractionWidgetsJava",
134               "vtkInteractionImage",
135               "vtkInteractionImageJava",
136               
137               };
138   
139   
140   static {
141           for (String lib : libs)
142                   System.loadLibrary(lib);
143   }
144
145   // Allow access to display lock() and unlock().
146   // Call these whenever you call something that causes
147   // a Render().
148   // e.g.
149   // panel.lock();
150   // // Code that causes a render
151   // panel.unlock();
152   public void lock() {
153     Lock();
154   }
155
156   public void unlock() {
157     UnLock();
158   }
159
160   public void Delete() {
161     if(rendering) {
162       return;
163     }
164     rendering = true;
165     // We prevent any further rendering
166
167     if (this.getParent() != null) {
168       this.getParent().remove(this);
169     }
170     // Free internal VTK objects
171     ren = null;
172     cam = null;
173     lgt = null;
174     // On linux we prefer to have a memory leak instead of a crash
175     if(!rw.GetClassName().equals("vtkXOpenGLRenderWindow")) {
176       rw = null;
177     } else {
178       System.out.println("The renderwindow has been kept around to prevent a crash");
179     }
180   }
181
182   protected native int RenderCreate(vtkRenderWindow id0);
183
184   protected native int Lock();
185
186   protected native int UnLock();
187
188   public vtkPanel() {
189     rw.AddRenderer(ren);
190     addMouseListener(this);
191     addMouseMotionListener(this);
192     addMouseWheelListener(this);
193     addKeyListener(this);
194     super.setSize(200, 200);
195     rw.SetSize(200, 200);
196   }
197
198   public vtkPanel(vtkRenderWindow renwin) {
199     rw = renwin;
200     rw.AddRenderer(ren);
201     addMouseListener(this);
202     addMouseMotionListener(this);
203     addKeyListener(this);
204     super.setSize(200, 200);
205     rw.SetSize(200, 200);
206   }
207
208   public void Report() {
209
210     // must be performed on awt event thread
211     Runnable updateAComponent = new Runnable() {
212       public void run() {
213         Lock();
214         System.out.println("direct rendering = " + (rw.IsDirect() == 1));
215         System.out.println("opengl supported = " + (rw.SupportsOpenGL() == 1));
216         System.out.println("report = " + rw.ReportCapabilities());
217         UnLock();
218       }
219     };
220
221     SwingUtilities.invokeLater(updateAComponent);
222
223   }
224
225   public vtkRenderer GetRenderer() {
226     return ren;
227   }
228
229   public vtkRenderWindow GetRenderWindow() {
230     return rw;
231   }
232
233   public void setSize(int x, int y) {
234     super.setSize(x, y);
235     if (windowset == 1) {
236       Lock();
237       rw.SetSize(x, y);
238       UnLock();
239     }
240   }
241
242   public void addNotify() {
243     super.addNotify();
244     windowset = 0;
245     rw.SetForceMakeCurrent();
246     rendering = false;
247   }
248
249   public void removeNotify() {
250     rendering = true;
251     super.removeNotify();
252   }
253
254   public synchronized void Render() {
255     if (!rendering) {
256       rendering = true;
257       if (ren.VisibleActorCount() == 0) {
258         rendering = false;
259         return;
260       }
261       if (rw != null) {
262         if (windowset == 0) {
263           // set the window id and the active camera
264           cam = ren.GetActiveCamera();
265           if (lightingset == 0) {
266             ren.AddLight(lgt);
267             lgt.SetPosition(cam.GetPosition());
268             lgt.SetFocalPoint(cam.GetFocalPoint());
269             lightingset = 1;
270           }
271           RenderCreate(rw);
272           Lock();
273           rw.SetSize(getWidth(), getHeight());
274           UnLock();
275           windowset = 1;
276           this.setSize(getWidth(), getHeight());
277         }
278         Lock();
279         rw.Render();
280         UnLock();
281         rendering = false;
282       }
283     }
284   }
285
286   public boolean isWindowSet() {
287     return (this.windowset == 1);
288   }
289
290   public void paint(Graphics g) {
291     this.Render();
292   }
293
294   public void update(Graphics g) {
295     paint(g);
296   }
297
298   public void LightFollowCameraOn() {
299     this.LightFollowCamera = 1;
300   }
301
302   public void LightFollowCameraOff() {
303     this.LightFollowCamera = 0;
304   }
305
306   public void InteractionModeRotate() {
307     this.InteractionMode = 1;
308   }
309
310   public void InteractionModeTranslate() {
311     this.InteractionMode = 2;
312   }
313
314   public void InteractionModeZoom() {
315     this.InteractionMode = 3;
316   }
317
318   public void UpdateLight() {
319     lgt.SetPosition(cam.GetPosition());
320     lgt.SetFocalPoint(cam.GetFocalPoint());
321   }
322
323   public void resetCameraClippingRange() {
324     Lock();
325     ren.ResetCameraClippingRange();
326     UnLock();
327   }
328
329   public void resetCamera() {
330     Lock();
331     ren.ResetCamera();
332     UnLock();
333   }
334
335   public void mouseClicked(MouseEvent e) {
336
337   }
338
339   public void mousePressed(MouseEvent e) {
340
341     if (ren.VisibleActorCount() == 0)
342       return;
343     rw.SetDesiredUpdateRate(5.0);
344     lastX = e.getX();
345     lastY = e.getY();
346     if ((e.getModifiers() == InputEvent.BUTTON2_MASK) || (e.getModifiers() == (InputEvent.BUTTON1_MASK | InputEvent.SHIFT_MASK))) {
347       InteractionModeTranslate();
348     } else if (e.getModifiers() == InputEvent.BUTTON3_MASK) {
349       InteractionModeZoom();
350     } else {
351       InteractionModeRotate();
352     }
353   }
354
355   public void mouseReleased(MouseEvent e) {
356     rw.SetDesiredUpdateRate(0.01);
357   }
358
359   public void mouseEntered(MouseEvent e) {
360     this.requestFocus();
361   }
362
363   public void mouseExited(MouseEvent e) {
364   }
365
366   public void mouseMoved(MouseEvent e) {
367     lastX = e.getX();
368     lastY = e.getY();
369   }
370
371   public void mouseDragged(MouseEvent e) {
372     if (ren.VisibleActorCount() == 0)
373       return;
374     int x = e.getX();
375     int y = e.getY();
376     // rotate
377     if (this.InteractionMode == 1) {
378       cam.Azimuth(lastX - x);
379       cam.Elevation(y - lastY);
380       cam.OrthogonalizeViewUp();
381       resetCameraClippingRange();
382       if (this.LightFollowCamera == 1) {
383         lgt.SetPosition(cam.GetPosition());
384         lgt.SetFocalPoint(cam.GetFocalPoint());
385       }
386     }
387     // translate
388     if (this.InteractionMode == 2) {
389       double FPoint[];
390       double PPoint[];
391       double APoint[] = new double[3];
392       double RPoint[];
393       double focalDepth;
394
395       // get the current focal point and position
396       FPoint = cam.GetFocalPoint();
397       PPoint = cam.GetPosition();
398
399       // calculate the focal depth since we'll be using it a lot
400       ren.SetWorldPoint(FPoint[0], FPoint[1], FPoint[2], 1.0);
401       ren.WorldToDisplay();
402       focalDepth = ren.GetDisplayPoint()[2];
403
404       APoint[0] = rw.GetSize()[0] / 2.0 + (x - lastX);
405       APoint[1] = rw.GetSize()[1] / 2.0 - (y - lastY);
406       APoint[2] = focalDepth;
407       ren.SetDisplayPoint(APoint);
408       ren.DisplayToWorld();
409       RPoint = ren.GetWorldPoint();
410       if (RPoint[3] != 0.0) {
411         RPoint[0] = RPoint[0] / RPoint[3];
412         RPoint[1] = RPoint[1] / RPoint[3];
413         RPoint[2] = RPoint[2] / RPoint[3];
414       }
415
416       /*
417        * Compute a translation vector, moving everything 1/2 the distance
418        * to the cursor. (Arbitrary scale factor)
419        */
420       cam.SetFocalPoint((FPoint[0] - RPoint[0]) / 2.0 + FPoint[0], (FPoint[1] - RPoint[1]) / 2.0 + FPoint[1], (FPoint[2] - RPoint[2]) / 2.0 + FPoint[2]);
421       cam.SetPosition((FPoint[0] - RPoint[0]) / 2.0 + PPoint[0], (FPoint[1] - RPoint[1]) / 2.0 + PPoint[1], (FPoint[2] - RPoint[2]) / 2.0 + PPoint[2]);
422       resetCameraClippingRange();
423     }
424     // zoom
425     if (this.InteractionMode == 3) {
426       double zoomFactor;
427       zoomFactor = Math.pow(1.02, (y - lastY));
428       if (cam.GetParallelProjection() == 1) {
429         cam.SetParallelScale(cam.GetParallelScale() / zoomFactor);
430       } else {
431         cam.Dolly(zoomFactor);
432         resetCameraClippingRange();
433       }
434     }
435     lastX = x;
436     lastY = y;
437     this.Render();
438   }
439
440   public void mouseWheelMoved(MouseWheelEvent e) {
441     if (ren.VisibleActorCount() == 0 || e.getWheelRotation() == 0)
442       return;
443     int exponent;
444     exponent = -10 * e.getWheelRotation() / Math.abs(e.getWheelRotation());
445     double zoomFactor;
446     zoomFactor = Math.pow(1.02, exponent);
447     if (cam.GetParallelProjection() == 1) {
448       cam.SetParallelScale(cam.GetParallelScale() / zoomFactor);
449     } else {
450       cam.Dolly(zoomFactor);
451       resetCameraClippingRange();
452     }
453     this.Render();
454   }
455
456   public void keyTyped(KeyEvent e) {
457   }
458
459   public void keyPressed(KeyEvent e) {
460     if (ren.VisibleActorCount() == 0)
461       return;
462     char keyChar = e.getKeyChar();
463
464     if ('r' == keyChar) {
465       resetCamera();
466       this.Render();
467     }
468     if ('u' == keyChar) {
469       pickActor(lastX, lastY);
470     }
471     if ('w' == keyChar) {
472       vtkActorCollection ac;
473       vtkActor anActor;
474       int i;
475
476       ac = ren.GetActors();
477       ac.InitTraversal();
478       for (i = 0; i < ac.GetNumberOfItems(); i++) {
479         anActor = ac.GetNextActor();
480         anActor.GetProperty().SetRepresentationToWireframe();
481       }
482       this.Render();
483     }
484     if ('s' == keyChar) {
485       vtkActorCollection ac;
486       vtkActor anActor;
487       int i;
488
489       ac = ren.GetActors();
490       ac.InitTraversal();
491       for (i = 0; i < ac.GetNumberOfItems(); i++) {
492         anActor = ac.GetNextActor();
493         anActor.GetProperty().SetRepresentationToSurface();
494       }
495       this.Render();
496     }
497   }
498
499   public void HardCopy(String filename, int mag) {
500
501     Lock();
502
503     vtkWindowToImageFilter w2if = new vtkWindowToImageFilter();
504     w2if.SetInput(rw);
505
506     w2if.SetScale(mag);
507     w2if.Update();
508
509     vtkTIFFWriter writer = new vtkTIFFWriter();
510     writer.SetInputConnection(w2if.GetOutputPort());
511     writer.SetFileName(filename);
512     writer.Write();
513
514     UnLock();
515   }
516
517   public void pickActor(int x, int y) {
518
519     vtkPropPicker picker = new vtkPropPicker();
520
521     Lock();
522     picker.PickProp(x, rw.GetSize()[1] - y, ren);
523     UnLock();
524
525     if (picker.GetActor() != null)
526       System.out.println(picker.GetActor().GetClassName());
527   }
528
529   public void keyReleased(KeyEvent e) {
530   }
531
532 }