Skip to content

Commit

Permalink
Fix the last reported NRE and improve the behaviors on Vessel and Deb…
Browse files Browse the repository at this point in the history
…ris .Die() call
  • Loading branch information
sarbian committed Jul 19, 2014
1 parent 36b129d commit ca83787
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 45 deletions.
39 changes: 30 additions & 9 deletions ModelMultiParticlePersistFX.cs
Expand Up @@ -176,6 +176,7 @@ public List<ModelMultiParticlePersistFX> Instances
public ModelMultiParticlePersistFX()
{
winID = baseWinID++;
//Print("Constructor");
}

//~ModelMultiParticlePersistFX()
Expand All @@ -184,10 +185,23 @@ public ModelMultiParticlePersistFX()
// list.Remove(this);
//}


// if Die() is called for a debrit of vessel then all the
// vessel gameobject are removed without an OnDestroy call
// But an OnVesselDie message is send before, so we can
// Catch in time
public void OnVesselDie()
{
//Print("OnVesselDie : EJECT EJECT EJECT !");
this.OnDestroy();
}

private void OnDestroy()
{
//Print("OnDestroy");
if (persistentEmitters != null)
{
//Print("OnDestroy is GO !");
for (int i = 0; i < persistentEmitters.Count; i++)
{
persistentEmitters[i].Detach(0);
Expand All @@ -198,6 +212,7 @@ private void OnDestroy()

public override void OnEvent()
{
//Print("OnEvent");
if (!activated || persistentEmitters == null)
{
return;
Expand All @@ -215,6 +230,7 @@ public override void OnEvent()

public override void OnEvent(float power)
{
//Print("OnEvent " + power);
if (persistentEmitters == null)
{
return;
Expand All @@ -241,7 +257,8 @@ public override void OnEvent(float power)

public void FixedUpdate()
{
if (persistentEmitters == null)
//Print("FixedUpdate");
if (persistentEmitters == null || this.hostPart == null || this.hostPart.rb == null)
{
return;
}
Expand Down Expand Up @@ -398,6 +415,7 @@ public void UpdateEmitters(float power)

public void Update()
{
//Print("Update");
if (persistentEmitters == null)
{
return;
Expand All @@ -418,6 +436,8 @@ public void Update()

public override void OnInitialize()
{
//Print("Init");

// Restore the Curve config from the node content backup
// Done because I could not get the serialization of MultiInputCurve to work
if (node_backup != string.Empty)
Expand All @@ -440,28 +460,28 @@ public override void OnInitialize()
}
catch (Exception e)
{
print("unable to load shader " + shaderFileName + " : " + e.ToString());
Print("unable to load shader " + shaderFileName + " : " + e.ToString());
}
}

List<Transform> transforms = new List<Transform>(hostPart.FindModelTransforms(transformName));
if (transforms.Count == 0)
{
print("Cannot find transform " + transformName);
Print("Cannot find transform " + transformName);
return;
}
GameObject model = GameDatabase.Instance.GetModel(modelName);
if (model == null)
{
print("Cannot find model " + modelName);
Print("Cannot find model " + modelName);
return;
}
model.SetActive(true);
KSPParticleEmitter templateKspParticleEmitter = model.GetComponentInChildren<KSPParticleEmitter>();

if (templateKspParticleEmitter == null)
{
print("Cannot find particle emitter on " + modelName);
Print("Cannot find particle emitter on " + modelName);
UnityEngine.Object.Destroy(model);
return;
}
Expand Down Expand Up @@ -495,7 +515,7 @@ public override void OnInitialize()
}
catch (ArgumentException)
{
print("ModelMultiParticleFXExt: " + renderMode + " is not a valid ParticleRenderMode");
Print("ModelMultiParticleFXExt: " + renderMode + " is not a valid ParticleRenderMode");
}

persistentEmitters.Add(pkpe);
Expand Down Expand Up @@ -528,7 +548,7 @@ public void Restore()

public override void OnLoad(ConfigNode node)
{
//print("OnLoad");
//Print("OnLoad");
Backup(node);

emission = new MultiInputCurve("emission");
Expand Down Expand Up @@ -561,6 +581,7 @@ public override void OnLoad(ConfigNode node)

public override void OnSave(ConfigNode node)
{
//Print("OnSave");
ConfigNode.CreateConfigFromObject(this, node);
emission.Save(node);
energy.Save(node);
Expand All @@ -577,9 +598,9 @@ public override void OnSave(ConfigNode node)
distance.Save(node);
}

private static void print(String s)
private static void Print(String s)
{
MonoBehaviour.print("[ModelMultiParticlePersistFX] " + s);
MonoBehaviour.print("[SmokeScreen ModelMultiParticlePersistFX] " + s);
}

// TODO : move the whole UI stuff to a dedicated class - this is getting way to big
Expand Down
2 changes: 1 addition & 1 deletion MultiInputCurve.cs
Expand Up @@ -225,6 +225,6 @@ public void Save(ConfigNode node)

private static void print(String s)
{
MonoBehaviour.print("[MultiInputCurve] " + s);
MonoBehaviour.print("[SmokeScreen MultiInputCurve] " + s);
}
}
67 changes: 34 additions & 33 deletions PersistentEmitterManager.cs
Expand Up @@ -16,13 +16,13 @@
[KSPAddon(KSPAddon.Startup.EveryScene, false)]
internal class PersistentEmitterManager : MonoBehaviour
{
public static PersistentEmitterManager Instance { get; private set; }
//public static PersistentEmitterManager Instance { get; private set; }

private static List<PersistentKSPParticleEmitter> persistentEmitters;
public static List<PersistentKSPParticleEmitter> persistentEmitters;

private void Awake()
{
PersistentEmitterManager.Instance = this;
//PersistentEmitterManager.Instance = this;

persistentEmitters = new List<PersistentKSPParticleEmitter>();

Expand All @@ -31,21 +31,33 @@ private void Awake()

private void OnDestroy()
{
//Print("OnDestroy");
GameEvents.onGameSceneLoadRequested.Remove(new EventData<GameScenes>.OnEvent(this.OnSceneChange));
}

public static void Add(PersistentKSPParticleEmitter pkpe)
{
persistentEmitters.Add(pkpe);
EffectBehaviour.AddParticleEmitter(pkpe.pe);
//print("[SmokeScreen PersistentEmitterManager]: Added 1 PersistentKSPParticleEmitter. Count = " + persistentEmitters.Count);
}

public static void Remove(PersistentKSPParticleEmitter pkpe)
{
EffectBehaviour.RemoveParticleEmitter(pkpe.pe);
persistentEmitters.Remove(pkpe);
//print("[SmokeScreen PersistentEmitterManager]: Removed 1 PersistentKSPParticleEmitter. Count = " + persistentEmitters.Count);
}

private void OnSceneChange(GameScenes scene)
{
//Print("OnSceneChange");
for (int i = 0; i < persistentEmitters.Count; i++)
{
EffectBehaviour.RemoveParticleEmitter(persistentEmitters[i].pe);
if (persistentEmitters[i].go.transform.parent == null)
//Print(" go is " + persistentEmitters[i].go);
//Destroy(persistentEmitters[i].go);
if (persistentEmitters[i].go != null)
{
Destroy(persistentEmitters[i].go);
}
Expand All @@ -62,44 +74,33 @@ public void FixedUpdate()
{
persistentEmittersCopy[i].EmissionStop();
}

// If the gameObject is null ( when ? I forgot ... )
// or the tranform parent is null ( Emitter detached from part so the particle are not removed instantly )
// then the emitter won't be updated by the effect FixedUpdate Call. So update it here

// If the gameObject is null clean up the emitter
if (persistentEmittersCopy[i].go == null)
{
Transform pecTransform = null;

try
{
pecTransform = persistentEmittersCopy[i].go.transform;
}
catch (NullReferenceException)
{
// Destroy the gameobject so avoid exception handling in the future?
continue;
}

if (persistentEmittersCopy[i].go.transform.parent == null)
{
persistentEmittersCopy[i].EmitterOnUpdate(Vector3.zero);
//Print("FixedUpdate cleanning null go");
Remove(persistentEmittersCopy[i]);
// Make sure
Destroy(persistentEmittersCopy[i].go);
}
// if not and the tranform parent is null ( Emitter detached from part so the particle are not removed instantly )
// then the emitter won't be updated by the effect FixedUpdate Call. So update it here
else if (persistentEmittersCopy[i].go.transform.parent == null)
{
persistentEmittersCopy[i].EmitterOnUpdate(Vector3.zero);

if (persistentEmittersCopy[i].pe.pe.particles.Count() == 0)
{
EffectBehaviour.RemoveParticleEmitter(persistentEmittersCopy[i].pe);
persistentEmitters.Remove(persistentEmittersCopy[i]);
if (persistentEmittersCopy[i].go != null)
{
Destroy(persistentEmittersCopy[i].go);
}
}
if (persistentEmittersCopy[i].pe.pe.particles.Count() == 0)
{
//Print("FixedUpdate cleanning parent go");
Remove(persistentEmittersCopy[i]);
Destroy(persistentEmittersCopy[i].go);
}
}
}
}

private void Print(string s)
{
MonoBehaviour.print(this.GetType().Name + " : " + s);
MonoBehaviour.print("[SmokeScreen " + this.GetType().Name + "] : " + s);
}
}
3 changes: 2 additions & 1 deletion PersistentKSPParticleEmitter.cs
Expand Up @@ -139,6 +139,7 @@ public class PersistentKSPParticleEmitter
// Detach the emitter from its parent gameobject and stop its emmission in timer seconds
public void Detach(float timer)
{
//Print("Detach");
this.endTime = Time.fixedTime + timer;
if (this.go != null && this.go.transform.parent != null)
{
Expand Down Expand Up @@ -376,6 +377,6 @@ private Vector3 ParticleCollision(Vector3d pPos, Vector3d pVel, RaycastHit hit,

private void Print(string s)
{
MonoBehaviour.print(this.GetType().Name + " : " + s);
MonoBehaviour.print("[SmokeScreen " + this.GetType().Name + "] : " + s);
}
}
2 changes: 1 addition & 1 deletion SmokeScreenUtil.cs
Expand Up @@ -296,7 +296,7 @@ public static bool AddLaunchPadColliders(RaycastHit hit)

private static void print(String s)
{
MonoBehaviour.print("[SmokeScreenUtil] " + s);
MonoBehaviour.print("[SmokeScreen SmokeScreenUtil] " + s);
}
}
}

0 comments on commit ca83787

Please sign in to comment.