|
@@ -74,16 +74,35 @@ public class EffectTrack implements ClonableTrack {
|
|
|
private float length = 0;
|
|
|
private boolean emitted = false;
|
|
|
private boolean initialized = false;
|
|
|
- private boolean stopRequested = false;
|
|
|
+
|
|
|
//control responsible for disable and cull the emitter once all particles are gone
|
|
|
- private AbstractControl killParticles = new AbstractControl() {
|
|
|
+ private KillParticleControl killParticles = new KillParticleControl();
|
|
|
+ public static class KillParticleControl extends AbstractControl {
|
|
|
+
|
|
|
+ ParticleEmitter emitter;
|
|
|
+ boolean stopRequested = false;
|
|
|
+
|
|
|
+ public KillParticleControl() {
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setSpatial(Spatial spatial) {
|
|
|
+ super.setSpatial(spatial);
|
|
|
+ if(spatial instanceof ParticleEmitter){
|
|
|
+ emitter = (ParticleEmitter)spatial;
|
|
|
+ }else{
|
|
|
+ throw new IllegalArgumentException("KillParticleEmitter can only ba attached to ParticleEmitter");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
protected void controlUpdate(float tpf) {
|
|
|
+
|
|
|
if (emitter.getNumVisibleParticles() == 0) {
|
|
|
emitter.setCullHint(CullHint.Always);
|
|
|
emitter.setEnabled(false);
|
|
|
- emitter.removeControl(killParticles);
|
|
|
+ emitter.removeControl(this);
|
|
|
stopRequested = false;
|
|
|
}
|
|
|
}
|
|
@@ -163,9 +182,9 @@ public class EffectTrack implements ClonableTrack {
|
|
|
//if the emitter has 0 particles per seconds emmit all particles in one shot
|
|
|
if (particlesPerSeconds == 0) {
|
|
|
emitter.emitAllParticles();
|
|
|
- if (!stopRequested) {
|
|
|
+ if (!killParticles.stopRequested) {
|
|
|
emitter.addControl(killParticles);
|
|
|
- stopRequested = true;
|
|
|
+ killParticles.stopRequested = true;
|
|
|
}
|
|
|
} else {
|
|
|
//else reset its former particlePerSec value to let it emmit.
|
|
@@ -178,9 +197,9 @@ public class EffectTrack implements ClonableTrack {
|
|
|
private void stop() {
|
|
|
emitter.setParticlesPerSec(0);
|
|
|
emitted = false;
|
|
|
- if (!stopRequested) {
|
|
|
+ if (!killParticles.stopRequested) {
|
|
|
emitter.addControl(killParticles);
|
|
|
- stopRequested = true;
|
|
|
+ killParticles.stopRequested = true;
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -283,6 +302,10 @@ public class EffectTrack implements ClonableTrack {
|
|
|
data.getTracks().remove(this);
|
|
|
}
|
|
|
this.emitter = emitter;
|
|
|
+ //saving particles per second value
|
|
|
+ this.particlesPerSeconds = emitter.getParticlesPerSec();
|
|
|
+ //setting the emmitter to not emmit.
|
|
|
+ this.emitter.setParticlesPerSec(0);
|
|
|
setUserData(this);
|
|
|
}
|
|
|
|
|
@@ -327,8 +350,6 @@ public class EffectTrack implements ClonableTrack {
|
|
|
OutputCapsule out = ex.getCapsule(this);
|
|
|
//reseting the particle emission rate on the emitter before saving.
|
|
|
emitter.setParticlesPerSec(particlesPerSeconds);
|
|
|
- //removing eventual unpersisted control off the emitter
|
|
|
- emitter.removeControl(killParticles);
|
|
|
out.write(emitter, "emitter", null);
|
|
|
out.write(particlesPerSeconds, "particlesPerSeconds", 0);
|
|
|
out.write(length, "length", 0);
|
|
@@ -349,6 +370,8 @@ public class EffectTrack implements ClonableTrack {
|
|
|
//This also avoid null pointer exception if the model is not loaded via the AssetManager.
|
|
|
emitter = (ParticleEmitter) in.readSavable("emitter", null);
|
|
|
emitter.setParticlesPerSec(0);
|
|
|
+ //if the emitter was saved with a KillParticleControl we remove it.
|
|
|
+ emitter.removeControl(KillParticleControl.class);
|
|
|
length = in.readFloat("length", length);
|
|
|
startOffset = in.readFloat("startOffset", 0);
|
|
|
}
|