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.modulator;
31 
32 import java.util.HashMap;
33 import java.util.Map;
34 
35 import com.jme3.terrain.noise.ShaderUtils;
36 
37 public class CatRom2 implements Modulator {
38 
39 	private int sampleRate = 100;
40 
41 	private final float[] table;
42 
43 	private static Map<Integer, CatRom2> instances = new HashMap<Integer, CatRom2>();
44 
CatRom2(final int sampleRate)45 	public CatRom2(final int sampleRate) {
46 		this.sampleRate = sampleRate;
47 		this.table = new float[4 * sampleRate + 1];
48 		for (int i = 0; i < 4 * sampleRate + 1; i++) {
49 			float x = i / (float) sampleRate;
50 			x = (float) Math.sqrt(x);
51 			if (x < 1) {
52 				this.table[i] = 0.5f * (2 + x * x * (-5 + x * 3));
53 			} else {
54 				this.table[i] = 0.5f * (4 + x * (-8 + x * (5 - x)));
55 			}
56 		}
57 	}
58 
getInstance(final int sampleRate)59 	public static CatRom2 getInstance(final int sampleRate) {
60 		if (!CatRom2.instances.containsKey(sampleRate)) {
61 			CatRom2.instances.put(sampleRate, new CatRom2(sampleRate));
62 		}
63 		return CatRom2.instances.get(sampleRate);
64 	}
65 
66 	@Override
value(final float... in)67 	public float value(final float... in) {
68 		if (in[0] >= 4) {
69 			return 0;
70 		}
71 		in[0] = in[0] * this.sampleRate + 0.5f;
72 		int i = ShaderUtils.floor(in[0]);
73 		if (i >= 4 * this.sampleRate + 1) {
74 			return 0;
75 		}
76 		return this.table[i];
77 	}
78 }
79