📄 lwjglrenderer.java
字号:
*/
public VertexProgramState createVertexProgramState() {
return new LWJGLVertexProgramState();
}
/**
* <code>createFragmentProgramState</code> returns a new
* LWJGLFragmentProgramState object as a regular FragmentProgramState.
*
* @return a LWJGLFragmentProgramState object.
*/
public FragmentProgramState createFragmentProgramState() {
return new LWJGLFragmentProgramState();
}
/**
* <code>createShaderObjectsState</code> returns a new
* LWJGLShaderObjectsState object as a regular ShaderObjectsState.
*
* @return an ShaderObjectsState object.
*/
public GLSLShaderObjectsState createGLSLShaderObjectsState() {
return new LWJGLShaderObjectsState();
}
/**
* <code>createStencilState</code> returns a new LWJGLStencilState object
* as a regular StencilState.
*
* @return a StencilState object.
*/
public StencilState createStencilState() {
return new LWJGLStencilState();
}
/**
* <code>createClipState</code> returns a new LWJGLClipState object as a
* regular ClipState.
*
* @return a ClipState object.
* @see com.jme.renderer.Renderer#createClipState()
*/
public ClipState createClipState() {
return new LWJGLClipState();
}
/**
* <code>createColorMaskState</code> returns a new LWJGLColorMaskState
* object as a regular ColorMaskState.
*
* @return a ColorMaskState object.
*/
public ColorMaskState createColorMaskState() {
return new LWJGLColorMaskState();
}
/**
* <code>setBackgroundColor</code> sets the OpenGL clear color to the
* color specified.
*
* @see com.jme.renderer.Renderer#setBackgroundColor(com.jme.renderer.ColorRGBA)
* @param c
* the color to set the background color to.
*/
public void setBackgroundColor(ColorRGBA c) {
// if color is null set background to white.
if (c == null) {
backgroundColor.a = 1.0f;
backgroundColor.b = 1.0f;
backgroundColor.g = 1.0f;
backgroundColor.r = 1.0f;
} else {
backgroundColor = c;
}
GL11.glClearColor(backgroundColor.r, backgroundColor.g,
backgroundColor.b, backgroundColor.a);
}
/**
* <code>clearZBuffer</code> clears the OpenGL depth buffer.
*
* @see com.jme.renderer.Renderer#clearZBuffer()
*/
public void clearZBuffer() {
if (Renderer.defaultStateList[RenderState.StateType.ZBuffer.ordinal()] != null)
Renderer.defaultStateList[RenderState.StateType.ZBuffer.ordinal()].apply();
GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
}
/**
* <code>clearBackBuffer</code> clears the OpenGL color buffer.
*
* @see com.jme.renderer.Renderer#clearColorBuffer()
*/
public void clearColorBuffer() {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
}
/**
* <code>clearStencilBuffer</code>
*
* @see com.jme.renderer.Renderer#clearStencilBuffer()
*/
public void clearStencilBuffer() {
// Clear the stencil buffer
GL11.glClearStencil(0);
GL11.glStencilMask(~0);
GL11.glDisable(GL11.GL_DITHER);
GL11.glEnable(GL11.GL_SCISSOR_TEST);
GL11.glScissor(0, 0, getWidth(), getHeight());
GL11.glClear(GL11.GL_STENCIL_BUFFER_BIT);
GL11.glDisable(GL11.GL_SCISSOR_TEST);
}
/**
* <code>clearBuffers</code> clears both the color and the depth buffer.
*
* @see com.jme.renderer.Renderer#clearBuffers()
*/
public void clearBuffers() {
// make sure no funny business is going on in the z before clearing.
if (Renderer.defaultStateList[RenderState.StateType.ZBuffer.ordinal()] != null) {
Renderer.defaultStateList[RenderState.StateType.ZBuffer.ordinal()].setNeedsRefresh(true);
Renderer.defaultStateList[RenderState.StateType.ZBuffer.ordinal()].apply();
}
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
}
/**
* <code>clearBuffers</code> clears both the color and the depth buffer
* for only the part of the buffer defined by the renderer width/height.
*
* @see com.jme.renderer.Renderer#clearBuffers()
*/
public void clearStrictBuffers() {
GL11.glDisable(GL11.GL_DITHER);
GL11.glEnable(GL11.GL_SCISSOR_TEST);
GL11.glScissor(0, 0, width, height);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glDisable(GL11.GL_SCISSOR_TEST);
GL11.glEnable(GL11.GL_DITHER);
}
/**
* <code>displayBackBuffer</code> renders any queued items then flips the
* rendered buffer (back) with the currently displayed buffer.
*
* @see com.jme.renderer.Renderer#displayBackBuffer()
*/
public void displayBackBuffer() {
renderQueue();
Renderer.defaultStateList[RenderState.StateType.ColorMask.ordinal()].apply();
reset();
GL11.glFlush();
if (!isHeadless()) {
if (Debug.stats) {
StatCollector.startStat(StatType.STAT_DISPLAYSWAP_TIMER);
}
Display.update();
if (Debug.stats) {
StatCollector.endStat(StatType.STAT_DISPLAYSWAP_TIMER);
}
}
vboMap.expunge();
if (Debug.stats) {
StatCollector.addStat(StatType.STAT_FRAMES, 1);
}
}
// XXX: look more at this
public void reset() {
prevColor = prevNorms = prevVerts = prevFogCoords = null;
Arrays.fill(prevTex, null);
}
public boolean isInOrthoMode() {
return inOrthoMode;
}
/**
* <code>setOrtho</code> sets the display system to be in orthographic
* mode. If the system has already been set to orthographic mode a
* <code>JmeException</code> is thrown. The origin (0,0) is the bottom
* left of the screen.
*/
public void setOrtho() {
if (inOrthoMode) {
throw new JmeException("Already in Orthographic mode.");
}
// set up ortho mode
RendererRecord matRecord = (RendererRecord) DisplaySystem
.getDisplaySystem().getCurrentContext().getRendererRecord();
matRecord.switchMode(GL11.GL_PROJECTION);
GL11.glPushMatrix();
GL11.glLoadIdentity();
float viewportWidth = width * (camera.getViewPortRight() - camera.getViewPortLeft());
float viewportHeight = height * (camera.getViewPortTop() - camera.getViewPortBottom());
GLU.gluOrtho2D(0, viewportWidth, 0, viewportHeight);
matRecord.switchMode(GL11.GL_MODELVIEW);
GL11.glPushMatrix();
GL11.glLoadIdentity();
inOrthoMode = true;
}
public void setOrthoCenter() {
if (inOrthoMode) {
throw new JmeException("Already in Orthographic mode.");
}
// set up ortho mode
RendererRecord matRecord = (RendererRecord) DisplaySystem
.getDisplaySystem().getCurrentContext().getRendererRecord();
matRecord.switchMode(GL11.GL_PROJECTION);
GL11.glPushMatrix();
GL11.glLoadIdentity();
GLU.gluOrtho2D(-width / 2f, width / 2f, -height / 2f, height / 2f);
matRecord.switchMode(GL11.GL_MODELVIEW);
GL11.glPushMatrix();
GL11.glLoadIdentity();
inOrthoMode = true;
}
/**
* <code>setOrthoCenter</code> sets the display system to be in
* orthographic mode. If the system has already been set to orthographic
* mode a <code>JmeException</code> is thrown. The origin (0,0) is the
* center of the screen.
*/
public void unsetOrtho() {
if (!inOrthoMode) {
throw new JmeException("Not in Orthographic mode.");
}
// remove ortho mode, and go back to original
// state
RendererRecord matRecord = (RendererRecord) DisplaySystem
.getDisplaySystem().getCurrentContext().getRendererRecord();
matRecord.switchMode(GL11.GL_PROJECTION);
GL11.glPopMatrix();
matRecord.switchMode(GL11.GL_MODELVIEW);
GL11.glPopMatrix();
inOrthoMode = false;
}
/**
* <code>takeScreenShot</code> saves the current buffer to a file. The
* file name is provided, and .png will be appended. True is returned if the
* capture was successful, false otherwise.
*
* @param filename
* the name of the file to save.
* @return true if successful, false otherwise.
*/
public boolean takeScreenShot(String filename) {
if (null == filename) {
throw new JmeException("Screenshot filename cannot be null");
}
File out = new File(filename + ".png");
logger.info("Taking screenshot: " + out.getAbsolutePath() );
// Create a pointer to the image info and create a buffered image to
// hold it.
ByteBuffer buff = BufferUtils.createByteBuffer(width * height * 3);
grabScreenContents(buff, Image.Format.RGB8, 0, 0, width, height);
BufferedImage img = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// Grab each pixel information and set it to the BufferedImage info.
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
int index = 3 * ((height - y - 1) * width + x);
int argb = (((int) (buff.get(index+0)) & 0xFF) << 16) //r
| (((int) (buff.get(index+1)) & 0xFF) << 8) //g
| (((int) (buff.get(index+2)) & 0xFF)); //b
img.setRGB(x, y, argb);
}
}
// write out the screenshot image to a file.
try {
return ImageIO.write(img, "png", out);
} catch (IOException e) {
logger.warning("Could not create file: " + filename + ".png");
return false;
}
}
/**
* <code>grabScreenContents</code> reads a block of pixels from the
* current framebuffer.
*
* @param buff
* a buffer to store contents in.
* @param format
* the format to read
* @param x -
* x starting point of block
* @param y -
* y starting point of block
* @param w -
* width of block
* @param h -
* height of block
*/
public void grabScreenContents(ByteBuffer buff, Image.Format format, int x,
int y, int w, int h) {
int pixFormat = TextureStateRecord.getGLPixelFormat(format);
GL11.glReadPixels(x, y, w, h, pixFormat, GL11.GL_UNSIGNED_BYTE, buff);
}
/**
* <code>draw</code> renders a curve object.
*
* @param curve
* the curve object to render.
*/
public void draw(Curve curve) {
// set world matrix
Quaternion rotation = curve.getWorldRotation();
Vector3f translation = curve.getWorldTranslation();
Vector3f scale = curve.getWorldScale();
float rot = rotation.toAngleAxis(vRot) * FastMath.RAD_TO_DEG;
RendererRecord matRecord = (RendererRecord) DisplaySystem
.getDisplaySystem().getCurrentContext().getRendererRecord();
matRecord.switchMode(GL11.GL_MODELVIEW);
GL11.glPushMatrix();
GL11.glTranslatef(translation.x, translation.y, translation.z);
GL11.glRotatef(rot, vRot.x, vRot.y, vRot.z);
GL11.glScalef(scale.x, scale.y, scale.z);
applyStates(curve.states, null);
// render the object
GL11.glBegin(GL11.GL_LINE_STRIP);
FloatBuffer color = curve.getColorBuffer();
if (color != null)
color.rewind();
float colorInterval = 0;
float colorModifier = 0;
if (null != color) {
matRecord.setCurrentColor(color.get(), color.get(), color.get(),
color.get());
colorInterval = 4f / color.limit();
colorModifier = colorInterval;
color.rewind();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -