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