joglblendstate.java
来自「java 3d game jme 工程开发源代码」· Java 代码 · 共 430 行 · 第 1/2 页
JAVA
430 行
/*
* 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.scene.state.jogl;
import javax.media.opengl.GL;
import javax.media.opengl.glu.GLU;
import com.jme.renderer.RenderContext;
import com.jme.renderer.jogl.JOGLContextCapabilities;
import com.jme.scene.state.BlendState;
import com.jme.scene.state.jogl.records.BlendStateRecord;
import com.jme.system.DisplaySystem;
/**
* <code>JOGLBlendState</code> subclasses the BlendState using the JOGL API
* to set OpenGL's blending state params.
*
* @author Mark Powell
* @author Joshua Slack - reworked for StateRecords.
* @author Steve Vaughan - JOGL port
* @version $Id: JOGLBlendState.java 4091 2009-01-21 19:01:20Z joshua.j.ellen $
*/
public class JOGLBlendState extends BlendState {
private static final long serialVersionUID = 1L;
private static boolean inited = false;
/**
* Constructor instantiates a new <code>JOGLBlendState</code> object with
* default values.
*/
public JOGLBlendState(JOGLContextCapabilities caps) {
super();
if (!inited) {
supportsConstantColor = supportsEq = caps.GL_ARB_imaging;
supportsSeparateFunc = caps.GL_EXT_blend_func_separate;
supportsSeparateEq = caps.GL_EXT_blend_equation_separate;
supportsMinMax = caps.GL_EXT_blend_minmax;
supportsSubtract = caps.GL_EXT_blend_subtract;
// We're done initing! Wee! :)
inited = true;
}
}
/**
* <code>apply</code> is called to set the blend state. If blending is
* enabled, the blend function is set up and if alpha testing is enabled the
* alpha functions are set.
*
* @see com.jme.scene.state.RenderState#apply()
*/
public void apply() {
// ask for the current state record
RenderContext<?> context = DisplaySystem.getDisplaySystem()
.getCurrentContext();
BlendStateRecord record = (BlendStateRecord) context.getStateRecord(StateType.Blend);
context.currentStates[StateType.Blend.ordinal()] = this;
if (isEnabled()) {
applyBlendEquations(isBlendEnabled(), record);
applyBlendColor(isBlendEnabled(), record);
applyBlendFunctions(isBlendEnabled(), record);
applyTest(isTestEnabled(), record);
} else {
// disable blend
applyBlendEquations(false, record);
// disable alpha test
applyTest(false, record);
}
if (!record.isValid())
record.validate();
}
private void applyBlendEquations(boolean enabled, BlendStateRecord record) {
final GL gl = GLU.getCurrentGL();
if (record.isValid()) {
if (enabled) {
if (!record.blendEnabled) {
gl.glEnable(GL.GL_BLEND);
record.blendEnabled = true;
}
int blendEqRGB = getGLEquationValue(getBlendEquationRGB());
if (supportsSeparateEquations()) {
int blendEqAlpha = getGLEquationValue(getBlendEquationAlpha());
if (record.blendEqRGB != blendEqRGB
|| record.blendEqAlpha != blendEqAlpha) {
gl.glBlendEquationSeparateEXT(
blendEqRGB, blendEqAlpha);
record.blendEqRGB = blendEqRGB;
record.blendEqAlpha = blendEqAlpha;
}
} else if (supportsEq) {
if (record.blendEqRGB != blendEqRGB) {
gl.glBlendEquation(blendEqRGB);
record.blendEqRGB = blendEqRGB;
}
}
} else if (record.blendEnabled) {
gl.glDisable(GL.GL_BLEND);
record.blendEnabled = false;
}
} else {
if (enabled) {
gl.glEnable(GL.GL_BLEND);
record.blendEnabled = true;
int blendEqRGB = getGLEquationValue(getBlendEquationRGB());
if (supportsSeparateEquations()) {
int blendEqAlpha = getGLEquationValue(getBlendEquationAlpha());
gl.glBlendEquationSeparateEXT(
blendEqRGB, blendEqAlpha);
record.blendEqRGB = blendEqRGB;
record.blendEqAlpha = blendEqAlpha;
} else if (supportsEq) {
gl.glBlendEquation(blendEqRGB);
record.blendEqRGB = blendEqRGB;
}
} else {
gl.glDisable(GL.GL_BLEND);
record.blendEnabled = false;
}
}
}
private void applyBlendColor(boolean enabled, BlendStateRecord record) {
final GL gl = GLU.getCurrentGL();
if (record.isValid()) {
if (enabled) {
boolean applyConstant = getDestinationFunctionRGB()
.usesConstantColor()
|| getSourceFunctionRGB().usesConstantColor()
|| (supportsConstantColor() && (getDestinationFunctionAlpha()
.usesConstantColor() || getSourceFunctionAlpha()
.usesConstantColor()));
if (applyConstant && supportsConstantColor()) {
float r = 0, g = 0, b = 0, a = 0;
if (getConstantColor() != null) {
r = getConstantColor().r;
g = getConstantColor().g;
b = getConstantColor().b;
a = getConstantColor().a;
}
if (supportsConstantColor && (record.blendColor.r != r || record.blendColor.g != g
|| record.blendColor.b != b
|| record.blendColor.a != a)) {
gl.glBlendColor(r, g, b, a);
record.blendColor.set(r, g, b, a);
}
}
}
} else {
if (enabled) {
boolean applyConstant = getDestinationFunctionRGB()
.usesConstantColor()
|| getSourceFunctionRGB().usesConstantColor()
|| (supportsConstantColor() && (getDestinationFunctionAlpha()
.usesConstantColor() || getSourceFunctionAlpha()
.usesConstantColor()));
if (applyConstant && supportsConstantColor()) {
float r = 0, g = 0, b = 0, a = 0;
if (getConstantColor() != null) {
r = getConstantColor().r;
g = getConstantColor().g;
b = getConstantColor().b;
a = getConstantColor().a;
}
gl.glBlendColor(r, g, b, a);
record.blendColor.set(r, g, b, a);
}
}
}
}
private void applyBlendFunctions(boolean enabled, BlendStateRecord record) {
final GL gl = GLU.getCurrentGL();
if (record.isValid()) {
if (enabled) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?