package blood import kotlin.random.Random import org.openrndr.math.IntVector2 import org.openrndr.math.Vector2 typealias Cells = Array> class BloodConfigs { abstract class Base { abstract val feedRate: Double abstract val killRate: Double open val iterationsPerFrame: Int = 40 open val diffusion: Vector2 = Vector2(1.0, 0.5) open val random: Random = Random(100) open val initialSize: IntVector2 = IntVector2(20, 20) open val noiseProbability: Double = 1.0 open fun initializeState(cells: Cells) { val x = cells[0].size / 2 - initialSize.x / 2 val y = cells.size / 2 - initialSize.y / 2 for (i in y until (y + initialSize.y)) { for (j in x until (x + initialSize.x)) { val v = random.nextDouble(1.0) <= noiseProbability cells[i][j] = if (v) Vector2(0.0, 1.0) else Vector2(1.0, 0.0) } } } } class mitosis : Base() { override val feedRate = 0.0367 override val killRate = 0.0649 override val noiseProbability = 0.1 override val random = Random(0) } class coral : Base() { override val feedRate = 0.055 override val killRate = 0.062 } class holey : Base() { override val feedRate = 0.043 override val killRate = 0.059 } class pulseSettled1 : Base() { override val feedRate = 0.037 override val killRate = 0.059 } class pulseSettled2 : Base() { override val feedRate = 0.029 override val killRate = 0.057 } class bubbles : Base() { override val feedRate = 0.014 override val killRate = 0.054 override val noiseProbability = 0.2 } class worms : Base() { override val feedRate = 0.078 override val killRate = 0.061 override val random = Random(200) override val noiseProbability = 0.1 override val initialSize = IntVector2(200, 50) } class fingies : Base() { override val feedRate = 0.046 override val killRate = 0.063 } class maze : Base() { override val feedRate = 0.029 override val killRate = 0.057 override val noiseProbability = 0.2 } class explosions : Base() { override val feedRate = 0.018 override val killRate = 0.051 override val noiseProbability = 0.2 override val iterationsPerFrame = 18 } class waves : Base() { override val feedRate = 0.014 override val killRate = 0.045 override val iterationsPerFrame = 18 } } fun getConfig(name: String): BloodConfigs.Base { val cls = BloodConfigs::class.nestedClasses.first { it.simpleName == name } val ctor = cls.constructors.first() val inst = ctor.call() as BloodConfigs.Base return inst } fun getConfig(): BloodConfigs.Base { return getConfig(System.getenv("PHENAX_FILE_SUFFIX") ?: "pulseSettled2") }