Files
orx/orx-noise/src/commonMain/kotlin/Fractal.kt
2021-07-25 22:36:07 +02:00

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)