]> gerrit.simantics Code Review - simantics/3d.git/commitdiff
Various fixes to vtk swt components 68/3068/1
authorMarko Luukkainen <marko.luukkainen@semantum.fi>
Wed, 7 Aug 2019 15:15:12 +0000 (18:15 +0300)
committerMarko Luukkainen <marko.luukkainen@semantum.fi>
Wed, 7 Aug 2019 15:15:12 +0000 (18:15 +0300)
* Delete objects to prevent memory leaks
* Added additional logic to SWT->AWT event conversion

gitlab #22

Change-Id: I2ad4b61171cb7a97475196a9a3afc3130771f04c

vtk.rendering/src/vtk/rendering/swt/vtkInternalSwtComponent.java
vtk.rendering/src/vtk/rendering/swt/vtkSwtComponent.java
vtk.rendering/src/vtk/rendering/swt/vtkSwtInteractorForwarderDecorator.java
vtk.rendering/src/vtk/rendering/vtkAbstractComponent.java
vtk.rendering/src/vtk/rendering/vtkInteractorForwarder.java

index 2d73b3d502288ee5d7bd2a33ef9463573e482516..ce10c783dde65667ed43c3ad5f03cad2acbf4b1e 100644 (file)
@@ -28,10 +28,29 @@ public class vtkInternalSwtComponent extends GLCanvas implements Listener {
     caps = new GLCapabilities(GLProfile.get(GLProfile.GL2GL3));
     caps.setDoubleBuffered(true);
     caps.setHardwareAccelerated(true);
-    caps.setSampleBuffers(false);
-    caps.setNumSamples(4);
+    caps.setSampleBuffers(true);
     
+    caps.setRedBits(8);
+    caps.setGreenBits(8);
+    caps.setBlueBits(8);
     caps.setAlphaBits(8);
+    caps.setDepthBits(24);
+    caps.setStencilBits(8);
+    
+//    caps.setAccumRedBits(8);
+//    caps.setAccumGreenBits(8);
+//    caps.setAccumBlueBits(8);
+//    caps.setAccumAlphaBits(8);
+//    
+//    caps.setBitmap(true);
+//    caps.setOnscreen(true);
+    
+    
+    //caps.setPBuffer(true);
+    //caps.setFBO(true);
+    caps.setNumSamples(4);
+    
+    
 
     return caps;
   }
@@ -97,10 +116,18 @@ public class vtkInternalSwtComponent extends GLCanvas implements Listener {
     this.removeListener(SWT.Close, this);
     this.removeListener(SWT.Dispose, this);
     this.removeListener(SWT.Resize, this);
+    
+    if (parent != null) {
+       parent.getRenderer().DrawOff();
+       parent.Delete();
+       vtkObject.JAVA_OBJECT_MANAGER.gc(false);
+       parent = null;
+    }
 
-    if (getContext().isCurrent()) {
+    if (getContext() != null && getContext().isCurrent()) {
       getContext().release();
     }
+    
     super.dispose();
   }
 
@@ -117,7 +144,6 @@ public class vtkInternalSwtComponent extends GLCanvas implements Listener {
       vtkObject.JAVA_OBJECT_MANAGER.gc(false);
       break;
     case SWT.Close:
-      // System.out.println("closing");
       break;
     case SWT.Resize:
       parent.setSize(getClientArea().width, getClientArea().height);
index 7d79189d38779a8ed133119fc4001ca124441be3..bdc3c67691abfb42fd0c6e5ae099bf736c786401 100644 (file)
@@ -33,6 +33,7 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
     renderWindow.AddObserver("StartEvent", this, "startEvent");
     renderWindow.AddObserver("EndEvent", this, "endEvent");
   }
+  
 
   /**
    * Set the size of the VTK component
@@ -96,6 +97,7 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
     this.lock.lock();
     // We prevent any further rendering
     this.inRenderCall = true;
+    this.renderWindow.Delete();
     this.renderWindow = null;
     super.Delete();
     this.lock.unlock();
index 28178862d983c8f974f13685c72bac61e6051617..24ccabe1917809604ac1965125486a59088dfffc 100644 (file)
@@ -35,16 +35,19 @@ implements MouseListener, MouseMoveListener, MouseTrackListener, MouseWheelListe
     this.forwarder = forwarder;
   }
 
-  public static int convertModifiers(int mods) {
+  public static int convertModifiers(int button , int mods) {
     int modifiers = 0;
     if ((mods & SWT.SHIFT) != 0) modifiers |= java.awt.Event.SHIFT_MASK;
     if ((mods & SWT.CTRL) != 0) modifiers |= java.awt.Event.CTRL_MASK;
     if ((mods & SWT.ALT) != 0) modifiers |= java.awt.Event.ALT_MASK;
+    if ((mods & SWT.BUTTON1) != 0 || button == 1) modifiers |= java.awt.event.InputEvent.BUTTON1_MASK;
+    if ((mods & SWT.BUTTON2) != 0 || button == 2) modifiers |= java.awt.event.InputEvent.BUTTON2_MASK;
+    if ((mods & SWT.BUTTON3) != 0 || button == 3) modifiers |= java.awt.event.InputEvent.BUTTON3_MASK;
     return modifiers;
   }
 
   public java.awt.event.KeyEvent convertKeyEvent(org.eclipse.swt.events.KeyEvent e) {
-    return new java.awt.event.KeyEvent(dummyComponent, 0, (long)e.time, convertModifiers(e.stateMask), e.keyCode, e.character);
+    return new java.awt.event.KeyEvent(dummyComponent, 0, (long)e.time, convertModifiers(0, e.stateMask), convertKeyCode(e.keyCode), e.character);
   }
 
   public java.awt.event.MouseEvent convertMouseEvent(org.eclipse.swt.events.MouseEvent e) {
@@ -52,11 +55,18 @@ implements MouseListener, MouseMoveListener, MouseTrackListener, MouseWheelListe
     if ((e.button == 1) || (e.stateMask & SWT.BUTTON1) != 0) button = java.awt.event.MouseEvent.BUTTON1;
     else if ((e.button == 2) || (e.stateMask & SWT.BUTTON2) != 0) button = java.awt.event.MouseEvent.BUTTON2;
     else if ((e.button == 3) || (e.stateMask & SWT.BUTTON3) != 0) button = java.awt.event.MouseEvent.BUTTON3;
-    return new java.awt.event.MouseEvent(dummyComponent, 0, (long)e.time, convertModifiers(e.stateMask), e.x, e.y, e.count, false, button);
+    return new java.awt.event.MouseEvent(dummyComponent, 0, (long)e.time, convertModifiers(e.button,e.stateMask), e.x, e.y, e.count, false, button);
+  }
+  
+  public int convertKeyCode(int swtKeyCode) {
+         if (swtKeyCode >= 'a' && swtKeyCode <= 'z') {
+                 return Character.toUpperCase(swtKeyCode);
+         }
+         return swtKeyCode;
   }
 
   public java.awt.event.MouseWheelEvent convertMouseWheelEvent(org.eclipse.swt.events.MouseEvent e) {
-    return new java.awt.event.MouseWheelEvent(dummyComponent, 0, e.time, convertModifiers(e.stateMask), e.x, e.y, 0, false, java.awt.event.MouseWheelEvent.WHEEL_UNIT_SCROLL, 1, e.count);
+    return new java.awt.event.MouseWheelEvent(dummyComponent, 0, e.time, convertModifiers(e.button,e.stateMask), e.x, e.y, 0, false, java.awt.event.MouseWheelEvent.WHEEL_UNIT_SCROLL, 1, e.count);
   }
 
   public void keyPressed(KeyEvent e) {
@@ -85,12 +95,21 @@ implements MouseListener, MouseMoveListener, MouseTrackListener, MouseWheelListe
     }
   }
 
+  int x = 0;
+  int y = 0;
+  int d = 4;
+  
   public void mouseDown(MouseEvent e) {
     super.mousePressed(convertMouseEvent(e));
+    x = e.x;
+    y = e.y;
   }
 
   public void mouseUp(MouseEvent e) {
     super.mouseReleased(convertMouseEvent(e));
+    // Emulate AWT mouse clicks
+    if (Math.abs(x-e.x) < d && Math.abs(y-e.y) < d)
+       super.mouseClicked(convertMouseEvent(e));
   }
 
   public void mouseScrolled(MouseEvent e) {
index e68bd467d8d5ac91dc4f2791fb3ef82455a4cd24..84f2fb4169ef40b3b210c3821cc5b070ed5b044a 100644 (file)
@@ -144,8 +144,12 @@ public abstract class vtkAbstractComponent<T> implements vtkComponent<T> {
 
   public void Delete() {
     this.lock.lock();
+    this.renderer.DrawOff();
+    this.renderer.Delete();
     this.renderer = null;
+    this.camera.Delete();
     this.camera = null;
+    this.windowInteractor.Delete();
     this.windowInteractor = null;
     // removing the renderWindow is let to the superclass
     // because in the very special case of an AWT component
index af8a6e36e4ae4a161a33f0353a798f1d9859c5df..2c3bc67a795f3e0888a1b3a1c9887c93273aef1b 100644 (file)
@@ -312,11 +312,11 @@ public class vtkInteractorForwarder implements MouseListener, MouseMotionListene
       shiftPressed = (e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK ? 1 : 0;
       if (e.getWheelRotation() > 0) {
         component.getRenderWindowInteractor().SetEventInformationFlipY(lastX, lastY, ctrlPressed, shiftPressed, '0', 0, "0");
-        component.getRenderWindowInteractor().MouseWheelBackwardEvent();
+        component.getRenderWindowInteractor().MouseWheelForwardEvent();
       }
       else if (e.getWheelRotation() < 0) {
         component.getRenderWindowInteractor().SetEventInformationFlipY(lastX, lastY, ctrlPressed, shiftPressed, '0', 0, "0");
-        component.getRenderWindowInteractor().MouseWheelForwardEvent();
+        component.getRenderWindowInteractor().MouseWheelBackwardEvent();
       }
     } catch (InterruptedException interupt) {
       // Nothing to do