good system for shadertoy syntax integration. Close #3

This commit is contained in:
2024-01-27 16:39:00 -07:00
parent b8874f8e0c
commit 45c1afc066
2 changed files with 136 additions and 41 deletions

View File

@@ -1,12 +1,12 @@
# @install: lix --silent download "gh://github.com/kiss-lang/kiss#62964ccb83d074ad57975183d4224838b0ec5e50" into kiss/0.0.1/github/62964ccb83d074ad57975183d4224838b0ec5e50
# @run: haxelib run-dir kiss "${HAXE_LIBCACHE}/kiss/0.0.1/github/62964ccb83d074ad57975183d4224838b0ec5e50"
# @install: lix --silent download "gh://github.com/kiss-lang/kiss#0e99086c38b96276be3b6bd36ce40840a5988139" into kiss/0.0.1/github/0e99086c38b96276be3b6bd36ce40840a5988139
# @run: haxelib run-dir kiss "${HAXE_LIBCACHE}/kiss/0.0.1/github/0e99086c38b96276be3b6bd36ce40840a5988139"
-lib haxe-strings
-lib hscript
-lib tink_json
-lib tink_macro
-lib tink_syntaxhub
-lib uuid
-cp ${HAXE_LIBCACHE}/kiss/0.0.1/github/62964ccb83d074ad57975183d4224838b0ec5e50/src
-cp ${HAXE_LIBCACHE}/kiss/0.0.1/github/0e99086c38b96276be3b6bd36ce40840a5988139/src
-D kiss=0.0.1
-w -WUnusedPattern
--macro kiss.KissFrontend.use()

View File

@@ -4,11 +4,12 @@ import tink.syntaxhub.*;
import haxe.macro.Expr;
import haxe.macro.Context;
import haxe.macro.Expr.ImportMode;
import kiss.Stream;
using StringTools;
using tink.MacroApi;
class ShaderFrontend implements FrontendPlugin {
public function new() {}
var vertexExtensions = ["v.glsl", "vert"];
@@ -26,13 +27,104 @@ class ShaderFrontend implements FrontendPlugin {
var parentClass = 'flixel.system.FlxAssets.FlxShader';
type.kind = TDClass(parentClass.asTypePath(), [], false, false, false);
var pos = Context.makePosition({ file: file, min: 0, max: 0 });
var pos = Context.makePosition({file: file, min: 0, max: 0});
var metaName = if (vertexExtensions.contains(extension))
":glVertexSource"
else if (fragmentExtensions.contains(extension))
":glFragmentSource"
else
var glslStream = Stream.fromFile(file);
var transformedCode = "";
function error(reason = "") {
throw 'Error transforming shader code! $reason';
}
// Supply ShaderToy-esque iTime
transformedCode += 'uniform float iTime = 0.0;\n';
type.fields.push({
pos: pos,
name: "__update",
kind: FFun({
args: [],
expr: macro {
super.__update();
data.iTime.value = [data.iTime.value[0] + flixel.FlxG.elapsed];
}
}),
access: [APublic, AOverride]
});
// TODO Implement round for the targets that weirdly don't have it
var delimiters = ",.(){}[] \t\n;?:|&<>/*+-'\"=".split("");
var colorOut = "";
var coordIn = "";
function nextToken() {
glslStream.dropWhitespace();
return glslStream.takeUntilOneOf(delimiters);
}
function dropNext(delim:String) {
glslStream.dropWhitespace();
glslStream.dropString(delim);
}
while (!glslStream.isEmpty()) {
switch (glslStream.takeWhileOneOf(delimiters)) {
case Some(codeSyntax):
transformedCode += codeSyntax;
default:
}
switch (glslStream.takeUntilOneOf(delimiters)) {
case Some("#pragma"):
switch (nextToken()) {
case Some("header"):
// We already add #pragma header at the start of everything -- a duplicate creates an error
continue;
case Some(pragma):
transformedCode += '#pragma $pragma';
default:
}
case Some("iResolution"):
transformedCode += "openfl_TextureSize";
case Some("mainImage"):
dropNext("(");
dropNext("out");
dropNext("vec4");
switch (nextToken()) {
case Some(symbol):
colorOut = symbol;
default:
error();
}
dropNext(",");
dropNext("in");
dropNext("vec2");
switch (nextToken()) {
case Some(symbol):
coordIn = symbol;
default:
error();
}
dropNext(")");
transformedCode += "main() ";
case Some(name) if (name == colorOut):
transformedCode += "gl_FragColor";
case Some(name) if (name == coordIn):
transformedCode += "openfl_TextureCoordv * openfl_TextureSize";
case Some(other):
transformedCode += other;
default:
}
}
transformedCode = "#pragma header\n" + transformedCode;
var metaName = if (vertexExtensions.contains(extension)) ":glVertexSource" else if (fragmentExtensions.contains(extension)) ":glFragmentSource" else
throw "Unknown extension";
var meta = {
@@ -41,7 +133,7 @@ class ShaderFrontend implements FrontendPlugin {
params: [
{
pos: pos,
expr: EConst(CString(sys.io.File.getContent(file)))
expr: EConst(CString(transformedCode))
}
]
};
@@ -52,7 +144,10 @@ class ShaderFrontend implements FrontendPlugin {
meta: [meta],
kind: FFun({
args: [],
expr: macro { super(); }
expr: macro {
super();
data.iTime.value = [0.0];
}
}),
access: [APublic]
});