Browse Source

Emitter: more generic value optims, to get rid of VMult in getSum, which was not correct

trethaller 4 years ago
parent
commit
ff633e43a4
3 changed files with 56 additions and 22 deletions
  1. 48 22
      hrt/prefab/fx/Emitter.hx
  2. 7 0
      hrt/prefab/fx/Evaluator.hx
  3. 1 0
      hrt/prefab/fx/Value.hx

+ 48 - 22
hrt/prefab/fx/Emitter.hx

@@ -1211,38 +1211,64 @@ class Emitter extends Object3D {
 
 
 		function makeParam(scope: Prefab, name: String): Value {
 		function makeParam(scope: Prefab, name: String): Value {
 			var getCurve = hrt.prefab.Curve.getCurve.bind(scope);
 			var getCurve = hrt.prefab.Curve.getCurve.bind(scope);
-			function makeCompVal(baseProp: Null<Float>, defVal: Float, randProp: Null<Float>, pname: String, suffix: String) : Value {
-				var xVal : Value = VZero;
-				var rv = baseProp != null ? baseProp : defVal;
-				xVal = switch(rv) {
+
+			function vVal(f: Float) : Value {
+				return switch(f) {
 					case 0.0: VZero;
 					case 0.0: VZero;
 					case 1.0: VOne;
 					case 1.0: VOne;
-					default: VConst(rv);
+					default: VConst(f);
+				}
+			}
+
+			function vMult(a: Value, b: Value) : Value {
+				if(a == VZero || b == VZero) return VZero;
+				if(a == VOne) return b;
+				if(b == VOne) return a;
+				switch a {
+					case VConst(va):
+						switch b {
+							case VConst(vb): return VConst(va * vb);
+							case VCurve(cb): return VCurveScale(cb, va);
+							default:
+						}
+					case VCurve(ca):
+						switch b {
+							case VConst(vb): return VCurveScale(ca, vb);
+							default:
+						}
+					default:
 				}
 				}
+				return VMult(a, b);
+			}
 
 
+			function vAdd(a: Value, b: Value) : Value {
+				if(a == VZero) return b;
+				if(b == VZero) return a;
+				switch a {
+					case VConst(va):
+						switch b {
+							case VConst(vb): return VConst(va + vb);
+							default:
+						}
+					default:
+				}
+				return VAdd(a, b);
+			}
+
+			function makeCompVal(baseProp: Null<Float>, defVal: Float, randProp: Null<Float>, pname: String, suffix: String) : Value {
+				var xVal = vVal(baseProp != null ? baseProp : defVal);
 				var randCurve = getCurve(pname + suffix + ".rand");
 				var randCurve = getCurve(pname + suffix + ".rand");
 				var randVal : Value = VZero;
 				var randVal : Value = VZero;
 				if(randCurve != null)
 				if(randCurve != null)
 					randVal = VRandom(randIdx++, VCurveScale(randCurve, randProp != null ? randProp : 1.0));
 					randVal = VRandom(randIdx++, VCurveScale(randCurve, randProp != null ? randProp : 1.0));
-				else if(randProp != null)
-					randVal = VRandom(randIdx++, VConst(randProp));
+				else if(randProp != null && randProp != 0.0)
+					randVal = VRandomScale(randIdx++, randProp);
 
 
 				var xCurve = getCurve(pname + suffix);
 				var xCurve = getCurve(pname + suffix);
-				if (xCurve != null) {
-					if(randVal == VZero)
-						return VMult(xVal, VCurve(xCurve));
-					if(xVal == VZero)
-						return VMult(randVal, VCurve(xCurve));
-					xVal = VAdd(xVal, randVal);
-					return VMult(xVal, VCurve(xCurve));
-				}
-				else {
-					if(randVal == VZero)
-						return xVal;
-					if(xVal == VZero)
-						return randVal;
-					return VAdd(xVal, randVal);
-				}
+				if (xCurve != null)
+					return vMult(vAdd(xVal, randVal), VCurve(xCurve))
+				else
+					return vAdd(xVal, randVal);
 			}
 			}
 
 
 			var baseProp: Dynamic = Reflect.field(props, name);
 			var baseProp: Dynamic = Reflect.field(props, name);

+ 7 - 0
hrt/prefab/fx/Evaluator.hx

@@ -49,6 +49,13 @@ class Evaluator {
 					++len;
 					++len;
 				}
 				}
 				return randValues[idx] * getFloat(scale, time);
 				return randValues[idx] * getFloat(scale, time);
+			case VRandomScale(idx, scale):
+				var len = randValues.length;
+				while(idx >= len) {
+					randValues.push(random.srand());
+					++len;
+				}
+				return randValues[idx] * scale;
 			case VMult(a, b):
 			case VMult(a, b):
 				return getFloat(a, time) * getFloat(b, time);
 				return getFloat(a, time) * getFloat(b, time);
 			case VAdd(a, b):
 			case VAdd(a, b):

+ 1 - 0
hrt/prefab/fx/Value.hx

@@ -7,6 +7,7 @@ enum Value {
 	VCurve(c: Curve);
 	VCurve(c: Curve);
 	VCurveScale(c: Curve, scale: Float);
 	VCurveScale(c: Curve, scale: Float);
 	VRandom(idx: Int, scale: Value);
 	VRandom(idx: Int, scale: Value);
+	VRandomScale(idx: Int, scale: Float);
 	VAdd(a: Value, b: Value);
 	VAdd(a: Value, b: Value);
 	VMult(a: Value, b: Value);
 	VMult(a: Value, b: Value);
 	VVector(x: Value, y: Value, z: Value, ?w: Value);
 	VVector(x: Value, y: Value, z: Value, ?w: Value);