ソースを参照

allow any kind of shader in FX

Nicolas Cannasse 4 年 前
コミット
85133f460d
1 ファイル変更23 行追加3 行削除
  1. 23 3
      hrt/prefab/fx/BaseFX.hx

+ 23 - 3
hrt/prefab/fx/BaseFX.hx

@@ -18,9 +18,29 @@ typedef ShaderParams = Array<ShaderParam>;
 
 class ShaderAnimation extends Evaluator {
 	public var params : ShaderParams;
-	public var shader : hxsl.DynamicShader;
+	public var shader : hxsl.Shader;
 
 	public function setTime(time: Float) {
+		for(param in params) {
+			var v = param.def;
+			var val : Dynamic;
+			switch(v.type) {
+			case TFloat: val = getFloat(param.value, time);
+			case TInt: val = hxd.Math.round(getFloat(param.value, time));
+			case TBool: val = getFloat(param.value, time) >= 0.5;
+			case TVec(_, VFloat): val = getVector(param.value, time);
+			default:
+				continue;
+			}
+			Reflect.setProperty(shader, v.name, val);
+		}
+	}
+}
+
+class ShaderDynAnimation extends ShaderAnimation {
+
+	override function setTime(time: Float) {
+		var shader : hxsl.DynamicShader = cast shader;
 		for(param in params) {
 			var v = param.def;
 			switch(v.type) {
@@ -138,13 +158,13 @@ class BaseFX extends hrt.prefab.Library {
 			}
 		}
 
-		var shader = elt.to(hrt.prefab.DynamicShader);
+		var shader = elt.to(hrt.prefab.Shader);
 		if(shader == null)
 			return;
 
 		for(shCtx in ctx.shared.getContexts(elt)) {
 			if(shCtx.custom == null) continue;
-			var anim: ShaderAnimation = new ShaderAnimation(new hxd.Rand(0));
+			var anim = Std.is(shCtx.custom,hxsl.DynamicShader) ? new ShaderDynAnimation(new hxd.Rand(0)) : new ShaderAnimation(new hxd.Rand(0));
 			anim.shader = shCtx.custom;
 			anim.params = makeShaderParams(ctx, shader);
 			anims.push(anim);