• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 class IterativeFilter extends AbstractFilter {
39 
40 	private int iterations;
41 
42 	private List<Filter> preIterateFilters = new ArrayList<Filter>();
43 	private List<Filter> postIterateFilters = new ArrayList<Filter>();
44 	private Filter filter;
45 
46 	@Override
getMargin(int size, int margin)47 	public int getMargin(int size, int margin) {
48 		if (!this.isEnabled()) {
49 			return margin;
50 		}
51 		for (Filter f : this.preIterateFilters) {
52 			margin = f.getMargin(size, margin);
53 		}
54 		margin = this.filter.getMargin(size, margin);
55 		for (Filter f : this.postIterateFilters) {
56 			margin = f.getMargin(size, margin);
57 		}
58 		return this.iterations * margin + super.getMargin(size, margin);
59 	}
60 
setIterations(int iterations)61 	public void setIterations(int iterations) {
62 		this.iterations = iterations;
63 	}
64 
getIterations()65 	public int getIterations() {
66 		return this.iterations;
67 	}
68 
addPostIterateFilter(Filter filter)69 	public IterativeFilter addPostIterateFilter(Filter filter) {
70 		this.postIterateFilters.add(filter);
71 		return this;
72 	}
73 
addPreIterateFilter(Filter filter)74 	public IterativeFilter addPreIterateFilter(Filter filter) {
75 		this.preIterateFilters.add(filter);
76 		return this;
77 	}
78 
setFilter(Filter filter)79 	public void setFilter(Filter filter) {
80 		this.filter = filter;
81 	}
82 
83 	@Override
filter(float sx, float sy, float base, FloatBuffer data, int size)84 	public FloatBuffer filter(float sx, float sy, float base, FloatBuffer data, int size) {
85 		if (!this.isEnabled()) {
86 			return data;
87 		}
88 		FloatBuffer retval = data;
89 
90 		for (int i = 0; i < this.iterations; i++) {
91 			for (Filter f : this.preIterateFilters) {
92 				retval = f.doFilter(sx, sy, base, retval, size);
93 			}
94 			retval = this.filter.doFilter(sx, sy, base, retval, size);
95 			for (Filter f : this.postIterateFilters) {
96 				retval = f.doFilter(sx, sy, base, retval, size);
97 			}
98 		}
99 
100 		return retval;
101 	}
102 }
103