diff --git a/orx-noise/src/main/kotlin/PerlinNoise3D.kt b/orx-noise/src/main/kotlin/PerlinNoise3D.kt index 8bb7909f..889962e7 100644 --- a/orx-noise/src/main/kotlin/PerlinNoise3D.kt +++ b/orx-noise/src/main/kotlin/PerlinNoise3D.kt @@ -1,41 +1,42 @@ -package org.openrndr.extra.noise - -import org.openrndr.math.Vector3 - -fun perlinLinear(seed: Int, x: Double, y: Double, z: Double) = perlin(seed, x, y, z, ::linear) -fun perlinQuintic(seed: Int, x: Double, y: Double, z: Double) = perlin(seed, x, y, z, ::quintic) -fun perlinHermite(seed: Int, x: Double, y: Double, z: Double) = perlin(seed, x, y, z, ::hermite) - -fun perlinLinear(seed: Int, position: Vector3) = perlin(seed, position.x, position.y, position.z, ::linear) -fun perlinQuintic(seed: Int, position: Vector3) = perlin(seed, position.x, position.y, position.z, ::quintic) -fun perlinHermite(seed: Int, position: Vector3) = perlin(seed, position.x, position.y, position.z, ::hermite) - -inline fun perlin(seed: Int, x: Double, y: Double, z: Double, crossinline interpolator: (Double) -> Double = ::linear): Double { - val x0 = x.fastFloor() - val y0 = y.fastFloor() - val z0 = z.fastFloor() - val x1 = x0 + 1 - val y1 = y0 + 1 - val z1 = z0 + 1 - - val xs: Double = interpolator(x - x0) - val ys: Double = interpolator(y - y0) - val zs: Double = interpolator(z - z0) - - val xd0 = x - x0 - val yd0 = y - y0 - val zd0 = z - z0 - val xd1 = xd0 - 1 - val yd1 = yd0 - 1 - val zd1 = zd0 - 1 - - val xf00 = lerp(gradCoord3D(seed, x0, y0, z0, xd0, yd0, zd0), gradCoord3D(seed, x1, y0, z0, xd1, yd0, zd0), xs) - val xf10 = lerp(gradCoord3D(seed, x0, y1, z0, xd0, yd1, zd0), gradCoord3D(seed, x1, y1, z0, xd1, yd1, zd0), xs) - val xf01 = lerp(gradCoord3D(seed, x0, y0, z1, xd0, yd0, zd1), gradCoord3D(seed, x1, y0, z1, xd1, yd0, zd1), xs) - val xf11 = lerp(gradCoord3D(seed, x0, y1, z1, xd0, yd1, zd1), gradCoord3D(seed, x1, y1, z1, xd1, yd1, zd1), xs) - - val yf0 = lerp(xf00, xf10, ys) - val yf1 = lerp(xf01, xf11, ys) - - return lerp(yf0, yf1, zs) +package org.openrndr.extra.noise + +import org.openrndr.math.Vector3 +import org.openrndr.math.mix + +fun perlinLinear(seed: Int, x: Double, y: Double, z: Double) = perlin(seed, x, y, z, ::linear) +fun perlinQuintic(seed: Int, x: Double, y: Double, z: Double) = perlin(seed, x, y, z, ::quintic) +fun perlinHermite(seed: Int, x: Double, y: Double, z: Double) = perlin(seed, x, y, z, ::hermite) + +fun perlinLinear(seed: Int, position: Vector3) = perlin(seed, position.x, position.y, position.z, ::linear) +fun perlinQuintic(seed: Int, position: Vector3) = perlin(seed, position.x, position.y, position.z, ::quintic) +fun perlinHermite(seed: Int, position: Vector3) = perlin(seed, position.x, position.y, position.z, ::hermite) + +inline fun perlin(seed: Int, x: Double, y: Double, z: Double, crossinline interpolator: (Double) -> Double = ::linear): Double { + val x0 = x.fastFloor() + val y0 = y.fastFloor() + val z0 = z.fastFloor() + val x1 = x0 + 1 + val y1 = y0 + 1 + val z1 = z0 + 1 + + val xs: Double = interpolator(x - x0) + val ys: Double = interpolator(y - y0) + val zs: Double = interpolator(z - z0) + + val xd0 = x - x0 + val yd0 = y - y0 + val zd0 = z - z0 + val xd1 = xd0 - 1 + val yd1 = yd0 - 1 + val zd1 = zd0 - 1 + + val xf00 = mix(gradCoord3D(seed, x0, y0, z0, xd0, yd0, zd0), gradCoord3D(seed, x1, y0, z0, xd1, yd0, zd0), xs) + val xf10 = mix(gradCoord3D(seed, x0, y1, z0, xd0, yd1, zd0), gradCoord3D(seed, x1, y1, z0, xd1, yd1, zd0), xs) + val xf01 = mix(gradCoord3D(seed, x0, y0, z1, xd0, yd0, zd1), gradCoord3D(seed, x1, y0, z1, xd1, yd0, zd1), xs) + val xf11 = mix(gradCoord3D(seed, x0, y1, z1, xd0, yd1, zd1), gradCoord3D(seed, x1, y1, z1, xd1, yd1, zd1), xs) + + val yf0 = mix(xf00, xf10, ys) + val yf1 = mix(xf01, xf11, ys) + + return mix(yf0, yf1, zs) } \ No newline at end of file diff --git a/orx-noise/src/main/kotlin/ValueNoise2D.kt b/orx-noise/src/main/kotlin/ValueNoise2D.kt index 97ca2f00..e4c4173c 100644 --- a/orx-noise/src/main/kotlin/ValueNoise2D.kt +++ b/orx-noise/src/main/kotlin/ValueNoise2D.kt @@ -1,6 +1,7 @@ package org.openrndr.extra.noise import org.openrndr.math.Vector2 +import org.openrndr.math.mix fun valueLinear(seed: Int, x: Double, y: Double) = value(seed, x, y, ::linear) fun valueQuintic(seed: Int, x: Double, y: Double) = value(seed, x, y, ::quintic) @@ -24,8 +25,8 @@ inline fun value(seed: Int, x: Double, y: Double, crossinline interpolation: (Do val xs = interpolation(x - x0) val ys = interpolation(y - y0) - val xf0 = lerp(valCoord2D(seed, x0, y0), valCoord2D(seed, x1, y0), xs) - val xf1 = lerp(valCoord2D(seed, x0, y1), valCoord2D(seed, x1, y1), xs) + val xf0 = mix(valCoord2D(seed, x0, y0), valCoord2D(seed, x1, y0), xs) + val xf1 = mix(valCoord2D(seed, x0, y1), valCoord2D(seed, x1, y1), xs) - return lerp(xf0, xf1, ys) + return mix(xf0, xf1, ys) } \ No newline at end of file diff --git a/orx-noise/src/main/kotlin/ValueNoise3D.kt b/orx-noise/src/main/kotlin/ValueNoise3D.kt index 57e91f0b..dd17f91a 100644 --- a/orx-noise/src/main/kotlin/ValueNoise3D.kt +++ b/orx-noise/src/main/kotlin/ValueNoise3D.kt @@ -1,6 +1,7 @@ package org.openrndr.extra.noise import org.openrndr.math.Vector3 +import org.openrndr.math.mix fun valueLinear(seed: Int, x: Double, y: Double, z: Double) = value(seed, x, y, z, ::linear) fun valueQuintic(seed: Int, x: Double, y: Double, z: Double) = value(seed, x, y, z, ::quintic) @@ -28,13 +29,13 @@ inline fun value(seed: Int, x: Double, y: Double, z: Double, crossinline interpo val zs = interpolation(z - z0) - val xf00 = lerp(valCoord3D(seed, x0, y0, z0), valCoord3D(seed, x1, y0, z0), xs) - val xf10 = lerp(valCoord3D(seed, x0, y1, z0), valCoord3D(seed, x1, y1, z0), xs) - val xf01 = lerp(valCoord3D(seed, x0, y0, z1), valCoord3D(seed, x1, y0, z1), xs) - val xf11 = lerp(valCoord3D(seed, x0, y1, z1), valCoord3D(seed, x1, y1, z1), xs) + val xf00 = mix(valCoord3D(seed, x0, y0, z0), valCoord3D(seed, x1, y0, z0), xs) + val xf10 = mix(valCoord3D(seed, x0, y1, z0), valCoord3D(seed, x1, y1, z0), xs) + val xf01 = mix(valCoord3D(seed, x0, y0, z1), valCoord3D(seed, x1, y0, z1), xs) + val xf11 = mix(valCoord3D(seed, x0, y1, z1), valCoord3D(seed, x1, y1, z1), xs) - val yf0 = lerp(xf00, xf10, ys) - val yf1 = lerp(xf01, xf11, ys) + val yf0 = mix(xf00, xf10, ys) + val yf1 = mix(xf01, xf11, ys) - return lerp(yf0, yf1, zs) + return mix(yf0, yf1, zs) } \ No newline at end of file