]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - vtk.rendering/src/vtk/rendering/swt/vtkInternalSwtComponent.java
VTK.Rendering plug-in + win64 fragment
[simantics/3d.git] / vtk.rendering / src / vtk / rendering / swt / vtkInternalSwtComponent.java
diff --git a/vtk.rendering/src/vtk/rendering/swt/vtkInternalSwtComponent.java b/vtk.rendering/src/vtk/rendering/swt/vtkInternalSwtComponent.java
new file mode 100644 (file)
index 0000000..2d73b3d
--- /dev/null
@@ -0,0 +1,127 @@
+package vtk.rendering.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+import com.jogamp.opengl.GLAutoDrawable;
+import com.jogamp.opengl.GLCapabilities;
+import com.jogamp.opengl.GLProfile;
+import com.jogamp.opengl.GLRunnable;
+import com.jogamp.opengl.swt.GLCanvas;
+
+import vtk.vtkObject;
+
+/**
+ * @author    Joachim Pouderoux - joachim.pouderoux@kitware.com, Kitware SAS 2012
+ * @copyright This work was supported by CEA/CESTA
+ *            Commissariat a l'Energie Atomique et aux Energies Alternatives,
+ *            15 avenue des Sablieres, CS 60001, 33116 Le Barp, France.
+ */
+public class vtkInternalSwtComponent extends GLCanvas implements Listener {
+
+  private vtkSwtComponent parent;
+
+  public static GLCapabilities GetGLCapabilities() {
+    GLCapabilities caps;
+    caps = new GLCapabilities(GLProfile.get(GLProfile.GL2GL3));
+    caps.setDoubleBuffered(true);
+    caps.setHardwareAccelerated(true);
+    caps.setSampleBuffers(false);
+    caps.setNumSamples(4);
+    
+    caps.setAlphaBits(8);
+
+    return caps;
+  }
+
+  public vtkInternalSwtComponent(vtkSwtComponent parent, Composite parentComposite) {
+
+    super(parentComposite, SWT.NO_BACKGROUND, GetGLCapabilities(), null);
+    this.parent = parent;
+
+    vtkSwtInteractorForwarderDecorator forwarder = (vtkSwtInteractorForwarderDecorator) this.parent
+      .getInteractorForwarder();
+
+    this.addMouseListener(forwarder);
+    this.addKeyListener(forwarder);
+    this.addMouseMoveListener(forwarder);
+    this.addMouseTrackListener(forwarder);
+    this.addMouseWheelListener(forwarder);
+
+    this.addListener(SWT.Paint, this);
+    this.addListener(SWT.Close, this);
+    this.addListener(SWT.Dispose, this);
+    this.addListener(SWT.Resize, this);
+
+    this.IntializeRenderWindow();
+  }
+
+  protected void IntializeRenderWindow() {
+
+    // setCurrent(); // need to be done so SetWindowIdFromCurrentContext can
+    // get the current context!
+    // Context is not created until the first draw call. The renderer isn't
+    // initialized until the context is
+    // present.
+    invoke(false, new GLRunnable() {
+
+      @Override
+      public boolean run(GLAutoDrawable arg0) {
+        // This makes this thread (should be the main thread) current
+        getContext().makeCurrent();
+        parent.getRenderWindow().InitializeFromCurrentContext();
+        // Swapping buffers is handled by the vtkSwtComponent
+        parent.getRenderWindow().SwapBuffersOff();
+        return false;
+      }
+    });
+
+    // Swap buffers to trigger context creation
+    swapBuffers();
+    setAutoSwapBufferMode(false);
+  }
+
+  @Override
+  public void update() {
+    super.update();
+    if (isRealized()) {
+      parent.Render();
+    }
+  }
+
+  @Override
+  public void dispose() {
+    this.removeListener(SWT.Paint, this);
+    this.removeListener(SWT.Close, this);
+    this.removeListener(SWT.Dispose, this);
+    this.removeListener(SWT.Resize, this);
+
+    if (getContext().isCurrent()) {
+      getContext().release();
+    }
+    super.dispose();
+  }
+
+  @Override
+  public void handleEvent(Event event) {
+    switch (event.type) {
+    case SWT.Paint:
+      if (isRealized()) {
+        parent.Render();
+      }
+      break;
+    case SWT.Dispose:
+      parent.Delete();
+      vtkObject.JAVA_OBJECT_MANAGER.gc(false);
+      break;
+    case SWT.Close:
+      // System.out.println("closing");
+      break;
+    case SWT.Resize:
+      parent.setSize(getClientArea().width, getClientArea().height);
+      break;
+    }
+  }
+}