530 lines
14 KiB
Kotlin
530 lines
14 KiB
Kotlin
package org.openrndr.extra.noise
|
|
|
|
import org.openrndr.math.Vector2
|
|
import org.openrndr.math.Vector3
|
|
import org.openrndr.math.Vector4
|
|
import kotlin.math.abs
|
|
|
|
inline fun fbm(
|
|
seed: Int, position: Vector4, crossinline noise: (Int, Double, Double, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
) =
|
|
fbm(seed, position.x, position.y, position.z, position.w, noise, octaves, lacunarity, gain)
|
|
|
|
inline fun fbm(
|
|
seed: Int,
|
|
x: Double,
|
|
y: Double,
|
|
z: Double,
|
|
w: Double,
|
|
crossinline noise: (Int, Double, Double, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): Double {
|
|
var sum = noise(seed, x, y, z, w)
|
|
var amp = 1.0
|
|
|
|
var lx = x
|
|
var ly = y
|
|
var lz = z
|
|
var lw = w
|
|
for (i in 1 until octaves) {
|
|
lx *= lacunarity
|
|
ly *= lacunarity
|
|
lz *= lacunarity
|
|
lw *= lacunarity
|
|
amp *= gain
|
|
sum += noise(seed + i, lx, ly, lz, lw) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun fbm(
|
|
seed: Int, position: Vector3, crossinline noise: (Int, Double, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
) =
|
|
fbm(seed, position.x, position.y, position.z, noise, octaves, lacunarity, gain)
|
|
|
|
inline fun fbm(
|
|
seed: Int, x: Double, y: Double, z: Double, crossinline noise: (Int, Double, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
): Double {
|
|
var sum = noise(seed, x, y, z)
|
|
var amp = 1.0
|
|
|
|
var lx = x
|
|
var ly = y
|
|
var lz = z
|
|
for (i in 1 until octaves) {
|
|
lx *= lacunarity
|
|
ly *= lacunarity
|
|
lz *= lacunarity
|
|
amp *= gain
|
|
sum += noise(seed + i, lx, ly, lz) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun fbm(
|
|
seed: Int, position: Vector2, crossinline noise: (Int, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
) =
|
|
fbm(seed, position.x, position.y, noise, octaves, lacunarity, gain)
|
|
|
|
inline fun fbm(
|
|
seed: Int, x: Double, y: Double, crossinline noise: (Int, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
): Double {
|
|
var sum = noise(seed, x, y)
|
|
var amp = 1.0
|
|
|
|
var lx = x
|
|
var ly = y
|
|
for (i in 1 until octaves) {
|
|
lx *= lacunarity
|
|
ly *= lacunarity
|
|
amp *= gain
|
|
sum += noise(seed + i, lx, ly) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun fbm(
|
|
seed: Int, x: Double, crossinline noise: (Int, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
): Double {
|
|
var sum = noise(seed, x)
|
|
var amp = 1.0
|
|
|
|
var lx = x
|
|
for (i in 1 until octaves) {
|
|
lx *= lacunarity
|
|
amp *= gain
|
|
sum += noise(seed + i, lx) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun fbmFunc1D(
|
|
crossinline noise: (Int, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double) -> Double {
|
|
return { seed, x ->
|
|
fbm(seed, x, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun fbmFunc2D(
|
|
crossinline noise: (Int, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double) -> Double {
|
|
return { seed, x, y ->
|
|
fbm(seed, x, y, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun fbmFunc3D(
|
|
crossinline noise: (Int, Double, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double) -> Double {
|
|
return { seed, x, y, z ->
|
|
fbm(seed, x, y, z, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun fbmFunc4D(
|
|
crossinline noise: (Int, Double, Double, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double, Double) -> Double {
|
|
return { seed, x, y, z, w ->
|
|
fbm(seed, x, y, z, w, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun billow(
|
|
seed: Int, position: Vector4, crossinline noise: (Int, Double, Double, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
) = billow(
|
|
seed, position.x, position.y,
|
|
position.z, position.w, noise, octaves, lacunarity, gain
|
|
)
|
|
|
|
inline fun billow(
|
|
seed: Int,
|
|
x: Double,
|
|
y: Double,
|
|
z: Double,
|
|
w: Double,
|
|
crossinline noise: (Int, Double, Double, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): Double {
|
|
var sum = abs(noise(seed, x, y, z, w) * 2.0 - 1.0)
|
|
var amp = 1.0
|
|
|
|
var x = x
|
|
var y = y
|
|
var z = z
|
|
var w = w
|
|
for (i in 1 until octaves) {
|
|
x *= lacunarity
|
|
y *= lacunarity
|
|
z *= lacunarity
|
|
w *= lacunarity
|
|
amp *= gain
|
|
sum += abs(noise(seed + i, x, y, z, w) * 2.0 - 1.0) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun billow(
|
|
seed: Int, position: Vector3, crossinline noise: (Int, Double, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
) =
|
|
billow(seed, position.x, position.y, position.z, noise, octaves, lacunarity, gain)
|
|
|
|
inline fun billow(
|
|
seed: Int, x: Double, y: Double, z: Double, crossinline noise: (Int, Double, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
): Double {
|
|
var sum = abs(noise(seed, x, y, z) * 2.0 - 1.0)
|
|
var amp = 1.0
|
|
|
|
var x = x
|
|
var y = y
|
|
var z = z
|
|
for (i in 1 until octaves) {
|
|
x *= lacunarity
|
|
y *= lacunarity
|
|
z *= lacunarity
|
|
amp *= gain
|
|
sum += abs(noise(seed + i, x, y, z) * 2.0 - 1.0) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun billow(
|
|
seed: Int, position: Vector2, crossinline noise: (Int, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
) =
|
|
billow(seed, position.x, position.y, noise, octaves, lacunarity, gain)
|
|
|
|
inline fun billow(
|
|
seed: Int, x: Double, y: Double, crossinline noise: (Int, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
): Double {
|
|
var sum = abs(noise(seed, x, y) * 2.0 - 1.0)
|
|
var amp = 1.0
|
|
|
|
var x = x
|
|
var y = y
|
|
for (i in 1 until octaves) {
|
|
x *= lacunarity
|
|
y *= lacunarity
|
|
amp *= gain
|
|
sum += abs(noise(seed + i, x, y) * 2.0 - 1.0) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun billow(
|
|
seed: Int, x: Double, crossinline noise: (Int, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
): Double {
|
|
var sum = abs(noise(seed, x) * 2.0 - 1.0)
|
|
var amp = 1.0
|
|
|
|
var x = x
|
|
for (i in 1 until octaves) {
|
|
x *= lacunarity
|
|
amp *= gain
|
|
sum += abs(noise(seed + i, x) * 2.0 - 1.0) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun billowFunc1D(
|
|
crossinline noise: (Int, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double) -> Double {
|
|
return { seed, x ->
|
|
billow(seed, x, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun billowFunc2D(
|
|
crossinline noise: (Int, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double) -> Double {
|
|
return { seed, x, y ->
|
|
billow(seed, x, y, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun billowFunc3D(
|
|
crossinline noise: (Int, Double, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double) -> Double {
|
|
return { seed, x, y, z ->
|
|
billow(seed, x, y, z, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun billowFunc4D(
|
|
crossinline noise: (Int, Double, Double, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double, Double) -> Double {
|
|
return { seed, x, y, z, w ->
|
|
billow(seed, x, y, z, w, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun rigid(
|
|
seed: Int, position: Vector4, crossinline noise: (Int, Double, Double, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
) =
|
|
rigid(seed, position.x, position.y, position.z, position.w, noise, octaves, lacunarity, gain)
|
|
|
|
inline fun rigid(
|
|
seed: Int,
|
|
x: Double,
|
|
y: Double,
|
|
z: Double,
|
|
w: Double,
|
|
crossinline noise: (Int, Double, Double, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): Double {
|
|
var sum = 1.0 - abs(noise(seed, x, y, z, w))
|
|
var amp = 1.0
|
|
|
|
var x = x
|
|
var y = y
|
|
var z = z
|
|
var w = w
|
|
for (i in 1 until octaves) {
|
|
x *= lacunarity
|
|
y *= lacunarity
|
|
z *= lacunarity
|
|
w *= lacunarity
|
|
amp *= gain
|
|
sum -= (1.0 - abs(noise(seed + i, x, y, z, w))) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun rigid(
|
|
seed: Int, position: Vector3, crossinline noise: (Int, Double, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
) =
|
|
rigid(seed, position.x, position.y, position.z, noise, octaves, lacunarity, gain)
|
|
|
|
inline fun rigid(
|
|
seed: Int, x: Double, y: Double, z: Double, crossinline noise: (Int, Double, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
): Double {
|
|
var sum = 1.0 - abs(noise(seed, x, y, z))
|
|
var amp = 1.0
|
|
|
|
var x = x
|
|
var y = y
|
|
var z = z
|
|
for (i in 1 until octaves) {
|
|
x *= lacunarity
|
|
y *= lacunarity
|
|
z *= lacunarity
|
|
amp *= gain
|
|
sum -= (1.0 - abs(noise(seed + i, x, y, z))) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun rigid(
|
|
seed: Int, position: Vector2, crossinline noise: (Int, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
) =
|
|
rigid(seed, position.x, position.y, noise, octaves, lacunarity, gain)
|
|
|
|
inline fun rigid(
|
|
seed: Int, x: Double, y: Double, crossinline noise: (Int, Double, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
): Double {
|
|
var sum = 1.0 - abs(noise(seed, x, y))
|
|
var amp = 1.0
|
|
|
|
var x = x
|
|
var y = y
|
|
for (i in 1 until octaves) {
|
|
x *= lacunarity
|
|
y *= lacunarity
|
|
amp *= gain
|
|
sum -= (1.0 - abs(noise(seed + i, x, y))) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun rigid(
|
|
seed: Int, x: Double, crossinline noise: (Int, Double) -> Double,
|
|
octaves: Int = 8, lacunarity: Double = 0.5, gain: Double = 0.5
|
|
): Double {
|
|
var sum = 1.0 - abs(noise(seed, x))
|
|
var amp = 1.0
|
|
|
|
var x = x
|
|
for (i in 1 until octaves) {
|
|
x *= lacunarity
|
|
amp *= gain
|
|
sum -= (1.0 - abs(noise(seed + i, x))) * amp
|
|
}
|
|
return sum
|
|
}
|
|
|
|
inline fun rigidFunc1D(
|
|
crossinline noise: (Int, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double) -> Double {
|
|
return { seed, x ->
|
|
rigid(seed, x, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun rigidFunc2D(
|
|
crossinline noise: (Int, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double) -> Double {
|
|
return { seed, x, y ->
|
|
rigid(seed, x, y, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun rigidFunc3D(
|
|
crossinline noise: (Int, Double, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double) -> Double {
|
|
return { seed, x, y, z ->
|
|
rigid(seed, x, y, z, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
inline fun rigidFunc4D(
|
|
crossinline noise: (Int, Double, Double, Double, Double) -> Double,
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double, Double) -> Double {
|
|
return { seed, x, y, z, w ->
|
|
rigid(seed, x, y, z, w, noise, octaves, lacunarity, gain)
|
|
}
|
|
}
|
|
|
|
// functional composition tools
|
|
|
|
fun ((Int, Double) -> Double).fbm(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double) -> Double =
|
|
fbmFunc1D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double, Double) -> Double).fbm(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double) -> Double =
|
|
fbmFunc2D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double, Double, Double) -> Double).fbm(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double) -> Double =
|
|
fbmFunc3D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double, Double, Double, Double) -> Double).fbm(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double, Double) -> Double =
|
|
fbmFunc4D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double) -> Double).billow(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double) -> Double =
|
|
billowFunc1D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double, Double) -> Double).billow(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double) -> Double =
|
|
billowFunc2D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double, Double, Double) -> Double).billow(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double) -> Double =
|
|
billowFunc3D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double, Double, Double, Double) -> Double).billow(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double, Double) -> Double =
|
|
billowFunc4D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double) -> Double).rigid(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double) -> Double =
|
|
rigidFunc1D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double, Double) -> Double).rigid(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double) -> Double =
|
|
rigidFunc2D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double, Double, Double) -> Double).rigid(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double) -> Double =
|
|
rigidFunc3D(this, octaves, lacunarity, gain)
|
|
|
|
fun ((Int, Double, Double, Double, Double) -> Double).rigid(
|
|
octaves: Int = 8,
|
|
lacunarity: Double = 0.5,
|
|
gain: Double = 0.5
|
|
): (Int, Double, Double, Double, Double) -> Double =
|
|
rigidFunc4D(this, octaves, lacunarity, gain)
|