From 8476778b4651d9b56d9091c07fa895e861c8eb2b Mon Sep 17 00:00:00 2001 From: sk89q Date: Mon, 28 Jul 2014 02:15:30 -0700 Subject: [PATCH] Add Perlin, ridged multi-fractal, Voronoi noise generators via libnoise. --- pom.xml | 8 ++ .../math/noise/JLibNoiseGenerator.java | 62 +++++++++++++++ .../worldedit/math/noise/PerlinNoise.java | 76 +++++++++++++++++++ .../math/noise/RidgedMultiFractalNoise.java | 68 +++++++++++++++++ .../worldedit/math/noise/VoronoiNoise.java | 52 +++++++++++++ 5 files changed, 266 insertions(+) create mode 100644 src/main/java/com/sk89q/worldedit/math/noise/JLibNoiseGenerator.java create mode 100644 src/main/java/com/sk89q/worldedit/math/noise/PerlinNoise.java create mode 100644 src/main/java/com/sk89q/worldedit/math/noise/RidgedMultiFractalNoise.java create mode 100644 src/main/java/com/sk89q/worldedit/math/noise/VoronoiNoise.java diff --git a/pom.xml b/pom.xml index 7c109e397..26eaa9fc2 100644 --- a/pom.xml +++ b/pom.xml @@ -183,6 +183,14 @@ jar + + + com.sk89q.lib + jlibnoise + 1.0.0 + true + + org.mockito diff --git a/src/main/java/com/sk89q/worldedit/math/noise/JLibNoiseGenerator.java b/src/main/java/com/sk89q/worldedit/math/noise/JLibNoiseGenerator.java new file mode 100644 index 000000000..dbf7720fd --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/math/noise/JLibNoiseGenerator.java @@ -0,0 +1,62 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.math.noise; + +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.Vector2D; +import net.royawesome.jlibnoise.module.Module; + +import java.util.Random; + +abstract class JLibNoiseGenerator implements NoiseGenerator { + + private static final Random RANDOM = new Random(); + private final V module; + + JLibNoiseGenerator() { + module = createModule(); + setSeed(RANDOM.nextInt()); + } + + protected abstract V createModule(); + + protected V getModule() { + return module; + } + + public abstract void setSeed(int seed); + + public abstract int getSeed(); + + @Override + public float noise(Vector2D position) { + return forceRange(module.GetValue(position.getX(), 0, position.getZ())); + } + + @Override + public float noise(Vector position) { + return forceRange(module.GetValue(position.getX(), position.getY(), position.getZ())); + } + + private float forceRange(double value) { + return (float) Math.max(0, Math.min(1, value / 2.0 + 0.5)); + } + +} diff --git a/src/main/java/com/sk89q/worldedit/math/noise/PerlinNoise.java b/src/main/java/com/sk89q/worldedit/math/noise/PerlinNoise.java new file mode 100644 index 000000000..ced3c0e67 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/math/noise/PerlinNoise.java @@ -0,0 +1,76 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.math.noise; + +import net.royawesome.jlibnoise.module.source.Perlin; + +/** + * Generates Perlin noise. + */ +public class PerlinNoise extends JLibNoiseGenerator { + + @Override + protected Perlin createModule() { + return new Perlin(); + } + + public double getFrequency() { + return getModule().getFrequency(); + } + + public void setFrequency(double frequency) { + getModule().setFrequency(frequency); + } + + public double getLacunarity() { + return getModule().getLacunarity(); + } + + public void setLacunarity(double lacunarity) { + getModule().setLacunarity(lacunarity); + } + + public int getOctaveCount() { + return getModule().getOctaveCount(); + } + + public void setOctaveCount(int octaveCount) { + getModule().setOctaveCount(octaveCount); + } + + public void setPersistence(double persistence) { + getModule().setPersistence(persistence); + } + + public double getPersistence() { + return getModule().getPersistence(); + } + + @Override + public void setSeed(int seed) { + getModule().setSeed(seed); + } + + @Override + public int getSeed() { + return getModule().getSeed(); + } + +} diff --git a/src/main/java/com/sk89q/worldedit/math/noise/RidgedMultiFractalNoise.java b/src/main/java/com/sk89q/worldedit/math/noise/RidgedMultiFractalNoise.java new file mode 100644 index 000000000..0ebd0de57 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/math/noise/RidgedMultiFractalNoise.java @@ -0,0 +1,68 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.math.noise; + +import net.royawesome.jlibnoise.module.source.RidgedMulti; + +/** + * Generates ridged multi-fractal noise. + */ +public class RidgedMultiFractalNoise extends JLibNoiseGenerator { + + @Override + protected RidgedMulti createModule() { + return new RidgedMulti(); + } + + public double getFrequency() { + return getModule().getFrequency(); + } + + public void setFrequency(double frequency) { + getModule().setFrequency(frequency); + } + + public double getLacunarity() { + return getModule().getLacunarity(); + } + + public void setLacunarity(double lacunarity) { + getModule().setLacunarity(lacunarity); + } + + public int getOctaveCount() { + return getModule().getOctaveCount(); + } + + public void setOctaveCount(int octaveCount) { + getModule().setOctaveCount(octaveCount); + } + + @Override + public void setSeed(int seed) { + getModule().setSeed(seed); + } + + @Override + public int getSeed() { + return getModule().getSeed(); + } + +} diff --git a/src/main/java/com/sk89q/worldedit/math/noise/VoronoiNoise.java b/src/main/java/com/sk89q/worldedit/math/noise/VoronoiNoise.java new file mode 100644 index 000000000..af1b5260e --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/math/noise/VoronoiNoise.java @@ -0,0 +1,52 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.math.noise; + +import net.royawesome.jlibnoise.module.source.Voronoi; + +/** + * Generates Voronoi noise. + */ +public class VoronoiNoise extends JLibNoiseGenerator { + + @Override + protected Voronoi createModule() { + return new Voronoi(); + } + + public double getFrequency() { + return getModule().getFrequency(); + } + + public void setFrequency(double frequency) { + getModule().setFrequency(frequency); + } + + @Override + public void setSeed(int seed) { + getModule().setSeed(seed); + } + + @Override + public int getSeed() { + return getModule().getSeed(); + } + +}