shaders now support nullable values and FlxGraphic

This commit is contained in:
⍚~Nex
2025-04-22 23:40:35 +02:00
parent 2f2bad2dc9
commit cd8327604b
+20 -21
View File
@@ -1,26 +1,20 @@
package funkin.backend.shaders; package funkin.backend.shaders;
import flixel.graphics.FlxGraphic;
import flixel.system.FlxAssets.FlxShader;
import haxe.Exception; import haxe.Exception;
import hscript.IHScriptCustomBehaviour; import hscript.IHScriptCustomBehaviour;
import flixel.graphics.tile.FlxGraphicsShader; import lime.utils.Float32Array;
import openfl.display3D.Program3D; import openfl.display.BitmapData;
import flixel.system.FlxAssets.FlxShader; import openfl.display.ShaderInput;
import openfl.display.ShaderParameter;
import openfl.display.ShaderParameterType;
import openfl.display3D._internal.GLProgram; import openfl.display3D._internal.GLProgram;
import openfl.display3D._internal.GLShader; import openfl.display3D._internal.GLShader;
import openfl.utils._internal.Log; import openfl.utils._internal.Log;
import openfl.display.BitmapData;
import openfl.display.ShaderParameter;
import openfl.display.ShaderParameterType;
import openfl.display.ShaderInput;
import lime.utils.Float32Array;
using StringTools; using StringTools;
import openfl.display.ShaderParameter;
import openfl.display.BitmapData;
import openfl.display.ShaderInput;
@:access(openfl.display3D.Context3D) @:access(openfl.display3D.Context3D)
@:access(openfl.display3D.Program3D) @:access(openfl.display3D.Program3D)
@:access(openfl.display.ShaderInput) @:access(openfl.display.ShaderInput)
@@ -195,7 +189,7 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
var useBackCompat:Bool = true; var useBackCompat:Bool = true;
for (regex in ShaderTemplates.vertBackCompatVarList) if (!regex.match(value)) useBackCompat = false; for (regex in ShaderTemplates.vertBackCompatVarList) if (!regex.match(value)) useBackCompat = false;
value = value.replace("#pragma header", useBackCompat ? ShaderTemplates.vertHeaderBackCompat : ShaderTemplates.vertHeader).replace("#pragma body", useBackCompat ? ShaderTemplates.vertBodyBackCompat : ShaderTemplates.vertBody); value = value.replace("#pragma header", useBackCompat ? ShaderTemplates.vertHeaderBackCompat : ShaderTemplates.vertHeader).replace("#pragma body", useBackCompat ? ShaderTemplates.vertBodyBackCompat : ShaderTemplates.vertBody);
if (value != __glVertexSource) if (value != __glVertexSource)
{ {
@@ -495,25 +489,26 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
} else { } else {
var field = Reflect.field(data, name); var field = Reflect.field(data, name);
var cl = Type.getClassName(Type.getClass(field)); var cl = Type.getClassName(Type.getClass(field));
var isNotNull = val != null;
// cant do "field is ShaderInput" for some reason // cant do "field is ShaderInput" for some reason
if (cl.startsWith("openfl.display.ShaderParameter")) { if (cl.startsWith("openfl.display.ShaderParameter")) {
if (field.__length <= 1) { if (field.__length <= 1) {
// that means we wait for a single number, instead of an array // that means we wait for a single number, instead of an array
if (field.__isInt && !(val is Int)) { if (field.__isInt && isNotNull && !(val is Int)) {
throw new ShaderTypeException(name, Type.getClass(val), 'Int'); throw new ShaderTypeException(name, Type.getClass(val), 'Int');
return null; return null;
} else } else
if (field.__isBool && !(val is Bool)) { if (field.__isBool && isNotNull && !(val is Bool)) {
throw new ShaderTypeException(name, Type.getClass(val), 'Bool'); throw new ShaderTypeException(name, Type.getClass(val), 'Bool');
return null; return null;
} else } else
if (field.__isFloat && !(val is Float)) { if (field.__isFloat && isNotNull && !(val is Float)) {
throw new ShaderTypeException(name, Type.getClass(val), 'Float'); throw new ShaderTypeException(name, Type.getClass(val), 'Float');
return null; return null;
} }
return field.value = [val]; return field.value = isNotNull ? [val] : null;
} else { } else {
if (!(val is Array)) { if (isNotNull && !(val is Array)) {
throw new ShaderTypeException(name, Type.getClass(val), Array); throw new ShaderTypeException(name, Type.getClass(val), Array);
return null; return null;
} }
@@ -521,11 +516,15 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
} }
} else if (cl.startsWith("openfl.display.ShaderInput")) { } else if (cl.startsWith("openfl.display.ShaderInput")) {
// shader input!! // shader input!!
if (!(val is BitmapData)) { var bitmap:BitmapData;
if (!isNotNull) bitmap = null;
else if (val is FlxGraphic) bitmap = val.bitmap;
else if (val is BitmapData) bitmap = val;
else {
throw new ShaderTypeException(name, Type.getClass(val), BitmapData); throw new ShaderTypeException(name, Type.getClass(val), BitmapData);
return null; return null;
} }
field.input = cast val; field.input = bitmap;
} }
} }