1 /** 2 * Copyright (c) 2011, Novyon Events 3 * 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * - Redistributions of source code must retain the above copyright notice, this 10 * list of conditions and the following disclaimer. 11 * 12 * - Redistributions in binary form must reproduce the above copyright notice, 13 * this list of conditions and the following disclaimer in the documentation 14 * and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * @author Anthyon 29 */ 30 package com.jme3.terrain.noise.filter; 31 32 import java.nio.FloatBuffer; 33 import java.util.ArrayList; 34 import java.util.List; 35 36 import com.jme3.terrain.noise.Filter; 37 38 public abstract class AbstractFilter implements Filter { 39 40 protected List<Filter> preFilters = new ArrayList<Filter>(); 41 protected List<Filter> postFilters = new ArrayList<Filter>(); 42 43 private boolean enabled = true; 44 45 @Override addPreFilter(Filter filter)46 public Filter addPreFilter(Filter filter) { 47 this.preFilters.add(filter); 48 return this; 49 } 50 51 @Override addPostFilter(Filter filter)52 public Filter addPostFilter(Filter filter) { 53 this.postFilters.add(filter); 54 return this; 55 } 56 57 @Override doFilter(float sx, float sy, float base, FloatBuffer data, int size)58 public FloatBuffer doFilter(float sx, float sy, float base, FloatBuffer data, int size) { 59 if (!this.isEnabled()) { 60 return data; 61 } 62 FloatBuffer retval = data; 63 for (Filter f : this.preFilters) { 64 retval = f.doFilter(sx, sy, base, retval, size); 65 } 66 retval = this.filter(sx, sy, base, retval, size); 67 for (Filter f : this.postFilters) { 68 retval = f.doFilter(sx, sy, base, retval, size); 69 } 70 return retval; 71 } 72 filter(float sx, float sy, float base, FloatBuffer buffer, int size)73 public abstract FloatBuffer filter(float sx, float sy, float base, FloatBuffer buffer, int size); 74 75 @Override getMargin(int size, int margin)76 public int getMargin(int size, int margin) { 77 // TODO sums up all the margins from filters... maybe there's a more 78 // efficient algorithm 79 if (!this.isEnabled()) { 80 return margin; 81 } 82 for (Filter f : this.preFilters) { 83 margin = f.getMargin(size, margin); 84 } 85 for (Filter f : this.postFilters) { 86 margin = f.getMargin(size, margin); 87 } 88 return margin; 89 } 90 91 @Override isEnabled()92 public boolean isEnabled() { 93 return this.enabled; 94 } 95 setEnabled(boolean enabled)96 public void setEnabled(boolean enabled) { 97 this.enabled = enabled; 98 } 99 100 } 101