All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.pepsoft.util.RandomField Maven / Gradle / Ivy

There is a newer version: 2.15.18
Show newest version
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.pepsoft.util;

/**
 *
 * @author pepijn
 */
public final class RandomField {
    public RandomField(int bits, double scale, long seed) {
        this.bits = bits;
        this.scale = scale;
        noiseGenerators = new PerlinNoise[bits];
        for (int i = 0; i < bits; i++) {
            noiseGenerators[i] = new PerlinNoise(seed + i);
        }
    }
    
    public int getValue(int x) {
        return getValue(x, 0, 0);
    }

    public int getValue(int x, int y) {
        return getValue(x, y, 0);
    }

    public int getValue(int x, int y, int z) {
        final double dX = x / scale, dY = y / scale, dZ = z / scale;
        switch (bits) {
            case 1:
                return noiseGenerators[0].getPerlinNoise(dX, dY, dZ) > 0 ? 1 : 0;
            case 2:
                return (noiseGenerators[0].getPerlinNoise(dX, dY, dZ) > 0 ? 2 : 0)
                     | (noiseGenerators[1].getPerlinNoise(dX, dY, dZ) > 0 ? 1 : 0);
            case 3:
                return (noiseGenerators[0].getPerlinNoise(dX, dY, dZ) > 0 ? 4 : 0)
                     | (noiseGenerators[1].getPerlinNoise(dX, dY, dZ) > 0 ? 2 : 0)
                     | (noiseGenerators[2].getPerlinNoise(dX, dY, dZ) > 0 ? 1 : 0);
            case 4:
                return (noiseGenerators[0].getPerlinNoise(dX, dY, dZ) > 0 ? 8 : 0)
                     | (noiseGenerators[1].getPerlinNoise(dX, dY, dZ) > 0 ? 4 : 0)
                     | (noiseGenerators[2].getPerlinNoise(dX, dY, dZ) > 0 ? 2 : 0)
                     | (noiseGenerators[3].getPerlinNoise(dX, dY, dZ) > 0 ? 1 : 0);
            default:
                int value = 0;
                for (int i = 0; i < bits; i++) {
                    value = (value << 1) | (noiseGenerators[i].getPerlinNoise(dX, dY, dZ) > 0 ? 1 : 0);
                }
                return value;
        }
    }
    
    // Properties
    
    public int getBits() {
        return bits;
    }

    public double getScale() {
        return scale;
    }

    public long getSeed() {
        return noiseGenerators[0].getSeed();
    }

    public void setSeed(long seed) {
        for (int i = 0; i < bits; i++) {
            noiseGenerators[i].setSeed(seed + i);
        }
    }
    
    private final int bits;
    private final double scale;
    private final PerlinNoise[] noiseGenerators;
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy