159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.post.filters; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AssetManager; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.InputCapsule; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeExporter; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeImporter; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.OutputCapsule; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.Material; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.ColorRGBA; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.post.Filter; 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.RenderManager; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.ViewPort; 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image.Format; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.ArrayList; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * BloomFilter is used to make objects in the scene have a glow effect.<br> 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * There are 2 mode : Scene and Objects.<br> 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Scene mode extracts the bright parts of the scene to make them glow<br> 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Object mode make objects glow according to their material's glowMap or their GlowColor<br> 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @see <a href="http://jmonkeyengine.org/wiki/doku.php/jme3:advanced:bloom_and_glow">advanced:bloom_and_glow</a> for more details 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Rémy Bouquet aka Nehon 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class BloomFilter extends Filter { 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * GlowMode specifies if the glow will be applied to the whole scene,or to objects that have aglow color or a glow map 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public enum GlowMode { 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Apply bloom filter to bright areas in the scene. 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Scene, 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Apply bloom only to objects that have a glow map or a glow color. 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Objects, 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Apply bloom to both bright parts of the scene and objects with glow map. 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta SceneAndObjects; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private GlowMode glowMode = GlowMode.Scene; 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //Bloom parameters 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float blurScale = 1.5f; 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float exposurePower = 5.0f; 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float exposureCutOff = 0.0f; 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float bloomIntensity = 2.0f; 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float downSamplingFactor = 1; 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Pass preGlowPass; 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Pass extractPass; 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Pass horizontalBlur = new Pass(); 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Pass verticalalBlur = new Pass(); 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Material extractMat; 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Material vBlurMat; 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Material hBlurMat; 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int screenWidth; 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int screenHeight; 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Creates a Bloom filter 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public BloomFilter() { 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super("BloomFilter"); 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Creates the bloom filter with the specific glow mode 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param glowMode 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public BloomFilter(GlowMode glowMode) { 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this(); 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.glowMode = glowMode; 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) { 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta screenWidth = (int) Math.max(1, (w / downSamplingFactor)); 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta screenHeight = (int) Math.max(1, (h / downSamplingFactor)); 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // System.out.println(screenWidth + " " + screenHeight); 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (glowMode != GlowMode.Scene) { 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta preGlowPass = new Pass(); 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta preGlowPass.init(renderManager.getRenderer(), screenWidth, screenHeight, Format.RGBA8, Format.Depth); 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta postRenderPasses = new ArrayList<Pass>(); 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //configuring extractPass 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta extractMat = new Material(manager, "Common/MatDefs/Post/BloomExtract.j3md"); 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta extractPass = new Pass() { 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean requiresSceneAsTexture() { 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void beforeRender() { 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta extractMat.setFloat("ExposurePow", exposurePower); 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta extractMat.setFloat("ExposureCutoff", exposureCutOff); 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (glowMode != GlowMode.Scene) { 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta extractMat.setTexture("GlowMap", preGlowPass.getRenderedTexture()); 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta extractMat.setBoolean("Extract", glowMode != GlowMode.Objects); 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }; 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta extractPass.init(renderManager.getRenderer(), screenWidth, screenHeight, Format.RGBA8, Format.Depth, 1, extractMat); 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta postRenderPasses.add(extractPass); 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //configuring horizontal blur pass 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hBlurMat = new Material(manager, "Common/MatDefs/Blur/HGaussianBlur.j3md"); 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta horizontalBlur = new Pass() { 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void beforeRender() { 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hBlurMat.setTexture("Texture", extractPass.getRenderedTexture()); 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hBlurMat.setFloat("Size", screenWidth); 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hBlurMat.setFloat("Scale", blurScale); 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }; 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta horizontalBlur.init(renderManager.getRenderer(), screenWidth, screenHeight, Format.RGBA8, Format.Depth, 1, hBlurMat); 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta postRenderPasses.add(horizontalBlur); 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //configuring vertical blur pass 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vBlurMat = new Material(manager, "Common/MatDefs/Blur/VGaussianBlur.j3md"); 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta verticalalBlur = new Pass() { 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void beforeRender() { 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vBlurMat.setTexture("Texture", horizontalBlur.getRenderedTexture()); 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vBlurMat.setFloat("Size", screenHeight); 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vBlurMat.setFloat("Scale", blurScale); 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }; 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta verticalalBlur.init(renderManager.getRenderer(), screenWidth, screenHeight, Format.RGBA8, Format.Depth, 1, vBlurMat); 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta postRenderPasses.add(verticalalBlur); 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //final material 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material = new Material(manager, "Common/MatDefs/Post/BloomFinal.j3md"); 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setTexture("BloomTex", verticalalBlur.getRenderedTexture()); 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Material getMaterial() { 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setFloat("BloomIntensity", bloomIntensity); 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return material; 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected void postQueue(RenderManager renderManager, ViewPort viewPort) { 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (glowMode != GlowMode.Scene) { 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta renderManager.getRenderer().setBackgroundColor(ColorRGBA.BlackNoAlpha); 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta renderManager.getRenderer().setFrameBuffer(preGlowPass.getRenderFrameBuffer()); 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta renderManager.getRenderer().clearBuffers(true, true, true); 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta renderManager.setForcedTechnique("Glow"); 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta renderManager.renderViewPortQueues(viewPort, false); 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta renderManager.setForcedTechnique(null); 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta renderManager.getRenderer().setFrameBuffer(viewPort.getOutputFrameBuffer()); 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returns the bloom intensity 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public float getBloomIntensity() { 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return bloomIntensity; 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * intensity of the bloom effect default is 2.0 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param bloomIntensity 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setBloomIntensity(float bloomIntensity) { 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.bloomIntensity = bloomIntensity; 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returns the blur scale 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public float getBlurScale() { 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return blurScale; 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * sets The spread of the bloom default is 1.5f 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param blurScale 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setBlurScale(float blurScale) { 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.blurScale = blurScale; 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returns the exposure cutoff<br> 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * for more details see {@link setExposureCutOff(float exposureCutOff)} 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public float getExposureCutOff() { 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return exposureCutOff; 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Define the color threshold on which the bloom will be applied (0.0 to 1.0) 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param exposureCutOff 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setExposureCutOff(float exposureCutOff) { 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.exposureCutOff = exposureCutOff; 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returns the exposure power<br> 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * form more details see {@link setExposurePower(float exposurePower)} 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public float getExposurePower() { 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return exposurePower; 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * defines how many time the bloom extracted color will be multiplied by itself. default id 5.0<br> 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * a high value will reduce rough edges in the bloom and somhow the range of the bloom area * 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param exposurePower 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setExposurePower(float exposurePower) { 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.exposurePower = exposurePower; 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returns the downSampling factor<br> 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * form more details see {@link setDownSamplingFactor(float downSamplingFactor)} 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public float getDownSamplingFactor() { 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return downSamplingFactor; 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Sets the downSampling factor : the size of the computed texture will be divided by this factor. default is 1 for no downsampling 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * A 2 value is a good way of widening the blur 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param downSamplingFactor 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setDownSamplingFactor(float downSamplingFactor) { 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.downSamplingFactor = downSamplingFactor; 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void write(JmeExporter ex) throws IOException { 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.write(ex); 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta OutputCapsule oc = ex.getCapsule(this); 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta oc.write(glowMode, "glowMode", GlowMode.Scene); 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta oc.write(blurScale, "blurScale", 1.5f); 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta oc.write(exposurePower, "exposurePower", 5.0f); 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta oc.write(exposureCutOff, "exposureCutOff", 0.0f); 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta oc.write(bloomIntensity, "bloomIntensity", 2.0f); 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta oc.write(downSamplingFactor, "downSamplingFactor", 1); 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void read(JmeImporter im) throws IOException { 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.read(im); 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta InputCapsule ic = im.getCapsule(this); 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glowMode = ic.readEnum("glowMode", GlowMode.class, GlowMode.Scene); 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta blurScale = ic.readFloat("blurScale", 1.5f); 30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta exposurePower = ic.readFloat("exposurePower", 5.0f); 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta exposureCutOff = ic.readFloat("exposureCutOff", 0.0f); 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bloomIntensity = ic.readFloat("bloomIntensity", 2.0f); 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta downSamplingFactor = ic.readFloat("downSamplingFactor", 1); 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 310