aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/blood/BloodConfigs.kt
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2026-10-24 12:09:08 +0530
committerAkshay Nair <phenax5@gmail.com>2026-10-24 13:05:25 +0530
commite251d719710a951954e2dd9f93544afc601a6600 (patch)
tree1140d17fd3e4da4cfba0a33edb1b4f79d15a357b /src/main/kotlin/blood/BloodConfigs.kt
parentbfd7af6c4772c68f001c5c121b62b134bbca04e4 (diff)
downloadart-playground-openrndr-e251d719710a951954e2dd9f93544afc601a6600.tar.gz
art-playground-openrndr-e251d719710a951954e2dd9f93544afc601a6600.zip
Add blood reaction diffusion
Diffstat (limited to '')
-rw-r--r--src/main/kotlin/blood/BloodConfigs.kt106
1 files changed, 106 insertions, 0 deletions
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<Array<Vector2>>
+
+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")
+}