diff --git a/orx-noise/src/main/kotlin/Random.kt b/orx-noise/src/main/kotlin/Random.kt index 5edbaf2d..96de7e8f 100644 --- a/orx-noise/src/main/kotlin/Random.kt +++ b/orx-noise/src/main/kotlin/Random.kt @@ -3,6 +3,7 @@ package org.openrndr.extra.noise import org.openrndr.math.Vector2 import org.openrndr.math.Vector3 import org.openrndr.math.Vector4 +import org.openrndr.shape.Rectangle import kotlin.math.ln import kotlin.math.max import kotlin.math.pow @@ -10,7 +11,9 @@ import kotlin.math.sqrt import org.openrndr.extra.noise.fbm as orxFbm import kotlin.random.Random as DefaultRandom - +/** + * Deterministic Random using a seed to guarantee the same random values between iterations + */ object Random { var rnd: DefaultRandom @@ -54,6 +57,30 @@ object Random { seed = "${seedBase}-${seedTracking}" } + /** + * Use this when you want to get non-deterministic values aka random every call + * + * @param fn + */ + fun unseeded(fn: Random.() -> Unit) { + val state = rnd + val currentSeed = seed + + rnd = DefaultRandom + + this.fn() + + resetState() + + seed = currentSeed + rnd = state + } + + /** + * Use this inside `extend` methods to get the same result between iterations + * + * @param fn + */ fun isolated(fn: Random.() -> Unit) { val state = rnd val currentSeed = seed @@ -334,5 +361,9 @@ object Random { return elements.elementAtOrNull(index) ?: elements.last() } + + fun point(rect: Rectangle): Vector2 { + return rect.position(vector2(0.0, 1.0)) + } }