Преглед изворни кода

Fx: share vecpools but not evaluators, which must hold their own random values

trethaller пре 6 година
родитељ
комит
9ac5581809
3 измењених фајлова са 38 додато и 21 уклоњено
  1. 8 2
      hrt/prefab/fx/Emitter.hx
  2. 25 19
      hrt/prefab/fx/Evaluator.hx
  3. 5 0
      hrt/prefab/fx/FX.hx

+ 8 - 2
hrt/prefab/fx/Emitter.hx

@@ -139,7 +139,8 @@ private class ParticleInstance  {
 		}
 		this.def = def;
 		this.emitter = emitter;
-		this.evaluator = emitter.evaluator;
+		this.evaluator = new Evaluator(emitter.random);
+		evaluator.vecPool = this.emitter.vecPool;
 		emitter.instances.push(this);
 	}
 
@@ -312,12 +313,14 @@ class EmitterObject extends h3d.scene.Object {
 	var lastTime = -1.0;
 	var curTime = 0.0;
 	var evaluator : Evaluator;
+	var vecPool = new Evaluator.VecPool();
 
 	public function new(?parent) {
 		super(parent);
 		randomSeed = Std.random(0xFFFFFF);
 		random = new hxd.Rand(randomSeed);
 		evaluator = new Evaluator(random);
+		evaluator.vecPool = vecPool;
 		invTransform = new h3d.Matrix();
 		reset();
 	}
@@ -475,6 +478,9 @@ class EmitterObject extends h3d.scene.Object {
 				if( shCtx == null ) continue;
 				hrt.prefab.fx.BaseFX.getShaderAnims(template, shader, shaderAnims);
 			}
+			for(s in shaderAnims) {
+				s.vecPool = vecPool;
+			}
 
 			// Animated textures animations
 			var frameCount = frameCount == 0 ? frameDivisionX * frameDivisionY : frameCount;
@@ -508,6 +514,7 @@ class EmitterObject extends h3d.scene.Object {
 
 		invTransform.load(parent.getAbsPos());
 		invTransform.invert();
+		vecPool.begin();
 
 		var emitTarget = evaluator.getSum(emitRate, curTime);
 		var delta = hxd.Math.ceil(hxd.Math.min(maxCount - instances.length, emitTarget - emitCount));
@@ -532,7 +539,6 @@ class EmitterObject extends h3d.scene.Object {
 					batch.worldPosition = p.absPos;
 					for( anim in shaderAnims ) {
 						var t = hxd.Math.clamp(p.life / p.lifeTime, 0.0, 1.0);
-						anim.begin();
 						anim.setTime(t);
 					}
 					// Init the start frame for each particle

+ 25 - 19
hrt/prefab/fx/Evaluator.hx

@@ -1,15 +1,10 @@
 package hrt.prefab.fx;
 
-class Evaluator {
-	var randValues : Array<Float> = [];
-	var random: hxd.Rand;
-
+class VecPool {
 	var vecPool : Array<h3d.Vector> = null;
 	var vecPoolSize = 0;
 
-	public function new(random: hxd.Rand) {
-		this.random = random;
-	}
+	public function new() { }
 
 	public function begin() {
 		if(vecPool == null)
@@ -17,6 +12,27 @@ class Evaluator {
 		vecPoolSize = 0;
 	}
 
+	public function get() {
+		var vec = null;
+		if(vecPoolSize < vecPool.length)
+			vec = vecPool[vecPoolSize++];
+		else {
+			vec = new h3d.Vector();
+			vecPool.push(vec);
+		}
+		return vec;
+	}
+}
+
+class Evaluator {
+	var randValues : Array<Float> = [];
+	var random: hxd.Rand;
+	public var vecPool : VecPool;
+
+	public function new(random: hxd.Rand) {
+		this.random = random;
+	}
+
 	public function getFloat(val: Value, time: Float) : Float {
 		if(val == null)
 			return 0.0;
@@ -53,18 +69,8 @@ class Evaluator {
 	}
 
 	public function getVector(v: Value, time: Float, ?vec: h3d.Vector) : h3d.Vector {
-		if(vec == null) {
-			if(vecPool != null) {
-				if(vecPoolSize < vecPool.length)
-					vec = vecPool[vecPoolSize++];
-				else {
-					vec = new h3d.Vector();
-					vecPool.push(vec);
-				}
-			}
-			else
-				vec = new h3d.Vector();
-		}
+		if(vec == null)
+			vec = vecPool != null ? vecPool.get() : new h3d.Vector();
 		switch(v) {
 			case VMult(a, b):
 				var av = getVector(a, time);

+ 5 - 0
hrt/prefab/fx/FX.hx

@@ -18,6 +18,7 @@ class FXAnimation extends h3d.scene.Object {
 	public var constraints : Array<hrt.prefab.Constraint> = [];
 	public var script : hrt.prefab.fx.FXScript;
 
+	public var vecPool = new Evaluator.VecPool();
 	var evaluator : Evaluator;
 	var random : hxd.Rand;
 
@@ -25,6 +26,7 @@ class FXAnimation extends h3d.scene.Object {
 		super(parent);
 		random = new hxd.Rand(Std.random(0xFFFFFF));
 		evaluator = new Evaluator(random);
+		evaluator.vecPool = vecPool;
 		name = "FXAnimation";
 		setTime(0);
 	}
@@ -65,6 +67,7 @@ class FXAnimation extends h3d.scene.Object {
 	static var tempMat = new h3d.Matrix();
 	public function setTime( time : Float ) {		
 		this.localTime = time;
+		vecPool.begin();
 		for(anim in objects) {
 			var m = tempMat;
 			if(anim.scale != null) {
@@ -290,6 +293,8 @@ class FX extends BaseFX {
 		getObjAnimations(ctx, this, fxanim.objects);
 		BaseFX.getShaderAnims(ctx, this, fxanim.shaderAnims);
 		getEmitters(ctx, this, fxanim.emitters);
+		for(s in fxanim.shaderAnims)
+			s.vecPool = fxanim.vecPool;
 
 		if(scriptCode != null && scriptCode != ""){
 			var parser = new FXScriptParser();