Added WIP shader-phrases, annotations and tooling for shader phrases
resolving is done using the JVM class loader
This commit is contained in:
33
orx-shader-phrases/src/main/kotlin/ShaderPreprocessor.kt
Normal file
33
orx-shader-phrases/src/main/kotlin/ShaderPreprocessor.kt
Normal file
@@ -0,0 +1,33 @@
|
||||
package org.openrndr.extra.shaderphrases
|
||||
|
||||
import org.openrndr.extra.shaderphrases.annotations.ShaderPhrases
|
||||
|
||||
fun preprocessShader(shader: String): String {
|
||||
val lines = shader.split("\n")
|
||||
val processed = lines.map {
|
||||
if (it.startsWith("import ")) {
|
||||
val tokens = it.split(" ")
|
||||
val full = tokens[1]
|
||||
val fullTokens = full.split(".")
|
||||
val fieldName = fullTokens.last().replace(";","")
|
||||
val packageClassTokens = fullTokens.dropLast(1)
|
||||
val packageClass = packageClassTokens.joinToString(".")
|
||||
|
||||
val c = Class.forName(packageClass)
|
||||
if (c.annotations.any { it.annotationClass == ShaderPhrases::class }) {
|
||||
if (fieldName == "*") {
|
||||
c.declaredFields.filter { println(it.type); it.type.name =="java.lang.String" }.map {
|
||||
it.get(null)
|
||||
}.joinToString("\n")
|
||||
} else {
|
||||
c.getDeclaredField(fieldName).get(null)
|
||||
}
|
||||
} else {
|
||||
throw IllegalArgumentException("class $packageClass has no ShaderPhrases annotation")
|
||||
}
|
||||
} else {
|
||||
it
|
||||
}
|
||||
}
|
||||
return processed.joinToString("\n")
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package org.openrndr.extra.shaderphrases.annotations
|
||||
|
||||
enum class ShaderPhraseLanguage {
|
||||
GLSL
|
||||
}
|
||||
|
||||
@Retention(AnnotationRetention.RUNTIME)
|
||||
@Target(AnnotationTarget.FILE, AnnotationTarget.CLASS, AnnotationTarget.FIELD)
|
||||
annotation class ShaderPhrase(val exports: Array<String>,
|
||||
val imports: Array<String> = emptyArray(),
|
||||
val language: ShaderPhraseLanguage = ShaderPhraseLanguage.GLSL)
|
||||
|
||||
|
||||
@Target(AnnotationTarget.FILE)
|
||||
annotation class ShaderPhrases(val exports: Array<String>)
|
||||
24
orx-shader-phrases/src/main/kotlin/phrases/Dummy.kt
Normal file
24
orx-shader-phrases/src/main/kotlin/phrases/Dummy.kt
Normal file
@@ -0,0 +1,24 @@
|
||||
@file:JvmName("Dummy")
|
||||
@file:ShaderPhrases(["dummy"])
|
||||
|
||||
package org.openrndr.extra.shaderphrases.phrases
|
||||
import org.openrndr.extra.shaderphrases.annotations.ShaderPhrase
|
||||
import org.openrndr.extra.shaderphrases.annotations.ShaderPhrases
|
||||
|
||||
@ShaderPhrase(["dummy"])
|
||||
const val phraseDummy = """
|
||||
float dummy() {
|
||||
return 0.0;
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
fun main() {
|
||||
val c = Class.forName("org.openrndr.extra.shaderphrases.phrases.Dummy")
|
||||
|
||||
if (c.annotations.any { it.annotationClass == ShaderPhrases::class }) {
|
||||
println(c.getDeclaredField("phraseDummy").get(null))
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
19
orx-shader-phrases/src/test/kotlin/TestPreprocessShader.kt
Normal file
19
orx-shader-phrases/src/test/kotlin/TestPreprocessShader.kt
Normal file
@@ -0,0 +1,19 @@
|
||||
import org.openrndr.extra.shaderphrases.preprocessShader
|
||||
import org.spekframework.spek2.Spek
|
||||
import org.spekframework.spek2.style.specification.describe
|
||||
|
||||
object TestPreprocessShader:Spek({
|
||||
|
||||
describe("A shader with import statements") {
|
||||
val shader = """
|
||||
#version 330
|
||||
import org.openrndr.extra.shaderphrases.phrases.Dummy.*
|
||||
|
||||
|
||||
""".trimIndent()
|
||||
describe("when preprocessed") {
|
||||
val processed = preprocessShader(shader)
|
||||
println(processed)
|
||||
}
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user