瀏覽代碼

Update FX

ShiroSmith 6 年之前
父節點
當前提交
908b254293
共有 4 個文件被更改,包括 75 次插入47 次删除
  1. 1 1
      hide/prefab/fx/FX.hx
  2. 49 32
      hide/prefab/fx/FXScript.hx
  3. 20 9
      hide/prefab/fx/FXScriptParser.hx
  4. 5 5
      hide/view/FXEditor.hx

+ 1 - 1
hide/prefab/fx/FX.hx

@@ -176,7 +176,7 @@ class FXAnimation extends h3d.scene.Object {
 		}
 
 		if(script != null)
-			script.eval();
+			script.run();
 	}
 
 	public function resolveContraints( caster : h3d.scene.Object ) {

+ 49 - 32
hide/prefab/fx/FXScript.hx

@@ -1,5 +1,7 @@
 package hide.prefab.fx;
 
+typedef Argument = { name : String, ?value : FxAst };
+
 enum FxAst {
 	Block( a : Array<FxAst> );
 	Var( get : Void -> Float );
@@ -8,24 +10,26 @@ enum FxAst {
 	Op( a : FxAst, b : FxAst, op : Float -> Float -> Float );
 	Unop( a : FxAst, op : Float -> Float );
 	If( cond : FxAst, eif : FxAst, eelse : FxAst );
+	Function( args : Array<hide.prefab.fx.Argument>, a : FxAst, name : String );
+	Call( name : String, args : Array<FxAst> );
+}
+
+enum FXVar {
+	Float( value : Float );
+	Int( value : Int );
+	Bool( value : Bool );
 }
 
+// UI
 enum ParamOption {
 	Range( min : Float, max : Float );
 }
-
 enum FXParam {
 	Float( name : String, value : Float, options : Array<ParamOption> );
 	Int( name : String, value : Int, options : Array<ParamOption> );
 	Bool( name : String, value : Bool, options : Array<ParamOption> );
 }
 
-enum FXVar {
-	Float( value : Float );
-	Int( value : Int );
-	Bool( value : Bool );
-}
-
 class FXScript {
 
 	public var fx : hide.prefab.fx.FX.FXAnimation;
@@ -138,32 +142,45 @@ class FXScript {
 		}
 	}
 
-	public function eval() {
-		function eval(ast : FxAst) : Float {
-			if(ast == null) return 0.0;
-			switch (ast) {
-				case Block(a):
-					for(ast in a)
-						eval(ast);
-					return 0.0;
-				case Var(get):
-					return get();
-				case Const(v):
-					return v;
-				case Set(set, a):
-					var v = eval(a);
-					set(v);
-					return v;
-				case Op(a, b, op):
-					var va = eval(a);
-					var vb = eval(b);
-					return op(va,vb);
-				case Unop(a, op):
-					return op(eval(a));
-				case If(cond, eif, eelse):
-					return eval(cond) != 0 ? eval(eif) : eval(eelse);
-			}
+	function call( f : String, args : Array<FxAst>) : Float {
+		switch(f){
+			case "rand": return hxd.Math.random();
+			case "mix": return hxd.Math.lerp(eval(args[0]), eval(args[1]), eval(args[2]));
+			default: return 0.0;
 		}
+	}
+
+	function eval(ast : FxAst) : Float {
+		if(ast == null) return 0.0;
+		switch (ast) {
+			case Block(a):
+				for(ast in a)
+					eval(ast);
+				return 0.0;
+			case Call(a, args):
+				return call(a, args);
+			case Function(args, a, name):
+				return 0.0; // TO DO
+			case Var(get):
+				return get();
+			case Const(v):
+				return v;
+			case Set(set, a):
+				var v = eval(a);
+				set(v);
+				return v;
+			case Op(a, b, op):
+				var va = eval(a);
+				var vb = eval(b);
+				return op(va,vb);
+			case Unop(a, op):
+				return op(eval(a));
+			case If(cond, eif, eelse):
+				return eval(cond) != 0 ? eval(eif) : eval(eelse);
+		}
+	}
+
+	public function run() {
 		eval(ast);
 	}
 }

+ 20 - 9
hide/prefab/fx/FXScriptParser.hx

@@ -69,12 +69,22 @@ class FXScriptParser {
 			function getGetField( expr : hscript.Expr ){
 				return script.getGetter(getPath(expr));
 			}
-
+			trace(expr);
 			switch(getExpr(expr)){
 
 				case EBlock(e):
 					return Block( [for(expr in e) convert(expr)] );
 
+				case ECall( e, params ):
+					var name = switch(getExpr(e)){
+						case EIdent(v): v;
+						default: null;
+					}
+					return Call( name, [for(a in params) convert(a)]);
+
+				case EFunction(args, e, name, ret):
+					return null; // TO DO
+
 				case EVar(n, t, e):
 					if(e != null ) return Set(function(v){ script.setVar(n, v); }, convert(e));
 					else return Var( function(){ return script.getVar(n); });
@@ -135,15 +145,16 @@ class FXScriptParser {
 					switch(getExpr(e)){
 						case EIdent(v):
 							return switch(op){
-								case "++": Set(function(val){ script.setVar(v, val); }, Unop(convert(e), function(a){ return prefix ? ++a : a++; }));
-								case "--": Set(function(val){ script.setVar(v, val); }, Unop(convert(e), function(a){ return prefix ? --a : a--; }));
+								case "++": Set( function(val){ script.setVar(v, val); }, Unop(convert(e), function(a){ return prefix ? ++a : a++; }));
+								case "--": Set( function(val){ script.setVar(v, val); }, Unop(convert(e), function(a){ return prefix ? --a : a--; }));
+								case "-": Unop( convert(e), function(a){ return -a;});
 								default: null;
 							}
-
 						case EField(e,f):
 							return switch(op){
 								case "++": Set( getSetField(e), Unop(convert(e), function(a){ return prefix ? ++a : a++; }));
 								case "--": Set( getSetField(e), Unop(convert(e), function(a){ return prefix ? --a : a--; }));
+								case "-": Unop( convert(e), function(a){ return -a;});
 								default : null;
 							}
 						default: return null;
@@ -409,7 +420,7 @@ class FXScriptParser {
 	}
 
 	function createSlider( s : FXScript, name : String, min : Float, max : Float, step : Float, defaultVal : Float ) : Element {
-		var root = new Element('<div class="fx-slider"></div>');
+		var root = new Element('<div class="slider"></div>');
 		var label = new Element('<label> $name : </label>');
 		var slider = new Element('<input type="range" min="$min" max="$max" step="$step" value="$defaultVal"/>');
 		root.append(label);
@@ -421,13 +432,13 @@ class FXScriptParser {
 	}
 
 	function createChekbox( s : FXScript, name : String, defaultVal : Bool ) : Element {
-		var root = new Element('<div class="fx-chekcBox"></div>');
+		var root = new Element('<div class="checkBox"></div>');
 		var label = new Element('<label> $name : </label>');
 		var checkbox = new Element('<input type="checkbox" value="$defaultVal"/>');
+		checkbox.on("input", function(_) {
+			s.setVar(name, checkbox.val() );
+		});
 		root.append(label);
-		/*checkbox.onChange = function(b){
-			s.setVar(name, checkbox.value);
-		}*/
 		root.append(checkbox);
 		return root;
 	}

+ 5 - 5
hide/view/FXEditor.hx

@@ -266,7 +266,7 @@ class FXEditor extends FileView {
 
 				if(previewMax < previewMin + 0.1) {
 					previewMin = 0;
-					previewMax = data.duration;
+					previewMax = data.duration == 0 ? 1 : data.duration;
 				}
 				if(selectMax < selectMin + 0.1) {
 					selectMin = 0;
@@ -300,7 +300,7 @@ class FXEditor extends FileView {
 		selectMin = 0.0;
 		selectMax = 0.0;
 		previewMin = 0.0;
-		previewMax = data.duration;
+		previewMax = data.duration == 0 ? 5000 : data.duration;
 		refreshTimeline(false);
 	}
 
@@ -374,7 +374,7 @@ class FXEditor extends FileView {
 
 	function onPrefabChange(p: PrefabElement, ?pname: String) {
 		if(p == data) {
-			previewMax = hxd.Math.min(data.duration, previewMax);
+			previewMax = hxd.Math.min(data.duration == 0 ? 5000 : data.duration, previewMax);
 			refreshTimeline(false);
 		}
 	}
@@ -410,7 +410,7 @@ class FXEditor extends FileView {
 		scroll.empty();
 		var width = scroll.parent().width();
 		var minX = Math.floor(ixt(0));
-		var maxX = Math.ceil(hxd.Math.min(data.duration, ixt(width)));
+		var maxX = Math.ceil(hxd.Math.min(data.duration == 0 ? 5000 : data.duration, ixt(width)));
 		for(ix in minX...(maxX+1)) {
 			var mark = new Element('<span class="mark"></span>').appendTo(scroll);
 			mark.css({left: xt(ix)});
@@ -430,7 +430,7 @@ class FXEditor extends FileView {
 		var prevLeft = new Element('<span class="preview-left"></span>').appendTo(overlay);
 		prevLeft.css({left: 0, width: xt(previewMin)});
 		var prevRight = new Element('<span class="preview-right"></span>').appendTo(overlay);
-		prevRight.css({left: xt(previewMax), width: xt(data.duration) - xt(previewMax)});
+		prevRight.css({left: xt(previewMax), width: xt(data.duration == 0 ? 5000 : data.duration) - xt(previewMax)});
 	}
 
 	function afterPan(anim: Bool) {