public ReentryEffect GetEffect() { GameObject effect = (GameObject)GameObject.Instantiate(Resources.Load("Effects/fx_reentryTrail")); ParticleSystem[] particleSystems = effect.GetComponentsInChildren <ParticleSystem>(); ReentryEffect reentryFx = new ReentryEffect(particleSystems[0], particleSystems[1]); reentryFx.Trail.playbackSpeed = 5; reentryFx.Sparks.playbackSpeed = 5; return(reentryFx); }
public void OnVesselDestroy(Vessel vessel) { if (VesselDict.ContainsKey(vessel.id)) { ReentryEffect effects = VesselDict[vessel.id]; if (effects != null) { effects.Die(); } VesselDict.Remove(vessel.id); } }
public void OnVesselDestroy(Vessel vessel) { if (VesselDict.ContainsKey(vessel.id)) { ReentryEffect effects = VesselDict[vessel.id]; if (effects != null) { Destroy(effects.Trail); Destroy(effects.Sparks); } VesselDict.Remove(vessel.id); } }
public ReentryEffect CreateEffect() { GameObject effect = (GameObject)GameObject.Instantiate(Resources.Load("Effects/fx_reentryTrail")); ReentryEffect reentryFx = new ReentryEffect(effect); // Set the effect speed high to animate as fast as is visible. var trailMain = reentryFx.Trail.main; reentryFx.Trail.transform.localScale = new Vector3(TrailScale, TrailScale, TrailScale); trailMain.scalingMode = ParticleSystemScalingMode.Local; trailMain.simulationSpeed = 5; var sparksMain = reentryFx.Sparks.main; sparksMain.simulationSpeed = 5; return(reentryFx); }
private void FixedUpdate() { float effectStrength = (AeroFX.FxScalar * AeroFX.state - EffectThreshold) * (1 / EffectThreshold); List <Vessel> vessels = FlightGlobals.Vessels; for (int i = vessels.Count - 1; i >= 0; --i) { Vessel vessel = vessels[i]; ReentryEffect effects = null; if (VesselDict.ContainsKey(vessel.id)) { effects = VesselDict[vessel.id]; } else { if (vessel.loaded) { effects = GetEffect(); VesselDict.Add(vessel.id, effects); } else { continue; } } if (!vessel.loaded) { if (effects != null) { Destroy(effects.Sparks); Destroy(effects.Trail); } effects = null; continue; } if (effects == null || effects.Trail == null || effects.Sparks == null) { continue; } if (AeroFX != null) { // FxScalar: Strength of the effects. // state: 0 = condensation, 1 = reentry. if (effectStrength > 0) { // Ensure the particles don't lag a frame behind. effects.Trail.transform.position = vessel.CoM + vessel.rb_velocity * Time.fixedDeltaTime; effects.Trail.enableEmission = true; effects.Sparks.transform.position = vessel.CoM + vessel.rb_velocity * Time.fixedDeltaTime; effects.Sparks.enableEmission = true; velocity = AeroFX.velocity * (float)AeroFX.airSpeed; effects.Trail.startSpeed = velocity.magnitude; effects.Trail.transform.forward = -velocity.normalized; effects.Trail.maxParticles = (int)(MaxParticles * effectStrength); effects.Trail.emissionRate = (int)(MaxEmissionRate * effectStrength); // startSpeed controls the emission cone angle. Greater than ~1 is too wide. //reentryTrailSparks.startSpeed = velocity.magnitude; effects.Sparks.transform.forward = -velocity.normalized; effects.Sparks.maxParticles = (int)(MaxParticles * effectStrength); effects.Sparks.emissionRate = (int)(MaxEmissionRate * effectStrength); } else { effects.Trail.enableEmission = false; effects.Sparks.enableEmission = false; } } else { effects.Trail.enableEmission = false; effects.Sparks.enableEmission = false; } } }
private void FixedUpdate() { float effectStrength = (AeroFX.FxScalar * AeroFX.state - EffectThreshold) * (1 / EffectThreshold); List <Vessel> vessels = FlightGlobals.Vessels; for (int i = vessels.Count - 1; i >= 0; --i) { Vessel vessel = vessels[i]; ReentryEffect effects = null; if (VesselDict.ContainsKey(vessel.id)) { effects = VesselDict[vessel.id]; } else { if (vessel.loaded) { effects = CreateEffect(); VesselDict.Add(vessel.id, effects); } else { continue; } } if (!vessel.loaded) { if (effects != null) { effects.Die(); } effects = null; continue; } if (effects == null || effects.Trail == null || effects.Sparks == null) { continue; } ParticleSystem.EmissionModule trailEmission = effects.Trail.emission; ParticleSystem.EmissionModule sparksEmission = effects.Sparks.emission; if (AeroFX != null) { //effects.Trail.transform.localScale = new Vector3(TrailScale, TrailScale, TrailScale); #if DEBUG afx1 = AeroFX; effects.Trail.transform.localScale = new Vector3(scaleX, scaleY, scaleZ); var main = effects.Trail.main; main.scalingMode = _scalingMode; #endif // FxScalar: Strength of the effects. // state: 0 = condensation, 1 = reentry. if (effectStrength > 0) { // Ensure the particles don't lag a frame behind. effects.Trail.transform.position = vessel.CoM + vessel.rb_velocity * Time.fixedDeltaTime; trailEmission.enabled = true; effects.Sparks.transform.position = vessel.CoM + vessel.rb_velocity * Time.fixedDeltaTime; sparksEmission.enabled = true; velocity = AeroFX.velocity * (float)AeroFX.airSpeed; var trailMain = effects.Trail.main; trailMain.startSpeed = velocity.magnitude; effects.Trail.transform.forward = -velocity.normalized; trailMain.maxParticles = (int)(MaxParticles * effectStrength); trailEmission.rateOverTime = (int)(MaxEmissionRate * effectStrength); // startSpeed controls the emission cone angle. Greater than ~1 is too wide. //reentryTrailSparks.startSpeed = velocity.magnitude; var sparksMain = effects.Sparks.main; effects.Sparks.transform.forward = -velocity.normalized; sparksMain.maxParticles = (int)(MaxParticles * effectStrength); sparksEmission.rateOverTime = (int)(MaxEmissionRate * effectStrength); } else { trailEmission.enabled = false; sparksEmission.enabled = false; } } else { trailEmission.enabled = false; sparksEmission.enabled = false; } } }
public static void Gui(int windowID) { ReentryEffect effects = null; if (VesselDict.ContainsKey(FlightGlobals.ActiveVessel.id)) { effects = VesselDict[FlightGlobals.ActiveVessel.id]; } if (effects == null) { GUILayout.Label("ReentryFX is null"); return; } if (effects.Trail == null) { GUILayout.Label("Trail is null"); } if (effects.Sparks == null) { GUILayout.Label("Sparks is null"); } GuiUtils.label("Effect Strength", effectStrength); GuiUtils.label("Stock effect Strength", afx1.FxScalar * afx1.state); float highestTemp = GetVesselMaxSkinTemp(); Color blackBodyColor = BlackBodyToRgb(highestTemp); if (FlightGlobals.ActiveVessel != null && FlightGlobals.ActiveVessel.rootPart != null) { GuiUtils.label("Highest temp", highestTemp); GuiUtils.label("Blackbody colour", blackBodyColor); GuiUtils.label("temperature", FlightGlobals.ActiveVessel.rootPart.temperature); GuiUtils.label("skinTemperature", FlightGlobals.ActiveVessel.rootPart.skinTemperature); GuiUtils.label("skinUnexposedExternalTemp", FlightGlobals.ActiveVessel.rootPart.skinUnexposedExternalTemp); GuiUtils.label("tempExplodeChance", FlightGlobals.ActiveVessel.rootPart.tempExplodeChance); GuiUtils.label("MaxTemp", FlightGlobals.ActiveVessel.rootPart.maxTemp); GuiUtils.label("SkinMaxTemp", FlightGlobals.ActiveVessel.rootPart.skinMaxTemp); } GUILayout.Label("Max Particles"); MaxParticles = (int)GUILayout.HorizontalSlider(MaxParticles, 0, 10000); GUILayout.Label("Max Emission Rate"); MaxEmissionRate = (int)GUILayout.HorizontalSlider(MaxEmissionRate, 0, 1000); GUILayout.Label("Trail"); if (effects.Trail == null) { GUILayout.Label("Trail is null"); } else { var trailMain = effects.Trail.main; float trailPlaybackSpeed = trailMain.simulationSpeed; _trailPlaybackText = GuiUtils.editFloat("Playback speed", _trailPlaybackText, out trailPlaybackSpeed, 5); trailMain.simulationSpeed = trailPlaybackSpeed; //Color key0 = new Color(1f, 0.545f, 0.192f, 1f); //Color key1 = new Color(0.725f, 0.169f, 0f, 1f); Color key0 = effects.Trail.colorOverLifetime.color.gradient.colorKeys[0].color; Color key1 = effects.Trail.colorOverLifetime.color.gradient.colorKeys[1].color; /*Gradient grad = new Gradient(); * grad.SetKeys( * new GradientColorKey[] { new GradientColorKey(Color.blue, 0.0f), new GradientColorKey(Color.red, 1.0f) }, * new GradientAlphaKey[] { new GradientAlphaKey(1.0f, 0.0f), new GradientAlphaKey(0.0f, 1.0f) } * ); */ key0 = GuiUtils.rgbaSlider("Colour Gradient 0", ref key0.r, ref key0.g, ref key0.b, ref key0.a, 0f, 1f); key1 = GuiUtils.rgbaSlider("Colour Gradient 1", ref key1.r, ref key1.g, ref key1.b, ref key1.a, 0f, 1f); effects.Trail.colorOverLifetime.color.gradient.colorKeys[0].color = key0; effects.Trail.colorOverLifetime.color.gradient.colorKeys[1].color = key1; //Color cMax = trailMain.startColor.colorMax; //Color cMin = trailMain.startColor.colorMin; //cMax = GuiUtils.rgbaSlider("Max Colour", ref cMax.r, ref cMax.g, ref cMax.b, ref cMax.a, 0f, 1f); //cMin = GuiUtils.rgbaSlider("Min Colour", ref cMin.r, ref cMin.g, ref cMin.b, ref cMin.a, 0f, 1f); //trailMain.startColor = new ParticleSystem.MinMaxGradient(cMin, cMax); //trailMain.startColor = new ParticleSystem.MinMaxGradient(blackBodyColor, BlackBodyToRgb(highestTemp * 2)); } /* * GUILayout.Label("Sparks"); * if (effects.Sparks == null) * GUILayout.Label("Sparks is null"); * else * { * var sparksMain = effects.Sparks.main; * float sparksPlaybackSpeed = sparksMain.simulationSpeed; * _sparksPlaybackText = GuiUtils.editFloat("Playback speed", _sparksPlaybackText, out sparksPlaybackSpeed, 5); * sparksMain.simulationSpeed = sparksPlaybackSpeed; * }*/ scaleXText = GuiUtils.editFloat("X Scale", scaleXText, out scaleX, 1); scaleYText = GuiUtils.editFloat("Y Scale", scaleYText, out scaleY, 1); scaleZText = GuiUtils.editFloat("Z Scale", scaleZText, out scaleZ, 1); GUI.DragWindow(); }