1 package vtk.rendering.swt;
2 
3 import org.eclipse.swt.SWT;
4 import org.eclipse.swt.widgets.Composite;
5 import org.eclipse.swt.widgets.Event;
6 import org.eclipse.swt.widgets.Listener;
7 
8 import com.jogamp.opengl.GLAutoDrawable;
9 import com.jogamp.opengl.GLCapabilities;
10 import com.jogamp.opengl.GLProfile;
11 import com.jogamp.opengl.GLRunnable;
12 import com.jogamp.opengl.swt.GLCanvas;
13 
14 import vtk.vtkObject;
15 
16 /**
17  * @author    Joachim Pouderoux - joachim.pouderoux@kitware.com, Kitware SAS 2012
18  * @copyright This work was supported by CEA/CESTA
19  *            Commissariat a l'Energie Atomique et aux Energies Alternatives,
20  *            15 avenue des Sablieres, CS 60001, 33116 Le Barp, France.
21  */
22 public class vtkInternalSwtComponent extends GLCanvas implements Listener {
23 
24   private vtkSwtComponent parent;
25 
GetGLCapabilities()26   public static GLCapabilities GetGLCapabilities() {
27     GLCapabilities caps;
28     caps = new GLCapabilities(GLProfile.get(GLProfile.GL2GL3));
29     caps.setDoubleBuffered(true);
30     caps.setHardwareAccelerated(true);
31     caps.setSampleBuffers(false);
32     caps.setNumSamples(4);
33 
34     return caps;
35   }
36 
vtkInternalSwtComponent(vtkSwtComponent parent, Composite parentComposite)37   public vtkInternalSwtComponent(vtkSwtComponent parent, Composite parentComposite) {
38 
39     super(parentComposite, SWT.NO_BACKGROUND, GetGLCapabilities(), null);
40     this.parent = parent;
41 
42     vtkSwtInteractorForwarderDecorator forwarder = (vtkSwtInteractorForwarderDecorator) this.parent
43       .getInteractorForwarder();
44 
45     this.addMouseListener(forwarder);
46     this.addKeyListener(forwarder);
47     this.addMouseMoveListener(forwarder);
48     this.addMouseTrackListener(forwarder);
49     this.addMouseWheelListener(forwarder);
50 
51     this.addListener(SWT.Paint, this);
52     this.addListener(SWT.Close, this);
53     this.addListener(SWT.Dispose, this);
54     this.addListener(SWT.Resize, this);
55 
56     this.IntializeRenderWindow();
57   }
58 
IntializeRenderWindow()59   protected void IntializeRenderWindow() {
60 
61     // setCurrent(); // need to be done so SetWindowIdFromCurrentContext can
62     // get the current context!
63     // Context is not created until the first draw call. The renderer isn't
64     // initialized until the context is
65     // present.
66     invoke(false, new GLRunnable() {
67 
68       @Override
69       public boolean run(GLAutoDrawable arg0) {
70         // This makes this thread (should be the main thread) current
71         getContext().makeCurrent();
72         parent.getRenderWindow().InitializeFromCurrentContext();
73         // Swapping buffers is handled by the vtkSwtComponent
74         parent.getRenderWindow().SwapBuffersOff();
75         return false;
76       }
77     });
78 
79     // Swap buffers to trigger context creation
80     swapBuffers();
81     setAutoSwapBufferMode(false);
82   }
83 
84   @Override
update()85   public void update() {
86     super.update();
87     if (isRealized()) {
88       parent.Render();
89     }
90   }
91 
92   @Override
dispose()93   public void dispose() {
94     this.removeListener(SWT.Paint, this);
95     this.removeListener(SWT.Close, this);
96     this.removeListener(SWT.Dispose, this);
97     this.removeListener(SWT.Resize, this);
98 
99     if (getContext().isCurrent()) {
100       getContext().release();
101     }
102     super.dispose();
103   }
104 
105   @Override
handleEvent(Event event)106   public void handleEvent(Event event) {
107     switch (event.type) {
108     case SWT.Paint:
109       if (isRealized()) {
110         parent.Render();
111       }
112       break;
113     case SWT.Dispose:
114       parent.Delete();
115       vtkObject.JAVA_OBJECT_MANAGER.gc(false);
116       break;
117     case SWT.Close:
118       // System.out.println("closing");
119       break;
120     case SWT.Resize:
121       parent.setSize(getClientArea().width, getClientArea().height);
122       break;
123     }
124   }
125 }
126