parse hint_range and hint_color in shaders

This commit is contained in:
2024-07-11 16:21:34 -06:00
parent e7ee5e8385
commit f02e0b1fc3
4 changed files with 105 additions and 13 deletions

View File

@@ -18,7 +18,9 @@
(bg.screenCenter)
(set bg.alpha 0.5)
(add bg))
(kiss_flixel.CameraTools.addBackgroundShaders (array FlxShader (new kiss_flixel.shaders.MirroredOrnament))))
(set shader (new kiss_flixel.shaders.MirroredOrnament))
~shader.uniforms
(kiss_flixel.CameraTools.addBackgroundShaders (array FlxShader shader)))
(method &override :Void update [:Float elapsed]
(super.update elapsed)

View File

@@ -45,7 +45,22 @@ class ShaderFrontend implements FrontendPlugin {
return macro flixel.util.FlxColor.fromRGBFloat($v{x}, $v{y}, $v{z}, $v{w});
}
hInterp.variables["vec4"] = vec4;
}
static function hint_range_int(min, max, ?step) {
return if (step == null) {
macro kiss_flixel.shaders.Uniform.IntRange($v{min}, $v{max});
} else {
macro kiss_flixel.shaders.Uniform.IntRangeStep($v{min}, $v{max}, $v{step});
};
}
static function hint_range_float(min, max, ?step) {
return if (step == null) {
macro kiss_flixel.shaders.Uniform.FloatRange($v{min}, $v{max});
} else {
macro kiss_flixel.Uniform.FloatRangeStep($v{min}, $v{max}, $v{step});
};
}
var vertexExtensions = ["v.glsl", "vert"];
@@ -104,6 +119,7 @@ class ShaderFrontend implements FrontendPlugin {
// give uniforms their default values
var defaultSetterExps = [];
var uniformMapExps = [];
var delimiters = ",.(){}[] \t\n;?:|&<>/*+-'\"=".split("");
@@ -214,6 +230,30 @@ class ShaderFrontend implements FrontendPlugin {
// https://api.openfl.org/openfl/display/ShaderParameter.html
var name = expect("uniform name", nextToken);
var range = null;
var isColor = false;
glslStream.dropWhitespace();
// handle a Godot-syntax hint_ annotation
if (glslStream.startsWith(":")) {
dropNext(":");
glslStream.dropWhitespace();
if (glslStream.startsWith("hint_range")) {
switch (uType) {
case "float":
hInterp.variables["hint_range"] = hint_range_float;
case "int":
hInterp.variables["hint_range"] = hint_range_int;
default:
throw 'hint_range is only valid on int/float uniforms';
}
range = hInterp.execute(hParser.parseString(expect("hint_range() expression", glslStream.takeUntilAndDrop.bind(")")) + ")"));
} else if (glslStream.startsWith("hint_color")) {
dropNext("hint_color");
isColor = true;
}
}
dropNext("=");
var expression = expect("uniform default value", glslStream.takeUntilAndDrop.bind(";"));
@@ -221,10 +261,23 @@ class ShaderFrontend implements FrontendPlugin {
var propGenerated = true;
function simpleProperty(_type:String) {
var propName = '${name}${_type}';
switch (_type) {
case "Bool":
uniformMapExps.push(macro $v{propName} => ${macro kiss_flixel.shaders.Uniform.Boolean});
case "Int" | "Float" if (range != null):
uniformMapExps.push(macro $v{propName} => $range);
case "Int":
uniformMapExps.push(macro $v{propName} => ${macro kiss_flixel.shaders.Uniform.AnyInt});
case "Float":
uniformMapExps.push(macro $v{propName} => ${macro kiss_flixel.shaders.Uniform.AnyFloat});
default:
throw 'not a simpleProperty type: $_type';
}
suffix = _type;
type.fields.push({
pos: pos,
name: '${name}${_type}',
name: propName,
kind: FProp("get", "set", Helpers.parseComplexType(_type)),
access: [APublic]
});
@@ -248,10 +301,13 @@ class ShaderFrontend implements FrontendPlugin {
function flxPointProperty() {
suffix = "FlxPoint";
var propName = '${name}${suffix}';
uniformMapExps.push(macro $v{propName} => ${macro kiss_flixel.shaders.Uniform.Vector2});
var _type = "flixel.math.FlxPoint";
type.fields.push({
pos: pos,
name: '${name}${suffix}',
name: propName,
kind: FProp("get", "set", Helpers.parseComplexType(_type)),
access: [APublic]
});
@@ -280,10 +336,21 @@ class ShaderFrontend implements FrontendPlugin {
}
function flxColorProperty(withAlpha:Bool) {
suffix = "FlxColor";
var propName = '${name}${suffix}';
if (isColor) {
if (withAlpha) {
uniformMapExps.push(macro $v{propName} => ${macro kiss_flixel.shaders.Uniform.ColorWithAlpha});
} else {
uniformMapExps.push(macro $v{propName} => ${macro kiss_flixel.shaders.Uniform.ColorSolid});
}
} else {
uniformMapExps.push(macro $v{propName} => ${macro kiss_flixel.shaders.Uniform.Vector3});
}
var _type = "flixel.util.FlxColor";
type.fields.push({
pos: pos,
name: '${name}${suffix}',
name: propName,
kind: FProp("get", "set", Helpers.parseComplexType(_type)),
access: [APublic]
});
@@ -355,6 +422,14 @@ class ShaderFrontend implements FrontendPlugin {
}
}
type.fields.push({
pos: pos,
name: "uniforms",
access: [APublic],
kind: FProp("default", "null", Helpers.parseComplexType("Map<String,kiss_flixel.shaders.Uniform>"), macro $a{uniformMapExps})
});
transformedCode = "#pragma header\n" + transformedCode;
var metaName = if (vertexExtensions.contains(extension)) ":glVertexSource" else if (fragmentExtensions.contains(extension)) ":glFragmentSource" else

View File

@@ -8,11 +8,11 @@ uniform vec3 color_a = vec3(0.5);
uniform vec3 color_b = vec3(0.5);
uniform vec3 color_c = vec3(1.0);
uniform vec3 color_d = vec3(0.0, 0.33, 0.67);
uniform int iterations = 10; // : hint_range(1, 50, 1)
uniform float speed = 1.0; // : hint_range(0.1, 10.0)
uniform float zoom = 1.0; // : hint_range(0.1, 5.0)
uniform float subtract = 0.5; // : hint_range(0.1, 1.0)
uniform float multiply = 1.1; // : hint_range(1.0, 2.0)
uniform int iterations: hint_range(1, 50, 1) = 10;
uniform float speed: hint_range(0.1, 10.0) = 1.0;
uniform float zoom: hint_range(0.1, 5.0) = 1.0;
uniform float subtract: hint_range(0.1, 1.0) = 0.5;
uniform float multiply: hint_range(1.0, 2.0) = 1.1;
vec3 palette(float t, vec3 a, vec3 b, vec3 c, vec3 d) {
return a + b * cos(2.0 * PI * (c * t + d));

View File

@@ -0,0 +1,15 @@
package kiss_flixel.shaders;
enum Uniform {
Boolean;
AnyInt;
IntRange(min:Int, max:Int);
IntRangeStep(min:Int, max:Int, step:Int);
AnyFloat;
FloatRange(min:Float, max:Float);
FloatRangeStep(min:Float, max:Float, step:Float);
ColorSolid;
ColorWithAlpha;
Vector2;
Vector3;
}