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);
        }
示例#2
0
 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);
     }
 }
示例#4
0
        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;
                }
            }
        }
示例#6
0
        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;
                }
            }
        }
示例#7
0
        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();
        }