aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/phenax/utils/program.kt
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/kotlin/phenax/utils/program.kt36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/main/kotlin/phenax/utils/program.kt b/src/main/kotlin/phenax/utils/program.kt
index a05307c..d3788ea 100644
--- a/src/main/kotlin/phenax/utils/program.kt
+++ b/src/main/kotlin/phenax/utils/program.kt
@@ -8,6 +8,11 @@ import org.openrndr.draw.*
import org.openrndr.extra.filewatcher.watchingFile
import org.openrndr.extra.olive.oliveProgram as oliveProgramOriginal
+enum class ActionType {
+ PAN,
+ LIGHT_MOVE
+}
+
fun Int.seconds(): Int = this * 1000
fun Int.minutes(): Int = this.seconds() * 60
@@ -37,11 +42,31 @@ fun ApplicationBuilder.oliveProgram(init: Program.() -> Unit) {
}
}
+fun preprocessShader(shaderCode: String): String {
+ val pattern = Regex("#include\\s+<([A-Za-z0-9-_/.]+)>")
+ val includes = pattern.findAll(shaderCode)
+ var parts: MutableList<String> = mutableListOf()
+ var lastIndex = 0
+ includes.forEach {
+ parts.add(shaderCode.slice(lastIndex..(it.range.first - 1)))
+ lastIndex = it.range.last + 1
+ val modulePath = it.groupValues[1]
+ val moduleContents = File("src/main/resources/shaders/modules/${modulePath}.cs").readText()
+ parts.add("/* Module ${modulePath} */")
+ parts.add(moduleContents)
+ parts.add("/* End module ${modulePath} */")
+ }
+ parts.add(shaderCode.slice(lastIndex..(shaderCode.length - 1)))
+ return parts.joinToString(separator = "\n")
+}
+
+val defaultShaderCode: String = ""
+
fun Program.liveComputeShader(name: String): ReadOnlyProperty<Any?, ComputeShader> {
val shaderCode by
watchingFile(File("src/main/resources/shaders/${name}.cs")) { file ->
println("change")
- file.readText()
+ preprocessShader(file.readText().toString())
}
var cs: ComputeShader = ComputeShader.fromCode(shaderCode, name)
@@ -55,9 +80,14 @@ fun Program.liveComputeShader(name: String): ReadOnlyProperty<Any?, ComputeShade
try {
cs = ComputeShader.fromCode(shaderCode, name)
} catch (e: Exception) {
- // Restore old shader if new code has error
- cs = ComputeShader.fromCode(lastCompiledCode, name)
println("Shader compile failed: ${e.message}")
+ // Restore old shader if new code has error or default shader
+ try {
+ cs = ComputeShader.fromCode(lastCompiledCode, name)
+ } catch (e: Exception) {
+ println("Falling back to default shader")
+ cs = ComputeShader.fromCode(defaultShaderCode, name)
+ }
}
lastCompiledCode = shaderCode
}