/*
* Copyright (c) 2009-2012 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.jme3.renderer;
import com.jme3.material.RenderState;
import com.jme3.math.ColorRGBA;
import com.jme3.scene.Mesh;
import com.jme3.scene.VertexBuffer;
import com.jme3.shader.Shader;
import com.jme3.texture.FrameBuffer;
import com.jme3.texture.Image;
/**
* Represents the current state of the graphics library. This class is used
* internally to reduce state changes. NOTE: This class is specific to OpenGL.
*/
public class RenderContext {
/**
* @see RenderState#setFaceCullMode(com.jme3.material.RenderState.FaceCullMode)
*/
public RenderState.FaceCullMode cullMode = RenderState.FaceCullMode.Off;
/**
* @see RenderState#setDepthTest(boolean)
*/
public boolean depthTestEnabled = false;
/**
* @see RenderState#setDepthWrite(boolean)
*/
public boolean depthWriteEnabled = true;
/**
* @see RenderState#setColorWrite(boolean)
*/
public boolean colorWriteEnabled = true;
/**
* @see Renderer#setClipRect(int, int, int, int)
*/
public boolean clipRectEnabled = false;
/**
* @see RenderState#setPolyOffset(float, float)
*/
public boolean polyOffsetEnabled = false;
/**
* @see RenderState#setPolyOffset(float, float)
*/
public float polyOffsetFactor = 0;
/**
* @see RenderState#setPolyOffset(float, float)
*/
public float polyOffsetUnits = 0;
/**
* @see Mesh#setPointSize(float)
*/
public float pointSize = 1;
/**
* @see RenderState#setLineWidth(float)
*/
public float lineWidth = 1;
/**
* @see RenderState#setBlendMode(com.jme3.material.RenderState.BlendMode)
*/
public RenderState.BlendMode blendMode = RenderState.BlendMode.Off;
/**
* @see RenderState#setBlendEquation(com.jme3.material.RenderState.BlendEquation)
*/
public RenderState.BlendEquation blendEquation = RenderState.BlendEquation.Add;
/**
* @see RenderState#setBlendEquationAlpha(com.jme3.material.RenderState.BlendEquationAlpha)
*/
public RenderState.BlendEquationAlpha blendEquationAlpha = RenderState.BlendEquationAlpha.InheritColor;
/**
* @see RenderState#setWireframe(boolean)
*/
public boolean wireframe = false;
/**
* @see Renderer#setShader(com.jme3.shader.Shader)
*/
public int boundShaderProgram;
/**
* @see Renderer#setShader(com.jme3.shader.Shader)
*/
public Shader boundShader;
/**
* @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
*/
public int boundFBO = 0;
/**
* @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
*/
public FrameBuffer boundFB;
/**
* Currently bound Renderbuffer
*
* @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
*/
public int boundRB = 0;
/**
* Currently bound draw buffer
* -2 = GL_NONE
* -1 = GL_BACK
* 0 = GL_COLOR_ATTACHMENT0
* n = GL_COLOR_ATTACHMENTn
* where n is an integer greater than 1
*
* @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
* @see FrameBuffer#setTargetIndex(int)
*/
public int boundDrawBuf = -1;
/**
* Currently bound read buffer
*
* @see RenderContext#boundDrawBuf
* @see Renderer#setFrameBuffer(com.jme3.texture.FrameBuffer)
* @see FrameBuffer#setTargetIndex(int)
*/
public int boundReadBuf = -1;
/**
* Currently bound element array vertex buffer.
*
* @see Renderer#renderMesh(com.jme3.scene.Mesh, int, int)
*/
public int boundElementArrayVBO;
/**
* @see Renderer#renderMesh(com.jme3.scene.Mesh, int, int)
*/
public int boundVertexArray;
/**
* Currently bound array vertex buffer.
*
* @see Renderer#renderMesh(com.jme3.scene.Mesh, int, int)
*/
public int boundArrayVBO;
/**
* Currently bound pixel pack pixel buffer.
*/
public int boundPixelPackPBO;
public int numTexturesSet = 0;
/**
* Current bound texture IDs for each texture unit.
*
* @see Renderer#setTexture(int, com.jme3.texture.Texture)
*/
public Image[] boundTextures = new Image[16];
/**
* IDList for texture units
*
* @see Renderer#setTexture(int, com.jme3.texture.Texture)
*/
public IDList textureIndexList = new IDList();
/**
* Currently bound texture unit
*
* @see Renderer#setTexture(int, com.jme3.texture.Texture)
*/
public int boundTextureUnit = 0;
/**
* Stencil Buffer state
*/
public boolean stencilTest = false;
public RenderState.StencilOperation frontStencilStencilFailOperation = RenderState.StencilOperation.Keep;
public RenderState.StencilOperation frontStencilDepthFailOperation = RenderState.StencilOperation.Keep;
public RenderState.StencilOperation frontStencilDepthPassOperation = RenderState.StencilOperation.Keep;
public RenderState.StencilOperation backStencilStencilFailOperation = RenderState.StencilOperation.Keep;
public RenderState.StencilOperation backStencilDepthFailOperation = RenderState.StencilOperation.Keep;
public RenderState.StencilOperation backStencilDepthPassOperation = RenderState.StencilOperation.Keep;
public RenderState.TestFunction frontStencilFunction = RenderState.TestFunction.Always;
public RenderState.TestFunction backStencilFunction = RenderState.TestFunction.Always;
/**
* Vertex attribs currently bound and enabled. If a slot is null, then
* it is disabled.
*/
public VertexBuffer[] boundAttribs = new VertexBuffer[16];
/**
* IDList for vertex attributes
*/
public IDList attribIndexList = new IDList();
/**
* depth test function
*/
public RenderState.TestFunction depthFunc = RenderState.TestFunction.Less;
/**
* alpha test function
*/
public RenderState.TestFunction alphaFunc = RenderState.TestFunction.Greater;
public int initialDrawBuf;
public int initialReadBuf;
public ColorRGBA clearColor = new ColorRGBA(0,0,0,0);
/**
* Reset the RenderContext to default GL state
*/
public void reset(){
cullMode = RenderState.FaceCullMode.Off;
depthTestEnabled = false;
depthWriteEnabled = false;
colorWriteEnabled = false;
clipRectEnabled = false;
polyOffsetEnabled = false;
polyOffsetFactor = 0;
polyOffsetUnits = 0;
pointSize = 1;
blendMode = RenderState.BlendMode.Off;
blendEquation = RenderState.BlendEquation.Add;
blendEquationAlpha = RenderState.BlendEquationAlpha.InheritColor;
wireframe = false;
boundShaderProgram = 0;
boundShader = null;
boundFBO = 0;
boundFB = null;
boundRB = 0;
boundDrawBuf = -1;
boundReadBuf = -1;
boundElementArrayVBO = 0;
boundVertexArray = 0;
boundArrayVBO = 0;
boundPixelPackPBO = 0;
numTexturesSet = 0;
for (int i = 0; i < boundTextures.length; i++)
boundTextures[i] = null;
textureIndexList.reset();
boundTextureUnit = 0;
for (int i = 0; i < boundAttribs.length; i++)
boundAttribs[i] = null;
attribIndexList.reset();
stencilTest = false;
frontStencilStencilFailOperation = RenderState.StencilOperation.Keep;
frontStencilDepthFailOperation = RenderState.StencilOperation.Keep;
frontStencilDepthPassOperation = RenderState.StencilOperation.Keep;
backStencilStencilFailOperation = RenderState.StencilOperation.Keep;
backStencilDepthFailOperation = RenderState.StencilOperation.Keep;
backStencilDepthPassOperation = RenderState.StencilOperation.Keep;
frontStencilFunction = RenderState.TestFunction.Always;
backStencilFunction = RenderState.TestFunction.Always;
depthFunc = RenderState.TestFunction.LessOrEqual;
alphaFunc = RenderState.TestFunction.Greater;
clearColor.set(0,0,0,0);
}
}