diff --git a/README.md b/README.md new file mode 100644 index 0000000..6fdc471 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# libnoiseforjava +Java port of the C++ library libnoise. (http://libnoise.sourceforge.net/index.html) diff --git a/libnoiseforjava/build.xml b/libnoiseforjava/build.xml new file mode 100644 index 0000000..5b0bfa4 --- /dev/null +++ b/libnoiseforjava/build.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + Builds, tests, and runs the project libnoiseforjava. + + + diff --git a/libnoiseforjava/nbproject/build-impl.xml b/libnoiseforjava/nbproject/build-impl.xml new file mode 100644 index 0000000..c9c56ce --- /dev/null +++ b/libnoiseforjava/nbproject/build-impl.xml @@ -0,0 +1,1411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libnoiseforjava/nbproject/genfiles.properties b/libnoiseforjava/nbproject/genfiles.properties new file mode 100644 index 0000000..b1673bd --- /dev/null +++ b/libnoiseforjava/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=f8ac9732 +build.xml.script.CRC32=72cd8828 +build.xml.stylesheet.CRC32=28e38971@1.56.1.46 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=f8ac9732 +nbproject/build-impl.xml.script.CRC32=427098b2 +nbproject/build-impl.xml.stylesheet.CRC32=c6d2a60f@1.56.1.46 diff --git a/libnoiseforjava/nbproject/project.properties b/libnoiseforjava/nbproject/project.properties new file mode 100644 index 0000000..f4e0eea --- /dev/null +++ b/libnoiseforjava/nbproject/project.properties @@ -0,0 +1,72 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=libnoiseforjava +application.vendor=roah +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/libnoiseforjava.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +file.reference.libnoiseforjava-src=../src +includes=** +jar.compress=false +javac.classpath= +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.7 +javac.target=1.7 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=true +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project. +# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. +# To set system properties for unit tests define test-sys-prop.name=value: +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.src.dir=${file.reference.libnoiseforjava-src} +test.src.dir=test diff --git a/libnoiseforjava/nbproject/project.xml b/libnoiseforjava/nbproject/project.xml new file mode 100644 index 0000000..8add5b7 --- /dev/null +++ b/libnoiseforjava/nbproject/project.xml @@ -0,0 +1,15 @@ + + + org.netbeans.modules.java.j2seproject + + + libnoiseforjava + + + + + + + + + diff --git a/src/libnoiseforjava/Interp.java b/src/libnoiseforjava/Interp.java index 8a630cf..98eeed0 100644 --- a/src/libnoiseforjava/Interp.java +++ b/src/libnoiseforjava/Interp.java @@ -1,107 +1,103 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava; - -public class Interp -{ - - /// Performs cubic interpolation between two values bound between two other - /// values. - /// - /// @param n0 The value before the first value. - /// @param n1 The first value. - /// @param n2 The second value. - /// @param n3 The value after the second value. - /// @param a The alpha value. - /// - /// @returns The interpolated value. - /// - /// The alpha value should range from 0.0 to 1.0. If the alpha value is - /// 0.0, this function returns @a n1. If the alpha value is 1.0, this - /// function returns @a n2. - public static double cubicInterp (double n0, double n1, double n2, double n3, - double a) - { - double p = (n3 - n2) - (n0 - n1); - double q = (n0 - n1) - p; - double r = n2 - n0; - double s = n1; - return p * a * a * a + q * a * a + r * a + s; - } - - /// Performs linear interpolation between two values. - /// - /// @param n0 The first value. - /// @param n1 The second value. - /// @param a The alpha value. - /// - /// @returns The interpolated value. - /// - /// The alpha value should range from 0.0 to 1.0. If the alpha value is - /// 0.0, this function returns @a n0. If the alpha value is 1.0, this - /// function returns @a n1. - public static double linearInterp (double n0, double n1, double a) - { - return ((1.0 - a) * n0) + (a * n1); - } - - /// Maps a value onto a cubic S-curve. - /// - /// @param a The value to map onto a cubic S-curve. - /// - /// @returns The mapped value. - /// - /// @a a should range from 0.0 to 1.0. - /// - /// The derivative of a cubic S-curve is zero at @a a = 0.0 and @a a = - /// 1.0 - public static double SCurve3 (double a) - { - return (a * a * (3.0 - 2.0 * a)); - } - - /// Maps a value onto a quintic S-curve. - /// - /// @param a The value to map onto a quintic S-curve. - /// - /// @returns The mapped value. - /// - /// @a a should range from 0.0 to 1.0. - /// - /// The first derivative of a quintic S-curve is zero at @a a = 0.0 and - /// @a a = 1.0 - /// - /// The second derivative of a quintic S-curve is zero at @a a = 0.0 and - /// @a a = 1.0 - static double SCurve5 (double a) - { - double a3 = a * a * a; - double a4 = a3 * a; - double a5 = a4 * a; - return (6.0 * a5) - (15.0 * a4) + (10.0 * a3); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava; + +public class Interp +{ + + /** + * Performs cubic interpolation between two values bound between two other + * values. + * The alpha value should range from 0.0 to 1.0. If the alpha value is + * 0.0, this function returns {@param n1}. If the alpha value is 1.0, this + * function returns {@param n2}. + * + * @param n0 The value before the first value. + * @param n1 The first value. + * @param n2 The second value. + * @param n3 The value after the second value. + * @param a The alpha value. + * @return The interpolated value. + */ + public static double cubicInterp (double n0, double n1, double n2, double n3, + double a) + { + double p = (n3 - n2) - (n0 - n1); + double q = (n0 - n1) - p; + double r = n2 - n0; + double s = n1; + return p * a * a * a + q * a * a + r * a + s; + } + + /** + * Performs linear interpolation between two values. + * The alpha value should range from 0.0 to 1.0. If the alpha value is + * 0.0, this function returns {@param n0}. If the alpha value is 1.0, this + * function returns {@param n1}. + * @param n0 The first value. + * @param n1 The second value. + * @param a The alpha value. + * @return The interpolated value. + */ + public static double linearInterp (double n0, double n1, double a) + { + return ((1.0 - a) * n0) + (a * n1); + } + + /** + * Maps a value onto a cubic S-curve. + * {@param a} should range from 0.0 to 1.0. + * + * The derivative of a cubic S-curve is zero at {@param a} = 0.0 + * and {@param a} = 1.0 + * + * @param a The value to map onto a cubic S-curve. + * @return The mapped value. + */ + public static double SCurve3 (double a) + { + return (a * a * (3.0 - 2.0 * a)); + } + + /** + * Maps a value onto a quintic S-curve. + * The first derivative of a quintic S-curve is zero at {@param a} = 0.0 + * and {@param a} = 1.0 + * The second derivative of a quintic S-curve is zero at {@param a} = 0.0 + * and {@param a} = 1.0 + * + * @param a The value to map onto a quintic S-curve. + * @return The mapped value. + */ + static double SCurve5 (double a) + { + double a3 = a * a * a; + double a4 = a3 * a; + double a5 = a4 * a; + return (6.0 * a5) - (15.0 * a4) + (10.0 * a3); + } + +} diff --git a/src/libnoiseforjava/Misc.java b/src/libnoiseforjava/Misc.java index 101aefd..58202b3 100644 --- a/src/libnoiseforjava/Misc.java +++ b/src/libnoiseforjava/Misc.java @@ -1,51 +1,52 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava; - -public class Misc -{ - /// Clamps a value onto a clamping range. - /// - /// @param value The value to clamp. - /// @param lowerBound The lower bound of the clamping range. - /// @param upperBound The upper bound of the clamping range. - /// - /// @returns - /// - @a value if @a value lies between @a lowerBound and @a upperBound. - /// - @a lowerBound if @a value is less than @a lowerBound. - /// - @a upperBound if @a value is greater than @a upperBound. - /// - /// This function does not modify any parameters. - public static int ClampValue (int value, int lowerBound, int upperBound) - { - if (value < lowerBound) - return lowerBound; - else if (value > upperBound) - return upperBound; - else - return value; - } -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava; + +public class Misc +{ + + /** + * Clamps a value onto a clamping range. + * This function does not modify any parameters. + * + * @param value The value to clamp. + * @param lowerBound The lower bound of the clamping range. + * @param upperBound The upper bound of the clamping range. + * @return + * - {@param value} if lies between {@param lowerBound} and {@param upperBound}.
+ * - {@param lowerBound} if {@param value} is less than {@param lowerBound}.
+ * - {@param upperBound} if {@param value} is greater than {@param upperBound}.
+ */ + public static int ClampValue (int value, int lowerBound, int upperBound) + { + if (value < lowerBound) + return lowerBound; + else if (value > upperBound) + return upperBound; + else + return value; + } +} diff --git a/src/libnoiseforjava/NoiseGen.java b/src/libnoiseforjava/NoiseGen.java index 4996fde..6b0cb55 100644 --- a/src/libnoiseforjava/NoiseGen.java +++ b/src/libnoiseforjava/NoiseGen.java @@ -1,262 +1,279 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava; - -public class NoiseGen -{ - - /// Enumerates the noise quality. - public enum NoiseQuality - { - - /// Generates coherent noise quickly. When a coherent-noise function with - /// this quality setting is used to generate a bump-map image, there are - /// noticeable "creasing" artifacts in the resulting image. This is - /// because the derivative of that function is discontinuous at integer - /// boundaries. - QUALITY_FAST, - - /// Generates standard-quality coherent noise. When a coherent-noise - /// function with this quality setting is used to generate a bump-map - /// image, there are some minor "creasing" artifacts in the resulting - /// image. This is because the second derivative of that function is - /// discontinuous at integer boundaries. - QUALITY_STD, - - /// Generates the best-quality coherent noise. When a coherent-noise - /// function with this quality setting is used to generate a bump-map - /// image, there are no "creasing" artifacts in the resulting image. This - /// is because the first and second derivatives of that function are - /// continuous at integer boundaries. - QUALITY_BEST - } - - static final int X_NOISE_GEN = 1619; - static final int Y_NOISE_GEN = 31337; - static final int Z_NOISE_GEN = 6971; - static final int SEED_NOISE_GEN = 1013; - static final int SHIFT_NOISE_GEN = 8; - - public static double GradientCoherentNoise3D (double x, double y, double z, int seed, - NoiseQuality noiseQuality) - { - - // Create a unit-length cube aligned along an integer boundary. This cube - // surrounds the input point. - int x0 = (x > 0.0? (int)x: (int)x - 1); - int x1 = x0 + 1; - int y0 = (y > 0.0? (int)y: (int)y - 1); - int y1 = y0 + 1; - int z0 = (z > 0.0? (int)z: (int)z - 1); - int z1 = z0 + 1; - - // Map the difference between the coordinates of the input value and the - // coordinates of the cube's outer-lower-left vertex onto an S-curve. - double xs = 0, ys = 0, zs = 0; - switch (noiseQuality) - { - case QUALITY_FAST: - xs = (x - (double)x0); - ys = (y - (double)y0); - zs = (z - (double)z0); - break; - case QUALITY_STD: - xs = Interp.SCurve3 (x - (double)x0); - ys = Interp.SCurve3 (y - (double)y0); - zs = Interp.SCurve3 (z - (double)z0); - break; - case QUALITY_BEST: - xs = Interp.SCurve5 (x - (double)x0); - ys = Interp.SCurve5 (y - (double)y0); - zs = Interp.SCurve5 (z - (double)z0); - break; - } - - // Now calculate the noise values at each vertex of the cube. To generate - // the coherent-noise value at the input point, interpolate these eight - // noise values using the S-curve value as the interpolant (trilinear - // interpolation.) - double n0, n1, ix0, ix1, iy0, iy1; - n0 = GradientNoise3D (x, y, z, x0, y0, z0, seed); - n1 = GradientNoise3D (x, y, z, x1, y0, z0, seed); - ix0 = Interp.linearInterp (n0, n1, xs); - n0 = GradientNoise3D (x, y, z, x0, y1, z0, seed); - n1 = GradientNoise3D (x, y, z, x1, y1, z0, seed); - ix1 = Interp.linearInterp (n0, n1, xs); - iy0 = Interp.linearInterp (ix0, ix1, ys); - n0 = GradientNoise3D (x, y, z, x0, y0, z1, seed); - n1 = GradientNoise3D (x, y, z, x1, y0, z1, seed); - ix0 = Interp.linearInterp (n0, n1, xs); - n0 = GradientNoise3D (x, y, z, x0, y1, z1, seed); - n1 = GradientNoise3D (x, y, z, x1, y1, z1, seed); - ix1 = Interp.linearInterp (n0, n1, xs); - iy1 = Interp.linearInterp (ix0, ix1, ys); - - return Interp.linearInterp (iy0, iy1, zs); - } - - public static double GradientNoise3D (double fx, double fy, double fz, int ix, - int iy, int iz, int seed) - { - - VectorTable vectorTable = new VectorTable(); - // Randomly generate a gradient vector given the integer coordinates of the - // input value. This implementation generates a random number and uses it - // as an index into a normalized-vector lookup table. - int vectorIndex = (X_NOISE_GEN * ix - + Y_NOISE_GEN * iy - + Z_NOISE_GEN * iz - + SEED_NOISE_GEN * seed) - & 0xffffffff; - - vectorIndex ^= (vectorIndex >> SHIFT_NOISE_GEN); - vectorIndex &= 0xff; - - double xvGradient = vectorTable.getRandomVectors(vectorIndex, 0); - double yvGradient = vectorTable.getRandomVectors(vectorIndex, 1); - double zvGradient = vectorTable.getRandomVectors(vectorIndex, 2); - // array size too large when using this original, changed to above for all 3 - // double zvGradient = vectorTable.getRandomVectors(vectorIndex << 2, 2); - - // Set up us another vector equal to the distance between the two vectors - // passed to this function. - double xvPoint = (fx - (double)ix); - double yvPoint = (fy - (double)iy); - double zvPoint = (fz - (double)iz); - - // Now compute the dot product of the gradient vector with the distance - // vector. The resulting value is gradient noise. Apply a scaling value - // so that this noise value ranges from -1.0 to 1.0. - return ((xvGradient * xvPoint) - + (yvGradient * yvPoint) - + (zvGradient * zvPoint)) * 2.12; - } - - public static int IntValueNoise3D (int x, int y, int z, int seed) - { - // All constants are primes and must remain prime in order for this noise - // function to work correctly. - int n = (X_NOISE_GEN * x - + Y_NOISE_GEN * y - + Z_NOISE_GEN * z - + SEED_NOISE_GEN * seed) - & 0x7fffffff; - - n = (n >> 13) ^ n; - - return (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; - } - - public static double ValueCoherentNoise3D (double x, double y, double z, int seed, - NoiseQuality noiseQuality) - { - // Create a unit-length cube aligned along an integer boundary. This cube - // surrounds the input point. - int x0 = (x > 0.0? (int)x: (int)x - 1); - int x1 = x0 + 1; - int y0 = (y > 0.0? (int)y: (int)y - 1); - int y1 = y0 + 1; - int z0 = (z > 0.0? (int)z: (int)z - 1); - int z1 = z0 + 1; - - // Map the difference between the coordinates of the input value and the - // coordinates of the cube's outer-lower-left vertex onto an S-curve. - double xs = 0, ys = 0, zs = 0; - switch (noiseQuality) - { - case QUALITY_FAST: - xs = (x - (double)x0); - ys = (y - (double)y0); - zs = (z - (double)z0); - break; - case QUALITY_STD: - xs = Interp.SCurve3 (x - (double)x0); - ys = Interp.SCurve3 (y - (double)y0); - zs = Interp.SCurve3 (z - (double)z0); - break; - case QUALITY_BEST: - xs = Interp.SCurve5 (x - (double)x0); - ys = Interp.SCurve5 (y - (double)y0); - zs = Interp.SCurve5 (z - (double)z0); - break; - } - - // Now calculate the noise values at each vertex of the cube. To generate - // the coherent-noise value at the input point, interpolate these eight - // noise values using the S-curve value as the interpolant (trilinear - // interpolation.) - double n0, n1, ix0, ix1, iy0, iy1; - n0 = ValueNoise3D (x0, y0, z0, seed); - n1 = ValueNoise3D (x1, y0, z0, seed); - ix0 = Interp.linearInterp (n0, n1, xs); - n0 = ValueNoise3D (x0, y1, z0, seed); - n1 = ValueNoise3D (x1, y1, z0, seed); - ix1 = Interp.linearInterp (n0, n1, xs); - iy0 = Interp.linearInterp (ix0, ix1, ys); - n0 = ValueNoise3D (x0, y0, z1, seed); - n1 = ValueNoise3D (x1, y0, z1, seed); - ix0 = Interp.linearInterp (n0, n1, xs); - n0 = ValueNoise3D (x0, y1, z1, seed); - n1 = ValueNoise3D (x1, y1, z1, seed); - ix1 = Interp.linearInterp (n0, n1, xs); - iy1 = Interp.linearInterp (ix0, ix1, ys); - - return Interp.linearInterp (iy0, iy1, zs); - } - - public static double ValueNoise3D (int x, int y, int z, int seed) - { - return 1.0 - ((double)IntValueNoise3D (x, y, z, seed) / 1073741824.0); - } - - /// Modifies a floating-point value so that it can be stored in a - /// int32 variable. - /// - /// @param n A floating-point number. - /// - /// @returns The modified floating-point number. - /// - /// This function does not modify @a n. - /// - /// In libnoise, the noise-generating algorithms are all integer-based; - /// they use variables of type int32. Before calling a noise - /// function, pass the @a x, @a y, and @a z coordinates to this function to - /// ensure that these coordinates can be cast to a int32 value. - /// - /// Although you could do a straight cast from double to int32, the - /// resulting value may differ between platforms. By using this function, - /// you ensure that the resulting value is identical between platforms. - public static double MakeInt32Range (double n) - { - if (n >= 1073741824.0) - return (2.0 * (n % 1073741824.0)) - 1073741824.0; - else if (n <= -1073741824.0) - return (2.0 * (n % 1073741824.0)) + 1073741824.0; - else - return n; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava; + +public class NoiseGen +{ + + /** + * Enumerates the noise quality. + * @see #QUALITY_FAST + * @see #QUALITY_STD + * @see #QUALITY_BEST + */ + public enum NoiseQuality + { + + /** + * Generates coherent noise quickly, when a coherent-noise function with + * this quality setting is used to generate a bump-map image, there are + * noticeable "creasing" artifacts in the resulting image, this is + * because the derivative of that function is discontinuous at integer + * boundaries. + */ + QUALITY_FAST, + + /** + * Generates standard-quality coherent noise, when a coherent-noise + * function with this quality setting is used to generate a bump-map + * image, there are some minor "creasing" artifacts in the resulting + * image, this is because the second derivative of that function is + * discontinuous at integer boundaries. + */ + QUALITY_STD, + + /** + * Generates the best-quality coherent noise when a coherent-noise + * function with this quality setting is used to generate a bump-map + * image, there are no "creasing" artifacts in the resulting image this + * is because the first and second derivatives of that function are + * continuous at integer boundaries. + */ + QUALITY_BEST + } + + static final int X_NOISE_GEN = 1619; + static final int Y_NOISE_GEN = 31337; + static final int Z_NOISE_GEN = 6971; + static final int SEED_NOISE_GEN = 1013; + static final int SHIFT_NOISE_GEN = 8; + + public static double GradientCoherentNoise3D (double x, double y, double z, int seed, + NoiseQuality noiseQuality) + { + + // Create a unit-length cube aligned along an integer boundary. This cube + // surrounds the input point. + int x0 = (x > 0.0? (int)x: (int)x - 1); + int x1 = x0 + 1; + int y0 = (y > 0.0? (int)y: (int)y - 1); + int y1 = y0 + 1; + int z0 = (z > 0.0? (int)z: (int)z - 1); + int z1 = z0 + 1; + + // Map the difference between the coordinates of the input value and the + // coordinates of the cube's outer-lower-left vertex onto an S-curve. + double xs = 0, ys = 0, zs = 0; + switch (noiseQuality) + { + case QUALITY_FAST: + xs = (x - (double)x0); + ys = (y - (double)y0); + zs = (z - (double)z0); + break; + case QUALITY_STD: + xs = Interp.SCurve3 (x - (double)x0); + ys = Interp.SCurve3 (y - (double)y0); + zs = Interp.SCurve3 (z - (double)z0); + break; + case QUALITY_BEST: + xs = Interp.SCurve5 (x - (double)x0); + ys = Interp.SCurve5 (y - (double)y0); + zs = Interp.SCurve5 (z - (double)z0); + break; + } + + // Now calculate the noise values at each vertex of the cube. To generate + // the coherent-noise value at the input point, interpolate these eight + // noise values using the S-curve value as the interpolant (trilinear + // interpolation.) + double n0, n1, ix0, ix1, iy0, iy1; + n0 = GradientNoise3D (x, y, z, x0, y0, z0, seed); + n1 = GradientNoise3D (x, y, z, x1, y0, z0, seed); + ix0 = Interp.linearInterp (n0, n1, xs); + n0 = GradientNoise3D (x, y, z, x0, y1, z0, seed); + n1 = GradientNoise3D (x, y, z, x1, y1, z0, seed); + ix1 = Interp.linearInterp (n0, n1, xs); + iy0 = Interp.linearInterp (ix0, ix1, ys); + n0 = GradientNoise3D (x, y, z, x0, y0, z1, seed); + n1 = GradientNoise3D (x, y, z, x1, y0, z1, seed); + ix0 = Interp.linearInterp (n0, n1, xs); + n0 = GradientNoise3D (x, y, z, x0, y1, z1, seed); + n1 = GradientNoise3D (x, y, z, x1, y1, z1, seed); + ix1 = Interp.linearInterp (n0, n1, xs); + iy1 = Interp.linearInterp (ix0, ix1, ys); + + return Interp.linearInterp (iy0, iy1, zs); + } + + public static double GradientNoise3D (double fx, double fy, double fz, int ix, + int iy, int iz, int seed) + { + + //VectorTable vectorTable = new VectorTable(); + // Randomly generate a gradient vector given the integer coordinates of the + // input value. This implementation generates a random number and uses it + // as an index into a normalized-vector lookup table. + int vectorIndex = (X_NOISE_GEN * ix + + Y_NOISE_GEN * iy + + Z_NOISE_GEN * iz + + SEED_NOISE_GEN * seed) + & 0xffffffff; + + vectorIndex ^= (vectorIndex >> SHIFT_NOISE_GEN); + vectorIndex &= 0xff; + + double xvGradient = VectorTable.getRandomVectors(vectorIndex, 0); + double yvGradient = VectorTable.getRandomVectors(vectorIndex, 1); + double zvGradient = VectorTable.getRandomVectors(vectorIndex, 2); + // array size too large when using this original, changed to above for all 3 + // double zvGradient = vectorTable.getRandomVectors(vectorIndex << 2, 2); + + // Set up us another vector equal to the distance between the two vectors + // passed to this function. + double xvPoint = (fx - (double)ix); + double yvPoint = (fy - (double)iy); + double zvPoint = (fz - (double)iz); + + // Now compute the dot product of the gradient vector with the distance + // vector. The resulting value is gradient noise. Apply a scaling value + // so that this noise value ranges from -1.0 to 1.0. + return ((xvGradient * xvPoint) + + (yvGradient * yvPoint) + + (zvGradient * zvPoint)) * 2.12; + } + + public static int IntValueNoise3D (int x, int y, int z, int seed) + { + // All constants are primes and must remain prime in order for this noise + // function to work correctly. + int n = (X_NOISE_GEN * x + + Y_NOISE_GEN * y + + Z_NOISE_GEN * z + + SEED_NOISE_GEN * seed) + & 0x7fffffff; + + n = (n >> 13) ^ n; + + return (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; + } + + public static double ValueCoherentNoise3D (double x, double y, double z, int seed, + NoiseQuality noiseQuality) + { + // Create a unit-length cube aligned along an integer boundary. This cube + // surrounds the input point. + int x0 = (x > 0.0? (int)x: (int)x - 1); + int x1 = x0 + 1; + int y0 = (y > 0.0? (int)y: (int)y - 1); + int y1 = y0 + 1; + int z0 = (z > 0.0? (int)z: (int)z - 1); + int z1 = z0 + 1; + + // Map the difference between the coordinates of the input value and the + // coordinates of the cube's outer-lower-left vertex onto an S-curve. + double xs = 0, ys = 0, zs = 0; + switch (noiseQuality) + { + case QUALITY_FAST: + xs = (x - (double)x0); + ys = (y - (double)y0); + zs = (z - (double)z0); + break; + case QUALITY_STD: + xs = Interp.SCurve3 (x - (double)x0); + ys = Interp.SCurve3 (y - (double)y0); + zs = Interp.SCurve3 (z - (double)z0); + break; + case QUALITY_BEST: + xs = Interp.SCurve5 (x - (double)x0); + ys = Interp.SCurve5 (y - (double)y0); + zs = Interp.SCurve5 (z - (double)z0); + break; + } + + // Now calculate the noise values at each vertex of the cube. To generate + // the coherent-noise value at the input point, interpolate these eight + // noise values using the S-curve value as the interpolant (trilinear + // interpolation.) + double n0, n1, ix0, ix1, iy0, iy1; + n0 = ValueNoise3D (x0, y0, z0, seed); + n1 = ValueNoise3D (x1, y0, z0, seed); + ix0 = Interp.linearInterp (n0, n1, xs); + n0 = ValueNoise3D (x0, y1, z0, seed); + n1 = ValueNoise3D (x1, y1, z0, seed); + ix1 = Interp.linearInterp (n0, n1, xs); + iy0 = Interp.linearInterp (ix0, ix1, ys); + n0 = ValueNoise3D (x0, y0, z1, seed); + n1 = ValueNoise3D (x1, y0, z1, seed); + ix0 = Interp.linearInterp (n0, n1, xs); + n0 = ValueNoise3D (x0, y1, z1, seed); + n1 = ValueNoise3D (x1, y1, z1, seed); + ix1 = Interp.linearInterp (n0, n1, xs); + iy1 = Interp.linearInterp (ix0, ix1, ys); + + return Interp.linearInterp (iy0, iy1, zs); + } + + public static double ValueNoise3D (int x, int y, int z, int seed) + { + return 1.0 - ((double)IntValueNoise3D (x, y, z, seed) / 1073741824.0); + } + + /** + * Modifies a floating-point value so that it can be stored in a + * int32 variable. + *

+ * In libnoise, the noise-generating algorithms are all integer-based, + * they use variables of type int32. Before calling a noise + * function, pass the @a x, @a y, and @a z coordinates to + * this function to ensure that these coordinates can be cast + * to a int32 value. + * Modifies a floating-point value so that it can be stored in a + * int32 variable. + *

+ *

This function does not modify @a n.

+ *

+ * Although you could do a straight cast from double to int32, the + * resulting value may differ between platforms. By using this function, + * you ensure that the resulting value is identical between platforms. + * Modifies a floating-point value so that it can be stored in a + * int32 variable. + *

+ * + * @param n A floating-point number. + * @return The modified floating-point number. + */ + public static double MakeInt32Range (double n) { + if (n >= 1073741824.0) + return (2.0 * (n % 1073741824.0)) - 1073741824.0; + else if (n <= -1073741824.0) + return (2.0 * (n % 1073741824.0)) + 1073741824.0; + else + return n; + } + +} diff --git a/src/libnoiseforjava/VectorTable.java b/src/libnoiseforjava/VectorTable.java index 7253443..8a54f22 100644 --- a/src/libnoiseforjava/VectorTable.java +++ b/src/libnoiseforjava/VectorTable.java @@ -1,309 +1,312 @@ -/* - * This file is in the public domain - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava; - -public class VectorTable -{ - // A table of 256 random normalized vectors. Each row is an (x, y, z, 0) - // coordinate. The 0 is used as padding so we can use bit shifts to index - // any row in the table. These vectors have an even statistical - // distribution, which improves the quality of the coherent noise - // generated by these vectors. For more information, see "GPU Gems", - // Chapter 5 - Implementing Improved Perlin Noise by Ken Perlin, - // specifically page 76. - - double[][] randomVectors = { - {-0.763874, -0.596439, -0.246489, 0.0}, - {0.396055, 0.904518, -0.158073, 0.0}, - {-0.499004, -0.8665, -0.0131631, 0.0}, - {0.468724, -0.824756, 0.316346, 0.0}, - {0.829598, 0.43195, 0.353816, 0.0}, - {-0.454473, 0.629497, -0.630228, 0.0}, - {-0.162349, -0.869962, -0.465628, 0.0}, - {0.932805, 0.253451, 0.256198, 0.0}, - {-0.345419, 0.927299, -0.144227, 0.0}, - {-0.715026, -0.293698, -0.634413, 0.0}, - {-0.245997, 0.717467, -0.651711, 0.0}, - {-0.967409, -0.250435, -0.037451, 0.0}, - {0.901729, 0.397108, -0.170852, 0.0}, - {0.892657, -0.0720622, -0.444938, 0.0}, - {0.0260084, -0.0361701, 0.999007, 0.0}, - {0.949107, -0.19486, 0.247439, 0.0}, - {0.471803, -0.807064, -0.355036, 0.0}, - {0.879737, 0.141845, 0.453809, 0.0}, - {0.570747, 0.696415, 0.435033, 0.0}, - {-0.141751, -0.988233, -0.0574584, 0.0}, - {-0.58219, -0.0303005, 0.812488, 0.0}, - {-0.60922, 0.239482, -0.755975, 0.0}, - {0.299394, -0.197066, -0.933557, 0.0}, - {-0.851615, -0.220702, -0.47544, 0.0}, - {0.848886, 0.341829, -0.403169, 0.0}, - {-0.156129, -0.687241, 0.709453, 0.0}, - {-0.665651, 0.626724, 0.405124, 0.0}, - {0.595914, -0.674582, 0.43569, 0.0}, - {0.171025, -0.509292, 0.843428, 0.0}, - {0.78605, 0.536414, -0.307222, 0.0}, - {0.18905, -0.791613, 0.581042, 0.0}, - {-0.294916, 0.844994, 0.446105, 0.0}, - {0.342031, -0.58736, -0.7335, 0.0}, - {0.57155, 0.7869, 0.232635, 0.0}, - {0.885026, -0.408223, 0.223791, 0.0}, - {-0.789518, 0.571645, 0.223347, 0.0}, - {0.774571, 0.31566, 0.548087, 0.0}, - {-0.79695, -0.0433603, -0.602487, 0.0}, - {-0.142425, -0.473249, -0.869339, 0.0}, - {-0.0698838, 0.170442, 0.982886, 0.0}, - {0.687815, -0.484748, 0.540306, 0.0}, - {0.543703, -0.534446, -0.647112, 0.0}, - {0.97186, 0.184391, -0.146588, 0.0}, - {0.707084, 0.485713, -0.513921, 0.0}, - {0.942302, 0.331945, 0.043348, 0.0}, - {0.499084, 0.599922, 0.625307, 0.0}, - {-0.289203, 0.211107, 0.9337, 0.0}, - {0.412433, -0.71667, -0.56239, 0.0}, - {0.87721, -0.082816, 0.47291, 0.0}, - {-0.420685, -0.214278, 0.881538, 0.0}, - {0.752558, -0.0391579, 0.657361, 0.0}, - {0.0765725, -0.996789, 0.0234082, 0.0}, - {-0.544312, -0.309435, -0.779727, 0.0}, - {-0.455358, -0.415572, 0.787368, 0.0}, - {-0.874586, 0.483746, 0.0330131, 0.0}, - {0.245172, -0.0838623, 0.965846, 0.0}, - {0.382293, -0.432813, 0.81641, 0.0}, - {-0.287735, -0.905514, 0.311853, 0.0}, - {-0.667704, 0.704955, -0.239186, 0.0}, - {0.717885, -0.464002, -0.518983, 0.0}, - {0.976342, -0.214895, 0.0240053, 0.0}, - {-0.0733096, -0.921136, 0.382276, 0.0}, - {-0.986284, 0.151224, -0.0661379, 0.0}, - {-0.899319, -0.429671, 0.0812908, 0.0}, - {0.652102, -0.724625, 0.222893, 0.0}, - {0.203761, 0.458023, -0.865272, 0.0}, - {-0.030396, 0.698724, -0.714745, 0.0}, - {-0.460232, 0.839138, 0.289887, 0.0}, - {-0.0898602, 0.837894, 0.538386, 0.0}, - {-0.731595, 0.0793784, 0.677102, 0.0}, - {-0.447236, -0.788397, 0.422386, 0.0}, - {0.186481, 0.645855, -0.740335, 0.0}, - {-0.259006, 0.935463, 0.240467, 0.0}, - {0.445839, 0.819655, -0.359712, 0.0}, - {0.349962, 0.755022, -0.554499, 0.0}, - {-0.997078, -0.0359577, 0.0673977, 0.0}, - {-0.431163, -0.147516, -0.890133, 0.0}, - {0.299648, -0.63914, 0.708316, 0.0}, - {0.397043, 0.566526, -0.722084, 0.0}, - {-0.502489, 0.438308, -0.745246, 0.0}, - {0.0687235, 0.354097, 0.93268, 0.0}, - {-0.0476651, -0.462597, 0.885286, 0.0}, - {-0.221934, 0.900739, -0.373383, 0.0}, - {-0.956107, -0.225676, 0.186893, 0.0}, - {-0.187627, 0.391487, -0.900852, 0.0}, - {-0.224209, -0.315405, 0.92209, 0.0}, - {-0.730807, -0.537068, 0.421283, 0.0}, - {-0.0353135, -0.816748, 0.575913, 0.0}, - {-0.941391, 0.176991, -0.287153, 0.0}, - {-0.154174, 0.390458, 0.90762, 0.0}, - {-0.283847, 0.533842, 0.796519, 0.0}, - {-0.482737, -0.850448, 0.209052, 0.0}, - {-0.649175, 0.477748, 0.591886, 0.0}, - {0.885373, -0.405387, -0.227543, 0.0}, - {-0.147261, 0.181623, -0.972279, 0.0}, - {0.0959236, -0.115847, -0.988624, 0.0}, - {-0.89724, -0.191348, 0.397928, 0.0}, - {0.903553, -0.428461, -0.00350461, 0.0}, - {0.849072, -0.295807, -0.437693, 0.0}, - {0.65551, 0.741754, -0.141804, 0.0}, - {0.61598, -0.178669, 0.767232, 0.0}, - {0.0112967, 0.932256, -0.361623, 0.0}, - {-0.793031, 0.258012, 0.551845, 0.0}, - {0.421933, 0.454311, 0.784585, 0.0}, - {-0.319993, 0.0401618, -0.946568, 0.0}, - {-0.81571, 0.551307, -0.175151, 0.0}, - {-0.377644, 0.00322313, 0.925945, 0.0}, - {0.129759, -0.666581, -0.734052, 0.0}, - {0.601901, -0.654237, -0.457919, 0.0}, - {-0.927463, -0.0343576, -0.372334, 0.0}, - {-0.438663, -0.868301, -0.231578, 0.0}, - {-0.648845, -0.749138, -0.133387, 0.0}, - {0.507393, -0.588294, 0.629653, 0.0}, - {0.726958, 0.623665, 0.287358, 0.0}, - {0.411159, 0.367614, -0.834151, 0.0}, - {0.806333, 0.585117, -0.0864016, 0.0}, - {0.263935, -0.880876, 0.392932, 0.0}, - {0.421546, -0.201336, 0.884174, 0.0}, - {-0.683198, -0.569557, -0.456996, 0.0}, - {-0.117116, -0.0406654, -0.992285, 0.0}, - {-0.643679, -0.109196, -0.757465, 0.0}, - {-0.561559, -0.62989, 0.536554, 0.0}, - {0.0628422, 0.104677, -0.992519, 0.0}, - {0.480759, -0.2867, -0.828658, 0.0}, - {-0.228559, -0.228965, -0.946222, 0.0}, - {-0.10194, -0.65706, -0.746914, 0.0}, - {0.0689193, -0.678236, 0.731605, 0.0}, - {0.401019, -0.754026, 0.52022, 0.0}, - {-0.742141, 0.547083, -0.387203, 0.0}, - {-0.00210603, -0.796417, -0.604745, 0.0}, - {0.296725, -0.409909, -0.862513, 0.0}, - {-0.260932, -0.798201, 0.542945, 0.0}, - {-0.641628, 0.742379, 0.192838, 0.0}, - {-0.186009, -0.101514, 0.97729, 0.0}, - {0.106711, -0.962067, 0.251079, 0.0}, - {-0.743499, 0.30988, -0.592607, 0.0}, - {-0.795853, -0.605066, -0.0226607, 0.0}, - {-0.828661, -0.419471, -0.370628, 0.0}, - {0.0847218, -0.489815, -0.8677, 0.0}, - {-0.381405, 0.788019, -0.483276, 0.0}, - {0.282042, -0.953394, 0.107205, 0.0}, - {0.530774, 0.847413, 0.0130696, 0.0}, - {0.0515397, 0.922524, 0.382484, 0.0}, - {-0.631467, -0.709046, 0.313852, 0.0}, - {0.688248, 0.517273, 0.508668, 0.0}, - {0.646689, -0.333782, -0.685845, 0.0}, - {-0.932528, -0.247532, -0.262906, 0.0}, - {0.630609, 0.68757, -0.359973, 0.0}, - {0.577805, -0.394189, 0.714673, 0.0}, - {-0.887833, -0.437301, -0.14325, 0.0}, - {0.690982, 0.174003, 0.701617, 0.0}, - {-0.866701, 0.0118182, 0.498689, 0.0}, - {-0.482876, 0.727143, 0.487949, 0.0}, - {-0.577567, 0.682593, -0.447752, 0.0}, - {0.373768, 0.0982991, 0.922299, 0.0}, - {0.170744, 0.964243, -0.202687, 0.0}, - {0.993654, -0.035791, -0.106632, 0.0}, - {0.587065, 0.4143, -0.695493, 0.0}, - {-0.396509, 0.26509, -0.878924, 0.0}, - {-0.0866853, 0.83553, -0.542563, 0.0}, - {0.923193, 0.133398, -0.360443, 0.0}, - {0.00379108, -0.258618, 0.965972, 0.0}, - {0.239144, 0.245154, -0.939526, 0.0}, - {0.758731, -0.555871, 0.33961, 0.0}, - {0.295355, 0.309513, 0.903862, 0.0}, - {0.0531222, -0.91003, -0.411124, 0.0}, - {0.270452, 0.0229439, -0.96246, 0.0}, - {0.563634, 0.0324352, 0.825387, 0.0}, - {0.156326, 0.147392, 0.976646, 0.0}, - {-0.0410141, 0.981824, 0.185309, 0.0}, - {-0.385562, -0.576343, -0.720535, 0.0}, - {0.388281, 0.904441, 0.176702, 0.0}, - {0.945561, -0.192859, -0.262146, 0.0}, - {0.844504, 0.520193, 0.127325, 0.0}, - {0.0330893, 0.999121, -0.0257505, 0.0}, - {-0.592616, -0.482475, -0.644999, 0.0}, - {0.539471, 0.631024, -0.557476, 0.0}, - {0.655851, -0.027319, -0.754396, 0.0}, - {0.274465, 0.887659, 0.369772, 0.0}, - {-0.123419, 0.975177, -0.183842, 0.0}, - {-0.223429, 0.708045, 0.66989, 0.0}, - {-0.908654, 0.196302, 0.368528, 0.0}, - {-0.95759, -0.00863708, 0.288005, 0.0}, - {0.960535, 0.030592, 0.276472, 0.0}, - {-0.413146, 0.907537, 0.0754161, 0.0}, - {-0.847992, 0.350849, -0.397259, 0.0}, - {0.614736, 0.395841, 0.68221, 0.0}, - {-0.503504, -0.666128, -0.550234, 0.0}, - {-0.268833, -0.738524, -0.618314, 0.0}, - {0.792737, -0.60001, -0.107502, 0.0}, - {-0.637582, 0.508144, -0.579032, 0.0}, - {0.750105, 0.282165, -0.598101, 0.0}, - {-0.351199, -0.392294, -0.850155, 0.0}, - {0.250126, -0.960993, -0.118025, 0.0}, - {-0.732341, 0.680909, -0.0063274, 0.0}, - {-0.760674, -0.141009, 0.633634, 0.0}, - {0.222823, -0.304012, 0.926243, 0.0}, - {0.209178, 0.505671, 0.836984, 0.0}, - {0.757914, -0.56629, -0.323857, 0.0}, - {-0.782926, -0.339196, 0.52151, 0.0}, - {-0.462952, 0.585565, 0.665424, 0.0}, - {0.61879, 0.194119, -0.761194, 0.0}, - {0.741388, -0.276743, 0.611357, 0.0}, - {0.707571, 0.702621, 0.0752872, 0.0}, - {0.156562, 0.819977, 0.550569, 0.0}, - {-0.793606, 0.440216, 0.42, 0.0}, - {0.234547, 0.885309, -0.401517, 0.0}, - {0.132598, 0.80115, -0.58359, 0.0}, - {-0.377899, -0.639179, 0.669808, 0.0}, - {-0.865993, -0.396465, 0.304748, 0.0}, - {-0.624815, -0.44283, 0.643046, 0.0}, - {-0.485705, 0.825614, -0.287146, 0.0}, - {-0.971788, 0.175535, 0.157529, 0.0}, - {-0.456027, 0.392629, 0.798675, 0.0}, - {-0.0104443, 0.521623, -0.853112, 0.0}, - {-0.660575, -0.74519, 0.091282, 0.0}, - {-0.0157698, -0.307475, -0.951425, 0.0}, - {-0.603467, -0.250192, 0.757121, 0.0}, - {0.506876, 0.25006, 0.824952, 0.0}, - {0.255404, 0.966794, 0.00884498, 0.0}, - {0.466764, -0.874228, -0.133625, 0.0}, - {0.475077, -0.0682351, -0.877295, 0.0}, - {-0.224967, -0.938972, -0.260233, 0.0}, - {-0.377929, -0.814757, -0.439705, 0.0}, - {-0.305847, 0.542333, -0.782517, 0.0}, - {0.26658, -0.902905, -0.337191, 0.0}, - {0.0275773, 0.322158, -0.946284, 0.0}, - {0.0185422, 0.716349, 0.697496, 0.0}, - {-0.20483, 0.978416, 0.0273371, 0.0}, - {-0.898276, 0.373969, 0.230752, 0.0}, - {-0.00909378, 0.546594, 0.837349, 0.0}, - {0.6602, -0.751089, 0.000959236, 0.0}, - {0.855301, -0.303056, 0.420259, 0.0}, - {0.797138, 0.0623013, -0.600574, 0.0}, - {0.48947, -0.866813, 0.0951509, 0.0}, - {0.251142, 0.674531, 0.694216, 0.0}, - {-0.578422, -0.737373, -0.348867, 0.0}, - {-0.254689, -0.514807, 0.818601, 0.0}, - {0.374972, 0.761612, 0.528529, 0.0}, - {0.640303, -0.734271, -0.225517, 0.0}, - {-0.638076, 0.285527, 0.715075, 0.0}, - {0.772956, -0.15984, -0.613995, 0.0}, - {0.798217, -0.590628, 0.118356, 0.0}, - {-0.986276, -0.0578337, -0.154644, 0.0}, - {-0.312988, -0.94549, 0.0899272, 0.0}, - {-0.497338, 0.178325, 0.849032, 0.0}, - {-0.101136, -0.981014, 0.165477, 0.0}, - {-0.521688, 0.0553434, -0.851339, 0.0}, - {-0.786182, -0.583814, 0.202678, 0.0}, - {-0.565191, 0.821858, -0.0714658, 0.0}, - {0.437895, 0.152598, -0.885981, 0.0}, - {-0.92394, 0.353436, -0.14635, 0.0}, - {0.212189, -0.815162, -0.538969, 0.0}, - {-0.859262, 0.143405, -0.491024, 0.0}, - {0.991353, 0.112814, 0.0670273, 0.0}, - {0.0337884, -0.979891, -0.196654, 0.0} - }; - - public VectorTable() - { - - } - - public double getRandomVectors(int a, int b) - { - return randomVectors[a][b]; - } - - - -} - +/* + * This file is in the public domain + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava; + +public class VectorTable +{ + + /** + * A table of 256 random normalized vectors. + * Each row is an (x, y, z, 0) coordinate. + * The 0 is used as padding so we can use bit shifts to index + * any row in the table. These vectors have an even statistical + * distribution, which improves the quality of the coherent noise + * generated by these vectors. For more information, see "GPU Gems", + * Chapter 5 - Implementing Improved Perlin Noise by Ken Perlin, + * specifically page 76. + */ + private static double[][] randomVectors = { + {-0.763874, -0.596439, -0.246489, 0.0}, + {0.396055, 0.904518, -0.158073, 0.0}, + {-0.499004, -0.8665, -0.0131631, 0.0}, + {0.468724, -0.824756, 0.316346, 0.0}, + {0.829598, 0.43195, 0.353816, 0.0}, + {-0.454473, 0.629497, -0.630228, 0.0}, + {-0.162349, -0.869962, -0.465628, 0.0}, + {0.932805, 0.253451, 0.256198, 0.0}, + {-0.345419, 0.927299, -0.144227, 0.0}, + {-0.715026, -0.293698, -0.634413, 0.0}, + {-0.245997, 0.717467, -0.651711, 0.0}, + {-0.967409, -0.250435, -0.037451, 0.0}, + {0.901729, 0.397108, -0.170852, 0.0}, + {0.892657, -0.0720622, -0.444938, 0.0}, + {0.0260084, -0.0361701, 0.999007, 0.0}, + {0.949107, -0.19486, 0.247439, 0.0}, + {0.471803, -0.807064, -0.355036, 0.0}, + {0.879737, 0.141845, 0.453809, 0.0}, + {0.570747, 0.696415, 0.435033, 0.0}, + {-0.141751, -0.988233, -0.0574584, 0.0}, + {-0.58219, -0.0303005, 0.812488, 0.0}, + {-0.60922, 0.239482, -0.755975, 0.0}, + {0.299394, -0.197066, -0.933557, 0.0}, + {-0.851615, -0.220702, -0.47544, 0.0}, + {0.848886, 0.341829, -0.403169, 0.0}, + {-0.156129, -0.687241, 0.709453, 0.0}, + {-0.665651, 0.626724, 0.405124, 0.0}, + {0.595914, -0.674582, 0.43569, 0.0}, + {0.171025, -0.509292, 0.843428, 0.0}, + {0.78605, 0.536414, -0.307222, 0.0}, + {0.18905, -0.791613, 0.581042, 0.0}, + {-0.294916, 0.844994, 0.446105, 0.0}, + {0.342031, -0.58736, -0.7335, 0.0}, + {0.57155, 0.7869, 0.232635, 0.0}, + {0.885026, -0.408223, 0.223791, 0.0}, + {-0.789518, 0.571645, 0.223347, 0.0}, + {0.774571, 0.31566, 0.548087, 0.0}, + {-0.79695, -0.0433603, -0.602487, 0.0}, + {-0.142425, -0.473249, -0.869339, 0.0}, + {-0.0698838, 0.170442, 0.982886, 0.0}, + {0.687815, -0.484748, 0.540306, 0.0}, + {0.543703, -0.534446, -0.647112, 0.0}, + {0.97186, 0.184391, -0.146588, 0.0}, + {0.707084, 0.485713, -0.513921, 0.0}, + {0.942302, 0.331945, 0.043348, 0.0}, + {0.499084, 0.599922, 0.625307, 0.0}, + {-0.289203, 0.211107, 0.9337, 0.0}, + {0.412433, -0.71667, -0.56239, 0.0}, + {0.87721, -0.082816, 0.47291, 0.0}, + {-0.420685, -0.214278, 0.881538, 0.0}, + {0.752558, -0.0391579, 0.657361, 0.0}, + {0.0765725, -0.996789, 0.0234082, 0.0}, + {-0.544312, -0.309435, -0.779727, 0.0}, + {-0.455358, -0.415572, 0.787368, 0.0}, + {-0.874586, 0.483746, 0.0330131, 0.0}, + {0.245172, -0.0838623, 0.965846, 0.0}, + {0.382293, -0.432813, 0.81641, 0.0}, + {-0.287735, -0.905514, 0.311853, 0.0}, + {-0.667704, 0.704955, -0.239186, 0.0}, + {0.717885, -0.464002, -0.518983, 0.0}, + {0.976342, -0.214895, 0.0240053, 0.0}, + {-0.0733096, -0.921136, 0.382276, 0.0}, + {-0.986284, 0.151224, -0.0661379, 0.0}, + {-0.899319, -0.429671, 0.0812908, 0.0}, + {0.652102, -0.724625, 0.222893, 0.0}, + {0.203761, 0.458023, -0.865272, 0.0}, + {-0.030396, 0.698724, -0.714745, 0.0}, + {-0.460232, 0.839138, 0.289887, 0.0}, + {-0.0898602, 0.837894, 0.538386, 0.0}, + {-0.731595, 0.0793784, 0.677102, 0.0}, + {-0.447236, -0.788397, 0.422386, 0.0}, + {0.186481, 0.645855, -0.740335, 0.0}, + {-0.259006, 0.935463, 0.240467, 0.0}, + {0.445839, 0.819655, -0.359712, 0.0}, + {0.349962, 0.755022, -0.554499, 0.0}, + {-0.997078, -0.0359577, 0.0673977, 0.0}, + {-0.431163, -0.147516, -0.890133, 0.0}, + {0.299648, -0.63914, 0.708316, 0.0}, + {0.397043, 0.566526, -0.722084, 0.0}, + {-0.502489, 0.438308, -0.745246, 0.0}, + {0.0687235, 0.354097, 0.93268, 0.0}, + {-0.0476651, -0.462597, 0.885286, 0.0}, + {-0.221934, 0.900739, -0.373383, 0.0}, + {-0.956107, -0.225676, 0.186893, 0.0}, + {-0.187627, 0.391487, -0.900852, 0.0}, + {-0.224209, -0.315405, 0.92209, 0.0}, + {-0.730807, -0.537068, 0.421283, 0.0}, + {-0.0353135, -0.816748, 0.575913, 0.0}, + {-0.941391, 0.176991, -0.287153, 0.0}, + {-0.154174, 0.390458, 0.90762, 0.0}, + {-0.283847, 0.533842, 0.796519, 0.0}, + {-0.482737, -0.850448, 0.209052, 0.0}, + {-0.649175, 0.477748, 0.591886, 0.0}, + {0.885373, -0.405387, -0.227543, 0.0}, + {-0.147261, 0.181623, -0.972279, 0.0}, + {0.0959236, -0.115847, -0.988624, 0.0}, + {-0.89724, -0.191348, 0.397928, 0.0}, + {0.903553, -0.428461, -0.00350461, 0.0}, + {0.849072, -0.295807, -0.437693, 0.0}, + {0.65551, 0.741754, -0.141804, 0.0}, + {0.61598, -0.178669, 0.767232, 0.0}, + {0.0112967, 0.932256, -0.361623, 0.0}, + {-0.793031, 0.258012, 0.551845, 0.0}, + {0.421933, 0.454311, 0.784585, 0.0}, + {-0.319993, 0.0401618, -0.946568, 0.0}, + {-0.81571, 0.551307, -0.175151, 0.0}, + {-0.377644, 0.00322313, 0.925945, 0.0}, + {0.129759, -0.666581, -0.734052, 0.0}, + {0.601901, -0.654237, -0.457919, 0.0}, + {-0.927463, -0.0343576, -0.372334, 0.0}, + {-0.438663, -0.868301, -0.231578, 0.0}, + {-0.648845, -0.749138, -0.133387, 0.0}, + {0.507393, -0.588294, 0.629653, 0.0}, + {0.726958, 0.623665, 0.287358, 0.0}, + {0.411159, 0.367614, -0.834151, 0.0}, + {0.806333, 0.585117, -0.0864016, 0.0}, + {0.263935, -0.880876, 0.392932, 0.0}, + {0.421546, -0.201336, 0.884174, 0.0}, + {-0.683198, -0.569557, -0.456996, 0.0}, + {-0.117116, -0.0406654, -0.992285, 0.0}, + {-0.643679, -0.109196, -0.757465, 0.0}, + {-0.561559, -0.62989, 0.536554, 0.0}, + {0.0628422, 0.104677, -0.992519, 0.0}, + {0.480759, -0.2867, -0.828658, 0.0}, + {-0.228559, -0.228965, -0.946222, 0.0}, + {-0.10194, -0.65706, -0.746914, 0.0}, + {0.0689193, -0.678236, 0.731605, 0.0}, + {0.401019, -0.754026, 0.52022, 0.0}, + {-0.742141, 0.547083, -0.387203, 0.0}, + {-0.00210603, -0.796417, -0.604745, 0.0}, + {0.296725, -0.409909, -0.862513, 0.0}, + {-0.260932, -0.798201, 0.542945, 0.0}, + {-0.641628, 0.742379, 0.192838, 0.0}, + {-0.186009, -0.101514, 0.97729, 0.0}, + {0.106711, -0.962067, 0.251079, 0.0}, + {-0.743499, 0.30988, -0.592607, 0.0}, + {-0.795853, -0.605066, -0.0226607, 0.0}, + {-0.828661, -0.419471, -0.370628, 0.0}, + {0.0847218, -0.489815, -0.8677, 0.0}, + {-0.381405, 0.788019, -0.483276, 0.0}, + {0.282042, -0.953394, 0.107205, 0.0}, + {0.530774, 0.847413, 0.0130696, 0.0}, + {0.0515397, 0.922524, 0.382484, 0.0}, + {-0.631467, -0.709046, 0.313852, 0.0}, + {0.688248, 0.517273, 0.508668, 0.0}, + {0.646689, -0.333782, -0.685845, 0.0}, + {-0.932528, -0.247532, -0.262906, 0.0}, + {0.630609, 0.68757, -0.359973, 0.0}, + {0.577805, -0.394189, 0.714673, 0.0}, + {-0.887833, -0.437301, -0.14325, 0.0}, + {0.690982, 0.174003, 0.701617, 0.0}, + {-0.866701, 0.0118182, 0.498689, 0.0}, + {-0.482876, 0.727143, 0.487949, 0.0}, + {-0.577567, 0.682593, -0.447752, 0.0}, + {0.373768, 0.0982991, 0.922299, 0.0}, + {0.170744, 0.964243, -0.202687, 0.0}, + {0.993654, -0.035791, -0.106632, 0.0}, + {0.587065, 0.4143, -0.695493, 0.0}, + {-0.396509, 0.26509, -0.878924, 0.0}, + {-0.0866853, 0.83553, -0.542563, 0.0}, + {0.923193, 0.133398, -0.360443, 0.0}, + {0.00379108, -0.258618, 0.965972, 0.0}, + {0.239144, 0.245154, -0.939526, 0.0}, + {0.758731, -0.555871, 0.33961, 0.0}, + {0.295355, 0.309513, 0.903862, 0.0}, + {0.0531222, -0.91003, -0.411124, 0.0}, + {0.270452, 0.0229439, -0.96246, 0.0}, + {0.563634, 0.0324352, 0.825387, 0.0}, + {0.156326, 0.147392, 0.976646, 0.0}, + {-0.0410141, 0.981824, 0.185309, 0.0}, + {-0.385562, -0.576343, -0.720535, 0.0}, + {0.388281, 0.904441, 0.176702, 0.0}, + {0.945561, -0.192859, -0.262146, 0.0}, + {0.844504, 0.520193, 0.127325, 0.0}, + {0.0330893, 0.999121, -0.0257505, 0.0}, + {-0.592616, -0.482475, -0.644999, 0.0}, + {0.539471, 0.631024, -0.557476, 0.0}, + {0.655851, -0.027319, -0.754396, 0.0}, + {0.274465, 0.887659, 0.369772, 0.0}, + {-0.123419, 0.975177, -0.183842, 0.0}, + {-0.223429, 0.708045, 0.66989, 0.0}, + {-0.908654, 0.196302, 0.368528, 0.0}, + {-0.95759, -0.00863708, 0.288005, 0.0}, + {0.960535, 0.030592, 0.276472, 0.0}, + {-0.413146, 0.907537, 0.0754161, 0.0}, + {-0.847992, 0.350849, -0.397259, 0.0}, + {0.614736, 0.395841, 0.68221, 0.0}, + {-0.503504, -0.666128, -0.550234, 0.0}, + {-0.268833, -0.738524, -0.618314, 0.0}, + {0.792737, -0.60001, -0.107502, 0.0}, + {-0.637582, 0.508144, -0.579032, 0.0}, + {0.750105, 0.282165, -0.598101, 0.0}, + {-0.351199, -0.392294, -0.850155, 0.0}, + {0.250126, -0.960993, -0.118025, 0.0}, + {-0.732341, 0.680909, -0.0063274, 0.0}, + {-0.760674, -0.141009, 0.633634, 0.0}, + {0.222823, -0.304012, 0.926243, 0.0}, + {0.209178, 0.505671, 0.836984, 0.0}, + {0.757914, -0.56629, -0.323857, 0.0}, + {-0.782926, -0.339196, 0.52151, 0.0}, + {-0.462952, 0.585565, 0.665424, 0.0}, + {0.61879, 0.194119, -0.761194, 0.0}, + {0.741388, -0.276743, 0.611357, 0.0}, + {0.707571, 0.702621, 0.0752872, 0.0}, + {0.156562, 0.819977, 0.550569, 0.0}, + {-0.793606, 0.440216, 0.42, 0.0}, + {0.234547, 0.885309, -0.401517, 0.0}, + {0.132598, 0.80115, -0.58359, 0.0}, + {-0.377899, -0.639179, 0.669808, 0.0}, + {-0.865993, -0.396465, 0.304748, 0.0}, + {-0.624815, -0.44283, 0.643046, 0.0}, + {-0.485705, 0.825614, -0.287146, 0.0}, + {-0.971788, 0.175535, 0.157529, 0.0}, + {-0.456027, 0.392629, 0.798675, 0.0}, + {-0.0104443, 0.521623, -0.853112, 0.0}, + {-0.660575, -0.74519, 0.091282, 0.0}, + {-0.0157698, -0.307475, -0.951425, 0.0}, + {-0.603467, -0.250192, 0.757121, 0.0}, + {0.506876, 0.25006, 0.824952, 0.0}, + {0.255404, 0.966794, 0.00884498, 0.0}, + {0.466764, -0.874228, -0.133625, 0.0}, + {0.475077, -0.0682351, -0.877295, 0.0}, + {-0.224967, -0.938972, -0.260233, 0.0}, + {-0.377929, -0.814757, -0.439705, 0.0}, + {-0.305847, 0.542333, -0.782517, 0.0}, + {0.26658, -0.902905, -0.337191, 0.0}, + {0.0275773, 0.322158, -0.946284, 0.0}, + {0.0185422, 0.716349, 0.697496, 0.0}, + {-0.20483, 0.978416, 0.0273371, 0.0}, + {-0.898276, 0.373969, 0.230752, 0.0}, + {-0.00909378, 0.546594, 0.837349, 0.0}, + {0.6602, -0.751089, 0.000959236, 0.0}, + {0.855301, -0.303056, 0.420259, 0.0}, + {0.797138, 0.0623013, -0.600574, 0.0}, + {0.48947, -0.866813, 0.0951509, 0.0}, + {0.251142, 0.674531, 0.694216, 0.0}, + {-0.578422, -0.737373, -0.348867, 0.0}, + {-0.254689, -0.514807, 0.818601, 0.0}, + {0.374972, 0.761612, 0.528529, 0.0}, + {0.640303, -0.734271, -0.225517, 0.0}, + {-0.638076, 0.285527, 0.715075, 0.0}, + {0.772956, -0.15984, -0.613995, 0.0}, + {0.798217, -0.590628, 0.118356, 0.0}, + {-0.986276, -0.0578337, -0.154644, 0.0}, + {-0.312988, -0.94549, 0.0899272, 0.0}, + {-0.497338, 0.178325, 0.849032, 0.0}, + {-0.101136, -0.981014, 0.165477, 0.0}, + {-0.521688, 0.0553434, -0.851339, 0.0}, + {-0.786182, -0.583814, 0.202678, 0.0}, + {-0.565191, 0.821858, -0.0714658, 0.0}, + {0.437895, 0.152598, -0.885981, 0.0}, + {-0.92394, 0.353436, -0.14635, 0.0}, + {0.212189, -0.815162, -0.538969, 0.0}, + {-0.859262, 0.143405, -0.491024, 0.0}, + {0.991353, 0.112814, 0.0670273, 0.0}, + {0.0337884, -0.979891, -0.196654, 0.0} + }; + + private VectorTable() + { + + } + + public static double getRandomVectors(int a, int b) + { + return randomVectors[a][b]; + } + + + +} + diff --git a/src/libnoiseforjava/exception/ExceptionInvalidParam.java b/src/libnoiseforjava/exception/ExceptionInvalidParam.java index 8c62ce4..f79bf91 100644 --- a/src/libnoiseforjava/exception/ExceptionInvalidParam.java +++ b/src/libnoiseforjava/exception/ExceptionInvalidParam.java @@ -1,42 +1,42 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.exception; - -public class ExceptionInvalidParam extends Exception -{ - - /** - * - */ - private static final long serialVersionUID = 5603051793321603318L; - - public ExceptionInvalidParam(String message) - { - super(message); - } - -} - +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.exception; + +public class ExceptionInvalidParam extends Exception +{ + + /** + * + */ + private static final long serialVersionUID = 5603051793321603318L; + + public ExceptionInvalidParam(String message) + { + super(message); + } + +} + diff --git a/src/libnoiseforjava/exception/ExceptionNoModule.java b/src/libnoiseforjava/exception/ExceptionNoModule.java index 026d2c5..c6dccd6 100644 --- a/src/libnoiseforjava/exception/ExceptionNoModule.java +++ b/src/libnoiseforjava/exception/ExceptionNoModule.java @@ -1,41 +1,41 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.exception; - -public class ExceptionNoModule extends Exception -{ - - /** - * - */ - private static final long serialVersionUID = -4820882012470782847L; - - public ExceptionNoModule(String message) - { - super(message); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.exception; + +public class ExceptionNoModule extends Exception +{ + + /** + * + */ + private static final long serialVersionUID = -4820882012470782847L; + + public ExceptionNoModule(String message) + { + super(message); + } + +} diff --git a/src/libnoiseforjava/model/Cylinder.java b/src/libnoiseforjava/model/Cylinder.java index 1bda73c..04647b7 100644 --- a/src/libnoiseforjava/model/Cylinder.java +++ b/src/libnoiseforjava/model/Cylinder.java @@ -1,115 +1,115 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.model; - -import libnoiseforjava.module.ModuleBase; - -public class Cylinder -{ - /// Model that defines the surface of a cylinder. - /// - /// @image html modelcylinder.png - /// - /// This model returns an output value from a noise module given the - /// coordinates of an input value located on the surface of a cylinder. - /// - /// To generate an output value, pass the (angle, height) coordinates of - /// an input value to the GetValue() method. - /// - /// This model is useful for creating: - /// - seamless textures that can be mapped onto a cylinder - /// - /// This cylinder has a radius of 1.0 unit and has infinite height. It is - /// oriented along the @a y axis. Its center is located at the origin. - - - - /// A pointer to the noise module used to generate the output values. - ModuleBase module; - - public Cylinder () - { - module = new ModuleBase(1); - } - - Cylinder (ModuleBase module) - { - this.module = module; - } - - /// Returns the output value from the noise module given the - /// (angle, height) coordinates of the specified input value located - /// on the surface of the cylinder. - /// - /// @param angle The angle around the cylinder's center, in degrees. - /// @param height The height along the @a y axis. - /// - /// @returns The output value from the noise module. - /// - /// @pre A noise module was passed to the setModule() method. - /// - /// This output value is generated by the noise module passed to the - /// SetModule() method. - /// - /// This cylinder has a radius of 1.0 unit and has infinite height. - /// It is oriented along the @a y axis. Its center is located at the - /// origin. - public double getValue (double angle, double height) - { - assert (module != null); - - double x, y, z; - x = Math.cos(Math.toRadians(angle)); - y = height; - z = Math.sin(Math.toRadians(angle)); - return module.getValue (x, y, z); - } - - /// Returns the noise module that is used to generate the output - /// values. - /// - /// @returns A reference to the noise module. - /// - /// @pre A noise module was passed to the setModule() method. - public ModuleBase getModule () - { - assert (module != null); - return module; - } - - /// Sets the noise module that is used to generate the output values. - /// - /// @param module The noise module that is used to generate the output - /// values. - /// - /// This noise module must exist for the lifetime of this object, - /// until you pass a new noise module to this method. - public void setModule (ModuleBase module) - { - this.module = module; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.model; + +import libnoiseforjava.module.ModuleBase; + +public class Cylinder +{ + /// Model that defines the surface of a cylinder. + /// + /// @image html modelcylinder.png + /// + /// This model returns an output value from a noise module given the + /// coordinates of an input value located on the surface of a cylinder. + /// + /// To generate an output value, pass the (angle, height) coordinates of + /// an input value to the GetValue() method. + /// + /// This model is useful for creating: + /// - seamless textures that can be mapped onto a cylinder + /// + /// This cylinder has a radius of 1.0 unit and has infinite height. It is + /// oriented along the @a y axis. Its center is located at the origin. + + + + /// A pointer to the noise module used to generate the output values. + ModuleBase module; + + public Cylinder () + { + module = new ModuleBase(1); + } + + Cylinder (ModuleBase module) + { + this.module = module; + } + + /// Returns the output value from the noise module given the + /// (angle, height) coordinates of the specified input value located + /// on the surface of the cylinder. + /// + /// @param angle The angle around the cylinder's center, in degrees. + /// @param height The height along the @a y axis. + /// + /// @returns The output value from the noise module. + /// + /// @pre A noise module was passed to the setModule() method. + /// + /// This output value is generated by the noise module passed to the + /// SetModule() method. + /// + /// This cylinder has a radius of 1.0 unit and has infinite height. + /// It is oriented along the @a y axis. Its center is located at the + /// origin. + public double getValue (double angle, double height) + { + assert (module != null); + + double x, y, z; + x = Math.cos(Math.toRadians(angle)); + y = height; + z = Math.sin(Math.toRadians(angle)); + return module.getValue (x, y, z); + } + + /// Returns the noise module that is used to generate the output + /// values. + /// + /// @returns A reference to the noise module. + /// + /// @pre A noise module was passed to the setModule() method. + public ModuleBase getModule () + { + assert (module != null); + return module; + } + + /// Sets the noise module that is used to generate the output values. + /// + /// @param module The noise module that is used to generate the output + /// values. + /// + /// This noise module must exist for the lifetime of this object, + /// until you pass a new noise module to this method. + public void setModule (ModuleBase module) + { + this.module = module; + } + +} diff --git a/src/libnoiseforjava/model/Line.java b/src/libnoiseforjava/model/Line.java index 1543b0c..7509f90 100644 --- a/src/libnoiseforjava/model/Line.java +++ b/src/libnoiseforjava/model/Line.java @@ -1,264 +1,264 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.model; - -import libnoiseforjava.module.ModuleBase; - -public class Line -{ - - /// Model that defines the displacement of a line segment. - /// - /// This model returns an output value from a noise module given the - /// one-dimensional coordinate of an input value located on a line - /// segment, which can be used as displacements. - /// - /// This class is useful for creating: - /// - roads and rivers - /// - disaffected college students - /// - /// To generate an output value, pass an input value between 0.0 and 1.0 - /// to the getValue() method. 0.0 represents the start position of the - /// line segment and 1.0 represents the end position of the line segment. - - - /// A flag that specifies whether the value is to be attenuated - /// (moved toward 0.0) as the ends of the line segment are approached. - boolean attenuate; - - /// A pointer to the noise module used to generate the output values. - ModuleBase module; - - /// @a x coordinate of the start of the line segment. - double x0; - - /// @a x coordinate of the end of the line segment. - double x1; - - /// @a y coordinate of the start of the line segment. - double y0; - - /// @a y coordinate of the end of the line segment. - double y1; - - /// @a z coordinate of the start of the line segment. - double z0; - - /// @a z coordinate of the end of the line segment. - double z1; - - Line () - { - attenuate = true; - module = new ModuleBase(1); - x0 = 0.0; - x1 = 1.0; - y0 = 0.0; - y1 = 1.0; - z0 = 0.0; - z1 = 1.0; - } - - Line (ModuleBase module) - { - attenuate = true; - this.module = module; - x0 = 0.0; - x1 = 1.0; - y0 = 0.0; - y1 = 1.0; - z0 = 0.0; - z1 = 1.0; - } - - /// Returns the output value from the noise module given the - /// one-dimensional coordinate of the specified input value located - /// on the line segment. - /// - /// @param p The distance along the line segment (ranges from 0.0 - /// to 1.0) - /// - /// @returns The output value from the noise module. - /// - /// @pre A noise module was passed to the setModule() method. - /// @pre The start and end points of the line segment were specified. - /// - /// The output value is generated by the noise module passed to the - /// setModule() method. This value may be attenuated (moved toward - /// 0.0) as @a p approaches either end of the line segment; this is - /// the default behavior. - /// - /// If the value is not to be attenuated, @a p can safely range - /// outside the 0.0 to 1.0 range; the output value will be - /// extrapolated along the line that this segment is part of. - public double getValue (double p) - { - assert (module != null); - - double x = (x1 - x0) * p + x0; - double y = (y1 - y0) * p + y0; - double z = (z1 - z0) * p + z0; - double value = module.getValue (x, y, z); - - if (attenuate) - return p * (1.0 - p) * 4 * value; - else - return value; - } - - /// Returns a flag indicating whether the output value is to be - /// attenuated (moved toward 0.0) as the ends of the line segment are - /// approached by the input value. - /// - /// @returns - /// - @a true if the value is to be attenuated - /// - @a false if not. - public boolean getAttenuate () - { - return attenuate; - } - - /// Returns the noise module that is used to generate the output - /// values. - /// - /// @returns A reference to the noise module. - /// - /// @pre A noise module was passed to the setModule() method. - public ModuleBase getModule () - { - assert (module != null); - return module; - } - - /// Sets a flag indicating that the output value is to be attenuated - /// (moved toward 0.0) as the ends of the line segment are approached. - /// - /// @param att A flag that specifies whether the output value is to be - /// attenuated. - public void setAttenuate (boolean att) - { - attenuate = att; - } - - /// Sets the position ( @a x, @a y, @a z ) of the end of the line - /// segment to choose values along. - /// - /// @param x x coordinate of the end position. - /// @param y y coordinate of the end position. - /// @param z z coordinate of the end position. - public void setEndPoint (double x, double y, double z) - { - x1 = x; - y1 = y; - z1 = z; - } - - /// Sets the noise module that is used to generate the output values. - /// - /// @param module The noise module that is used to generate the output - /// values. - /// - /// This noise module must exist for the lifetime of this object, - /// until you pass a new noise module to this method. - public void setModule (ModuleBase module) - { - this.module = module; - } - - /// Sets the position ( @a x, @a y, @a z ) of the start of the line - /// segment to choose values along. - /// - /// @param x x coordinate of the start position. - /// @param y y coordinate of the start position. - /// @param z z coordinate of the start position. - public void setStartPoint (double x, double y, double z) - { - x0 = x; - y0 = y; - z0 = z; - } - - public double getX0() - { - return x0; - } - - public double getX1() - { - return x1; - } - - public double getY0() - { - return y0; - } - - public double getY1() - { - return y1; - } - - public double getZ0() - { - return z0; - } - - public double getZ1() - { - return z1; - } - - public void setX0(double x0) - { - this.x0 = x0; - } - - public void setX1(double x1) - { - this.x1 = x1; - } - - public void setY0(double y0) - { - this.y0 = y0; - } - - public void setY1(double y1) - { - this.y1 = y1; - } - - public void setZ0(double z0) - { - this.z0 = z0; - } - - public void setZ1(double z1) - { - this.z1 = z1; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.model; + +import libnoiseforjava.module.ModuleBase; + +public class Line +{ + + /// Model that defines the displacement of a line segment. + /// + /// This model returns an output value from a noise module given the + /// one-dimensional coordinate of an input value located on a line + /// segment, which can be used as displacements. + /// + /// This class is useful for creating: + /// - roads and rivers + /// - disaffected college students + /// + /// To generate an output value, pass an input value between 0.0 and 1.0 + /// to the getValue() method. 0.0 represents the start position of the + /// line segment and 1.0 represents the end position of the line segment. + + + /// A flag that specifies whether the value is to be attenuated + /// (moved toward 0.0) as the ends of the line segment are approached. + boolean attenuate; + + /// A pointer to the noise module used to generate the output values. + ModuleBase module; + + /// @a x coordinate of the start of the line segment. + double x0; + + /// @a x coordinate of the end of the line segment. + double x1; + + /// @a y coordinate of the start of the line segment. + double y0; + + /// @a y coordinate of the end of the line segment. + double y1; + + /// @a z coordinate of the start of the line segment. + double z0; + + /// @a z coordinate of the end of the line segment. + double z1; + + Line () + { + attenuate = true; + module = new ModuleBase(1); + x0 = 0.0; + x1 = 1.0; + y0 = 0.0; + y1 = 1.0; + z0 = 0.0; + z1 = 1.0; + } + + Line (ModuleBase module) + { + attenuate = true; + this.module = module; + x0 = 0.0; + x1 = 1.0; + y0 = 0.0; + y1 = 1.0; + z0 = 0.0; + z1 = 1.0; + } + + /// Returns the output value from the noise module given the + /// one-dimensional coordinate of the specified input value located + /// on the line segment. + /// + /// @param p The distance along the line segment (ranges from 0.0 + /// to 1.0) + /// + /// @returns The output value from the noise module. + /// + /// @pre A noise module was passed to the setModule() method. + /// @pre The start and end points of the line segment were specified. + /// + /// The output value is generated by the noise module passed to the + /// setModule() method. This value may be attenuated (moved toward + /// 0.0) as @a p approaches either end of the line segment; this is + /// the default behavior. + /// + /// If the value is not to be attenuated, @a p can safely range + /// outside the 0.0 to 1.0 range; the output value will be + /// extrapolated along the line that this segment is part of. + public double getValue (double p) + { + assert (module != null); + + double x = (x1 - x0) * p + x0; + double y = (y1 - y0) * p + y0; + double z = (z1 - z0) * p + z0; + double value = module.getValue (x, y, z); + + if (attenuate) + return p * (1.0 - p) * 4 * value; + else + return value; + } + + /// Returns a flag indicating whether the output value is to be + /// attenuated (moved toward 0.0) as the ends of the line segment are + /// approached by the input value. + /// + /// @returns + /// - @a true if the value is to be attenuated + /// - @a false if not. + public boolean getAttenuate () + { + return attenuate; + } + + /// Returns the noise module that is used to generate the output + /// values. + /// + /// @returns A reference to the noise module. + /// + /// @pre A noise module was passed to the setModule() method. + public ModuleBase getModule () + { + assert (module != null); + return module; + } + + /// Sets a flag indicating that the output value is to be attenuated + /// (moved toward 0.0) as the ends of the line segment are approached. + /// + /// @param att A flag that specifies whether the output value is to be + /// attenuated. + public void setAttenuate (boolean att) + { + attenuate = att; + } + + /// Sets the position ( @a x, @a y, @a z ) of the end of the line + /// segment to choose values along. + /// + /// @param x x coordinate of the end position. + /// @param y y coordinate of the end position. + /// @param z z coordinate of the end position. + public void setEndPoint (double x, double y, double z) + { + x1 = x; + y1 = y; + z1 = z; + } + + /// Sets the noise module that is used to generate the output values. + /// + /// @param module The noise module that is used to generate the output + /// values. + /// + /// This noise module must exist for the lifetime of this object, + /// until you pass a new noise module to this method. + public void setModule (ModuleBase module) + { + this.module = module; + } + + /// Sets the position ( @a x, @a y, @a z ) of the start of the line + /// segment to choose values along. + /// + /// @param x x coordinate of the start position. + /// @param y y coordinate of the start position. + /// @param z z coordinate of the start position. + public void setStartPoint (double x, double y, double z) + { + x0 = x; + y0 = y; + z0 = z; + } + + public double getX0() + { + return x0; + } + + public double getX1() + { + return x1; + } + + public double getY0() + { + return y0; + } + + public double getY1() + { + return y1; + } + + public double getZ0() + { + return z0; + } + + public double getZ1() + { + return z1; + } + + public void setX0(double x0) + { + this.x0 = x0; + } + + public void setX1(double x1) + { + this.x1 = x1; + } + + public void setY0(double y0) + { + this.y0 = y0; + } + + public void setY1(double y1) + { + this.y1 = y1; + } + + public void setZ0(double z0) + { + this.z0 = z0; + } + + public void setZ1(double z1) + { + this.z1 = z1; + } + +} diff --git a/src/libnoiseforjava/model/Plane.java b/src/libnoiseforjava/model/Plane.java index 8cabdda..4d498f4 100644 --- a/src/libnoiseforjava/model/Plane.java +++ b/src/libnoiseforjava/model/Plane.java @@ -1,105 +1,105 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.model; - -import libnoiseforjava.module.ModuleBase; - -public class Plane -{ - /// Model that defines the surface of a plane. - /// - /// This model returns an output value from a noise module given the - /// coordinates of an input value located on the surface of an ( @a x, - /// @a z ) plane. - /// - /// To generate an output value, pass the ( @a x, @a z ) coordinates of - /// an input value to the GetValue() method. - /// - /// This model is useful for creating: - /// - two-dimensional textures - /// - terrain height maps for local areas - /// - /// This plane extends infinitely in both directions. - - - /// A pointer to the noise module used to generate the output values. - ModuleBase module; - - public Plane () - { - module = new ModuleBase(1); - } - - public Plane (ModuleBase module) - { - this.module = module; - } - - /// Returns the output value from the noise module given the - /// ( @a x, @a z ) coordinates of the specified input value located - /// on the surface of the plane. - /// - /// @param x The @a x coordinate of the input value. - /// @param z The @a z coordinate of the input value. - /// - /// @returns The output value from the noise module. - /// - /// @pre A noise module was passed to the setModule() method. - /// - /// This output value is generated by the noise module passed to the - /// setModule() method. - public double getValue (double x, double z) - { - assert (module != null); - - return module.getValue (x, 0, z); - } - - /// Returns the noise module that is used to generate the output - /// values. - /// - /// @returns A reference to the noise module. - /// - /// @pre A noise module was passed to the setModule() method. - public ModuleBase getModule () - { - assert (module != null); - return module; - } - - /// Sets the noise module that is used to generate the output values. - /// - /// @param module The noise module that is used to generate the output - /// values. - /// - /// This noise module must exist for the lifetime of this object, - /// until you pass a new noise module to this method. - public void setModule (ModuleBase module) - { - this.module = module; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.model; + +import libnoiseforjava.module.ModuleBase; + +public class Plane +{ + /// Model that defines the surface of a plane. + /// + /// This model returns an output value from a noise module given the + /// coordinates of an input value located on the surface of an ( @a x, + /// @a z ) plane. + /// + /// To generate an output value, pass the ( @a x, @a z ) coordinates of + /// an input value to the GetValue() method. + /// + /// This model is useful for creating: + /// - two-dimensional textures + /// - terrain height maps for local areas + /// + /// This plane extends infinitely in both directions. + + + /// A pointer to the noise module used to generate the output values. + ModuleBase module; + + public Plane () + { + module = new ModuleBase(1); + } + + public Plane (ModuleBase module) + { + this.module = module; + } + + /// Returns the output value from the noise module given the + /// ( @a x, @a z ) coordinates of the specified input value located + /// on the surface of the plane. + /// + /// @param x The @a x coordinate of the input value. + /// @param z The @a z coordinate of the input value. + /// + /// @returns The output value from the noise module. + /// + /// @pre A noise module was passed to the setModule() method. + /// + /// This output value is generated by the noise module passed to the + /// setModule() method. + public double getValue (double x, double z) + { + assert (module != null); + + return module.getValue (x, 0, z); + } + + /// Returns the noise module that is used to generate the output + /// values. + /// + /// @returns A reference to the noise module. + /// + /// @pre A noise module was passed to the setModule() method. + public ModuleBase getModule () + { + assert (module != null); + return module; + } + + /// Sets the noise module that is used to generate the output values. + /// + /// @param module The noise module that is used to generate the output + /// values. + /// + /// This noise module must exist for the lifetime of this object, + /// until you pass a new noise module to this method. + public void setModule (ModuleBase module) + { + this.module = module; + } + +} diff --git a/src/libnoiseforjava/model/Sphere.java b/src/libnoiseforjava/model/Sphere.java index b6733d7..43d2bb9 100644 --- a/src/libnoiseforjava/model/Sphere.java +++ b/src/libnoiseforjava/model/Sphere.java @@ -1,118 +1,118 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.model; - -import libnoiseforjava.module.ModuleBase; - -public class Sphere -{ - /// Model that defines the surface of a sphere. - /// - /// @image html modelsphere.png - /// - /// This model returns an output value from a noise module given the - /// coordinates of an input value located on the surface of a sphere. - /// - /// To generate an output value, pass the (latitude, longitude) - /// coordinates of an input value to the getValue() method. - /// - /// This model is useful for creating: - /// - seamless textures that can be mapped onto a sphere - /// - terrain height maps for entire planets - /// - /// This sphere has a radius of 1.0 unit and its center is located at - /// the origin. - - /// A pointer to the noise module used to generate the output values. - ModuleBase module; - - - public Sphere() - { - module = new ModuleBase(1); - } - - Sphere(ModuleBase module) - { - this.module = module; - } - - /// Returns the output value from the noise module given the - /// (latitude, longitude) coordinates of the specified input value - /// located on the surface of the sphere. - /// - /// @param lat The latitude of the input value, in degrees. - /// @param lon The longitude of the input value, in degrees. - /// - /// @returns The output value from the noise module. - /// - /// @pre A noise module was passed to the setModule() method. - /// - /// This output value is generated by the noise module passed to the - /// setModule() method. - /// - /// Use a negative latitude if the input value is located on the - /// southern hemisphere. - /// - /// Use a negative longitude if the input value is located on the - /// western hemisphere. - public double getValue (double lat, double lon) - { - assert (module != null); - - double x, y, z; - double r = Math.cos(Math.toRadians(lat)); - x = r * Math.cos (Math.toRadians(lon)); - y = Math.sin (Math.toRadians(lat)); - z = r * Math.sin (Math.toRadians(lon)); - return module.getValue (x, y, z); - } - - /// Returns the noise module that is used to generate the output - /// values. - /// - /// @returns A reference to the noise module. - /// - /// @pre A noise module was passed to the setModule() method. - public ModuleBase getModule () - { - assert (module != null); - return module; - } - - /// Sets the noise module that is used to generate the output values. - /// - /// @param module The noise module that is used to generate the output - /// values. - /// - /// This noise module must exist for the lifetime of this object, - /// until you pass a new noise module to this method. - public void setModule (ModuleBase module) - { - this.module = module; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.model; + +import libnoiseforjava.module.ModuleBase; + +public class Sphere +{ + /// Model that defines the surface of a sphere. + /// + /// @image html modelsphere.png + /// + /// This model returns an output value from a noise module given the + /// coordinates of an input value located on the surface of a sphere. + /// + /// To generate an output value, pass the (latitude, longitude) + /// coordinates of an input value to the getValue() method. + /// + /// This model is useful for creating: + /// - seamless textures that can be mapped onto a sphere + /// - terrain height maps for entire planets + /// + /// This sphere has a radius of 1.0 unit and its center is located at + /// the origin. + + /// A pointer to the noise module used to generate the output values. + ModuleBase module; + + + public Sphere() + { + module = new ModuleBase(1); + } + + Sphere(ModuleBase module) + { + this.module = module; + } + + /// Returns the output value from the noise module given the + /// (latitude, longitude) coordinates of the specified input value + /// located on the surface of the sphere. + /// + /// @param lat The latitude of the input value, in degrees. + /// @param lon The longitude of the input value, in degrees. + /// + /// @returns The output value from the noise module. + /// + /// @pre A noise module was passed to the setModule() method. + /// + /// This output value is generated by the noise module passed to the + /// setModule() method. + /// + /// Use a negative latitude if the input value is located on the + /// southern hemisphere. + /// + /// Use a negative longitude if the input value is located on the + /// western hemisphere. + public double getValue (double lat, double lon) + { + assert (module != null); + + double x, y, z; + double r = Math.cos(Math.toRadians(lat)); + x = r * Math.cos (Math.toRadians(lon)); + y = Math.sin (Math.toRadians(lat)); + z = r * Math.sin (Math.toRadians(lon)); + return module.getValue (x, y, z); + } + + /// Returns the noise module that is used to generate the output + /// values. + /// + /// @returns A reference to the noise module. + /// + /// @pre A noise module was passed to the setModule() method. + public ModuleBase getModule () + { + assert (module != null); + return module; + } + + /// Sets the noise module that is used to generate the output values. + /// + /// @param module The noise module that is used to generate the output + /// values. + /// + /// This noise module must exist for the lifetime of this object, + /// until you pass a new noise module to this method. + public void setModule (ModuleBase module) + { + this.module = module; + } + +} diff --git a/src/libnoiseforjava/module/Abs.java b/src/libnoiseforjava/module/Abs.java index b1f06df..89e5c22 100644 --- a/src/libnoiseforjava/module/Abs.java +++ b/src/libnoiseforjava/module/Abs.java @@ -1,52 +1,52 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Abs extends ModuleBase -{ - /// Noise module that outputs the absolute value of the output value from - /// a source module. - /// - /// @image html moduleabs.png - /// - /// This noise module requires one source module. - - Abs (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - } - - public double getValue (double x, double y, double z) - { - assert (this.sourceModules[0] != null); - - return Math.abs(this.sourceModules[0].getValue (x, y, z)); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Abs extends ModuleBase +{ + /// Noise module that outputs the absolute value of the output value from + /// a source module. + /// + /// @image html moduleabs.png + /// + /// This noise module requires one source module. + + Abs (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + } + + public double getValue (double x, double y, double z) + { + assert (this.sourceModules[0] != null); + + return Math.abs(this.sourceModules[0].getValue (x, y, z)); + } + +} diff --git a/src/libnoiseforjava/module/Add.java b/src/libnoiseforjava/module/Add.java index 3cceecb..f06c895 100644 --- a/src/libnoiseforjava/module/Add.java +++ b/src/libnoiseforjava/module/Add.java @@ -1,53 +1,53 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Add extends ModuleBase -{ - /// Noise module that outputs the additive value of the output value from - /// two source modules. - /// - /// This noise module requires two source modules. - - public Add (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam - { - super(2); - setSourceModule(0, sourceModuleOne); - setSourceModule(1, sourceModuleTwo); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (sourceModules[1] != null); - - return sourceModules[0].getValue (x, y, z) - + sourceModules[1].getValue (x, y, z); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Add extends ModuleBase +{ + /// Noise module that outputs the additive value of the output value from + /// two source modules. + /// + /// This noise module requires two source modules. + + public Add (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam + { + super(2); + setSourceModule(0, sourceModuleOne); + setSourceModule(1, sourceModuleTwo); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (sourceModules[1] != null); + + return sourceModules[0].getValue (x, y, z) + + sourceModules[1].getValue (x, y, z); + } + +} diff --git a/src/libnoiseforjava/module/Billow.java b/src/libnoiseforjava/module/Billow.java index a63d1ae..047c8df 100644 --- a/src/libnoiseforjava/module/Billow.java +++ b/src/libnoiseforjava/module/Billow.java @@ -1,184 +1,184 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.NoiseGen; -import libnoiseforjava.NoiseGen.NoiseQuality; - -public class Billow extends ModuleBase -{ - /// Noise module that outputs three-dimensional "billowy" noise. - /// - /// @image html modulebillow.png - /// - /// This noise module generates "billowy" noise suitable for clouds and - /// rocks. - /// - /// This noise module is nearly identical to noise::module::Perlin except - /// this noise module modifies each octave with an absolute-value - /// function. See the documentation of noise::module::Perlin for more - /// information. - - - /// Default frequency for the Billow noise module. - static final double DEFAULT_BILLOW_FREQUENCY = 1.0; - - /// Default lacunarity for the Billow noise module. - static final double DEFAULT_BILLOW_LACUNARITY = 2.0; - - /// Default number of octaves for the the noise::module::Billow noise - /// module. - static final int DEFAULT_BILLOW_OCTAVE_COUNT = 6; - - /// Default persistence value for the the noise::module::Billow noise - /// module. - static final double DEFAULT_BILLOW_PERSISTENCE = 0.5; - - /// Default noise quality for the the noise::module::Billow noise module. - static final NoiseQuality DEFAULT_BILLOW_QUALITY = NoiseQuality.QUALITY_STD; - - /// Default noise seed for the the noise::module::Billow noise module. - static final int DEFAULT_BILLOW_SEED = 0; - - /// Maximum number of octaves for the the noise::module::Billow noise - /// module. - static final int BILLOW_MAX_OCTAVE = 30; - - double frequency, lacunarity, persistence; - int octaveCount, seed; - NoiseQuality noiseQuality; - - public Billow () - { - super(0); - frequency = DEFAULT_BILLOW_FREQUENCY; - lacunarity = DEFAULT_BILLOW_LACUNARITY; - noiseQuality = DEFAULT_BILLOW_QUALITY; - octaveCount = DEFAULT_BILLOW_OCTAVE_COUNT; - persistence = DEFAULT_BILLOW_PERSISTENCE; - seed = DEFAULT_BILLOW_SEED; - } - - public double getValue (double x, double y, double z) - { - double value = 0.0; - double signal = 0.0; - double curPersistence = 1.0; - double nx, ny, nz; - int calcSeed; - - x *= frequency; - y *= frequency; - z *= frequency; - - for (int curOctave = 0; curOctave < octaveCount; curOctave++) - { - // Make sure that these floating-point values have the same range as a 32- - // bit integer so that we can pass them to the coherent-noise functions. - nx = NoiseGen.MakeInt32Range (x); - ny = NoiseGen.MakeInt32Range (y); - nz = NoiseGen.MakeInt32Range (z); - - // Get the coherent-noise value from the input value and add it to the - // final result. - calcSeed = (seed + curOctave) & 0xffffffff; - signal = NoiseGen.GradientCoherentNoise3D (nx, ny, nz, calcSeed, noiseQuality); - signal = 2.0 * Math.abs(signal) - 1.0; - value += signal * curPersistence; - - // Prepare the next octave. - x *= lacunarity; - y *= lacunarity; - z *= lacunarity; - curPersistence *= persistence; - } - - value += 0.5; - - return value; - } - - public double getFrequency() - { - return frequency; - } - - public double getLacunarity() - { - return lacunarity; - } - - public double getPersistence() - { - return persistence; - } - - public int getOctaveCount() - { - return octaveCount; - } - - public int getSeed() - { - return seed; - } - - public NoiseQuality getNoiseQuality() - { - return noiseQuality; - } - - public void setFrequency(double frequency) - { - this.frequency = frequency; - } - - public void setLacunarity(double lacunarity) - { - this.lacunarity = lacunarity; - } - - public void setPersistence(double persistence) - { - this.persistence = persistence; - } - - public void setOctaveCount(int octaveCount) - { - this.octaveCount = octaveCount; - } - - public void setSeed(int seed) - { - this.seed = seed; - } - - public void setNoiseQuality(NoiseQuality noiseQuality) - { - this.noiseQuality = noiseQuality; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.NoiseGen; +import libnoiseforjava.NoiseGen.NoiseQuality; + +public class Billow extends ModuleBase +{ + /// Noise module that outputs three-dimensional "billowy" noise. + /// + /// @image html modulebillow.png + /// + /// This noise module generates "billowy" noise suitable for clouds and + /// rocks. + /// + /// This noise module is nearly identical to noise::module::Perlin except + /// this noise module modifies each octave with an absolute-value + /// function. See the documentation of noise::module::Perlin for more + /// information. + + + /// Default frequency for the Billow noise module. + static final double DEFAULT_BILLOW_FREQUENCY = 1.0; + + /// Default lacunarity for the Billow noise module. + static final double DEFAULT_BILLOW_LACUNARITY = 2.0; + + /// Default number of octaves for the the noise::module::Billow noise + /// module. + static final int DEFAULT_BILLOW_OCTAVE_COUNT = 6; + + /// Default persistence value for the the noise::module::Billow noise + /// module. + static final double DEFAULT_BILLOW_PERSISTENCE = 0.5; + + /// Default noise quality for the the noise::module::Billow noise module. + static final NoiseQuality DEFAULT_BILLOW_QUALITY = NoiseQuality.QUALITY_STD; + + /// Default noise seed for the the noise::module::Billow noise module. + static final int DEFAULT_BILLOW_SEED = 0; + + /// Maximum number of octaves for the the noise::module::Billow noise + /// module. + static final int BILLOW_MAX_OCTAVE = 30; + + double frequency, lacunarity, persistence; + int octaveCount, seed; + NoiseQuality noiseQuality; + + public Billow () + { + super(0); + frequency = DEFAULT_BILLOW_FREQUENCY; + lacunarity = DEFAULT_BILLOW_LACUNARITY; + noiseQuality = DEFAULT_BILLOW_QUALITY; + octaveCount = DEFAULT_BILLOW_OCTAVE_COUNT; + persistence = DEFAULT_BILLOW_PERSISTENCE; + seed = DEFAULT_BILLOW_SEED; + } + + public double getValue (double x, double y, double z) + { + double value = 0.0; + double signal = 0.0; + double curPersistence = 1.0; + double nx, ny, nz; + int calcSeed; + + x *= frequency; + y *= frequency; + z *= frequency; + + for (int curOctave = 0; curOctave < octaveCount; curOctave++) + { + // Make sure that these floating-point values have the same range as a 32- + // bit integer so that we can pass them to the coherent-noise functions. + nx = NoiseGen.MakeInt32Range (x); + ny = NoiseGen.MakeInt32Range (y); + nz = NoiseGen.MakeInt32Range (z); + + // Get the coherent-noise value from the input value and add it to the + // final result. + calcSeed = (seed + curOctave) & 0xffffffff; + signal = NoiseGen.GradientCoherentNoise3D (nx, ny, nz, calcSeed, noiseQuality); + signal = 2.0 * Math.abs(signal) - 1.0; + value += signal * curPersistence; + + // Prepare the next octave. + x *= lacunarity; + y *= lacunarity; + z *= lacunarity; + curPersistence *= persistence; + } + + value += 0.5; + + return value; + } + + public double getFrequency() + { + return frequency; + } + + public double getLacunarity() + { + return lacunarity; + } + + public double getPersistence() + { + return persistence; + } + + public int getOctaveCount() + { + return octaveCount; + } + + public int getSeed() + { + return seed; + } + + public NoiseQuality getNoiseQuality() + { + return noiseQuality; + } + + public void setFrequency(double frequency) + { + this.frequency = frequency; + } + + public void setLacunarity(double lacunarity) + { + this.lacunarity = lacunarity; + } + + public void setPersistence(double persistence) + { + this.persistence = persistence; + } + + public void setOctaveCount(int octaveCount) + { + this.octaveCount = octaveCount; + } + + public void setSeed(int seed) + { + this.seed = seed; + } + + public void setNoiseQuality(NoiseQuality noiseQuality) + { + this.noiseQuality = noiseQuality; + } + +} diff --git a/src/libnoiseforjava/module/Blend.java b/src/libnoiseforjava/module/Blend.java index 4df0dab..5e442b7 100644 --- a/src/libnoiseforjava/module/Blend.java +++ b/src/libnoiseforjava/module/Blend.java @@ -1,79 +1,79 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.Interp; -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Blend extends ModuleBase -{ - /// Noise module that outputs a weighted blend of the output values from - /// two source modules given the output value supplied by a control module. - /// - /// Unlike most other noise modules, the index value assigned to a source - /// module determines its role in the blending operation: - /// - Source module 0 outputs one of the - /// values to blend. - /// - Source module 1 outputs one of the - /// values to blend. - /// - Source module 2 is known as the control - /// module. The control module determines the weight of the - /// blending operation. Negative values weigh the blend towards the - /// output value from the source module with an index value of 0. - /// Positive values weigh the blend towards the output value from the - /// source module with an index value of 1. - /// - /// An application can pass the control module to the setControlModule() - /// method instead of the setSourceModule() method. This may make the - /// application code easier to read. - /// - /// This noise module uses linear interpolation to perform the blending - /// operation. - /// - /// This noise module requires three source modules. - - public Blend (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo, - ModuleBase sourceModuleThree) throws ExceptionInvalidParam - { - super(3); - setSourceModule(0, sourceModuleOne); - setSourceModule(1, sourceModuleTwo); - setSourceModule(2, sourceModuleThree); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (sourceModules[1] != null); - assert (sourceModules[2] != null); - - double v0 = sourceModules[0].getValue (x, y, z); - double v1 = sourceModules[1].getValue (x, y, z); - double alpha = (sourceModules[2].getValue (x, y, z) + 1.0) / 2.0; - - return Interp.linearInterp (v0, v1, alpha); - } -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.Interp; +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Blend extends ModuleBase +{ + /// Noise module that outputs a weighted blend of the output values from + /// two source modules given the output value supplied by a control module. + /// + /// Unlike most other noise modules, the index value assigned to a source + /// module determines its role in the blending operation: + /// - Source module 0 outputs one of the + /// values to blend. + /// - Source module 1 outputs one of the + /// values to blend. + /// - Source module 2 is known as the control + /// module. The control module determines the weight of the + /// blending operation. Negative values weigh the blend towards the + /// output value from the source module with an index value of 0. + /// Positive values weigh the blend towards the output value from the + /// source module with an index value of 1. + /// + /// An application can pass the control module to the setControlModule() + /// method instead of the setSourceModule() method. This may make the + /// application code easier to read. + /// + /// This noise module uses linear interpolation to perform the blending + /// operation. + /// + /// This noise module requires three source modules. + + public Blend (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo, + ModuleBase sourceModuleThree) throws ExceptionInvalidParam + { + super(3); + setSourceModule(0, sourceModuleOne); + setSourceModule(1, sourceModuleTwo); + setSourceModule(2, sourceModuleThree); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (sourceModules[1] != null); + assert (sourceModules[2] != null); + + double v0 = sourceModules[0].getValue (x, y, z); + double v1 = sourceModules[1].getValue (x, y, z); + double alpha = (sourceModules[2].getValue (x, y, z) + 1.0) / 2.0; + + return Interp.linearInterp (v0, v1, alpha); + } +} diff --git a/src/libnoiseforjava/module/Cached.java b/src/libnoiseforjava/module/Cached.java index ddfdd6c..3afab4c 100644 --- a/src/libnoiseforjava/module/Cached.java +++ b/src/libnoiseforjava/module/Cached.java @@ -1,97 +1,97 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Cached extends ModuleBase -{ - /// Noise module that caches the last output value generated by a source - /// module. - /// - /// If an application passes an input value to the getValue() method that - /// differs from the previously passed-in input value, this noise module - /// instructs the source module to calculate the output value. This - /// value, as well as the ( @a x, @a y, @a z ) coordinates of the input - /// value, are stored (cached) in this noise module. - /// - /// If the application passes an input value to the getValue() method - /// that is equal to the previously passed-in input value, this noise - /// module returns the cached output value without having the source - /// module recalculate the output value. - /// - /// If an application passes a new source module to the setSourceModule() - /// method, the cache is invalidated. - /// - /// Caching a noise module is useful if it is used as a source module for - /// multiple noise modules. If a source module is not cached, the source - /// module will redundantly calculate the same output value once for each - /// noise module in which it is included. - /// - /// This noise module requires one source module. - - /// The cached output value at the cached input value. - double cachedValue; - - /// Determines if a cached output value is stored in this noise module. - boolean isCached; - - /// @a x coordinate of the cached input value. - double xCache; - - /// @a y coordinate of the cached input value. - double yCache; - - /// @a z coordinate of the cached input value. - double zCache; - - public Cached(ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - isCached = false; - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - - if (!(isCached && x == xCache && y == yCache && z == zCache)) - { - cachedValue = sourceModules[0].getValue (x, y, z); - xCache = x; - yCache = y; - zCache = z; - } - - isCached = true; - - return cachedValue; - } - - - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Cached extends ModuleBase +{ + /// Noise module that caches the last output value generated by a source + /// module. + /// + /// If an application passes an input value to the getValue() method that + /// differs from the previously passed-in input value, this noise module + /// instructs the source module to calculate the output value. This + /// value, as well as the ( @a x, @a y, @a z ) coordinates of the input + /// value, are stored (cached) in this noise module. + /// + /// If the application passes an input value to the getValue() method + /// that is equal to the previously passed-in input value, this noise + /// module returns the cached output value without having the source + /// module recalculate the output value. + /// + /// If an application passes a new source module to the setSourceModule() + /// method, the cache is invalidated. + /// + /// Caching a noise module is useful if it is used as a source module for + /// multiple noise modules. If a source module is not cached, the source + /// module will redundantly calculate the same output value once for each + /// noise module in which it is included. + /// + /// This noise module requires one source module. + + /// The cached output value at the cached input value. + double cachedValue; + + /// Determines if a cached output value is stored in this noise module. + boolean isCached; + + /// @a x coordinate of the cached input value. + double xCache; + + /// @a y coordinate of the cached input value. + double yCache; + + /// @a z coordinate of the cached input value. + double zCache; + + public Cached(ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + isCached = false; + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + + if (!(isCached && x == xCache && y == yCache && z == zCache)) + { + cachedValue = sourceModules[0].getValue (x, y, z); + xCache = x; + yCache = y; + zCache = z; + } + + isCached = true; + + return cachedValue; + } + + + +} diff --git a/src/libnoiseforjava/module/Checkerboard.java b/src/libnoiseforjava/module/Checkerboard.java index 07ce003..d9f4e1f 100644 --- a/src/libnoiseforjava/module/Checkerboard.java +++ b/src/libnoiseforjava/module/Checkerboard.java @@ -1,62 +1,62 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.NoiseGen; - -public class Checkerboard extends ModuleBase -{ - /// Noise module that outputs a checkerboard pattern. - /// - /// This noise module outputs unit-sized blocks of alternating values. - /// The values of these blocks alternate between -1.0 and +1.0. - /// - /// This noise module is not really useful by itself, but it is often used - /// for debugging purposes. - /// - /// This noise module does not require any source modules. - - public Checkerboard() - { - super(0); - } - - public double getValue (double x, double y, double z) - { - int ix = (int)(Math.floor(NoiseGen.MakeInt32Range (x))); - int iy = (int)(Math.floor(NoiseGen.MakeInt32Range (y))); - int iz = (int)(Math.floor(NoiseGen.MakeInt32Range (z))); - - // original was - //(ix & 1 ^ iy & 1 ^ iz & 1) - // not certain if this duplicates it or not - if ((ix%2 == 1) ^ (iy%2 == 1) ^ (iz%2 == 1)) - return -1.0; - else - return 1.0; - } -} - +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.NoiseGen; + +public class Checkerboard extends ModuleBase +{ + /// Noise module that outputs a checkerboard pattern. + /// + /// This noise module outputs unit-sized blocks of alternating values. + /// The values of these blocks alternate between -1.0 and +1.0. + /// + /// This noise module is not really useful by itself, but it is often used + /// for debugging purposes. + /// + /// This noise module does not require any source modules. + + public Checkerboard() + { + super(0); + } + + public double getValue (double x, double y, double z) + { + int ix = (int)(Math.floor(NoiseGen.MakeInt32Range (x))); + int iy = (int)(Math.floor(NoiseGen.MakeInt32Range (y))); + int iz = (int)(Math.floor(NoiseGen.MakeInt32Range (z))); + + // original was + //(ix & 1 ^ iy & 1 ^ iz & 1) + // not certain if this duplicates it or not + if ((ix%2 == 1) ^ (iy%2 == 1) ^ (iz%2 == 1)) + return -1.0; + else + return 1.0; + } +} + diff --git a/src/libnoiseforjava/module/Clamp.java b/src/libnoiseforjava/module/Clamp.java index 7e98a09..3ad6d39 100644 --- a/src/libnoiseforjava/module/Clamp.java +++ b/src/libnoiseforjava/module/Clamp.java @@ -1,90 +1,90 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Clamp extends ModuleBase -{ - - /// Noise module that clamps the output value from a source module to a - /// range of values. - /// - /// @image html moduleclamp.png - /// - /// The range of values in which to clamp the output value is called the - /// clamping range. - /// - /// If the output value from the source module is less than the lower - /// bound of the clamping range, this noise module clamps that value to - /// the lower bound. If the output value from the source module is - /// greater than the upper bound of the clamping range, this noise module - /// clamps that value to the upper bound. - /// - /// To specify the upper and lower bounds of the clamping range, call the - /// setBounds() method. - /// - /// This noise module requires one source module. - - /// Default lower bound of the clamping range for the Clamp noise module. - static final double DEFAULT_CLAMP_LOWER_BOUND = -1.0; - - /// Default upper bound of the clamping range for the Clamp noise module. - static final double DEFAULT_CLAMP_UPPER_BOUND = 1.0; - - double lowerBound, upperBound; - - public Clamp (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - - lowerBound = DEFAULT_CLAMP_LOWER_BOUND; - upperBound = DEFAULT_CLAMP_UPPER_BOUND; - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - - double value = sourceModules[0].getValue (x, y, z); - if (value < lowerBound) - return lowerBound; - else if (value > upperBound) - return upperBound; - else - return value; - } - - public void setBounds (double lowerBound, double upperBound) - { - assert (lowerBound < upperBound); - - this.lowerBound = lowerBound; - this.upperBound = upperBound; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Clamp extends ModuleBase +{ + + /// Noise module that clamps the output value from a source module to a + /// range of values. + /// + /// @image html moduleclamp.png + /// + /// The range of values in which to clamp the output value is called the + /// clamping range. + /// + /// If the output value from the source module is less than the lower + /// bound of the clamping range, this noise module clamps that value to + /// the lower bound. If the output value from the source module is + /// greater than the upper bound of the clamping range, this noise module + /// clamps that value to the upper bound. + /// + /// To specify the upper and lower bounds of the clamping range, call the + /// setBounds() method. + /// + /// This noise module requires one source module. + + /// Default lower bound of the clamping range for the Clamp noise module. + static final double DEFAULT_CLAMP_LOWER_BOUND = -1.0; + + /// Default upper bound of the clamping range for the Clamp noise module. + static final double DEFAULT_CLAMP_UPPER_BOUND = 1.0; + + double lowerBound, upperBound; + + public Clamp (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + + lowerBound = DEFAULT_CLAMP_LOWER_BOUND; + upperBound = DEFAULT_CLAMP_UPPER_BOUND; + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + + double value = sourceModules[0].getValue (x, y, z); + if (value < lowerBound) + return lowerBound; + else if (value > upperBound) + return upperBound; + else + return value; + } + + public void setBounds (double lowerBound, double upperBound) + { + assert (lowerBound < upperBound); + + this.lowerBound = lowerBound; + this.upperBound = upperBound; + } + +} diff --git a/src/libnoiseforjava/module/Const.java b/src/libnoiseforjava/module/Const.java index f6ebe2b..4454f7d 100644 --- a/src/libnoiseforjava/module/Const.java +++ b/src/libnoiseforjava/module/Const.java @@ -1,65 +1,70 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -public class Const extends ModuleBase -{ - /// Noise module that outputs a constant value. - /// - /// @image html moduleconst.png - /// - /// To specify the constant value, call the setConstValue() method. - /// - /// This noise module is not useful by itself, but it is often used as a - /// source module for other noise modules. - /// - /// This noise module does not require any source modules. - - /// Default constant value for the Const noise module. - static final double DEFAULT_CONST_VALUE = 0.0; - - double constValue; - - public Const () - { - super(0); - this.constValue = DEFAULT_CONST_VALUE; - } - - public double getValue (double x, double y, double z) - { - return constValue; - } - - /// Sets the constant output value for this noise module. - /// - /// @param constValue The constant output value for this noise module. - public void setConstValue (double constValue) - { - this.constValue = constValue; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +public class Const extends ModuleBase +{ + /// Noise module that outputs a constant value. + /// + /// @image html moduleconst.png + /// + /// To specify the constant value, call the setConstValue() method. + /// + /// This noise module is not useful by itself, but it is often used as a + /// source module for other noise modules. + /// + /// This noise module does not require any source modules. + + /// Default constant value for the Const noise module. + static final double DEFAULT_CONST_VALUE = 0.0; + + double constValue; + + public Const () + { + super(0); + this.constValue = DEFAULT_CONST_VALUE; + } + + public Const(double c) { + super(0); + this.constValue = c; + } + + public double getValue (double x, double y, double z) + { + return constValue; + } + + /// Sets the constant output value for this noise module. + /// + /// @param constValue The constant output value for this noise module. + public void setConstValue (double constValue) + { + this.constValue = constValue; + } + +} diff --git a/src/libnoiseforjava/module/Curve.java b/src/libnoiseforjava/module/Curve.java index 4bbd75c..2d78818 100644 --- a/src/libnoiseforjava/module/Curve.java +++ b/src/libnoiseforjava/module/Curve.java @@ -1,203 +1,203 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.Interp; -import libnoiseforjava.Misc; -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Curve extends ModuleBase -{ - /// Noise module that maps the output value from a source module onto an - /// arbitrary function curve. - /// - /// This noise module maps the output value from the source module onto an - /// application-defined curve. This curve is defined by a number of - /// control points; each control point has an input value - /// that maps to an output value. - /// - /// To add the control points to this curve, call the addControlPoint() - /// method. Note that the class ControlPoint follows the class Curve in - /// this file. - /// - /// Since this curve is a cubic spline, an application must add a minimum - /// of four control points to the curve. If this is not done, the - /// getValue() method fails. Each control point can have any input and - /// output value, although no two control points can have the same input - /// value. There is no limit to the number of control points that can be - /// added to the curve. - /// - /// This noise module requires one source module - - int controlPointCount; - ControlPoint[] controlPoints; - - public Curve (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - controlPointCount = 0; - controlPoints= new ControlPoint[1]; - controlPoints[0] = new ControlPoint(0.0, 0.0); - } - - public void addControlPoint (double inputValue, double outputValue) - throws ExceptionInvalidParam - { - // Find the insertion point for the new control point and insert the new - // point at that position. The control point array will remain sorted by - // input value. - int insertionPos = findInsertionPos(inputValue); - insertAtPos (insertionPos, inputValue, outputValue); - } - - public void clearAllControlPoints () - { - controlPoints = null; - controlPointCount = 0; - } - - public int findInsertionPos (double inputValue) throws ExceptionInvalidParam - { - int insertionPos; - for (insertionPos = 0; insertionPos < controlPointCount; insertionPos++) - { - if (inputValue < controlPoints[insertionPos].inputValue) - // We found the array index in which to insert the new control point. - // Exit now. - break; - else if (inputValue == controlPoints[insertionPos].inputValue) - // Each control point is required to contain a unique input value, so - // throw an exception. - throw new ExceptionInvalidParam("Invalid Parameter in Curve"); - } - return insertionPos; - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (controlPointCount >= 4); - - // Get the output value from the source module. - double sourceModuleValue = sourceModules[0].getValue (x, y, z); - - // Find the first element in the control point array that has an input value - // larger than the output value from the source module. - int indexPos; - for (indexPos = 0; indexPos < controlPointCount; indexPos++) - { - if (sourceModuleValue < controlPoints[indexPos].inputValue) - break; - - } - - // Find the four nearest control points so that we can perform cubic - // interpolation. - int index0 = Misc.ClampValue (indexPos - 2, 0, controlPointCount - 1); - int index1 = Misc.ClampValue (indexPos - 1, 0, controlPointCount - 1); - int index2 = Misc.ClampValue (indexPos , 0, controlPointCount - 1); - int index3 = Misc.ClampValue (indexPos + 1, 0, controlPointCount - 1); - - // If some control points are missing (which occurs if the value from the - // source module is greater than the largest input value or less than the - // smallest input value of the control point array), get the corresponding - // output value of the nearest control point and exit now. - if (index1 == index2) { - return controlPoints[index1].outputValue; - } - - // Compute the alpha value used for cubic interpolation. - double input0 = controlPoints[index1].inputValue; - double input1 = controlPoints[index2].inputValue; - double alpha = (sourceModuleValue - input0) / (input1 - input0); - - // Now perform the cubic interpolation given the alpha value. - return Interp.cubicInterp( - controlPoints[index0].outputValue, - controlPoints[index1].outputValue, - controlPoints[index2].outputValue, - controlPoints[index3].outputValue, - alpha); - } - - public void insertAtPos (int insertionPos, double inputValue, - double outputValue) - { - // Make room for the new control point at the specified position within the - // control point array. The position is determined by the input value of - // the control point; the control points must be sorted by input value - // within that array. - ControlPoint[] newControlPoints = new ControlPoint[controlPointCount + 1]; - - for (int t = 0; t < (controlPointCount + 1); t++) - newControlPoints[t] = new ControlPoint(); - - for (int i = 0; i < controlPointCount; i++) { - if (i < insertionPos) { - newControlPoints[i] = controlPoints[i]; - } else { - newControlPoints[i + 1] = controlPoints[i]; - } - } - - controlPoints = newControlPoints; - ++controlPointCount; - - // Now that we've made room for the new control point within the array, add - // the new control point. - controlPoints[insertionPos].inputValue = inputValue; - controlPoints[insertionPos].outputValue = outputValue; - } -} - - -/// This class defines a control point. -/// -/// Control points are used for defining splines. -class ControlPoint -{ - /// The input value. - double inputValue; - - /// The output value that is mapped from the input value. - double outputValue; - - ControlPoint() - { - inputValue = 0.0; - outputValue = 0.0; - } - - ControlPoint(double inputValue, double outputValue) - { - this.inputValue = inputValue; - this.outputValue = outputValue; - } - - - +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.Interp; +import libnoiseforjava.Misc; +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Curve extends ModuleBase +{ + /// Noise module that maps the output value from a source module onto an + /// arbitrary function curve. + /// + /// This noise module maps the output value from the source module onto an + /// application-defined curve. This curve is defined by a number of + /// control points; each control point has an input value + /// that maps to an output value. + /// + /// To add the control points to this curve, call the addControlPoint() + /// method. Note that the class ControlPoint follows the class Curve in + /// this file. + /// + /// Since this curve is a cubic spline, an application must add a minimum + /// of four control points to the curve. If this is not done, the + /// getValue() method fails. Each control point can have any input and + /// output value, although no two control points can have the same input + /// value. There is no limit to the number of control points that can be + /// added to the curve. + /// + /// This noise module requires one source module + + int controlPointCount; + ControlPoint[] controlPoints; + + public Curve (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + controlPointCount = 0; + controlPoints= new ControlPoint[1]; + controlPoints[0] = new ControlPoint(0.0, 0.0); + } + + public void addControlPoint (double inputValue, double outputValue) + throws ExceptionInvalidParam + { + // Find the insertion point for the new control point and insert the new + // point at that position. The control point array will remain sorted by + // input value. + int insertionPos = findInsertionPos(inputValue); + insertAtPos (insertionPos, inputValue, outputValue); + } + + public void clearAllControlPoints () + { + controlPoints = null; + controlPointCount = 0; + } + + public int findInsertionPos (double inputValue) throws ExceptionInvalidParam + { + int insertionPos; + for (insertionPos = 0; insertionPos < controlPointCount; insertionPos++) + { + if (inputValue < controlPoints[insertionPos].inputValue) + // We found the array index in which to insert the new control point. + // Exit now. + break; + else if (inputValue == controlPoints[insertionPos].inputValue) + // Each control point is required to contain a unique input value, so + // throw an exception. + throw new ExceptionInvalidParam("Invalid Parameter in Curve"); + } + return insertionPos; + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (controlPointCount >= 4); + + // Get the output value from the source module. + double sourceModuleValue = sourceModules[0].getValue (x, y, z); + + // Find the first element in the control point array that has an input value + // larger than the output value from the source module. + int indexPos; + for (indexPos = 0; indexPos < controlPointCount; indexPos++) + { + if (sourceModuleValue < controlPoints[indexPos].inputValue) + break; + + } + + // Find the four nearest control points so that we can perform cubic + // interpolation. + int index0 = Misc.ClampValue (indexPos - 2, 0, controlPointCount - 1); + int index1 = Misc.ClampValue (indexPos - 1, 0, controlPointCount - 1); + int index2 = Misc.ClampValue (indexPos , 0, controlPointCount - 1); + int index3 = Misc.ClampValue (indexPos + 1, 0, controlPointCount - 1); + + // If some control points are missing (which occurs if the value from the + // source module is greater than the largest input value or less than the + // smallest input value of the control point array), get the corresponding + // output value of the nearest control point and exit now. + if (index1 == index2) { + return controlPoints[index1].outputValue; + } + + // Compute the alpha value used for cubic interpolation. + double input0 = controlPoints[index1].inputValue; + double input1 = controlPoints[index2].inputValue; + double alpha = (sourceModuleValue - input0) / (input1 - input0); + + // Now perform the cubic interpolation given the alpha value. + return Interp.cubicInterp( + controlPoints[index0].outputValue, + controlPoints[index1].outputValue, + controlPoints[index2].outputValue, + controlPoints[index3].outputValue, + alpha); + } + + public void insertAtPos (int insertionPos, double inputValue, + double outputValue) + { + // Make room for the new control point at the specified position within the + // control point array. The position is determined by the input value of + // the control point; the control points must be sorted by input value + // within that array. + ControlPoint[] newControlPoints = new ControlPoint[controlPointCount + 1]; + + for (int t = 0; t < (controlPointCount + 1); t++) + newControlPoints[t] = new ControlPoint(); + + for (int i = 0; i < controlPointCount; i++) { + if (i < insertionPos) { + newControlPoints[i] = controlPoints[i]; + } else { + newControlPoints[i + 1] = controlPoints[i]; + } + } + + controlPoints = newControlPoints; + ++controlPointCount; + + // Now that we've made room for the new control point within the array, add + // the new control point. + controlPoints[insertionPos].inputValue = inputValue; + controlPoints[insertionPos].outputValue = outputValue; + } +} + + +/// This class defines a control point. +/// +/// Control points are used for defining splines. +class ControlPoint +{ + /// The input value. + double inputValue; + + /// The output value that is mapped from the input value. + double outputValue; + + ControlPoint() + { + inputValue = 0.0; + outputValue = 0.0; + } + + ControlPoint(double inputValue, double outputValue) + { + this.inputValue = inputValue; + this.outputValue = outputValue; + } + + + } \ No newline at end of file diff --git a/src/libnoiseforjava/module/Cylinders.java b/src/libnoiseforjava/module/Cylinders.java index 8fa010e..c67d019 100644 --- a/src/libnoiseforjava/module/Cylinders.java +++ b/src/libnoiseforjava/module/Cylinders.java @@ -1,103 +1,103 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -public class Cylinders extends ModuleBase -{ - /// Noise module that outputs concentric cylinders. - /// - /// This noise module outputs concentric cylinders centered on the origin. - /// These cylinders are oriented along the @a y axis similar to the - /// concentric rings of a tree. Each cylinder extends infinitely along - /// the @a y axis. - /// - /// The first cylinder has a radius of 1.0. Each subsequent cylinder has - /// a radius that is 1.0 unit larger than the previous cylinder. - /// - /// The output value from this noise module is determined by the distance - /// between the input value and the the nearest cylinder surface. The - /// input values that are located on a cylinder surface are given the - /// output value 1.0 and the input values that are equidistant from two - /// cylinder surfaces are given the output value -1.0. - /// - /// An application can change the frequency of the concentric cylinders. - /// Increasing the frequency reduces the distances between cylinders. To - /// specify the frequency, call the setFrequency() method. - /// - /// This noise module, modified with some low-frequency, low-power - /// turbulence, is useful for generating wood-like textures. - /// - /// This noise module does not require any source modules. - - /// Default frequency value for the Cylinders noise module. - static final double DEFAULT_CYLINDERS_FREQUENCY = 1.0; - - /// Frequency of the concentric cylinders. - double frequency; - - public Cylinders () - { - super(0); - frequency = DEFAULT_CYLINDERS_FREQUENCY; - } - - public double getValue (double x, double y, double z) - { - x *= frequency; - z *= frequency; - - double distFromCenter = Math.sqrt(x * x + z * z); - double distFromSmallerSphere = distFromCenter - Math.floor(distFromCenter); - double distFromLargerSphere = 1.0 - distFromSmallerSphere; - double nearestDist = Math.min(distFromSmallerSphere, distFromLargerSphere); - - // Puts it in the -1.0 to +1.0 range. - return 1.0 - (nearestDist * 4.0); - } - - /// Returns the frequency of the concentric cylinders. - /// - /// @returns The frequency of the concentric cylinders. - /// - /// Increasing the frequency increases the density of the concentric - /// cylinders, reducing the distances between them. - public double getFrequency() - { - return frequency; - } - - /// Sets the frequency of the concentric cylinders. - /// - /// @param frequency The frequency of the concentric cylinders. - /// - /// Increasing the frequency increases the density of the concentric - /// cylinders, reducing the distances between them. - public void setFrequency (double frequency) - { - this.frequency = frequency; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +public class Cylinders extends ModuleBase +{ + /// Noise module that outputs concentric cylinders. + /// + /// This noise module outputs concentric cylinders centered on the origin. + /// These cylinders are oriented along the @a y axis similar to the + /// concentric rings of a tree. Each cylinder extends infinitely along + /// the @a y axis. + /// + /// The first cylinder has a radius of 1.0. Each subsequent cylinder has + /// a radius that is 1.0 unit larger than the previous cylinder. + /// + /// The output value from this noise module is determined by the distance + /// between the input value and the the nearest cylinder surface. The + /// input values that are located on a cylinder surface are given the + /// output value 1.0 and the input values that are equidistant from two + /// cylinder surfaces are given the output value -1.0. + /// + /// An application can change the frequency of the concentric cylinders. + /// Increasing the frequency reduces the distances between cylinders. To + /// specify the frequency, call the setFrequency() method. + /// + /// This noise module, modified with some low-frequency, low-power + /// turbulence, is useful for generating wood-like textures. + /// + /// This noise module does not require any source modules. + + /// Default frequency value for the Cylinders noise module. + static final double DEFAULT_CYLINDERS_FREQUENCY = 1.0; + + /// Frequency of the concentric cylinders. + double frequency; + + public Cylinders () + { + super(0); + frequency = DEFAULT_CYLINDERS_FREQUENCY; + } + + public double getValue (double x, double y, double z) + { + x *= frequency; + z *= frequency; + + double distFromCenter = Math.sqrt(x * x + z * z); + double distFromSmallerSphere = distFromCenter - Math.floor(distFromCenter); + double distFromLargerSphere = 1.0 - distFromSmallerSphere; + double nearestDist = Math.min(distFromSmallerSphere, distFromLargerSphere); + + // Puts it in the -1.0 to +1.0 range. + return 1.0 - (nearestDist * 4.0); + } + + /// Returns the frequency of the concentric cylinders. + /// + /// @returns The frequency of the concentric cylinders. + /// + /// Increasing the frequency increases the density of the concentric + /// cylinders, reducing the distances between them. + public double getFrequency() + { + return frequency; + } + + /// Sets the frequency of the concentric cylinders. + /// + /// @param frequency The frequency of the concentric cylinders. + /// + /// Increasing the frequency increases the density of the concentric + /// cylinders, reducing the distances between them. + public void setFrequency (double frequency) + { + this.frequency = frequency; + } + +} diff --git a/src/libnoiseforjava/module/Displace.java b/src/libnoiseforjava/module/Displace.java index 732f20f..7725ce6 100644 --- a/src/libnoiseforjava/module/Displace.java +++ b/src/libnoiseforjava/module/Displace.java @@ -1,238 +1,238 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; -import libnoiseforjava.exception.ExceptionNoModule; - -public class Displace extends ModuleBase -{ - /// Noise module that uses three source modules to displace each - /// coordinate of the input value before returning the output value from - /// a source module. - /// - /// Unlike most other noise modules, the index value assigned to a source - /// module determines its role in the displacement operation: - /// - Source module 0 (left in the diagram) outputs a value. - /// - Source module 1 (lower left in the diagram) specifies the offset to - /// apply to the @a x coordinate of the input value. - /// - Source module 2 (lower center in the diagram) specifies the - /// offset to apply to the @a y coordinate of the input value. - /// - Source module 3 (lower right in the diagram) specifies the offset - /// to apply to the @a z coordinate of the input value. - /// - /// The getValue() method modifies the ( @a x, @a y, @a z ) coordinates of - /// the input value using the output values from the three displacement - /// modules before retrieving the output value from the source module. - /// - /// The Turbulence noise module is a special case of the - /// Displace module; internally, there are three Perlin-noise modules - /// that perform the displacement operation. - /// - /// This noise module requires four source modules. - - public Displace (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo, - ModuleBase sourceModuleThree, ModuleBase sourceModuleFour) throws ExceptionInvalidParam - { - super(4); - setSourceModule(0, sourceModuleOne); - setSourceModule(1, sourceModuleTwo); - setSourceModule(2, sourceModuleThree); - setSourceModule(3, sourceModuleFour); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (sourceModules[1] != null); - assert (sourceModules[2] != null); - assert (sourceModules[3] != null); - - // Get the output values from the three displacement modules. Add each - // value to the corresponding coordinate in the input value. - double xDisplace = x + (sourceModules[1].getValue (x, y, z)); - double yDisplace = y + (sourceModules[2].getValue (x, y, z)); - double zDisplace = z + (sourceModules[3].getValue (x, y, z)); - - // Retrieve the output value using the offset input value instead of - // the original input value. - return sourceModules[0].getValue (xDisplace, yDisplace, zDisplace); - } - - public ModuleBase getXDisplaceModule() throws ExceptionNoModule - { - if (sourceModules == null || sourceModules[1] == null) - throw new ExceptionNoModule ("Could not retrieve a source module " + - "from a noise module."); - - return sourceModules[1]; - } - - /// Returns the @a y displacement module. - /// - /// @returns A reference to the @a y displacement module. - /// - /// @pre This displacement module has been added to this noise module - /// via a call to setSourceModule() or setYDisplaceModule(). - /// - /// @throw ExceptionNoModule See the preconditions for more - /// information. - /// - /// The getValue() method displaces the input value by adding the output - /// value from this displacement module to the @a y coordinate of the - /// input value before returning the output value from the source - /// module. - public ModuleBase getYDisplaceModule () throws ExceptionNoModule - { - if (sourceModules == null || sourceModules[2] == null) - throw new ExceptionNoModule ("Could not retrieve a source module " + - "from Displace noise module."); - - return sourceModules[2]; - } - - /// Returns the @a z displacement module. - /// - /// @returns A reference to the @a z displacement module. - /// - /// @pre This displacement module has been added to this noise module - /// via a call to setSourceModule() or setZDisplaceModule(). - /// - /// @throw ExceptionNoModule See the preconditions for more - /// information. - /// - /// The getValue() method displaces the input value by adding the output - /// value from this displacement module to the @a z coordinate of the - /// input value before returning the output value from the source - /// module. - public ModuleBase getZDisplaceModule () throws ExceptionNoModule - { - if (sourceModules == null || sourceModules[3] == null) - throw new ExceptionNoModule ("Could not retrieve a source module " + - "from Displace noise module."); - - return sourceModules[3]; - } - - - /// Sets the @a x, @a y, and @a z displacement modules. - /// - /// @param xDisplaceModule Displacement module that displaces the @a x - /// coordinate of the input value. - /// @param yDisplaceModule Displacement module that displaces the @a y - /// coordinate of the input value. - /// @param zDisplaceModule Displacement module that displaces the @a z - /// coordinate of the input value. - /// - /// The getValue() method displaces the input value by adding the output - /// value from each of the displacement modules to the corresponding - /// coordinates of the input value before returning the output value - /// from the source module. - /// - /// This method assigns an index value of 1 to the @a x displacement - /// module, an index value of 2 to the @a y displacement module, and an - /// index value of 3 to the @a z displacement module. - /// - /// These displacement modules must exist throughout the lifetime of - /// this noise module unless another displacement module replaces it. - public void setDisplaceModules (ModuleBase xDisplaceModule, - ModuleBase yDisplaceModule, ModuleBase zDisplaceModule) - { - setXDisplaceModule (xDisplaceModule); - setYDisplaceModule (yDisplaceModule); - setZDisplaceModule (zDisplaceModule); - } - - /// Sets the @a x displacement module. - /// - /// @param xDisplaceModule Displacement module that displaces the @a x - /// coordinate. - /// - /// The getValue() method displaces the input value by adding the output - /// value from this displacement module to the @a x coordinate of the - /// input value before returning the output value from the source - /// module. - /// - /// This method assigns an index value of 1 to the @a x displacement - /// module. Passing this displacement module to this method produces - /// the same results as passing this displacement module to the - /// setSourceModule() method while assigning it an index value of 1. - /// - /// This displacement module must exist throughout the lifetime of this - /// noise module unless another displacement module replaces it. - public void setXDisplaceModule (ModuleBase xDisplaceModule) - { - assert (sourceModules != null); - sourceModules[1] = xDisplaceModule; - } - - /// Sets the @a y displacement module. - /// - /// @param yDisplaceModule Displacement module that displaces the @a y - /// coordinate. - /// - /// The getValue() method displaces the input value by adding the output - /// value from this displacement module to the @a y coordinate of the - /// input value before returning the output value from the source - /// module. - /// - /// This method assigns an index value of 2 to the @a y displacement - /// module. Passing this displacement module to this method produces - /// the same results as passing this displacement module to the - /// setSourceModule() method while assigning it an index value of 2. - /// - /// This displacement module must exist throughout the lifetime of this - /// noise module unless another displacement module replaces it. - public void setYDisplaceModule (ModuleBase yDisplaceModule) - { - assert (sourceModules != null); - sourceModules[2] = yDisplaceModule; - } - - /// Sets the @a z displacement module. - /// - /// @param zDisplaceModule Displacement module that displaces the @a z - /// coordinate. - /// - /// The getValue() method displaces the input value by adding the output - /// value from this displacement module to the @a z coordinate of the - /// input value before returning the output value from the source - /// module. - /// - /// This method assigns an index value of 3 to the @a z displacement - /// module. Passing this displacement module to this method produces - /// the same results as passing this displacement module to the - /// setSourceModule() method while assigning it an index value of 3. - /// - /// This displacement module must exist throughout the lifetime of this - /// noise module unless another displacement module replaces it. - public void setZDisplaceModule (ModuleBase zDisplaceModule) - { - assert (sourceModules != null); - sourceModules[3] = zDisplaceModule; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; +import libnoiseforjava.exception.ExceptionNoModule; + +public class Displace extends ModuleBase +{ + /// Noise module that uses three source modules to displace each + /// coordinate of the input value before returning the output value from + /// a source module. + /// + /// Unlike most other noise modules, the index value assigned to a source + /// module determines its role in the displacement operation: + /// - Source module 0 (left in the diagram) outputs a value. + /// - Source module 1 (lower left in the diagram) specifies the offset to + /// apply to the @a x coordinate of the input value. + /// - Source module 2 (lower center in the diagram) specifies the + /// offset to apply to the @a y coordinate of the input value. + /// - Source module 3 (lower right in the diagram) specifies the offset + /// to apply to the @a z coordinate of the input value. + /// + /// The getValue() method modifies the ( @a x, @a y, @a z ) coordinates of + /// the input value using the output values from the three displacement + /// modules before retrieving the output value from the source module. + /// + /// The Turbulence noise module is a special case of the + /// Displace module; internally, there are three Perlin-noise modules + /// that perform the displacement operation. + /// + /// This noise module requires four source modules. + + public Displace (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo, + ModuleBase sourceModuleThree, ModuleBase sourceModuleFour) throws ExceptionInvalidParam + { + super(4); + setSourceModule(0, sourceModuleOne); + setSourceModule(1, sourceModuleTwo); + setSourceModule(2, sourceModuleThree); + setSourceModule(3, sourceModuleFour); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (sourceModules[1] != null); + assert (sourceModules[2] != null); + assert (sourceModules[3] != null); + + // Get the output values from the three displacement modules. Add each + // value to the corresponding coordinate in the input value. + double xDisplace = x + (sourceModules[1].getValue (x, y, z)); + double yDisplace = y + (sourceModules[2].getValue (x, y, z)); + double zDisplace = z + (sourceModules[3].getValue (x, y, z)); + + // Retrieve the output value using the offset input value instead of + // the original input value. + return sourceModules[0].getValue (xDisplace, yDisplace, zDisplace); + } + + public ModuleBase getXDisplaceModule() throws ExceptionNoModule + { + if (sourceModules == null || sourceModules[1] == null) + throw new ExceptionNoModule ("Could not retrieve a source module " + + "from a noise module."); + + return sourceModules[1]; + } + + /// Returns the @a y displacement module. + /// + /// @returns A reference to the @a y displacement module. + /// + /// @pre This displacement module has been added to this noise module + /// via a call to setSourceModule() or setYDisplaceModule(). + /// + /// @throw ExceptionNoModule See the preconditions for more + /// information. + /// + /// The getValue() method displaces the input value by adding the output + /// value from this displacement module to the @a y coordinate of the + /// input value before returning the output value from the source + /// module. + public ModuleBase getYDisplaceModule () throws ExceptionNoModule + { + if (sourceModules == null || sourceModules[2] == null) + throw new ExceptionNoModule ("Could not retrieve a source module " + + "from Displace noise module."); + + return sourceModules[2]; + } + + /// Returns the @a z displacement module. + /// + /// @returns A reference to the @a z displacement module. + /// + /// @pre This displacement module has been added to this noise module + /// via a call to setSourceModule() or setZDisplaceModule(). + /// + /// @throw ExceptionNoModule See the preconditions for more + /// information. + /// + /// The getValue() method displaces the input value by adding the output + /// value from this displacement module to the @a z coordinate of the + /// input value before returning the output value from the source + /// module. + public ModuleBase getZDisplaceModule () throws ExceptionNoModule + { + if (sourceModules == null || sourceModules[3] == null) + throw new ExceptionNoModule ("Could not retrieve a source module " + + "from Displace noise module."); + + return sourceModules[3]; + } + + + /// Sets the @a x, @a y, and @a z displacement modules. + /// + /// @param xDisplaceModule Displacement module that displaces the @a x + /// coordinate of the input value. + /// @param yDisplaceModule Displacement module that displaces the @a y + /// coordinate of the input value. + /// @param zDisplaceModule Displacement module that displaces the @a z + /// coordinate of the input value. + /// + /// The getValue() method displaces the input value by adding the output + /// value from each of the displacement modules to the corresponding + /// coordinates of the input value before returning the output value + /// from the source module. + /// + /// This method assigns an index value of 1 to the @a x displacement + /// module, an index value of 2 to the @a y displacement module, and an + /// index value of 3 to the @a z displacement module. + /// + /// These displacement modules must exist throughout the lifetime of + /// this noise module unless another displacement module replaces it. + public void setDisplaceModules (ModuleBase xDisplaceModule, + ModuleBase yDisplaceModule, ModuleBase zDisplaceModule) + { + setXDisplaceModule (xDisplaceModule); + setYDisplaceModule (yDisplaceModule); + setZDisplaceModule (zDisplaceModule); + } + + /// Sets the @a x displacement module. + /// + /// @param xDisplaceModule Displacement module that displaces the @a x + /// coordinate. + /// + /// The getValue() method displaces the input value by adding the output + /// value from this displacement module to the @a x coordinate of the + /// input value before returning the output value from the source + /// module. + /// + /// This method assigns an index value of 1 to the @a x displacement + /// module. Passing this displacement module to this method produces + /// the same results as passing this displacement module to the + /// setSourceModule() method while assigning it an index value of 1. + /// + /// This displacement module must exist throughout the lifetime of this + /// noise module unless another displacement module replaces it. + public void setXDisplaceModule (ModuleBase xDisplaceModule) + { + assert (sourceModules != null); + sourceModules[1] = xDisplaceModule; + } + + /// Sets the @a y displacement module. + /// + /// @param yDisplaceModule Displacement module that displaces the @a y + /// coordinate. + /// + /// The getValue() method displaces the input value by adding the output + /// value from this displacement module to the @a y coordinate of the + /// input value before returning the output value from the source + /// module. + /// + /// This method assigns an index value of 2 to the @a y displacement + /// module. Passing this displacement module to this method produces + /// the same results as passing this displacement module to the + /// setSourceModule() method while assigning it an index value of 2. + /// + /// This displacement module must exist throughout the lifetime of this + /// noise module unless another displacement module replaces it. + public void setYDisplaceModule (ModuleBase yDisplaceModule) + { + assert (sourceModules != null); + sourceModules[2] = yDisplaceModule; + } + + /// Sets the @a z displacement module. + /// + /// @param zDisplaceModule Displacement module that displaces the @a z + /// coordinate. + /// + /// The getValue() method displaces the input value by adding the output + /// value from this displacement module to the @a z coordinate of the + /// input value before returning the output value from the source + /// module. + /// + /// This method assigns an index value of 3 to the @a z displacement + /// module. Passing this displacement module to this method produces + /// the same results as passing this displacement module to the + /// setSourceModule() method while assigning it an index value of 3. + /// + /// This displacement module must exist throughout the lifetime of this + /// noise module unless another displacement module replaces it. + public void setZDisplaceModule (ModuleBase zDisplaceModule) + { + assert (sourceModules != null); + sourceModules[3] = zDisplaceModule; + } + +} diff --git a/src/libnoiseforjava/module/Exponent.java b/src/libnoiseforjava/module/Exponent.java index 95cd234..64f9cdc 100644 --- a/src/libnoiseforjava/module/Exponent.java +++ b/src/libnoiseforjava/module/Exponent.java @@ -1,79 +1,79 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Exponent extends ModuleBase -{ - /// Noise module that maps the output value from a source module onto an - /// exponential curve. - /// - /// Because most noise modules will output values that range from -1.0 to - /// +1.0, this noise module first normalizes this output value (the range - /// becomes 0.0 to 1.0), maps that value onto an exponential curve, then - /// rescales that value back to the original range. - /// - /// This noise module requires one source module. - - /// Default exponent for the Exponent noise module. - static final double DEFAULT_EXPONENT = 1.0; - - - /// Exponent to apply to the output value from the source module. - double exponent; - - public Exponent (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - exponent = DEFAULT_EXPONENT; - - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - - double value = sourceModules[0].getValue (x, y, z); - return (Math.pow (Math.abs ((value + 1.0) / 2.0), exponent) * 2.0 - 1.0); - } - - /// Returns the exponent value to apply to the output value from the - /// source module. - /// - /// @returns The exponent value. - public double getExponent () - { - return exponent; - } - - public void setExponent(double exponent) - { - this.exponent = exponent; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Exponent extends ModuleBase +{ + /// Noise module that maps the output value from a source module onto an + /// exponential curve. + /// + /// Because most noise modules will output values that range from -1.0 to + /// +1.0, this noise module first normalizes this output value (the range + /// becomes 0.0 to 1.0), maps that value onto an exponential curve, then + /// rescales that value back to the original range. + /// + /// This noise module requires one source module. + + /// Default exponent for the Exponent noise module. + static final double DEFAULT_EXPONENT = 1.0; + + + /// Exponent to apply to the output value from the source module. + double exponent; + + public Exponent (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + exponent = DEFAULT_EXPONENT; + + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + + double value = sourceModules[0].getValue (x, y, z); + return (Math.pow (Math.abs ((value + 1.0) / 2.0), exponent) * 2.0 - 1.0); + } + + /// Returns the exponent value to apply to the output value from the + /// source module. + /// + /// @returns The exponent value. + public double getExponent () + { + return exponent; + } + + public void setExponent(double exponent) + { + this.exponent = exponent; + } + +} diff --git a/src/libnoiseforjava/module/Gradient.java b/src/libnoiseforjava/module/Gradient.java new file mode 100644 index 0000000..91b4132 --- /dev/null +++ b/src/libnoiseforjava/module/Gradient.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * Copyright 2012 Michael Nugent (This module) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +/** + * User: mike nugent + * Date: 2/5/12 + * Time: 4:40 PM + * URL: https://github.com/michaelnugent/libnoiseforjava + * Package: libnoiseforjava.module + */ +public class Gradient extends ModuleBase { + + AXIS axis = AXIS.Y; + + double inputMin = 0; + double inputMax = 255; + + double scaledMin = -1; + double scaledMax = 1; + + public enum AXIS { + X, + Y, + Z + }; + + public Gradient() { + super(); + } + + public Gradient(AXIS axis) { + super(); + this.axis = axis; + } + + public double getValue(double x, double y, double z) { + if (axis == AXIS.Y) { + double outy = scale(y, this.inputMin, this.inputMax, this.scaledMin, this.scaledMax); + return outy; + } else if (axis == AXIS.X) { + double outx = scale(x, this.inputMin, this.inputMax, this.scaledMin, this.scaledMax); + return outx; + } else { + double outz = scale(z, this.inputMin, this.inputMax, this.scaledMin, this.scaledMax); + return outz; + } + } + + private double scale( double inVal, double inMin, double inMax, double min, double max ) { + double m = (max-min)/(inMax-inMin); + double c = min-inMin*m; + return m*inVal+c; + } + + public AXIS getAxis() { + return axis; + } + + public void setAxis(AXIS axis) { + this.axis = axis; + } + + public double getInputMin() { + return inputMin; + } + + public void setInputMin(double inputMin) { + this.inputMin = inputMin; + } + + public double getInputMax() { + return inputMax; + } + + public void setInputMax(double inputMax) { + this.inputMax = inputMax; + } + + public double getScaledMin() { + return scaledMin; + } + + public void setScaledMin(double scaledMin) { + this.scaledMin = scaledMin; + } + + public double getScaledMax() { + return scaledMax; + } + + public void setScaledMax(double scaledMax) { + this.scaledMax = scaledMax; + } +} diff --git a/src/libnoiseforjava/module/Identity.java b/src/libnoiseforjava/module/Identity.java new file mode 100644 index 0000000..6fe0f3a --- /dev/null +++ b/src/libnoiseforjava/module/Identity.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * Copyright 2012 Michael Nugent (This module) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +/** + * User: mike nugent + * Date: 2/5/12 + * Time: 4:19 PM + * URL: https://github.com/michaelnugent/libnoiseforjava + * Package: libnoiseforjava.module + */ +public class Identity extends ModuleBase { + + AXIS axis = AXIS.Y; + + public enum AXIS { + X, + Y, + Z + }; + + public Identity() { + super(); + } + + public Identity( AXIS axis ) { + super(); + this.axis = axis; + } + + public void setAxis( AXIS axis ) { + this.axis = axis; + } + + public double getValue(double x, double y, double z) { + if ( axis == AXIS.Y ) { + return y; + } + else if ( axis == AXIS.X ) { + return x; + } + else { + return z; + } + } +} diff --git a/src/libnoiseforjava/module/Intersection.java b/src/libnoiseforjava/module/Intersection.java new file mode 100644 index 0000000..4a0f20e --- /dev/null +++ b/src/libnoiseforjava/module/Intersection.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * Copyright 2012 Michael Nugent (This module) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +/** + * User: mike nugent + * Date: 2/18/12 + * Time: 11:57 PM + * URL: https://github.com/michaelnugent/libnoiseforjava + * Package: libnoiseforjava.module + */ +public class Intersection extends ModuleBase { + double cutoff; + public Intersection(ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo, double cutoff) throws ExceptionInvalidParam + { + super(2); + setSourceModule(0, sourceModuleOne); + setSourceModule(1, sourceModuleTwo); + this.cutoff = cutoff; + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (sourceModules[1] != null); + + double s1 = sourceModules[0].getValue(x,y,z); + double s2 = sourceModules[1].getValue(x,y,z); + + if ( s1 + cutoff > s2 && s1 - cutoff < s2 ) { + return s1; + } + else { + return -1; + } + } +} diff --git a/src/libnoiseforjava/module/Invert.java b/src/libnoiseforjava/module/Invert.java index bacd2fc..106b79f 100644 --- a/src/libnoiseforjava/module/Invert.java +++ b/src/libnoiseforjava/module/Invert.java @@ -1,48 +1,48 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Invert extends ModuleBase -{ - /// Noise module that inverts the output value from a source module. - /// - /// This noise module requires one source module. - public Invert (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - - return -(sourceModules[0].getValue (x, y, z)); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Invert extends ModuleBase +{ + /// Noise module that inverts the output value from a source module. + /// + /// This noise module requires one source module. + public Invert (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + + return -(sourceModules[0].getValue (x, y, z)); + } + +} diff --git a/src/libnoiseforjava/module/Max.java b/src/libnoiseforjava/module/Max.java index e03bfa2..34757f6 100644 --- a/src/libnoiseforjava/module/Max.java +++ b/src/libnoiseforjava/module/Max.java @@ -1,54 +1,54 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Max extends ModuleBase -{ - /// Noise module that outputs the larger of the two output values from two - /// source modules. - /// - /// This noise module requires two source modules. - - public Max (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam - { - super(2); - setSourceModule(0, sourceModuleOne); - setSourceModule(1, sourceModuleTwo); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (sourceModules[1] != null); - - double v0 = sourceModules[0].getValue (x, y, z); - double v1 = sourceModules[1].getValue (x, y, z); - return Math.max(v0, v1); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Max extends ModuleBase +{ + /// Noise module that outputs the larger of the two output values from two + /// source modules. + /// + /// This noise module requires two source modules. + + public Max (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam + { + super(2); + setSourceModule(0, sourceModuleOne); + setSourceModule(1, sourceModuleTwo); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (sourceModules[1] != null); + + double v0 = sourceModules[0].getValue (x, y, z); + double v1 = sourceModules[1].getValue (x, y, z); + return Math.max(v0, v1); + } + +} diff --git a/src/libnoiseforjava/module/Min.java b/src/libnoiseforjava/module/Min.java index 5594c67..cd6bea0 100644 --- a/src/libnoiseforjava/module/Min.java +++ b/src/libnoiseforjava/module/Min.java @@ -1,56 +1,56 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Min extends ModuleBase -{ - /// Noise module that outputs the smaller of the two output values from - /// two source modules. - /// - /// @image html modulemin.png - /// - /// This noise module requires two source modules. - - public Min (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam - { - super(2); - setSourceModule(0, sourceModuleOne); - setSourceModule(1, sourceModuleTwo); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (sourceModules[1] != null); - - double v0 = sourceModules[0].getValue (x, y, z); - double v1 = sourceModules[1].getValue (x, y, z); - return Math.min(v0, v1); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Min extends ModuleBase +{ + /// Noise module that outputs the smaller of the two output values from + /// two source modules. + /// + /// @image html modulemin.png + /// + /// This noise module requires two source modules. + + public Min (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam + { + super(2); + setSourceModule(0, sourceModuleOne); + setSourceModule(1, sourceModuleTwo); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (sourceModules[1] != null); + + double v0 = sourceModules[0].getValue (x, y, z); + double v1 = sourceModules[1].getValue (x, y, z); + return Math.min(v0, v1); + } + +} diff --git a/src/libnoiseforjava/module/ModuleBase.java b/src/libnoiseforjava/module/ModuleBase.java index ece119e..7c050ef 100644 --- a/src/libnoiseforjava/module/ModuleBase.java +++ b/src/libnoiseforjava/module/ModuleBase.java @@ -1,171 +1,177 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; -import libnoiseforjava.exception.ExceptionNoModule; - -public class ModuleBase -{ - - // base class for noise modules. - public ModuleBase[] sourceModules; - public int modulesRequired; - - public ModuleBase() - { - modulesRequired = 0; - } - - public ModuleBase (int modulesRequired) - { - // Create an array of pointers to all source modules required by this - // noise module. Set these pointers to null. - if(modulesRequired>0) - { - sourceModules = new ModuleBase[modulesRequired]; - for (int i = 0; i < modulesRequired; i++) - { - sourceModules[i] = new ModuleBase(); - } - } - else - sourceModules = null; - - this.modulesRequired = modulesRequired; - } - - /// Returns a reference to a source module connected to this noise - /// module. - /// - /// @param index The index value assigned to the source module. - /// - /// @returns A reference to the source module. - /// - /// @pre The index value ranges from 0 to one less than the number of - /// source modules required by this noise module. - /// @pre A source module with the specified index value has been added - /// to this noise module via a call to setSourceModule(). - /// - /// @throw ExceptionNoModule See the preconditions for more - /// information. - /// - /// Each noise module requires the attachment of a certain number of - /// source modules before an application can call the getValue() - /// method. - public ModuleBase getSourceModule (int index) throws ExceptionNoModule - { - if (sourceModules != null) - { - if (index >= getSourceModuleCount () || index < 0 - || sourceModules[index] == null) - { - throw new ExceptionNoModule ("Could not retrieve a source module " + - "from a noise module."); - } - - return (sourceModules[index]); - } - throw new ExceptionNoModule ("Could not retrieve a source module " + - "from a noise module."); - } - - /// Returns the number of source modules required by this noise - /// module. - /// - /// @returns The number of source modules required by this noise - /// module. - public int getSourceModuleCount() - { - return modulesRequired; - } - - /// Generates an output value given the coordinates of the specified - /// input value. - /// - /// @param x The @a x coordinate of the input value. - /// @param y The @a y coordinate of the input value. - /// @param z The @a z coordinate of the input value. - /// - /// @returns The output value. - /// - /// @pre All source modules required by this noise module have been - /// passed to the setSourceModule() method. - /// - /// Before an application can call this method, it must first connect - /// all required source modules via the setSourceModule() method. If - /// these source modules are not connected to this noise module, this - /// method raises a debug assertion. - /// - /// To determine the number of source modules required by this noise - /// module, call the getSourceModuleCount() method. - public double getValue (double x, double y, double z) - { - return x; - } - - /// Connects a source module to this noise module. - /// - /// @param index An index value to assign to this source module. - /// @param sourceModule The source module to attach. - /// - /// @pre The index value ranges from 0 to one less than the number of - /// source modules required by this noise module. - /// - /// @throw ExceptionInvalidParam An invalid parameter was - /// specified; see the preconditions for more information. - /// - /// A noise module mathematically combines the output values from the - /// source modules to generate the value returned by getValue(). - /// - /// The index value to assign a source module is a unique identifier - /// for that source module. If an index value has already been - /// assigned to a source module, this noise module replaces the old - /// source module with the new source module. - /// - /// Before an application can call the getValue() method, it must - /// first connect all required source modules. To determine the - /// number of source modules required by this noise module, call the - /// getSourceModuleCount() method. - /// - /// This source module must exist throughout the lifetime of this - /// noise module unless another source module replaces that source - /// module. - /// - /// A noise module does not modify a source module; it only modifies - /// its output values. - public void setSourceModule (int index, ModuleBase sourceModule) - throws ExceptionInvalidParam - { - if (sourceModules != null) - { - if (index >= getSourceModuleCount () || index < 0) - throw new ExceptionInvalidParam ("Invalid Parameter in ModuleBase"); - } - this.sourceModules[index] = sourceModule; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; +import libnoiseforjava.exception.ExceptionNoModule; + +/** + * Base class for noise modules. + */ +public class ModuleBase +{ + + public ModuleBase[] sourceModules; + public int modulesRequired; + + public ModuleBase() + { + modulesRequired = 0; + } + + public ModuleBase (int modulesRequired) + { + // Create an array of pointers to all source modules required by this + // noise module. Set these pointers to null. + if(modulesRequired>0) + { + sourceModules = new ModuleBase[modulesRequired]; + for (int i = 0; i < modulesRequired; i++) + { + sourceModules[i] = new ModuleBase(); + } + } + else + sourceModules = null; + + this.modulesRequired = modulesRequired; + } + + /** + * Each noise module requires the attachment of a certain number of + * source modules before an application can call the getValue() + * method. + * + * @pre The index value ranges from 0 to one less than the number of + * source modules required by this noise module. + * @pre A source module with the specified index value has been added + * to this noise module via a call to setSourceModule(). + * @param index The index value assigned to the source module. + *
PreCondition: The index value ranges from 0 to one + * less than the number of source modules required by this noise module. + *
PreCondition : source module with the specified index value + * has been added to this noise module via a call to setSourceModule(). + * @return A reference to the source module. + * @throws ExceptionNoModule See the preconditions for more + * information. + */ + public ModuleBase getSourceModule (int index) throws ExceptionNoModule + { + if (sourceModules != null) + { + if (index >= getSourceModuleCount () || index < 0 + || sourceModules[index] == null) + { + throw new ExceptionNoModule ("Could not retrieve a source module " + + "from a noise module."); + } + + return (sourceModules[index]); + } + throw new ExceptionNoModule ("Could not retrieve a source module " + + "from a noise module."); + } + + /** + * Returns the number of source modules required by this noise module. + * + * @return The number of source modules required by this noise module. + */ + public int getSourceModuleCount() + { + return modulesRequired; + } + + /** + * Generates an output value given the coordinates of the specified + * input value. + * + *

Before an application can call this method, it must first connect + * all required source modules via the setSourceModule() method. If + * these source modules are not connected to this noise module, this + * method raises a debug assertion.

+ * + * To determine the number of source modules required by this noise + * module, call the getSourceModuleCount() method.

+ *

+ * @pre All source modules required by this noise module have been + * passed to the setSourceModule() method. + * @param x The @a x coordinate of the input value. + * @param y The @a y coordinate of the input value. + * @param z The @a z coordinate of the input value. + * @return The output value. + *
PreCondition : All source modules required by this noise + * module have been passed to the setSourceModule() method. + */ + public double getValue (double x, double y, double z) + { + return x; + } + + /** + * Connects a source module to this noise module. + *

+ * A noise module mathematically combines the output values from the + * source modules to generate the value returned by getValue().

+ * + * The index value to assign a source module is a unique identifier + * for that source module. If an index value has already been + * assigned to a source module, this noise module replaces the old + * source module with the new source module.

+ * + * Before an application can call the getValue() method, it must + * first connect all required source modules. To determine the + * number of source modules required by this noise module, call the + * getSourceModuleCount() method.

+ * + * This source module must exist throughout the lifetime of this + * noise module unless another source module replaces that source + * module.

+ * + * A noise module does not modify a source module; it only modifies + * its output values. + *

+ * @pre The index value ranges from 0 to one less than the number of + * source modules required by this noise module. + * @param index An index value to assign to this source module. + *
PreCondition :The index value ranges from 0 to one less + * than the number of source modules required by this noise module. + * @param sourceModule The source module to attach. + * @throws ExceptionInvalidParam An invalid parameter was + /// specified; see the preconditions for more information. + */ + public void setSourceModule (int index, ModuleBase sourceModule) + throws ExceptionInvalidParam + { + if (sourceModules != null) + { + if (index >= getSourceModuleCount () || index < 0) + throw new ExceptionInvalidParam ("Invalid Parameter in ModuleBase"); + } + this.sourceModules[index] = sourceModule; + } + +} diff --git a/src/libnoiseforjava/module/Multiply.java b/src/libnoiseforjava/module/Multiply.java index 1e29899..944994e 100644 --- a/src/libnoiseforjava/module/Multiply.java +++ b/src/libnoiseforjava/module/Multiply.java @@ -1,55 +1,55 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Multiply extends ModuleBase -{ - /// Noise module that outputs the product of the two output values from - /// two source modules. - /// - /// @image html modulemultiply.png - /// - /// This noise module requires two source modules. - - public Multiply (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam - { - super(2); - setSourceModule(0, sourceModuleOne); - setSourceModule(1, sourceModuleTwo); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (sourceModules[1] != null); - - return sourceModules[0].getValue (x, y, z) - * sourceModules[1].getValue (x, y, z); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Multiply extends ModuleBase +{ + /// Noise module that outputs the product of the two output values from + /// two source modules. + /// + /// @image html modulemultiply.png + /// + /// This noise module requires two source modules. + + public Multiply (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam + { + super(2); + setSourceModule(0, sourceModuleOne); + setSourceModule(1, sourceModuleTwo); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (sourceModules[1] != null); + + return sourceModules[0].getValue (x, y, z) + * sourceModules[1].getValue (x, y, z); + } + +} diff --git a/src/libnoiseforjava/module/Perlin.java b/src/libnoiseforjava/module/Perlin.java index 6174d1b..d455097 100644 --- a/src/libnoiseforjava/module/Perlin.java +++ b/src/libnoiseforjava/module/Perlin.java @@ -1,357 +1,404 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.NoiseGen; -import libnoiseforjava.NoiseGen.NoiseQuality; -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Perlin extends ModuleBase -{ - /// Noise module that outputs 3-dimensional Perlin noise. - /// - /// Perlin noise is the sum of several coherent-noise functions of - /// ever-increasing frequencies and ever-decreasing amplitudes. - /// - /// An important property of Perlin noise is that a small change in the - /// input value will produce a small change in the output value, while a - /// large change in the input value will produce a random change in the - /// output value. - /// - /// This noise module outputs Perlin-noise values that usually range from - /// -1.0 to +1.0, but there are no guarantees that all output values will - /// exist within that range. - /// - /// For a better description of Perlin noise, see the links in the - /// References and Acknowledgments section. - /// - /// This noise module does not require any source modules. - /// - /// Octaves - /// - /// The number of octaves control the amount of detail of the - /// Perlin noise. Adding more octaves increases the detail of the Perlin - /// noise, but with the drawback of increasing the calculation time. - /// - /// An octave is one of the coherent-noise functions in a series of - /// coherent-noise functions that are added together to form Perlin - /// noise. - /// - /// An application may specify the frequency of the first octave by - /// calling the setFrequency() method. - /// - /// An application may specify the number of octaves that generate Perlin - /// noise by calling the setOctaveCount() method. - /// - /// These coherent-noise functions are called octaves because each octave - /// has, by default, double the frequency of the previous octave. Musical - /// tones have this property as well; a musical C tone that is one octave - /// higher than the previous C tone has double its frequency. - /// - /// Frequency - /// - /// An application may specify the frequency of the first octave by - /// calling the setFrequency() method. - /// - /// Persistence - /// - /// The persistence value controls the roughness of the Perlin - /// noise. Larger values produce rougher noise. - /// - /// The persistence value determines how quickly the amplitudes diminish - /// for successive octaves. The amplitude of the first octave is 1.0. - /// The amplitude of each subsequent octave is equal to the product of the - /// previous octave's amplitude and the persistence value. So a - /// persistence value of 0.5 sets the amplitude of the first octave to - /// 1.0; the second, 0.5; the third, 0.25; etc. - /// - /// An application may specify the persistence value by calling the - /// setPersistence() method. - /// - /// Lacunarity - /// - /// The lacunarity specifies the frequency multipler between successive - /// octaves. - /// - /// The effect of modifying the lacunarity is subtle; you may need to play - /// with the lacunarity value to determine the effects. For best results, - /// set the lacunarity to a number between 1.5 and 3.5. - /// - /// References & acknowledgments - /// - /// The Noise Machine - - /// From the master, Ken Perlin himself. This page contains a - /// presentation that describes Perlin noise and some of its variants. - /// He won an Oscar for creating the Perlin noise algorithm! - /// - /// - /// Perlin Noise - Hugo Elias's webpage contains a very good - /// description of Perlin noise and describes its many applications. This - /// page gave me the inspiration to create libnoise in the first place. - /// Now that I know how to generate Perlin noise, I will never again use - /// cheesy subdivision algorithms to create terrain (unless I absolutely - /// need the speed.) - /// - /// The - /// Perlin noise math FAQ - A good page that describes Perlin noise in - /// plain English with only a minor amount of math. During development of - /// libnoise, I noticed that my coherent-noise function generated terrain - /// with some "regularity" to the terrain features. This page describes a - /// better coherent-noise function called gradient noise. This - /// version of the Perlin module uses gradient coherent noise to - /// generate Perlin noise. - - - /// Default frequency for the noise::module::Perlin noise module. - static final double DEFAULT_PERLIN_FREQUENCY = 1.0; - - /// Default lacunarity for the noise::module::Perlin noise module. - static final double DEFAULT_PERLIN_LACUNARITY = 2.0; - - /// Default number of octaves for the noise::module::Perlin noise module. - static final int DEFAULT_PERLIN_OCTAVE_COUNT = 6; - - /// Default persistence value for the noise::module::Perlin noise module. - static final double DEFAULT_PERLIN_PERSISTENCE = 0.5; - - /// Default noise quality for the noise::module::Perlin noise module. - static final NoiseQuality DEFAULT_PERLIN_QUALITY = NoiseQuality.QUALITY_STD; - - /// Default noise seed for the noise::module::Perlin noise module. - static final int DEFAULT_PERLIN_SEED = 0; - - /// Maximum number of octaves for the noise::module::Perlin noise module. - static final int PERLIN_MAX_OCTAVE = 30; - - - /// Frequency of the first octave. - double frequency; - - /// Frequency multiplier between successive octaves. - double lacunarity; - - /// Quality of the Perlin noise. - NoiseQuality noiseQuality; - - /// Total number of octaves that generate the Perlin noise. - int octaveCount; - - /// Persistence of the Perlin noise. - double persistence; - - /// Seed value used by the Perlin-noise function. - int seed; - - - public Perlin () - { - super(0); - frequency = DEFAULT_PERLIN_FREQUENCY; - lacunarity = DEFAULT_PERLIN_LACUNARITY; - noiseQuality = DEFAULT_PERLIN_QUALITY; - octaveCount = DEFAULT_PERLIN_OCTAVE_COUNT; - persistence = DEFAULT_PERLIN_PERSISTENCE; - seed = DEFAULT_PERLIN_SEED; - } - - public double getValue (double x, double y, double z) - { - double value = 0.0; - double signal = 0.0; - double curPersistence = 1.0; - double nx, ny, nz; - int curSeed; - - x *= frequency; - y *= frequency; - z *= frequency; - - for (int curOctave = 0; curOctave < octaveCount; curOctave++) - { - - // Make sure that these floating-point values have the same range as a 32- - // bit integer so that we can pass them to the coherent-noise functions. - nx = NoiseGen.MakeInt32Range (x); - ny = NoiseGen.MakeInt32Range (y); - nz = NoiseGen.MakeInt32Range (z); - - // Get the coherent-noise value from the input value and add it to the - // final result. - curSeed = (seed + curOctave) & 0xffffffff; - signal = NoiseGen.GradientCoherentNoise3D (nx, ny, nz, curSeed, noiseQuality); - value += signal * curPersistence; - - // Prepare the next octave. - x *= lacunarity; - y *= lacunarity; - z *= lacunarity; - curPersistence *= persistence; - } - - return value; - } - - /// Returns the frequency of the first octave. - /// - /// @returns The frequency of the first octave. - public double getFrequency () - { - return frequency; - } - - /// Returns the lacunarity of the Perlin noise. - /// - /// @returns The lacunarity of the Perlin noise. - /// - /// The lacunarity is the frequency multiplier between successive - /// octaves. - public double getLacunarity () - { - return lacunarity; - } - - /// Returns the quality of the Perlin noise. - /// - /// @returns The quality of the Perlin noise. - /// - /// See NoiseQuality for definitions of the various - /// coherent-noise qualities. - public NoiseQuality getNoiseQuality () - { - return noiseQuality; - } - - /// Returns the number of octaves that generate the Perlin noise. - /// - /// @returns The number of octaves that generate the Perlin noise. - /// - /// The number of octaves controls the amount of detail in the Perlin - /// noise. - public int getOctaveCount () - { - return octaveCount; - } - - /// Returns the persistence value of the Perlin noise. - /// - /// @returns The persistence value of the Perlin noise. - /// - /// The persistence value controls the roughness of the Perlin noise. - public double getPersistence () - { - return persistence; - } - - /// Returns the seed value used by the Perlin-noise function. - /// - /// @returns The seed value. - public int getSeed () - { - return seed; - } - - /// Sets the frequency of the first octave. - /// - /// @param frequency The frequency of the first octave. - public void setFrequency (double frequency) - { - this.frequency = frequency; - } - - /// Sets the lacunarity of the Perlin noise. - /// - /// @param lacunarity The lacunarity of the Perlin noise. - /// - /// The lacunarity is the frequency multiplier between successive - /// octaves. - /// - /// For best results, set the lacunarity to a number between 1.5 and - /// 3.5. - public void setLacunarity (double lacunarity) - { - this.lacunarity = lacunarity; - } - - /// Sets the quality of the Perlin noise. - /// - /// @param noiseQuality The quality of the Perlin noise. - /// - /// See NoiseQuality for definitions of the various - /// coherent-noise qualities. - public void setNoiseQuality (NoiseQuality noiseQuality) - { - this.noiseQuality = noiseQuality; - } - - /// Sets the number of octaves that generate the Perlin noise. - /// - /// @param octaveCount The number of octaves that generate the Perlin - /// noise. - /// - /// @pre The number of octaves ranges from 1 to PERLIN_MAX_OCTAVE. - /// - /// @throw noise::ExceptionInvalidParam An invalid parameter was - /// specified; see the preconditions for more information. - /// - /// The number of octaves controls the amount of detail in the Perlin - /// noise. - /// - /// The larger the number of octaves, the more time required to - /// calculate the Perlin-noise value. - public void setOctaveCount (int octaveCount) throws ExceptionInvalidParam - { - if (octaveCount < 1 || octaveCount > PERLIN_MAX_OCTAVE) - { - throw new ExceptionInvalidParam ("Invalid parameter In Perlin Noise Module"); - } - - this.octaveCount = octaveCount; - } - - /// Sets the persistence value of the Perlin noise. - /// - /// @param persistence The persistence value of the Perlin noise. - /// - /// The persistence value controls the roughness of the Perlin noise. - /// - /// For best results, set the persistence to a number between 0.0 and - /// 1.0. - public void setPersistence (double persistence) - { - this.persistence = persistence; - } - - /// Sets the seed value used by the Perlin-noise function. - /// - /// @param seed The seed value. - public void setSeed (int seed) - { - this.seed = seed; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.NoiseGen; +import libnoiseforjava.NoiseGen.NoiseQuality; +import libnoiseforjava.exception.ExceptionInvalidParam; + +/** + * Noise module that outputs 3-dimensional Perlin noise. + * + *

+ * Perlin noise is the sum of several coherent-noise functions of + * ever-increasing frequencies and ever-decreasing amplitudes.
+ * + * An important property of Perlin noise is that a small change in the + * input value will produce a small change in the output value, while a + * large change in the input value will produce a random change in the + * output value.
+ * + * This noise module outputs Perlin-noise values that usually range from + * -1.0 to +1.0, but there are no guarantees that all output values will + * exist within that range.
+ * + * For a better description of Perlin noise, see the links in the + * References and Acknowledgments section.
+ * + * This noise module does not require any source modules. + *

+ * + *

+ * Octaves
+ * The number of octaves control the amount of detail of the + * Perlin noise. Adding more octaves increases the detail of the Perlin + * noise, but with the drawback of increasing the calculation time.
+ * + * An octave is one of the coherent-noise functions in a series of + * coherent-noise functions that are added together to form Perlin + * noise.
+ * + * An application may specify the frequency of the first octave by + * calling the setFrequency() method.
+ * + * An application may specify the number of octaves that generate Perlin + * noise by calling the setOctaveCount() method.
+ * + * These coherent-noise functions are called octaves because each octave + * has, by default, double the frequency of the previous octave. Musical + * tones have this property as well; a musical C tone that is one octave + * higher than the previous C tone has double its frequency. + *

+ * + *

+ * Frequency
+ * An application may specify the frequency of the first octave by + * calling the setFrequency() method. + *

+ *

+ * Persistence
+ * + * The persistence value controls the roughness of the Perlin + * noise. Larger values produce rougher noise.
+ * + * The persistence value determines how quickly the amplitudes diminish + * for successive octaves. The amplitude of the first octave is 1.0. + * The amplitude of each subsequent octave is equal to the product of the + * previous octave's amplitude and the persistence value. So a + * persistence value of 0.5 sets the amplitude of the first octave to + * 1.0; the second, 0.5; the third, 0.25; etc.
+ * + * An application may specify the persistence value by calling the + * setPersistence() method. + *

+ *

+ * Lacunarity
+ * + * The lacunarity specifies the frequency multipler between successive + * octaves. + * + * The effect of modifying the lacunarity is subtle; you may need to play + * with the lacunarity value to determine the effects. For best results, + * set the lacunarity to a number between 1.5 and 3.5. + *

+ *

+ * References & acknowledgments
+ * + * The Noise Machine - + * From the master, Ken Perlin himself. This page contains a + * presentation that describes Perlin noise and some of its variants. + * He won an Oscar for creating the Perlin noise algorithm!
+ * + * + * Perlin Noise - Hugo Elias's webpage contains a very good + * description of Perlin noise and describes its many applications. This + * page gave me the inspiration to create libnoise in the first place. + * Now that I know how to generate Perlin noise, I will never again use + * cheesy subdivision algorithms to create terrain (unless I absolutely + * need the speed.)
+ * + * The + * Perlin noise math FAQ - A good page that describes Perlin noise in + * plain English with only a minor amount of math. During development of + * libnoise, I noticed that my coherent-noise function generated terrain + * with some "regularity" to the terrain features. This page describes a + * better coherent-noise function called gradient noise. This + * version of the Perlin module uses gradient coherent noise to + * generate Perlin noise.
+ *

+ */ +public class Perlin extends ModuleBase + { + + /** + * Default frequency for the {@see libnoiseforjava.module.Perlin} noise module. + */ + static final double DEFAULT_PERLIN_FREQUENCY = 1.0; + + /** + * Default lacunarity for the noise::module::Perlin noise module. + */ + static final double DEFAULT_PERLIN_LACUNARITY = 2.0; + + /** + * Default number of octaves for the noise::module::Perlin noise module. + */ + static final int DEFAULT_PERLIN_OCTAVE_COUNT = 6; + + /** + * Default persistence value for the noise::module::Perlin noise module. + */ + static final double DEFAULT_PERLIN_PERSISTENCE = 0.5; + + /** + * Default noise quality for the noise::module::Perlin noise module. + */ + static final NoiseQuality DEFAULT_PERLIN_QUALITY = NoiseQuality.QUALITY_STD; + + /** + * Default noise seed for the noise::module::Perlin noise module. + */ + static final int DEFAULT_PERLIN_SEED = 0; + + /** + * Maximum number of octaves for the noise::module::Perlin noise module. + */ + static final int PERLIN_MAX_OCTAVE = 30; + + + /** + * Frequency of the first octave. + */ + double frequency; + + /** + * Frequency multiplier between successive octaves. + */ + double lacunarity; + + /** + * Quality of the Perlin noise. + */ + NoiseQuality noiseQuality; + + /** + * Total number of octaves that generate the Perlin noise. + */ + int octaveCount; + + /** + * Persistence of the Perlin noise. + */ + double persistence; + + /** + * Seed value used by the Perlin-noise function. + */ + int seed; + + + public Perlin () + { + super(0); + frequency = DEFAULT_PERLIN_FREQUENCY; + lacunarity = DEFAULT_PERLIN_LACUNARITY; + noiseQuality = DEFAULT_PERLIN_QUALITY; + octaveCount = DEFAULT_PERLIN_OCTAVE_COUNT; + persistence = DEFAULT_PERLIN_PERSISTENCE; + seed = DEFAULT_PERLIN_SEED; + } + + @Override + public double getValue (double x, double y, double z) + { + double value = 0.0; + double signal = 0.0; + double curPersistence = 1.0; + double nx, ny, nz; + int curSeed; + + x *= frequency; + y *= frequency; + z *= frequency; + + for (int curOctave = 0; curOctave < octaveCount; curOctave++) + { + + // Make sure that these floating-point values have the same range as a 32- + // bit integer so that we can pass them to the coherent-noise functions. + nx = NoiseGen.MakeInt32Range (x); + ny = NoiseGen.MakeInt32Range (y); + nz = NoiseGen.MakeInt32Range (z); + + // Get the coherent-noise value from the input value and add it to the + // final result. + curSeed = (seed + curOctave) & 0xffffffff; + signal = NoiseGen.GradientCoherentNoise3D (nx, ny, nz, curSeed, noiseQuality); + value += signal * curPersistence; + + // Prepare the next octave. + x *= lacunarity; + y *= lacunarity; + z *= lacunarity; + curPersistence *= persistence; + } + + return value; + } + + /** + * Returns the frequency of the first octave. + * + * @return The frequency of the first octave. + */ + public double getFrequency () + { + return frequency; + } + + /** + * The lacunarity is the frequency multiplier between successive + * octaves. + * + * @return The lacunarity of the Perlin noise. + */ + public double getLacunarity () + { + return lacunarity; + } + + /** + * Returns the quality of the Perlin noise. + * + * @see libnoiseforjava.NoiseGen.NoiseQuality NoiseQuality, + * for definitions of the various + * coherent-noise qualities. + * + * @return The quality of the Perlin noise. + */ + public NoiseQuality getNoiseQuality () + { + return noiseQuality; + } + + /** + * The number of octaves controls the amount of detail in the Perlin + * noise. + * + * @return The number of octaves that generate the Perlin noise. + */ + public int getOctaveCount () + { + return octaveCount; + } + + /** + * The persistence value controls the roughness of the Perlin noise. + * + * @return The persistence value of the Perlin noise. + */ + public double getPersistence () + { + return persistence; + } + + /** + * Returns the seed value used by the Perlin-noise function. + * + * @return The seed value. + */ + public int getSeed () + { + return seed; + } + + /** + * Sets the frequency of the first octave. + * + * @param frequency The frequency of the first octave. + */ + public void setFrequency (double frequency) + { + this.frequency = frequency; + } + + /** + * The lacunarity is the frequency multiplier between successive + * octaves. + * + * For best results, set the lacunarity to a number between 1.5 and + * 3.5. + * + * @param lacunarity The lacunarity of the Perlin noise. + */ + public void setLacunarity (double lacunarity) + { + this.lacunarity = lacunarity; + } + + /** + * Sets the quality of the Perlin noise. + * + * @see libnoiseforjava.NoiseGen.NoiseQuality NoiseQuality, + * for definitions of the various + * coherent-noise qualities. + * @param noiseQuality The quality of the Perlin noise. + */ + public void setNoiseQuality (NoiseQuality noiseQuality) + { + this.noiseQuality = noiseQuality; + } + + /** + * The number of octaves controls the amount of detail in the Perlin + * noise. + * + * The larger the number of octaves, the more time required to + * calculate the Perlin-noise value. + * + * @pre The number of octaves ranges from 1 to PERLIN_MAX_OCTAVE. + * @param octaveCount The number of octaves that generate the Perlin + * noise.
+ * PreCondition : The number of octaves ranges from 1 to PERLIN_MAX_OCTAVE.) + * @throws ExceptionInvalidParam An invalid parameter was + * specified; see the preconditions for more information. + */ + public void setOctaveCount (int octaveCount) throws ExceptionInvalidParam + { + if (octaveCount < 1 || octaveCount > PERLIN_MAX_OCTAVE) + { setOctaveCount(octaveCount); + throw new ExceptionInvalidParam ("Invalid parameter In Perlin Noise Module"); + } + + this.octaveCount = octaveCount; + } + + /** + * The persistence value controls the roughness of the Perlin noise. + * + * For best results, set the persistence to a number between 0.0 and + * 1.0. + * + * @param persistence The persistence value of the Perlin noise. + */ + public void setPersistence (double persistence) + { + this.persistence = persistence; + } + + /** + * Sets the seed value used by the Perlin-noise function. + * + * @param seed The seed value. + */ + public void setSeed (int seed) + { + this.seed = seed; + } + +} diff --git a/src/libnoiseforjava/module/Power.java b/src/libnoiseforjava/module/Power.java index 0760f8b..53484a9 100644 --- a/src/libnoiseforjava/module/Power.java +++ b/src/libnoiseforjava/module/Power.java @@ -1,56 +1,56 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Power extends ModuleBase -{ - /// Noise module that raises the output value from a first source module - /// to the power of the output value from a second source module. - /// - /// The first source module must have an index value of 0. - /// - /// The second source module must have an index value of 1. - /// - /// This noise module requires two source modules. - - public Power (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam - { - super(2); - setSourceModule(0, sourceModuleOne); - setSourceModule(1, sourceModuleTwo); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (sourceModules[1] != null); - - return Math.pow (sourceModules[0].getValue (x, y, z), - sourceModules[1].getValue (x, y, z)); - } -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Power extends ModuleBase +{ + /// Noise module that raises the output value from a first source module + /// to the power of the output value from a second source module. + /// + /// The first source module must have an index value of 0. + /// + /// The second source module must have an index value of 1. + /// + /// This noise module requires two source modules. + + public Power (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo) throws ExceptionInvalidParam + { + super(2); + setSourceModule(0, sourceModuleOne); + setSourceModule(1, sourceModuleTwo); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (sourceModules[1] != null); + + return Math.pow (sourceModules[0].getValue (x, y, z), + sourceModules[1].getValue (x, y, z)); + } +} diff --git a/src/libnoiseforjava/module/RidgedMulti.java b/src/libnoiseforjava/module/RidgedMulti.java index 36916d9..c1a2d4c 100644 --- a/src/libnoiseforjava/module/RidgedMulti.java +++ b/src/libnoiseforjava/module/RidgedMulti.java @@ -1,357 +1,357 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.NoiseGen; -import libnoiseforjava.NoiseGen.NoiseQuality; -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class RidgedMulti extends ModuleBase -{ - /// Noise module that outputs 3-dimensional ridged-multifractal noise. - /// - /// This noise module, heavily based on the Perlin-noise module, generates - /// ridged-multifractal noise. Ridged-multifractal noise is generated in - /// much of the same way as Perlin noise, except the output of each octave - /// is modified by an absolute-value function. Modifying the octave - /// values in this way produces ridge-like formations. - /// - /// Ridged-multifractal noise does not use a persistence value. This is - /// because the persistence values of the octaves are based on the values - /// generated from from previous octaves, creating a feedback loop (or - /// that's what it looks like after reading the code.) - /// - /// This noise module outputs ridged-multifractal-noise values that - /// usually range from -1.0 to +1.0, but there are no guarantees that all - /// output values will exist within that range. - /// - /// @note For ridged-multifractal noise generated with only one octave, - /// the output value ranges from -1.0 to 0.0. - /// - /// Ridged-multifractal noise is often used to generate craggy mountainous - /// terrain or marble-like textures. - /// - /// This noise module does not require any source modules. - /// - /// Octaves - /// - /// The number of octaves control the amount of detail of the - /// ridged-multifractal noise. Adding more octaves increases the detail - /// of the ridged-multifractal noise, but with the drawback of increasing - /// the calculation time. - /// - /// An application may specify the number of octaves that generate - /// ridged-multifractal noise by calling the setOctaveCount() method. - /// - /// Frequency - /// - /// An application may specify the frequency of the first octave by - /// calling the setFrequency() method. - /// - /// Lacunarity - /// - /// The lacunarity specifies the frequency multipler between successive - /// octaves. - /// - /// The effect of modifying the lacunarity is subtle; you may need to play - /// with the lacunarity value to determine the effects. For best results, - /// set the lacunarity to a number between 1.5 and 3.5. - /// - /// References & Acknowledgments - /// - /// F. - /// Kenton "Doc Mojo" Musgrave's texturing page - This page contains - /// links to source code that generates ridged-multfractal noise, among - /// other types of noise. The source file - /// fractal.c contains the code I used in my ridged-multifractal class - /// (see the @a RidgedMultifractal() function.) This code was written by F. - /// Kenton Musgrave, the person who created - /// MojoWorld. He is also one of - /// the authors in Texturing and Modeling: A Procedural Approach - /// (Morgan Kaufmann, 2002. ISBN 1-55860-848-6.) - - /// Default frequency for the noise::module::RidgedMulti noise module. - static final double DEFAULT_RIDGED_FREQUENCY = 1.0; - - /// Default lacunarity for the noise::module::RidgedMulti noise module. - static final double DEFAULT_RIDGED_LACUNARITY = 2.0; - - /// Default number of octaves for the noise::module::RidgedMulti noise - /// module. - static final int DEFAULT_RIDGED_OCTAVE_COUNT = 6; - - /// Default noise quality for the noise::module::RidgedMulti noise - /// module. - static final NoiseQuality DEFAULT_RIDGED_QUALITY = NoiseQuality.QUALITY_STD; - - /// Default noise seed for the noise::module::RidgedMulti noise module. - static final int DEFAULT_RIDGED_SEED = 0; - - /// Maximum number of octaves for the noise::module::RidgedMulti noise - /// module. - static final int RIDGED_MAX_OCTAVE = 30; - - /// Frequency of the first octave. - double frequency; - - /// Frequency multiplier between successive octaves. - double lacunarity; - - /// Quality of the ridged-multifractal noise. - NoiseQuality noiseQuality; - - /// Total number of octaves that generate the ridged-multifractal - /// noise. - int octaveCount; - - /// Contains the spectral weights for each octave. - double [] spectralWeights = new double[RIDGED_MAX_OCTAVE]; - - /// Seed value used by the ridged-multfractal-noise function. - int seed; - - - public RidgedMulti () - { - super(0); - frequency = DEFAULT_RIDGED_FREQUENCY; - lacunarity = DEFAULT_RIDGED_LACUNARITY; - noiseQuality = DEFAULT_RIDGED_QUALITY; - octaveCount = DEFAULT_RIDGED_OCTAVE_COUNT; - seed = DEFAULT_RIDGED_SEED; - - calcSpectralWeights(); - } - - // Calculates the spectral weights for each octave. - public void calcSpectralWeights () - { - // This exponent parameter should be user-defined; it may be exposed in a - // future version of libnoise. - double h = 1.0; - - double frequency = 1.0; - for (int i = 0; i < RIDGED_MAX_OCTAVE; i++) { - // Compute weight for each frequency. - this.spectralWeights[i] = Math.pow (frequency, -h); - frequency *= lacunarity; - } - } - - // Multifractal code originally written by F. Kenton "Doc Mojo" Musgrave, - // 1998. Modified by jas for use with libnoise. - public double getValue (double x, double y, double z) - { - x *= frequency; - y *= frequency; - z *= frequency; - - double signal = 0.0; - double value = 0.0; - double weight = 1.0; - - // These parameters should be user-defined; they may be exposed in a - // future version of libnoiseforjava. - double offset = 1.0; - double gain = 2.0; - - for (int curOctave = 0; curOctave < octaveCount; curOctave++) - { - // Make sure that these floating-point values have the same range as a 32- - // bit integer so that we can pass them to the coherent-noise functions. - double nx, ny, nz; - nx = NoiseGen.MakeInt32Range (x); - ny = NoiseGen.MakeInt32Range (y); - nz = NoiseGen.MakeInt32Range (z); - - // Get the coherent-noise value. - int curSeed = (seed + curOctave) & 0x7fffffff; - signal = NoiseGen.GradientCoherentNoise3D (nx, ny, nz, curSeed, noiseQuality); - - // Make the ridges. - signal = Math.abs (signal); - signal = offset - signal; - - // Square the signal to increase the sharpness of the ridges. - signal *= signal; - - // The weighting from the previous octave is applied to the signal. - // Larger values have higher weights, producing sharp points along the - // ridges. - signal *= weight; - - // Weight successive contributions by the previous signal. - weight = signal * gain; - if (weight > 1.0) - weight = 1.0; - if (weight < 0.0) - weight = 0.0; - - - // Add the signal to the output value. - value += (signal * spectralWeights[curOctave]); - - // Go to the next octave. - x *= lacunarity; - y *= lacunarity; - z *= lacunarity; - } - - return (value * 1.25) - 1.0; - } - - public double getFrequency () - { - return frequency; - } - - /// Returns the lacunarity of the ridged-multifractal noise. - /// - /// @returns The lacunarity of the ridged-multifractal noise. - /// - /// The lacunarity is the frequency multiplier between successive - /// octaves. - public double getLacunarity () - { - return lacunarity; - } - - /// Returns the quality of the ridged-multifractal noise. - /// - /// @returns The quality of the ridged-multifractal noise. - /// - /// See noise::NoiseQuality for definitions of the various - /// coherent-noise qualities. - public NoiseQuality getNoiseQuality () - { - return noiseQuality; - } - - /// Returns the number of octaves that generate the - /// ridged-multifractal noise. - /// - /// @returns The number of octaves that generate the - /// ridged-multifractal noise. - /// - /// The number of octaves controls the amount of detail in the - /// ridged-multifractal noise. - public int getOctaveCount () - { - return octaveCount; - } - - /// Returns the seed value used by the ridged-multifractal-noise - /// function. - /// - /// @returns The seed value. - public int getSeed () - { - return seed; - } - - - /// Sets the frequency of the first octave. - /// - /// @param frequency The frequency of the first octave. - public void setFrequency (double frequency) - { - this.frequency = frequency; - } - - /// Sets the lacunarity of the ridged-multifractal noise. - /// - /// @param lacunarity The lacunarity of the ridged-multifractal noise. - /// - /// The lacunarity is the frequency multiplier between successive - /// octaves. - /// - /// For best results, set the lacunarity to a number between 1.5 and - /// 3.5. - public void setLacunarity (double lacunarity) - { - this.lacunarity = lacunarity; - calcSpectralWeights (); - } - - /// Sets the quality of the ridged-multifractal noise. - /// - /// @param noiseQuality The quality of the ridged-multifractal noise. - /// - /// See NoiseQuality for definitions of the various - /// coherent-noise qualities. - public void setNoiseQuality (NoiseQuality noiseQuality) - { - this.noiseQuality = noiseQuality; - } - - /// Sets the number of octaves that generate the ridged-multifractal - /// noise. - /// - /// @param octaveCount The number of octaves that generate the - /// ridged-multifractal noise. - /// - /// @pre The number of octaves ranges from 1 to RIDGED_MAX_OCTAVE. - /// - /// @throw ExceptionInvalidParam An invalid parameter was - /// specified; see the preconditions for more information. - /// - /// The number of octaves controls the amount of detail in the - /// ridged-multifractal noise. - /// - /// The larger the number of octaves, the more time required to - /// calculate the ridged-multifractal-noise value. - public void setOctaveCount (int octaveCount) throws ExceptionInvalidParam - { - if (octaveCount > RIDGED_MAX_OCTAVE) - { - throw new ExceptionInvalidParam ("An invalid parameter was passed" + - " to a libnoise function or method."); - } - - this.octaveCount = octaveCount; - } - - /// Sets the seed value used by the ridged-multifractal-noise - /// function. - /// - /// @param seed The seed value. - public void setSeed (int seed) - { - this.seed = seed; - } - - public double[] getSpectralWeights() - { - return spectralWeights; - } - - public void setSpectralWeights(double[] spectralWeights) - { - this.spectralWeights = spectralWeights; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.NoiseGen; +import libnoiseforjava.NoiseGen.NoiseQuality; +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class RidgedMulti extends ModuleBase +{ + /// Noise module that outputs 3-dimensional ridged-multifractal noise. + /// + /// This noise module, heavily based on the Perlin-noise module, generates + /// ridged-multifractal noise. Ridged-multifractal noise is generated in + /// much of the same way as Perlin noise, except the output of each octave + /// is modified by an absolute-value function. Modifying the octave + /// values in this way produces ridge-like formations. + /// + /// Ridged-multifractal noise does not use a persistence value. This is + /// because the persistence values of the octaves are based on the values + /// generated from from previous octaves, creating a feedback loop (or + /// that's what it looks like after reading the code.) + /// + /// This noise module outputs ridged-multifractal-noise values that + /// usually range from -1.0 to +1.0, but there are no guarantees that all + /// output values will exist within that range. + /// + /// @note For ridged-multifractal noise generated with only one octave, + /// the output value ranges from -1.0 to 0.0. + /// + /// Ridged-multifractal noise is often used to generate craggy mountainous + /// terrain or marble-like textures. + /// + /// This noise module does not require any source modules. + /// + /// Octaves + /// + /// The number of octaves control the amount of detail of the + /// ridged-multifractal noise. Adding more octaves increases the detail + /// of the ridged-multifractal noise, but with the drawback of increasing + /// the calculation time. + /// + /// An application may specify the number of octaves that generate + /// ridged-multifractal noise by calling the setOctaveCount() method. + /// + /// Frequency + /// + /// An application may specify the frequency of the first octave by + /// calling the setFrequency() method. + /// + /// Lacunarity + /// + /// The lacunarity specifies the frequency multipler between successive + /// octaves. + /// + /// The effect of modifying the lacunarity is subtle; you may need to play + /// with the lacunarity value to determine the effects. For best results, + /// set the lacunarity to a number between 1.5 and 3.5. + /// + /// References & Acknowledgments + /// + /// F. + /// Kenton "Doc Mojo" Musgrave's texturing page - This page contains + /// links to source code that generates ridged-multfractal noise, among + /// other types of noise. The source file + /// fractal.c contains the code I used in my ridged-multifractal class + /// (see the @a RidgedMultifractal() function.) This code was written by F. + /// Kenton Musgrave, the person who created + /// MojoWorld. He is also one of + /// the authors in Texturing and Modeling: A Procedural Approach + /// (Morgan Kaufmann, 2002. ISBN 1-55860-848-6.) + + /// Default frequency for the noise::module::RidgedMulti noise module. + static final double DEFAULT_RIDGED_FREQUENCY = 1.0; + + /// Default lacunarity for the noise::module::RidgedMulti noise module. + static final double DEFAULT_RIDGED_LACUNARITY = 2.0; + + /// Default number of octaves for the noise::module::RidgedMulti noise + /// module. + static final int DEFAULT_RIDGED_OCTAVE_COUNT = 6; + + /// Default noise quality for the noise::module::RidgedMulti noise + /// module. + static final NoiseQuality DEFAULT_RIDGED_QUALITY = NoiseQuality.QUALITY_STD; + + /// Default noise seed for the noise::module::RidgedMulti noise module. + static final int DEFAULT_RIDGED_SEED = 0; + + /// Maximum number of octaves for the noise::module::RidgedMulti noise + /// module. + static final int RIDGED_MAX_OCTAVE = 30; + + /// Frequency of the first octave. + double frequency; + + /// Frequency multiplier between successive octaves. + double lacunarity; + + /// Quality of the ridged-multifractal noise. + NoiseQuality noiseQuality; + + /// Total number of octaves that generate the ridged-multifractal + /// noise. + int octaveCount; + + /// Contains the spectral weights for each octave. + double [] spectralWeights = new double[RIDGED_MAX_OCTAVE]; + + /// Seed value used by the ridged-multfractal-noise function. + int seed; + + + public RidgedMulti () + { + super(0); + frequency = DEFAULT_RIDGED_FREQUENCY; + lacunarity = DEFAULT_RIDGED_LACUNARITY; + noiseQuality = DEFAULT_RIDGED_QUALITY; + octaveCount = DEFAULT_RIDGED_OCTAVE_COUNT; + seed = DEFAULT_RIDGED_SEED; + + calcSpectralWeights(); + } + + // Calculates the spectral weights for each octave. + public void calcSpectralWeights () + { + // This exponent parameter should be user-defined; it may be exposed in a + // future version of libnoise. + double h = 1.0; + + double frequency = 1.0; + for (int i = 0; i < RIDGED_MAX_OCTAVE; i++) { + // Compute weight for each frequency. + this.spectralWeights[i] = Math.pow (frequency, -h); + frequency *= lacunarity; + } + } + + // Multifractal code originally written by F. Kenton "Doc Mojo" Musgrave, + // 1998. Modified by jas for use with libnoise. + public double getValue (double x, double y, double z) + { + x *= frequency; + y *= frequency; + z *= frequency; + + double signal = 0.0; + double value = 0.0; + double weight = 1.0; + + // These parameters should be user-defined; they may be exposed in a + // future version of libnoiseforjava. + double offset = 1.0; + double gain = 2.0; + + for (int curOctave = 0; curOctave < octaveCount; curOctave++) + { + // Make sure that these floating-point values have the same range as a 32- + // bit integer so that we can pass them to the coherent-noise functions. + double nx, ny, nz; + nx = NoiseGen.MakeInt32Range (x); + ny = NoiseGen.MakeInt32Range (y); + nz = NoiseGen.MakeInt32Range (z); + + // Get the coherent-noise value. + int curSeed = (seed + curOctave) & 0x7fffffff; + signal = NoiseGen.GradientCoherentNoise3D (nx, ny, nz, curSeed, noiseQuality); + + // Make the ridges. + signal = Math.abs (signal); + signal = offset - signal; + + // Square the signal to increase the sharpness of the ridges. + signal *= signal; + + // The weighting from the previous octave is applied to the signal. + // Larger values have higher weights, producing sharp points along the + // ridges. + signal *= weight; + + // Weight successive contributions by the previous signal. + weight = signal * gain; + if (weight > 1.0) + weight = 1.0; + if (weight < 0.0) + weight = 0.0; + + + // Add the signal to the output value. + value += (signal * spectralWeights[curOctave]); + + // Go to the next octave. + x *= lacunarity; + y *= lacunarity; + z *= lacunarity; + } + + return (value * 1.25) - 1.0; + } + + public double getFrequency () + { + return frequency; + } + + /// Returns the lacunarity of the ridged-multifractal noise. + /// + /// @returns The lacunarity of the ridged-multifractal noise. + /// + /// The lacunarity is the frequency multiplier between successive + /// octaves. + public double getLacunarity () + { + return lacunarity; + } + + /// Returns the quality of the ridged-multifractal noise. + /// + /// @returns The quality of the ridged-multifractal noise. + /// + /// See noise::NoiseQuality for definitions of the various + /// coherent-noise qualities. + public NoiseQuality getNoiseQuality () + { + return noiseQuality; + } + + /// Returns the number of octaves that generate the + /// ridged-multifractal noise. + /// + /// @returns The number of octaves that generate the + /// ridged-multifractal noise. + /// + /// The number of octaves controls the amount of detail in the + /// ridged-multifractal noise. + public int getOctaveCount () + { + return octaveCount; + } + + /// Returns the seed value used by the ridged-multifractal-noise + /// function. + /// + /// @returns The seed value. + public int getSeed () + { + return seed; + } + + + /// Sets the frequency of the first octave. + /// + /// @param frequency The frequency of the first octave. + public void setFrequency (double frequency) + { + this.frequency = frequency; + } + + /// Sets the lacunarity of the ridged-multifractal noise. + /// + /// @param lacunarity The lacunarity of the ridged-multifractal noise. + /// + /// The lacunarity is the frequency multiplier between successive + /// octaves. + /// + /// For best results, set the lacunarity to a number between 1.5 and + /// 3.5. + public void setLacunarity (double lacunarity) + { + this.lacunarity = lacunarity; + calcSpectralWeights (); + } + + /// Sets the quality of the ridged-multifractal noise. + /// + /// @param noiseQuality The quality of the ridged-multifractal noise. + /// + /// See NoiseQuality for definitions of the various + /// coherent-noise qualities. + public void setNoiseQuality (NoiseQuality noiseQuality) + { + this.noiseQuality = noiseQuality; + } + + /// Sets the number of octaves that generate the ridged-multifractal + /// noise. + /// + /// @param octaveCount The number of octaves that generate the + /// ridged-multifractal noise. + /// + /// @pre The number of octaves ranges from 1 to RIDGED_MAX_OCTAVE. + /// + /// @throw ExceptionInvalidParam An invalid parameter was + /// specified; see the preconditions for more information. + /// + /// The number of octaves controls the amount of detail in the + /// ridged-multifractal noise. + /// + /// The larger the number of octaves, the more time required to + /// calculate the ridged-multifractal-noise value. + public void setOctaveCount (int octaveCount) throws ExceptionInvalidParam + { + if (octaveCount > RIDGED_MAX_OCTAVE) + { + throw new ExceptionInvalidParam ("An invalid parameter was passed" + + " to a libnoise function or method."); + } + + this.octaveCount = octaveCount; + } + + /// Sets the seed value used by the ridged-multifractal-noise + /// function. + /// + /// @param seed The seed value. + public void setSeed (int seed) + { + this.seed = seed; + } + + public double[] getSpectralWeights() + { + return spectralWeights; + } + + public void setSpectralWeights(double[] spectralWeights) + { + this.spectralWeights = spectralWeights; + } + +} diff --git a/src/libnoiseforjava/module/RotatePoint.java b/src/libnoiseforjava/module/RotatePoint.java index ead6c06..a1a57b5 100644 --- a/src/libnoiseforjava/module/RotatePoint.java +++ b/src/libnoiseforjava/module/RotatePoint.java @@ -1,216 +1,216 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class RotatePoint extends ModuleBase -{ - /// Noise module that rotates the input value around the origin before - /// returning the output value from a source module. - /// - /// The getValue() method rotates the coordinates of the input value - /// around the origin before returning the output value from the source - /// module. To set the rotation angles, call the setAngles() method. To - /// set the rotation angle around the individual @a x, @a y, or @a z axes, - /// call the setXAngle(), setYAngle() or setZAngle() methods, - /// respectively. - /// - /// The coordinate system of the input value is assumed to be - /// "left-handed" (@a x increases to the right, @a y increases upward, - /// and @a z increases inward.) - /// - /// This noise module requires one source module. - - /// Default @a x rotation angle for the RotatePoint noise - /// module. - static final double DEFAULT_ROTATE_X = 0.0; - - /// Default @a y rotation angle for the RotatePoint noise - /// module. - static final double DEFAULT_ROTATE_Y = 0.0; - - /// Default @a z rotation angle for the RotatePoint noise - /// module. - static final double DEFAULT_ROTATE_Z = 0.0; - - - /// An entry within the 3x3 rotation matrix used for rotating the - /// input value. - double x1Matrix; - - /// An entry within the 3x3 rotation matrix used for rotating the - /// input value. - double x2Matrix; - - /// An entry within the 3x3 rotation matrix used for rotating the - /// input value. - double x3Matrix; - - /// @a x rotation angle applied to the input value, in degrees. - double xAngle; - - /// An entry within the 3x3 rotation matrix used for rotating the - /// input value. - double y1Matrix; - - /// An entry within the 3x3 rotation matrix used for rotating the - /// input value. - double y2Matrix; - - /// An entry within the 3x3 rotation matrix used for rotating the - /// input value. - double y3Matrix; - - /// @a y rotation angle applied to the input value, in degrees. - double yAngle; - - /// An entry within the 3x3 rotation matrix used for rotating the - /// input value. - double z1Matrix; - - /// An entry within the 3x3 rotation matrix used for rotating the - /// input value. - double z2Matrix; - - /// An entry within the 3x3 rotation matrix used for rotating the - /// input value. - double z3Matrix; - - /// @a z rotation angle applied to the input value, in degrees. - double zAngle; - - - public RotatePoint (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - setAngles (DEFAULT_ROTATE_X, DEFAULT_ROTATE_Y, DEFAULT_ROTATE_Z); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - - double nx = (x1Matrix * x) + (y1Matrix * y) + (z1Matrix * z); - double ny = (x2Matrix * x) + (y2Matrix * y) + (z2Matrix * z); - double nz = (x3Matrix * x) + (y3Matrix * y) + (z3Matrix * z); - return sourceModules[0].getValue (nx, ny, nz); - } - - public void setAngles (double xAngle, double yAngle, - double zAngle) - { - double xCos, yCos, zCos, xSin, ySin, zSin; - xCos = Math.cos (Math.toRadians(xAngle)); - yCos = Math.cos (Math.toRadians(yAngle)); - zCos = Math.cos (Math.toRadians(zAngle)); - xSin = Math.sin (Math.toRadians(xAngle)); - ySin = Math.sin (Math.toRadians(yAngle)); - zSin = Math.sin (Math.toRadians(zAngle)); - - x1Matrix = ySin * xSin * zSin + yCos * zCos; - y1Matrix = xCos * zSin; - z1Matrix = ySin * zCos - yCos * xSin * zSin; - x2Matrix = ySin * xSin * zCos - yCos * zSin; - y2Matrix = xCos * zCos; - z2Matrix = -yCos * xSin * zCos - ySin * zSin; - x3Matrix = -ySin * xCos; - y3Matrix = xSin; - z3Matrix = yCos * xCos; - - this.xAngle = xAngle; - this.yAngle = yAngle; - this.zAngle = zAngle; - } - - /// Returns the rotation angle around the @a x axis to apply to the - /// input value. - /// - /// @returns The rotation angle around the @a x axis, in degrees. - public double getXAngle () - { - return xAngle; - } - - /// Returns the rotation angle around the @a y axis to apply to the - /// input value. - /// - /// @returns The rotation angle around the @a y axis, in degrees. - public double getYAngle () - { - return yAngle; - } - - /// Returns the rotation angle around the @a z axis to apply to the - /// input value. - /// - /// @returns The rotation angle around the @a z axis, in degrees. - public double getZAngle () - { - return zAngle; - } - - /// Sets the rotation angle around the @a x axis to apply to the input - /// value. - /// - /// @param xAngle The rotation angle around the @a x axis, in degrees. - /// - /// The getValue() method rotates the coordinates of the input value - /// around the origin before returning the output value from the - /// source module. - public void setXAngle (double xAngle) - { - setAngles (xAngle, this.yAngle, this.zAngle); - } - - /// Sets the rotation angle around the @a y axis to apply to the input - /// value. - /// - /// @param yAngle The rotation angle around the @a y axis, in degrees. - /// - /// The getValue() method rotates the coordinates of the input value - /// around the origin before returning the output value from the - /// source module. - public void SetYAngle (double yAngle) - { - setAngles (this.xAngle, yAngle, this.zAngle); - } - - /// Sets the rotation angle around the @a z axis to apply to the input - /// value. - /// - /// @param zAngle The rotation angle around the @a z axis, in degrees. - /// - /// The getValue() method rotates the coordinates of the input value - /// around the origin before returning the output value from the - /// source module. - public void SetZAngle (double zAngle) - { - setAngles (this.xAngle, this.yAngle, zAngle); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class RotatePoint extends ModuleBase +{ + /// Noise module that rotates the input value around the origin before + /// returning the output value from a source module. + /// + /// The getValue() method rotates the coordinates of the input value + /// around the origin before returning the output value from the source + /// module. To set the rotation angles, call the setAngles() method. To + /// set the rotation angle around the individual @a x, @a y, or @a z axes, + /// call the setXAngle(), setYAngle() or setZAngle() methods, + /// respectively. + /// + /// The coordinate system of the input value is assumed to be + /// "left-handed" (@a x increases to the right, @a y increases upward, + /// and @a z increases inward.) + /// + /// This noise module requires one source module. + + /// Default @a x rotation angle for the RotatePoint noise + /// module. + static final double DEFAULT_ROTATE_X = 0.0; + + /// Default @a y rotation angle for the RotatePoint noise + /// module. + static final double DEFAULT_ROTATE_Y = 0.0; + + /// Default @a z rotation angle for the RotatePoint noise + /// module. + static final double DEFAULT_ROTATE_Z = 0.0; + + + /// An entry within the 3x3 rotation matrix used for rotating the + /// input value. + double x1Matrix; + + /// An entry within the 3x3 rotation matrix used for rotating the + /// input value. + double x2Matrix; + + /// An entry within the 3x3 rotation matrix used for rotating the + /// input value. + double x3Matrix; + + /// @a x rotation angle applied to the input value, in degrees. + double xAngle; + + /// An entry within the 3x3 rotation matrix used for rotating the + /// input value. + double y1Matrix; + + /// An entry within the 3x3 rotation matrix used for rotating the + /// input value. + double y2Matrix; + + /// An entry within the 3x3 rotation matrix used for rotating the + /// input value. + double y3Matrix; + + /// @a y rotation angle applied to the input value, in degrees. + double yAngle; + + /// An entry within the 3x3 rotation matrix used for rotating the + /// input value. + double z1Matrix; + + /// An entry within the 3x3 rotation matrix used for rotating the + /// input value. + double z2Matrix; + + /// An entry within the 3x3 rotation matrix used for rotating the + /// input value. + double z3Matrix; + + /// @a z rotation angle applied to the input value, in degrees. + double zAngle; + + + public RotatePoint (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + setAngles (DEFAULT_ROTATE_X, DEFAULT_ROTATE_Y, DEFAULT_ROTATE_Z); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + + double nx = (x1Matrix * x) + (y1Matrix * y) + (z1Matrix * z); + double ny = (x2Matrix * x) + (y2Matrix * y) + (z2Matrix * z); + double nz = (x3Matrix * x) + (y3Matrix * y) + (z3Matrix * z); + return sourceModules[0].getValue (nx, ny, nz); + } + + public void setAngles (double xAngle, double yAngle, + double zAngle) + { + double xCos, yCos, zCos, xSin, ySin, zSin; + xCos = Math.cos (Math.toRadians(xAngle)); + yCos = Math.cos (Math.toRadians(yAngle)); + zCos = Math.cos (Math.toRadians(zAngle)); + xSin = Math.sin (Math.toRadians(xAngle)); + ySin = Math.sin (Math.toRadians(yAngle)); + zSin = Math.sin (Math.toRadians(zAngle)); + + x1Matrix = ySin * xSin * zSin + yCos * zCos; + y1Matrix = xCos * zSin; + z1Matrix = ySin * zCos - yCos * xSin * zSin; + x2Matrix = ySin * xSin * zCos - yCos * zSin; + y2Matrix = xCos * zCos; + z2Matrix = -yCos * xSin * zCos - ySin * zSin; + x3Matrix = -ySin * xCos; + y3Matrix = xSin; + z3Matrix = yCos * xCos; + + this.xAngle = xAngle; + this.yAngle = yAngle; + this.zAngle = zAngle; + } + + /// Returns the rotation angle around the @a x axis to apply to the + /// input value. + /// + /// @returns The rotation angle around the @a x axis, in degrees. + public double getXAngle () + { + return xAngle; + } + + /// Returns the rotation angle around the @a y axis to apply to the + /// input value. + /// + /// @returns The rotation angle around the @a y axis, in degrees. + public double getYAngle () + { + return yAngle; + } + + /// Returns the rotation angle around the @a z axis to apply to the + /// input value. + /// + /// @returns The rotation angle around the @a z axis, in degrees. + public double getZAngle () + { + return zAngle; + } + + /// Sets the rotation angle around the @a x axis to apply to the input + /// value. + /// + /// @param xAngle The rotation angle around the @a x axis, in degrees. + /// + /// The getValue() method rotates the coordinates of the input value + /// around the origin before returning the output value from the + /// source module. + public void setXAngle (double xAngle) + { + setAngles (xAngle, this.yAngle, this.zAngle); + } + + /// Sets the rotation angle around the @a y axis to apply to the input + /// value. + /// + /// @param yAngle The rotation angle around the @a y axis, in degrees. + /// + /// The getValue() method rotates the coordinates of the input value + /// around the origin before returning the output value from the + /// source module. + public void SetYAngle (double yAngle) + { + setAngles (this.xAngle, yAngle, this.zAngle); + } + + /// Sets the rotation angle around the @a z axis to apply to the input + /// value. + /// + /// @param zAngle The rotation angle around the @a z axis, in degrees. + /// + /// The getValue() method rotates the coordinates of the input value + /// around the origin before returning the output value from the + /// source module. + public void SetZAngle (double zAngle) + { + setAngles (this.xAngle, this.yAngle, zAngle); + } + +} diff --git a/src/libnoiseforjava/module/ScaleBias.java b/src/libnoiseforjava/module/ScaleBias.java index cde1750..66daea4 100644 --- a/src/libnoiseforjava/module/ScaleBias.java +++ b/src/libnoiseforjava/module/ScaleBias.java @@ -1,124 +1,124 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class ScaleBias extends ModuleBase -{ - - /// Noise module that applies a scaling factor and a bias to the output - /// value from a source module. - /// - /// The getValue() method retrieves the output value from the source - /// module, multiplies it with a scaling factor, adds a bias to it, then - /// outputs the value. - /// - /// This noise module requires one source module. - - /// Default bias for the ScaleBias noise module. - static final double DEFAULT_BIAS = 0.0; - - /// Default scale for the ScaleBias noise module. - static final double DEFAULT_SCALE = 1.0; - - /// Bias to apply to the scaled output value from the source module. - double bias; - - /// Scaling factor to apply to the output value from the source - /// module. - double scale; - - - public ScaleBias (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - bias = DEFAULT_BIAS; - scale = DEFAULT_SCALE; - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - - return sourceModules[0].getValue (x, y, z) * scale + bias; - } - - /// Returns the bias to apply to the scaled output value from the - /// source module. - /// - /// @returns The bias to apply. - /// - /// The getValue() method retrieves the output value from the source - /// module, multiplies it with the scaling factor, adds the bias to - /// it, then outputs the value. - public double getBias () - { - return bias; - } - - /// Returns the scaling factor to apply to the output value from the - /// source module. - /// - /// @returns The scaling factor to apply. - /// - /// The getValue() method retrieves the output value from the source - /// module, multiplies it with the scaling factor, adds the bias to - /// it, then outputs the value. - public double getScale () - { - return scale; - } - - - /// Sets the bias to apply to the scaled output value from the source - /// module. - /// - /// @param bias The bias to apply. - /// - /// The getValue() method retrieves the output value from the source - /// module, multiplies it with the scaling factor, adds the bias to - /// it, then outputs the value. - public void setBias (double bias) - { - this.bias = bias; - } - - /// Sets the scaling factor to apply to the output value from the - /// source module. - /// - /// @param scale The scaling factor to apply. - /// - /// The getValue() method retrieves the output value from the source - /// module, multiplies it with the scaling factor, adds the bias to - /// it, then outputs the value. - public void setScale (double scale) - { - this.scale = scale; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class ScaleBias extends ModuleBase +{ + + /// Noise module that applies a scaling factor and a bias to the output + /// value from a source module. + /// + /// The getValue() method retrieves the output value from the source + /// module, multiplies it with a scaling factor, adds a bias to it, then + /// outputs the value. + /// + /// This noise module requires one source module. + + /// Default bias for the ScaleBias noise module. + static final double DEFAULT_BIAS = 0.0; + + /// Default scale for the ScaleBias noise module. + static final double DEFAULT_SCALE = 1.0; + + /// Bias to apply to the scaled output value from the source module. + double bias; + + /// Scaling factor to apply to the output value from the source + /// module. + double scale; + + + public ScaleBias (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + bias = DEFAULT_BIAS; + scale = DEFAULT_SCALE; + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + + return sourceModules[0].getValue (x, y, z) * scale + bias; + } + + /// Returns the bias to apply to the scaled output value from the + /// source module. + /// + /// @returns The bias to apply. + /// + /// The getValue() method retrieves the output value from the source + /// module, multiplies it with the scaling factor, adds the bias to + /// it, then outputs the value. + public double getBias () + { + return bias; + } + + /// Returns the scaling factor to apply to the output value from the + /// source module. + /// + /// @returns The scaling factor to apply. + /// + /// The getValue() method retrieves the output value from the source + /// module, multiplies it with the scaling factor, adds the bias to + /// it, then outputs the value. + public double getScale () + { + return scale; + } + + + /// Sets the bias to apply to the scaled output value from the source + /// module. + /// + /// @param bias The bias to apply. + /// + /// The getValue() method retrieves the output value from the source + /// module, multiplies it with the scaling factor, adds the bias to + /// it, then outputs the value. + public void setBias (double bias) + { + this.bias = bias; + } + + /// Sets the scaling factor to apply to the output value from the + /// source module. + /// + /// @param scale The scaling factor to apply. + /// + /// The getValue() method retrieves the output value from the source + /// module, multiplies it with the scaling factor, adds the bias to + /// it, then outputs the value. + public void setScale (double scale) + { + this.scale = scale; + } + +} diff --git a/src/libnoiseforjava/module/ScalePoint.java b/src/libnoiseforjava/module/ScalePoint.java index 37fa00f..f0c10ce 100644 --- a/src/libnoiseforjava/module/ScalePoint.java +++ b/src/libnoiseforjava/module/ScalePoint.java @@ -1,182 +1,182 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class ScalePoint extends ModuleBase -{ - - /// Noise module that scales the coordinates of the input value before - /// returning the output value from a source module. - /// - /// The getValue() method multiplies the ( @a x, @a y, @a z ) coordinates - /// of the input value with a scaling factor before returning the output - /// value from the source module. To set the scaling factor, call the - /// setScale() method. To set the scaling factor to apply to the - /// individual @a x, @a y, or @a z coordinates, call the setXScale(), - /// setYScale() or setZScale() methods, respectively. - /// - /// This noise module requires one source module. - - // Default scaling factor applied to the @a x coordinate for the - /// ScalePoint noise module. - static final double DEFAULT_SCALE_POINT_X = 1.0; - - /// Default scaling factor applied to the @a y coordinate for the - /// ScalePoint noise module. - static final double DEFAULT_SCALE_POINT_Y = 1.0; - - /// Default scaling factor applied to the @a z coordinate for the - /// ScalePoint noise module. - static final double DEFAULT_SCALE_POINT_Z = 1.0; - - /// Scaling factor applied to the @a x coordinate of the input value. - double xScale; - - /// Scaling factor applied to the @a y coordinate of the input value. - double yScale; - - /// Scaling factor applied to the @a z coordinate of the input value. - double zScale; - - - public ScalePoint (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - - xScale = DEFAULT_SCALE_POINT_X; - yScale = DEFAULT_SCALE_POINT_Y; - zScale = DEFAULT_SCALE_POINT_Z; - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - - return sourceModules[0].getValue (x * xScale, y * yScale, - z * zScale); - } - - /// Returns the scaling factor applied to the @a x coordinate of the - /// input value. - /// - /// @returns The scaling factor applied to the @a x coordinate. - public double getXScale () - { - return xScale; - } - - /// Returns the scaling factor applied to the @a y coordinate of the - /// input value. - /// - /// @returns The scaling factor applied to the @a y coordinate. - public double getYScale () - { - return yScale; - } - - /// Returns the scaling factor applied to the @a z coordinate of the - /// input value. - /// - /// @returns The scaling factor applied to the @a z coordinate. - public double getZScale () - { - return zScale; - } - - /// Sets the scaling factor to apply to the input value. - /// - /// @param scale The scaling factor to apply. - /// - /// The getValue() method multiplies the ( @a x, @a y, @a z ) - /// coordinates of the input value with a scaling factor before - /// returning the output value from the source module. - public void setScale (double scale) - { - this.xScale = scale; - this.yScale = scale; - this.zScale = scale; - } - - /// Sets the scaling factor to apply to the ( @a x, @a y, @a z ) - /// coordinates of the input value. - /// - /// @param xScale The scaling factor to apply to the @a x coordinate. - /// @param yScale The scaling factor to apply to the @a y coordinate. - /// @param zScale The scaling factor to apply to the @a z coordinate. - /// - /// The getValue() method multiplies the ( @a x, @a y, @a z ) - /// coordinates of the input value with a scaling factor before - /// returning the output value from the source module. - public void setScale (double xScale, double yScale, double zScale) - { - this.xScale = xScale; - this.yScale = yScale; - this.zScale = zScale; - } - - /// Sets the scaling factor to apply to the @a x coordinate of the - /// input value. - /// - /// @param xScale The scaling factor to apply to the @a x coordinate. - /// - /// The getValue() method multiplies the ( @a x, @a y, @a z ) - /// coordinates of the input value with a scaling factor before - /// returning the output value from the source module. - public void setXScale (double xScale) - { - this.xScale = xScale; - } - - /// Sets the scaling factor to apply to the @a y coordinate of the - /// input value. - /// - /// @param yScale The scaling factor to apply to the @a y coordinate. - /// - /// The getValue() method multiplies the ( @a x, @a y, @a z ) - /// coordinates of the input value with a scaling factor before - /// returning the output value from the source module. - public void setYScale (double yScale) - { - this.yScale = yScale; - } - - /// Sets the scaling factor to apply to the @a z coordinate of the - /// input value. - /// - /// @param zScale The scaling factor to apply to the @a z coordinate. - /// - /// The getValue() method multiplies the ( @a x, @a y, @a z ) - /// coordinates of the input value with a scaling factor before - /// returning the output value from the source module. - public void setZScale (double zScale) - { - this.zScale = zScale; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class ScalePoint extends ModuleBase +{ + + /// Noise module that scales the coordinates of the input value before + /// returning the output value from a source module. + /// + /// The getValue() method multiplies the ( @a x, @a y, @a z ) coordinates + /// of the input value with a scaling factor before returning the output + /// value from the source module. To set the scaling factor, call the + /// setScale() method. To set the scaling factor to apply to the + /// individual @a x, @a y, or @a z coordinates, call the setXScale(), + /// setYScale() or setZScale() methods, respectively. + /// + /// This noise module requires one source module. + + // Default scaling factor applied to the @a x coordinate for the + /// ScalePoint noise module. + static final double DEFAULT_SCALE_POINT_X = 1.0; + + /// Default scaling factor applied to the @a y coordinate for the + /// ScalePoint noise module. + static final double DEFAULT_SCALE_POINT_Y = 1.0; + + /// Default scaling factor applied to the @a z coordinate for the + /// ScalePoint noise module. + static final double DEFAULT_SCALE_POINT_Z = 1.0; + + /// Scaling factor applied to the @a x coordinate of the input value. + double xScale; + + /// Scaling factor applied to the @a y coordinate of the input value. + double yScale; + + /// Scaling factor applied to the @a z coordinate of the input value. + double zScale; + + + public ScalePoint (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + + xScale = DEFAULT_SCALE_POINT_X; + yScale = DEFAULT_SCALE_POINT_Y; + zScale = DEFAULT_SCALE_POINT_Z; + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + + return sourceModules[0].getValue (x * xScale, y * yScale, + z * zScale); + } + + /// Returns the scaling factor applied to the @a x coordinate of the + /// input value. + /// + /// @returns The scaling factor applied to the @a x coordinate. + public double getXScale () + { + return xScale; + } + + /// Returns the scaling factor applied to the @a y coordinate of the + /// input value. + /// + /// @returns The scaling factor applied to the @a y coordinate. + public double getYScale () + { + return yScale; + } + + /// Returns the scaling factor applied to the @a z coordinate of the + /// input value. + /// + /// @returns The scaling factor applied to the @a z coordinate. + public double getZScale () + { + return zScale; + } + + /// Sets the scaling factor to apply to the input value. + /// + /// @param scale The scaling factor to apply. + /// + /// The getValue() method multiplies the ( @a x, @a y, @a z ) + /// coordinates of the input value with a scaling factor before + /// returning the output value from the source module. + public void setScale (double scale) + { + this.xScale = scale; + this.yScale = scale; + this.zScale = scale; + } + + /// Sets the scaling factor to apply to the ( @a x, @a y, @a z ) + /// coordinates of the input value. + /// + /// @param xScale The scaling factor to apply to the @a x coordinate. + /// @param yScale The scaling factor to apply to the @a y coordinate. + /// @param zScale The scaling factor to apply to the @a z coordinate. + /// + /// The getValue() method multiplies the ( @a x, @a y, @a z ) + /// coordinates of the input value with a scaling factor before + /// returning the output value from the source module. + public void setScale (double xScale, double yScale, double zScale) + { + this.xScale = xScale; + this.yScale = yScale; + this.zScale = zScale; + } + + /// Sets the scaling factor to apply to the @a x coordinate of the + /// input value. + /// + /// @param xScale The scaling factor to apply to the @a x coordinate. + /// + /// The getValue() method multiplies the ( @a x, @a y, @a z ) + /// coordinates of the input value with a scaling factor before + /// returning the output value from the source module. + public void setXScale (double xScale) + { + this.xScale = xScale; + } + + /// Sets the scaling factor to apply to the @a y coordinate of the + /// input value. + /// + /// @param yScale The scaling factor to apply to the @a y coordinate. + /// + /// The getValue() method multiplies the ( @a x, @a y, @a z ) + /// coordinates of the input value with a scaling factor before + /// returning the output value from the source module. + public void setYScale (double yScale) + { + this.yScale = yScale; + } + + /// Sets the scaling factor to apply to the @a z coordinate of the + /// input value. + /// + /// @param zScale The scaling factor to apply to the @a z coordinate. + /// + /// The getValue() method multiplies the ( @a x, @a y, @a z ) + /// coordinates of the input value with a scaling factor before + /// returning the output value from the source module. + public void setZScale (double zScale) + { + this.zScale = zScale; + } + +} diff --git a/src/libnoiseforjava/module/Select.java b/src/libnoiseforjava/module/Select.java index 26a54cf..786a043 100644 --- a/src/libnoiseforjava/module/Select.java +++ b/src/libnoiseforjava/module/Select.java @@ -1,300 +1,300 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.Interp; -import libnoiseforjava.exception.ExceptionInvalidParam; -import libnoiseforjava.exception.ExceptionNoModule; - -public class Select extends ModuleBase -{ - /// Noise module that outputs the value selected from one of two source - /// modules chosen by the output value from a control module. - /// - /// Unlike most other noise modules, the index value assigned to a source - /// module determines its role in the selection operation: - /// - Source module 0 (upper left in the diagram) outputs a value. - /// - Source module 1 (lower left in the diagram) outputs a value. - /// - Source module 2 (bottom of the diagram) is known as the control - /// module. The control module determines the value to select. If - /// the output value from the control module is within a range of values - /// known as the selection range, this noise module outputs the - /// value from the source module with an index value of 1. Otherwise, - /// this noise module outputs the value from the source module with an - /// index value of 0. - /// - /// To specify the bounds of the selection range, call the setBounds() - /// method. - /// - /// An application can pass the control module to the setControlModule() - /// method instead of the setSourceModule() method. This may make the - /// application code easier to read. - /// - /// By default, there is an abrupt transition between the output values - /// from the two source modules at the selection-range boundary. To - /// smooth the transition, pass a non-zero value to the setEdgeFalloff() - /// method. Higher values result in a smoother transition. - /// - /// This noise module requires three source modules. - - /// Default edge-falloff value for the Select noise module. - static final double DEFAULT_SELECT_EDGE_FALLOFF = 0.0; - - /// Default lower bound of the selection range for the - /// Select noise module. - static final double DEFAULT_SELECT_LOWER_BOUND = -1.0; - - /// Default upper bound of the selection range for the - /// Select noise module. - static final double DEFAULT_SELECT_UPPER_BOUND = 1.0; - - /// Edge-falloff value. - double edgeFalloff; - - /// Lower bound of the selection range. - double lowerBound; - - /// Upper bound of the selection range. - double upperBound; - - - public Select (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo, - ModuleBase sourceModuleThree) throws ExceptionInvalidParam - { - super(3); - setSourceModule(0, sourceModuleOne); - setSourceModule(1, sourceModuleTwo); - setSourceModule(2, sourceModuleThree); - - edgeFalloff = DEFAULT_SELECT_EDGE_FALLOFF; - lowerBound = DEFAULT_SELECT_LOWER_BOUND; - upperBound = DEFAULT_SELECT_UPPER_BOUND; - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (sourceModules[1] != null); - assert (sourceModules[2] != null); - - double controlValue = sourceModules[2].getValue (x, y, z); - double alpha; - - if (edgeFalloff > 0.0) - { - if (controlValue < (lowerBound - edgeFalloff)) - // The output value from the control module is below the selector - // threshold; return the output value from the first source module. - return sourceModules[0].getValue (x, y, z); - else if (controlValue < (lowerBound + edgeFalloff)) - { - // The output value from the control module is near the lower end of the - // selector threshold and within the smooth curve. Interpolate between - // the output values from the first and second source modules. - double lowerCurve = (lowerBound - edgeFalloff); - double upperCurve = (lowerBound + edgeFalloff); - alpha = Interp.SCurve3 ( - (controlValue - lowerCurve) / (upperCurve - lowerCurve)); - return Interp.linearInterp (sourceModules[0].getValue (x, y, z), - sourceModules[2].getValue (x, y, z), - alpha); - } - else if (controlValue < (upperBound - edgeFalloff)) - // The output value from the control module is within the selector - // threshold; return the output value from the second source module. - return sourceModules[1].getValue (x, y, z); - else if (controlValue < (upperBound + edgeFalloff)) - { - // The output value from the control module is near the upper end of the - // selector threshold and within the smooth curve. Interpolate between - // the output values from the first and second source modules. - double lowerCurve = (upperBound - edgeFalloff); - double upperCurve = (upperBound + edgeFalloff); - alpha = Interp.SCurve3 ( - (controlValue - lowerCurve) / (upperCurve - lowerCurve)); - return Interp.linearInterp (sourceModules[1].getValue (x, y, z), - sourceModules[0].getValue (x, y, z), - alpha); - } - else - // Output value from the control module is above the selector threshold; - // return the output value from the first source module. - return sourceModules[0].getValue (x, y, z); - } - else - { - if (controlValue < lowerBound || controlValue > upperBound) - return sourceModules[0].getValue (x, y, z); - else - return sourceModules[1].getValue (x, y, z); - } - } - - /// Sets the lower and upper bounds of the selection range. - /// - /// @param lowerBound The lower bound. - /// @param upperBound The upper bound. - /// - /// @pre The lower bound must be less than or equal to the upper - /// bound. - public void setBounds (double lowerBound, double upperBound) - { - assert (lowerBound < upperBound); - - this.lowerBound = lowerBound; - this.upperBound = upperBound; - - // Make sure that the edge falloff curves do not overlap. - setEdgeFalloff (edgeFalloff); - } - - /// Sets the falloff value at the edge transition. - /// - /// @param edgeFalloff The falloff value at the edge transition. - /// - /// The falloff value is the width of the edge transition at either - /// edge of the selection range. - /// - /// By default, there is an abrupt transition between the values from - /// the two source modules at the boundaries of the selection range. - /// - /// For example, if the selection range is 0.5 to 0.8, and the edge - /// falloff value is 0.1, then the getValue() method outputs: - /// - the output value from the source module with an index value of 0 - /// if the output value from the control module is less than 0.4 - /// ( = 0.5 - 0.1). - /// - a linear blend between the two output values from the two source - /// modules if the output value from the control module is between - /// 0.4 ( = 0.5 - 0.1) and 0.6 ( = 0.5 + 0.1). - /// - the output value from the source module with an index value of 1 - /// if the output value from the control module is between 0.6 - /// ( = 0.5 + 0.1) and 0.7 ( = 0.8 - 0.1). - /// - a linear blend between the output values from the two source - /// modules if the output value from the control module is between - /// 0.7 ( = 0.8 - 0.1 ) and 0.9 ( = 0.8 + 0.1). - /// - the output value from the source module with an index value of 0 - /// if the output value from the control module is greater than 0.9 - /// ( = 0.8 + 0.1). - public void setEdgeFalloff (double edgeFalloff) - { - // Make sure that the edge falloff curves do not overlap. - double boundSize = upperBound - lowerBound; - edgeFalloff = (edgeFalloff > boundSize / 2)? boundSize / 2: edgeFalloff; - } - - /// Returns the control module. - /// - /// @returns A reference to the control module. - /// - /// @pre A control module has been added to this noise module via a - /// call to setSourceModule() or setControlModule(). - /// - /// @throw ExceptionNoModule See the preconditions for more - /// information. - /// - /// The control module determines the output value to select. If the - /// output value from the control module is within a range of values - /// known as the selection range, the getValue() method outputs - /// the value from the source module with an index value of 1. - /// Otherwise, this method outputs the value from the source module - /// with an index value of 0. - - // not sure this does what it says it does. Recheck original source - public ModuleBase getControlModule () throws ExceptionNoModule - { - if (sourceModules == null || sourceModules[2] == null) { - throw new ExceptionNoModule ("Could not retrieve a source module from a noise module."); - } - return (sourceModules[2]); - } - - /// Returns the falloff value at the edge transition. - /// - /// @returns The falloff value at the edge transition. - /// - /// The falloff value is the width of the edge transition at either - /// edge of the selection range. - /// - /// By default, there is an abrupt transition between the output - /// values from the two source modules at the selection-range - /// boundary. - public double getEdgeFalloff () - { - return edgeFalloff; - } - - /// Returns the lower bound of the selection range. - /// - /// @returns The lower bound of the selection range. - /// - /// If the output value from the control module is within the - /// selection range, the getValue() method outputs the value from the - /// source module with an index value of 1. Otherwise, this method - /// outputs the value from the source module with an index value of 0. - public double getLowerBound () - { - return lowerBound; - } - - /// Returns the upper bound of the selection range. - /// - /// @returns The upper bound of the selection range. - /// - /// If the output value from the control module is within the - /// selection range, the getValue() method outputs the value from the - /// source module with an index value of 1. Otherwise, this method - /// outputs the value from the source module with an index value of 0. - public double getUpperBound () - { - return upperBound; - } - - /// Sets the control module. - /// - /// @param controlModule The control module. - /// - /// The control module determines the output value to select. If the - /// output value from the control module is within a range of values - /// known as the selection range, the getValue() method outputs - /// the value from the source module with an index value of 1. - /// Otherwise, this method outputs the value from the source module - /// with an index value of 0. - /// - /// This method assigns the control module an index value of 2. - /// Passing the control module to this method produces the same - /// results as passing the control module to the setSourceModule() - /// method while assigning that noise module an index value of 2. - /// - /// This control module must exist throughout the lifetime of this - /// noise module unless another control module replaces that control - /// module. - public void setControlModule (ModuleBase controlModule) - { - assert (sourceModules != null); - sourceModules[2] = controlModule; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.Interp; +import libnoiseforjava.exception.ExceptionInvalidParam; +import libnoiseforjava.exception.ExceptionNoModule; + +public class Select extends ModuleBase +{ + /// Noise module that outputs the value selected from one of two source + /// modules chosen by the output value from a control module. + /// + /// Unlike most other noise modules, the index value assigned to a source + /// module determines its role in the selection operation: + /// - Source module 0 (upper left in the diagram) outputs a value. + /// - Source module 1 (lower left in the diagram) outputs a value. + /// - Source module 2 (bottom of the diagram) is known as the control + /// module. The control module determines the value to select. If + /// the output value from the control module is within a range of values + /// known as the selection range, this noise module outputs the + /// value from the source module with an index value of 1. Otherwise, + /// this noise module outputs the value from the source module with an + /// index value of 0. + /// + /// To specify the bounds of the selection range, call the setBounds() + /// method. + /// + /// An application can pass the control module to the setControlModule() + /// method instead of the setSourceModule() method. This may make the + /// application code easier to read. + /// + /// By default, there is an abrupt transition between the output values + /// from the two source modules at the selection-range boundary. To + /// smooth the transition, pass a non-zero value to the setEdgeFalloff() + /// method. Higher values result in a smoother transition. + /// + /// This noise module requires three source modules. + + /// Default edge-falloff value for the Select noise module. + static final double DEFAULT_SELECT_EDGE_FALLOFF = 0.0; + + /// Default lower bound of the selection range for the + /// Select noise module. + static final double DEFAULT_SELECT_LOWER_BOUND = -1.0; + + /// Default upper bound of the selection range for the + /// Select noise module. + static final double DEFAULT_SELECT_UPPER_BOUND = 1.0; + + /// Edge-falloff value. + double edgeFalloff; + + /// Lower bound of the selection range. + double lowerBound; + + /// Upper bound of the selection range. + double upperBound; + + + public Select (ModuleBase sourceModuleOne, ModuleBase sourceModuleTwo, + ModuleBase sourceModuleThree) throws ExceptionInvalidParam + { + super(3); + setSourceModule(0, sourceModuleOne); + setSourceModule(1, sourceModuleTwo); + setSourceModule(2, sourceModuleThree); + + edgeFalloff = DEFAULT_SELECT_EDGE_FALLOFF; + lowerBound = DEFAULT_SELECT_LOWER_BOUND; + upperBound = DEFAULT_SELECT_UPPER_BOUND; + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (sourceModules[1] != null); + assert (sourceModules[2] != null); + + double controlValue = sourceModules[2].getValue (x, y, z); + double alpha; + + if (edgeFalloff > 0.0) + { + if (controlValue < (lowerBound - edgeFalloff)) + // The output value from the control module is below the selector + // threshold; return the output value from the first source module. + return sourceModules[0].getValue (x, y, z); + else if (controlValue < (lowerBound + edgeFalloff)) + { + // The output value from the control module is near the lower end of the + // selector threshold and within the smooth curve. Interpolate between + // the output values from the first and second source modules. + double lowerCurve = (lowerBound - edgeFalloff); + double upperCurve = (lowerBound + edgeFalloff); + alpha = Interp.SCurve3 ( + (controlValue - lowerCurve) / (upperCurve - lowerCurve)); + return Interp.linearInterp (sourceModules[0].getValue (x, y, z), + sourceModules[1].getValue (x, y, z), + alpha); + } + else if (controlValue < (upperBound - edgeFalloff)) + // The output value from the control module is within the selector + // threshold; return the output value from the second source module. + return sourceModules[1].getValue (x, y, z); + else if (controlValue < (upperBound + edgeFalloff)) + { + // The output value from the control module is near the upper end of the + // selector threshold and within the smooth curve. Interpolate between + // the output values from the first and second source modules. + double lowerCurve = (upperBound - edgeFalloff); + double upperCurve = (upperBound + edgeFalloff); + alpha = Interp.SCurve3 ( + (controlValue - lowerCurve) / (upperCurve - lowerCurve)); + return Interp.linearInterp (sourceModules[1].getValue (x, y, z), + sourceModules[0].getValue (x, y, z), + alpha); + } + else + // Output value from the control module is above the selector threshold; + // return the output value from the first source module. + return sourceModules[0].getValue (x, y, z); + } + else + { + if (controlValue < lowerBound || controlValue > upperBound) + return sourceModules[0].getValue (x, y, z); + else + return sourceModules[1].getValue (x, y, z); + } + } + + /// Sets the lower and upper bounds of the selection range. + /// + /// @param lowerBound The lower bound. + /// @param upperBound The upper bound. + /// + /// @pre The lower bound must be less than or equal to the upper + /// bound. + public void setBounds (double lowerBound, double upperBound) + { + assert (lowerBound < upperBound); + + this.lowerBound = lowerBound; + this.upperBound = upperBound; + + // Make sure that the edge falloff curves do not overlap. + setEdgeFalloff (edgeFalloff); + } + + /// Sets the falloff value at the edge transition. + /// + /// @param edgeFalloff The falloff value at the edge transition. + /// + /// The falloff value is the width of the edge transition at either + /// edge of the selection range. + /// + /// By default, there is an abrupt transition between the values from + /// the two source modules at the boundaries of the selection range. + /// + /// For example, if the selection range is 0.5 to 0.8, and the edge + /// falloff value is 0.1, then the getValue() method outputs: + /// - the output value from the source module with an index value of 0 + /// if the output value from the control module is less than 0.4 + /// ( = 0.5 - 0.1). + /// - a linear blend between the two output values from the two source + /// modules if the output value from the control module is between + /// 0.4 ( = 0.5 - 0.1) and 0.6 ( = 0.5 + 0.1). + /// - the output value from the source module with an index value of 1 + /// if the output value from the control module is between 0.6 + /// ( = 0.5 + 0.1) and 0.7 ( = 0.8 - 0.1). + /// - a linear blend between the output values from the two source + /// modules if the output value from the control module is between + /// 0.7 ( = 0.8 - 0.1 ) and 0.9 ( = 0.8 + 0.1). + /// - the output value from the source module with an index value of 0 + /// if the output value from the control module is greater than 0.9 + /// ( = 0.8 + 0.1). + public void setEdgeFalloff (double edgeFalloff) + { + // Make sure that the edge falloff curves do not overlap. + double boundSize = upperBound - lowerBound; + this.edgeFalloff = (edgeFalloff > boundSize / 2)? boundSize / 2: edgeFalloff; + } + + /// Returns the control module. + /// + /// @returns A reference to the control module. + /// + /// @pre A control module has been added to this noise module via a + /// call to setSourceModule() or setControlModule(). + /// + /// @throw ExceptionNoModule See the preconditions for more + /// information. + /// + /// The control module determines the output value to select. If the + /// output value from the control module is within a range of values + /// known as the selection range, the getValue() method outputs + /// the value from the source module with an index value of 1. + /// Otherwise, this method outputs the value from the source module + /// with an index value of 0. + + // not sure this does what it says it does. Recheck original source + public ModuleBase getControlModule () throws ExceptionNoModule + { + if (sourceModules == null || sourceModules[2] == null) { + throw new ExceptionNoModule ("Could not retrieve a source module from a noise module."); + } + return (sourceModules[2]); + } + + /// Returns the falloff value at the edge transition. + /// + /// @returns The falloff value at the edge transition. + /// + /// The falloff value is the width of the edge transition at either + /// edge of the selection range. + /// + /// By default, there is an abrupt transition between the output + /// values from the two source modules at the selection-range + /// boundary. + public double getEdgeFalloff () + { + return edgeFalloff; + } + + /// Returns the lower bound of the selection range. + /// + /// @returns The lower bound of the selection range. + /// + /// If the output value from the control module is within the + /// selection range, the getValue() method outputs the value from the + /// source module with an index value of 1. Otherwise, this method + /// outputs the value from the source module with an index value of 0. + public double getLowerBound () + { + return lowerBound; + } + + /// Returns the upper bound of the selection range. + /// + /// @returns The upper bound of the selection range. + /// + /// If the output value from the control module is within the + /// selection range, the getValue() method outputs the value from the + /// source module with an index value of 1. Otherwise, this method + /// outputs the value from the source module with an index value of 0. + public double getUpperBound () + { + return upperBound; + } + + /// Sets the control module. + /// + /// @param controlModule The control module. + /// + /// The control module determines the output value to select. If the + /// output value from the control module is within a range of values + /// known as the selection range, the getValue() method outputs + /// the value from the source module with an index value of 1. + /// Otherwise, this method outputs the value from the source module + /// with an index value of 0. + /// + /// This method assigns the control module an index value of 2. + /// Passing the control module to this method produces the same + /// results as passing the control module to the setSourceModule() + /// method while assigning that noise module an index value of 2. + /// + /// This control module must exist throughout the lifetime of this + /// noise module unless another control module replaces that control + /// module. + public void setControlModule (ModuleBase controlModule) + { + assert (sourceModules != null); + sourceModules[2] = controlModule; + } + +} diff --git a/src/libnoiseforjava/module/Simplex.java b/src/libnoiseforjava/module/Simplex.java new file mode 100644 index 0000000..82d58c6 --- /dev/null +++ b/src/libnoiseforjava/module/Simplex.java @@ -0,0 +1,395 @@ +package libnoiseforjava.module; + +/** + * Michael Nugent + * Date: 3/9/12 + * Time: 6:12 PM + * URL: https://github.com/michaelnugent/libnoiseforjava + * Package: libnoiseforjava.module + */ + + +/* +* A speed-improved simplex noise algorithm for 2D, 3D and 4D in Java. +* +* Based on example code by Stefan Gustavson (stegu@itn.liu.se). +* Optimisations by Peter Eastman (peastman@drizzle.stanford.edu). +* Better rank ordering method by Stefan Gustavson in 2012. +* +* This could be speeded up even further, but it's useful as it is. +* +* Version 2012-03-09 +* +* This code was placed in the public domain by its original author, +* Stefan Gustavson. You may use it as you see fit, but +* attribution is appreciated. +* +* Modified by Michael Nugent (michael@michaelnugent.org) for the +* libnoise framework 20120309 +* All libnoise expects 3d, but I've left the 2d and 4d functions in for +* reference. +* +*/ + +public class Simplex extends ModuleBase { // Simplex noise in 2D, 3D and 4D + private static Grad grad3[] = {new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0), + new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1), + new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1)}; + + private static Grad grad4[]= {new Grad(0,1,1,1),new Grad(0,1,1,-1),new Grad(0,1,-1,1),new Grad(0,1,-1,-1), + new Grad(0,-1,1,1),new Grad(0,-1,1,-1),new Grad(0,-1,-1,1),new Grad(0,-1,-1,-1), + new Grad(1,0,1,1),new Grad(1,0,1,-1),new Grad(1,0,-1,1),new Grad(1,0,-1,-1), + new Grad(-1,0,1,1),new Grad(-1,0,1,-1),new Grad(-1,0,-1,1),new Grad(-1,0,-1,-1), + new Grad(1,1,0,1),new Grad(1,1,0,-1),new Grad(1,-1,0,1),new Grad(1,-1,0,-1), + new Grad(-1,1,0,1),new Grad(-1,1,0,-1),new Grad(-1,-1,0,1),new Grad(-1,-1,0,-1), + new Grad(1,1,1,0),new Grad(1,1,-1,0),new Grad(1,-1,1,0),new Grad(1,-1,-1,0), + new Grad(-1,1,1,0),new Grad(-1,1,-1,0),new Grad(-1,-1,1,0),new Grad(-1,-1,-1,0)}; + + private static short p[] = {151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, + 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, + 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180}; + // To remove the need for index wrapping, double the permutation table length + private short perm[] = new short[512]; + private short permMod12[] = new short[512]; + + private double seed = 0; + + public Simplex() { + super(0); + for(int i=0; i<512; i++) { + perm[i]=p[i & 255]; + permMod12[i] = (short)(perm[i] % 12); + } + } + + public double getSeed() { + return seed; + } + + public void setSeed(double seed) { + this.seed = seed; + } + + public void setSeed(int seed) { + this.seed = (double)seed; + } + + // Skewing and unskewing factors for 2, 3, and 4 dimensions + private static final double F2 = 0.5*(Math.sqrt(3.0)-1.0); + private static final double G2 = (3.0-Math.sqrt(3.0))/6.0; + private static final double F3 = 1.0/3.0; + private static final double G3 = 1.0/6.0; + private static final double F4 = (Math.sqrt(5.0)-1.0)/4.0; + private static final double G4 = (5.0-Math.sqrt(5.0))/20.0; + + // This method is a *lot* faster than using (int)Math.floor(x) + private static int fastfloor(double x) { + int xi = (int)x; + return xy0) {i1=1; j1=0;} // lower triangle, XY order: (0,0)->(1,0)->(1,1) + else {i1=0; j1=1;} // upper triangle, YX order: (0,0)->(0,1)->(1,1) + // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and + // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where + // c = (3-sqrt(3))/6 + double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords + double y1 = y0 - j1 + G2; + double x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords + double y2 = y0 - 1.0 + 2.0 * G2; + // Work out the hashed gradient indices of the three simplex corners + int ii = i & 255; + int jj = j & 255; + + int gi0 = permMod12[ii+perm[jj]]; + int gi1 = permMod12[ii+i1+perm[jj+j1]]; + int gi2 = permMod12[ii+1+perm[jj+1]]; + // Calculate the contribution from the three corners + double t0 = 0.5 - x0*x0-y0*y0; + if(t0<0) n0 = 0.0; + else { + t0 *= t0; + n0 = t0 * t0 * dot(grad3[gi0], x0, y0); // (x,y) of grad3 used for 2D gradient + } + double t1 = 0.5 - x1*x1-y1*y1; + if(t1<0) n1 = 0.0; + else { + t1 *= t1; + n1 = t1 * t1 * dot(grad3[gi1], x1, y1); + } + double t2 = 0.5 - x2*x2-y2*y2; + if(t2<0) n2 = 0.0; + else { + t2 *= t2; + n2 = t2 * t2 * dot(grad3[gi2], x2, y2); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 70.0 * (n0 + n1 + n2); + } + + + // 3D simplex noise + public double getValue(double xin, double yin, double zin) { + double n0, n1, n2, n3; // Noise contributions from the four corners + // Skew the input space to determine which simplex cell we're in + xin+=(seed + (seed * 7)) % Double.MAX_VALUE; + xin+=(seed + (seed * 13)) % Double.MAX_VALUE; + xin+=(seed + (seed * 17)) % Double.MAX_VALUE; + double s = (xin+yin+zin)*F3; // Very nice and simple skew factor for 3D + int i = fastfloor(xin+s); + int j = fastfloor(yin+s); + int k = fastfloor(zin+s); + double t = (i+j+k)*G3; + double X0 = i-t; // Unskew the cell origin back to (x,y,z) space + double Y0 = j-t; + double Z0 = k-t; + double x0 = xin-X0; // The x,y,z distances from the cell origin + double y0 = yin-Y0; + double z0 = zin-Z0; + // For the 3D case, the simplex shape is a slightly irregular tetrahedron. + // Determine which simplex we are in. + int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords + int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords + if(x0>=y0) { + if(y0>=z0) + { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } // X Y Z order + else if(x0>=z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } // X Z Y order + else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } // Z X Y order + } + else { // x0 y0) rankx++; else ranky++; + if(x0 > z0) rankx++; else rankz++; + if(x0 > w0) rankx++; else rankw++; + if(y0 > z0) ranky++; else rankz++; + if(y0 > w0) ranky++; else rankw++; + if(z0 > w0) rankz++; else rankw++; + int i1, j1, k1, l1; // The integer offsets for the second simplex corner + int i2, j2, k2, l2; // The integer offsets for the third simplex corner + int i3, j3, k3, l3; // The integer offsets for the fourth simplex corner + // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order. + // Many values of c will never occur, since e.g. x>y>z>w makes x= 3 ? 1 : 0; + j1 = ranky >= 3 ? 1 : 0; + k1 = rankz >= 3 ? 1 : 0; + l1 = rankw >= 3 ? 1 : 0; + // Rank 2 denotes the second largest coordinate. + i2 = rankx >= 2 ? 1 : 0; + j2 = ranky >= 2 ? 1 : 0; + k2 = rankz >= 2 ? 1 : 0; + l2 = rankw >= 2 ? 1 : 0; + // Rank 1 denotes the second smallest coordinate. + i3 = rankx >= 1 ? 1 : 0; + j3 = ranky >= 1 ? 1 : 0; + k3 = rankz >= 1 ? 1 : 0; + l3 = rankw >= 1 ? 1 : 0; + // The fifth corner has all coordinate offsets = 1, so no need to compute that. + double x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords + double y1 = y0 - j1 + G4; + double z1 = z0 - k1 + G4; + double w1 = w0 - l1 + G4; + double x2 = x0 - i2 + 2.0*G4; // Offsets for third corner in (x,y,z,w) coords + double y2 = y0 - j2 + 2.0*G4; + double z2 = z0 - k2 + 2.0*G4; + double w2 = w0 - l2 + 2.0*G4; + double x3 = x0 - i3 + 3.0*G4; // Offsets for fourth corner in (x,y,z,w) coords + double y3 = y0 - j3 + 3.0*G4; + double z3 = z0 - k3 + 3.0*G4; + double w3 = w0 - l3 + 3.0*G4; + double x4 = x0 - 1.0 + 4.0*G4; // Offsets for last corner in (x,y,z,w) coords + double y4 = y0 - 1.0 + 4.0*G4; + double z4 = z0 - 1.0 + 4.0*G4; + double w4 = w0 - 1.0 + 4.0*G4; + // Work out the hashed gradient indices of the five simplex corners + int ii = i & 255; + int jj = j & 255; + int kk = k & 255; + int ll = l & 255; + int gi0 = perm[ii+perm[jj+perm[kk+perm[ll]]]] % 32; + int gi1 = perm[ii+i1+perm[jj+j1+perm[kk+k1+perm[ll+l1]]]] % 32; + int gi2 = perm[ii+i2+perm[jj+j2+perm[kk+k2+perm[ll+l2]]]] % 32; + int gi3 = perm[ii+i3+perm[jj+j3+perm[kk+k3+perm[ll+l3]]]] % 32; + int gi4 = perm[ii+1+perm[jj+1+perm[kk+1+perm[ll+1]]]] % 32; + // Calculate the contribution from the five corners + double t0 = 0.6 - x0*x0 - y0*y0 - z0*z0 - w0*w0; + if(t0<0) n0 = 0.0; + else { + t0 *= t0; + n0 = t0 * t0 * dot(grad4[gi0], x0, y0, z0, w0); + } + double t1 = 0.6 - x1*x1 - y1*y1 - z1*z1 - w1*w1; + if(t1<0) n1 = 0.0; + else { + t1 *= t1; + n1 = t1 * t1 * dot(grad4[gi1], x1, y1, z1, w1); + } + double t2 = 0.6 - x2*x2 - y2*y2 - z2*z2 - w2*w2; + if(t2<0) n2 = 0.0; + else { + t2 *= t2; + n2 = t2 * t2 * dot(grad4[gi2], x2, y2, z2, w2); + } + double t3 = 0.6 - x3*x3 - y3*y3 - z3*z3 - w3*w3; + if(t3<0) n3 = 0.0; + else { + t3 *= t3; + n3 = t3 * t3 * dot(grad4[gi3], x3, y3, z3, w3); + } + double t4 = 0.6 - x4*x4 - y4*y4 - z4*z4 - w4*w4; + if(t4<0) n4 = 0.0; + else { + t4 *= t4; + n4 = t4 * t4 * dot(grad4[gi4], x4, y4, z4, w4); + } + // Sum up and scale the result to cover the range [-1,1] + return 27.0 * (n0 + n1 + n2 + n3 + n4); + } + + // Inner class to speed upp gradient computations + // (array access is a lot slower than member access) + private static class Grad + { + double x, y, z, w; + + Grad(double x, double y, double z) + { + this.x = x; + this.y = y; + this.z = z; + } + + Grad(double x, double y, double z, double w) + { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + } +} diff --git a/src/libnoiseforjava/module/Spheres.java b/src/libnoiseforjava/module/Spheres.java index 0ff1fd5..03b580f 100644 --- a/src/libnoiseforjava/module/Spheres.java +++ b/src/libnoiseforjava/module/Spheres.java @@ -1,102 +1,102 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -public class Spheres extends ModuleBase -{ - - /// Noise module that outputs concentric spheres. - /// - /// This noise module outputs concentric spheres centered on the origin - /// like the concentric rings of an onion. - /// - /// The first sphere has a radius of 1.0. Each subsequent sphere has a - /// radius that is 1.0 unit larger than the previous sphere. - /// - /// The output value from this noise module is determined by the distance - /// between the input value and the the nearest spherical surface. The - /// input values that are located on a spherical surface are given the - /// output value 1.0 and the input values that are equidistant from two - /// spherical surfaces are given the output value -1.0. - /// - /// An application can change the frequency of the concentric spheres. - /// Increasing the frequency reduces the distances between spheres. To - /// specify the frequency, call the setFrequency() method. - /// - /// This noise module, modified with some low-frequency, low-power - /// turbulence, is useful for generating agate-like textures. - /// - /// This noise module does not require any source modules. - - /// Default frequency value for the Spheres noise module. - static final double DEFAULT_SPHERES_FREQUENCY = 1.0; - - /// Frequency of the concentric spheres. - double frequency; - - - public Spheres () - { - super(0); - frequency = DEFAULT_SPHERES_FREQUENCY; - } - - public double getValue (double x, double y, double z) - { - x *= frequency; - y *= frequency; - z *= frequency; - - double distFromCenter = Math.sqrt (x * x + y * y + z * z); - double distFromSmallerSphere = distFromCenter - Math.floor (distFromCenter); - double distFromLargerSphere = 1.0 - distFromSmallerSphere; - double nearestDist = Math.min(distFromSmallerSphere, distFromLargerSphere); - return 1.0 - (nearestDist * 4.0); // Puts it in the -1.0 to +1.0 range. - } - - /// Returns the frequency of the concentric spheres. - /// - /// @returns The frequency of the concentric spheres. - /// - /// Increasing the frequency increases the density of the concentric - /// spheres, reducing the distances between them. - public double getFrequency () - { - return frequency; - } - - /// Sets the frequency of the concentric spheres. - /// - /// @param frequency The frequency of the concentric spheres. - /// - /// Increasing the frequency increases the density of the concentric - /// spheres, reducing the distances between them. - public void setFrequency (double frequency) - { - this.frequency = frequency; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +public class Spheres extends ModuleBase +{ + + /// Noise module that outputs concentric spheres. + /// + /// This noise module outputs concentric spheres centered on the origin + /// like the concentric rings of an onion. + /// + /// The first sphere has a radius of 1.0. Each subsequent sphere has a + /// radius that is 1.0 unit larger than the previous sphere. + /// + /// The output value from this noise module is determined by the distance + /// between the input value and the the nearest spherical surface. The + /// input values that are located on a spherical surface are given the + /// output value 1.0 and the input values that are equidistant from two + /// spherical surfaces are given the output value -1.0. + /// + /// An application can change the frequency of the concentric spheres. + /// Increasing the frequency reduces the distances between spheres. To + /// specify the frequency, call the setFrequency() method. + /// + /// This noise module, modified with some low-frequency, low-power + /// turbulence, is useful for generating agate-like textures. + /// + /// This noise module does not require any source modules. + + /// Default frequency value for the Spheres noise module. + static final double DEFAULT_SPHERES_FREQUENCY = 1.0; + + /// Frequency of the concentric spheres. + double frequency; + + + public Spheres () + { + super(0); + frequency = DEFAULT_SPHERES_FREQUENCY; + } + + public double getValue (double x, double y, double z) + { + x *= frequency; + y *= frequency; + z *= frequency; + + double distFromCenter = Math.sqrt (x * x + y * y + z * z); + double distFromSmallerSphere = distFromCenter - Math.floor (distFromCenter); + double distFromLargerSphere = 1.0 - distFromSmallerSphere; + double nearestDist = Math.min(distFromSmallerSphere, distFromLargerSphere); + return 1.0 - (nearestDist * 4.0); // Puts it in the -1.0 to +1.0 range. + } + + /// Returns the frequency of the concentric spheres. + /// + /// @returns The frequency of the concentric spheres. + /// + /// Increasing the frequency increases the density of the concentric + /// spheres, reducing the distances between them. + public double getFrequency () + { + return frequency; + } + + /// Sets the frequency of the concentric spheres. + /// + /// @param frequency The frequency of the concentric spheres. + /// + /// Increasing the frequency increases the density of the concentric + /// spheres, reducing the distances between them. + public void setFrequency (double frequency) + { + this.frequency = frequency; + } + +} diff --git a/src/libnoiseforjava/module/Terrace.java b/src/libnoiseforjava/module/Terrace.java index 0f01019..2c22733 100644 --- a/src/libnoiseforjava/module/Terrace.java +++ b/src/libnoiseforjava/module/Terrace.java @@ -1,326 +1,326 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.Interp; -import libnoiseforjava.Misc; -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Terrace extends ModuleBase -{ - - /// Noise module that maps the output value from a source module onto a - /// terrace-forming curve. - /// - /// This noise module maps the output value from the source module onto a - /// terrace-forming curve. The start of this curve has a slope of zero; - /// its slope then smoothly increases. This curve also contains - /// control points which resets the slope to zero at that point, - /// producing a "terracing" effect. Refer to the following illustration: - /// - /// @image html terrace.png - /// - /// To add a control point to this noise module, call the - /// addControlPoint() method. - /// - /// An application must add a minimum of two control points to the curve. - /// If this is not done, the getValue() method fails. The control points - /// can have any value, although no two control points can have the same - /// value. There is no limit to the number of control points that can be - /// added to the curve. - /// - /// This noise module clamps the output value from the source module if - /// that value is less than the value of the lowest control point or - /// greater than the value of the highest control point. - /// - /// This noise module is often used to generate terrain features such as - /// your stereotypical desert canyon. - /// - /// This noise module requires one source module. - - - /// Number of control points stored in this noise module. - int controlPointCount; - - /// Determines if the terrace-forming curve between all control points - /// is inverted. - boolean invertTerraces; - - /// Array that stores the control points. - double [] controlPoints; - - - public Terrace (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - controlPointCount = 0; - invertTerraces = false; - controlPoints = new double [0]; - - } - - /// Adds a control point to the terrace-forming curve. - /// - /// @param value The value of the control point to add. - /// - /// @pre No two control points have the same value. - /// - /// @throw ExceptionInvalidParam An invalid parameter was - /// specified; see the preconditions for more information. - /// - /// Two or more control points define the terrace-forming curve. The - /// start of this curve has a slope of zero; its slope then smoothly - /// increases. At the control points, its slope resets to zero. - /// - /// It does not matter which order these points are added. - public void addControlPoint (double value) throws ExceptionInvalidParam - { - // Find the insertion point for the new control point and insert the new - // point at that position. The control point array will remain sorted by - // value. - int insertionPos = findInsertionPos (value); - insertAtPos (insertionPos, value); - } - - - /// Deletes all the control points on the terrace-forming curve. - /// - /// @post All control points on the terrace-forming curve are deleted. - public void clearAllControlPoints () - { - controlPoints = null; - controlPointCount = 0; - } - - /// Determines the array index in which to insert the control point - /// into the internal control point array. - /// - /// @param value The value of the control point. - /// - /// @returns The array index in which to insert the control point. - /// - /// @pre No two control points have the same value. - /// - /// @throw ExceptionInvalidParam An invalid parameter was - /// specified; see the preconditions for more information. - /// - /// By inserting the control point at the returned array index, this - /// class ensures that the control point array is sorted by value. - /// The code that maps a value onto the curve requires a sorted - /// control point array. - public int findInsertionPos (double value) throws ExceptionInvalidParam - { - int insertionPos; - for (insertionPos = 0; insertionPos < controlPointCount; insertionPos++) - { - if (value < controlPoints[insertionPos]) - // We found the array index in which to insert the new control point. - // Exit now. - break; - else if (value == controlPoints[insertionPos]) - // Each control point is required to contain a unique value, so throw - // an exception. - throw new ExceptionInvalidParam ("Invalid Parameter in Terrace Noise Moduled"); - } - return insertionPos; - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - assert (controlPointCount >= 2); - - // Get the output value from the source module. - double sourceModuleValue = sourceModules[0].getValue (x, y, z); - - // Find the first element in the control point array that has a value - // larger than the output value from the source module. - int indexPos; - for (indexPos = 0; indexPos < controlPointCount; indexPos++) - { - if (sourceModuleValue < controlPoints[indexPos]) - break; - - } - - // Find the two nearest control points so that we can map their values - // onto a quadratic curve. - int index0 = Misc.ClampValue (indexPos - 1, 0, controlPointCount - 1); - int index1 = Misc.ClampValue (indexPos, 0, controlPointCount - 1); - - // If some control points are missing (which occurs if the output value from - // the source module is greater than the largest value or less than the - // smallest value of the control point array), get the value of the nearest - // control point and exit now. - if (index0 == index1) - return controlPoints[index1]; - - // Compute the alpha value used for linear interpolation. - double value0 = controlPoints[index0]; - double value1 = controlPoints[index1]; - double alpha = (sourceModuleValue - value0) / (value1 - value0); - if (invertTerraces) - { - alpha = 1.0 - alpha; - double tempValue = value0; - value0 = value1; - value1 = tempValue; - } - - // Squaring the alpha produces the terrace effect. - alpha *= alpha; - - // Now perform the linear interpolation given the alpha value. - return Interp.linearInterp (value0, value1, alpha); - } - - /// Inserts the control point at the specified position in the - /// internal control point array. - /// - /// @param insertionPos The zero-based array position in which to - /// insert the control point. - /// @param value The value of the control point. - /// - /// To make room for this new control point, this method reallocates - /// the control point array and shifts all control points occurring - /// after the insertion position up by one. - /// - /// Because the curve mapping algorithm in this noise module requires - /// that all control points in the array be sorted by value, the new - /// control point should be inserted at the position in which the - /// order is still preserved. - public void insertAtPos (int insertionPos, double value) - { - // Make room for the new control point at the specified position within - // the control point array. The position is determined by the value of - // the control point; the control points must be sorted by value within - // that array. - double[] newControlPoints = new double[controlPointCount + 1]; - - for (int i = 0; i < controlPointCount; i++) - { - if (i < insertionPos) - newControlPoints[i] = controlPoints[i]; - else - newControlPoints[i + 1] = controlPoints[i]; - } - - controlPoints = newControlPoints; - ++controlPointCount; - - // Now that we've made room for the new control point within the array, - // add the new control point. - controlPoints[insertionPos] = value; - } - - /// Creates a number of equally-spaced control points that range from - /// -1 to +1. - /// - /// @param controlPointCount The number of control points to generate. - /// - /// @pre The number of control points must be greater than or equal to - /// 2. - /// - /// @post The previous control points on the terrace-forming curve are - /// deleted. - /// - /// @throw ExceptionInvalidParam An invalid parameter was - /// specified; see the preconditions for more information. - /// - /// Two or more control points define the terrace-forming curve. The - /// start of this curve has a slope of zero; its slope then smoothly - /// increases. At the control points, its slope resets to zero. - void makeControlPoints (int controlPointCount) throws ExceptionInvalidParam - { - if (controlPointCount < 2) - throw new ExceptionInvalidParam ("Invalid Parameter in Terrace Noise Module"); - - clearAllControlPoints (); - - double terraceStep = 2.0 / ((double)controlPointCount - 1.0); - double curValue = -1.0; - for (int i = 0; i < (int)controlPointCount; i++) - { - addControlPoint (curValue); - curValue += terraceStep; - } - } - - /// Returns a pointer to the array of control points on the - /// terrace-forming curve. - /// - /// @returns A pointer to the array of control points in this noise - /// module. - /// - /// Two or more control points define the terrace-forming curve. The - /// start of this curve has a slope of zero; its slope then smoothly - /// increases. At the control points, its slope resets to zero. - /// - /// Before calling this method, call getControlPointCount() to - /// determine the number of control points in this array. - /// - /// It is recommended that an application does not store this pointer - /// for later use since the pointer to the array may change if the - /// application calls another method of this object. - public double[] getControlPointArray () - { - return controlPoints; - } - - /// Returns the number of control points on the terrace-forming curve. - /// - /// @returns The number of control points on the terrace-forming - /// curve. - public int getControlPointCount () - { - return controlPointCount; - } - - /// Enables or disables the inversion of the terrace-forming curve - /// between the control points. - /// - /// @param invert Specifies whether to invert the curve between the - /// control points. - public void invertTerraces (boolean invert) - { - if (invert) - invertTerraces = invert; - } - - /// Determines if the terrace-forming curve between the control - /// points is inverted. - /// - /// @returns - /// - @a true if the curve between the control points is inverted. - /// - @a false if the curve between the control points is not - /// inverted. - public boolean isTerracesInverted () - { - return invertTerraces; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.Interp; +import libnoiseforjava.Misc; +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Terrace extends ModuleBase +{ + + /// Noise module that maps the output value from a source module onto a + /// terrace-forming curve. + /// + /// This noise module maps the output value from the source module onto a + /// terrace-forming curve. The start of this curve has a slope of zero; + /// its slope then smoothly increases. This curve also contains + /// control points which resets the slope to zero at that point, + /// producing a "terracing" effect. Refer to the following illustration: + /// + /// @image html terrace.png + /// + /// To add a control point to this noise module, call the + /// addControlPoint() method. + /// + /// An application must add a minimum of two control points to the curve. + /// If this is not done, the getValue() method fails. The control points + /// can have any value, although no two control points can have the same + /// value. There is no limit to the number of control points that can be + /// added to the curve. + /// + /// This noise module clamps the output value from the source module if + /// that value is less than the value of the lowest control point or + /// greater than the value of the highest control point. + /// + /// This noise module is often used to generate terrain features such as + /// your stereotypical desert canyon. + /// + /// This noise module requires one source module. + + + /// Number of control points stored in this noise module. + int controlPointCount; + + /// Determines if the terrace-forming curve between all control points + /// is inverted. + boolean invertTerraces; + + /// Array that stores the control points. + double [] controlPoints; + + + public Terrace (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + controlPointCount = 0; + invertTerraces = false; + controlPoints = new double [0]; + + } + + /// Adds a control point to the terrace-forming curve. + /// + /// @param value The value of the control point to add. + /// + /// @pre No two control points have the same value. + /// + /// @throw ExceptionInvalidParam An invalid parameter was + /// specified; see the preconditions for more information. + /// + /// Two or more control points define the terrace-forming curve. The + /// start of this curve has a slope of zero; its slope then smoothly + /// increases. At the control points, its slope resets to zero. + /// + /// It does not matter which order these points are added. + public void addControlPoint (double value) throws ExceptionInvalidParam + { + // Find the insertion point for the new control point and insert the new + // point at that position. The control point array will remain sorted by + // value. + int insertionPos = findInsertionPos (value); + insertAtPos (insertionPos, value); + } + + + /// Deletes all the control points on the terrace-forming curve. + /// + /// @post All control points on the terrace-forming curve are deleted. + public void clearAllControlPoints () + { + controlPoints = null; + controlPointCount = 0; + } + + /// Determines the array index in which to insert the control point + /// into the internal control point array. + /// + /// @param value The value of the control point. + /// + /// @returns The array index in which to insert the control point. + /// + /// @pre No two control points have the same value. + /// + /// @throw ExceptionInvalidParam An invalid parameter was + /// specified; see the preconditions for more information. + /// + /// By inserting the control point at the returned array index, this + /// class ensures that the control point array is sorted by value. + /// The code that maps a value onto the curve requires a sorted + /// control point array. + public int findInsertionPos (double value) throws ExceptionInvalidParam + { + int insertionPos; + for (insertionPos = 0; insertionPos < controlPointCount; insertionPos++) + { + if (value < controlPoints[insertionPos]) + // We found the array index in which to insert the new control point. + // Exit now. + break; + else if (value == controlPoints[insertionPos]) + // Each control point is required to contain a unique value, so throw + // an exception. + throw new ExceptionInvalidParam ("Invalid Parameter in Terrace Noise Moduled"); + } + return insertionPos; + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + assert (controlPointCount >= 2); + + // Get the output value from the source module. + double sourceModuleValue = sourceModules[0].getValue (x, y, z); + + // Find the first element in the control point array that has a value + // larger than the output value from the source module. + int indexPos; + for (indexPos = 0; indexPos < controlPointCount; indexPos++) + { + if (sourceModuleValue < controlPoints[indexPos]) + break; + + } + + // Find the two nearest control points so that we can map their values + // onto a quadratic curve. + int index0 = Misc.ClampValue (indexPos - 1, 0, controlPointCount - 1); + int index1 = Misc.ClampValue (indexPos, 0, controlPointCount - 1); + + // If some control points are missing (which occurs if the output value from + // the source module is greater than the largest value or less than the + // smallest value of the control point array), get the value of the nearest + // control point and exit now. + if (index0 == index1) + return controlPoints[index1]; + + // Compute the alpha value used for linear interpolation. + double value0 = controlPoints[index0]; + double value1 = controlPoints[index1]; + double alpha = (sourceModuleValue - value0) / (value1 - value0); + if (invertTerraces) + { + alpha = 1.0 - alpha; + double tempValue = value0; + value0 = value1; + value1 = tempValue; + } + + // Squaring the alpha produces the terrace effect. + alpha *= alpha; + + // Now perform the linear interpolation given the alpha value. + return Interp.linearInterp (value0, value1, alpha); + } + + /// Inserts the control point at the specified position in the + /// internal control point array. + /// + /// @param insertionPos The zero-based array position in which to + /// insert the control point. + /// @param value The value of the control point. + /// + /// To make room for this new control point, this method reallocates + /// the control point array and shifts all control points occurring + /// after the insertion position up by one. + /// + /// Because the curve mapping algorithm in this noise module requires + /// that all control points in the array be sorted by value, the new + /// control point should be inserted at the position in which the + /// order is still preserved. + public void insertAtPos (int insertionPos, double value) + { + // Make room for the new control point at the specified position within + // the control point array. The position is determined by the value of + // the control point; the control points must be sorted by value within + // that array. + double[] newControlPoints = new double[controlPointCount + 1]; + + for (int i = 0; i < controlPointCount; i++) + { + if (i < insertionPos) + newControlPoints[i] = controlPoints[i]; + else + newControlPoints[i + 1] = controlPoints[i]; + } + + controlPoints = newControlPoints; + ++controlPointCount; + + // Now that we've made room for the new control point within the array, + // add the new control point. + controlPoints[insertionPos] = value; + } + + /// Creates a number of equally-spaced control points that range from + /// -1 to +1. + /// + /// @param controlPointCount The number of control points to generate. + /// + /// @pre The number of control points must be greater than or equal to + /// 2. + /// + /// @post The previous control points on the terrace-forming curve are + /// deleted. + /// + /// @throw ExceptionInvalidParam An invalid parameter was + /// specified; see the preconditions for more information. + /// + /// Two or more control points define the terrace-forming curve. The + /// start of this curve has a slope of zero; its slope then smoothly + /// increases. At the control points, its slope resets to zero. + void makeControlPoints (int controlPointCount) throws ExceptionInvalidParam + { + if (controlPointCount < 2) + throw new ExceptionInvalidParam ("Invalid Parameter in Terrace Noise Module"); + + clearAllControlPoints (); + + double terraceStep = 2.0 / ((double)controlPointCount - 1.0); + double curValue = -1.0; + for (int i = 0; i < (int)controlPointCount; i++) + { + addControlPoint (curValue); + curValue += terraceStep; + } + } + + /// Returns a pointer to the array of control points on the + /// terrace-forming curve. + /// + /// @returns A pointer to the array of control points in this noise + /// module. + /// + /// Two or more control points define the terrace-forming curve. The + /// start of this curve has a slope of zero; its slope then smoothly + /// increases. At the control points, its slope resets to zero. + /// + /// Before calling this method, call getControlPointCount() to + /// determine the number of control points in this array. + /// + /// It is recommended that an application does not store this pointer + /// for later use since the pointer to the array may change if the + /// application calls another method of this object. + public double[] getControlPointArray () + { + return controlPoints; + } + + /// Returns the number of control points on the terrace-forming curve. + /// + /// @returns The number of control points on the terrace-forming + /// curve. + public int getControlPointCount () + { + return controlPointCount; + } + + /// Enables or disables the inversion of the terrace-forming curve + /// between the control points. + /// + /// @param invert Specifies whether to invert the curve between the + /// control points. + public void invertTerraces (boolean invert) + { + if (invert) + invertTerraces = invert; + } + + /// Determines if the terrace-forming curve between the control + /// points is inverted. + /// + /// @returns + /// - @a true if the curve between the control points is inverted. + /// - @a false if the curve between the control points is not + /// inverted. + public boolean isTerracesInverted () + { + return invertTerraces; + } + +} diff --git a/src/libnoiseforjava/module/TranslatePoint.java b/src/libnoiseforjava/module/TranslatePoint.java index 1f9b845..23ed712 100644 --- a/src/libnoiseforjava/module/TranslatePoint.java +++ b/src/libnoiseforjava/module/TranslatePoint.java @@ -1,192 +1,192 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class TranslatePoint extends ModuleBase -{ - /// Noise module that moves the coordinates of the input value before - /// returning the output value from a source module. - /// - /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates of - /// the input value by a translation amount before returning the output - /// value from the source module. To set the translation amount, call - /// the setTranslation() method. To set the translation amount to - /// apply to the individual @a x, @a y, or @a z coordinates, call the - /// setXTranslation(), setYTranslation() or setZTranslation() methods, - /// respectively. - /// - /// This noise module requires one source module. - - - /// Default translation factor applied to the @a x coordinate for the - /// TranslatePoint noise module. - static final double DEFAULT_TRANSLATE_POINT_X = 0.0; - - /// Default translation factor applied to the @a y coordinate for the - /// TranslatePoint noise module. - static final double DEFAULT_TRANSLATE_POINT_Y = 0.0; - - /// Default translation factor applied to the @a z coordinate for the - /// TranslatePoint noise module. - static final double DEFAULT_TRANSLATE_POINT_Z = 0.0; - - /// Translation amount applied to the @a x coordinate of the input - /// value. - double xTranslation; - - /// Translation amount applied to the @a y coordinate of the input - /// value. - double yTranslation; - - /// Translation amount applied to the @a z coordinate of the input - /// value. - double zTranslation; - - public TranslatePoint (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - xTranslation = DEFAULT_TRANSLATE_POINT_X; - yTranslation = DEFAULT_TRANSLATE_POINT_Y; - zTranslation = DEFAULT_TRANSLATE_POINT_Z; - - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - - return sourceModules[0].getValue (x + xTranslation, y + yTranslation, - z + zTranslation); - } - - /// Returns the translation amount to apply to the @a x coordinate of - /// the input value. - /// - /// @returns The translation amount to apply to the @a x coordinate. - public double getXTranslation () - { - return xTranslation; - } - - /// Returns the translation amount to apply to the @a y coordinate of - /// the input value. - /// - /// @returns The translation amount to apply to the @a y coordinate. - public double getYTranslation () - { - return yTranslation; - } - - /// Returns the translation amount to apply to the @a z coordinate of - /// the input value. - /// - /// @returns The translation amount to apply to the @a z coordinate. - public double getZTranslation () - { - return zTranslation; - } - - /// Sets the translation amount to apply to the input value. - /// - /// @param translation The translation amount to apply. - /// - /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates - /// of the input value by a translation amount before returning the - /// output value from the source module - public void setTranslation (double translation) - { - this.xTranslation = translation; - this.yTranslation = translation; - this.zTranslation = translation; - } - - /// Sets the translation amounts to apply to the ( @a x, @a y, @a z ) - /// coordinates of the input value. - /// - /// @param xTranslation The translation amount to apply to the @a x - /// coordinate. - /// @param yTranslation The translation amount to apply to the @a y - /// coordinate. - /// @param zTranslation The translation amount to apply to the @a z - /// coordinate. - /// - /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates - /// of the input value by a translation amount before returning the - /// output value from the source module - public void setTranslation (double xTranslation, double yTranslation, - double zTranslation) - { - this.xTranslation = xTranslation; - this.yTranslation = yTranslation; - this.zTranslation = zTranslation; - } - - /// Sets the translation amount to apply to the @a x coordinate of the - /// input value. - /// - /// @param xTranslation The translation amount to apply to the @a x - /// coordinate. - /// - /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates - /// of the input value by a translation amount before returning the - /// output value from the source module - public void setXTranslation (double xTranslation) - { - this.xTranslation = xTranslation; - } - - /// Sets the translation amount to apply to the @a y coordinate of the - /// input value. - /// - /// @param yTranslation The translation amount to apply to the @a y - /// coordinate. - /// - /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates - /// of the input value by a translation amount before returning the - /// output value from the source module - public void setYTranslation (double yTranslation) - { - this.yTranslation = yTranslation; - } - - /// Sets the translation amount to apply to the @a z coordinate of the - /// input value. - /// - /// @param zTranslation The translation amount to apply to the @a z - /// coordinate. - /// - /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates - /// of the input value by a translation amount before returning the - /// output value from the source module - public void setZTranslation (double zTranslation) - { - this.zTranslation = zTranslation; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class TranslatePoint extends ModuleBase +{ + /// Noise module that moves the coordinates of the input value before + /// returning the output value from a source module. + /// + /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates of + /// the input value by a translation amount before returning the output + /// value from the source module. To set the translation amount, call + /// the setTranslation() method. To set the translation amount to + /// apply to the individual @a x, @a y, or @a z coordinates, call the + /// setXTranslation(), setYTranslation() or setZTranslation() methods, + /// respectively. + /// + /// This noise module requires one source module. + + + /// Default translation factor applied to the @a x coordinate for the + /// TranslatePoint noise module. + static final double DEFAULT_TRANSLATE_POINT_X = 0.0; + + /// Default translation factor applied to the @a y coordinate for the + /// TranslatePoint noise module. + static final double DEFAULT_TRANSLATE_POINT_Y = 0.0; + + /// Default translation factor applied to the @a z coordinate for the + /// TranslatePoint noise module. + static final double DEFAULT_TRANSLATE_POINT_Z = 0.0; + + /// Translation amount applied to the @a x coordinate of the input + /// value. + double xTranslation; + + /// Translation amount applied to the @a y coordinate of the input + /// value. + double yTranslation; + + /// Translation amount applied to the @a z coordinate of the input + /// value. + double zTranslation; + + public TranslatePoint (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + xTranslation = DEFAULT_TRANSLATE_POINT_X; + yTranslation = DEFAULT_TRANSLATE_POINT_Y; + zTranslation = DEFAULT_TRANSLATE_POINT_Z; + + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + + return sourceModules[0].getValue (x + xTranslation, y + yTranslation, + z + zTranslation); + } + + /// Returns the translation amount to apply to the @a x coordinate of + /// the input value. + /// + /// @returns The translation amount to apply to the @a x coordinate. + public double getXTranslation () + { + return xTranslation; + } + + /// Returns the translation amount to apply to the @a y coordinate of + /// the input value. + /// + /// @returns The translation amount to apply to the @a y coordinate. + public double getYTranslation () + { + return yTranslation; + } + + /// Returns the translation amount to apply to the @a z coordinate of + /// the input value. + /// + /// @returns The translation amount to apply to the @a z coordinate. + public double getZTranslation () + { + return zTranslation; + } + + /// Sets the translation amount to apply to the input value. + /// + /// @param translation The translation amount to apply. + /// + /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates + /// of the input value by a translation amount before returning the + /// output value from the source module + public void setTranslation (double translation) + { + this.xTranslation = translation; + this.yTranslation = translation; + this.zTranslation = translation; + } + + /// Sets the translation amounts to apply to the ( @a x, @a y, @a z ) + /// coordinates of the input value. + /// + /// @param xTranslation The translation amount to apply to the @a x + /// coordinate. + /// @param yTranslation The translation amount to apply to the @a y + /// coordinate. + /// @param zTranslation The translation amount to apply to the @a z + /// coordinate. + /// + /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates + /// of the input value by a translation amount before returning the + /// output value from the source module + public void setTranslation (double xTranslation, double yTranslation, + double zTranslation) + { + this.xTranslation = xTranslation; + this.yTranslation = yTranslation; + this.zTranslation = zTranslation; + } + + /// Sets the translation amount to apply to the @a x coordinate of the + /// input value. + /// + /// @param xTranslation The translation amount to apply to the @a x + /// coordinate. + /// + /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates + /// of the input value by a translation amount before returning the + /// output value from the source module + public void setXTranslation (double xTranslation) + { + this.xTranslation = xTranslation; + } + + /// Sets the translation amount to apply to the @a y coordinate of the + /// input value. + /// + /// @param yTranslation The translation amount to apply to the @a y + /// coordinate. + /// + /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates + /// of the input value by a translation amount before returning the + /// output value from the source module + public void setYTranslation (double yTranslation) + { + this.yTranslation = yTranslation; + } + + /// Sets the translation amount to apply to the @a z coordinate of the + /// input value. + /// + /// @param zTranslation The translation amount to apply to the @a z + /// coordinate. + /// + /// The getValue() method moves the ( @a x, @a y, @a z ) coordinates + /// of the input value by a translation amount before returning the + /// output value from the source module + public void setZTranslation (double zTranslation) + { + this.zTranslation = zTranslation; + } + +} diff --git a/src/libnoiseforjava/module/Turbulence.java b/src/libnoiseforjava/module/Turbulence.java index acf4cd7..021cff0 100644 --- a/src/libnoiseforjava/module/Turbulence.java +++ b/src/libnoiseforjava/module/Turbulence.java @@ -1,282 +1,282 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class Turbulence extends ModuleBase -{ - /// Noise module that randomly displaces the input value before - /// returning the output value from a source module. - /// - /// @a Turbulence is the pseudo-random displacement of the input value. - /// The getValue() method randomly displaces the ( @a x, @a y, @a z ) - /// coordinates of the input value before retrieving the output value from - /// the source module. To control the turbulence, an application can - /// modify its frequency, its power, and its roughness. - /// - /// The frequency of the turbulence determines how rapidly the - /// displacement amount changes. To specify the frequency, call the - /// setFrequency() method. - /// - /// The power of the turbulence determines the scaling factor that is - /// applied to the displacement amount. To specify the power, call the - /// setPower() method. - /// - /// The roughness of the turbulence determines the roughness of the - /// changes to the displacement amount. Low values smoothly change the - /// displacement amount. High values roughly change the displacement - /// amount, which produces more "kinky" changes. To specify the - /// roughness, call the setRoughness() method. - /// - /// Use of this noise module may require some trial and error. Assuming - /// that you are using a generator module as the source module, you - /// should first: - /// - Set the frequency to the same frequency as the source module. - /// - Set the power to the reciprocal of the frequency. - /// - /// From these initial frequency and power values, modify these values - /// until this noise module produce the desired changes in your terrain or - /// texture. For example: - /// - Low frequency (1/8 initial frequency) and low power (1/8 initial - /// power) produces very minor, almost unnoticeable changes. - /// - Low frequency (1/8 initial frequency) and high power (8 times - /// initial power) produces "ropey" lava-like terrain or marble-like - /// textures. - /// - High frequency (8 times initial frequency) and low power (1/8 - /// initial power) produces a noisy version of the initial terrain or - /// texture. - /// - High frequency (8 times initial frequency) and high power (8 times - /// initial power) produces nearly pure noise, which isn't entirely - /// useful. - /// - /// Displacing the input values result in more realistic terrain and - /// textures. If you are generating elevations for terrain height maps, - /// you can use this noise module to produce more realistic mountain - /// ranges or terrain features that look like flowing lava rock. If you - /// are generating values for textures, you can use this noise module to - /// produce realistic marble-like or "oily" textures. - /// - /// Internally, there are three noise::module::Perlin noise modules - /// that displace the input value; one for the @a x, one for the @a y, - /// and one for the @a z coordinate. - /// - /// This noise module requires one source module. - - /// Default frequency for the Turbulence noise module. - static final double DEFAULT_TURBULENCE_FREQUENCY = Perlin.DEFAULT_PERLIN_FREQUENCY; - - /// Default power for the Turbulence noise module. - static final double DEFAULT_TURBULENCE_POWER = 1.0; - - /// Default roughness for the Turbulence noise module. - static final int DEFAULT_TURBULENCE_ROUGHNESS = 3; - - /// Default noise seed for the Turbulence noise module. - static final int DEFAULT_TURBULENCE_SEED = Perlin.DEFAULT_PERLIN_SEED; - - - /// The power (scale) of the displacement. - double power; - - /// Noise module that displaces the @a x coordinate. - Perlin xDistortModule; - - /// Noise module that displaces the @a y coordinate. - Perlin yDistortModule; - - /// Noise module that displaces the @a z coordinate. - Perlin zDistortModule; - - public Turbulence (ModuleBase sourceModule) throws ExceptionInvalidParam - { - super(1); - setSourceModule(0, sourceModule); - - power = DEFAULT_TURBULENCE_POWER; - - xDistortModule = new Perlin(); - yDistortModule = new Perlin(); - zDistortModule = new Perlin(); - - setSeed(DEFAULT_TURBULENCE_SEED); - setFrequency(DEFAULT_TURBULENCE_FREQUENCY); - setRoughness (DEFAULT_TURBULENCE_ROUGHNESS); - } - - /// Returns the frequency of the turbulence. - /// - /// @returns The frequency of the turbulence. - /// - /// The frequency of the turbulence determines how rapidly the - /// displacement amount changes. - public double getFrequency () - { - // Since each noise::module::Perlin noise module has the same frequency, it - // does not matter which module we use to retrieve the frequency. - return xDistortModule.getFrequency (); - } - - /// Returns the seed value of the internal Perlin-noise modules that - /// are used to displace the input values. - /// - /// @returns The seed value. - /// - /// Internally, there are three Perlin noise modules - /// that displace the input value; one for the @a x, one for the @a y, - /// and one for the @a z coordinate. - public int getSeed () - { - return xDistortModule.getSeed (); - } - - public double getValue (double x, double y, double z) - { - assert (sourceModules[0] != null); - - // Get the values from the three Perlin noise modules and - // add each value to each coordinate of the input value. There are also - // some offsets added to the coordinates of the input values. This prevents - // the distortion modules from returning zero if the (x, y, z) coordinates, - // when multiplied by the frequency, are near an integer boundary. This is - // due to a property of gradient coherent noise, which returns zero at - // integer boundaries. - double x0, y0, z0; - double x1, y1, z1; - double x2, y2, z2; - - x0 = x + (12414.0 / 65536.0); - y0 = y + (65124.0 / 65536.0); - z0 = z + (31337.0 / 65536.0); - x1 = x + (26519.0 / 65536.0); - y1 = y + (18128.0 / 65536.0); - z1 = z + (60493.0 / 65536.0); - x2 = x + (53820.0 / 65536.0); - y2 = y + (11213.0 / 65536.0); - z2 = z + (44845.0 / 65536.0); - - double xDistort = x + (xDistortModule.getValue (x0, y0, z0) - * power); - double yDistort = y + (yDistortModule.getValue (x1, y1, z1) - * power); - double zDistort = z + (zDistortModule.getValue (x2, y2, z2) - * power); - - // Retrieve the output value at the offsetted input value instead of the - // original input value. - return sourceModules[0].getValue (xDistort, yDistort, zDistort); - } - - /// Sets the seed value of the internal noise modules that are used to - /// displace the input values. - /// - /// @param seed The seed value. - /// - /// Internally, there are three Perlin noise modules - /// that displace the input value; one for the @a x, one for the @a y, - /// and one for the @a z coordinate. This noise module assigns the - /// following seed values to the Perlin noise modules: - /// - It assigns the seed value (@a seed + 0) to the @a x noise module. - /// - It assigns the seed value (@a seed + 1) to the @a y noise module. - /// - It assigns the seed value (@a seed + 2) to the @a z noise module. - /// This is done to prevent any sort of weird artifacting. - public void setSeed (int seed) - { - xDistortModule.setSeed (seed); - yDistortModule.setSeed (seed + 1); - zDistortModule.setSeed (seed + 2); - } - - /// Returns the power of the turbulence. - /// - /// @returns The power of the turbulence. - /// - /// The power of the turbulence determines the scaling factor that is - /// applied to the displacement amount. - public double getPower () - { - return power; - } - - /// Returns the roughness of the turbulence. - /// - /// @returns The roughness of the turbulence. - /// - /// The roughness of the turbulence determines the roughness of the - /// changes to the displacement amount. Low values smoothly change - /// the displacement amount. High values roughly change the - /// displacement amount, which produces more "kinky" changes. - public int getRoughnessCount () - { - return xDistortModule.getOctaveCount (); - } - - /// Sets the frequency of the turbulence. - /// - /// @param frequency The frequency of the turbulence. - /// - /// The frequency of the turbulence determines how rapidly the - /// displacement amount changes. - public void setFrequency (double frequency) - { - xDistortModule.setFrequency (frequency); - yDistortModule.setFrequency (frequency); - zDistortModule.setFrequency (frequency); - } - - /// Sets the power of the turbulence. - /// - /// @param power The power of the turbulence. - /// - /// The power of the turbulence determines the scaling factor that is - /// applied to the displacement amount. - public void setPower (double power) - { - this.power = power; - } - - /// Sets the roughness of the turbulence. - /// - /// @param roughness The roughness of the turbulence. - /// - /// The roughness of the turbulence determines the roughness of the - /// changes to the displacement amount. Low values smoothly change - /// the displacement amount. High values roughly change the - /// displacement amount, which produces more "kinky" changes. - /// - /// Internally, there are three Perlin noise modules - /// that displace the input value; one for the @a x, one for the @a y, - /// and one for the @a z coordinate. The roughness value is equal to - /// the number of octaves used by the noise::module::Perlin noise - /// modules. - public void setRoughness (int roughness) throws ExceptionInvalidParam - { - xDistortModule.setOctaveCount (roughness); - yDistortModule.setOctaveCount (roughness); - zDistortModule.setOctaveCount (roughness); - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class Turbulence extends ModuleBase +{ + /// Noise module that randomly displaces the input value before + /// returning the output value from a source module. + /// + /// @a Turbulence is the pseudo-random displacement of the input value. + /// The getValue() method randomly displaces the ( @a x, @a y, @a z ) + /// coordinates of the input value before retrieving the output value from + /// the source module. To control the turbulence, an application can + /// modify its frequency, its power, and its roughness. + /// + /// The frequency of the turbulence determines how rapidly the + /// displacement amount changes. To specify the frequency, call the + /// setFrequency() method. + /// + /// The power of the turbulence determines the scaling factor that is + /// applied to the displacement amount. To specify the power, call the + /// setPower() method. + /// + /// The roughness of the turbulence determines the roughness of the + /// changes to the displacement amount. Low values smoothly change the + /// displacement amount. High values roughly change the displacement + /// amount, which produces more "kinky" changes. To specify the + /// roughness, call the setRoughness() method. + /// + /// Use of this noise module may require some trial and error. Assuming + /// that you are using a generator module as the source module, you + /// should first: + /// - Set the frequency to the same frequency as the source module. + /// - Set the power to the reciprocal of the frequency. + /// + /// From these initial frequency and power values, modify these values + /// until this noise module produce the desired changes in your terrain or + /// texture. For example: + /// - Low frequency (1/8 initial frequency) and low power (1/8 initial + /// power) produces very minor, almost unnoticeable changes. + /// - Low frequency (1/8 initial frequency) and high power (8 times + /// initial power) produces "ropey" lava-like terrain or marble-like + /// textures. + /// - High frequency (8 times initial frequency) and low power (1/8 + /// initial power) produces a noisy version of the initial terrain or + /// texture. + /// - High frequency (8 times initial frequency) and high power (8 times + /// initial power) produces nearly pure noise, which isn't entirely + /// useful. + /// + /// Displacing the input values result in more realistic terrain and + /// textures. If you are generating elevations for terrain height maps, + /// you can use this noise module to produce more realistic mountain + /// ranges or terrain features that look like flowing lava rock. If you + /// are generating values for textures, you can use this noise module to + /// produce realistic marble-like or "oily" textures. + /// + /// Internally, there are three noise::module::Perlin noise modules + /// that displace the input value; one for the @a x, one for the @a y, + /// and one for the @a z coordinate. + /// + /// This noise module requires one source module. + + /// Default frequency for the Turbulence noise module. + static final double DEFAULT_TURBULENCE_FREQUENCY = Perlin.DEFAULT_PERLIN_FREQUENCY; + + /// Default power for the Turbulence noise module. + static final double DEFAULT_TURBULENCE_POWER = 1.0; + + /// Default roughness for the Turbulence noise module. + static final int DEFAULT_TURBULENCE_ROUGHNESS = 3; + + /// Default noise seed for the Turbulence noise module. + static final int DEFAULT_TURBULENCE_SEED = Perlin.DEFAULT_PERLIN_SEED; + + + /// The power (scale) of the displacement. + double power; + + /// Noise module that displaces the @a x coordinate. + Perlin xDistortModule; + + /// Noise module that displaces the @a y coordinate. + Perlin yDistortModule; + + /// Noise module that displaces the @a z coordinate. + Perlin zDistortModule; + + public Turbulence (ModuleBase sourceModule) throws ExceptionInvalidParam + { + super(1); + setSourceModule(0, sourceModule); + + power = DEFAULT_TURBULENCE_POWER; + + xDistortModule = new Perlin(); + yDistortModule = new Perlin(); + zDistortModule = new Perlin(); + + setSeed(DEFAULT_TURBULENCE_SEED); + setFrequency(DEFAULT_TURBULENCE_FREQUENCY); + setRoughness (DEFAULT_TURBULENCE_ROUGHNESS); + } + + /// Returns the frequency of the turbulence. + /// + /// @returns The frequency of the turbulence. + /// + /// The frequency of the turbulence determines how rapidly the + /// displacement amount changes. + public double getFrequency () + { + // Since each noise::module::Perlin noise module has the same frequency, it + // does not matter which module we use to retrieve the frequency. + return xDistortModule.getFrequency (); + } + + /// Returns the seed value of the internal Perlin-noise modules that + /// are used to displace the input values. + /// + /// @returns The seed value. + /// + /// Internally, there are three Perlin noise modules + /// that displace the input value; one for the @a x, one for the @a y, + /// and one for the @a z coordinate. + public int getSeed () + { + return xDistortModule.getSeed (); + } + + public double getValue (double x, double y, double z) + { + assert (sourceModules[0] != null); + + // Get the values from the three Perlin noise modules and + // add each value to each coordinate of the input value. There are also + // some offsets added to the coordinates of the input values. This prevents + // the distortion modules from returning zero if the (x, y, z) coordinates, + // when multiplied by the frequency, are near an integer boundary. This is + // due to a property of gradient coherent noise, which returns zero at + // integer boundaries. + double x0, y0, z0; + double x1, y1, z1; + double x2, y2, z2; + + x0 = x + (12414.0 / 65536.0); + y0 = y + (65124.0 / 65536.0); + z0 = z + (31337.0 / 65536.0); + x1 = x + (26519.0 / 65536.0); + y1 = y + (18128.0 / 65536.0); + z1 = z + (60493.0 / 65536.0); + x2 = x + (53820.0 / 65536.0); + y2 = y + (11213.0 / 65536.0); + z2 = z + (44845.0 / 65536.0); + + double xDistort = x + (xDistortModule.getValue (x0, y0, z0) + * power); + double yDistort = y + (yDistortModule.getValue (x1, y1, z1) + * power); + double zDistort = z + (zDistortModule.getValue (x2, y2, z2) + * power); + + // Retrieve the output value at the offsetted input value instead of the + // original input value. + return sourceModules[0].getValue (xDistort, yDistort, zDistort); + } + + /// Sets the seed value of the internal noise modules that are used to + /// displace the input values. + /// + /// @param seed The seed value. + /// + /// Internally, there are three Perlin noise modules + /// that displace the input value; one for the @a x, one for the @a y, + /// and one for the @a z coordinate. This noise module assigns the + /// following seed values to the Perlin noise modules: + /// - It assigns the seed value (@a seed + 0) to the @a x noise module. + /// - It assigns the seed value (@a seed + 1) to the @a y noise module. + /// - It assigns the seed value (@a seed + 2) to the @a z noise module. + /// This is done to prevent any sort of weird artifacting. + public void setSeed (int seed) + { + xDistortModule.setSeed (seed); + yDistortModule.setSeed (seed + 1); + zDistortModule.setSeed (seed + 2); + } + + /// Returns the power of the turbulence. + /// + /// @returns The power of the turbulence. + /// + /// The power of the turbulence determines the scaling factor that is + /// applied to the displacement amount. + public double getPower () + { + return power; + } + + /// Returns the roughness of the turbulence. + /// + /// @returns The roughness of the turbulence. + /// + /// The roughness of the turbulence determines the roughness of the + /// changes to the displacement amount. Low values smoothly change + /// the displacement amount. High values roughly change the + /// displacement amount, which produces more "kinky" changes. + public int getRoughnessCount () + { + return xDistortModule.getOctaveCount (); + } + + /// Sets the frequency of the turbulence. + /// + /// @param frequency The frequency of the turbulence. + /// + /// The frequency of the turbulence determines how rapidly the + /// displacement amount changes. + public void setFrequency (double frequency) + { + xDistortModule.setFrequency (frequency); + yDistortModule.setFrequency (frequency); + zDistortModule.setFrequency (frequency); + } + + /// Sets the power of the turbulence. + /// + /// @param power The power of the turbulence. + /// + /// The power of the turbulence determines the scaling factor that is + /// applied to the displacement amount. + public void setPower (double power) + { + this.power = power; + } + + /// Sets the roughness of the turbulence. + /// + /// @param roughness The roughness of the turbulence. + /// + /// The roughness of the turbulence determines the roughness of the + /// changes to the displacement amount. Low values smoothly change + /// the displacement amount. High values roughly change the + /// displacement amount, which produces more "kinky" changes. + /// + /// Internally, there are three Perlin noise modules + /// that displace the input value; one for the @a x, one for the @a y, + /// and one for the @a z coordinate. The roughness value is equal to + /// the number of octaves used by the noise::module::Perlin noise + /// modules. + public void setRoughness (int roughness) throws ExceptionInvalidParam + { + xDistortModule.setOctaveCount (roughness); + yDistortModule.setOctaveCount (roughness); + zDistortModule.setOctaveCount (roughness); + } + +} diff --git a/src/libnoiseforjava/module/Voronoi.java b/src/libnoiseforjava/module/Voronoi.java index 4be23de..79776c1 100644 --- a/src/libnoiseforjava/module/Voronoi.java +++ b/src/libnoiseforjava/module/Voronoi.java @@ -1,283 +1,283 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.module; - -import libnoiseforjava.NoiseGen; - -public class Voronoi extends ModuleBase -{ - - /// Noise module that outputs Voronoi cells. - /// - /// In mathematics, a Voronoi cell is a region containing all the - /// points that are closer to a specific seed point than to any - /// other seed point. These cells mesh with one another, producing - /// polygon-like formations. - /// - /// By default, this noise module randomly places a seed point within - /// each unit cube. By modifying the frequency of the seed points, - /// an application can change the distance between seed points. The - /// higher the frequency, the closer together this noise module places - /// the seed points, which reduces the size of the cells. To specify the - /// frequency of the cells, call the setFrequency() method. - /// - /// This noise module assigns each Voronoi cell with a random constant - /// value from a coherent-noise function. The displacement value - /// controls the range of random values to assign to each cell. The - /// range of random values is +/- the displacement value. Call the - /// setDisplacement() method to specify the displacement value. - /// - /// To modify the random positions of the seed points, call the SetSeed() - /// method. - /// - /// This noise module can optionally add the distance from the nearest - /// seed to the output value. To enable this feature, call the - /// enableDistance() method. This causes the points in the Voronoi cells - /// to increase in value the further away that point is from the nearest - /// seed point. - /// - /// Voronoi cells are often used to generate cracked-mud terrain - /// formations or crystal-like textures - /// - /// This noise module requires no source modules. - - - /// Default displacement to apply to each cell for the - /// Voronoi noise module. - final static double DEFAULT_VORONOI_DISPLACEMENT = 1.0; - - /// Default frequency of the seed points for the Voronoi - /// noise module. - final static double DEFAULT_VORONOI_FREQUENCY = 1.0; - - /// Default seed of the noise function for the Voronoi - /// noise module. - final static int DEFAULT_VORONOI_SEED = 0; - - private static final double SQRT_3 = 1.7320508075688772935; - - - /// Scale of the random displacement to apply to each Voronoi cell. - double displacement; - - /// Determines if the distance from the nearest seed point is applied to - /// the output value. - boolean enableDistance; - - /// Frequency of the seed points. - double frequency; - - /// Seed value used by the coherent-noise function to determine the - /// positions of the seed points. - int seed; - - - public Voronoi () - { - super(0); - displacement = DEFAULT_VORONOI_DISPLACEMENT; - enableDistance = false; - frequency = DEFAULT_VORONOI_FREQUENCY; - seed = DEFAULT_VORONOI_SEED; - } - - public double getValue (double x, double y, double z) - { - // This method could be more efficient by caching the seed values. Fix - // later. - - x *= frequency; - y *= frequency; - z *= frequency; - - int xInt = (x > 0.0? (int)x: (int)x - 1); - int yInt = (y > 0.0? (int)y: (int)y - 1); - int zInt = (z > 0.0? (int)z: (int)z - 1); - - double minDist = 2147483647.0; - double xCandidate = 0; - double yCandidate = 0; - double zCandidate = 0; - - // Inside each unit cube, there is a seed point at a random position. Go - // through each of the nearby cubes until we find a cube with a seed point - // that is closest to the specified position. - for (int zCur = zInt - 2; zCur <= zInt + 2; zCur++) - { - for (int yCur = yInt - 2; yCur <= yInt + 2; yCur++) - { - for (int xCur = xInt - 2; xCur <= xInt + 2; xCur++) - { - // Calculate the position and distance to the seed point inside of - // this unit cube. - double xPos = xCur + NoiseGen.ValueNoise3D (xCur, yCur, zCur, seed); - double yPos = yCur + NoiseGen.ValueNoise3D (xCur, yCur, zCur, seed + 1); - double zPos = zCur + NoiseGen.ValueNoise3D (xCur, yCur, zCur, seed + 2); - double xDist = xPos - x; - double yDist = yPos - y; - double zDist = zPos - z; - double dist = xDist * xDist + yDist * yDist + zDist * zDist; - - if (dist < minDist) - { - // This seed point is closer to any others found so far, so record - // this seed point. - minDist = dist; - xCandidate = xPos; - yCandidate = yPos; - zCandidate = zPos; - } - } - } - } - - double value; - if (enableDistance) - { - // Determine the distance to the nearest seed point. - double xDist = xCandidate - x; - double yDist = yCandidate - y; - double zDist = zCandidate - z; - value = (Math.sqrt(xDist * xDist + yDist * yDist + zDist * zDist) - ) * SQRT_3 - 1.0; - } else { - value = 0.0; - } - - // Return the calculated distance with the displacement value applied. - return value + (displacement * (double)NoiseGen.ValueNoise3D ( - (int)(Math.floor (xCandidate)), - (int)(Math.floor (yCandidate)), - (int)(Math.floor (zCandidate)), seed));// added seed here, not in original - // but there isn't a working method - // without seed - } - - /// Enables or disables applying the distance from the nearest seed - /// point to the output value. - /// - /// @param enable Specifies whether to apply the distance to the - /// output value or not. - /// - /// Applying the distance from the nearest seed point to the output - /// value causes the points in the Voronoi cells to increase in value - /// the further away that point is from the nearest seed point. - /// Setting this value to @a true (and setting the displacement to a - /// near-zero value) causes this noise module to generate cracked mud - /// formations. - public void enableDistance (boolean enable) - { - enableDistance = enable; - } - - /// Returns the displacement value of the Voronoi cells. - /// - /// @returns The displacement value of the Voronoi cells. - /// - /// This noise module assigns each Voronoi cell with a random constant - /// value from a coherent-noise function. The displacement - /// value controls the range of random values to assign to each - /// cell. The range of random values is +/- the displacement value. - public double getDisplacement () - { - return displacement; - } - - /// Returns the frequency of the seed points. - /// - /// @returns The frequency of the seed points. - /// - /// The frequency determines the size of the Voronoi cells and the - /// distance between these cells. - public double GetFrequency () - { - return frequency; - } - - /// Returns the seed value used by the Voronoi cells - /// - /// @returns The seed value. - /// - /// The positions of the seed values are calculated by a - /// coherent-noise function. By modifying the seed value, the output - /// of that function changes. - public int getSeed () - { - return seed; - } - - /// Determines if the distance from the nearest seed point is applied - /// to the output value. - /// - /// @returns - /// - @a true if the distance is applied to the output value. - /// - @a false if not. - /// - /// Applying the distance from the nearest seed point to the output - /// value causes the points in the Voronoi cells to increase in value - /// the further away that point is from the nearest seed point. - public boolean IsDistanceEnabled () - { - return enableDistance; - } - - /// Sets the displacement value of the Voronoi cells. - /// - /// @param displacement The displacement value of the Voronoi cells. - /// - /// This noise module assigns each Voronoi cell with a random constant - /// value from a coherent-noise function. The displacement - /// value controls the range of random values to assign to each - /// cell. The range of random values is +/- the displacement value. - public void setDisplacement (double displacement) - { - this.displacement = displacement; - } - - /// Sets the frequency of the seed points. - /// - /// @param frequency The frequency of the seed points. - /// - /// The frequency determines the size of the Voronoi cells and the - /// distance between these cells. - public void setFrequency (double frequency) - { - this.frequency = frequency; - } - - /// Sets the seed value used by the Voronoi cells - /// - /// @param seed The seed value. - /// - /// The positions of the seed values are calculated by a - /// coherent-noise function. By modifying the seed value, the output - /// of that function changes. - public void setSeed (int seed) - { - this.seed = seed; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.module; + +import libnoiseforjava.NoiseGen; + +public class Voronoi extends ModuleBase +{ + + /// Noise module that outputs Voronoi cells. + /// + /// In mathematics, a Voronoi cell is a region containing all the + /// points that are closer to a specific seed point than to any + /// other seed point. These cells mesh with one another, producing + /// polygon-like formations. + /// + /// By default, this noise module randomly places a seed point within + /// each unit cube. By modifying the frequency of the seed points, + /// an application can change the distance between seed points. The + /// higher the frequency, the closer together this noise module places + /// the seed points, which reduces the size of the cells. To specify the + /// frequency of the cells, call the setFrequency() method. + /// + /// This noise module assigns each Voronoi cell with a random constant + /// value from a coherent-noise function. The displacement value + /// controls the range of random values to assign to each cell. The + /// range of random values is +/- the displacement value. Call the + /// setDisplacement() method to specify the displacement value. + /// + /// To modify the random positions of the seed points, call the SetSeed() + /// method. + /// + /// This noise module can optionally add the distance from the nearest + /// seed to the output value. To enable this feature, call the + /// enableDistance() method. This causes the points in the Voronoi cells + /// to increase in value the further away that point is from the nearest + /// seed point. + /// + /// Voronoi cells are often used to generate cracked-mud terrain + /// formations or crystal-like textures + /// + /// This noise module requires no source modules. + + + /// Default displacement to apply to each cell for the + /// Voronoi noise module. + final static double DEFAULT_VORONOI_DISPLACEMENT = 1.0; + + /// Default frequency of the seed points for the Voronoi + /// noise module. + final static double DEFAULT_VORONOI_FREQUENCY = 1.0; + + /// Default seed of the noise function for the Voronoi + /// noise module. + final static int DEFAULT_VORONOI_SEED = 0; + + private static final double SQRT_3 = 1.7320508075688772935; + + + /// Scale of the random displacement to apply to each Voronoi cell. + double displacement; + + /// Determines if the distance from the nearest seed point is applied to + /// the output value. + boolean enableDistance; + + /// Frequency of the seed points. + double frequency; + + /// Seed value used by the coherent-noise function to determine the + /// positions of the seed points. + int seed; + + + public Voronoi () + { + super(0); + displacement = DEFAULT_VORONOI_DISPLACEMENT; + enableDistance = false; + frequency = DEFAULT_VORONOI_FREQUENCY; + seed = DEFAULT_VORONOI_SEED; + } + + public double getValue (double x, double y, double z) + { + // This method could be more efficient by caching the seed values. Fix + // later. + + x *= frequency; + y *= frequency; + z *= frequency; + + int xInt = (x > 0.0? (int)x: (int)x - 1); + int yInt = (y > 0.0? (int)y: (int)y - 1); + int zInt = (z > 0.0? (int)z: (int)z - 1); + + double minDist = 2147483647.0; + double xCandidate = 0; + double yCandidate = 0; + double zCandidate = 0; + + // Inside each unit cube, there is a seed point at a random position. Go + // through each of the nearby cubes until we find a cube with a seed point + // that is closest to the specified position. + for (int zCur = zInt - 2; zCur <= zInt + 2; zCur++) + { + for (int yCur = yInt - 2; yCur <= yInt + 2; yCur++) + { + for (int xCur = xInt - 2; xCur <= xInt + 2; xCur++) + { + // Calculate the position and distance to the seed point inside of + // this unit cube. + double xPos = xCur + NoiseGen.ValueNoise3D (xCur, yCur, zCur, seed); + double yPos = yCur + NoiseGen.ValueNoise3D (xCur, yCur, zCur, seed + 1); + double zPos = zCur + NoiseGen.ValueNoise3D (xCur, yCur, zCur, seed + 2); + double xDist = xPos - x; + double yDist = yPos - y; + double zDist = zPos - z; + double dist = xDist * xDist + yDist * yDist + zDist * zDist; + + if (dist < minDist) + { + // This seed point is closer to any others found so far, so record + // this seed point. + minDist = dist; + xCandidate = xPos; + yCandidate = yPos; + zCandidate = zPos; + } + } + } + } + + double value; + if (enableDistance) + { + // Determine the distance to the nearest seed point. + double xDist = xCandidate - x; + double yDist = yCandidate - y; + double zDist = zCandidate - z; + value = (Math.sqrt(xDist * xDist + yDist * yDist + zDist * zDist) + ) * SQRT_3 - 1.0; + } else { + value = 0.0; + } + + // Return the calculated distance with the displacement value applied. + return value + (displacement * (double)NoiseGen.ValueNoise3D ( + (int)(Math.floor (xCandidate)), + (int)(Math.floor (yCandidate)), + (int)(Math.floor (zCandidate)), seed));// added seed here, not in original + // but there isn't a working method + // without seed + } + + /// Enables or disables applying the distance from the nearest seed + /// point to the output value. + /// + /// @param enable Specifies whether to apply the distance to the + /// output value or not. + /// + /// Applying the distance from the nearest seed point to the output + /// value causes the points in the Voronoi cells to increase in value + /// the further away that point is from the nearest seed point. + /// Setting this value to @a true (and setting the displacement to a + /// near-zero value) causes this noise module to generate cracked mud + /// formations. + public void enableDistance (boolean enable) + { + enableDistance = enable; + } + + /// Returns the displacement value of the Voronoi cells. + /// + /// @returns The displacement value of the Voronoi cells. + /// + /// This noise module assigns each Voronoi cell with a random constant + /// value from a coherent-noise function. The displacement + /// value controls the range of random values to assign to each + /// cell. The range of random values is +/- the displacement value. + public double getDisplacement () + { + return displacement; + } + + /// Returns the frequency of the seed points. + /// + /// @returns The frequency of the seed points. + /// + /// The frequency determines the size of the Voronoi cells and the + /// distance between these cells. + public double GetFrequency () + { + return frequency; + } + + /// Returns the seed value used by the Voronoi cells + /// + /// @returns The seed value. + /// + /// The positions of the seed values are calculated by a + /// coherent-noise function. By modifying the seed value, the output + /// of that function changes. + public int getSeed () + { + return seed; + } + + /// Determines if the distance from the nearest seed point is applied + /// to the output value. + /// + /// @returns + /// - @a true if the distance is applied to the output value. + /// - @a false if not. + /// + /// Applying the distance from the nearest seed point to the output + /// value causes the points in the Voronoi cells to increase in value + /// the further away that point is from the nearest seed point. + public boolean IsDistanceEnabled () + { + return enableDistance; + } + + /// Sets the displacement value of the Voronoi cells. + /// + /// @param displacement The displacement value of the Voronoi cells. + /// + /// This noise module assigns each Voronoi cell with a random constant + /// value from a coherent-noise function. The displacement + /// value controls the range of random values to assign to each + /// cell. The range of random values is +/- the displacement value. + public void setDisplacement (double displacement) + { + this.displacement = displacement; + } + + /// Sets the frequency of the seed points. + /// + /// @param frequency The frequency of the seed points. + /// + /// The frequency determines the size of the Voronoi cells and the + /// distance between these cells. + public void setFrequency (double frequency) + { + this.frequency = frequency; + } + + /// Sets the seed value used by the Voronoi cells + /// + /// @param seed The seed value. + /// + /// The positions of the seed values are calculated by a + /// coherent-noise function. By modifying the seed value, the output + /// of that function changes. + public void setSeed (int seed) + { + this.seed = seed; + } + +} diff --git a/src/libnoiseforjava/util/ColorCafe.java b/src/libnoiseforjava/util/ColorCafe.java index 08cb4ab..0b98471 100644 --- a/src/libnoiseforjava/util/ColorCafe.java +++ b/src/libnoiseforjava/util/ColorCafe.java @@ -1,105 +1,105 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -public class ColorCafe -{ - /// Defines a color. - /// - /// A color object contains four 8-bit channels: red, green, blue, and an - /// alpha (transparency) channel. Channel values range from 0 to 255. - /// - /// The alpha channel defines the transparency of the color. If the alpha - /// channel has a value of 0, the color is completely transparent. If the - /// alpha channel has a value of 255, the color is completely opaque. - - /// Value of the alpha (transparency) channel. - int alpha; - - /// Value of the blue channel. - int blue; - - /// Value of the green channel. - int green; - - /// Value of the red channel. - int red; - - /// Constructor. - /// - /// @param r Value of the red channel. - /// @param g Value of the green channel. - /// @param b Value of the blue channel. - /// @param a Value of the alpha (transparency) channel. - public ColorCafe (int red, int green, int blue, int alpha) - { - this.red = red; - this.blue = blue; - this.green = green; - this.alpha = alpha; - } - - public int getAlpha() - { - return alpha; - } - - public int getBlue() - { - return blue; - } - - public int getGreen() - { - return green; - } - - public int getRed() - { - return red; - } - - public void setAlpha(int alpha) - { - this.alpha = alpha; - } - - public void setBlue(int blue) - { - this.blue = blue; - } - - public void setGreen(int green) - { - this.green = green; - } - - public void setRed(int red) - { - this.red = red; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +public class ColorCafe +{ + /// Defines a color. + /// + /// A color object contains four 8-bit channels: red, green, blue, and an + /// alpha (transparency) channel. Channel values range from 0 to 255. + /// + /// The alpha channel defines the transparency of the color. If the alpha + /// channel has a value of 0, the color is completely transparent. If the + /// alpha channel has a value of 255, the color is completely opaque. + + /// Value of the alpha (transparency) channel. + int alpha; + + /// Value of the blue channel. + int blue; + + /// Value of the green channel. + int green; + + /// Value of the red channel. + int red; + + /// Constructor. + /// + /// @param r Value of the red channel. + /// @param g Value of the green channel. + /// @param b Value of the blue channel. + /// @param a Value of the alpha (transparency) channel. + public ColorCafe (int red, int green, int blue, int alpha) + { + this.red = red; + this.blue = blue; + this.green = green; + this.alpha = alpha; + } + + public int getAlpha() + { + return alpha; + } + + public int getBlue() + { + return blue; + } + + public int getGreen() + { + return green; + } + + public int getRed() + { + return red; + } + + public void setAlpha(int alpha) + { + this.alpha = alpha; + } + + public void setBlue(int blue) + { + this.blue = blue; + } + + public void setGreen(int green) + { + this.green = green; + } + + public void setRed(int red) + { + this.red = red; + } + +} diff --git a/src/libnoiseforjava/util/GradientColor.java b/src/libnoiseforjava/util/GradientColor.java index d9f5736..ee241f4 100644 --- a/src/libnoiseforjava/util/GradientColor.java +++ b/src/libnoiseforjava/util/GradientColor.java @@ -1,251 +1,251 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -import libnoiseforjava.Misc; -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class GradientColor -{ - /// Defines a color gradient. - /// - /// A color gradient is a list of gradually-changing colors. A color - /// gradient is defined by a list of gradient points. Each - /// gradient point has a position and a color. In a color gradient, the - /// colors between two adjacent gradient points are linearly interpolated. - /// - /// To add a gradient point to the color gradient, pass its position and - /// color to the addGradientPoint() method. - /// - /// To retrieve a color from a specific position in the color gradient, - /// pass that position to the getColor() method. - /// - /// This class is a useful tool for coloring height maps based on - /// elevation. - /// - /// Gradient example - /// - /// Suppose a gradient object contains the following gradient points: - /// - -1.0 maps to black. - /// - 0.0 maps to white. - /// - 1.0 maps to red. - /// - /// If an application passes -0.5 to the getColor() method, this method - /// will return a gray color that is halfway between black and white. - /// - /// If an application passes 0.25 to the getColor() method, this method - /// will return a very light pink color that is one quarter of the way - /// between white and red. - - - GradientPoint [] gradientPoints; - int gradientPointCount; - ColorCafe workingColor; - - public GradientColor() - { - gradientPoints = new GradientPoint[1]; - gradientPoints[0] = new GradientPoint(0.0, new ColorCafe(0, 0, 0, 0)); - } - - /// Adds a gradient point to this gradient object. - /// - /// @param gradientPos The position of this gradient point. - /// @param gradientColor The color of this gradient point. - /// - /// @pre No two gradient points have the same position. - /// - /// @throw noise::ExceptionInvalidParam See the precondition. - /// - /// It does not matter which order these gradient points are added. - public void addGradientPoint (double gradientPos, ColorCafe gradientColor) throws ExceptionInvalidParam - { - // Find the insertion point for the new gradient point and insert the new - // gradient point at that insertion point. The gradient point array will - // remain sorted by gradient position. - int insertionPos = findInsertionPos (gradientPos); - insertAtPos (insertionPos, gradientPos, gradientColor); - } - - /// Deletes all the gradient points from this gradient object. - /// - /// @post All gradient points from this gradient object are deleted. - public void clear () - { - gradientPoints = null; - gradientPointCount = 0; - } - - /// Determines the array index in which to insert the gradient point - /// into the internal gradient-point array. - /// - /// @param gradientPos The position of this gradient point. - /// - /// @returns The array index in which to insert the gradient point. - /// - /// @pre No two gradient points have the same input value. - /// - /// @throw noise::ExceptionInvalidParam See the precondition. - /// - /// By inserting the gradient point at the returned array index, this - /// object ensures that the gradient-point array is sorted by input - /// value. The code that maps a value to a color requires a sorted - /// gradient-point array. - public int findInsertionPos (double gradientPos) throws ExceptionInvalidParam - { - int insertionPos; - for (insertionPos = 0; insertionPos < gradientPointCount; - insertionPos++) { - if (gradientPos < gradientPoints[insertionPos].position) { - // We found the array index in which to insert the new gradient point. - // Exit now. - break; - } else if (gradientPos == gradientPoints[insertionPos].position) { - // Each gradient point is required to contain a unique gradient - // position, so throw an exception. - throw new ExceptionInvalidParam ("Invalid Parameter in Gradient Color"); - } - } - return insertionPos; - } - - /// Returns the color at the specified position in the color gradient. - /// - /// @param gradientPos The specified position. - /// - /// @returns The color at that position. - public ColorCafe getColor (double gradientPos) - { - assert (gradientPointCount >= 2); - - // Find the first element in the gradient point array that has a gradient - // position larger than the gradient position passed to this method. - int indexPos; - for (indexPos = 0; indexPos < gradientPointCount; indexPos++) - { - if (gradientPos < gradientPoints[indexPos].position) - break; - } - - // Find the two nearest gradient points so that we can perform linear - // interpolation on the color. - int index0 = Misc.ClampValue (indexPos - 1, 0, gradientPointCount - 1); - int index1 = Misc.ClampValue (indexPos, 0, gradientPointCount - 1); - - // If some gradient points are missing (which occurs if the gradient - // position passed to this method is greater than the largest gradient - // position or less than the smallest gradient position in the array), get - // the corresponding gradient color of the nearest gradient point and exit - // now. - if (index0 == index1) - { - workingColor = gradientPoints[index1].color; - return workingColor; - } - - // Compute the alpha value used for linear interpolation. - double input0 = gradientPoints[index0].position; - double input1 = gradientPoints[index1].position; - double alpha = (gradientPos - input0) / (input1 - input0); - - // Now perform the linear interpolation given the alpha value. - ColorCafe color0 = gradientPoints[index0].color; - ColorCafe color1 = gradientPoints[index1].color; - workingColor = MiscUtilities.linearInterpColor (color0, color1, (float)alpha); - return workingColor; - } - - /// Inserts the gradient point at the specified position in the - /// internal gradient-point array. - /// - /// @param insertionPos The zero-based array position in which to - /// insert the gradient point. - /// @param gradientPos The position of this gradient point. - /// @param gradientColor The color of this gradient point. - /// - /// To make room for this new gradient point, this method reallocates - /// the gradient-point array and shifts all gradient points occurring - /// after the insertion position up by one. - /// - /// Because this object requires that all gradient points in the array - /// must be sorted by the position, the new gradient point should be - /// inserted at the position in which the order is still preserved. - public void insertAtPos (int insertionPos, double gradientPos, - ColorCafe gradientColor) - { - // Make room for the new gradient point at the specified insertion position - // within the gradient point array. The insertion position is determined by - // the gradient point's position; the gradient points must be sorted by - // gradient position within that array. - GradientPoint [] newGradientPoints; - newGradientPoints = new GradientPoint[gradientPointCount + 1]; - - for (int t = 0; t < (gradientPointCount + 1); t++) - newGradientPoints[t] = new GradientPoint(); - - - - for (int i = 0; i < gradientPointCount; i++) - { - if (i < insertionPos) - newGradientPoints[i] = gradientPoints[i]; - else - newGradientPoints[i + 1] = gradientPoints[i]; - } - - gradientPoints = newGradientPoints; - ++gradientPointCount; - - // Now that we've made room for the new gradient point within the array, add - // the new gradient point. - gradientPoints[insertionPos].position = gradientPos; - gradientPoints[insertionPos].color = gradientColor; - } - - /// Returns a pointer to the array of gradient points in this object. - /// - /// @returns A pointer to the array of gradient points. - /// - /// Before calling this method, call getGradientPointCount() to - /// determine the number of gradient points in this array. - /// - /// It is recommended that an application does not store this pointer - /// for later use since the pointer to the array may change if the - /// application calls another method of this object. - public GradientPoint[] getGradientPointArray () - { - return gradientPoints; - } - - /// Returns the number of gradient points stored in this object. - /// - /// @returns The number of gradient points stored in this object. - public int getGradientPointCount () - { - return gradientPointCount; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +import libnoiseforjava.Misc; +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class GradientColor +{ + /// Defines a color gradient. + /// + /// A color gradient is a list of gradually-changing colors. A color + /// gradient is defined by a list of gradient points. Each + /// gradient point has a position and a color. In a color gradient, the + /// colors between two adjacent gradient points are linearly interpolated. + /// + /// To add a gradient point to the color gradient, pass its position and + /// color to the addGradientPoint() method. + /// + /// To retrieve a color from a specific position in the color gradient, + /// pass that position to the getColor() method. + /// + /// This class is a useful tool for coloring height maps based on + /// elevation. + /// + /// Gradient example + /// + /// Suppose a gradient object contains the following gradient points: + /// - -1.0 maps to black. + /// - 0.0 maps to white. + /// - 1.0 maps to red. + /// + /// If an application passes -0.5 to the getColor() method, this method + /// will return a gray color that is halfway between black and white. + /// + /// If an application passes 0.25 to the getColor() method, this method + /// will return a very light pink color that is one quarter of the way + /// between white and red. + + + GradientPoint [] gradientPoints; + int gradientPointCount; + ColorCafe workingColor; + + public GradientColor() + { + gradientPoints = new GradientPoint[1]; + gradientPoints[0] = new GradientPoint(0.0, new ColorCafe(0, 0, 0, 0)); + } + + /// Adds a gradient point to this gradient object. + /// + /// @param gradientPos The position of this gradient point. + /// @param gradientColor The color of this gradient point. + /// + /// @pre No two gradient points have the same position. + /// + /// @throw noise::ExceptionInvalidParam See the precondition. + /// + /// It does not matter which order these gradient points are added. + public void addGradientPoint (double gradientPos, ColorCafe gradientColor) throws ExceptionInvalidParam + { + // Find the insertion point for the new gradient point and insert the new + // gradient point at that insertion point. The gradient point array will + // remain sorted by gradient position. + int insertionPos = findInsertionPos (gradientPos); + insertAtPos (insertionPos, gradientPos, gradientColor); + } + + /// Deletes all the gradient points from this gradient object. + /// + /// @post All gradient points from this gradient object are deleted. + public void clear () + { + gradientPoints = null; + gradientPointCount = 0; + } + + /// Determines the array index in which to insert the gradient point + /// into the internal gradient-point array. + /// + /// @param gradientPos The position of this gradient point. + /// + /// @returns The array index in which to insert the gradient point. + /// + /// @pre No two gradient points have the same input value. + /// + /// @throw noise::ExceptionInvalidParam See the precondition. + /// + /// By inserting the gradient point at the returned array index, this + /// object ensures that the gradient-point array is sorted by input + /// value. The code that maps a value to a color requires a sorted + /// gradient-point array. + public int findInsertionPos (double gradientPos) throws ExceptionInvalidParam + { + int insertionPos; + for (insertionPos = 0; insertionPos < gradientPointCount; + insertionPos++) { + if (gradientPos < gradientPoints[insertionPos].position) { + // We found the array index in which to insert the new gradient point. + // Exit now. + break; + } else if (gradientPos == gradientPoints[insertionPos].position) { + // Each gradient point is required to contain a unique gradient + // position, so throw an exception. + throw new ExceptionInvalidParam ("Invalid Parameter in Gradient Color"); + } + } + return insertionPos; + } + + /// Returns the color at the specified position in the color gradient. + /// + /// @param gradientPos The specified position. + /// + /// @returns The color at that position. + public ColorCafe getColor (double gradientPos) + { + assert (gradientPointCount >= 2); + + // Find the first element in the gradient point array that has a gradient + // position larger than the gradient position passed to this method. + int indexPos; + for (indexPos = 0; indexPos < gradientPointCount; indexPos++) + { + if (gradientPos < gradientPoints[indexPos].position) + break; + } + + // Find the two nearest gradient points so that we can perform linear + // interpolation on the color. + int index0 = Misc.ClampValue (indexPos - 1, 0, gradientPointCount - 1); + int index1 = Misc.ClampValue (indexPos, 0, gradientPointCount - 1); + + // If some gradient points are missing (which occurs if the gradient + // position passed to this method is greater than the largest gradient + // position or less than the smallest gradient position in the array), get + // the corresponding gradient color of the nearest gradient point and exit + // now. + if (index0 == index1) + { + workingColor = gradientPoints[index1].color; + return workingColor; + } + + // Compute the alpha value used for linear interpolation. + double input0 = gradientPoints[index0].position; + double input1 = gradientPoints[index1].position; + double alpha = (gradientPos - input0) / (input1 - input0); + + // Now perform the linear interpolation given the alpha value. + ColorCafe color0 = gradientPoints[index0].color; + ColorCafe color1 = gradientPoints[index1].color; + workingColor = MiscUtilities.linearInterpColor (color0, color1, (float)alpha); + return workingColor; + } + + /// Inserts the gradient point at the specified position in the + /// internal gradient-point array. + /// + /// @param insertionPos The zero-based array position in which to + /// insert the gradient point. + /// @param gradientPos The position of this gradient point. + /// @param gradientColor The color of this gradient point. + /// + /// To make room for this new gradient point, this method reallocates + /// the gradient-point array and shifts all gradient points occurring + /// after the insertion position up by one. + /// + /// Because this object requires that all gradient points in the array + /// must be sorted by the position, the new gradient point should be + /// inserted at the position in which the order is still preserved. + public void insertAtPos (int insertionPos, double gradientPos, + ColorCafe gradientColor) + { + // Make room for the new gradient point at the specified insertion position + // within the gradient point array. The insertion position is determined by + // the gradient point's position; the gradient points must be sorted by + // gradient position within that array. + GradientPoint [] newGradientPoints; + newGradientPoints = new GradientPoint[gradientPointCount + 1]; + + for (int t = 0; t < (gradientPointCount + 1); t++) + newGradientPoints[t] = new GradientPoint(); + + + + for (int i = 0; i < gradientPointCount; i++) + { + if (i < insertionPos) + newGradientPoints[i] = gradientPoints[i]; + else + newGradientPoints[i + 1] = gradientPoints[i]; + } + + gradientPoints = newGradientPoints; + ++gradientPointCount; + + // Now that we've made room for the new gradient point within the array, add + // the new gradient point. + gradientPoints[insertionPos].position = gradientPos; + gradientPoints[insertionPos].color = gradientColor; + } + + /// Returns a pointer to the array of gradient points in this object. + /// + /// @returns A pointer to the array of gradient points. + /// + /// Before calling this method, call getGradientPointCount() to + /// determine the number of gradient points in this array. + /// + /// It is recommended that an application does not store this pointer + /// for later use since the pointer to the array may change if the + /// application calls another method of this object. + public GradientPoint[] getGradientPointArray () + { + return gradientPoints; + } + + /// Returns the number of gradient points stored in this object. + /// + /// @returns The number of gradient points stored in this object. + public int getGradientPointCount () + { + return gradientPointCount; + } + +} diff --git a/src/libnoiseforjava/util/GradientPoint.java b/src/libnoiseforjava/util/GradientPoint.java index 8711d67..b48dab6 100644 --- a/src/libnoiseforjava/util/GradientPoint.java +++ b/src/libnoiseforjava/util/GradientPoint.java @@ -1,74 +1,74 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -public class GradientPoint -{ - /// Defines a point used to build a color gradient. - /// - /// A color gradient is a list of gradually-changing colors. A color - /// gradient is defined by a list of gradient points. Each - /// gradient point has a position and a color. In a color gradient, the - /// colors between two adjacent gradient points are linearly interpolated. - /// - /// The ColorGradient class defines a color gradient by a list of these - /// objects. - - double position; - ColorCafe color; - - public GradientPoint() - { - position = 0.0; - color = new ColorCafe(0,0,0,0); - } - - public GradientPoint(double position, ColorCafe color) - { - this.position = position; - this.color = color; - } - - public double getPosition() - { - return position; - } - - public ColorCafe getColor() - { - return color; - } - - public void setPosition(double position) - { - this.position = position; - } - - public void setColor(ColorCafe color) - { - this.color = color; - } -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +public class GradientPoint +{ + /// Defines a point used to build a color gradient. + /// + /// A color gradient is a list of gradually-changing colors. A color + /// gradient is defined by a list of gradient points. Each + /// gradient point has a position and a color. In a color gradient, the + /// colors between two adjacent gradient points are linearly interpolated. + /// + /// The ColorGradient class defines a color gradient by a list of these + /// objects. + + double position; + ColorCafe color; + + public GradientPoint() + { + position = 0.0; + color = new ColorCafe(0,0,0,0); + } + + public GradientPoint(double position, ColorCafe color) + { + this.position = position; + this.color = color; + } + + public double getPosition() + { + return position; + } + + public ColorCafe getColor() + { + return color; + } + + public void setPosition(double position) + { + this.position = position; + } + + public void setColor(ColorCafe color) + { + this.color = color; + } +} diff --git a/src/libnoiseforjava/util/ImageCafe.java b/src/libnoiseforjava/util/ImageCafe.java index 192e93d..746e700 100644 --- a/src/libnoiseforjava/util/ImageCafe.java +++ b/src/libnoiseforjava/util/ImageCafe.java @@ -1,173 +1,173 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class ImageCafe -{ - - /// Implements an image, a 2-dimensional array of color values. - /// - /// An image can be used to store a color texture. - /// - /// These color values are of type ColorCafe. - /// - /// The size (width and height) of the image can be specified during - /// object construction. - /// - /// The getValue() and setValue() methods can be used to access individual - /// color values stored in the image. - /// - /// - /// Border Values - /// - /// All of the color values outside of the image are assumed to have a - /// common color value known as the border value. - /// - /// To set the border value, call the setBorderValue() method. - /// - /// The getValue() method returns the border value if the specified - /// position lies outside of the image. - /// - - /// The Color value used for all positions outside of the image. - ColorCafe borderValue; - - /// The current height of the image. - int height; - - /// The current width of the image. - int width; - - /// Array of ColorCafes holding the color values - ColorCafe [][] imageCafeColors; - - public ImageCafe (int width, int height) throws ExceptionInvalidParam - { - setSize (width, height); - borderValue = new ColorCafe (0, 0, 0, 0); - imageCafeColors = new ColorCafe[width][height]; - } - - /// Returns a color value from the specified position in the image. - /// - /// @param x The x coordinate of the position. - /// @param y The y coordinate of the position. - /// - /// @returns The color value at that position. - /// - /// This method returns the border value if the coordinates exist - /// outside of the image. - public ColorCafe getValue (int x, int y) - { - if (x >= 0 && x < width && y >= 0 && y < height) - return imageCafeColors[x][y]; - else - // The coordinates specified are outside the image. Return the border - // value. - return borderValue; - } - - /// Sets the new size for the image. - /// - /// @param width The new width for the image. - /// @param height The new height for the image. - /// - /// @pre The width and height values are positive. - /// @pre The width and height values do not exceed the maximum - /// possible width and height for the image. - /// - /// @throw ExceptionInvalidParam See the preconditions. - public void setSize (int width, int height) throws ExceptionInvalidParam - { - if (width < 0 || height < 0) - // Invalid width or height. - throw new ExceptionInvalidParam ("Invalid Parameter in ImageCafe"); - else - { - this.width = width; - this.height = height; - } - } - - /// Sets a color value at a specified position in the image. - /// - /// @param x The x coordinate of the position. - /// @param y The y coordinate of the position. - /// @param value The color value to set at the given position. - /// - /// This method does nothing if the image is empty or the position is - /// outside the bounds of the image. - public void setValue (int x, int y, ColorCafe value) - { - if (x >= 0 && x < width && y >= 0 && y < height) - this.imageCafeColors[x][y] = value; - } - - - /// Returns the color value used for all positions outside of the - /// image. - /// - /// @returns The color value used for all positions outside of the - /// image. - /// - /// All positions outside of the image are assumed to have a common - /// color value known as the border value. - public ColorCafe getBorderValue () - { - return borderValue; - } - - /// Returns the height of the image. - /// - /// @returns The height of the image. - public int getHeight () - { - return height; - } - - /// Returns the width of the image. - /// - /// @returns The width of the image. - public int getWidth () - { - return width; - } - - /// Sets the color value to use for all positions outside of the - /// image. - /// - /// @param borderValue The color value to use for all positions - /// outside of the image. - /// - /// All positions outside of the image are assumed to have a common - /// color value known as the border value. - public void setBorderValue (ColorCafe borderValue) - { - this.borderValue = borderValue; - } -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class ImageCafe +{ + + /// Implements an image, a 2-dimensional array of color values. + /// + /// An image can be used to store a color texture. + /// + /// These color values are of type ColorCafe. + /// + /// The size (width and height) of the image can be specified during + /// object construction. + /// + /// The getValue() and setValue() methods can be used to access individual + /// color values stored in the image. + /// + /// + /// Border Values + /// + /// All of the color values outside of the image are assumed to have a + /// common color value known as the border value. + /// + /// To set the border value, call the setBorderValue() method. + /// + /// The getValue() method returns the border value if the specified + /// position lies outside of the image. + /// + + /// The Color value used for all positions outside of the image. + ColorCafe borderValue; + + /// The current height of the image. + int height; + + /// The current width of the image. + int width; + + /// Array of ColorCafes holding the color values + ColorCafe [][] imageCafeColors; + + public ImageCafe (int width, int height) throws ExceptionInvalidParam + { + setSize (width, height); + borderValue = new ColorCafe (0, 0, 0, 0); + imageCafeColors = new ColorCafe[width][height]; + } + + /// Returns a color value from the specified position in the image. + /// + /// @param x The x coordinate of the position. + /// @param y The y coordinate of the position. + /// + /// @returns The color value at that position. + /// + /// This method returns the border value if the coordinates exist + /// outside of the image. + public ColorCafe getValue (int x, int y) + { + if (x >= 0 && x < width && y >= 0 && y < height) + return imageCafeColors[x][y]; + else + // The coordinates specified are outside the image. Return the border + // value. + return borderValue; + } + + /// Sets the new size for the image. + /// + /// @param width The new width for the image. + /// @param height The new height for the image. + /// + /// @pre The width and height values are positive. + /// @pre The width and height values do not exceed the maximum + /// possible width and height for the image. + /// + /// @throw ExceptionInvalidParam See the preconditions. + public void setSize (int width, int height) throws ExceptionInvalidParam + { + if (width < 0 || height < 0) + // Invalid width or height. + throw new ExceptionInvalidParam ("Invalid Parameter in ImageCafe"); + else + { + this.width = width; + this.height = height; + } + } + + /// Sets a color value at a specified position in the image. + /// + /// @param x The x coordinate of the position. + /// @param y The y coordinate of the position. + /// @param value The color value to set at the given position. + /// + /// This method does nothing if the image is empty or the position is + /// outside the bounds of the image. + public void setValue (int x, int y, ColorCafe value) + { + if (x >= 0 && x < width && y >= 0 && y < height) + this.imageCafeColors[x][y] = value; + } + + + /// Returns the color value used for all positions outside of the + /// image. + /// + /// @returns The color value used for all positions outside of the + /// image. + /// + /// All positions outside of the image are assumed to have a common + /// color value known as the border value. + public ColorCafe getBorderValue () + { + return borderValue; + } + + /// Returns the height of the image. + /// + /// @returns The height of the image. + public int getHeight () + { + return height; + } + + /// Returns the width of the image. + /// + /// @returns The width of the image. + public int getWidth () + { + return width; + } + + /// Sets the color value to use for all positions outside of the + /// image. + /// + /// @param borderValue The color value to use for all positions + /// outside of the image. + /// + /// All positions outside of the image are assumed to have a common + /// color value known as the border value. + public void setBorderValue (ColorCafe borderValue) + { + this.borderValue = borderValue; + } +} diff --git a/src/libnoiseforjava/util/MiscUtilities.java b/src/libnoiseforjava/util/MiscUtilities.java index 6b0c1c3..0ed86ca 100644 --- a/src/libnoiseforjava/util/MiscUtilities.java +++ b/src/libnoiseforjava/util/MiscUtilities.java @@ -1,52 +1,56 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -public class MiscUtilities -{ - - // Performs linear interpolation between two 8-bit channel values. - public static short blendChannel (int red, int red2, float alpha) - { - double c0 = (float)red / 255.0; - double c1 = (float)red2 / 255.0; - return (short)(((c1 * alpha) + (c0 * (1.0f - alpha))) * 255.0f); - } - - // Performs linear interpolation between two colors - public static ColorCafe linearInterpColor (ColorCafe color0, ColorCafe color1, - float alpha) - { - ColorCafe color = new ColorCafe( - blendChannel (color0.red, color1.red, alpha), - blendChannel (color0.green, color1.green, alpha), - blendChannel (color0.blue, color1.blue, alpha), - blendChannel (color0.alpha, color1.alpha, alpha) - ); - return color; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +public class MiscUtilities +{ + + /** + * Performs linear interpolation between two 8-bit channel values. + */ + public static short blendChannel (int red, int red2, float alpha) + { + double c0 = (float)red / 255.0; + double c1 = (float)red2 / 255.0; + return (short)(((c1 * alpha) + (c0 * (1.0f - alpha))) * 255.0f); + } + + /** + * Performs linear interpolation between two colors + */ + public static ColorCafe linearInterpColor (ColorCafe color0, ColorCafe color1, + float alpha) + { + ColorCafe color = new ColorCafe( + blendChannel (color0.red, color1.red, alpha), + blendChannel (color0.green, color1.green, alpha), + blendChannel (color0.blue, color1.blue, alpha), + blendChannel (color0.alpha, color1.alpha, alpha) + ); + return color; + } + +} diff --git a/src/libnoiseforjava/util/NoiseMap.java b/src/libnoiseforjava/util/NoiseMap.java index 551270b..ca27ddf 100644 --- a/src/libnoiseforjava/util/NoiseMap.java +++ b/src/libnoiseforjava/util/NoiseMap.java @@ -1,150 +1,171 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class NoiseMap -{ - /// Implements a noise map, a 2-dimensional array of floating-point - /// values. - /// - /// A noise map is designed to store coherent-noise values generated by a - /// noise module, although it can store values from any source. A noise - /// map is often used as a terrain height map or a grayscale texture. - /// - /// The size (width and height) of the noise map can be specified during - /// object construction. - /// - /// The getValue() method can be used to access individual - /// values stored in the noise map. - /// - - - /// The height of the noise map. - int height; - - /// The width of the noise map. - int width; - - /// The array of doubles holding the noise map values - double [] [] noiseMap; - - double borderValue; - - public NoiseMap (int width, int height) throws ExceptionInvalidParam - { - setSize (width, height); - noiseMap = new double [width][height]; - borderValue = 0.0; - } - - /// Returns a value from the specified position in the noise map. - /// - /// @param x The x coordinate of the position. - /// @param y The y coordinate of the position. - /// - /// @returns The value at that position. - /// - /// This method returns the border value if the coordinates exist - /// outside of the noise map. - public double getValue (int x, int y) - { - if (x >= 0 && x < width && y >= 0 && y < height) - return noiseMap[x] [y]; - // The coordinates specified are outside the noise map. Return the border - // value. - else - return borderValue; - } - - public void setSize (int width, int height) throws ExceptionInvalidParam - { - if (width < 1 || height < 1) - // Invalid width or height. - throw new ExceptionInvalidParam ("Invalid parameter in NoiseMap"); - else - { - this.width = width; - this.height = height; - } - } - - /// Sets a value at a specified position in the noise map. - /// - /// @param x The x coordinate of the position. - /// @param y The y coordinate of the position. - /// @param value The value to set at the given position. - /// - /// This method does nothing if the noise map object is empty or the - /// position is outside the bounds of the noise map. - public void setValue (int x, int y, double value) - { - if (x >= 0 && x < width && y >= 0 && y < height) - this.noiseMap[x][y]= value; - } - - /// Returns the value used for all positions outside of the noise map. - /// - /// @returns The value used for all positions outside of the noise - /// map. - /// - /// All positions outside of the noise map are assumed to have a - /// common value known as the border value. - public double getBorderValue () - { - return borderValue; - } - - /// Returns the height of the noise map. - /// - /// @returns The height of the noise map. - public int getHeight () - { - return height; - } - - /// Returns the width of the noise map. - /// - /// @returns The width of the noise map. - public int getWidth () - { - return width; - } - - /// Sets the value to use for all positions outside of the noise map. - /// - /// @param borderValue The value to use for all positions outside of - /// the noise map. - /// - /// All positions outside of the noise map are assumed to have a - /// common value known as the border value. - public void setBorderValue (double borderValue) - { - this.borderValue = borderValue; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +/** + * Implements a noise map, a 2-dimensional array of floating-point + * values. + *

+ * A noise map is designed to store coherent-noise values generated by a + * noise module, although it can store values from any source. A noise + * map is often used as a terrain height map or a grayscale texture.
+ * + * The size (width and height) of the noise map can be specified during + * object construction.
+ * + * The getValue() method can be used to access individual + * values stored in the noise map. + *

+ */ +public class NoiseMap +{ + + /** + * The height of the noise map. + */ + int height; + + /** + * The width of the noise map. + */ + int width; + + /** + * The array of doubles holding the noise map values + */ + double[][] noiseMap; + + double borderValue; + + public NoiseMap (int width, int height) throws ExceptionInvalidParam + { + setSize (width, height); + noiseMap = new double [width][height]; + borderValue = 0.0; + } + + /** + * Returns a value from the specified position in the noise map. + * This method returns the border value if the coordinates exist + * outside of the noise map. + * + * @param x The x coordinate of the position. + * @param y The y coordinate of the position. + * @return The value at that position. + */ + public double getValue (int x, int y) + { + if (x >= 0 && x < width && y >= 0 && y < height) + return noiseMap[x] [y]; + // The coordinates specified are outside the noise map. Return the border + // value. + else + return borderValue; + } + + public void setSize (int width, int height) throws ExceptionInvalidParam + { + if (width < 1 || height < 1) + // Invalid width or height. + throw new ExceptionInvalidParam ("Invalid parameter in NoiseMap"); + else + { + this.width = width; + this.height = height; + } + } + + /** + * Sets a value at a specified position in the noise map. + * This method does nothing if the noise map object is empty or the + * position is outside the bounds of the noise map. + * + * @param x The x coordinate of the position. + * @param y The y coordinate of the position. + * @param value The value to set at the given position. + */ + public void setValue (int x, int y, double value) + { + if (x >= 0 && x < width && y >= 0 && y < height) + this.noiseMap[x][y]= value; + } + + /** + * Returns the value used for all positions outside of the noise map. + * All positions outside of the noise map are assumed to have a + * common value known as the border value. + * + * @return The value used for all positions outside of the noise map. + */ + public double getBorderValue () + { + return borderValue; + } + + /** + * Returns the height of the noise map. + * + * @return The height of the noise map. + */ + public int getHeight () + { + return height; + } + + /** + * Returns the width of the noise map. + * + * @return The width of the noise map. + */ + public int getWidth () + { + return width; + } + + /** + * Sets the value to use for all positions outside of the noise map. + * All positions outside of the noise map are assumed to have a + * common value known as the border value. + * + * @param borderValue The value to use for all positions outside of + * the noise map. + */ + public void setBorderValue (double borderValue) + { + this.borderValue = borderValue; + } + + public double[][] getNoiseMap() { + return noiseMap; + } + + public void setNoiseMap(double[][] noiseMap) { + this.noiseMap = noiseMap; + } + +} diff --git a/src/libnoiseforjava/util/NoiseMapBuilder.java b/src/libnoiseforjava/util/NoiseMapBuilder.java index d7873de..a091226 100644 --- a/src/libnoiseforjava/util/NoiseMapBuilder.java +++ b/src/libnoiseforjava/util/NoiseMapBuilder.java @@ -1,195 +1,195 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -import libnoiseforjava.exception.ExceptionInvalidParam; -import libnoiseforjava.module.ModuleBase; - -public class NoiseMapBuilder -{ - - /// Base class for a noise-map builder - /// - /// A builder class builds a noise map by filling it with coherent-noise - /// values generated from the surface of a three-dimensional mathematical - /// object. Each builder class defines a specific three-dimensional - /// surface, such as a cylinder, sphere, or plane. - /// - /// A builder class describes these input values using a coordinate system - /// applicable for the mathematical object (e.g., a latitude/longitude - /// coordinate system for the spherical noise-map builder.) It then - /// "flattens" these coordinates onto a plane so that it can write the - /// coherent-noise values into a two-dimensional noise map. - /// - /// Building the Noise Map - /// - /// To build the noise map, perform the following steps: - /// - Pass the bounding coordinates to the setBounds() method. - /// - Pass the noise map size, in points, to the setDestSize() method. - /// - Pass a NoiseMap object to the setDestNoiseMap() method. - /// - Pass a noise module (derived from ModuleBase) to the - /// setSourceModule() method. - /// - Call the build() method. - /// - /// Note that setBounds() is not defined in the base class; it is - /// only defined in the derived classes. This is because each model uses - /// a different coordinate system. - - - /// Count of rows completed - int callback; - - /// Height of the destination noise map, in points. - int destHeight; - - /// Width of the destination noise map, in points. - int destWidth; - - /// Destination noise map that will contain the coherent-noise values. - NoiseMap destNoiseMap; - - /// Source noise module that will generate the coherent-noise values. - ModuleBase sourceModule; - - - public NoiseMapBuilder () throws ExceptionInvalidParam - { - callback = 0; - destHeight = 0; - destWidth = 0; - destNoiseMap = new NoiseMap(1,1); - sourceModule = new ModuleBase(0); - } - - public NoiseMapBuilder (int height, int width) throws ExceptionInvalidParam - { - callback = 0; - destHeight = 0; - destWidth = 0; - destNoiseMap = new NoiseMap(height,width); - sourceModule = new ModuleBase(0); - } - - /// Builds the noise map. - /// - /// @pre setBounds() was previously called. - /// @pre setDestNoiseMap() was previously called. - /// @pre setSourceModule() was previously called. - /// @pre The width and height values specified by setDestSize() are - /// positive. - /// @pre The width and height values specified by setDestSize() do not - /// exceed the maximum possible width and height for the noise map. - /// - /// @post The original contents of the destination noise map is - /// destroyed. - /// - /// @throw ExceptionInvalidParam See the preconditions. - /// @throw ExceptionOutOfMemory Out of memory. - /// - /// If this method is successful, the destination noise map contains - /// the coherent-noise values from the noise module specified by - /// setSourceModule(). - public void build () throws ExceptionInvalidParam - { - //override in child classes - } - - /// Returns the height of the destination noise map. - /// - /// @returns The height of the destination noise map, in points. - /// - /// This object does not change the height in the destination noise - /// map object until the build() method is called. - public double getDestHeight () - { - return destHeight; - } - - /// Returns the width of the destination noise map. - /// - /// @returns The width of the destination noise map, in points. - /// - /// This object does not change the height in the destination noise - /// map object until the build() method is called. - public double getDestWidth () - { - return destWidth; - } - - /// Sets the destination noise map. - /// - /// @param destNoiseMap The destination noise map. - /// - /// The destination noise map will contain the coherent-noise values - /// from this noise map after a successful call to the build() method. - /// - /// The destination noise map must exist throughout the lifetime of - /// this object unless another noise map replaces that noise map. - public void setDestNoiseMap (NoiseMap destNoiseMap) - { - this.destNoiseMap = destNoiseMap; - } - - /// Sets the source module. - /// - /// @param sourceModule The source module. - /// - /// This object fills in a noise map with the coherent-noise values - /// from this source module. - /// - /// The source module must exist throughout the lifetime of this - /// object unless another noise module replaces that noise module. - public void setSourceModule (ModuleBase sourceModule) - { - this.sourceModule = sourceModule; - } - - /// Sets the size of the destination noise map. - /// - /// @param destWidth The width of the destination noise map, in - /// points. - /// @param destHeight The height of the destination noise map, in - /// points. - /// - /// This method does not change the size of the destination noise map - /// until the build() method is called. - public void setDestSize (int destWidth, int destHeight) - { - this.destWidth = destWidth ; - this.destHeight = destHeight; - } - - public NoiseMap getDestNoiseMap() - { - return destNoiseMap; - } - - void setCallback (int callback) - { - this.callback = callback; - } - +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +import libnoiseforjava.exception.ExceptionInvalidParam; +import libnoiseforjava.module.ModuleBase; + +public class NoiseMapBuilder +{ + + /// Base class for a noise-map builder + /// + /// A builder class builds a noise map by filling it with coherent-noise + /// values generated from the surface of a three-dimensional mathematical + /// object. Each builder class defines a specific three-dimensional + /// surface, such as a cylinder, sphere, or plane. + /// + /// A builder class describes these input values using a coordinate system + /// applicable for the mathematical object (e.g., a latitude/longitude + /// coordinate system for the spherical noise-map builder.) It then + /// "flattens" these coordinates onto a plane so that it can write the + /// coherent-noise values into a two-dimensional noise map. + /// + /// Building the Noise Map + /// + /// To build the noise map, perform the following steps: + /// - Pass the bounding coordinates to the setBounds() method. + /// - Pass the noise map size, in points, to the setDestSize() method. + /// - Pass a NoiseMap object to the setDestNoiseMap() method. + /// - Pass a noise module (derived from ModuleBase) to the + /// setSourceModule() method. + /// - Call the build() method. + /// + /// Note that setBounds() is not defined in the base class; it is + /// only defined in the derived classes. This is because each model uses + /// a different coordinate system. + + + /// Count of rows completed + int callback; + + /// Height of the destination noise map, in points. + int destHeight; + + /// Width of the destination noise map, in points. + int destWidth; + + /// Destination noise map that will contain the coherent-noise values. + NoiseMap destNoiseMap; + + /// Source noise module that will generate the coherent-noise values. + ModuleBase sourceModule; + + + public NoiseMapBuilder () throws ExceptionInvalidParam + { + callback = 0; + destHeight = 0; + destWidth = 0; + destNoiseMap = new NoiseMap(1,1); + sourceModule = new ModuleBase(0); + } + + public NoiseMapBuilder (int height, int width) throws ExceptionInvalidParam + { + callback = 0; + destHeight = 0; + destWidth = 0; + destNoiseMap = new NoiseMap(height,width); + sourceModule = new ModuleBase(0); + } + + /// Builds the noise map. + /// + /// @pre setBounds() was previously called. + /// @pre setDestNoiseMap() was previously called. + /// @pre setSourceModule() was previously called. + /// @pre The width and height values specified by setDestSize() are + /// positive. + /// @pre The width and height values specified by setDestSize() do not + /// exceed the maximum possible width and height for the noise map. + /// + /// @post The original contents of the destination noise map is + /// destroyed. + /// + /// @throw ExceptionInvalidParam See the preconditions. + /// @throw ExceptionOutOfMemory Out of memory. + /// + /// If this method is successful, the destination noise map contains + /// the coherent-noise values from the noise module specified by + /// setSourceModule(). + public void build () throws ExceptionInvalidParam + { + //override in child classes + } + + /// Returns the height of the destination noise map. + /// + /// @returns The height of the destination noise map, in points. + /// + /// This object does not change the height in the destination noise + /// map object until the build() method is called. + public double getDestHeight () + { + return destHeight; + } + + /// Returns the width of the destination noise map. + /// + /// @returns The width of the destination noise map, in points. + /// + /// This object does not change the height in the destination noise + /// map object until the build() method is called. + public double getDestWidth () + { + return destWidth; + } + + /// Sets the destination noise map. + /// + /// @param destNoiseMap The destination noise map. + /// + /// The destination noise map will contain the coherent-noise values + /// from this noise map after a successful call to the build() method. + /// + /// The destination noise map must exist throughout the lifetime of + /// this object unless another noise map replaces that noise map. + public void setDestNoiseMap (NoiseMap destNoiseMap) + { + this.destNoiseMap = destNoiseMap; + } + + /// Sets the source module. + /// + /// @param sourceModule The source module. + /// + /// This object fills in a noise map with the coherent-noise values + /// from this source module. + /// + /// The source module must exist throughout the lifetime of this + /// object unless another noise module replaces that noise module. + public void setSourceModule (ModuleBase sourceModule) + { + this.sourceModule = sourceModule; + } + + /// Sets the size of the destination noise map. + /// + /// @param destWidth The width of the destination noise map, in + /// points. + /// @param destHeight The height of the destination noise map, in + /// points. + /// + /// This method does not change the size of the destination noise map + /// until the build() method is called. + public void setDestSize (int destWidth, int destHeight) + { + this.destWidth = destWidth ; + this.destHeight = destHeight; + } + + public NoiseMap getDestNoiseMap() + { + return destNoiseMap; + } + + void setCallback (int callback) + { + this.callback = callback; + } + } \ No newline at end of file diff --git a/src/libnoiseforjava/util/NoiseMapBuilderCylinder.java b/src/libnoiseforjava/util/NoiseMapBuilderCylinder.java index 6bd3513..4d33219 100644 --- a/src/libnoiseforjava/util/NoiseMapBuilderCylinder.java +++ b/src/libnoiseforjava/util/NoiseMapBuilderCylinder.java @@ -1,213 +1,213 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -import libnoiseforjava.exception.ExceptionInvalidParam; -import libnoiseforjava.model.Cylinder; - -public class NoiseMapBuilderCylinder extends NoiseMapBuilder -{ - - /// Builds a cylindrical noise map. - /// - /// This class builds a noise map by filling it with coherent-noise values - /// generated from the surface of a cylinder. - /// - /// This class describes these input values using an (angle, height) - /// coordinate system. After generating the coherent-noise value from the - /// input value, it then "flattens" these coordinates onto a plane so that - /// it can write the values into a two-dimensional noise map. - /// - /// The cylinder model has a radius of 1.0 unit and has infinite height. - /// The cylinder is oriented along the @a y axis. Its center is at the - /// origin. - /// - /// The x coordinate in the noise map represents the angle around the - /// cylinder's y axis. The y coordinate in the noise map represents the - /// height above the x-z plane. - /// - /// The application must provide the lower and upper angle bounds of the - /// noise map, in degrees, and the lower and upper height bounds of the - /// noise map, in units. - - /// Lower angle boundary of the cylindrical noise map, in degrees. - double lowerAngleBound; - - /// Lower height boundary of the cylindrical noise map, in units. - double lowerHeightBound; - - /// Upper angle boundary of the cylindrical noise map, in degrees. - double upperAngleBound; - - /// Upper height boundary of the cylindrical noise map, in units. - double upperHeightBound; - - - - public NoiseMapBuilderCylinder () throws ExceptionInvalidParam - { - super(); - lowerAngleBound = 0.0; - lowerHeightBound = 0.0; - upperAngleBound = 0.0; - upperHeightBound = 0.0; - } - - public void build () throws ExceptionInvalidParam - { - if (upperAngleBound <= lowerAngleBound - || upperHeightBound <= lowerHeightBound - || destWidth <= 0 - || destHeight <= 0 - || sourceModule == null - || destNoiseMap == null) - throw new ExceptionInvalidParam ("Invalid Parameter in NoiseMapBuilderCylinder"); - - - // Resize the destination noise map so that it can store the new output - // values from the source model. - destNoiseMap.setSize (destWidth, destHeight); - - // Create the cylinder model. - Cylinder cylinderModel = new Cylinder(); - cylinderModel.setModule (sourceModule); - - double angleExtent = upperAngleBound - lowerAngleBound ; - double heightExtent = upperHeightBound - lowerHeightBound; - double xDelta = angleExtent / (double)destWidth ; - double yDelta = heightExtent / (double)destHeight; - double curAngle = lowerAngleBound ; - double curHeight = lowerHeightBound; - - // Fill every point in the noise map with the output values from the model. - for (int y = 0; y < destHeight; y++) - { - curAngle = lowerAngleBound; - for (int x = 0; x < destWidth; x++) - { - float curValue = (float)cylinderModel.getValue (curAngle, curHeight); - destNoiseMap.setValue(x, y, curValue); - curAngle += xDelta; - } - curHeight += yDelta; - setCallback (y); - } - } - - /// Returns the lower angle boundary of the cylindrical noise map. - /// - /// @returns The lower angle boundary of the noise map, in degrees. - public double getLowerAngleBound () - { - return lowerAngleBound; - } - - /// Returns the lower height boundary of the cylindrical noise map. - /// - /// @returns The lower height boundary of the noise map, in units. - /// - /// One unit is equal to the radius of the cylinder. - public double getLowerHeightBound () - { - return lowerHeightBound; - } - - /// Returns the upper angle boundary of the cylindrical noise map. - /// - /// @returns The upper angle boundary of the noise map, in degrees. - public double GetUpperAngleBound () - { - return upperAngleBound; - } - - /// Returns the upper height boundary of the cylindrical noise map. - /// - /// @returns The upper height boundary of the noise map, in units. - /// - /// One unit is equal to the radius of the cylinder. - public double getUpperHeightBound () - { - return upperHeightBound; - } - - /// Sets the coordinate boundaries of the noise map. - /// - /// @param lowerAngleBound The lower angle boundary of the noise map, - /// in degrees. - /// @param upperAngleBound The upper angle boundary of the noise map, - /// in degrees. - /// @param lowerHeightBound The lower height boundary of the noise - /// map, in units. - /// @param upperHeightBound The upper height boundary of the noise - /// map, in units. - /// - /// @pre The lower angle boundary is less than the upper angle - /// boundary. - /// @pre The lower height boundary is less than the upper height - /// boundary. - /// - /// @throw noise::ExceptionInvalidParam See the preconditions. - /// - /// One unit is equal to the radius of the cylinder. - public void setBounds (double lowerAngleBound, double upperAngleBound, - double lowerHeightBound, double upperHeightBound) throws ExceptionInvalidParam - { - if (lowerAngleBound >= upperAngleBound - || lowerHeightBound >= upperHeightBound) - throw new ExceptionInvalidParam ("Invalid Parameter in NoiseMapBuilder Cylinder"); - - this.lowerAngleBound = lowerAngleBound ; - this.upperAngleBound = upperAngleBound ; - this.lowerHeightBound = lowerHeightBound; - this.upperHeightBound = upperHeightBound; - } - - public double getUpperAngleBound() - { - return upperAngleBound; - } - - public void setLowerAngleBound(double lowerAngleBound) - { - this.lowerAngleBound = lowerAngleBound; - } - - public void setLowerHeightBound(double lowerHeightBound) - { - this.lowerHeightBound = lowerHeightBound; - } - - public void setUpperAngleBound(double upperAngleBound) - { - this.upperAngleBound = upperAngleBound; - } - - public void setUpperHeightBound(double upperHeightBound) - { - this.upperHeightBound = upperHeightBound; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +import libnoiseforjava.exception.ExceptionInvalidParam; +import libnoiseforjava.model.Cylinder; + +public class NoiseMapBuilderCylinder extends NoiseMapBuilder +{ + + /// Builds a cylindrical noise map. + /// + /// This class builds a noise map by filling it with coherent-noise values + /// generated from the surface of a cylinder. + /// + /// This class describes these input values using an (angle, height) + /// coordinate system. After generating the coherent-noise value from the + /// input value, it then "flattens" these coordinates onto a plane so that + /// it can write the values into a two-dimensional noise map. + /// + /// The cylinder model has a radius of 1.0 unit and has infinite height. + /// The cylinder is oriented along the @a y axis. Its center is at the + /// origin. + /// + /// The x coordinate in the noise map represents the angle around the + /// cylinder's y axis. The y coordinate in the noise map represents the + /// height above the x-z plane. + /// + /// The application must provide the lower and upper angle bounds of the + /// noise map, in degrees, and the lower and upper height bounds of the + /// noise map, in units. + + /// Lower angle boundary of the cylindrical noise map, in degrees. + double lowerAngleBound; + + /// Lower height boundary of the cylindrical noise map, in units. + double lowerHeightBound; + + /// Upper angle boundary of the cylindrical noise map, in degrees. + double upperAngleBound; + + /// Upper height boundary of the cylindrical noise map, in units. + double upperHeightBound; + + + + public NoiseMapBuilderCylinder () throws ExceptionInvalidParam + { + super(); + lowerAngleBound = 0.0; + lowerHeightBound = 0.0; + upperAngleBound = 0.0; + upperHeightBound = 0.0; + } + + public void build () throws ExceptionInvalidParam + { + if (upperAngleBound <= lowerAngleBound + || upperHeightBound <= lowerHeightBound + || destWidth <= 0 + || destHeight <= 0 + || sourceModule == null + || destNoiseMap == null) + throw new ExceptionInvalidParam ("Invalid Parameter in NoiseMapBuilderCylinder"); + + + // Resize the destination noise map so that it can store the new output + // values from the source model. + destNoiseMap.setSize (destWidth, destHeight); + + // Create the cylinder model. + Cylinder cylinderModel = new Cylinder(); + cylinderModel.setModule (sourceModule); + + double angleExtent = upperAngleBound - lowerAngleBound ; + double heightExtent = upperHeightBound - lowerHeightBound; + double xDelta = angleExtent / (double)destWidth ; + double yDelta = heightExtent / (double)destHeight; + double curAngle = lowerAngleBound ; + double curHeight = lowerHeightBound; + + // Fill every point in the noise map with the output values from the model. + for (int y = 0; y < destHeight; y++) + { + curAngle = lowerAngleBound; + for (int x = 0; x < destWidth; x++) + { + float curValue = (float)cylinderModel.getValue (curAngle, curHeight); + destNoiseMap.setValue(x, y, curValue); + curAngle += xDelta; + } + curHeight += yDelta; + setCallback (y); + } + } + + /// Returns the lower angle boundary of the cylindrical noise map. + /// + /// @returns The lower angle boundary of the noise map, in degrees. + public double getLowerAngleBound () + { + return lowerAngleBound; + } + + /// Returns the lower height boundary of the cylindrical noise map. + /// + /// @returns The lower height boundary of the noise map, in units. + /// + /// One unit is equal to the radius of the cylinder. + public double getLowerHeightBound () + { + return lowerHeightBound; + } + + /// Returns the upper angle boundary of the cylindrical noise map. + /// + /// @returns The upper angle boundary of the noise map, in degrees. + public double GetUpperAngleBound () + { + return upperAngleBound; + } + + /// Returns the upper height boundary of the cylindrical noise map. + /// + /// @returns The upper height boundary of the noise map, in units. + /// + /// One unit is equal to the radius of the cylinder. + public double getUpperHeightBound () + { + return upperHeightBound; + } + + /// Sets the coordinate boundaries of the noise map. + /// + /// @param lowerAngleBound The lower angle boundary of the noise map, + /// in degrees. + /// @param upperAngleBound The upper angle boundary of the noise map, + /// in degrees. + /// @param lowerHeightBound The lower height boundary of the noise + /// map, in units. + /// @param upperHeightBound The upper height boundary of the noise + /// map, in units. + /// + /// @pre The lower angle boundary is less than the upper angle + /// boundary. + /// @pre The lower height boundary is less than the upper height + /// boundary. + /// + /// @throw noise::ExceptionInvalidParam See the preconditions. + /// + /// One unit is equal to the radius of the cylinder. + public void setBounds (double lowerAngleBound, double upperAngleBound, + double lowerHeightBound, double upperHeightBound) throws ExceptionInvalidParam + { + if (lowerAngleBound >= upperAngleBound + || lowerHeightBound >= upperHeightBound) + throw new ExceptionInvalidParam ("Invalid Parameter in NoiseMapBuilder Cylinder"); + + this.lowerAngleBound = lowerAngleBound ; + this.upperAngleBound = upperAngleBound ; + this.lowerHeightBound = lowerHeightBound; + this.upperHeightBound = upperHeightBound; + } + + public double getUpperAngleBound() + { + return upperAngleBound; + } + + public void setLowerAngleBound(double lowerAngleBound) + { + this.lowerAngleBound = lowerAngleBound; + } + + public void setLowerHeightBound(double lowerHeightBound) + { + this.lowerHeightBound = lowerHeightBound; + } + + public void setUpperAngleBound(double upperAngleBound) + { + this.upperAngleBound = upperAngleBound; + } + + public void setUpperHeightBound(double upperHeightBound) + { + this.upperHeightBound = upperHeightBound; + } + +} diff --git a/src/libnoiseforjava/util/NoiseMapBuilderPlane.java b/src/libnoiseforjava/util/NoiseMapBuilderPlane.java index fbd8f97..20e5fcb 100644 --- a/src/libnoiseforjava/util/NoiseMapBuilderPlane.java +++ b/src/libnoiseforjava/util/NoiseMapBuilderPlane.java @@ -1,245 +1,245 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -import libnoiseforjava.Interp; -import libnoiseforjava.exception.ExceptionInvalidParam; -import libnoiseforjava.model.Plane; - -public class NoiseMapBuilderPlane extends NoiseMapBuilder -{ - /// Builds a planar noise map. - /// - /// This class builds a noise map by filling it with coherent-noise values - /// generated from the surface of a plane. - /// - /// This class describes these input values using (x, z) coordinates. - /// Their y coordinates are always 0.0. - /// - /// The application must provide the lower and upper x coordinate bounds - /// of the noise map, in units, and the lower and upper z coordinate - /// bounds of the noise map, in units. - /// - /// To make a tileable noise map with no seams at the edges, call the - /// enableSeamless() method. - - /// A flag specifying whether seamless tiling is enabled. - boolean isSeamlessEnabled; - - /// Lower x boundary of the planar noise map, in units. - double lowerXBound; - - /// Lower z boundary of the planar noise map, in units. - double lowerZBound; - - /// Upper x boundary of the planar noise map, in units. - double upperXBound; - - /// Upper z boundary of the planar noise map, in units. - double upperZBound; - - - public NoiseMapBuilderPlane () throws ExceptionInvalidParam - { - super(); - isSeamlessEnabled = false; - lowerXBound = 0.0; - lowerZBound = 0.0; - upperXBound = 0.0; - upperZBound = 0.0; - } - - public NoiseMapBuilderPlane (int height, int width) throws ExceptionInvalidParam - { - super(height, width); - isSeamlessEnabled = false; - lowerXBound = 0.0; - lowerZBound = 0.0; - upperXBound = 0.0; - upperZBound = 0.0; - } - - public void build () throws ExceptionInvalidParam - { - if ( upperXBound <= lowerXBound - || upperZBound <= lowerZBound - || destWidth <= 0 - || destHeight <= 0 - || sourceModule == null - || destNoiseMap == null) - throw new ExceptionInvalidParam ("Invalid parameter in NoiseMapBuilderPlane"); - - // Resize the destination noise map so that it can store the new output - // values from the source model. - destNoiseMap.setSize (destWidth, destHeight); - - // Create the plane model. - Plane planeModel = new Plane(); - planeModel.setModule (sourceModule); - - double xExtent = upperXBound - lowerXBound; - double zExtent = upperZBound - lowerZBound; - double xDelta = xExtent / (double)destWidth ; - double zDelta = zExtent / (double)destHeight; - double xCur = lowerXBound; - double zCur = lowerZBound; - - // Fill every point in the noise map with the output values from the model. - for (int z = 0; z < destHeight; z++) - { - xCur = lowerXBound; - for (int x = 0; x < destWidth; x++) - { - double finalValue; - - if (!isSeamlessEnabled) - finalValue = planeModel.getValue (xCur, zCur); - else - { - double swValue, seValue, nwValue, neValue; - swValue = planeModel.getValue (xCur, zCur); - seValue = planeModel.getValue (xCur + xExtent, zCur); - nwValue = planeModel.getValue (xCur, zCur + zExtent); - neValue = planeModel.getValue (xCur + xExtent, zCur + zExtent); - double xBlend = 1.0 - ((xCur - lowerXBound) / xExtent); - double zBlend = 1.0 - ((zCur - lowerZBound) / zExtent); - double z0 = Interp.linearInterp (swValue, seValue, xBlend); - double z1 = Interp.linearInterp (nwValue, neValue, xBlend); - finalValue = Interp.linearInterp (z0, z1, zBlend); - } - - destNoiseMap.setValue(x, z, finalValue); - xCur += xDelta; - } - zCur += zDelta; - setCallback (z); - } - } - - /// Enables or disables seamless tiling. - /// - /// @param enable A flag that enables or disables seamless tiling. - /// - /// Enabling seamless tiling builds a noise map with no seams at the - /// edges. This allows the noise map to be tileable. - public void enableSeamless (boolean enable) - { - isSeamlessEnabled = enable; - } - - /// Returns the lower x boundary of the planar noise map. - /// - /// @returns The lower x boundary of the planar noise map, in units. - public double getLowerXBound () - { - return lowerXBound; - } - - /// Returns the lower z boundary of the planar noise map. - /// - /// @returns The lower z boundary of the noise map, in units. - public double getLowerZBound () - { - return lowerZBound; - } - - /// Returns the upper x boundary of the planar noise map. - /// - /// @returns The upper x boundary of the noise map, in units. - public double getUpperXBound () - { - return upperXBound; - } - - /// Returns the upper z boundary of the planar noise map. - /// - /// @returns The upper z boundary of the noise map, in units. - public double getUpperZBound () - { - return upperZBound; - } - - /// Determines if seamless tiling is enabled. - /// - /// @returns - /// - @a true if seamless tiling is enabled. - /// - @a false if seamless tiling is disabled. - /// - /// Enabling seamless tiling builds a noise map with no seams at the - /// edges. This allows the noise map to be tileable. - public boolean isSeamlessEnabled () - { - return isSeamlessEnabled; - } - - /// Sets the boundaries of the planar noise map. - /// - /// @param lowerXBound The lower x boundary of the noise map, in - /// units. - /// @param upperXBound The upper x boundary of the noise map, in - /// units. - /// @param lowerZBound The lower z boundary of the noise map, in - /// units. - /// @param upperZBound The upper z boundary of the noise map, in - /// units. - /// - /// @pre The lower x boundary is less than the upper x boundary. - /// @pre The lower z boundary is less than the upper z boundary. - /// - /// @throw ExceptionInvalidParam See the preconditions. - public void setBounds (double lowerXBound, double upperXBound, - double lowerZBound, double upperZBound) throws ExceptionInvalidParam - { - if (lowerXBound >= upperXBound || lowerZBound >= upperZBound) - throw new ExceptionInvalidParam ("Invalid parameter in NoiseMapBuilderPlane"); - - this.lowerXBound = lowerXBound; - this.upperXBound = upperXBound; - this.lowerZBound = lowerZBound; - this.upperZBound = upperZBound; - } - - public void setLowerXBound(double lowerXBound) - { - this.lowerXBound = lowerXBound; - } - - public void setLowerZBound(double lowerZBound) - { - this.lowerZBound = lowerZBound; - } - - public void setUpperXBound(double upperXBound) - { - this.upperXBound = upperXBound; - } - - public void setUpperZBound(double upperZBound) - { - this.upperZBound = upperZBound; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +import libnoiseforjava.Interp; +import libnoiseforjava.exception.ExceptionInvalidParam; +import libnoiseforjava.model.Plane; + +public class NoiseMapBuilderPlane extends NoiseMapBuilder +{ + /// Builds a planar noise map. + /// + /// This class builds a noise map by filling it with coherent-noise values + /// generated from the surface of a plane. + /// + /// This class describes these input values using (x, z) coordinates. + /// Their y coordinates are always 0.0. + /// + /// The application must provide the lower and upper x coordinate bounds + /// of the noise map, in units, and the lower and upper z coordinate + /// bounds of the noise map, in units. + /// + /// To make a tileable noise map with no seams at the edges, call the + /// enableSeamless() method. + + /// A flag specifying whether seamless tiling is enabled. + boolean isSeamlessEnabled; + + /// Lower x boundary of the planar noise map, in units. + double lowerXBound; + + /// Lower z boundary of the planar noise map, in units. + double lowerZBound; + + /// Upper x boundary of the planar noise map, in units. + double upperXBound; + + /// Upper z boundary of the planar noise map, in units. + double upperZBound; + + + public NoiseMapBuilderPlane () throws ExceptionInvalidParam + { + super(); + isSeamlessEnabled = false; + lowerXBound = 0.0; + lowerZBound = 0.0; + upperXBound = 0.0; + upperZBound = 0.0; + } + + public NoiseMapBuilderPlane (int height, int width) throws ExceptionInvalidParam + { + super(height, width); + isSeamlessEnabled = false; + lowerXBound = 0.0; + lowerZBound = 0.0; + upperXBound = 0.0; + upperZBound = 0.0; + } + + public void build () throws ExceptionInvalidParam + { + if ( upperXBound <= lowerXBound + || upperZBound <= lowerZBound + || destWidth <= 0 + || destHeight <= 0 + || sourceModule == null + || destNoiseMap == null) + throw new ExceptionInvalidParam ("Invalid parameter in NoiseMapBuilderPlane"); + + // Resize the destination noise map so that it can store the new output + // values from the source model. + destNoiseMap.setSize (destWidth, destHeight); + + // Create the plane model. + Plane planeModel = new Plane(); + planeModel.setModule (sourceModule); + + double xExtent = upperXBound - lowerXBound; + double zExtent = upperZBound - lowerZBound; + double xDelta = xExtent / (double)destWidth ; + double zDelta = zExtent / (double)destHeight; + double xCur = lowerXBound; + double zCur = lowerZBound; + + // Fill every point in the noise map with the output values from the model. + for (int z = 0; z < destHeight; z++) + { + xCur = lowerXBound; + for (int x = 0; x < destWidth; x++) + { + double finalValue; + + if (!isSeamlessEnabled) + finalValue = planeModel.getValue (xCur, zCur); + else + { + double swValue, seValue, nwValue, neValue; + swValue = planeModel.getValue (xCur, zCur); + seValue = planeModel.getValue (xCur + xExtent, zCur); + nwValue = planeModel.getValue (xCur, zCur + zExtent); + neValue = planeModel.getValue (xCur + xExtent, zCur + zExtent); + double xBlend = 1.0 - ((xCur - lowerXBound) / xExtent); + double zBlend = 1.0 - ((zCur - lowerZBound) / zExtent); + double z0 = Interp.linearInterp (swValue, seValue, xBlend); + double z1 = Interp.linearInterp (nwValue, neValue, xBlend); + finalValue = Interp.linearInterp (z0, z1, zBlend); + } + + destNoiseMap.setValue(x, z, finalValue); + xCur += xDelta; + } + zCur += zDelta; + setCallback (z); + } + } + + /// Enables or disables seamless tiling. + /// + /// @param enable A flag that enables or disables seamless tiling. + /// + /// Enabling seamless tiling builds a noise map with no seams at the + /// edges. This allows the noise map to be tileable. + public void enableSeamless (boolean enable) + { + isSeamlessEnabled = enable; + } + + /// Returns the lower x boundary of the planar noise map. + /// + /// @returns The lower x boundary of the planar noise map, in units. + public double getLowerXBound () + { + return lowerXBound; + } + + /// Returns the lower z boundary of the planar noise map. + /// + /// @returns The lower z boundary of the noise map, in units. + public double getLowerZBound () + { + return lowerZBound; + } + + /// Returns the upper x boundary of the planar noise map. + /// + /// @returns The upper x boundary of the noise map, in units. + public double getUpperXBound () + { + return upperXBound; + } + + /// Returns the upper z boundary of the planar noise map. + /// + /// @returns The upper z boundary of the noise map, in units. + public double getUpperZBound () + { + return upperZBound; + } + + /// Determines if seamless tiling is enabled. + /// + /// @returns + /// - @a true if seamless tiling is enabled. + /// - @a false if seamless tiling is disabled. + /// + /// Enabling seamless tiling builds a noise map with no seams at the + /// edges. This allows the noise map to be tileable. + public boolean isSeamlessEnabled () + { + return isSeamlessEnabled; + } + + /// Sets the boundaries of the planar noise map. + /// + /// @param lowerXBound The lower x boundary of the noise map, in + /// units. + /// @param upperXBound The upper x boundary of the noise map, in + /// units. + /// @param lowerZBound The lower z boundary of the noise map, in + /// units. + /// @param upperZBound The upper z boundary of the noise map, in + /// units. + /// + /// @pre The lower x boundary is less than the upper x boundary. + /// @pre The lower z boundary is less than the upper z boundary. + /// + /// @throw ExceptionInvalidParam See the preconditions. + public void setBounds (double lowerXBound, double upperXBound, + double lowerZBound, double upperZBound) throws ExceptionInvalidParam + { + if (lowerXBound >= upperXBound || lowerZBound >= upperZBound) + throw new ExceptionInvalidParam ("Invalid parameter in NoiseMapBuilderPlane"); + + this.lowerXBound = lowerXBound; + this.upperXBound = upperXBound; + this.lowerZBound = lowerZBound; + this.upperZBound = upperZBound; + } + + public void setLowerXBound(double lowerXBound) + { + this.lowerXBound = lowerXBound; + } + + public void setLowerZBound(double lowerZBound) + { + this.lowerZBound = lowerZBound; + } + + public void setUpperXBound(double upperXBound) + { + this.upperXBound = upperXBound; + } + + public void setUpperZBound(double upperZBound) + { + this.upperZBound = upperZBound; + } + +} diff --git a/src/libnoiseforjava/util/NoiseMapBuilderSphere.java b/src/libnoiseforjava/util/NoiseMapBuilderSphere.java index 6f96061..0aa560a 100644 --- a/src/libnoiseforjava/util/NoiseMapBuilderSphere.java +++ b/src/libnoiseforjava/util/NoiseMapBuilderSphere.java @@ -1,195 +1,195 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -import libnoiseforjava.exception.ExceptionInvalidParam; -import libnoiseforjava.model.Sphere; - -public class NoiseMapBuilderSphere extends NoiseMapBuilder -{ - /// Builds a spherical noise map. - /// - /// This class builds a noise map by filling it with coherent-noise values - /// generated from the surface of a sphere. - /// - /// This class describes these input values using a (latitude, longitude) - /// coordinate system. After generating the coherent-noise value from the - /// input value, it then "flattens" these coordinates onto a plane so that - /// it can write the values into a two-dimensional noise map. - /// - /// The sphere model has a radius of 1.0 unit. Its center is at the - /// origin. - /// - /// The x coordinate in the noise map represents the longitude. The y - /// coordinate in the noise map represents the latitude. - /// - /// The application must provide the southern, northern, western, and - /// eastern bounds of the noise map, in degrees. - - /// Eastern boundary of the spherical noise map, in degrees. - double eastLonBound; - - /// Northern boundary of the spherical noise map, in degrees. - double northLatBound; - - /// Southern boundary of the spherical noise map, in degrees. - double southLatBound; - - /// Western boundary of the spherical noise map, in degrees. - double westLonBound; - - public NoiseMapBuilderSphere () throws ExceptionInvalidParam - { - super(); - eastLonBound = 0.0; - northLatBound = 0.0; - southLatBound = 0.0; - westLonBound = 0.0; - } - - public void build () throws ExceptionInvalidParam - { - if ( eastLonBound <= westLonBound - || northLatBound <= southLatBound - || destWidth <= 0 - || destHeight <= 0 - || sourceModule == null - || destNoiseMap == null) - throw new ExceptionInvalidParam ("Invalid Parameter in NoiseMapBuilderSphere"); - - - // Resize the destination noise map so that it can store the new output - // values from the source model. - destNoiseMap.setSize (destWidth, destHeight); - - // Create the plane model. - Sphere sphereModel = new Sphere(); - sphereModel.setModule (sourceModule); - - double lonExtent = eastLonBound - westLonBound ; - double latExtent = northLatBound - southLatBound; - double xDelta = lonExtent / (double)destWidth ; - double yDelta = latExtent / (double)destHeight; - double curLon = westLonBound ; - double curLat = southLatBound; - - // Fill every point in the noise map with the output values from the model. - for (int y = 0; y < destHeight; y++) - { - curLon = westLonBound; - for (int x = 0; x < destWidth; x++) - { - float curValue = (float)sphereModel.getValue (curLat, curLon); - destNoiseMap.setValue(x, y, curValue); - curLon += xDelta; - } - curLat += yDelta; - setCallback(y); - - } - } - - /// Returns the eastern boundary of the spherical noise map. - /// - /// @returns The eastern boundary of the noise map, in degrees. - public double getEastLonBound () - { - return eastLonBound; - } - - /// Returns the northern boundary of the spherical noise map - /// - /// @returns The northern boundary of the noise map, in degrees. - public double getNorthLatBound () - { - return northLatBound; - } - - /// Returns the southern boundary of the spherical noise map - /// - /// @returns The southern boundary of the noise map, in degrees. - public double getSouthLatBound () - { - return southLatBound; - } - - /// Returns the western boundary of the spherical noise map - /// - /// @returns The western boundary of the noise map, in degrees. - public double getWestLonBound () - { - return westLonBound; - } - - /// Sets the coordinate boundaries of the noise map. - /// - /// @param southLatBound The southern boundary of the noise map, in - /// degrees. - /// @param northLatBound The northern boundary of the noise map, in - /// degrees. - /// @param westLonBound The western boundary of the noise map, in - /// degrees. - /// @param eastLonBound The eastern boundary of the noise map, in - /// degrees. - /// - /// @pre The southern boundary is less than the northern boundary. - /// @pre The western boundary is less than the eastern boundary. - /// - /// @throw noise::ExceptionInvalidParam See the preconditions. - public void setBounds (double southLatBound, double northLatBound, - double westLonBound, double eastLonBound) throws ExceptionInvalidParam - { - if (southLatBound >= northLatBound - || westLonBound >= eastLonBound) - throw new ExceptionInvalidParam ("Invalid Parameter in NoiseMapBuilderSphere"); - - this.southLatBound = southLatBound; - this.northLatBound = northLatBound; - this.westLonBound = westLonBound ; - this.eastLonBound = eastLonBound ; - } - - public void setEastLonBound(double eastLonBound) - { - this.eastLonBound = eastLonBound; - } - - public void setNorthLatBound(double northLatBound) - { - this.northLatBound = northLatBound; - } - - public void setSouthLatBound(double southLatBound) - { - this.southLatBound = southLatBound; - } - - public void setWestLonBound(double westLonBound) - { - this.westLonBound = westLonBound; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +import libnoiseforjava.exception.ExceptionInvalidParam; +import libnoiseforjava.model.Sphere; + +public class NoiseMapBuilderSphere extends NoiseMapBuilder +{ + /// Builds a spherical noise map. + /// + /// This class builds a noise map by filling it with coherent-noise values + /// generated from the surface of a sphere. + /// + /// This class describes these input values using a (latitude, longitude) + /// coordinate system. After generating the coherent-noise value from the + /// input value, it then "flattens" these coordinates onto a plane so that + /// it can write the values into a two-dimensional noise map. + /// + /// The sphere model has a radius of 1.0 unit. Its center is at the + /// origin. + /// + /// The x coordinate in the noise map represents the longitude. The y + /// coordinate in the noise map represents the latitude. + /// + /// The application must provide the southern, northern, western, and + /// eastern bounds of the noise map, in degrees. + + /// Eastern boundary of the spherical noise map, in degrees. + double eastLonBound; + + /// Northern boundary of the spherical noise map, in degrees. + double northLatBound; + + /// Southern boundary of the spherical noise map, in degrees. + double southLatBound; + + /// Western boundary of the spherical noise map, in degrees. + double westLonBound; + + public NoiseMapBuilderSphere () throws ExceptionInvalidParam + { + super(); + eastLonBound = 0.0; + northLatBound = 0.0; + southLatBound = 0.0; + westLonBound = 0.0; + } + + public void build () throws ExceptionInvalidParam + { + if ( eastLonBound <= westLonBound + || northLatBound <= southLatBound + || destWidth <= 0 + || destHeight <= 0 + || sourceModule == null + || destNoiseMap == null) + throw new ExceptionInvalidParam ("Invalid Parameter in NoiseMapBuilderSphere"); + + + // Resize the destination noise map so that it can store the new output + // values from the source model. + destNoiseMap.setSize (destWidth, destHeight); + + // Create the plane model. + Sphere sphereModel = new Sphere(); + sphereModel.setModule (sourceModule); + + double lonExtent = eastLonBound - westLonBound ; + double latExtent = northLatBound - southLatBound; + double xDelta = lonExtent / (double)destWidth ; + double yDelta = latExtent / (double)destHeight; + double curLon = westLonBound ; + double curLat = southLatBound; + + // Fill every point in the noise map with the output values from the model. + for (int y = 0; y < destHeight; y++) + { + curLon = westLonBound; + for (int x = 0; x < destWidth; x++) + { + float curValue = (float)sphereModel.getValue (curLat, curLon); + destNoiseMap.setValue(x, y, curValue); + curLon += xDelta; + } + curLat += yDelta; + setCallback(y); + + } + } + + /// Returns the eastern boundary of the spherical noise map. + /// + /// @returns The eastern boundary of the noise map, in degrees. + public double getEastLonBound () + { + return eastLonBound; + } + + /// Returns the northern boundary of the spherical noise map + /// + /// @returns The northern boundary of the noise map, in degrees. + public double getNorthLatBound () + { + return northLatBound; + } + + /// Returns the southern boundary of the spherical noise map + /// + /// @returns The southern boundary of the noise map, in degrees. + public double getSouthLatBound () + { + return southLatBound; + } + + /// Returns the western boundary of the spherical noise map + /// + /// @returns The western boundary of the noise map, in degrees. + public double getWestLonBound () + { + return westLonBound; + } + + /// Sets the coordinate boundaries of the noise map. + /// + /// @param southLatBound The southern boundary of the noise map, in + /// degrees. + /// @param northLatBound The northern boundary of the noise map, in + /// degrees. + /// @param westLonBound The western boundary of the noise map, in + /// degrees. + /// @param eastLonBound The eastern boundary of the noise map, in + /// degrees. + /// + /// @pre The southern boundary is less than the northern boundary. + /// @pre The western boundary is less than the eastern boundary. + /// + /// @throw noise::ExceptionInvalidParam See the preconditions. + public void setBounds (double southLatBound, double northLatBound, + double westLonBound, double eastLonBound) throws ExceptionInvalidParam + { + if (southLatBound >= northLatBound + || westLonBound >= eastLonBound) + throw new ExceptionInvalidParam ("Invalid Parameter in NoiseMapBuilderSphere"); + + this.southLatBound = southLatBound; + this.northLatBound = northLatBound; + this.westLonBound = westLonBound ; + this.eastLonBound = eastLonBound ; + } + + public void setEastLonBound(double eastLonBound) + { + this.eastLonBound = eastLonBound; + } + + public void setNorthLatBound(double northLatBound) + { + this.northLatBound = northLatBound; + } + + public void setSouthLatBound(double southLatBound) + { + this.southLatBound = southLatBound; + } + + public void setWestLonBound(double westLonBound) + { + this.westLonBound = westLonBound; + } + +} diff --git a/src/libnoiseforjava/util/RendererImage.java b/src/libnoiseforjava/util/RendererImage.java index 5940527..bc9aa7e 100644 --- a/src/libnoiseforjava/util/RendererImage.java +++ b/src/libnoiseforjava/util/RendererImage.java @@ -1,813 +1,813 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -import libnoiseforjava.Interp; -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class RendererImage -{ - - /// Renders an image from a noise map. - /// - /// This class renders an image given the contents of a noise-map object. - /// - /// An application can configure the output of the image in three ways: - /// - Specify the color gradient. - /// - Specify the light source parameters. - /// - Specify the background image. - /// - /// Specify the color gradient - /// - /// This class uses a color gradient to calculate the color for each pixel - /// in the destination image according to the value from the corresponding - /// position in the noise map. - /// - /// A color gradient is a list of gradually-changing colors. A color - /// gradient is defined by a list of gradient points. Each - /// gradient point has a position and a color. In a color gradient, the - /// colors between two adjacent gradient points are linearly interpolated. - /// - /// For example, suppose this class contains the following color gradient: - /// - /// - -1.0 maps to dark blue. - /// - -0.2 maps to light blue. - /// - -0.1 maps to tan. - /// - 0.0 maps to green. - /// - 1.0 maps to white. - /// - /// The value 0.5 maps to a greenish-white color because 0.5 is halfway - /// between 0.0 (mapped to green) and 1.0 (mapped to white). - /// - /// The value -0.6 maps to a medium blue color because -0.6 is halfway - /// between -1.0 (mapped to dark blue) and -0.2 (mapped to light blue). - /// - /// The color gradient requires a minimum of two gradient points. - /// - /// This class contains two pre-made gradients: a grayscale gradient and a - /// color gradient suitable for terrain. To use these pre-made gradients, - /// call the buildGrayscaleGradient() or buildTerrainGradient() methods, - /// respectively. - /// - /// @note The color value passed to addGradientPoint() has an alpha - /// channel. This alpha channel specifies how a pixel in the background - /// image (if specified) is blended with the calculated color. If the - /// alpha value is high, this class weighs the blend towards the - /// calculated color, and if the alpha value is low, this class weighs the - /// blend towards the color from the corresponding pixel in the background - /// image. - /// - /// Specify the light source parameters - /// - /// This class contains a parallel light source that lights the image. It - /// interprets the noise map as a bump map. - /// - /// To enable or disable lighting, pass a Boolean value to the - /// enableLight() method. - /// - /// To set the position of the light source in the "sky", call the - /// setLightAzimuth() and setLightElev() methods. - /// - /// To set the color of the light source, call the setLightColor() method. - /// - /// To set the intensity of the light source, call the setLightIntensity() - /// method. A good intensity value is 2.0, although that value tends to - /// "wash out" very light colors from the image. - /// - /// To set the contrast amount between areas in light and areas in shadow, - /// call the setLightContrast() method. Determining the correct contrast - /// amount requires some trial and error, but if your application - /// interprets the noise map as a height map that has its elevation values - /// measured in meters and has a horizontal resolution of @a h meters, a - /// good contrast amount to use is ( 1.0 / @a h ). - /// - /// Specify the background image - /// - /// To specify a background image, pass an Image object to the - /// setBackgroundImage() method. - /// - /// This class determines the color of a pixel in the destination image by - /// blending the calculated color with the color of the corresponding - /// pixel from the background image. - /// - /// The blend amount is determined by the alpha of the calculated color. - /// If the alpha value is high, this class weighs the blend towards the - /// calculated color, and if the alpha value is low, this class weighs the - /// blend towards the color from the corresponding pixel in the background - /// image. - /// - /// Rendering the image - /// - /// To render the image, perform the following steps: - /// - Pass a NoiseMap object to the setSourceNoiseMap() method. - /// - Pass an ImageCafe object to the setDestImage() method. - /// - Pass an ImageCafe object to the setBackgroundImage() method (optional) - /// - Call the render() method. - - - static final double SQRT_2 = 1.4142135623730950488; - - - /// The cosine of the azimuth of the light source. - double cosAzimuth; - - /// The cosine of the elevation of the light source. - double cosElev; - - /// The color gradient used to specify the image colors. - GradientColor gradient; - - /// A flag specifying whether lighting is enabled. - boolean isLightEnabled; - - /// A flag specifying whether wrapping is enabled. - boolean isWrapEnabled; - - /// The azimuth of the light source, in degrees. - double lightAzimuth; - - /// The brightness of the light source. - double lightBrightness; - - /// The color of the light source. - ColorCafe lightColor; - - /// The contrast between areas in light and areas in shadow. - double lightContrast; - - /// The elevation of the light source, in degrees. - double lightElev; - - /// The intensity of the light source. - double lightIntensity; - - /// A pointer to the background image. - ImageCafe backgroundImage; - - /// A pointer to the destination image. - ImageCafe destImageCafe; - - /// A pointer to the source noise map. - NoiseMap sourceNoiseMap; - - /// Used by the calcLightIntensity() method to recalculate the light - /// values only if the light parameters change. - /// - /// When the light parameters change, this value is set to True. When - /// the calcLightIntensity() method is called, this value is set to - /// false. - boolean recalcLightValues; - - /// The sine of the azimuth of the light source. - double sinAzimuth; - - /// The sine of the elevation of the light source. - double sinElev; - - - public RendererImage () throws ExceptionInvalidParam - { - isLightEnabled = false; - isWrapEnabled = false; - lightAzimuth = 45.0; - lightBrightness = 1.0; - lightColor = new ColorCafe(255, 255, 255, 255); - lightContrast = 1.0; - lightElev = 45.0; - lightIntensity = 1.0; - backgroundImage = null; - destImageCafe = null; - sourceNoiseMap = null; - recalcLightValues = true; - - buildGrayscaleGradient (); - } - - /// Adds a gradient point to this gradient object. - /// - /// @param gradientPos The position of this gradient point. - /// @param gradientColor The color of this gradient point. - /// - /// @pre No two gradient points have the same position. - /// - /// @throw noise::ExceptionInvalidParam See the preconditions. - /// - /// This object uses a color gradient to calculate the color for each - /// pixel in the destination image according to the value from the - /// corresponding position in the noise map. - /// - /// The gradient requires a minimum of two gradient points. - /// - /// The specified color value passed to this method has an alpha - /// channel. This alpha channel specifies how a pixel in the - /// background image (if specified) is blended with the calculated - /// color. If the alpha value is high, this object weighs the blend - /// towards the calculated color, and if the alpha value is low, this - /// object weighs the blend towards the color from the corresponding - /// pixel in the background image. - public void addGradientPoint (double gradientPos, ColorCafe gradientColor) throws ExceptionInvalidParam - { - gradient.addGradientPoint (gradientPos, gradientColor); - } - - /// Builds a grayscale gradient. - /// - /// @post The original gradient is cleared and a grayscale gradient is - /// created. - /// - /// This color gradient contains the following gradient points: - /// - -1.0 maps to black - /// - 1.0 maps to white - public void buildGrayscaleGradient () throws ExceptionInvalidParam - { - clearGradient (); - gradient.addGradientPoint (-1.0, new ColorCafe ( 0, 0, 0, 255)); - gradient.addGradientPoint ( 1.0, new ColorCafe (255, 255, 255, 255)); - } - - /// Builds a color gradient suitable for terrain. - /// - /// @post The original gradient is cleared and a terrain gradient is - /// created. - /// - /// This gradient color at position 0.0 is the "sea level". Above - /// that value, the gradient contains greens, browns, and whites. - /// Below that value, the gradient contains various shades of blue. - public void buildTerrainGradient () throws ExceptionInvalidParam - { - clearGradient (); - gradient.addGradientPoint (-1.00, new ColorCafe ( 0, 0, 128, 255)); - gradient.addGradientPoint (-0.20, new ColorCafe ( 32, 64, 128, 255)); - gradient.addGradientPoint (-0.04, new ColorCafe ( 64, 96, 192, 255)); - gradient.addGradientPoint (-0.02, new ColorCafe (192, 192, 128, 255)); - gradient.addGradientPoint ( 0.00, new ColorCafe ( 0, 192, 0, 255)); - gradient.addGradientPoint ( 0.25, new ColorCafe (192, 192, 0, 255)); - gradient.addGradientPoint ( 0.50, new ColorCafe (160, 96, 64, 255)); - gradient.addGradientPoint ( 0.75, new ColorCafe (128, 255, 255, 255)); - gradient.addGradientPoint ( 1.00, new ColorCafe (255, 255, 255, 255)); - } - - /// Calculates the destination color. - /// - /// @param sourceColor The source color generated from the color - /// gradient. - /// @param backgroundColor The color from the background image at the - /// corresponding position. - /// @param lightValue The intensity of the light at that position. - /// - /// @returns The destination color. - public ColorCafe calcDestColor (ColorCafe sourceColor, ColorCafe backgroundColor, - double lightValue) - { - double sourceRed = (double)sourceColor.red / 255.0; - double sourceGreen = (double)sourceColor.green / 255.0; - double sourceBlue = (double)sourceColor.blue / 255.0; - double sourceAlpha = (double)sourceColor.alpha / 255.0; - double backgroundRed = (double)backgroundColor.red / 255.0; - double backgroundGreen = (double)backgroundColor.green / 255.0; - double backgroundBlue = (double)backgroundColor.blue / 255.0; - - // First, blend the source color to the background color using the alpha - // of the source color. - double red = Interp.linearInterp (backgroundRed, sourceRed , sourceAlpha); - double green = Interp.linearInterp (backgroundGreen, sourceGreen, sourceAlpha); - double blue = Interp.linearInterp (backgroundBlue, sourceBlue , sourceAlpha); - - if (isLightEnabled) - { - // Now calculate the light color. - double lightRed = lightValue * (double)lightColor.red / 255.0; - double lightGreen = lightValue * (double)lightColor.green / 255.0; - double lightBlue = lightValue * (double)lightColor.blue / 255.0; - - // Apply the light color to the new color. - red *= lightRed ; - green *= lightGreen; - blue *= lightBlue ; - } - - // Clamp the color channels to the (0..1) range. - red = (red < 0.0)? 0.0: red ; - red = (red > 1.0)? 1.0: red ; - green = (green < 0.0)? 0.0: green; - green = (green > 1.0)? 1.0: green; - blue = (blue < 0.0)? 0.0: blue ; - blue = (blue > 1.0)? 1.0: blue ; - - // Rescale the color channels to the noise::uint8 (0..255) range and return - // the new color. - ColorCafe newColor = new ColorCafe((int)(red * 255.0) & 0xff,(int)(green * 255.0) & 0xff, - (int)(blue * 255.0) & 0xff, Math.max (sourceColor.alpha, backgroundColor.alpha)); - return newColor; - } - - /// Calculates the intensity of the light given some elevation values. - /// - /// @param center Elevation of the center point. - /// @param left Elevation of the point directly left of the center - /// point. - /// @param right Elevation of the point directly right of the center - /// point. - /// @param down Elevation of the point directly below the center - /// point. - /// @param up Elevation of the point directly above the center point. - /// - /// These values come directly from the noise map. - public double calcLightIntensity (double center, double left, - double right, double down, double up) - { - // Recalculate the sine and cosine of the various light values if - // necessary so it does not have to be calculated each time this method is - // called. - if (recalcLightValues) { - cosAzimuth = Math.cos (Math.toRadians(lightAzimuth)); - sinAzimuth = Math.sin (Math.toRadians(lightAzimuth)); - cosElev = Math.cos (Math.toRadians(lightElev)); - sinElev = Math.sin (Math.toRadians(lightElev)); - recalcLightValues = false; - } - - // Now do the lighting calculations. - double I_MAX = 1.0; - double io = I_MAX * SQRT_2 * sinElev / 2.0; - double ix = (I_MAX - io) * lightContrast * SQRT_2 * cosElev - * cosAzimuth; - double iy = (I_MAX - io) * lightContrast * SQRT_2 * cosElev - * sinAzimuth; - double intensity = (ix * (left - right) + iy * (down - up) + io); - - if (intensity < 0.0) - intensity = 0.0; - - return intensity; - } - - /// Clears the color gradient. - /// - /// Before calling the render() method, the application must specify a - /// new color gradient with at least two gradient points. - public void clearGradient () - { - gradient = new GradientColor(); - gradient.clear(); - } - - /// Renders the destination image using the contents of the source - /// noise map and an optional background image. - /// - /// @pre setSourceNoiseMap() has been previously called. - /// @pre setDestImage() has been previously called. - /// @pre There are at least two gradient points in the color gradient. - /// @pre No two gradient points have the same position. - /// @pre If a background image was specified, it has the exact same - /// size as the source height map. - /// - /// @post The original contents of the destination image is destroyed. - /// - /// @throw ExceptionInvalidParam See the preconditions. - /// - /// The background image and the destination image can safely refer to - /// the same image, although in this case, the destination image is - /// irretrievably blended into the background image. - public void render () throws ExceptionInvalidParam - { - if ( sourceNoiseMap == null - || destImageCafe == null - || sourceNoiseMap.getWidth () <= 0 - || sourceNoiseMap.getHeight () <= 0 - || gradient.getGradientPointCount () < 2) - throw new ExceptionInvalidParam ("Invalid Parameter in RendererImage"); - - - int width = sourceNoiseMap.getWidth (); - int height = sourceNoiseMap.getHeight (); - - // If a background image was provided, make sure it is the same size the - // source noise map. - if (backgroundImage != null) - if ( backgroundImage.getWidth () != width || backgroundImage.getHeight () != height) - throw new ExceptionInvalidParam ("Invalid Parameter in RendererImage"); - - - // Create the destination image. It is safe to reuse it if this is also the - // background image. - if (destImageCafe != backgroundImage) - destImageCafe.setSize (width, height); - - for (int y = 0; y < height; y++) - { - ColorCafe background = new ColorCafe(255, 255, 255, 255); - - for (int x = 0; x < width; x++) - { - // Get the color based on the value at the current point in the noise - // map. - ColorCafe destColor = gradient.getColor (sourceNoiseMap.getValue(x,y)); - - // If lighting is enabled, calculate the light intensity based on the - // rate of change at the current point in the noise map. - double lightIntensity; - if (isLightEnabled) - { - // Calculate the positions of the current point's four-neighbors. - int xLeftOffset, xRightOffset; - int yUpOffset , yDownOffset ; - if (isWrapEnabled) - { - if (x == 0) - { - xLeftOffset = (int)width - 1; - xRightOffset = 1;} - else if (x == (int)width - 1) - { - xLeftOffset = -1; - xRightOffset = -((int)width - 1); - } - else - { - xLeftOffset = -1; - xRightOffset = 1; - } - - if (y == 0) - { - yDownOffset = (int)height - 1; - yUpOffset = 1; - } - else if (y == (int)height - 1) - { - yDownOffset = -1; - yUpOffset = -((int)height - 1); - } - else - { - yDownOffset = -1; - yUpOffset = 1; - } - } - else - { - if (x == 0) - { - xLeftOffset = 0; - xRightOffset = 1; - } - else if (x == (int)width - 1) - { - xLeftOffset = -1; - xRightOffset = 0; - } - else - { - xLeftOffset = -1; - xRightOffset = 1; - } - - if (y == 0) - { - yDownOffset = 0; - yUpOffset = 1; - } - else if (y == (int)height - 1) - { - yDownOffset = -1; - yUpOffset = 0; - } - else - { - yDownOffset = -1; - yUpOffset = 1; - } - } - - // Get the noise value of the current point in the source noise map - // and the noise values of its four-neighbors. - double nc = (double)(sourceNoiseMap.getValue(x,y)); - double nl = (double)(sourceNoiseMap.getValue(x + xLeftOffset, y)); - double nr = (double)(sourceNoiseMap.getValue(x + xRightOffset, y)); - double nd = (double)(sourceNoiseMap.getValue(x,y + yDownOffset)); - double nu = (double)(sourceNoiseMap.getValue(x,y + yUpOffset)); - - // Now we can calculate the lighting intensity. - lightIntensity = calcLightIntensity (nc, nl, nr, nd, nu); - lightIntensity *= lightBrightness; - - } - else - { - // These values will apply no lighting to the destination image. - lightIntensity = 1.0; - } - - // Get the current background color from the background image. - ColorCafe backgroundColor = new ColorCafe (255, 255, 255, 255); - if (backgroundImage != null) - backgroundColor = backgroundImage.getValue(x, y); - - // Blend the destination color, background color, and the light - // intensity together, then update the destination image with that - // color. - destImageCafe.setValue(x, y, calcDestColor (destColor, backgroundColor, lightIntensity)); - } - } - } - - /// Enables or disables the light source. - /// - /// @param enable A flag that enables or disables the light source. - /// - /// If the light source is enabled, this object will interpret the - /// noise map as a bump map. - public void enableLight (boolean enable) - { - isLightEnabled = enable; - } - - /// Enables or disables noise-map wrapping. - /// - /// @param enable A flag that enables or disables noise-map wrapping. - /// - /// This object requires five points (the initial point and its four - /// neighbors) to calculate light shading. If wrapping is enabled, - /// and the initial point is on the edge of the noise map, the - /// appropriate neighbors that lie outside of the noise map will - /// "wrap" to the opposite side(s) of the noise map. Otherwise, the - /// appropriate neighbors are cropped to the edge of the noise map. - /// - /// Enabling wrapping is useful when creating spherical renderings and - /// tileable textures. - public void enableWrap (boolean enable) - { - isWrapEnabled = enable; - } - - /// Returns the azimuth of the light source, in degrees. - /// - /// @returns The azimuth of the light source. - /// - /// The azimuth is the location of the light source around the - /// horizon: - /// - 0.0 degrees is east. - /// - 90.0 degrees is north. - /// - 180.0 degrees is west. - /// - 270.0 degrees is south. - public double getLightAzimuth () - { - return lightAzimuth; - } - - /// Returns the brightness of the light source. - /// - /// @returns The brightness of the light source. - public double getLightBrightness () - { - return lightBrightness; - } - - /// Returns the color of the light source. - /// - /// @returns The color of the light source. - public ColorCafe getLightColor () - { - return lightColor; - } - - /// Returns the contrast of the light source. - /// - /// @returns The contrast of the light source. - /// - /// The contrast specifies how sharp the boundary is between the - /// light-facing areas and the shadowed areas. - /// - /// The contrast determines the difference between areas in light and - /// areas in shadow. Determining the correct contrast amount requires - /// some trial and error, but if your application interprets the noise - /// map as a height map that has a spatial resolution of @a h meters - /// and an elevation resolution of 1 meter, a good contrast amount to - /// use is ( 1.0 / @a h ). - public double getLightContrast () - { - return lightContrast; - } - - /// Returns the elevation of the light source, in degrees. - /// - /// @returns The elevation of the light source. - /// - /// The elevation is the angle above the horizon: - /// - 0 degrees is on the horizon. - /// - 90 degrees is straight up. - public double getLightElev () - { - return lightElev; - } - - /// Returns the intensity of the light source. - /// - /// @returns The intensity of the light source. - public double getLightIntensity () - { - return lightIntensity; - } - - /// Determines if the light source is enabled. - /// - /// @returns - /// - @a true if the light source is enabled. - /// - @a false if the light source is disabled. - public boolean isLightEnabled () - { - return isLightEnabled; - } - - /// Determines if noise-map wrapping is enabled. - /// - /// @returns - /// - @a true if noise-map wrapping is enabled. - /// - @a false if noise-map wrapping is disabled. - /// - /// This object requires five points (the initial point and its four - /// neighbors) to calculate light shading. If wrapping is enabled, - /// and the initial point is on the edge of the noise map, the - /// appropriate neighbors that lie outside of the noise map will - /// "wrap" to the opposite side(s) of the noise map. Otherwise, the - /// appropriate neighbors are cropped to the edge of the noise map. - /// - /// Enabling wrapping is useful when creating spherical renderings and - /// tileable textures - public boolean isWrapEnabled () - { - return isWrapEnabled; - } - - /// Sets the background image. - /// - /// @param backgroundImage The background image. - /// - /// If a background image has been specified, the Render() method - /// blends the pixels from the background image onto the corresponding - /// pixels in the destination image. The blending weights are - /// determined by the alpha channel in the pixels in the destination - /// image. - /// - /// The destination image must exist throughout the lifetime of this - /// object unless another image replaces that image. - public void setBackgroundImage (ImageCafe backgroundImage) - { - this.backgroundImage = backgroundImage; - } - - /// Sets the destination image. - /// - /// @param destImage The destination image. - /// - /// The destination image will contain the rendered image after a - /// successful call to the Render() method. - /// - /// The destination image must exist throughout the lifetime of this - /// object unless another image replaces that image. - public void setDestImage (ImageCafe destImage) - { - this.destImageCafe = destImage; - } - - /// Sets the azimuth of the light source, in degrees. - /// - /// @param lightAzimuth The azimuth of the light source. - /// - /// The azimuth is the location of the light source around the - /// horizon: - /// - 0.0 degrees is east. - /// - 90.0 degrees is north. - /// - 180.0 degrees is west. - /// - 270.0 degrees is south. - /// - /// Make sure the light source is enabled via a call to the - /// EnableLight() method before calling the Render() method. - public void setLightAzimuth (double lightAzimuth) - { - this.lightAzimuth = lightAzimuth; - this.recalcLightValues = true; - } - - /// Sets the brightness of the light source. - /// - /// @param lightBrightness The brightness of the light source. - /// - /// Make sure the light source is enabled via a call to the - /// EnableLight() method before calling the Render() method. - public void setLightBrightness (double lightBrightness) - { - this.lightBrightness = lightBrightness; - this.recalcLightValues = true; - } - - /// Sets the color of the light source. - /// - /// @param lightColor The light color. - /// - /// Make sure the light source is enabled via a call to the - /// EnableLight() method before calling the Render() method. - public void setLightColor (ColorCafe lightColor) - { - this.lightColor = lightColor; - } - - /// Sets the contrast of the light source. - /// - /// @param lightContrast The contrast of the light source. - /// - /// @pre The specified light contrast is positive. - /// - /// @throw noise::ExceptionInvalidParam See the preconditions. - /// - /// The contrast specifies how sharp the boundary is between the - /// light-facing areas and the shadowed areas. - /// - /// The contrast determines the difference between areas in light and - /// areas in shadow. Determining the correct contrast amount requires - /// some trial and error, but if your application interprets the noise - /// map as a height map that has a spatial resolution of @a h meters - /// and an elevation resolution of 1 meter, a good contrast amount to - /// use is ( 1.0 / @a h ). - /// - /// Make sure the light source is enabled via a call to the - /// EnableLight() method before calling the Render() method. - public void setLightContrast (double lightContrast) throws ExceptionInvalidParam - { - if (lightContrast <= 0.0) - throw new ExceptionInvalidParam ("Invalid Parameter in RendererImage"); - - - this.lightContrast = lightContrast; - this.recalcLightValues = true; - } - - /// Sets the elevation of the light source, in degrees. - /// - /// @param lightElev The elevation of the light source. - /// - /// The elevation is the angle above the horizon: - /// - 0 degrees is on the horizon. - /// - 90 degrees is straight up. - /// - /// Make sure the light source is enabled via a call to the - /// EnableLight() method before calling the Render() method. - public void setLightElev (double lightElev) - { - this.lightElev = lightElev; - this.recalcLightValues = true; - } - - /// Sets the intensity of the light source. - /// - /// @returns The intensity of the light source. - /// - /// A good value for intensity is 2.0. - /// - /// Make sure the light source is enabled via a call to the - /// enableLight() method before calling the render() method. - public void setLightIntensity (double lightIntensity) throws ExceptionInvalidParam - { - if (lightIntensity < 0.0) - throw new ExceptionInvalidParam ("Invalid Parameter in RendererImage"); - - this.lightIntensity = lightIntensity; - this.recalcLightValues = true; - } - - /// Sets the source noise map. - /// - /// @param sourceNoiseMap The source noise map. - /// - /// The destination image must exist throughout the lifetime of this - /// object unless another image replaces that image. - public void setSourceNoiseMap (NoiseMap sourceNoiseMap) - { - this.sourceNoiseMap = sourceNoiseMap; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +import libnoiseforjava.Interp; +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class RendererImage +{ + + /// Renders an image from a noise map. + /// + /// This class renders an image given the contents of a noise-map object. + /// + /// An application can configure the output of the image in three ways: + /// - Specify the color gradient. + /// - Specify the light source parameters. + /// - Specify the background image. + /// + /// Specify the color gradient + /// + /// This class uses a color gradient to calculate the color for each pixel + /// in the destination image according to the value from the corresponding + /// position in the noise map. + /// + /// A color gradient is a list of gradually-changing colors. A color + /// gradient is defined by a list of gradient points. Each + /// gradient point has a position and a color. In a color gradient, the + /// colors between two adjacent gradient points are linearly interpolated. + /// + /// For example, suppose this class contains the following color gradient: + /// + /// - -1.0 maps to dark blue. + /// - -0.2 maps to light blue. + /// - -0.1 maps to tan. + /// - 0.0 maps to green. + /// - 1.0 maps to white. + /// + /// The value 0.5 maps to a greenish-white color because 0.5 is halfway + /// between 0.0 (mapped to green) and 1.0 (mapped to white). + /// + /// The value -0.6 maps to a medium blue color because -0.6 is halfway + /// between -1.0 (mapped to dark blue) and -0.2 (mapped to light blue). + /// + /// The color gradient requires a minimum of two gradient points. + /// + /// This class contains two pre-made gradients: a grayscale gradient and a + /// color gradient suitable for terrain. To use these pre-made gradients, + /// call the buildGrayscaleGradient() or buildTerrainGradient() methods, + /// respectively. + /// + /// @note The color value passed to addGradientPoint() has an alpha + /// channel. This alpha channel specifies how a pixel in the background + /// image (if specified) is blended with the calculated color. If the + /// alpha value is high, this class weighs the blend towards the + /// calculated color, and if the alpha value is low, this class weighs the + /// blend towards the color from the corresponding pixel in the background + /// image. + /// + /// Specify the light source parameters + /// + /// This class contains a parallel light source that lights the image. It + /// interprets the noise map as a bump map. + /// + /// To enable or disable lighting, pass a Boolean value to the + /// enableLight() method. + /// + /// To set the position of the light source in the "sky", call the + /// setLightAzimuth() and setLightElev() methods. + /// + /// To set the color of the light source, call the setLightColor() method. + /// + /// To set the intensity of the light source, call the setLightIntensity() + /// method. A good intensity value is 2.0, although that value tends to + /// "wash out" very light colors from the image. + /// + /// To set the contrast amount between areas in light and areas in shadow, + /// call the setLightContrast() method. Determining the correct contrast + /// amount requires some trial and error, but if your application + /// interprets the noise map as a height map that has its elevation values + /// measured in meters and has a horizontal resolution of @a h meters, a + /// good contrast amount to use is ( 1.0 / @a h ). + /// + /// Specify the background image + /// + /// To specify a background image, pass an Image object to the + /// setBackgroundImage() method. + /// + /// This class determines the color of a pixel in the destination image by + /// blending the calculated color with the color of the corresponding + /// pixel from the background image. + /// + /// The blend amount is determined by the alpha of the calculated color. + /// If the alpha value is high, this class weighs the blend towards the + /// calculated color, and if the alpha value is low, this class weighs the + /// blend towards the color from the corresponding pixel in the background + /// image. + /// + /// Rendering the image + /// + /// To render the image, perform the following steps: + /// - Pass a NoiseMap object to the setSourceNoiseMap() method. + /// - Pass an ImageCafe object to the setDestImage() method. + /// - Pass an ImageCafe object to the setBackgroundImage() method (optional) + /// - Call the render() method. + + + static final double SQRT_2 = 1.4142135623730950488; + + + /// The cosine of the azimuth of the light source. + double cosAzimuth; + + /// The cosine of the elevation of the light source. + double cosElev; + + /// The color gradient used to specify the image colors. + GradientColor gradient; + + /// A flag specifying whether lighting is enabled. + boolean isLightEnabled; + + /// A flag specifying whether wrapping is enabled. + boolean isWrapEnabled; + + /// The azimuth of the light source, in degrees. + double lightAzimuth; + + /// The brightness of the light source. + double lightBrightness; + + /// The color of the light source. + ColorCafe lightColor; + + /// The contrast between areas in light and areas in shadow. + double lightContrast; + + /// The elevation of the light source, in degrees. + double lightElev; + + /// The intensity of the light source. + double lightIntensity; + + /// A pointer to the background image. + ImageCafe backgroundImage; + + /// A pointer to the destination image. + ImageCafe destImageCafe; + + /// A pointer to the source noise map. + NoiseMap sourceNoiseMap; + + /// Used by the calcLightIntensity() method to recalculate the light + /// values only if the light parameters change. + /// + /// When the light parameters change, this value is set to True. When + /// the calcLightIntensity() method is called, this value is set to + /// false. + boolean recalcLightValues; + + /// The sine of the azimuth of the light source. + double sinAzimuth; + + /// The sine of the elevation of the light source. + double sinElev; + + + public RendererImage () throws ExceptionInvalidParam + { + isLightEnabled = false; + isWrapEnabled = false; + lightAzimuth = 45.0; + lightBrightness = 1.0; + lightColor = new ColorCafe(255, 255, 255, 255); + lightContrast = 1.0; + lightElev = 45.0; + lightIntensity = 1.0; + backgroundImage = null; + destImageCafe = null; + sourceNoiseMap = null; + recalcLightValues = true; + + buildGrayscaleGradient (); + } + + /// Adds a gradient point to this gradient object. + /// + /// @param gradientPos The position of this gradient point. + /// @param gradientColor The color of this gradient point. + /// + /// @pre No two gradient points have the same position. + /// + /// @throw noise::ExceptionInvalidParam See the preconditions. + /// + /// This object uses a color gradient to calculate the color for each + /// pixel in the destination image according to the value from the + /// corresponding position in the noise map. + /// + /// The gradient requires a minimum of two gradient points. + /// + /// The specified color value passed to this method has an alpha + /// channel. This alpha channel specifies how a pixel in the + /// background image (if specified) is blended with the calculated + /// color. If the alpha value is high, this object weighs the blend + /// towards the calculated color, and if the alpha value is low, this + /// object weighs the blend towards the color from the corresponding + /// pixel in the background image. + public void addGradientPoint (double gradientPos, ColorCafe gradientColor) throws ExceptionInvalidParam + { + gradient.addGradientPoint (gradientPos, gradientColor); + } + + /// Builds a grayscale gradient. + /// + /// @post The original gradient is cleared and a grayscale gradient is + /// created. + /// + /// This color gradient contains the following gradient points: + /// - -1.0 maps to black + /// - 1.0 maps to white + public void buildGrayscaleGradient () throws ExceptionInvalidParam + { + clearGradient (); + gradient.addGradientPoint (-1.0, new ColorCafe ( 0, 0, 0, 255)); + gradient.addGradientPoint ( 1.0, new ColorCafe (255, 255, 255, 255)); + } + + /// Builds a color gradient suitable for terrain. + /// + /// @post The original gradient is cleared and a terrain gradient is + /// created. + /// + /// This gradient color at position 0.0 is the "sea level". Above + /// that value, the gradient contains greens, browns, and whites. + /// Below that value, the gradient contains various shades of blue. + public void buildTerrainGradient () throws ExceptionInvalidParam + { + clearGradient (); + gradient.addGradientPoint (-1.00, new ColorCafe ( 0, 0, 128, 255)); + gradient.addGradientPoint (-0.20, new ColorCafe ( 32, 64, 128, 255)); + gradient.addGradientPoint (-0.04, new ColorCafe ( 64, 96, 192, 255)); + gradient.addGradientPoint (-0.02, new ColorCafe (192, 192, 128, 255)); + gradient.addGradientPoint ( 0.00, new ColorCafe ( 0, 192, 0, 255)); + gradient.addGradientPoint ( 0.25, new ColorCafe (192, 192, 0, 255)); + gradient.addGradientPoint ( 0.50, new ColorCafe (160, 96, 64, 255)); + gradient.addGradientPoint ( 0.75, new ColorCafe (128, 255, 255, 255)); + gradient.addGradientPoint ( 1.00, new ColorCafe (255, 255, 255, 255)); + } + + /// Calculates the destination color. + /// + /// @param sourceColor The source color generated from the color + /// gradient. + /// @param backgroundColor The color from the background image at the + /// corresponding position. + /// @param lightValue The intensity of the light at that position. + /// + /// @returns The destination color. + public ColorCafe calcDestColor (ColorCafe sourceColor, ColorCafe backgroundColor, + double lightValue) + { + double sourceRed = (double)sourceColor.red / 255.0; + double sourceGreen = (double)sourceColor.green / 255.0; + double sourceBlue = (double)sourceColor.blue / 255.0; + double sourceAlpha = (double)sourceColor.alpha / 255.0; + double backgroundRed = (double)backgroundColor.red / 255.0; + double backgroundGreen = (double)backgroundColor.green / 255.0; + double backgroundBlue = (double)backgroundColor.blue / 255.0; + + // First, blend the source color to the background color using the alpha + // of the source color. + double red = Interp.linearInterp (backgroundRed, sourceRed , sourceAlpha); + double green = Interp.linearInterp (backgroundGreen, sourceGreen, sourceAlpha); + double blue = Interp.linearInterp (backgroundBlue, sourceBlue , sourceAlpha); + + if (isLightEnabled) + { + // Now calculate the light color. + double lightRed = lightValue * (double)lightColor.red / 255.0; + double lightGreen = lightValue * (double)lightColor.green / 255.0; + double lightBlue = lightValue * (double)lightColor.blue / 255.0; + + // Apply the light color to the new color. + red *= lightRed ; + green *= lightGreen; + blue *= lightBlue ; + } + + // Clamp the color channels to the (0..1) range. + red = (red < 0.0)? 0.0: red ; + red = (red > 1.0)? 1.0: red ; + green = (green < 0.0)? 0.0: green; + green = (green > 1.0)? 1.0: green; + blue = (blue < 0.0)? 0.0: blue ; + blue = (blue > 1.0)? 1.0: blue ; + + // Rescale the color channels to the noise::uint8 (0..255) range and return + // the new color. + ColorCafe newColor = new ColorCafe((int)(red * 255.0) & 0xff,(int)(green * 255.0) & 0xff, + (int)(blue * 255.0) & 0xff, Math.max (sourceColor.alpha, backgroundColor.alpha)); + return newColor; + } + + /// Calculates the intensity of the light given some elevation values. + /// + /// @param center Elevation of the center point. + /// @param left Elevation of the point directly left of the center + /// point. + /// @param right Elevation of the point directly right of the center + /// point. + /// @param down Elevation of the point directly below the center + /// point. + /// @param up Elevation of the point directly above the center point. + /// + /// These values come directly from the noise map. + public double calcLightIntensity (double center, double left, + double right, double down, double up) + { + // Recalculate the sine and cosine of the various light values if + // necessary so it does not have to be calculated each time this method is + // called. + if (recalcLightValues) { + cosAzimuth = Math.cos (Math.toRadians(lightAzimuth)); + sinAzimuth = Math.sin (Math.toRadians(lightAzimuth)); + cosElev = Math.cos (Math.toRadians(lightElev)); + sinElev = Math.sin (Math.toRadians(lightElev)); + recalcLightValues = false; + } + + // Now do the lighting calculations. + double I_MAX = 1.0; + double io = I_MAX * SQRT_2 * sinElev / 2.0; + double ix = (I_MAX - io) * lightContrast * SQRT_2 * cosElev + * cosAzimuth; + double iy = (I_MAX - io) * lightContrast * SQRT_2 * cosElev + * sinAzimuth; + double intensity = (ix * (left - right) + iy * (down - up) + io); + + if (intensity < 0.0) + intensity = 0.0; + + return intensity; + } + + /// Clears the color gradient. + /// + /// Before calling the render() method, the application must specify a + /// new color gradient with at least two gradient points. + public void clearGradient () + { + gradient = new GradientColor(); + gradient.clear(); + } + + /// Renders the destination image using the contents of the source + /// noise map and an optional background image. + /// + /// @pre setSourceNoiseMap() has been previously called. + /// @pre setDestImage() has been previously called. + /// @pre There are at least two gradient points in the color gradient. + /// @pre No two gradient points have the same position. + /// @pre If a background image was specified, it has the exact same + /// size as the source height map. + /// + /// @post The original contents of the destination image is destroyed. + /// + /// @throw ExceptionInvalidParam See the preconditions. + /// + /// The background image and the destination image can safely refer to + /// the same image, although in this case, the destination image is + /// irretrievably blended into the background image. + public void render () throws ExceptionInvalidParam + { + if ( sourceNoiseMap == null + || destImageCafe == null + || sourceNoiseMap.getWidth () <= 0 + || sourceNoiseMap.getHeight () <= 0 + || gradient.getGradientPointCount () < 2) + throw new ExceptionInvalidParam ("Invalid Parameter in RendererImage"); + + + int width = sourceNoiseMap.getWidth (); + int height = sourceNoiseMap.getHeight (); + + // If a background image was provided, make sure it is the same size the + // source noise map. + if (backgroundImage != null) + if ( backgroundImage.getWidth () != width || backgroundImage.getHeight () != height) + throw new ExceptionInvalidParam ("Invalid Parameter in RendererImage"); + + + // Create the destination image. It is safe to reuse it if this is also the + // background image. + if (destImageCafe != backgroundImage) + destImageCafe.setSize (width, height); + + for (int y = 0; y < height; y++) + { + ColorCafe background = new ColorCafe(255, 255, 255, 255); + + for (int x = 0; x < width; x++) + { + // Get the color based on the value at the current point in the noise + // map. + ColorCafe destColor = gradient.getColor (sourceNoiseMap.getValue(x,y)); + + // If lighting is enabled, calculate the light intensity based on the + // rate of change at the current point in the noise map. + double lightIntensity; + if (isLightEnabled) + { + // Calculate the positions of the current point's four-neighbors. + int xLeftOffset, xRightOffset; + int yUpOffset , yDownOffset ; + if (isWrapEnabled) + { + if (x == 0) + { + xLeftOffset = (int)width - 1; + xRightOffset = 1;} + else if (x == (int)width - 1) + { + xLeftOffset = -1; + xRightOffset = -((int)width - 1); + } + else + { + xLeftOffset = -1; + xRightOffset = 1; + } + + if (y == 0) + { + yDownOffset = (int)height - 1; + yUpOffset = 1; + } + else if (y == (int)height - 1) + { + yDownOffset = -1; + yUpOffset = -((int)height - 1); + } + else + { + yDownOffset = -1; + yUpOffset = 1; + } + } + else + { + if (x == 0) + { + xLeftOffset = 0; + xRightOffset = 1; + } + else if (x == (int)width - 1) + { + xLeftOffset = -1; + xRightOffset = 0; + } + else + { + xLeftOffset = -1; + xRightOffset = 1; + } + + if (y == 0) + { + yDownOffset = 0; + yUpOffset = 1; + } + else if (y == (int)height - 1) + { + yDownOffset = -1; + yUpOffset = 0; + } + else + { + yDownOffset = -1; + yUpOffset = 1; + } + } + + // Get the noise value of the current point in the source noise map + // and the noise values of its four-neighbors. + double nc = (double)(sourceNoiseMap.getValue(x,y)); + double nl = (double)(sourceNoiseMap.getValue(x + xLeftOffset, y)); + double nr = (double)(sourceNoiseMap.getValue(x + xRightOffset, y)); + double nd = (double)(sourceNoiseMap.getValue(x,y + yDownOffset)); + double nu = (double)(sourceNoiseMap.getValue(x,y + yUpOffset)); + + // Now we can calculate the lighting intensity. + lightIntensity = calcLightIntensity (nc, nl, nr, nd, nu); + lightIntensity *= lightBrightness; + + } + else + { + // These values will apply no lighting to the destination image. + lightIntensity = 1.0; + } + + // Get the current background color from the background image. + ColorCafe backgroundColor = new ColorCafe (255, 255, 255, 255); + if (backgroundImage != null) + backgroundColor = backgroundImage.getValue(x, y); + + // Blend the destination color, background color, and the light + // intensity together, then update the destination image with that + // color. + destImageCafe.setValue(x, y, calcDestColor (destColor, backgroundColor, lightIntensity)); + } + } + } + + /// Enables or disables the light source. + /// + /// @param enable A flag that enables or disables the light source. + /// + /// If the light source is enabled, this object will interpret the + /// noise map as a bump map. + public void enableLight (boolean enable) + { + isLightEnabled = enable; + } + + /// Enables or disables noise-map wrapping. + /// + /// @param enable A flag that enables or disables noise-map wrapping. + /// + /// This object requires five points (the initial point and its four + /// neighbors) to calculate light shading. If wrapping is enabled, + /// and the initial point is on the edge of the noise map, the + /// appropriate neighbors that lie outside of the noise map will + /// "wrap" to the opposite side(s) of the noise map. Otherwise, the + /// appropriate neighbors are cropped to the edge of the noise map. + /// + /// Enabling wrapping is useful when creating spherical renderings and + /// tileable textures. + public void enableWrap (boolean enable) + { + isWrapEnabled = enable; + } + + /// Returns the azimuth of the light source, in degrees. + /// + /// @returns The azimuth of the light source. + /// + /// The azimuth is the location of the light source around the + /// horizon: + /// - 0.0 degrees is east. + /// - 90.0 degrees is north. + /// - 180.0 degrees is west. + /// - 270.0 degrees is south. + public double getLightAzimuth () + { + return lightAzimuth; + } + + /// Returns the brightness of the light source. + /// + /// @returns The brightness of the light source. + public double getLightBrightness () + { + return lightBrightness; + } + + /// Returns the color of the light source. + /// + /// @returns The color of the light source. + public ColorCafe getLightColor () + { + return lightColor; + } + + /// Returns the contrast of the light source. + /// + /// @returns The contrast of the light source. + /// + /// The contrast specifies how sharp the boundary is between the + /// light-facing areas and the shadowed areas. + /// + /// The contrast determines the difference between areas in light and + /// areas in shadow. Determining the correct contrast amount requires + /// some trial and error, but if your application interprets the noise + /// map as a height map that has a spatial resolution of @a h meters + /// and an elevation resolution of 1 meter, a good contrast amount to + /// use is ( 1.0 / @a h ). + public double getLightContrast () + { + return lightContrast; + } + + /// Returns the elevation of the light source, in degrees. + /// + /// @returns The elevation of the light source. + /// + /// The elevation is the angle above the horizon: + /// - 0 degrees is on the horizon. + /// - 90 degrees is straight up. + public double getLightElev () + { + return lightElev; + } + + /// Returns the intensity of the light source. + /// + /// @returns The intensity of the light source. + public double getLightIntensity () + { + return lightIntensity; + } + + /// Determines if the light source is enabled. + /// + /// @returns + /// - @a true if the light source is enabled. + /// - @a false if the light source is disabled. + public boolean isLightEnabled () + { + return isLightEnabled; + } + + /// Determines if noise-map wrapping is enabled. + /// + /// @returns + /// - @a true if noise-map wrapping is enabled. + /// - @a false if noise-map wrapping is disabled. + /// + /// This object requires five points (the initial point and its four + /// neighbors) to calculate light shading. If wrapping is enabled, + /// and the initial point is on the edge of the noise map, the + /// appropriate neighbors that lie outside of the noise map will + /// "wrap" to the opposite side(s) of the noise map. Otherwise, the + /// appropriate neighbors are cropped to the edge of the noise map. + /// + /// Enabling wrapping is useful when creating spherical renderings and + /// tileable textures + public boolean isWrapEnabled () + { + return isWrapEnabled; + } + + /// Sets the background image. + /// + /// @param backgroundImage The background image. + /// + /// If a background image has been specified, the Render() method + /// blends the pixels from the background image onto the corresponding + /// pixels in the destination image. The blending weights are + /// determined by the alpha channel in the pixels in the destination + /// image. + /// + /// The destination image must exist throughout the lifetime of this + /// object unless another image replaces that image. + public void setBackgroundImage (ImageCafe backgroundImage) + { + this.backgroundImage = backgroundImage; + } + + /// Sets the destination image. + /// + /// @param destImage The destination image. + /// + /// The destination image will contain the rendered image after a + /// successful call to the Render() method. + /// + /// The destination image must exist throughout the lifetime of this + /// object unless another image replaces that image. + public void setDestImage (ImageCafe destImage) + { + this.destImageCafe = destImage; + } + + /// Sets the azimuth of the light source, in degrees. + /// + /// @param lightAzimuth The azimuth of the light source. + /// + /// The azimuth is the location of the light source around the + /// horizon: + /// - 0.0 degrees is east. + /// - 90.0 degrees is north. + /// - 180.0 degrees is west. + /// - 270.0 degrees is south. + /// + /// Make sure the light source is enabled via a call to the + /// EnableLight() method before calling the Render() method. + public void setLightAzimuth (double lightAzimuth) + { + this.lightAzimuth = lightAzimuth; + this.recalcLightValues = true; + } + + /// Sets the brightness of the light source. + /// + /// @param lightBrightness The brightness of the light source. + /// + /// Make sure the light source is enabled via a call to the + /// EnableLight() method before calling the Render() method. + public void setLightBrightness (double lightBrightness) + { + this.lightBrightness = lightBrightness; + this.recalcLightValues = true; + } + + /// Sets the color of the light source. + /// + /// @param lightColor The light color. + /// + /// Make sure the light source is enabled via a call to the + /// EnableLight() method before calling the Render() method. + public void setLightColor (ColorCafe lightColor) + { + this.lightColor = lightColor; + } + + /// Sets the contrast of the light source. + /// + /// @param lightContrast The contrast of the light source. + /// + /// @pre The specified light contrast is positive. + /// + /// @throw noise::ExceptionInvalidParam See the preconditions. + /// + /// The contrast specifies how sharp the boundary is between the + /// light-facing areas and the shadowed areas. + /// + /// The contrast determines the difference between areas in light and + /// areas in shadow. Determining the correct contrast amount requires + /// some trial and error, but if your application interprets the noise + /// map as a height map that has a spatial resolution of @a h meters + /// and an elevation resolution of 1 meter, a good contrast amount to + /// use is ( 1.0 / @a h ). + /// + /// Make sure the light source is enabled via a call to the + /// EnableLight() method before calling the Render() method. + public void setLightContrast (double lightContrast) throws ExceptionInvalidParam + { + if (lightContrast <= 0.0) + throw new ExceptionInvalidParam ("Invalid Parameter in RendererImage"); + + + this.lightContrast = lightContrast; + this.recalcLightValues = true; + } + + /// Sets the elevation of the light source, in degrees. + /// + /// @param lightElev The elevation of the light source. + /// + /// The elevation is the angle above the horizon: + /// - 0 degrees is on the horizon. + /// - 90 degrees is straight up. + /// + /// Make sure the light source is enabled via a call to the + /// EnableLight() method before calling the Render() method. + public void setLightElev (double lightElev) + { + this.lightElev = lightElev; + this.recalcLightValues = true; + } + + /// Sets the intensity of the light source. + /// + /// @returns The intensity of the light source. + /// + /// A good value for intensity is 2.0. + /// + /// Make sure the light source is enabled via a call to the + /// enableLight() method before calling the render() method. + public void setLightIntensity (double lightIntensity) throws ExceptionInvalidParam + { + if (lightIntensity < 0.0) + throw new ExceptionInvalidParam ("Invalid Parameter in RendererImage"); + + this.lightIntensity = lightIntensity; + this.recalcLightValues = true; + } + + /// Sets the source noise map. + /// + /// @param sourceNoiseMap The source noise map. + /// + /// The destination image must exist throughout the lifetime of this + /// object unless another image replaces that image. + public void setSourceNoiseMap (NoiseMap sourceNoiseMap) + { + this.sourceNoiseMap = sourceNoiseMap; + } + +} diff --git a/src/libnoiseforjava/util/RendererNormalMap.java b/src/libnoiseforjava/util/RendererNormalMap.java index f9320a5..c3b648b 100644 --- a/src/libnoiseforjava/util/RendererNormalMap.java +++ b/src/libnoiseforjava/util/RendererNormalMap.java @@ -1,316 +1,316 @@ -/* - * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) - * Copyright © 2010 Thomas J. Hodge (java port of libnoise) - * - * This file is part of libnoiseforjava. - * - * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at - * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be - * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). - * Porting to Java was done by Thomas Hodge, who may be contacted at - * libnoisezagforjava@gzagmail.com (remove every 'zag'). - * - * libnoiseforjava is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * libnoiseforjava 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * libnoiseforjava. If not, see . - * - */ - -package libnoiseforjava.util; - -import libnoiseforjava.exception.ExceptionInvalidParam; - -public class RendererNormalMap -{ - /// Renders a normal map from a noise map. - /// - /// This class renders an image containing the normal vectors from a noise - /// map object. This image can then be used as a bump map for a 3D - /// application or game. - /// - /// This class encodes the (x, y, z) components of the normal vector into - /// the (red, green, blue) channels of the image. Like any 24-bit - /// true-color image, the channel values range from 0 to 255. 0 - /// represents a normal coordinate of -1.0 and 255 represents a normal - /// coordinate of +1.0. - /// - /// You should also specify the bump height before rendering the - /// normal map. The bump height specifies the ratio of spatial resolution - /// to elevation resolution. For example, if your noise map has a spatial - /// resolution of 30 meters and an elevation resolution of one meter, set - /// the bump height to 1.0 / 30.0. - /// - /// Rendering the normal map - /// - /// To render the image containing the normal map, perform the following - /// steps: - /// - Pass a NoiseMap object to the setSourceNoiseMap() method. - /// - Pass an ImageCafe object to the setDestImage() method. - /// - Call the render() method. - - /// The bump height for the normal map. - double bumpHeight; - - /// A flag specifying whether wrapping is enabled. - boolean isWrapEnabled; - - /// A pointer to the destination image. - ImageCafe destImageCafe; - - /// A pointer to the source noise map. - NoiseMap sourceNoiseMap; - - - public RendererNormalMap () throws ExceptionInvalidParam - { - bumpHeight = 1.0; - isWrapEnabled = false; - destImageCafe = new ImageCafe(0,0); - sourceNoiseMap = new NoiseMap(0,0); - } - - public RendererNormalMap (int height, int width) throws ExceptionInvalidParam - { - bumpHeight = 1.0; - isWrapEnabled = false; - destImageCafe = new ImageCafe(height, width); - sourceNoiseMap = new NoiseMap(height, width); - } - - /// Calculates the normal vector at a given point on the noise map. - /// - /// @param nc The height of the given point in the noise map. - /// @param nr The height of the left neighbor. - /// @param nu The height of the up neighbor. - /// @param bumpHeight The bump height. - /// - /// @returns The normal vector represented as a color. - /// - /// This method encodes the (x, y, z) components of the normal vector - /// into the (red, green, blue) channels of the returned color. In - /// order to represent the vector as a color, each coordinate of the - /// normal is mapped from the -1.0 to 1.0 range to the 0 to 255 range. - /// - /// The bump height specifies the ratio of spatial resolution to - /// elevation resolution. For example, if your noise map has a - /// spatial resolution of 30 meters and an elevation resolution of one - /// meter, set the bump height to 1.0 / 30.0. - /// - /// The spatial resolution and elevation resolution are determined by - /// the application. - public ColorCafe calcNormalColor (double nc, double nr, double nu, - double bumpHeight) - { - // Calculate the surface normal. - nc *= bumpHeight; - nr *= bumpHeight; - nu *= bumpHeight; - double ncr = (nc - nr); - double ncu = (nc - nu); - double d = Math.sqrt ((ncu * ncu) + (ncr * ncr) + 1); - double vxc = (nc - nr) / d; - double vyc = (nc - nu) / d; - double vzc = 1.0 / d; - - // Map the normal range from the (-1.0 .. +1.0) range to the (0 .. 255) - // range. - int xc, yc, zc; - xc = (int) (Math.floor((vxc + 1.0) * 127.5)) & 0xff; - yc = (int) (Math.floor((vyc + 1.0) * 127.5)) & 0xff; - zc = (int) (Math.floor((vzc + 1.0) * 127.5)) & 0xff; - - // left as example of what was here in case above conversion doesn't work. - //zc = (noise::uint8)((noise::uint)((floor)((vzc + 1.0) * 127.5)) & 0xff); - - return new ColorCafe (xc, yc, zc, 255); - } - - /// Renders the noise map to the destination image. - /// - /// @pre setSourceNoiseMap() has been previously called. - /// @pre setDestImage() has been previously called. - /// - /// @post The original contents of the destination image is destroyed. - /// - /// @throw ExceptionInvalidParam See the preconditions. - public void render () throws ExceptionInvalidParam - { - if ( sourceNoiseMap == null - || destImageCafe == null - || sourceNoiseMap.getWidth () <= 0 - || sourceNoiseMap.getHeight () <= 0) - throw new ExceptionInvalidParam ("Invalid Parameter in RendererNormalMap"); - - - int width = sourceNoiseMap.getWidth (); - int height = sourceNoiseMap.getHeight (); - - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - // Calculate the positions of the current point's right and up - // neighbors. - int xRightOffset, yUpOffset; - if (isWrapEnabled) - { - if (x == (int)width - 1) - xRightOffset = -((int)width - 1); - else - xRightOffset = 1; - - if (y == (int)height - 1) - yUpOffset = -((int)height - 1); - else - yUpOffset = 1; - } - else - { - if (x == (int)width - 1) - xRightOffset = 0; - else - xRightOffset = 1; - - if (y == (int)height - 1) - yUpOffset = 0; - else - yUpOffset = 1; - - } - - // Get the noise value of the current point in the source noise map - // and the noise values of its right and up neighbors. - double nc = (double)(sourceNoiseMap.getValue(x, y)); - double nr = (double)(sourceNoiseMap.getValue((x + xRightOffset),y)); - double nu = (double)(sourceNoiseMap.getValue(x, (y + yUpOffset))); - - // Calculate the normal product. - destImageCafe.setValue(x,y, (calcNormalColor (nc, nr, nu, bumpHeight))); - - // Go to the next point. - //++pSource; - //++pDest; - } - } - } - - /// Enables or disables noise-map wrapping. - /// - /// @param enable A flag that enables or disables noise-map wrapping. - /// - /// This object requires three points (the initial point and the right - /// and up neighbors) to calculate the normal vector at that point. - /// If wrapping is/ enabled, and the initial point is on the edge of - /// the noise map, the appropriate neighbors that lie outside of the - /// noise map will "wrap" to the opposite side(s) of the noise map. - /// Otherwise, the appropriate neighbors are cropped to the edge of - /// the noise map. - /// - /// Enabling wrapping is useful when creating spherical and tileable - /// normal maps. - public void enableWrap (boolean enable) - { - isWrapEnabled = enable; - } - - /// Returns the bump height. - /// - /// @returns The bump height. - /// - /// The bump height specifies the ratio of spatial resolution to - /// elevation resolution. For example, if your noise map has a - /// spatial resolution of 30 meters and an elevation resolution of one - /// meter, set the bump height to 1.0 / 30.0. - /// - /// The spatial resolution and elevation resolution are determined by - /// the application. - public double getBumpHeight () - { - return bumpHeight; - } - - /// Determines if noise-map wrapping is enabled. - /// - /// @returns - /// - @a true if noise-map wrapping is enabled. - /// - @a false if noise-map wrapping is disabled. - /// - /// This object requires three points (the initial point and the right - /// and up neighbors) to calculate the normal vector at that point. - /// If wrapping is/ enabled, and the initial point is on the edge of - /// the noise map, the appropriate neighbors that lie outside of the - /// noise map will "wrap" to the opposite side(s) of the noise map. - /// Otherwise, the appropriate neighbors are cropped to the edge of - /// the noise map. - /// - /// Enabling wrapping is useful when creating spherical and tileable - /// normal maps. - public boolean isWrapEnabled () - { - return isWrapEnabled; - } - - /// Sets the bump height. - /// - /// @param bumpHeight The bump height. - /// - /// The bump height specifies the ratio of spatial resolution to - /// elevation resolution. For example, if your noise map has a - /// spatial resolution of 30 meters and an elevation resolution of one - /// meter, set the bump height to 1.0 / 30.0. - /// - /// The spatial resolution and elevation resolution are determined by - /// the application. - public void setBumpHeight (double bumpHeight) - { - this.bumpHeight = bumpHeight; - } - - /// Sets the destination image. - /// - /// @param destImage The destination image. - /// - /// The destination image will contain the normal map after a - /// successful call to the render() method. - /// - /// The destination image must exist throughout the lifetime of this - /// object unless another image replaces that image. - public void setDestImage (ImageCafe destImage) - { - this.destImageCafe = destImage; - } - - /// Sets the source noise map. - /// - /// @param sourceNoiseMap The source noise map. - /// - /// The destination image must exist throughout the lifetime of this - /// object unless another image replaces that image. - public void setSourceNoiseMap (NoiseMap sourceNoiseMap) - { - this.sourceNoiseMap = sourceNoiseMap; - } - - public ImageCafe getDestImageCafe() - { - return destImageCafe; - } - - public NoiseMap getSourceNoiseMap() - { - return sourceNoiseMap; - } - - public void setDestImageCafe(ImageCafe destImageCafe) - { - this.destImageCafe = destImageCafe; - } - -} +/* + * Copyright (C) 2003, 2004 Jason Bevins (original libnoise code) + * Copyright 2010 Thomas J. Hodge (java port of libnoise) + * + * This file is part of libnoiseforjava. + * + * libnoiseforjava is a Java port of the C++ library libnoise, which may be found at + * http://libnoise.sourceforge.net/. libnoise was developed by Jason Bevins, who may be + * contacted at jlbezigvins@gmzigail.com (for great email, take off every 'zig'). + * Porting to Java was done by Thomas Hodge, who may be contacted at + * libnoisezagforjava@gzagmail.com (remove every 'zag'). + * + * libnoiseforjava is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * libnoiseforjava 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * libnoiseforjava. If not, see . + * + */ + +package libnoiseforjava.util; + +import libnoiseforjava.exception.ExceptionInvalidParam; + +public class RendererNormalMap +{ + /// Renders a normal map from a noise map. + /// + /// This class renders an image containing the normal vectors from a noise + /// map object. This image can then be used as a bump map for a 3D + /// application or game. + /// + /// This class encodes the (x, y, z) components of the normal vector into + /// the (red, green, blue) channels of the image. Like any 24-bit + /// true-color image, the channel values range from 0 to 255. 0 + /// represents a normal coordinate of -1.0 and 255 represents a normal + /// coordinate of +1.0. + /// + /// You should also specify the bump height before rendering the + /// normal map. The bump height specifies the ratio of spatial resolution + /// to elevation resolution. For example, if your noise map has a spatial + /// resolution of 30 meters and an elevation resolution of one meter, set + /// the bump height to 1.0 / 30.0. + /// + /// Rendering the normal map + /// + /// To render the image containing the normal map, perform the following + /// steps: + /// - Pass a NoiseMap object to the setSourceNoiseMap() method. + /// - Pass an ImageCafe object to the setDestImage() method. + /// - Call the render() method. + + /// The bump height for the normal map. + double bumpHeight; + + /// A flag specifying whether wrapping is enabled. + boolean isWrapEnabled; + + /// A pointer to the destination image. + ImageCafe destImageCafe; + + /// A pointer to the source noise map. + NoiseMap sourceNoiseMap; + + + public RendererNormalMap () throws ExceptionInvalidParam + { + bumpHeight = 1.0; + isWrapEnabled = false; + destImageCafe = new ImageCafe(0,0); + sourceNoiseMap = new NoiseMap(0,0); + } + + public RendererNormalMap (int height, int width) throws ExceptionInvalidParam + { + bumpHeight = 1.0; + isWrapEnabled = false; + destImageCafe = new ImageCafe(height, width); + sourceNoiseMap = new NoiseMap(height, width); + } + + /// Calculates the normal vector at a given point on the noise map. + /// + /// @param nc The height of the given point in the noise map. + /// @param nr The height of the left neighbor. + /// @param nu The height of the up neighbor. + /// @param bumpHeight The bump height. + /// + /// @returns The normal vector represented as a color. + /// + /// This method encodes the (x, y, z) components of the normal vector + /// into the (red, green, blue) channels of the returned color. In + /// order to represent the vector as a color, each coordinate of the + /// normal is mapped from the -1.0 to 1.0 range to the 0 to 255 range. + /// + /// The bump height specifies the ratio of spatial resolution to + /// elevation resolution. For example, if your noise map has a + /// spatial resolution of 30 meters and an elevation resolution of one + /// meter, set the bump height to 1.0 / 30.0. + /// + /// The spatial resolution and elevation resolution are determined by + /// the application. + public ColorCafe calcNormalColor (double nc, double nr, double nu, + double bumpHeight) + { + // Calculate the surface normal. + nc *= bumpHeight; + nr *= bumpHeight; + nu *= bumpHeight; + double ncr = (nc - nr); + double ncu = (nc - nu); + double d = Math.sqrt ((ncu * ncu) + (ncr * ncr) + 1); + double vxc = (nc - nr) / d; + double vyc = (nc - nu) / d; + double vzc = 1.0 / d; + + // Map the normal range from the (-1.0 .. +1.0) range to the (0 .. 255) + // range. + int xc, yc, zc; + xc = (int) (Math.floor((vxc + 1.0) * 127.5)) & 0xff; + yc = (int) (Math.floor((vyc + 1.0) * 127.5)) & 0xff; + zc = (int) (Math.floor((vzc + 1.0) * 127.5)) & 0xff; + + // left as example of what was here in case above conversion doesn't work. + //zc = (noise::uint8)((noise::uint)((floor)((vzc + 1.0) * 127.5)) & 0xff); + + return new ColorCafe (xc, yc, zc, 255); + } + + /// Renders the noise map to the destination image. + /// + /// @pre setSourceNoiseMap() has been previously called. + /// @pre setDestImage() has been previously called. + /// + /// @post The original contents of the destination image is destroyed. + /// + /// @throw ExceptionInvalidParam See the preconditions. + public void render () throws ExceptionInvalidParam + { + if ( sourceNoiseMap == null + || destImageCafe == null + || sourceNoiseMap.getWidth () <= 0 + || sourceNoiseMap.getHeight () <= 0) + throw new ExceptionInvalidParam ("Invalid Parameter in RendererNormalMap"); + + + int width = sourceNoiseMap.getWidth (); + int height = sourceNoiseMap.getHeight (); + + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + // Calculate the positions of the current point's right and up + // neighbors. + int xRightOffset, yUpOffset; + if (isWrapEnabled) + { + if (x == (int)width - 1) + xRightOffset = -((int)width - 1); + else + xRightOffset = 1; + + if (y == (int)height - 1) + yUpOffset = -((int)height - 1); + else + yUpOffset = 1; + } + else + { + if (x == (int)width - 1) + xRightOffset = 0; + else + xRightOffset = 1; + + if (y == (int)height - 1) + yUpOffset = 0; + else + yUpOffset = 1; + + } + + // Get the noise value of the current point in the source noise map + // and the noise values of its right and up neighbors. + double nc = (double)(sourceNoiseMap.getValue(x, y)); + double nr = (double)(sourceNoiseMap.getValue((x + xRightOffset),y)); + double nu = (double)(sourceNoiseMap.getValue(x, (y + yUpOffset))); + + // Calculate the normal product. + destImageCafe.setValue(x,y, (calcNormalColor (nc, nr, nu, bumpHeight))); + + // Go to the next point. + //++pSource; + //++pDest; + } + } + } + + /// Enables or disables noise-map wrapping. + /// + /// @param enable A flag that enables or disables noise-map wrapping. + /// + /// This object requires three points (the initial point and the right + /// and up neighbors) to calculate the normal vector at that point. + /// If wrapping is/ enabled, and the initial point is on the edge of + /// the noise map, the appropriate neighbors that lie outside of the + /// noise map will "wrap" to the opposite side(s) of the noise map. + /// Otherwise, the appropriate neighbors are cropped to the edge of + /// the noise map. + /// + /// Enabling wrapping is useful when creating spherical and tileable + /// normal maps. + public void enableWrap (boolean enable) + { + isWrapEnabled = enable; + } + + /// Returns the bump height. + /// + /// @returns The bump height. + /// + /// The bump height specifies the ratio of spatial resolution to + /// elevation resolution. For example, if your noise map has a + /// spatial resolution of 30 meters and an elevation resolution of one + /// meter, set the bump height to 1.0 / 30.0. + /// + /// The spatial resolution and elevation resolution are determined by + /// the application. + public double getBumpHeight () + { + return bumpHeight; + } + + /// Determines if noise-map wrapping is enabled. + /// + /// @returns + /// - @a true if noise-map wrapping is enabled. + /// - @a false if noise-map wrapping is disabled. + /// + /// This object requires three points (the initial point and the right + /// and up neighbors) to calculate the normal vector at that point. + /// If wrapping is/ enabled, and the initial point is on the edge of + /// the noise map, the appropriate neighbors that lie outside of the + /// noise map will "wrap" to the opposite side(s) of the noise map. + /// Otherwise, the appropriate neighbors are cropped to the edge of + /// the noise map. + /// + /// Enabling wrapping is useful when creating spherical and tileable + /// normal maps. + public boolean isWrapEnabled () + { + return isWrapEnabled; + } + + /// Sets the bump height. + /// + /// @param bumpHeight The bump height. + /// + /// The bump height specifies the ratio of spatial resolution to + /// elevation resolution. For example, if your noise map has a + /// spatial resolution of 30 meters and an elevation resolution of one + /// meter, set the bump height to 1.0 / 30.0. + /// + /// The spatial resolution and elevation resolution are determined by + /// the application. + public void setBumpHeight (double bumpHeight) + { + this.bumpHeight = bumpHeight; + } + + /// Sets the destination image. + /// + /// @param destImage The destination image. + /// + /// The destination image will contain the normal map after a + /// successful call to the render() method. + /// + /// The destination image must exist throughout the lifetime of this + /// object unless another image replaces that image. + public void setDestImage (ImageCafe destImage) + { + this.destImageCafe = destImage; + } + + /// Sets the source noise map. + /// + /// @param sourceNoiseMap The source noise map. + /// + /// The destination image must exist throughout the lifetime of this + /// object unless another image replaces that image. + public void setSourceNoiseMap (NoiseMap sourceNoiseMap) + { + this.sourceNoiseMap = sourceNoiseMap; + } + + public ImageCafe getDestImageCafe() + { + return destImageCafe; + } + + public NoiseMap getSourceNoiseMap() + { + return sourceNoiseMap; + } + + public void setDestImageCafe(ImageCafe destImageCafe) + { + this.destImageCafe = destImageCafe; + } + +}