Reworked the TestBlendEquations example (#848)
This commit is contained in:
parent
cd7c60cc59
commit
dd561a0c5b
@ -36,75 +36,106 @@ import com.jme3.light.DirectionalLight;
|
||||
import com.jme3.material.Material;
|
||||
import com.jme3.material.RenderState;
|
||||
import com.jme3.math.ColorRGBA;
|
||||
import com.jme3.math.FastMath;
|
||||
import com.jme3.math.Vector3f;
|
||||
import com.jme3.renderer.queue.RenderQueue;
|
||||
import com.jme3.scene.Geometry;
|
||||
import com.jme3.scene.Spatial;
|
||||
import com.jme3.scene.shape.Quad;
|
||||
|
||||
/**
|
||||
* This test demonstrates the usage of customized blend equations and factors on a material.<br/>
|
||||
* Customized blend equations and factors always requires {@link RenderState.BlendMode#Custom}.
|
||||
*
|
||||
* @author the_Minka
|
||||
*/
|
||||
public class TestBlendEquations extends SimpleApplication {
|
||||
|
||||
private Geometry leftQuad;
|
||||
private Geometry rightQuad;
|
||||
|
||||
private float timer;
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestBlendEquations app = new TestBlendEquations();
|
||||
app.start();
|
||||
}
|
||||
|
||||
public void simpleInitApp() {
|
||||
Geometry teaGeom = (Geometry) assetManager.loadModel("Models/Teapot/Teapot.obj");
|
||||
teaGeom.scale(6);
|
||||
teaGeom.getMaterial().getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Add);
|
||||
teaGeom.move(0, -2f, 0);
|
||||
cam.setLocation(new Vector3f(0f, 0.5f, 3f));
|
||||
viewPort.setBackgroundColor(ColorRGBA.LightGray);
|
||||
|
||||
DirectionalLight dl = new DirectionalLight();
|
||||
dl.setColor(ColorRGBA.Red);
|
||||
dl.setDirection(Vector3f.UNIT_XYZ.negate());
|
||||
// Add a light source to the scene.
|
||||
DirectionalLight directionalLight = new DirectionalLight();
|
||||
directionalLight.setColor(ColorRGBA.Magenta);
|
||||
directionalLight.setDirection(Vector3f.UNIT_XYZ.negate());
|
||||
rootNode.addLight(directionalLight);
|
||||
|
||||
rootNode.addLight(dl);
|
||||
rootNode.attachChild(teaGeom);
|
||||
|
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
|
||||
mat.setColor("Color", new ColorRGBA(0.5f, 0f, 1f, 0.3f));
|
||||
mat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Color);
|
||||
mat.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Subtract);
|
||||
|
||||
Geometry geo = new Geometry("BottomLeft", new Quad(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2));
|
||||
geo.setMaterial(mat);
|
||||
geo.setQueueBucket(RenderQueue.Bucket.Gui);
|
||||
geo.setLocalTranslation(0, 0, 1);
|
||||
|
||||
guiNode.attachChild(geo);
|
||||
|
||||
Material m = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
|
||||
m.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.ReverseSubtract);
|
||||
m.setColor("Color", new ColorRGBA(0.0f, 1f, 1.f, 1f));
|
||||
m.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.AlphaAdditive);
|
||||
|
||||
geo = new Geometry("BottomRight", new Quad(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2));
|
||||
geo.setMaterial(m);
|
||||
geo.setQueueBucket(RenderQueue.Bucket.Gui);
|
||||
geo.setLocalTranslation(guiViewPort.getCamera().getWidth() / 2, 0, 1);
|
||||
|
||||
guiNode.attachChild(geo);
|
||||
|
||||
m = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
|
||||
m.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Min);
|
||||
m.setColor("Color", new ColorRGBA(0.3f, 0f, 0.1f, 0.3f));
|
||||
m.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Additive);
|
||||
|
||||
geo = new Geometry("TopRight", new Quad(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2));
|
||||
geo.setMaterial(m);
|
||||
geo.setQueueBucket(RenderQueue.Bucket.Gui);
|
||||
geo.setLocalTranslation(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2, 1);
|
||||
|
||||
guiNode.attachChild(geo);
|
||||
|
||||
geo = new Geometry("OverTeaPot", new Quad(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2));
|
||||
geo.setMaterial(mat);
|
||||
geo.setQueueBucket(RenderQueue.Bucket.Transparent);
|
||||
geo.setLocalTranslation(0, -100, 5);
|
||||
|
||||
rootNode.attachChild(geo);
|
||||
// Create and add a teapot to the scene graph.
|
||||
Spatial teapotModel = assetManager.loadModel("Models/Teapot/Teapot.obj");
|
||||
rootNode.attachChild(teapotModel);
|
||||
|
||||
// Create the two moving quads with custom blend modes.
|
||||
createLeftQuad();
|
||||
createRightQuad();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a "transparent" quad to the scene, that shows an inverse blue value sight of the scene behind.
|
||||
*/
|
||||
private void createLeftQuad() {
|
||||
Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
|
||||
|
||||
// This color creates a blue value image. The effect will have a strength of 80% (set by the alpha value).
|
||||
material.setColor("Color", new ColorRGBA(0f, 0f, 1f, 0.8f));
|
||||
|
||||
// Result.RGB = Source.A * Source.RGB - Source.A * Destination.RGB
|
||||
// Result.A = Destination.A
|
||||
material.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Custom);
|
||||
material.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Subtract);
|
||||
material.getAdditionalRenderState().setBlendEquationAlpha(RenderState.BlendEquationAlpha.Add);
|
||||
material.getAdditionalRenderState().setCustomBlendFactors(
|
||||
RenderState.BlendFunc.Src_Alpha, RenderState.BlendFunc.Src_Alpha,
|
||||
RenderState.BlendFunc.Zero, RenderState.BlendFunc.One);
|
||||
|
||||
leftQuad = new Geometry("LeftQuad", new Quad(1f, 1f));
|
||||
leftQuad.setMaterial(material);
|
||||
leftQuad.setQueueBucket(RenderQueue.Bucket.Transparent);
|
||||
rootNode.attachChild(leftQuad);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a "transparent" quad to the scene, that limits the color values of the scene behind the object.<br/>
|
||||
* This effect can be good seen on bright areas of the scene (e.g. areas with specular lighting effects).
|
||||
*/
|
||||
private void createRightQuad() {
|
||||
Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
|
||||
material.setColor("Color", new ColorRGBA(0.4f, 0.4f, 0.4f, 1f));
|
||||
|
||||
// Min( Source , Destination)
|
||||
material.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Custom);
|
||||
material.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Min);
|
||||
material.getAdditionalRenderState().setBlendEquationAlpha(RenderState.BlendEquationAlpha.Min);
|
||||
|
||||
// In OpenGL no blend factors are used, when using the blend equations Min or Max!
|
||||
//material.getAdditionalRenderState().setCustomBlendFactors(
|
||||
// RenderState.BlendFunc.One, RenderState.BlendFunc.One,
|
||||
// RenderState.BlendFunc.One, RenderState.BlendFunc.One);
|
||||
|
||||
rightQuad = new Geometry("RightQuad", new Quad(1f, 1f));
|
||||
rightQuad.setMaterial(material);
|
||||
rightQuad.setQueueBucket(RenderQueue.Bucket.Transparent);
|
||||
rootNode.attachChild(rightQuad);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void simpleUpdate(float tpf) {
|
||||
timer += tpf;
|
||||
|
||||
float xOffset = FastMath.sin(timer * 0.5f) * 2f;
|
||||
leftQuad.setLocalTranslation(xOffset - 2f, 0f, 0.5f);
|
||||
rightQuad.setLocalTranslation(xOffset + 1f, 0f, 0.5f);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user