good system for shadertoy syntax integration. Close #3
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
# @install: lix --silent download "gh://github.com/kiss-lang/kiss#62964ccb83d074ad57975183d4224838b0ec5e50" into 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/62964ccb83d074ad57975183d4224838b0ec5e50"
|
# @run: haxelib run-dir kiss "${HAXE_LIBCACHE}/kiss/0.0.1/github/0e99086c38b96276be3b6bd36ce40840a5988139"
|
||||||
-lib haxe-strings
|
-lib haxe-strings
|
||||||
-lib hscript
|
-lib hscript
|
||||||
-lib tink_json
|
-lib tink_json
|
||||||
-lib tink_macro
|
-lib tink_macro
|
||||||
-lib tink_syntaxhub
|
-lib tink_syntaxhub
|
||||||
-lib uuid
|
-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
|
-D kiss=0.0.1
|
||||||
-w -WUnusedPattern
|
-w -WUnusedPattern
|
||||||
--macro kiss.KissFrontend.use()
|
--macro kiss.KissFrontend.use()
|
@@ -4,11 +4,12 @@ import tink.syntaxhub.*;
|
|||||||
import haxe.macro.Expr;
|
import haxe.macro.Expr;
|
||||||
import haxe.macro.Context;
|
import haxe.macro.Context;
|
||||||
import haxe.macro.Expr.ImportMode;
|
import haxe.macro.Expr.ImportMode;
|
||||||
|
import kiss.Stream;
|
||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
using tink.MacroApi;
|
using tink.MacroApi;
|
||||||
|
|
||||||
class ShaderFrontend implements FrontendPlugin {
|
class ShaderFrontend implements FrontendPlugin {
|
||||||
|
|
||||||
public function new() {}
|
public function new() {}
|
||||||
|
|
||||||
var vertexExtensions = ["v.glsl", "vert"];
|
var vertexExtensions = ["v.glsl", "vert"];
|
||||||
@@ -28,11 +29,102 @@ class ShaderFrontend implements FrontendPlugin {
|
|||||||
|
|
||||||
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))
|
var glslStream = Stream.fromFile(file);
|
||||||
":glVertexSource"
|
|
||||||
else if (fragmentExtensions.contains(extension))
|
var transformedCode = "";
|
||||||
":glFragmentSource"
|
function error(reason = "") {
|
||||||
else
|
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";
|
throw "Unknown extension";
|
||||||
|
|
||||||
var meta = {
|
var meta = {
|
||||||
@@ -41,7 +133,7 @@ class ShaderFrontend implements FrontendPlugin {
|
|||||||
params: [
|
params: [
|
||||||
{
|
{
|
||||||
pos: pos,
|
pos: pos,
|
||||||
expr: EConst(CString(sys.io.File.getContent(file)))
|
expr: EConst(CString(transformedCode))
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
@@ -52,7 +144,10 @@ class ShaderFrontend implements FrontendPlugin {
|
|||||||
meta: [meta],
|
meta: [meta],
|
||||||
kind: FFun({
|
kind: FFun({
|
||||||
args: [],
|
args: [],
|
||||||
expr: macro { super(); }
|
expr: macro {
|
||||||
|
super();
|
||||||
|
data.iTime.value = [0.0];
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
access: [APublic]
|
access: [APublic]
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user