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.Material;
|
||||||
import com.jme3.material.RenderState;
|
import com.jme3.material.RenderState;
|
||||||
import com.jme3.math.ColorRGBA;
|
import com.jme3.math.ColorRGBA;
|
||||||
|
import com.jme3.math.FastMath;
|
||||||
import com.jme3.math.Vector3f;
|
import com.jme3.math.Vector3f;
|
||||||
import com.jme3.renderer.queue.RenderQueue;
|
import com.jme3.renderer.queue.RenderQueue;
|
||||||
import com.jme3.scene.Geometry;
|
import com.jme3.scene.Geometry;
|
||||||
|
import com.jme3.scene.Spatial;
|
||||||
import com.jme3.scene.shape.Quad;
|
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 {
|
public class TestBlendEquations extends SimpleApplication {
|
||||||
|
|
||||||
|
private Geometry leftQuad;
|
||||||
|
private Geometry rightQuad;
|
||||||
|
|
||||||
|
private float timer;
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
TestBlendEquations app = new TestBlendEquations();
|
TestBlendEquations app = new TestBlendEquations();
|
||||||
app.start();
|
app.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void simpleInitApp() {
|
public void simpleInitApp() {
|
||||||
Geometry teaGeom = (Geometry) assetManager.loadModel("Models/Teapot/Teapot.obj");
|
cam.setLocation(new Vector3f(0f, 0.5f, 3f));
|
||||||
teaGeom.scale(6);
|
viewPort.setBackgroundColor(ColorRGBA.LightGray);
|
||||||
teaGeom.getMaterial().getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Add);
|
|
||||||
teaGeom.move(0, -2f, 0);
|
|
||||||
|
|
||||||
DirectionalLight dl = new DirectionalLight();
|
// Add a light source to the scene.
|
||||||
dl.setColor(ColorRGBA.Red);
|
DirectionalLight directionalLight = new DirectionalLight();
|
||||||
dl.setDirection(Vector3f.UNIT_XYZ.negate());
|
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");
|
// Create and add a teapot to the scene graph.
|
||||||
mat.setColor("Color", new ColorRGBA(0.5f, 0f, 1f, 0.3f));
|
Spatial teapotModel = assetManager.loadModel("Models/Teapot/Teapot.obj");
|
||||||
mat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Color);
|
rootNode.attachChild(teapotModel);
|
||||||
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 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