Here's a (quick 'n' dirty) DiplaySystem implementation which makes it possible to use jME with SWT (using the new GLCanvas class from Eclipse 3.2). I wrote this in order to see if I could use jME in my current project, so it's far from perfect, but hey… it works for me
Comments are welcome, of course
To use it :
display = new SWTDisplaySystem();
GLCanvas canvas = display.createGLCanvas(parent, SWT.NONE);
display.createHeadlessDisplay(width, height, bpp);
Renderer renderer = display.getRenderer(); // actually it's an LWJGLRenderer instance
... do jME stuff...
canvas.swapBuffers();
Important : you MUST call canvas.swapBuffers() at the end of your rendering function
import java.awt.Canvas;
import java.util.logging.Level;
import org.eclipse.swt.opengl.GLCanvas;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Composite;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GLContext;
import org.lwjgl.opengl.RenderTexture;
import com.jme.renderer.Renderer;
import com.jme.renderer.RendererType;
import com.jme.renderer.TextureRenderer;
import com.jme.renderer.lwjgl.LWJGLRenderer;
import com.jme.renderer.lwjgl.LWJGLTextureRenderer;
import com.jme.system.DisplaySystem;
import com.jme.system.JmeException;
import com.jme.util.LoggingSystem;
public class SWTDisplaySystem extends DisplaySystem {
private LWJGLRenderer renderer;
private GLCanvas canvas;
public GLCanvas createGLCanvas(Composite parent, int style) {
GLData data = new GLData();
data.doubleBuffer = true;
canvas = new GLCanvas(parent, style, data);
return canvas;
}
public GLCanvas getCanvas() {
return canvas;
}
public void setCanvas(GLCanvas c) {
canvas = c;
}
@Override
public void createHeadlessWindow(int w, int h, int bpp) {
if ( w <= 0 || h <= 0) {
throw new JmeException("Invalid resolution values: " + w + " " + h);
}
else if ((bpp != 32) && (bpp != 24) && (bpp != 16)) {
throw new JmeException("Invalid pixel depth: " + bpp);
}
this.width = w;
this.height = h;
this.bpp = bpp;
DisplayMode mode = new DisplayMode(width, height);
try {
Display.setDisplayMode(mode);
canvas.setCurrent();
GLContext.useContext(canvas);
}
catch (Exception e) {
}
renderer = new LWJGLRenderer(width, height);
renderer.setHeadless(true);
updateStates(renderer);
created = true;
}
public Renderer getRenderer() {
return renderer;
}
@Override
public void close() {
Display.destroy();
}
@Override
public Canvas createCanvas(int w, int h) {
return null;
}
@Override
public TextureRenderer createTextureRenderer(int width, int height, boolean useRGB, boolean useRGBA, boolean useDepth, boolean isRectangle, int target, int mipmaps) {
if (!isCreated()) {
return null;
}
return new LWJGLTextureRenderer(width, height, (LWJGLRenderer) getRenderer(), new RenderTexture(useRGB, useRGBA, useDepth, isRectangle, target, mipmaps));
}
@Override
public TextureRenderer createTextureRenderer(int width, int height, boolean useRGB, boolean useRGBA, boolean useDepth, boolean isRectangle, int target, int mipmaps, int bpp, int alpha, int depth, int stencil, int samples) {
if (!isCreated()) {
return null;
}
return new LWJGLTextureRenderer(width, height, (LWJGLRenderer) getRenderer(), new RenderTexture(useRGB, useRGBA, useDepth, isRectangle, target, mipmaps), bpp, alpha, depth, stencil, samples);
}
@Override
public void createWindow(int w, int h, int bpp, int frq, boolean fs) {
// TODO: return an RCP Viewpart ?
return;
}
@Override
public RendererType getRendererType() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isClosing() {
if (canvas == null) {
return Display.isCloseRequested();
}
return false;
}
private DisplayMode getValidDisplayMode(int width, int height, int bpp, int freq) {
DisplayMode[] modes;
try {
modes = Display.getAvailableDisplayModes();
}
catch (LWJGLException e) {
e.printStackTrace();
return null;
}
for (int i = 0; i < modes.length; i++) {
if (modes[i].getWidth() == width && modes[i].getHeight() == height
&& modes[i].getBitsPerPixel() == bpp
&& (freq == 0 || modes[i].getFrequency() == freq)) {
return modes[i];
}
}
return null;
}
@Override
public boolean isValidDisplayMode(int width, int height, int bpp, int freq) {
return getValidDisplayMode(width, height, bpp, freq) != null;
}
@Override
public void recreateWindow(int w, int h, int bpp, int frq, boolean fs) {
return;
}
@Override
public void reset() {
return;
}
@Override
public void setRenderer(Renderer r) {
if (r instanceof LWJGLRenderer) {
renderer = (LWJGLRenderer) r;
}
else {
LoggingSystem.getLogger().log(Level.WARNING, "Invalid Renderer type");
}
}
@Override
public void setTitle(String title) {
Display.setTitle(title);
}
@Override
public void setVSyncEnabled(boolean enabled) {
Display.setVSyncEnabled(enabled);
}
@Override
protected void updateDisplayBGC() {
try {
Display.setDisplayConfiguration(gamma, brightness, contrast);
} catch (LWJGLException e) {
LoggingSystem.getLogger().warning("Unable to apply gamma/brightness/contrast settings: " + e.getMessage());
}
}
}