]> gerrit.simantics Code Review - simantics/3d.git/blob - vtk.rendering/src/vtk/rendering/swt/vtkSwtComponent.java
VTK.Rendering plug-in + win64 fragment
[simantics/3d.git] / vtk.rendering / src / vtk / rendering / swt / vtkSwtComponent.java
1 package vtk.rendering.swt;
2
3 import org.eclipse.swt.widgets.Composite;
4
5 import com.jogamp.opengl.swt.GLCanvas;
6
7 import vtk.vtkRenderWindow;
8 import vtk.rendering.vtkAbstractComponent;
9
10 /**
11  * Provide SWT based vtk rendering component
12  *
13  * @author    Joachim Pouderoux - joachim.pouderoux@kitware.com, Kitware SAS 2012
14  * @copyright This work was supported by CEA/CESTA
15  *            Commissariat a l'Energie Atomique et aux Energies Alternatives,
16  *            15 avenue des Sablieres, CS 60001, 33116 Le Barp, France.
17  */
18 public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
19
20   protected vtkInternalSwtComponent uiComponent;
21   protected boolean isWindowCreated;
22
23   public vtkSwtComponent(Composite parentComposite) {
24     this(new vtkRenderWindow(), parentComposite);
25   }
26
27   public vtkSwtComponent(vtkRenderWindow renderWindowToUse, Composite parentComposite) {
28     super(renderWindowToUse);
29     this.eventForwarder = new vtkSwtInteractorForwarderDecorator(this, this.eventForwarder);
30     this.isWindowCreated = true;
31     this.uiComponent = new vtkInternalSwtComponent(this, parentComposite);
32
33     renderWindow.AddObserver("StartEvent", this, "startEvent");
34     renderWindow.AddObserver("EndEvent", this, "endEvent");
35   }
36
37   /**
38    * Set the size of the VTK component
39    * @param x width
40    * @param y height
41    */
42   @Override
43   public void setSize(int x, int y) {
44     x = x < 1 ? 1 : x;
45     y = y < 1 ? 1 : y;
46     super.setSize(x, y);
47     this.uiComponent.setSize(x, y);
48     this.uiComponent.redraw();
49     this.uiComponent.update();
50   }
51
52   /**
53    * Render the VTK component. Should not be called externally.
54    * Call update() to refresh the window content.
55    */
56   @Override
57   public void Render() {
58     // Make sure we can render
59     if (inRenderCall || renderer == null || renderWindow == null) {
60       return;
61     }
62
63     // Try to render
64     try {
65       lock.lockInterruptibly();
66       inRenderCall = true;
67       // Trigger the real render
68       renderWindow.Render();
69     } catch (InterruptedException e) {
70       // Nothing that we can do except skipping execution
71     } finally {
72       lock.unlock();
73       inRenderCall = false;
74     }
75   }
76
77   /**
78    * Redraw the VTK component
79    */
80   public void update() {
81     this.uiComponent.redraw();
82     this.uiComponent.update();
83   }
84
85   /**
86    * @return the encapsulated SWT component (a GLCanvas instance)
87    * @see vtk.rendering.vtkAbstractComponent#getComponent()
88    */
89   @Override
90   public GLCanvas getComponent() {
91     return this.uiComponent;
92   }
93
94   @Override
95   public void Delete() {
96     this.lock.lock();
97     // We prevent any further rendering
98     this.inRenderCall = true;
99     this.renderWindow = null;
100     super.Delete();
101     this.lock.unlock();
102   }
103
104   /**
105    * @return true if the graphical component has been properly set and
106    *         operation can be performed on it.
107    */
108   public boolean isWindowSet() {
109     return this.isWindowCreated;
110   }
111
112   /**
113    * Just allow class in same package to affect inRenderCall boolean
114    *
115    * @param value
116    */
117   protected void updateInRenderCall(boolean value) {
118     this.inRenderCall = value;
119   }
120
121   /** This method is called by the VTK JNI code. Do not remove. */
122   void startEvent() {
123     if (!getComponent().getContext().isCurrent()) {
124       getComponent().getContext().makeCurrent();
125     }
126   }
127
128   /** This method is called by the VTK JNI code. Do not remove. */
129   void endEvent() {
130     if (getComponent().getContext().isCurrent()) {
131       getComponent().swapBuffers();
132       getComponent().getContext().release();
133     }
134   }
135 }