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 */
30package com.jme3.terrain.noise.basis;
31
32import java.nio.FloatBuffer;
33import java.util.ArrayList;
34import java.util.List;
35
36import com.jme3.terrain.noise.Basis;
37import com.jme3.terrain.noise.modulator.Modulator;
38import com.jme3.terrain.noise.modulator.NoiseModulator;
39
40/**
41 * Utility base class for Noise implementations
42 *
43 * @author Anthyon
44 *
45 */
46public abstract class Noise implements Basis {
47
48	protected List<Modulator> modulators = new ArrayList<Modulator>();
49
50	protected float scale = 1.0f;
51
52	@Override
53	public String toString() {
54		return this.getClass().getSimpleName();
55	}
56
57	@Override
58	public FloatBuffer getBuffer(float sx, float sy, float base, int size) {
59		FloatBuffer retval = FloatBuffer.allocate(size * size);
60		for (int y = 0; y < size; y++) {
61			for (int x = 0; x < size; x++) {
62				retval.put(this.modulate((sx + x) / size, (sy + y) / size, base));
63			}
64		}
65		return retval;
66	}
67
68	public float modulate(float x, float y, float z) {
69		float retval = this.value(x, y, z);
70		for (Modulator m : this.modulators) {
71			if (m instanceof NoiseModulator) {
72				retval = m.value(retval);
73			}
74		}
75		return retval;
76	}
77
78	@Override
79	public Basis addModulator(Modulator modulator) {
80		this.modulators.add(modulator);
81		return this;
82	}
83
84	@Override
85	public Basis setScale(float scale) {
86		this.scale = scale;
87		return this;
88	}
89
90	@Override
91	public float getScale() {
92		return this.scale;
93	}
94}
95