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;
14 import javax.swing.SwingUtilities;
17 * Java AWT component that encapsulate vtkRenderWindow, vtkRenderer, vtkCamera,
20 * If a vtkInteractor is needed, use vtkCanvas instead. This is necessary when
21 * Widget and Picker are used.
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();
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;
39 static String[] libs = new String[] {
47 "vtkCommonSystemJava",
50 "vtkCommonTransforms",
51 "vtkCommonTransformsJava",
53 "vtkCommonDataModelJava",
56 "vtkCommonExecutionModel",
57 "vtkCommonExecutionModelJava",
58 "vtkCommonComputationalGeometry",
59 "vtkCommonComputationalGeometryJava",
61 "vtkdoubleconversion",
86 "vtkImagingFourierJava",
88 "vtkImagingSourcesJava",
90 "vtkImagingHybridJava",
92 "vtkImagingColorJava",
94 "vtkImagingGeneralJava",
99 "vtkFiltersGeometryJava",
101 "vtkFiltersGeneralJava",
103 "vtkFiltersSourcesJava",
105 "vtkFiltersGenericJava",
106 "vtkFiltersStatistics",
107 "vtkFiltersStatisticsJava",
108 "vtkFiltersExtraction",
109 "vtkFiltersExtractionJava",
110 "vtkFiltersModeling",
111 "vtkFiltersModelingJava",
114 "vtkRenderingCoreJava",
115 "vtkRenderingOpenGL2",
116 "vtkRenderingOpenGL2Java",
117 "vtkRenderingVolume",
118 "vtkRenderingVolumeJava",
119 "vtkRenderingVolumeOpenGL2",
120 "vtkRenderingVolumeOpenGL2Java",
122 "vtkRenderingFreeType",
123 "vtkRenderingFreeTypeJava",
124 "vtkRenderingAnnotation",
125 "vtkRenderingAnnotationJava",
128 "vtkFiltersHybridJava",
130 "vtkInteractionStyle",
131 "vtkInteractionStyleJava",
132 "vtkInteractionWidgets",
133 "vtkInteractionWidgetsJava",
134 "vtkInteractionImage",
135 "vtkInteractionImageJava",
141 for (String lib : libs)
142 System.loadLibrary(lib);
145 // Allow access to display lock() and unlock().
146 // Call these whenever you call something that causes
150 // // Code that causes a render
156 public void unlock() {
160 public void Delete() {
165 // We prevent any further rendering
167 if (this.getParent() != null) {
168 this.getParent().remove(this);
170 // Free internal VTK objects
174 // On linux we prefer to have a memory leak instead of a crash
175 if(!rw.GetClassName().equals("vtkXOpenGLRenderWindow")) {
178 System.out.println("The renderwindow has been kept around to prevent a crash");
182 protected native int RenderCreate(vtkRenderWindow id0);
184 protected native int Lock();
186 protected native int UnLock();
190 addMouseListener(this);
191 addMouseMotionListener(this);
192 addMouseWheelListener(this);
193 addKeyListener(this);
194 super.setSize(200, 200);
195 rw.SetSize(200, 200);
198 public vtkPanel(vtkRenderWindow renwin) {
201 addMouseListener(this);
202 addMouseMotionListener(this);
203 addKeyListener(this);
204 super.setSize(200, 200);
205 rw.SetSize(200, 200);
208 public void Report() {
210 // must be performed on awt event thread
211 Runnable updateAComponent = new Runnable() {
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());
221 SwingUtilities.invokeLater(updateAComponent);
225 public vtkRenderer GetRenderer() {
229 public vtkRenderWindow GetRenderWindow() {
233 public void setSize(int x, int y) {
235 if (windowset == 1) {
242 public void addNotify() {
245 rw.SetForceMakeCurrent();
249 public void removeNotify() {
251 super.removeNotify();
254 public synchronized void Render() {
257 if (ren.VisibleActorCount() == 0) {
262 if (windowset == 0) {
263 // set the window id and the active camera
264 cam = ren.GetActiveCamera();
265 if (lightingset == 0) {
267 lgt.SetPosition(cam.GetPosition());
268 lgt.SetFocalPoint(cam.GetFocalPoint());
273 rw.SetSize(getWidth(), getHeight());
276 this.setSize(getWidth(), getHeight());
286 public boolean isWindowSet() {
287 return (this.windowset == 1);
290 public void paint(Graphics g) {
294 public void update(Graphics g) {
298 public void LightFollowCameraOn() {
299 this.LightFollowCamera = 1;
302 public void LightFollowCameraOff() {
303 this.LightFollowCamera = 0;
306 public void InteractionModeRotate() {
307 this.InteractionMode = 1;
310 public void InteractionModeTranslate() {
311 this.InteractionMode = 2;
314 public void InteractionModeZoom() {
315 this.InteractionMode = 3;
318 public void UpdateLight() {
319 lgt.SetPosition(cam.GetPosition());
320 lgt.SetFocalPoint(cam.GetFocalPoint());
323 public void resetCameraClippingRange() {
325 ren.ResetCameraClippingRange();
329 public void resetCamera() {
335 public void mouseClicked(MouseEvent e) {
339 public void mousePressed(MouseEvent e) {
341 if (ren.VisibleActorCount() == 0)
343 rw.SetDesiredUpdateRate(5.0);
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();
351 InteractionModeRotate();
355 public void mouseReleased(MouseEvent e) {
356 rw.SetDesiredUpdateRate(0.01);
359 public void mouseEntered(MouseEvent e) {
363 public void mouseExited(MouseEvent e) {
366 public void mouseMoved(MouseEvent e) {
371 public void mouseDragged(MouseEvent e) {
372 if (ren.VisibleActorCount() == 0)
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());
388 if (this.InteractionMode == 2) {
391 double APoint[] = new double[3];
395 // get the current focal point and position
396 FPoint = cam.GetFocalPoint();
397 PPoint = cam.GetPosition();
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];
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];
417 * Compute a translation vector, moving everything 1/2 the distance
418 * to the cursor. (Arbitrary scale factor)
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();
425 if (this.InteractionMode == 3) {
427 zoomFactor = Math.pow(1.02, (y - lastY));
428 if (cam.GetParallelProjection() == 1) {
429 cam.SetParallelScale(cam.GetParallelScale() / zoomFactor);
431 cam.Dolly(zoomFactor);
432 resetCameraClippingRange();
440 public void mouseWheelMoved(MouseWheelEvent e) {
441 if (ren.VisibleActorCount() == 0 || e.getWheelRotation() == 0)
444 exponent = -10 * e.getWheelRotation() / Math.abs(e.getWheelRotation());
446 zoomFactor = Math.pow(1.02, exponent);
447 if (cam.GetParallelProjection() == 1) {
448 cam.SetParallelScale(cam.GetParallelScale() / zoomFactor);
450 cam.Dolly(zoomFactor);
451 resetCameraClippingRange();
456 public void keyTyped(KeyEvent e) {
459 public void keyPressed(KeyEvent e) {
460 if (ren.VisibleActorCount() == 0)
462 char keyChar = e.getKeyChar();
464 if ('r' == keyChar) {
468 if ('u' == keyChar) {
469 pickActor(lastX, lastY);
471 if ('w' == keyChar) {
472 vtkActorCollection ac;
476 ac = ren.GetActors();
478 for (i = 0; i < ac.GetNumberOfItems(); i++) {
479 anActor = ac.GetNextActor();
480 anActor.GetProperty().SetRepresentationToWireframe();
484 if ('s' == keyChar) {
485 vtkActorCollection ac;
489 ac = ren.GetActors();
491 for (i = 0; i < ac.GetNumberOfItems(); i++) {
492 anActor = ac.GetNextActor();
493 anActor.GetProperty().SetRepresentationToSurface();
499 public void HardCopy(String filename, int mag) {
503 vtkWindowToImageFilter w2if = new vtkWindowToImageFilter();
509 vtkTIFFWriter writer = new vtkTIFFWriter();
510 writer.SetInputConnection(w2if.GetOutputPort());
511 writer.SetFileName(filename);
517 public void pickActor(int x, int y) {
519 vtkPropPicker picker = new vtkPropPicker();
522 picker.PickProp(x, rw.GetSize()[1] - y, ren);
525 if (picker.GetActor() != null)
526 System.out.println(picker.GetActor().GetClassName());
529 public void keyReleased(KeyEvent e) {