Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private static final float AMPLITUDE = 8f;
- private static final int OCTAVES = 6;
- private static final float ROUGHNESS = 0.3f;
- private Random random = new Random();
- private int seed;
- private int xOffset = 0;
- private int zOffset = 0;
- public TerrainPerlinNoise(Random rand, float roughness, float width, float height) {
- random = (rand == null) ? new Random() : rand;
- this.seed = random.nextInt(1000000000);
- }
- public float generateHeight(int x, int z) {
- float total = 0;
- float d = (float) Math.pow(2, OCTAVES-1);
- for(int i=0;i<OCTAVES;i++){
- float freq = (float) (Math.pow(2, i) / d);
- float amp = (float) Math.pow(ROUGHNESS, i) * AMPLITUDE;
- total += getInterpolatedNoise((x+xOffset)*freq, (z + zOffset)*freq) * amp;
- }
- return total;
- }
- private float getInterpolatedNoise(float x, float z){
- int intX = (int) x;
- int intZ = (int) z;
- float fracX = x - intX;
- float fracZ = z - intZ;
- float v1 = getSmoothNoise(intX, intZ);
- float v2 = getSmoothNoise(intX + 1, intZ);
- float v3 = getSmoothNoise(intX, intZ + 1);
- float v4 = getSmoothNoise(intX + 1, intZ + 1);
- float i1 = interpolate(v1, v2, fracX);
- float i2 = interpolate(v3, v4, fracX);
- return interpolate(i1, i2, fracZ);
- }
- private float interpolate(float a, float b, float blend){
- double theta = blend * Math.PI;
- float f = (float)(1f - Math.cos(theta)) * 0.5f;
- return a * (1f - f) + b * f;
- }
- private float getSmoothNoise(int x, int z) {
- float corners = (getNoise(x - 1, z - 1) + getNoise(x + 1, z - 1) + getNoise(x - 1, z + 1)
- + getNoise(x + 1, z + 1)) / 16f;
- float sides = (getNoise(x - 1, z) + getNoise(x + 1, z) + getNoise(x, z - 1)
- + getNoise(x, z + 1)) / 8f;
- float center = getNoise(x, z) / 4f;
- return corners + sides + center;
- }
- private float getNoise(int x, int z) {
- random.setSeed(x * 49632 + z * 325176 + seed);
- return random.nextFloat() * 2f - 1f;
- }
- public void startNoise() {
- System.out.println("Generating noise map");
- System.out.println("Width: " + Terrain.SIZE);
- System.out.println("Height: " + Terrain.SIZE);
- BufferedImage image = new BufferedImage((int) Terrain.SIZE, (int) Terrain.SIZE, BufferedImage.TYPE_INT_RGB);
- for(int x = 0; x < Terrain.SIZE; x++) {
- for(int y = 0; y < Terrain.SIZE; y++) {
- float c = generateHeight(x, y);
- c *= 128.0;
- c += 127.0;
- if(c > 255.0) {
- c = 255.0f;
- }
- if(c < 0.0) {
- c = 0.0f;
- }
- // image.setRGB(x, y, Biome.getColour(c).getRGB());
- image.setRGB(x, y, new Color(c/255, c/255, c/255).getRGB());
- }
- }
- File fileImage = new File("res/maps/noise.png");
- // File fileImage = new File("res/maps/biomeMap.png");
- if(!fileImage.exists()) {
- try {
- fileImage.mkdirs();
- fileImage.createNewFile();
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
- try {
- ImageIO.write(image, "png", fileImage);
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- System.out.println("Noise map generated");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement