]> gerrit.simantics Code Review - simantics/3d.git/blob - vtk.rendering/src/vtk/rendering/swt/vtkSwtComponent.java
Various fixes to vtk swt components
[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   /**
39    * Set the size of the VTK component
40    * @param x width
41    * @param y height
42    */
43   @Override
44   public void setSize(int x, int y) {
45     x = x < 1 ? 1 : x;
46     y = y < 1 ? 1 : y;
47     super.setSize(x, y);
48     this.uiComponent.setSize(x, y);
49     this.uiComponent.redraw();
50     this.uiComponent.update();
51   }
52
53   /**
54    * Render the VTK component. Should not be called externally.
55    * Call update() to refresh the window content.
56    */
57   @Override
58   public void Render() {
59     // Make sure we can render
60     if (inRenderCall || renderer == null || renderWindow == null) {
61       return;
62     }
63
64     // Try to render
65     try {
66       lock.lockInterruptibly();
67       inRenderCall = true;
68       // Trigger the real render
69       renderWindow.Render();
70     } catch (InterruptedException e) {
71       // Nothing that we can do except skipping execution
72     } finally {
73       lock.unlock();
74       inRenderCall = false;
75     }
76   }
77
78   /**
79    * Redraw the VTK component
80    */
81   public void update() {
82     this.uiComponent.redraw();
83     this.uiComponent.update();
84   }
85
86   /**
87    * @return the encapsulated SWT component (a GLCanvas instance)
88    * @see vtk.rendering.vtkAbstractComponent#getComponent()
89    */
90   @Override
91   public GLCanvas getComponent() {
92     return this.uiComponent;
93   }
94
95   @Override
96   public void Delete() {
97     this.lock.lock();
98     // We prevent any further rendering
99     this.inRenderCall = true;
100     this.renderWindow.Delete();
101     this.renderWindow = null;
102     super.Delete();
103     this.lock.unlock();
104   }
105
106   /**
107    * @return true if the graphical component has been properly set and
108    *         operation can be performed on it.
109    */
110   public boolean isWindowSet() {
111     return this.isWindowCreated;
112   }
113
114   /**
115    * Just allow class in same package to affect inRenderCall boolean
116    *
117    * @param value
118    */
119   protected void updateInRenderCall(boolean value) {
120     this.inRenderCall = value;
121   }
122
123   /** This method is called by the VTK JNI code. Do not remove. */
124   void startEvent() {
125     if (!getComponent().getContext().isCurrent()) {
126       getComponent().getContext().makeCurrent();
127     }
128   }
129
130   /** This method is called by the VTK JNI code. Do not remove. */
131   void endEvent() {
132     if (getComponent().getContext().isCurrent()) {
133       getComponent().swapBuffers();
134       getComponent().getContext().release();
135     }
136   }
137 }