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