📄 lwjgldisplaysystem.java
字号:
/*
* Copyright (c) 2003-2009 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme.system.lwjgl;
import java.awt.Toolkit;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.ARBMultisample;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GLContext;
import org.lwjgl.opengl.Pbuffer;
import org.lwjgl.opengl.PixelFormat;
import com.jme.image.Image;
import com.jme.renderer.RenderContext;
import com.jme.renderer.Renderer;
import com.jme.renderer.TextureRenderer;
import com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer;
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.system.canvas.CanvasConstructor;
import com.jme.system.canvas.JMECanvas;
import com.jme.util.ImageUtils;
import com.jme.util.WeakIdentityCache;
/**
* <code>LWJGLDisplaySystem</code> defines an implementation of
* <code>DisplaySystem</code> that uses the LWJGL API for window creation and
* rendering via OpenGL. <code>LWJGLRenderer</code> is also created that gives
* a way of displaying data to the created window.
*
* @author Mark Powell
* @author Gregg Patton
* @author Joshua Slack - Optimizations, Headless rendering, RenderContexts, AWT integration
* @version $Id: LWJGLDisplaySystem.java,v 1.54 2007/09/11 15:52:25 nca Exp $
*/
public class LWJGLDisplaySystem extends DisplaySystem {
private static final Logger logger = Logger.getLogger(LWJGLDisplaySystem.class.getName());
private LWJGLRenderer renderer;
private Pbuffer headlessDisplay;
private RenderContext<? extends Object> currentContext = null;
private WeakIdentityCache<Object, RenderContext<? extends Object>> contextStore = new WeakIdentityCache<Object, RenderContext<? extends Object>>();
/**
* Constructor instantiates a new <code>LWJGLDisplaySystem</code> object.
* During instantiation confirmation is made to determine if the LWJGL API
* is installed properly. If not, a JmeException is thrown.
*/
public LWJGLDisplaySystem() {
super();
logger.info("LWJGL Display System created.");
}
/**
* @see com.jme.system.DisplaySystem#isValidDisplayMode(int, int, int, int)
*/
public boolean isValidDisplayMode( int width, int height, int bpp, int freq ) {
return getValidDisplayMode( width, height, bpp, freq ) != null;
}
/**
* @see com.jme.system.DisplaySystem#setVSyncEnabled(boolean)
*/
public void setVSyncEnabled( boolean enabled ) {
Display.setVSyncEnabled( enabled );
}
/**
* <code>setTitle</code> sets the window title of the created window.
*
* @param title the title.
*/
public void setTitle( String title ) {
Display.setTitle( title );
}
/**
* <code>createWindow</code> will create a LWJGL display context. This
* window will be a purely native context as defined by the LWJGL API.
*
* @see com.jme.system.DisplaySystem#createWindow(int, int, int, int,
* boolean)
*/
public void createWindow( int w, int h, int bpp, int frq, boolean fs ) throws JmeException {
// confirm that the parameters are valid.
if ( w <= 0 || h <= 0 ) {
throw new JmeException( "Invalid resolution values: " + w + " " + h );
}
else if ( ( bpp != 32 ) && ( bpp != 16 ) && ( bpp != 24 ) ) {
throw new JmeException( "Invalid pixel depth: " + bpp );
}
// set the window attributes
this.width = w;
this.height = h;
this.bpp = bpp;
this.frq = frq;
this.fs = fs;
initDisplay();
renderer = new LWJGLRenderer( width, height );
switchContext(this);
updateStates( renderer );
created = true;
}
/**
* <code>createHeadlessWindow</code> will create a headless LWJGL display
* context. This window will be a purely native context as defined by the
* LWJGL API.
*
* @see com.jme.system.DisplaySystem#createHeadlessWindow(int, int, int)
*/
public void createHeadlessWindow( int w, int h, int bpp ) {
// confirm that the parameters are valid.
if ( w <= 0 || h <= 0 ) {
throw new JmeException( "Invalid resolution values: " + w + " " + h );
}
else if ( ( bpp != 32 ) && ( bpp != 16 ) && ( bpp != 24 ) ) {
throw new JmeException( "Invalid pixel depth: " + bpp );
}
// set the window attributes
this.width = w;
this.height = h;
this.bpp = bpp;
initHeadlessDisplay();
renderer = new LWJGLRenderer( width, height );
switchContext(this);
renderer.setHeadless( true );
updateStates( renderer );
created = true;
}
/**
* <code>createCanvas</code> will create an OpenGL capable Canvas context. This
* window will be a purely native context as defined by the LWJGL API.
*
* @see com.jme.system.DisplaySystem#createCanvas(int, int)
*/
@Override
public JMECanvas createCanvas( int w, int h) {
return this.createCanvas(w, h, "AWT", new HashMap<String, Object>());
}
/**
* <code>createCanvas</code> will create an OpenGL capable Canvas context. This
* window will be a purely native context as defined by the LWJGL API.
*
* @see com.jme.system.DisplaySystem#createCanvas(int, int, String, HashMap)
*/
@Override
public JMECanvas createCanvas(int w, int h, String type, HashMap<String, Object> props) {
// confirm that the parameters are valid.
if ( w <= 0 || h <= 0 ) {
throw new JmeException( "Invalid resolution values: " + w + " " + h );
}
// Retrieve registered constructor, or throw an exception.
CanvasConstructor constructor = makeCanvasConstructor(type);
// set the window attributes
this.width = w;
this.height = h;
JMECanvas newCanvas = constructor.makeCanvas(props);
currentContext = new RenderContext<JMECanvas>(newCanvas);
contextStore.put(newCanvas, currentContext);
created = true;
return newCanvas;
}
/**
* Returns the Pbuffer used for headless display or null if not headless.
*
* @return Pbuffer
*/
public Pbuffer getHeadlessDisplay() {
return headlessDisplay;
}
/**
* <code>recreateWindow</code> will recreate a LWJGL display context. This
* window will be a purely native context as defined by the LWJGL API.
* <p/>
* If a window is not already created, it calls createWindow and exits.
* Other wise it calls reinitDisplay and renderer.reinit(width,height)
*
* @see com.jme.system.DisplaySystem#recreateWindow(int, int, int, int,
* boolean)
*/
public void recreateWindow( int w, int h, int bpp, int frq, boolean fs ) {
if ( !created ) {
createWindow( w, h, bpp, frq, fs );
return;
}
// confirm that the parameters are valid.
if ( w <= 0 || h <= 0 ) {
throw new JmeException( "Invalid resolution values: " + w + " " + h );
}
else if ( ( bpp != 32 ) && ( bpp != 16 ) && ( bpp != 24 ) ) {
throw new JmeException( "Invalid pixel depth: " + bpp );
}
// set the window attributes
this.width = w;
this.height = h;
this.bpp = bpp;
this.frq = frq;
this.fs = fs;
reinitDisplay();
renderer.reinit( width, height );
}
/**
* <code>getRenderer</code> returns the created rendering class for LWJGL (
* <code>LWJGLRenderer</code>). This will give the needed access to
* display data to the window.
*
* @see com.jme.system.DisplaySystem#getRenderer()
*/
public LWJGLRenderer getRenderer() {
return renderer;
}
/**
* <code>isClosing</code> returns any close requests. True if any exist,
* false otherwise.
*
* @return true if a close request is active.
* @see com.jme.system.DisplaySystem#isClosing()
*/
public boolean isClosing() {
if ( headlessDisplay == null ) {
return Display.isCloseRequested();
}
return false;
}
@Override
public boolean isActive()
{
return Display.isActive();
}
/**
* <code>reset</code> prepares the window for closing or restarting.
*
* @see com.jme.system.DisplaySystem#reset()
*/
public void reset() {
}
/**
* <code>close</code> destroys the LWJGL Display context.
*/
public void close() {
Display.destroy();
}
/**
* <code>createTextureRenderer</code> builds the renderer used to render
* to a texture.
*/
public TextureRenderer createTextureRenderer( int width, int height, TextureRenderer.Target target) {
if ( !isCreated() ) {
return null;
}
TextureRenderer textureRenderer = new LWJGLTextureRenderer( width, height,
this, renderer);
if (!textureRenderer.isSupported()) {
logger.info("FBO not supported, attempting Pbuffer.");
textureRenderer = new LWJGLPbufferTextureRenderer( width, height,
this, renderer, target);
}
return textureRenderer;
}
/**
* <code>getValidDisplayMode</code> returns a <code>DisplayMode</code>
* object that has the requested width, height and color depth. If there is
* no mode that supports a requested resolution, null is returned.
*
* @param width the width of the desired mode.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -