From e251d719710a951954e2dd9f93544afc601a6600 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sat, 24 Oct 2026 12:09:08 +0530 Subject: Add blood reaction diffusion --- src/main/kotlin/blood/BloodConfigs.kt | 106 ++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/main/kotlin/blood/BloodConfigs.kt (limited to 'src/main/kotlin/blood/BloodConfigs.kt') diff --git a/src/main/kotlin/blood/BloodConfigs.kt b/src/main/kotlin/blood/BloodConfigs.kt new file mode 100644 index 0000000..d6630e6 --- /dev/null +++ b/src/main/kotlin/blood/BloodConfigs.kt @@ -0,0 +1,106 @@ +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") +} -- cgit v1.3.1