* Tried to fix canvas + multisampling bug by creating 1 sample pbuffer

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8167 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
sha..rd 13 years ago
parent 471f449017
commit 71cb644853
  1. 120
      engine/src/lwjgl-ogl/com/jme3/system/lwjgl/LwjglCanvas.java

@ -65,9 +65,13 @@ public class LwjglCanvas extends LwjglAbstractDisplay implements JmeCanvasContex
private Thread renderThread; private Thread renderThread;
private boolean runningFirstTime = true; private boolean runningFirstTime = true;
private boolean mouseWasGrabbed = false; private boolean mouseWasGrabbed = false;
private boolean mouseWasCreated = false;
private boolean keyboardWasCreated = false;
private Pbuffer pbuffer; private Pbuffer pbuffer;
private PixelFormat pixelFormat; private PixelFormat pbufferFormat;
private PixelFormat canvasFormat;
private class GLCanvas extends Canvas { private class GLCanvas extends Canvas {
@Override @Override
@ -201,9 +205,17 @@ public class LwjglCanvas extends LwjglAbstractDisplay implements JmeCanvasContex
} }
private void pauseCanvas(){ private void pauseCanvas(){
if (Mouse.isCreated() && Mouse.isGrabbed()){ if (Mouse.isCreated()){
Mouse.setGrabbed(false); if (Mouse.isGrabbed()){
mouseWasGrabbed = true; Mouse.setGrabbed(false);
mouseWasGrabbed = true;
}
mouseWasCreated = true;
Mouse.destroy();
}
if (Keyboard.isCreated()){
keyboardWasCreated = true;
Keyboard.destroy();
} }
logger.log(Level.INFO, "OGL: Canvas will become invisible! Destroying .."); logger.log(Level.INFO, "OGL: Canvas will become invisible! Destroying ..");
@ -233,9 +245,20 @@ public class LwjglCanvas extends LwjglAbstractDisplay implements JmeCanvasContex
logger.log(Level.INFO, "OGL: Display is active!"); logger.log(Level.INFO, "OGL: Display is active!");
if (Mouse.isCreated() && mouseWasGrabbed){ try {
Mouse.setGrabbed(true); if (mouseWasCreated){
mouseWasGrabbed = false; Mouse.create();
if (mouseWasGrabbed){
Mouse.setGrabbed(true);
mouseWasGrabbed = false;
}
}
if (keyboardWasCreated){
Keyboard.create();
keyboardWasCreated = false;
}
} catch (LWJGLException ex){
logger.log(Level.SEVERE, "Encountered exception when restoring input", ex);
} }
SwingUtilities.invokeLater(new Runnable(){ SwingUtilities.invokeLater(new Runnable(){
@ -249,15 +272,26 @@ public class LwjglCanvas extends LwjglAbstractDisplay implements JmeCanvasContex
* It seems it is best to use one pixel format for all shared contexts. * It seems it is best to use one pixel format for all shared contexts.
* See http://developer.apple.com/library/mac/#qa/qa1248/_index.html. * See http://developer.apple.com/library/mac/#qa/qa1248/_index.html.
*/ */
protected PixelFormat acquirePixelFormat(){ protected PixelFormat acquirePixelFormat(boolean forPbuffer){
if (pixelFormat == null){ if (forPbuffer){
pixelFormat = new PixelFormat(settings.getBitsPerPixel(), if (pbufferFormat == null){
0, pbufferFormat = new PixelFormat(settings.getBitsPerPixel(),
settings.getDepthBits(), 0,
settings.getStencilBits(), settings.getDepthBits(),
settings.getSamples()); settings.getStencilBits(),
0);
}
return pbufferFormat;
}else{
if (canvasFormat == null){
canvasFormat = new PixelFormat(settings.getBitsPerPixel(),
0,
settings.getDepthBits(),
settings.getStencilBits(),
settings.getSamples());
}
return canvasFormat;
} }
return pixelFormat;
} }
/** /**
@ -271,7 +305,7 @@ public class LwjglCanvas extends LwjglAbstractDisplay implements JmeCanvasContex
} }
if (pbuffer == null) { if (pbuffer == null) {
pbuffer = new Pbuffer(1, 1, acquirePixelFormat(), null); pbuffer = new Pbuffer(1, 1, acquirePixelFormat(true), null);
logger.log(Level.INFO, "OGL: Pbuffer has been created"); logger.log(Level.INFO, "OGL: Pbuffer has been created");
} }
} }
@ -298,37 +332,41 @@ public class LwjglCanvas extends LwjglAbstractDisplay implements JmeCanvasContex
}else{ }else{
// The context thread is no longer running. // The context thread is no longer running.
// Destroy pbuffer. // Destroy pbuffer.
if (pbuffer != null){ if (pbuffer != null && !pbuffer.isBufferLost()){
pbuffer.destroy(); pbuffer.destroy();
pbuffer = null;
} }
} }
if (Display.isCreated()){ if (Display.isCreated()){
/* FIXES:
/* FIXES: * org.lwjgl.LWJGLException: X Error
* org.lwjgl.LWJGLException: X Error * BadWindow (invalid Window parameter) request_code: 2 minor_code: 0
* BadWindow (invalid Window parameter) request_code: 2 minor_code: 0 *
* * Destroying keyboard early prevents the error above, triggered
* Destroying keyboard early prevents the error above, triggered * by destroying keyboard in by Display.destroy() or Display.setParent(null).
* by destroying keyboard in by Display.destroy() or Display.setParent(null). * Therefore Keyboard.destroy() should precede any of these calls.
* Therefore Keyboard.destroy() should precede any of these calls. */
*/ if (Keyboard.isCreated()){
Keyboard.destroy(); // Should only happen if called in
// LwjglAbstractDisplay.deinitInThread().
try { Keyboard.destroy();
// NOTE: On Windows XP, not calling setParent(null) }
// freezes the application.
// On Mac it freezes the application. try {
// On Linux it fixes a crash with X Window System. // NOTE: On Windows XP, not calling setParent(null)
if (JmeSystem.getPlatform() == Platform.Windows32 // freezes the application.
|| JmeSystem.getPlatform() == Platform.Windows64){ // On Mac it freezes the application.
Display.setParent(null); // On Linux it fixes a crash with X Window System.
if (JmeSystem.getPlatform() == Platform.Windows32
|| JmeSystem.getPlatform() == Platform.Windows64){
Display.setParent(null);
}
} catch (LWJGLException ex) {
logger.log(Level.SEVERE, "Encountered exception when setting parent to null", ex);
} }
} catch (LWJGLException ex) {
logger.log(Level.SEVERE, "Encountered exception when setting parent to null", ex);
}
Display.destroy(); Display.destroy();
} }
} catch (LWJGLException ex) { } catch (LWJGLException ex) {
listener.handleError("Failed make pbuffer available", ex); listener.handleError("Failed make pbuffer available", ex);
@ -359,7 +397,7 @@ public class LwjglCanvas extends LwjglAbstractDisplay implements JmeCanvasContex
Display.setVSyncEnabled(settings.isVSync()); Display.setVSyncEnabled(settings.isVSync());
Display.setParent(canvas); Display.setParent(canvas);
Display.create(acquirePixelFormat(), pbuffer); Display.create(acquirePixelFormat(false), pbuffer);
// because the display is a different opengl context // because the display is a different opengl context
// must reset the context state. // must reset the context state.

Loading…
Cancel
Save