From 2fc1a3abf7d21f32b8d7a5dc56c097287fd280e4 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Sun, 25 Sep 2022 17:07:31 +0200 Subject: [PATCH] [orx-shader-phrases] Include symbols from transitive imports --- .../src/commonMain/kotlin/ShaderPreprocessor.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/orx-shader-phrases/src/commonMain/kotlin/ShaderPreprocessor.kt b/orx-shader-phrases/src/commonMain/kotlin/ShaderPreprocessor.kt index 81972f7c..751f646a 100644 --- a/orx-shader-phrases/src/commonMain/kotlin/ShaderPreprocessor.kt +++ b/orx-shader-phrases/src/commonMain/kotlin/ShaderPreprocessor.kt @@ -22,11 +22,13 @@ class ShaderPhrase(val phrase: String) { ShaderPhraseRegistry.registerPhrase("$prefix$id", this) } } + /** * A book of shader phrases. */ expect open class ShaderPhraseBook(bookId: String) { val bookId: String + /** * Registers all known shader phrases */ @@ -39,12 +41,14 @@ expect open class ShaderPhraseBook(bookId: String) { */ object ShaderPhraseRegistry { private val phrases = mutableMapOf() + /** * Registers a [phrase] with [id] */ fun registerPhrase(id: String, phrase: ShaderPhrase) { phrases[id] = phrase } + /** * Finds a phrase for [id], returns null when no phrase found */ @@ -79,10 +83,7 @@ object ShaderPhraseRegistry { * @param source GLSL source code encoded as string * @return GLSL source code with injected shader phrases */ -fun preprocessShader(source: String, symbols: Set = emptySet()): String { - val newSymbols = mutableSetOf() - newSymbols.addAll(symbols) - +fun preprocessShader(source: String, symbols: MutableSet = mutableSetOf()): String { val lines = source.split("\n") val funcName = Regex("""^\s*#pragma\s+import\s+([a-zA-Z0-9_.]+)""") val processed = lines.map { line -> @@ -92,10 +93,10 @@ fun preprocessShader(source: String, symbols: Set = emptySet()): String val fieldName = fullTokens.last().replace(";", "").trim() val packageClassTokens = fullTokens.dropLast(1) val packageClass = packageClassTokens.joinToString(".") - if (symbol !in newSymbols) { - newSymbols.add(symbol) + if (symbol !in symbols) { + symbols.add(symbol) val registryPhrase = ShaderPhraseRegistry.findPhrase(symbol) - registryPhrase?.let { preprocessShader(it.phrase, newSymbols) } + registryPhrase?.let { preprocessShader(it.phrase, symbols) } } else { "" } @@ -114,7 +115,7 @@ fun String.preprocess() = preprocessShader(this) * @param url url pointing to GLSL shader source * @return GLSL source code with injected shader phrases */ -fun preprocessShaderFromUrl(url: String, symbols: Set = emptySet()): String { +fun preprocessShaderFromUrl(url: String, symbols: MutableSet = mutableSetOf()): String { return preprocessShader(textFromURL(url), symbols) }