Browse Source

Update FX script

ShiroSmith 6 years ago
parent
commit
4971e54810
5 changed files with 42 additions and 18 deletions
  1. 8 4
      bin/style.less
  2. 4 5
      hide/prefab/fx/FX.hx
  3. 13 5
      hide/prefab/fx/FXScript.hx
  4. 16 3
      hide/prefab/fx/FXScriptParser.hx
  5. 1 1
      hide/view/FXEditor.hx

+ 8 - 4
bin/style.less

@@ -704,11 +704,15 @@ input[type=checkbox] {
 }
 }
 
 
 .fx-scriptParams {
 .fx-scriptParams {
-	margin : 0px;
-}
-
-.fx-slider {
 	margin : 10px;
 	margin : 10px;
+
+	.slider {
+		margin : 10px;
+	}
+
+	.checkBox {
+		margin : 10px;
+	}
 }
 }
 
 
 .fx-animpanel {
 .fx-animpanel {

+ 4 - 5
hide/prefab/fx/FX.hx

@@ -176,7 +176,7 @@ class FXAnimation extends h3d.scene.Object {
 		}
 		}
 
 
 		if(script != null)
 		if(script != null)
-			script.run();
+			script.update();
 	}
 	}
 
 
 	public function resolveContraints( caster : h3d.scene.Object ) {
 	public function resolveContraints( caster : h3d.scene.Object ) {
@@ -402,6 +402,7 @@ class FX extends hxd.prefab.Library {
 		fxanim.duration = duration;
 		fxanim.duration = duration;
 		fxanim.loopAnims = loopAnims;
 		fxanim.loopAnims = loopAnims;
 		ctx.local3d = fxanim;
 		ctx.local3d = fxanim;
+		fxanim.playSpeed = 1.0;
 
 
 		#if editor
 		#if editor
 		super.makeInstance(ctx);
 		super.makeInstance(ctx);
@@ -426,12 +427,10 @@ class FX extends hxd.prefab.Library {
 
 
 		if(script != null && script != ""){
 		if(script != null && script != ""){
 			var parser = new FXScriptParser();
 			var parser = new FXScriptParser();
-			var fxScript = parser.createFXScript(script, fxanim);
-			fxanim.script = fxScript;
+			fxanim.script = parser.createFXScript(script, fxanim);
+			fxanim.script.init();
 		}
 		}
 
 
-		fxanim.playSpeed = 1.0;
-
 		return ctx;
 		return ctx;
 	}
 	}
 
 

+ 13 - 5
hide/prefab/fx/FXScript.hx

@@ -32,12 +32,16 @@ enum FXParam {
 
 
 class FXScript {
 class FXScript {
 
 
-	public var fx : hide.prefab.fx.FX.FXAnimation;
 	public var myVars : Map<String, FXVar> = [];
 	public var myVars : Map<String, FXVar> = [];
-	public var ast : FxAst;
 	public var params : Array<FXParam> = [];
 	public var params : Array<FXParam> = [];
 
 
-	public function new(){
+	var fx : hide.prefab.fx.FX.FXAnimation;
+	var ast : FxAst;
+	var initAst : FxAst;
+	var updateAst : FxAst;
+
+	public function new( fx : hide.prefab.fx.FX.FXAnimation ){
+		this.fx = fx;
 	}
 	}
 
 
 	public function getGetter( p : String ) : Void -> Float {
 	public function getGetter( p : String ) : Void -> Float {
@@ -180,7 +184,11 @@ class FXScript {
 		}
 		}
 	}
 	}
 
 
-	public function run() {
-		eval(ast);
+	public function init() {
+		eval(initAst);
+	}
+
+	public function update() {
+		eval(updateAst);
 	}
 	}
 }
 }

+ 16 - 3
hide/prefab/fx/FXScriptParser.hx

@@ -2,6 +2,7 @@ package hide.prefab.fx;
 import  hide.prefab.fx.FXScript;
 import  hide.prefab.fx.FXScript;
 
 
 @:access(hide.view.FXEditor)
 @:access(hide.view.FXEditor)
+@:access(hide.prefab.fx.FXScript)
 class FXScriptParser {
 class FXScriptParser {
 
 
 	public var firstParse = false;
 	public var firstParse = false;
@@ -23,8 +24,7 @@ class FXScriptParser {
 		parser.allowTypes = true;
 		parser.allowTypes = true;
 		parser.allowJSON = true;
 		parser.allowJSON = true;
 		var expr : hscript.Expr = null;
 		var expr : hscript.Expr = null;
-		var script = new hide.prefab.fx.FXScript();
-		script.fx = fx;
+		var script = new hide.prefab.fx.FXScript(fx);
 
 
 		function parse( expr : hscript.Expr ) {
 		function parse( expr : hscript.Expr ) {
 			if( expr == null ) return;
 			if( expr == null ) return;
@@ -83,7 +83,11 @@ class FXScriptParser {
 					return Call( name, [for(a in params) convert(a)]);
 					return Call( name, [for(a in params) convert(a)]);
 
 
 				case EFunction(args, e, name, ret):
 				case EFunction(args, e, name, ret):
-					return null; // TO DO
+					switch(name){
+						case "update": script.updateAst = convert(e);
+						case "init": script.initAst = convert(e);
+					}
+					return null;
 
 
 				case EVar(n, t, e):
 				case EVar(n, t, e):
 					if(e != null ) return Set(function(v){ script.setVar(n, v); }, convert(e));
 					if(e != null ) return Set(function(v){ script.setVar(n, v); }, convert(e));
@@ -157,6 +161,11 @@ class FXScriptParser {
 								case "-": Unop( convert(e), function(a){ return -a;});
 								case "-": Unop( convert(e), function(a){ return -a;});
 								default : null;
 								default : null;
 							}
 							}
+						case ECall( e, params ):
+							return switch(op){
+								case "-": Unop( convert(e), function(a){ return -a;});
+								default : null;
+							}
 						default: return null;
 						default: return null;
 					}
 					}
 
 
@@ -171,6 +180,8 @@ class FXScriptParser {
 	function createFXVar( expr : hscript.Expr ) {
 	function createFXVar( expr : hscript.Expr ) {
 		function parse(expr : hscript.Expr) : FXVar {
 		function parse(expr : hscript.Expr) : FXVar {
 			return switch(getExpr(expr)){
 			return switch(getExpr(expr)){
+				case EFunction(args, e, name, ret):
+					return parse(e);
 				case EMeta(name, args, e):
 				case EMeta(name, args, e):
 					return parse(e);
 					return parse(e);
 				case EVar(n, t, e):
 				case EVar(n, t, e):
@@ -264,6 +275,8 @@ class FXScriptParser {
 		function parse(expr : hscript.Expr) : FXParam {
 		function parse(expr : hscript.Expr) : FXParam {
 			if( expr == null ) return null;
 			if( expr == null ) return null;
 			switch(getExpr(expr)){
 			switch(getExpr(expr)){
+				case EFunction(args, e, name, ret):
+					return parse(e);
 				case EMeta(name, args, e):
 				case EMeta(name, args, e):
 					switch(name){
 					switch(name){
 						case "range":
 						case "range":

+ 1 - 1
hide/view/FXEditor.hx

@@ -968,6 +968,7 @@ class FXEditor extends FileView {
 				timeLineEl.css({left: xt(currentTime)});
 				timeLineEl.css({left: xt(currentTime)});
 			if(currentTime >= previewMax) {
 			if(currentTime >= previewMax) {
 				currentTime = previewMin;
 				currentTime = previewMin;
+				sceneEditor.refreshScene();
 				anim.setRandSeed(Std.random(0xFFFFFF));
 				anim.setRandSeed(Std.random(0xFFFFFF));
 			}
 			}
 		}
 		}
@@ -984,7 +985,6 @@ class FXEditor extends FileView {
 			statusText.text = lines.join("\n");
 			statusText.text = lines.join("\n");
 		}
 		}
 
 
-
 		var cam = scene.s3d.camera;
 		var cam = scene.s3d.camera;
 		if( light != null ) {
 		if( light != null ) {
 			var angle = Math.atan2(cam.target.y - cam.pos.y, cam.target.x - cam.pos.x);
 			var angle = Math.atan2(cam.target.y - cam.pos.y, cam.target.x - cam.pos.x);