1 package vtk.rendering.swt;
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;
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;
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.
22 public class vtkInternalSwtComponent extends GLCanvas implements Listener {
24 private vtkSwtComponent parent;
26 public static GLCapabilities GetGLCapabilities() {
28 caps = new GLCapabilities(GLProfile.get(GLProfile.GL2GL3));
29 caps.setDoubleBuffered(true);
30 caps.setHardwareAccelerated(true);
31 caps.setSampleBuffers(true);
37 caps.setDepthBits(24);
38 caps.setStencilBits(8);
40 // caps.setAccumRedBits(8);
41 // caps.setAccumGreenBits(8);
42 // caps.setAccumBlueBits(8);
43 // caps.setAccumAlphaBits(8);
45 // caps.setBitmap(true);
46 // caps.setOnscreen(true);
49 //caps.setPBuffer(true);
51 caps.setNumSamples(4);
58 public vtkInternalSwtComponent(vtkSwtComponent parent, Composite parentComposite) {
60 super(parentComposite, SWT.NO_BACKGROUND, GetGLCapabilities(), null);
63 vtkSwtInteractorForwarderDecorator forwarder = (vtkSwtInteractorForwarderDecorator) this.parent
64 .getInteractorForwarder();
66 this.addMouseListener(forwarder);
67 this.addKeyListener(forwarder);
68 this.addMouseMoveListener(forwarder);
69 this.addMouseTrackListener(forwarder);
70 this.addMouseWheelListener(forwarder);
72 this.addListener(SWT.Paint, this);
73 this.addListener(SWT.Close, this);
74 this.addListener(SWT.Dispose, this);
75 this.addListener(SWT.Resize, this);
77 this.IntializeRenderWindow();
80 protected void IntializeRenderWindow() {
82 // setCurrent(); // need to be done so SetWindowIdFromCurrentContext can
83 // get the current context!
84 // Context is not created until the first draw call. The renderer isn't
85 // initialized until the context is
87 invoke(false, new GLRunnable() {
90 public boolean run(GLAutoDrawable arg0) {
91 // This makes this thread (should be the main thread) current
92 getContext().makeCurrent();
93 parent.getRenderWindow().InitializeFromCurrentContext();
94 // Swapping buffers is handled by the vtkSwtComponent
95 parent.getRenderWindow().SwapBuffersOff();
100 // Swap buffers to trigger context creation
102 setAutoSwapBufferMode(false);
106 public void update() {
114 public void dispose() {
115 this.removeListener(SWT.Paint, this);
116 this.removeListener(SWT.Close, this);
117 this.removeListener(SWT.Dispose, this);
118 this.removeListener(SWT.Resize, this);
120 if (parent != null) {
121 parent.getRenderer().DrawOff();
123 vtkObject.JAVA_OBJECT_MANAGER.gc(false);
127 if (getContext() != null && getContext().isCurrent()) {
128 getContext().release();
135 public void handleEvent(Event event) {
136 switch (event.type) {
144 vtkObject.JAVA_OBJECT_MANAGER.gc(false);
149 parent.setSize(getClientArea().width, getClientArea().height);