Explorar el Código

FXScript: improvements & fixes, support setting FX Values from script

trethaller hace 6 años
padre
commit
63c05c7921
Se han modificado 2 ficheros con 19 adiciones y 3 borrados
  1. 2 0
      hide/prefab/fx/FX.hx
  2. 17 3
      hide/prefab/fx/FXScript.hx

+ 2 - 0
hide/prefab/fx/FX.hx

@@ -121,6 +121,8 @@ class FXAnimation extends h3d.scene.Object {
 	static var tempMat = new h3d.Matrix();
 	static var tempMat = new h3d.Matrix();
 	public function setTime( localTime : Float, ?worldTime : Float ) {
 	public function setTime( localTime : Float, ?worldTime : Float ) {
 		if(worldTime == null) worldTime = localTime;
 		if(worldTime == null) worldTime = localTime;
+		this.localTime = localTime;
+		this.worldTime = worldTime;
 		for(anim in objects) {
 		for(anim in objects) {
 			var m = tempMat;
 			var m = tempMat;
 			if(anim.scale != null) {
 			if(anim.scale != null) {

+ 17 - 3
hide/prefab/fx/FXScript.hx

@@ -57,6 +57,8 @@ class FXScript {
 			var next = curObj.getObjectByName(names[i++]);
 			var next = curObj.getObjectByName(names[i++]);
 			next != null ? curObj = next : break;
 			next != null ? curObj = next : break;
 		}
 		}
+		if(curObj == null)
+			return () -> 0.0;
 		var field : String = "";
 		var field : String = "";
 		for(index in i - 1 ... i)
 		for(index in i - 1 ... i)
 			field += names[index];
 			field += names[index];
@@ -94,6 +96,8 @@ class FXScript {
 			var next = curObj.getObjectByName(names[i++]);
 			var next = curObj.getObjectByName(names[i++]);
 			next != null ? curObj = next : break;
 			next != null ? curObj = next : break;
 		}
 		}
+		if(curObj == null)
+			return (v) -> {};
 		var field : String = "";
 		var field : String = "";
 		for(index in i - 1 ... i)
 		for(index in i - 1 ... i)
 			field += names[index];
 			field += names[index];
@@ -112,13 +116,22 @@ class FXScript {
 			case "rotationZ": function(v){
 			case "rotationZ": function(v){
 				var euler = curObj.getRotationQuat().toEuler();
 				var euler = curObj.getRotationQuat().toEuler();
 				curObj.setRotation(euler.x, euler.y, v); };
 				curObj.setRotation(euler.x, euler.y, v); };
-			default: function(v){
-				if(Reflect.hasField(curObj, field))
-					Reflect.setProperty(curObj, field, v); };
+			default: {
+				if(Reflect.hasField(curObj, field)) {
+					var cur = Reflect.field(curObj, field);
+					if(Std.is(cur, Value))
+						(v) -> Reflect.setProperty(curObj, field, Value.VConst(v));
+					else
+						(v) -> Reflect.setProperty(curObj, field, v);
+				}
+				else (v) -> {};
+			};
 		}
 		}
 	}
 	}
 
 
 	public function getVar( n : String ) : Float {
 	public function getVar( n : String ) : Float {
+		if(n == "time")  // TODO: support @global like hxsl
+			return fx.localTime;
 		if(!myVars.exists(n))
 		if(!myVars.exists(n))
 			return 0.0;
 			return 0.0;
 		if(myVars[n] == null)
 		if(myVars[n] == null)
@@ -150,6 +163,7 @@ class FXScript {
 		switch(f){
 		switch(f){
 			case "rand": return hxd.Math.random();
 			case "rand": return hxd.Math.random();
 			case "mix": return hxd.Math.lerp(eval(args[0]), eval(args[1]), eval(args[2]));
 			case "mix": return hxd.Math.lerp(eval(args[0]), eval(args[1]), eval(args[2]));
+			case "clamp": return hxd.Math.clamp(eval(args[0]), eval(args[1]), eval(args[2]));
 			default: return 0.0;
 			default: return 0.0;
 		}
 		}
 	}
 	}