Class VroomNoise
java.lang.Object
com.github.yellowstonegames.grid.VroomNoise
- All Implemented Interfaces:
INoise, Externalizable, Serializable
A type of continuous noise that is meant to look "similar in character" regardless of dimension.
This is closely based on
This may be somewhat faster than FoamNoise, while maintaining similar traits when multiple octaves are used. It isn't exactly clear why generating planets using 5D VroomNoise is 10-20% faster than 5D FoamNoise (with non-noise steps taking much of that time). One possibility is that VroomNoise is faster because it doesn't have any data dependency between noise calls, so those calls could potentially be executed with instruction-level parallelism. Another possibility is that the measurement was flawed, and they're about the same speed. In any case, VroomNoise shouldn't ever be slower than FoamNoise, and it may look better with multiple octaves.
FoamNoise, but doesn't do any domain warping
between results. This lowers the quality of single-octave noise somewhat, but may improve the appearance of noise
using 3 or more octaves of FBM noise. Like FoamNoise in D dimensions, this makes D+1 calls to D-dimensional value
noise with different rotations, averages them, and sharpens the result. Unlike FoamNoise, the grid structure of the
value noise is noticeable in 4D and up. The grid quickly disappears if multiple octaves are used.
This may be somewhat faster than FoamNoise, while maintaining similar traits when multiple octaves are used. It isn't exactly clear why generating planets using 5D VroomNoise is 10-20% faster than 5D FoamNoise (with non-noise steps taking much of that time). One possibility is that VroomNoise is faster because it doesn't have any data dependency between noise calls, so those calls could potentially be executed with instruction-level parallelism. Another possibility is that the measurement was flawed, and they're about the same speed. In any case, VroomNoise shouldn't ever be slower than FoamNoise, and it may look better with multiple octaves.
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from interface INoise
INoise.Serializer -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final VroomNoiseprotected longUse the same seed for any noise that should be continuous (smooth) across calls to nearby points. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptioncopy()Creates a copy of this INoise, which should be a deep copy for any mutable state but can be shallow for immutable types such as functions.booleanintGets the maximum dimension supported by this generator, which is 7.intGets the minimum dimension supported by this generator, which is 2.floatgetNoise(float x, float y) Gets 2D noise usinggetSeed().floatgetNoise(float x, float y, float z) Gets 3D noise usinggetSeed().floatgetNoise(float x, float y, float z, float w) Gets 4D foam noise usinggetSeed().floatgetNoise(float x, float y, float z, float w, float u) Gets 5D noise withgetSeed().floatgetNoise(float x, float y, float z, float w, float u, float v) Gets 6D noise with a default or pre-set seed.floatgetNoise(float x, float y, float z, float w, float u, float v, float m) Gets 7D noise with a default or pre-set seed.floatgetNoiseWithSeed(float x, float y, float z, float w, float u, float v, float m, long seed) Gets 7D noise with a specific seed.floatgetNoiseWithSeed(float x, float y, float z, float w, float u, float v, long seed) Gets 6D noise with a specific seed.floatgetNoiseWithSeed(float x, float y, float z, float w, float u, long seed) Gets 5D noise with a specific seed.floatgetNoiseWithSeed(float x, float y, float z, float w, long seed) Gets 4D noise with a specific seed.floatgetNoiseWithSeed(float x, float y, float z, long seed) Gets 3D noise with a specific seed.floatgetNoiseWithSeed(float x, float y, long seed) Gets 2D noise with a specific seed.longgetSeed()Gets the current seed of the generator, as a long even if the seed is stored internally as an int.getTag()Returns the String "VroN", to be used as a unique tag for this generator.booleanReturns true because this generator can be seeded withsetSeed(long)and retrieved withgetSeed().inthashCode()static VroomNoiserecreateFromString(String data) voidsetSeed(long seed) Sets the seed to the given long, if long seeds are supported, or(int)seedif only int seeds are supported.stringDeserialize(String data) Given a serialized String produced byINoise.stringSerialize(), reassigns this INoise to have the described state from the given String.Produces a String that describes everything needed to recreate this INoise in full.toString()static floatvalueNoise(float x, float y, float z, float w, float u, float v, float m, long seed) static floatvalueNoise(float x, float y, float z, float w, float u, float v, long seed) static floatvalueNoise(float x, float y, float z, float w, float u, long seed) Gets 5D value noise with the lowest, fastest level of detail.static floatvalueNoise(float x, float y, float z, float w, long seed) Gets 4D value noise with the lowest, fastest level of detail.static floatvalueNoise(float x, float y, float z, long seed) Gets value noise with the lowest, fastest level of detail.static floatvalueNoise(float x, float y, long seed) Gets 2D value noise with the lowest, fastest level of detail.Methods inherited from interface INoise
readExternal, writeExternal
-
Field Details
-
seed
protected long seedUse the same seed for any noise that should be continuous (smooth) across calls to nearby points. -
instance
-
-
Constructor Details
-
VroomNoise
public VroomNoise() -
VroomNoise
public VroomNoise(long seed)
-
-
Method Details
-
getNoise
-
getNoiseWithSeed
public float getNoiseWithSeed(float x, float y, long seed) Gets 2D noise with a specific seed.- Specified by:
getNoiseWithSeedin interfaceINoise- Parameters:
x- x position; can be any finite floaty- y position; can be any finite floatseed- can be any long- Returns:
- a noise value between -1.0f and 1.0f, both inclusive
-
valueNoise
public static float valueNoise(float x, float y, long seed) Gets 2D value noise with the lowest, fastest level of detail. Uses the given seed and does not change x or y. This has a different output range (0 to 1) than foam noise.- Parameters:
x- x coordinatey- y coordinateseed- the seed to use for the noise (used in place ofgetSeed())- Returns:
- noise between 0 and 1
-
getNoise
-
getNoiseWithSeed
public float getNoiseWithSeed(float x, float y, float z, long seed) Gets 3D noise with a specific seed.- Specified by:
getNoiseWithSeedin interfaceINoise- Parameters:
x- x position; can be any finite floaty- y position; can be any finite floatz- z position; can be any finite floatseed- can be any long- Returns:
- a noise value between -1.0f and 1.0f, both inclusive
-
valueNoise
public static float valueNoise(float x, float y, float z, long seed) Gets value noise with the lowest, fastest level of detail. Uses the given seed and does not change x, y, or z. This has a different output range (0 to 1) than foam noise.- Parameters:
x- x coordinatey- y coordinatez- z coordinateseed- the seed to use for the noise (used in place ofgetSeed())- Returns:
- noise between 0 and 1
-
getNoise
-
getNoiseWithSeed
public float getNoiseWithSeed(float x, float y, float z, float w, long seed) Gets 4D noise with a specific seed.- Specified by:
getNoiseWithSeedin interfaceINoise- Parameters:
x- x position; can be any finite floaty- y position; can be any finite floatz- z position; can be any finite floatw- w position; can be any finite floatseed- can be any long- Returns:
- a noise value between -1.0f and 1.0f, both inclusive
-
valueNoise
public static float valueNoise(float x, float y, float z, float w, long seed) Gets 4D value noise with the lowest, fastest level of detail. Uses the given seed and does not change x, y, z, or w. This has a different output range (0 to 1) than foam noise.- Parameters:
x- x coordinatey- y coordinatez- z coordinatew- w coordinateseed- the seed to use for the noise (used in place ofgetSeed())- Returns:
- noise between 0 and 1
-
getNoise
public float getNoise(float x, float y, float z, float w, float u) Gets 5D noise withgetSeed().- Specified by:
getNoisein interfaceINoise- Parameters:
x- x position; can be any finite floaty- y position; can be any finite floatz- z position; can be any finite floatw- w position; can be any finite floatu- u position; can be any finite float- Returns:
- a noise value between -1.0f and 1.0f, both inclusive
-
getNoiseWithSeed
public float getNoiseWithSeed(float x, float y, float z, float w, float u, long seed) Gets 5D noise with a specific seed.- Specified by:
getNoiseWithSeedin interfaceINoise- Parameters:
x- x position; can be any finite floaty- y position; can be any finite floatz- z position; can be any finite floatw- w position; can be any finite floatu- u position; can be any finite floatseed- any long- Returns:
- a noise value between -1.0f and 1.0f, both inclusive
-
valueNoise
public static float valueNoise(float x, float y, float z, float w, float u, long seed) Gets 5D value noise with the lowest, fastest level of detail. Uses the given seed and does not change x, y, z, w, or u. This has a different output range (0 to 1) than foam noise.- Parameters:
x- x coordinatey- y coordinatez- z coordinatew- w coordinateu- u coordinateseed- the seed to use for the noise (used in place ofgetSeed())- Returns:
- noise between 0 and 1
-
getNoise
public float getNoise(float x, float y, float z, float w, float u, float v) Gets 6D noise with a default or pre-set seed.- Specified by:
getNoisein interfaceINoise- Parameters:
x- x position; can be any finite floaty- y position; can be any finite floatz- z position; can be any finite floatw- w position; can be any finite floatu- u position; can be any finite floatv- v position; can be any finite float- Returns:
- a noise value between -1.0f and 1.0f, both inclusive
-
getNoiseWithSeed
public float getNoiseWithSeed(float x, float y, float z, float w, float u, float v, long seed) Gets 6D noise with a specific seed.- Specified by:
getNoiseWithSeedin interfaceINoise- Parameters:
x- x position; can be any finite floaty- y position; can be any finite floatz- z position; can be any finite floatw- w position; can be any finite floatu- u position; can be any finite floatv- v position; can be any finite floatseed- any long- Returns:
- a noise value between -1.0f and 1.0f, both inclusive
-
valueNoise
public static float valueNoise(float x, float y, float z, float w, float u, float v, long seed) -
getNoise
public float getNoise(float x, float y, float z, float w, float u, float v, float m) Gets 7D noise with a default or pre-set seed.- Specified by:
getNoisein interfaceINoise- Parameters:
x- x position; can be any finite floaty- y position; can be any finite floatz- z position; can be any finite floatw- w position; can be any finite floatu- u position; can be any finite floatv- v position; can be any finite floatm- m position; can be any finite float- Returns:
- a noise value between -1.0f and 1.0f, both inclusive
-
getNoiseWithSeed
public float getNoiseWithSeed(float x, float y, float z, float w, float u, float v, float m, long seed) Gets 7D noise with a specific seed.- Specified by:
getNoiseWithSeedin interfaceINoise- Parameters:
x- x position; can be any finite floaty- y position; can be any finite floatz- z position; can be any finite floatw- w position; can be any finite floatu- u position; can be any finite floatv- v position; can be any finite floatm- m position; can be any finite floatseed- any long- Returns:
- a noise value between -1.0f and 1.0f, both inclusive
-
valueNoise
public static float valueNoise(float x, float y, float z, float w, float u, float v, float m, long seed) -
getTag
-
getMinDimension
public int getMinDimension()Gets the minimum dimension supported by this generator, which is 2.- Specified by:
getMinDimensionin interfaceINoise- Returns:
- the minimum supported dimension, which is 2 inclusive
-
getMaxDimension
public int getMaxDimension()Gets the maximum dimension supported by this generator, which is 7.- Specified by:
getMaxDimensionin interfaceINoise- Returns:
- the maximum supported dimension, which is 7
-
hasEfficientSetSeed
public boolean hasEfficientSetSeed()Returns true because this generator can be seeded withsetSeed(long)and retrieved withgetSeed().- Specified by:
hasEfficientSetSeedin interfaceINoise- Returns:
- true
-
setSeed
public void setSeed(long seed) Description copied from interface:INoiseSets the seed to the given long, if long seeds are supported, or(int)seedif only int seeds are supported. If this generator cannot be seeded, this should do nothing, and should not throw an exception. If this operation allocates or is time-intensive, thenINoise.hasEfficientSetSeed()should return false. That method is checked inINoise.getNoiseWithSeed(float, float, long), and if it returns false, the noise call will avoid calling setSeed(). You can always at least try to set the seed, even if it does nothing or is heavy on performance, and doing it a few times each frame should typically be fine for any generator. In the case this is called thousands of times each frame, checkINoise.hasEfficientSetSeed(). -
getSeed
public long getSeed()Description copied from interface:INoiseGets the current seed of the generator, as a long even if the seed is stored internally as an int. This must be implemented, but if the generator doesn't have a seed that can be expressed as a long (potentially usingBitConversion.floatToIntBits(float)), this can just return0. -
stringSerialize
Description copied from interface:INoiseProduces a String that describes everything needed to recreate this INoise in full. This String can be read back in byINoise.stringDeserialize(String)to reassign the described state to another INoise. The syntax here should always start and end with the`character, which is used byINoise.stringDeserialize(String)to identify the portion of a String that can be read back. The`character should not be otherwise used unless to serialize another INoise that this uses.
If you useBaseto produce String representations for numeric fields in an INoise,Base.BASE10is strongly recommended; in most cases, you can just use string concatenation with the fields separated by the tilde character,"~". For printing a floatfieldwith Base to a StringBuildersb, useBase.BASE10.appendGeneral(sb, field).
The default implementation throws anUnsupportedOperationExceptiononly. INoise classes do not have to implement any serialization methods, but they aren't serializable by the methods in this class or inINoise.Serializerunless they do implement this,INoise.getTag(),INoise.stringDeserialize(String), andINoise.copy().- Specified by:
stringSerializein interfaceINoise- Returns:
- a String that describes this INoise for serialization
-
stringDeserialize
Description copied from interface:INoiseGiven a serialized String produced byINoise.stringSerialize(), reassigns this INoise to have the described state from the given String. The serialized String must have been produced by the same class as this object is.
Any class that implementsINoise.stringSerialize()should also implement this method in a compatible way. Using base-10 is expected for most uses. UsingBase.BASE10.readFloat(data, start, end)may be useful to parse only the part of data between start and end.
The default implementation throws anUnsupportedOperationExceptiononly. INoise classes do not have to implement any serialization methods, but they aren't serializable by the methods in this class or inINoise.Serializerunless they do implement this,INoise.getTag(),INoise.stringSerialize(), andINoise.copy().- Specified by:
stringDeserializein interfaceINoise- Parameters:
data- a serialized String, typically produced byINoise.stringSerialize()- Returns:
- this INoise, after being modified (if possible)
-
recreateFromString
-
copy
Description copied from interface:INoiseCreates a copy of this INoise, which should be a deep copy for any mutable state but can be shallow for immutable types such as functions. This almost always just calls a copy constructor.
The default implementation throws anUnsupportedOperationExceptiononly. Implementors are strongly encouraged to implement this in general, and that is required to use an INoise class withINoise.Serializer. -
toString
-
equals
-
hashCode
-