📄 lwjglrenderer.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.renderer.lwjgl;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.Arrays;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import org.lwjgl.opengl.ARBBufferObject;
import org.lwjgl.opengl.ARBMultitexture;
import org.lwjgl.opengl.ARBVertexBufferObject;
import org.lwjgl.opengl.ContextCapabilities;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.EXTFogCoord;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import org.lwjgl.opengl.GLContext;
import org.lwjgl.opengl.OpenGLException;
import org.lwjgl.util.glu.GLU;
import com.jme.curve.Curve;
import com.jme.image.Image;
import com.jme.image.Texture;
import com.jme.math.FastMath;
import com.jme.math.Quaternion;
import com.jme.math.Vector3f;
import com.jme.renderer.Camera;
import com.jme.renderer.ColorRGBA;
import com.jme.renderer.RenderContext;
import com.jme.renderer.RenderQueue;
import com.jme.renderer.Renderer;
import com.jme.scene.Geometry;
import com.jme.scene.Line;
import com.jme.scene.Point;
import com.jme.scene.QuadMesh;
import com.jme.scene.Spatial;
import com.jme.scene.TexCoords;
import com.jme.scene.Text;
import com.jme.scene.TriMesh;
import com.jme.scene.VBOInfo;
import com.jme.scene.state.BlendState;
import com.jme.scene.state.ClipState;
import com.jme.scene.state.ColorMaskState;
import com.jme.scene.state.CullState;
import com.jme.scene.state.FogState;
import com.jme.scene.state.FragmentProgramState;
import com.jme.scene.state.GLSLShaderObjectsState;
import com.jme.scene.state.LightState;
import com.jme.scene.state.MaterialState;
import com.jme.scene.state.RenderState;
import com.jme.scene.state.ShadeState;
import com.jme.scene.state.StateRecord;
import com.jme.scene.state.StencilState;
import com.jme.scene.state.TextureState;
import com.jme.scene.state.VertexProgramState;
import com.jme.scene.state.WireframeState;
import com.jme.scene.state.ZBufferState;
import com.jme.scene.state.lwjgl.LWJGLBlendState;
import com.jme.scene.state.lwjgl.LWJGLClipState;
import com.jme.scene.state.lwjgl.LWJGLColorMaskState;
import com.jme.scene.state.lwjgl.LWJGLCullState;
import com.jme.scene.state.lwjgl.LWJGLFogState;
import com.jme.scene.state.lwjgl.LWJGLFragmentProgramState;
import com.jme.scene.state.lwjgl.LWJGLLightState;
import com.jme.scene.state.lwjgl.LWJGLMaterialState;
import com.jme.scene.state.lwjgl.LWJGLShadeState;
import com.jme.scene.state.lwjgl.LWJGLShaderObjectsState;
import com.jme.scene.state.lwjgl.LWJGLStencilState;
import com.jme.scene.state.lwjgl.LWJGLTextureState;
import com.jme.scene.state.lwjgl.LWJGLVertexProgramState;
import com.jme.scene.state.lwjgl.LWJGLWireframeState;
import com.jme.scene.state.lwjgl.LWJGLZBufferState;
import com.jme.scene.state.lwjgl.records.LineRecord;
import com.jme.scene.state.lwjgl.records.RendererRecord;
import com.jme.scene.state.lwjgl.records.TextureStateRecord;
import com.jme.system.DisplaySystem;
import com.jme.system.JmeException;
import com.jme.util.Debug;
import com.jme.util.WeakIdentityCache;
import com.jme.util.geom.BufferUtils;
import com.jme.util.stat.StatCollector;
import com.jme.util.stat.StatType;
/**
* <code>LWJGLRenderer</code> provides an implementation of the
* <code>Renderer</code> interface using the LWJGL API.
*
* @see com.jme.renderer.Renderer
* @author Mark Powell - initial implementation, and more.
* @author Joshua Slack - Further work, Optimizations, Headless rendering
* @author Tijl Houtbeckers - Small optimizations and improved VBO
* @version $Id: LWJGLRenderer.java,v 1.149 2008/04/21 03:14:33 renanse Exp $
*/
public class LWJGLRenderer extends Renderer {
private static final Logger logger = Logger.getLogger(LWJGLRenderer.class
.getName());
private Vector3f vRot = new Vector3f();
private LWJGLFont font;
private boolean supportsVBO = false;
private boolean supportsFogCoords = false;
private boolean indicesVBO = false;
private boolean inOrthoMode;
private Vector3f tempVa = new Vector3f();
private FloatBuffer prevVerts;
private FloatBuffer prevFogCoords;
private FloatBuffer prevNorms;
private FloatBuffer prevColor;
private FloatBuffer[] prevTex;
private int prevNormMode = GL11.GL_ZERO;
protected ContextCapabilities capabilities;
private int prevTextureNumber = 0;
private boolean generatingDisplayList = false;
protected WeakIdentityCache<Buffer, Integer> vboMap = new WeakIdentityCache<Buffer, Integer>();
/**
* Constructor instantiates a new <code>LWJGLRenderer</code> object. The
* size of the rendering window is passed during construction.
*
* @param width
* the width of the rendering context.
* @param height
* the height of the rendering context.
*/
public LWJGLRenderer(int width, int height) {
if (width <= 0 || height <= 0) {
logger.warning("Invalid width and/or height values.");
throw new JmeException("Invalid width and/or height values.");
}
this.width = width;
this.height = height;
logger.info( "LWJGLRenderer created. W: " + width + "H: " + height +
"\tVersion: " + org.lwjgl.Sys.getVersion() );
capabilities = GLContext.getCapabilities();
queue = new RenderQueue(this);
if (TextureState.getNumberOfTotalUnits() == -1)
createTextureState(); // force units population
prevTex = new FloatBuffer[TextureState.getNumberOfTotalUnits()];
supportsVBO = capabilities.GL_ARB_vertex_buffer_object;
supportsFogCoords = capabilities.GL_EXT_fog_coord;
}
/**
* Reinitialize the renderer with the given width/height. Also calls resize
* on the attached camera if present.
*
* @param width
* int
* @param height
* int
*/
public void reinit(int width, int height) {
if (width <= 0 || height <= 0) {
logger.warning("Invalid width and/or height values.");
throw new JmeException("Invalid width and/or height values.");
}
this.width = width;
this.height = height;
if (camera != null) {
camera.resize(width, height);
camera.apply();
}
capabilities = GLContext.getCapabilities();
}
/**
* <code>setCamera</code> sets the camera this renderer is using. It
* asserts that the camera is of type <code>LWJGLCamera</code>.
*
* @see com.jme.renderer.Renderer#setCamera(com.jme.renderer.Camera)
*/
public void setCamera(final Camera camera) {
// Check that this isn't the same camera to avoid unnecessary work.
if (camera == this.camera)
return;
if (camera instanceof LWJGLCamera) {
this.camera = (LWJGLCamera) camera;
// Update dimensions for the newly associated camera and apply the
// changes.
((LWJGLCamera) this.camera).resize(width, height, true);
this.camera.apply();
}
}
/**
* <code>createCamera</code> returns a default camera for use with the
* LWJGL renderer.
*
* @param width
* the width of the frame.
* @param height
* the height of the frame.
* @return a default LWJGL camera.
*/
public Camera createCamera(int width, int height) {
return new LWJGLCamera(width, height);
}
/**
* <code>createBlendState</code> returns a new LWJGLBlendState object as a
* regular BlendState.
*
* @return an BlendState object.
*/
public BlendState createBlendState() {
return new LWJGLBlendState();
}
/**
* <code>createCullState</code> returns a new LWJGLCullState object as a
* regular CullState.
*
* @return a CullState object.
* @see com.jme.renderer.Renderer#createCullState()
*/
public CullState createCullState() {
return new LWJGLCullState();
}
/**
* <code>createFogState</code> returns a new LWJGLFogState object as a
* regular FogState.
*
* @return an FogState object.
*/
public FogState createFogState() {
return new LWJGLFogState();
}
/**
* <code>createLightState</code> returns a new LWJGLLightState object as a
* regular LightState.
*
* @return an LightState object.
*/
public LightState createLightState() {
return new LWJGLLightState();
}
/**
* <code>createMaterialState</code> returns a new LWJGLMaterialState
* object as a regular MaterialState.
*
* @return an MaterialState object.
*/
public MaterialState createMaterialState() {
return new LWJGLMaterialState();
}
/**
* <code>createShadeState</code> returns a new LWJGLShadeState object as a
* regular ShadeState.
*
* @return an ShadeState object.
*/
public ShadeState createShadeState() {
return new LWJGLShadeState();
}
/**
* <code>createTextureState</code> returns a new LWJGLTextureState object
* as a regular TextureState.
*
* @return an TextureState object.
*/
public TextureState createTextureState() {
return new LWJGLTextureState();
}
/**
* <code>createWireframeState</code> returns a new LWJGLWireframeState
* object as a regular WireframeState.
*
* @return an WireframeState object.
*/
public WireframeState createWireframeState() {
return new LWJGLWireframeState();
}
/**
* <code>createZBufferState</code> returns a new LWJGLZBufferState object
* as a regular ZBufferState.
*
* @return a ZBufferState object.
*/
public ZBufferState createZBufferState() {
return new LWJGLZBufferState();
}
/**
* <code>createVertexProgramState</code> returns a new
* LWJGLVertexProgramState object as a regular VertexProgramState.
*
* @return a LWJGLVertexProgramState object.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -