KFlxShader parse and stringify uniforms to optional json

This commit is contained in:
2024-07-12 16:02:45 -06:00
parent ac99b7d355
commit af4ebfa59d
6 changed files with 83 additions and 27 deletions

View File

@@ -1,4 +1,4 @@
# @install: lix --silent download "gh://github.com/kiss-lang/kiss-tools#df38b28e32e05d7940041192c36d73924844d9cc" into kiss-tools/0.0.0/github/df38b28e32e05d7940041192c36d73924844d9cc
# @install: lix --silent download "gh://github.com/kiss-lang/kiss-tools#93ad23d10bd1e6446113f7fa1b1ec9595ed03d7d" into kiss-tools/0.0.0/github/93ad23d10bd1e6446113f7fa1b1ec9595ed03d7d
-lib kiss
-cp ${HAXE_LIBCACHE}/kiss-tools/0.0.0/github/df38b28e32e05d7940041192c36d73924844d9cc/src/
-cp ${HAXE_LIBCACHE}/kiss-tools/0.0.0/github/93ad23d10bd1e6446113f7fa1b1ec9595ed03d7d/src/
-D kiss-tools=0.0.0

View File

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

View File

@@ -18,7 +18,7 @@
(bg.screenCenter)
(set bg.alpha 0.5)
(add bg))
(set shader (new kiss_flixel.shaders.MirroredOrnament))
(set shader (new kiss_flixel.shaders.MirroredOrnament "mirroredOrnament.json"))
~shader.uniforms
(kiss_flixel.CameraTools.addBackgroundShaders (array FlxShader shader)))

View File

@@ -278,15 +278,23 @@ class ShaderFrontend implements FrontendPlugin {
type.fields.push({
pos: pos,
name: propName,
kind: FProp("get", "set", Helpers.parseComplexType(_type)),
kind: FProp("get", "set", Helpers.parseComplexType('Null<$_type>')),
access: [APublic]
});
var jsonType = {
pack: ["kiss_tools"],
name: "Json" + _type
};
type.fields.push({
pos: pos,
name: 'set_${name}${_type}',
kind: FFun({
args: [{type: Helpers.parseComplexType(_type), name: "value"}],
expr: macro {this.data.$name.value = [value]; return value;}
args: [{type: Helpers.parseComplexType('Null<$_type>'), name: "value"}],
expr: macro {
this.data.$name.value = [value];
this.json?.put($v{propName}, new kiss_tools.JsonString(new $jsonType(value).stringify()));
return value;
}
})
});
type.fields.push({
@@ -294,7 +302,13 @@ class ShaderFrontend implements FrontendPlugin {
name: 'get_${name}${_type}',
kind: FFun({
args: [],
expr: macro return this.data.$name.value[0]
expr: macro {
var v = this.data.$name.value;
return if (v == null || v.length == 0)
null;
else
v[0];
}
})
});
}
@@ -308,14 +322,14 @@ class ShaderFrontend implements FrontendPlugin {
type.fields.push({
pos: pos,
name: propName,
kind: FProp("get", "set", Helpers.parseComplexType(_type)),
kind: FProp("get", "set", Helpers.parseComplexType('Null<$_type>')),
access: [APublic]
});
type.fields.push({
pos: pos,
name: 'set_${name}${suffix}',
kind: FFun({
args: [{type: Helpers.parseComplexType(_type), name: "value"}],
args: [{type: Helpers.parseComplexType('Null<$_type>'), name: "value"}],
expr: macro {
this.data.$name.value = [value.x, value.y];
return value;
@@ -351,20 +365,22 @@ class ShaderFrontend implements FrontendPlugin {
type.fields.push({
pos: pos,
name: propName,
kind: FProp("get", "set", Helpers.parseComplexType(_type)),
kind: FProp("get", "set", Helpers.parseComplexType('Null<$_type>')),
access: [APublic]
});
type.fields.push({
pos: pos,
name: 'set_${name}${suffix}',
kind: FFun({
args: [{type: Helpers.parseComplexType(_type), name: "value"}],
args: [{type: Helpers.parseComplexType('Null<$_type>'), name: "value"}],
expr: macro {
if (!$v{withAlpha} && value.alphaFloat != 1.0) {
throw "vec3 uniform cannot be assigned to a color with transparency";
}
this.json?.put($v{propName}, new kiss_tools.JsonString(new JsonFlxColor(value).stringify()));
if ($v{withAlpha}) {
this.data.$name.value = [value.redFloat, value.greenFloat, value.blueFloat, value.alphaFloat];
return value;
} else if (value.alphaFloat != 1.0) {
throw "vec3 uniform cannot be assigned to a color with transparency";
} else {
this.data.$name.value = [value.redFloat, value.greenFloat, value.blueFloat];
return value;
@@ -379,6 +395,8 @@ class ShaderFrontend implements FrontendPlugin {
args: [],
expr: macro {
var components = this.data.$name.value;
if (components == null || components.length == 0)
return null;
var alpha = if ($v{withAlpha}) components[3] else 1.0;
return flixel.util.FlxColor.fromRGBFloat(components[0], components[1], components[2], alpha);
}
@@ -410,7 +428,8 @@ class ShaderFrontend implements FrontendPlugin {
expressionInterpreted = macro $v{expressionInterpreted};
}
defaultSetterExps.push(macro $i{name + suffix} = $expressionInterpreted);
var propName = macro $i{name + suffix};
defaultSetterExps.push(macro if ($propName == null) $propName = $expressionInterpreted);
} else {
trace('Warning! uniform $uType $name in $file may have its default value of ${expression} ignored!');
}
@@ -446,11 +465,14 @@ class ShaderFrontend implements FrontendPlugin {
args: [{
name: "camera",
opt: true
}, {
name: "jsonMapFile",
opt: true
}],
expr: macro {
uniforms = $a{uniformMapExps};
super();
this.uniforms = [$a{uniformMapExps}];
super(jsonMapFile);
$b{defaultSetterExps};
data.iTime.value = [0.0];
if (camera == null) {
camera = flixel.FlxG.camera;
@@ -458,7 +480,6 @@ class ShaderFrontend implements FrontendPlugin {
this.camera = camera;
data.cameraPos.value = [camera.viewLeft, camera.viewTop];
data.cameraZoom.value = [1.0];
$b{defaultSetterExps}
}
}),
access: [APublic]

View File

@@ -1,11 +1,46 @@
package kiss_flixel.shaders;
import kiss_flixel.shaders.Uniform;
import kiss_tools.JsonMap;
import kiss_tools.JsonString;
import kiss_tools.JsonInt;
import kiss_tools.JsonFloat;
import kiss_tools.JsonBool;
import kiss_flixel.JsonFlxColor;
import kiss_flixel.JsonFlxPoint;
class KFlxShader extends flixel.system.FlxAssets.FlxShader {
public var uniforms(default, null):Map<String,Uniform> = new Map();
public var uniforms(default, null):Map<String,Uniform>;
public function new() {
var json:JsonStringMap = null;
public function new(?jsonMapFile:String) {
super();
if (jsonMapFile != null) {
json = new JsonMap(jsonMapFile, new JsonString(""));
for (name => uniform in uniforms) {
if (json.exists(name)) {
switch (uniform) {
case Boolean:
Reflect.setProperty(this, name, new JsonBool(false).parse(json.get(name).value).value);
case AnyInt | IntRange(_, _) | IntRangeStep(_, _, _):
Reflect.setProperty(this, name, new JsonInt(0).parse(json.get(name).value).value);
case AnyFloat | FloatRange(_, _) | FloatRangeStep(_, _, _):
var value = new JsonFloat(0).parse(json.get(name).value).value;
Reflect.setProperty(this, name, value);
case ColorSolid | ColorWithAlpha:
var value = new JsonFlxColor(0).parse(json.get(name).value).value;
Reflect.setProperty(this, name, value);
case Vector2:
Reflect.setProperty(this, name, new JsonFlxPoint(flixel.math.FlxPoint.get()).parse(json.get(name).value).value);
// TODO
case Vector3:
trace('Warning! Shader uniform $name of type $uniform is not handled in kiss-flixel json');
}
}
}
}
}
}

View File

@@ -4,10 +4,10 @@
// by FencerDevLog (CC0)
// Ported to kiss-flixel by NQNStudios
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 vec3 color_a: hint_color = vec3(0.5);
uniform vec3 color_b: hint_color = vec3(0.5);
uniform vec3 color_c: hint_color = vec3(1.0);
uniform vec3 color_d: hint_color = vec3(0.0, 0.33, 0.67);
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;