]> gerrit.simantics Code Review - simantics/3d.git/blob - vtk.rendering/src/vtk/rendering/swt/vtkInternalSwtComponent.java
Various fixes to vtk swt components
[simantics/3d.git] / vtk.rendering / src / vtk / rendering / swt / vtkInternalSwtComponent.java
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
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(true);
32     
33     caps.setRedBits(8);
34     caps.setGreenBits(8);
35     caps.setBlueBits(8);
36     caps.setAlphaBits(8);
37     caps.setDepthBits(24);
38     caps.setStencilBits(8);
39     
40 //    caps.setAccumRedBits(8);
41 //    caps.setAccumGreenBits(8);
42 //    caps.setAccumBlueBits(8);
43 //    caps.setAccumAlphaBits(8);
44 //    
45 //    caps.setBitmap(true);
46 //    caps.setOnscreen(true);
47     
48     
49     //caps.setPBuffer(true);
50     //caps.setFBO(true);
51     caps.setNumSamples(4);
52     
53     
54
55     return caps;
56   }
57
58   public vtkInternalSwtComponent(vtkSwtComponent parent, Composite parentComposite) {
59
60     super(parentComposite, SWT.NO_BACKGROUND, GetGLCapabilities(), null);
61     this.parent = parent;
62
63     vtkSwtInteractorForwarderDecorator forwarder = (vtkSwtInteractorForwarderDecorator) this.parent
64       .getInteractorForwarder();
65
66     this.addMouseListener(forwarder);
67     this.addKeyListener(forwarder);
68     this.addMouseMoveListener(forwarder);
69     this.addMouseTrackListener(forwarder);
70     this.addMouseWheelListener(forwarder);
71
72     this.addListener(SWT.Paint, this);
73     this.addListener(SWT.Close, this);
74     this.addListener(SWT.Dispose, this);
75     this.addListener(SWT.Resize, this);
76
77     this.IntializeRenderWindow();
78   }
79
80   protected void IntializeRenderWindow() {
81
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
86     // present.
87     invoke(false, new GLRunnable() {
88
89       @Override
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();
96         return false;
97       }
98     });
99
100     // Swap buffers to trigger context creation
101     swapBuffers();
102     setAutoSwapBufferMode(false);
103   }
104
105   @Override
106   public void update() {
107     super.update();
108     if (isRealized()) {
109       parent.Render();
110     }
111   }
112
113   @Override
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);
119     
120     if (parent != null) {
121         parent.getRenderer().DrawOff();
122         parent.Delete();
123         vtkObject.JAVA_OBJECT_MANAGER.gc(false);
124         parent = null;
125     }
126
127     if (getContext() != null && getContext().isCurrent()) {
128       getContext().release();
129     }
130     
131     super.dispose();
132   }
133
134   @Override
135   public void handleEvent(Event event) {
136     switch (event.type) {
137     case SWT.Paint:
138       if (isRealized()) {
139         parent.Render();
140       }
141       break;
142     case SWT.Dispose:
143       parent.Delete();
144       vtkObject.JAVA_OBJECT_MANAGER.gc(false);
145       break;
146     case SWT.Close:
147       break;
148     case SWT.Resize:
149       parent.setSize(getClientArea().width, getClientArea().height);
150       break;
151     }
152   }
153 }