package graphics; public class NoiseTexture { public final static int PLAIN = 0, ABS = 1, INVERSE_F = 3, ABS_INVERSE_F = 4, SIN = 5; //types of noise public final static int ADD = 0, MULTIPLY = 1; public final static int R = 0, G = 1, B = 2, N = 4, S = 8; //target (N = normal, S = specular) public double amp = 1; public double ani = -1; //animation speed public double xfreq, yfreq, zfreq; public int type = PLAIN; public int op = ADD; public int target = N; boolean animated = true; public NoiseTexture(double a, double xf, double yf, double zf, int t, int o, int tgt) { amp = a; xfreq = xf; yfreq = yf; zfreq = zf; type = t; op = o; target = tgt; } public NoiseTexture(double a, double f, int t, int o, int tgt) { amp = a; xfreq = yfreq = zfreq = f; type = t; op = o; target = tgt; } public NoiseTexture(double xf, double yf, double zf) { xfreq = xf; yfreq = yf; zfreq = zf; } public NoiseTexture(double f) { xfreq = yfreq = zfreq = f; } //gets a single noise value public double get(double x, double y, double z) { switch (type) { case PLAIN: return amp * ImprovedNoise.noise(xfreq*2*x, yfreq*2*y, zfreq*2*z); case ABS: return amp * Math.abs(ImprovedNoise.noise(xfreq*2*x, yfreq*2*y, zfreq*2*z)); case INVERSE_F: return amp * inverseFNoise(xfreq, yfreq, zfreq, x, y, z, false); case ABS_INVERSE_F: return amp * inverseFNoise(xfreq, yfreq, zfreq, x, y, z, true); case SIN: return amp * Math.sin(x + inverseFNoise(xfreq, yfreq, zfreq, x, y, z, true)); default: return 0; } } //sum(1/f) noise public static double inverseFNoise(double xfreq, double yfreq, double zfreq, double x, double y, double z, boolean abs) { double sum = 0; double a = 1; for (int i=1; i < 256; i <<= 1) { double n = a * ImprovedNoise.noise(i * xfreq*2*x, i * yfreq*2*y, i * zfreq*2*z); if (abs) n = Math.abs(n); sum += n; a *= 0.5; } //if (abs) sum = Math.abs(sum); return sum; } }