1 /* 2 * Copyright (c) 2009-2012 jMonkeyEngine 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 package com.jme3.post.filters; 33 34 import com.jme3.asset.AssetManager; 35 import com.jme3.export.InputCapsule; 36 import com.jme3.export.JmeExporter; 37 import com.jme3.export.JmeImporter; 38 import com.jme3.export.OutputCapsule; 39 import com.jme3.material.Material; 40 import com.jme3.math.ColorRGBA; 41 import com.jme3.post.Filter; 42 import com.jme3.renderer.RenderManager; 43 import com.jme3.renderer.ViewPort; 44 import java.io.IOException; 45 46 /** 47 * A filter to render a fog effect 48 * @author Rémy Bouquet aka Nehon 49 */ 50 public class FogFilter extends Filter { 51 52 private ColorRGBA fogColor = ColorRGBA.White.clone(); 53 private float fogDensity = 0.7f; 54 private float fogDistance = 1000; 55 56 /** 57 * Creates a FogFilter 58 */ FogFilter()59 public FogFilter() { 60 super("FogFilter"); 61 } 62 63 /** 64 * Create a fog filter 65 * @param fogColor the color of the fog (default is white) 66 * @param fogDensity the density of the fog (default is 0.7) 67 * @param fogDistance the distance of the fog (default is 1000) 68 */ FogFilter(ColorRGBA fogColor, float fogDensity, float fogDistance)69 public FogFilter(ColorRGBA fogColor, float fogDensity, float fogDistance) { 70 this(); 71 this.fogColor = fogColor; 72 this.fogDensity = fogDensity; 73 this.fogDistance = fogDistance; 74 } 75 76 @Override isRequiresDepthTexture()77 protected boolean isRequiresDepthTexture() { 78 return true; 79 } 80 81 @Override initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h)82 protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) { 83 material = new Material(manager, "Common/MatDefs/Post/Fog.j3md"); 84 material.setColor("FogColor", fogColor); 85 material.setFloat("FogDensity", fogDensity); 86 material.setFloat("FogDistance", fogDistance); 87 } 88 89 @Override getMaterial()90 protected Material getMaterial() { 91 92 return material; 93 } 94 95 96 /** 97 * returns the fog color 98 * @return 99 */ getFogColor()100 public ColorRGBA getFogColor() { 101 return fogColor; 102 } 103 104 /** 105 * Sets the color of the fog 106 * @param fogColor 107 */ setFogColor(ColorRGBA fogColor)108 public void setFogColor(ColorRGBA fogColor) { 109 if (material != null) { 110 material.setColor("FogColor", fogColor); 111 } 112 this.fogColor = fogColor; 113 } 114 115 /** 116 * returns the fog density 117 * @return 118 */ getFogDensity()119 public float getFogDensity() { 120 return fogDensity; 121 } 122 123 /** 124 * Sets the density of the fog, a high value gives a thick fog 125 * @param fogDensity 126 */ setFogDensity(float fogDensity)127 public void setFogDensity(float fogDensity) { 128 if (material != null) { 129 material.setFloat("FogDensity", fogDensity); 130 } 131 this.fogDensity = fogDensity; 132 } 133 134 /** 135 * returns the fog distance 136 * @return 137 */ getFogDistance()138 public float getFogDistance() { 139 return fogDistance; 140 } 141 142 /** 143 * the distance of the fog. the higer the value the distant the fog looks 144 * @param fogDistance 145 */ setFogDistance(float fogDistance)146 public void setFogDistance(float fogDistance) { 147 if (material != null) { 148 material.setFloat("FogDistance", fogDistance); 149 } 150 this.fogDistance = fogDistance; 151 } 152 153 @Override write(JmeExporter ex)154 public void write(JmeExporter ex) throws IOException { 155 super.write(ex); 156 OutputCapsule oc = ex.getCapsule(this); 157 oc.write(fogColor, "fogColor", ColorRGBA.White.clone()); 158 oc.write(fogDensity, "fogDensity", 0.7f); 159 oc.write(fogDistance, "fogDistance", 1000); 160 } 161 162 @Override read(JmeImporter im)163 public void read(JmeImporter im) throws IOException { 164 super.read(im); 165 InputCapsule ic = im.getCapsule(this); 166 fogColor = (ColorRGBA) ic.readSavable("fogColor", ColorRGBA.White.clone()); 167 fogDensity = ic.readFloat("fogDensity", 0.7f); 168 fogDistance = ic.readFloat("fogDistance", 1000); 169 } 170 171 172 } 173