public void InitDefault()
        {
            ArraySize.SetValue(Vector3.One);
            ArrayModulo.SetValue(1);

            var colorAnim = new MyAnimatedPropertyVector4();

            colorAnim.AddKey(0, Vector4.One);
            colorAnim.AddKey(0.33f, Vector4.One);
            colorAnim.AddKey(0.66f, Vector4.One);
            colorAnim.AddKey(1, Vector4.One);
            Color.AddKey(0, colorAnim);

            var colorIntensityAnim = new MyAnimatedPropertyFloat();

            colorIntensityAnim.AddKey(0, 1.0f);
            colorIntensityAnim.AddKey(0.33f, 1.0f);
            colorIntensityAnim.AddKey(0.66f, 1.0f);
            colorIntensityAnim.AddKey(1, 1.0f);
            ColorIntensity.AddKey(0, colorIntensityAnim);

            Offset.SetValue(new Vector3(0, 0, 0));
            Direction.SetValue(new Vector3(0, 0, -1));

            var radiusAnim = new MyAnimatedPropertyFloat();

            radiusAnim.AddKey(0, 0.1f);
            radiusAnim.AddKey(0.33f, 0.1f);
            radiusAnim.AddKey(0.66f, 0.1f);
            radiusAnim.AddKey(1, 0.1f);
            Radius.AddKey(0, radiusAnim);

            Life.SetValue(1);

            StreakMultiplier.SetValue(4);
            AnimationFrameTime.SetValue(1);

            Enabled.SetValue(true);

            EmitterSize.AddKey(0, new Vector3(0.0f, 0.0f, 0.0f));
            EmitterSizeMin.AddKey(0, 0.0f);
            DirectionCone.AddKey(0, 0.0f);
            DirectionConeVar.AddKey(0, 0.0f);

            Velocity.AddKey(0, 1.0f);
            VelocityVar.AddKey(0, 0.0f);

            ParticlesPerSecond.AddKey(0, 1000.0f);
            Material.SetValue(MyTransparentMaterials.GetMaterial("WhiteBlock"));

            SoftParticleDistanceScale.SetValue(1);
            Bounciness.SetValue(0.5f);
            ColorVar.SetValue(0);
            HueVar.SetValue(0);

            OITWeightFactor.SetValue(1f);

            TargetCoverage.SetValue(1f);
        }
        public void Draw(List <VRageRender.MyBillboard> collectedBillboards)
        {
            VRage.Profiler.ProfilerShort.Begin("GPU_Draw");
            if (m_renderId == MyRenderProxy.RENDER_ID_UNASSIGNED)
            {
                m_renderId = MyRenderProxy.CreateGPUEmitter();
            }

            if (IsDirty)
            {
                ProfilerShort.Begin("GPU_FillDataComplete");
                m_emitter = new MyGPUEmitter();
                FillDataComplete(ref m_emitter);
                MyParticlesManager.GPUEmitters.Add(m_emitter);
                ProfilerShort.End();
                m_dirty = m_animDirty = m_positionDirty = false;
            }
            else if (m_animatedTimeValues || m_animDirty)
            {
                ProfilerShort.Begin("GPU_FillData");
                FillData(ref m_emitter);
                MyParticlesManager.GPUEmitters.Add(m_emitter);
                ProfilerShort.End();
                m_animDirty = false;
            }
            else if (IsPositionDirty)
            {
                ProfilerShort.Begin("GPU_FillPosition");
                var transform = new MyGPUEmitterTransformUpdate()
                {
                    GID                = m_renderId,
                    Transform          = CalculateWorldMatrix(),
                    Scale              = m_effect.GetEmitterScale(),
                    Gravity            = m_effect.Gravity * Gravity,
                    ParticlesPerSecond = GetParticlesPerSecond()
                };
                MyParticlesManager.GPUEmitterTransforms.Add(transform);
                ProfilerShort.End();

                m_positionDirty = false;
            }
            else if (ParticlesPerSecond.GetKeysCount() > 1)
            {
                ProfilerShort.Begin("GPU_FillLight");
                MyParticlesManager.GPUEmittersLight.Add(new MyGPUEmitterLight()
                {
                    GID = m_renderId,
                    ParticlesPerSecond = GetParticlesPerSecond()
                });
                ProfilerShort.End();
            }
            ProfilerShort.End();
        }
        private float GetParticlesPerSecond()
        {
            float particlesPerSecond;

            if ((Enabled.GetValue <bool>() || (m_show && m_effect.ShowOnlyThisGeneration >= 0)) && !m_effect.IsEmittingStopped)
            {
                ParticlesPerSecond.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out particlesPerSecond);
                particlesPerSecond *= m_effect.UserBirthMultiplier;
            }
            else
            {
                particlesPerSecond = 0;
            }

            return(particlesPerSecond);
        }
        public void DeserializeFromObjectBuilder(ParticleGeneration generation)
        {
            m_name = generation.Name;

            foreach (GenerationProperty property in generation.Properties)
            {
                for (int i = 0; i < m_properties.Length; i++)
                {
                    if (m_properties[i].Name.Equals(property.Name))
                    {
                        m_properties[i].DeserializeFromObjectBuilder(property);
                    }
                }
            }
            Debug.WriteLine("ParticlesPerSecond {0}, Velocity {1}",
                            ParticlesPerSecond.GetKeysCount(),
                            Velocity.GetKeysCount());
        }
Ejemplo n.º 5
0
        public void InitDefault()
        {
            ArraySize.SetValue(Vector3.One);
            ArrayModulo.SetValue(1);

            var colorAnim = new MyAnimatedPropertyVector4();

            colorAnim.AddKey(0, Vector4.One);
            colorAnim.AddKey(0.33f, Vector4.One);
            colorAnim.AddKey(0.66f, Vector4.One);
            colorAnim.AddKey(1, Vector4.One);
            Color.AddKey(0, colorAnim);

            Velocity.SetValue(new Vector3(0, 0, -1));

            var radiusAnim = new MyAnimatedPropertyFloat();

            radiusAnim.AddKey(0, 0.1f);
            radiusAnim.AddKey(0.33f, 0.1f);
            radiusAnim.AddKey(0.66f, 0.1f);
            radiusAnim.AddKey(1, 0.1f);
            Radius.AddKey(0, radiusAnim);

            Life.SetValue(1);

            StreakMultiplier.SetValue(4);
            AnimationFrameTime.SetValue(1);

            Enabled.SetValue(true);

            ParticlesPerSecond.SetValue(30000);
            Material.SetValue(MyTransparentMaterials.GetMaterial("WhiteBlock"));

            SoftParticleDistanceScale.SetValue(1);
            Bounciness.SetValue(0.5f);

            OITWeightFactor.SetValue(1f);
        }
Ejemplo n.º 6
0
        protected override XmlElement VCreateInheritedElement(XmlElement baseElement)
        {
            var textureElement = baseElement.OwnerDocument.CreateElement("Texture");

            textureElement.SetAttribute("resource", Texture);
            baseElement.AppendChild(textureElement);

            var velocityElement = baseElement.OwnerDocument.CreateElement("EmitterVelocity");

            velocityElement.SetAttribute("x", EmitterVelocity.X.ToString(CultureInfo.InvariantCulture));
            velocityElement.SetAttribute("y", EmitterVelocity.Y.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(velocityElement);

            var variationElement = baseElement.OwnerDocument.CreateElement("EmitterVariation");

            variationElement.SetAttribute("x", EmitterVariation.X.ToString(CultureInfo.InvariantCulture));
            variationElement.SetAttribute("y", EmitterVariation.Y.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(variationElement);

            var gravityElement = baseElement.OwnerDocument.CreateElement("Gravity");

            gravityElement.SetAttribute("x", Gravity.X.ToString(CultureInfo.InvariantCulture));
            gravityElement.SetAttribute("y", Gravity.Y.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(gravityElement);

            var particlesPerSecondElement = baseElement.OwnerDocument.CreateElement("ParticlesPerSecond");

            particlesPerSecondElement.SetAttribute("value", ParticlesPerSecond.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(particlesPerSecondElement);

            var particlesLifetimeElement = baseElement.OwnerDocument.CreateElement("ParticleLifetime");

            particlesLifetimeElement.SetAttribute("value", ParticleLifeTime.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(particlesLifetimeElement);

            var maxParticlesElement = baseElement.OwnerDocument.CreateElement("MaxParticles");

            maxParticlesElement.SetAttribute("value", MaxParticles.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(maxParticlesElement);

            XmlElement finalColorElement = baseElement.OwnerDocument.CreateElement("FinalColor");

            finalColorElement.SetAttribute("r", FinalColor.R.ToString(CultureInfo.InvariantCulture));
            finalColorElement.SetAttribute("g", FinalColor.G.ToString(CultureInfo.InvariantCulture));
            finalColorElement.SetAttribute("b", FinalColor.B.ToString(CultureInfo.InvariantCulture));
            finalColorElement.SetAttribute("a", FinalColor.A.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(finalColorElement);

            var colorEaseBiasElement = baseElement.OwnerDocument.CreateElement("ColorEaseBias");

            colorEaseBiasElement.SetAttribute("value", ColorChangePoint.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(colorEaseBiasElement);

            var initialScaleElement = baseElement.OwnerDocument.CreateElement("InitialParticleScale");

            initialScaleElement.SetAttribute("x", InitialScale.X.ToString(CultureInfo.InvariantCulture));
            initialScaleElement.SetAttribute("y", InitialScale.Y.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(initialScaleElement);

            var finalScaleElement = baseElement.OwnerDocument.CreateElement("FinalParticleScale");

            finalScaleElement.SetAttribute("x", FinalScale.X.ToString(CultureInfo.InvariantCulture));
            finalScaleElement.SetAttribute("y", FinalScale.Y.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(finalScaleElement);

            var scaleEaseBiasElement = baseElement.OwnerDocument.CreateElement("ScaleEaseBias");

            scaleEaseBiasElement.SetAttribute("value", ScaleChangePoint.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(scaleEaseBiasElement);

            var initialRotationElement = baseElement.OwnerDocument.CreateElement("InitialParticleRotation");

            initialRotationElement.SetAttribute("value", InitialRotation.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(initialRotationElement);

            var finalRotationElement = baseElement.OwnerDocument.CreateElement("FinalParticleRotation");

            finalRotationElement.SetAttribute("value", FinalRotation.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(finalRotationElement);

            var rotationEaseBiasElement = baseElement.OwnerDocument.CreateElement("RotationEaseBias");

            rotationEaseBiasElement.SetAttribute("value", RotationChangePoint.ToString(CultureInfo.InvariantCulture));
            baseElement.AppendChild(rotationEaseBiasElement);

            return(baseElement);
        }
        void FillData(ref MyGPUEmitter emitter)
        {
            float time;
            MyAnimatedPropertyVector4 color;
            MyAnimatedPropertyFloat   radius;
            MyAnimatedPropertyFloat   colorIntensity;

            Color.GetKey(0, out time, out color);
            Radius.GetKey(0, out time, out radius);
            ColorIntensity.GetKey(0, out time, out colorIntensity);

            emitter.GID = m_renderId;
            if (Enabled.GetValue <bool>() && !m_effect.IsEmittingStopped)
            {
                ParticlesPerSecond.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out emitter.ParticlesPerSecond);
                emitter.ParticlesPerSecond *= m_effect.UserBirthMultiplier;
            }
            else
            {
                emitter.ParticlesPerSecond = 0;
            }

            float intensity;

            color.GetKey(0, out time, out emitter.Data.Color0);
            color.GetKey(1, out emitter.Data.ColorKey1, out emitter.Data.Color1);
            color.GetKey(2, out emitter.Data.ColorKey2, out emitter.Data.Color2);
            color.GetKey(3, out time, out emitter.Data.Color3);

            // unmultiply colors and factor by intensity
            colorIntensity.GetInterpolatedValue <float>(0, out intensity);
            emitter.Data.Color0.X *= intensity;
            emitter.Data.Color0.Y *= intensity;
            emitter.Data.Color0.Z *= intensity;
            emitter.Data.Color0   *= m_effect.UserColorMultiplier;
            colorIntensity.GetInterpolatedValue <float>(emitter.Data.ColorKey1, out intensity);
            emitter.Data.Color1.X *= intensity;
            emitter.Data.Color1.Y *= intensity;
            emitter.Data.Color1.Z *= intensity;
            emitter.Data.Color1   *= m_effect.UserColorMultiplier;
            colorIntensity.GetInterpolatedValue <float>(emitter.Data.ColorKey2, out intensity);
            emitter.Data.Color2.X *= intensity;
            emitter.Data.Color2.Y *= intensity;
            emitter.Data.Color2.Z *= intensity;
            emitter.Data.Color2   *= m_effect.UserColorMultiplier;
            colorIntensity.GetInterpolatedValue <float>(1.0f, out intensity);
            emitter.Data.Color3.X *= intensity;
            emitter.Data.Color3.Y *= intensity;
            emitter.Data.Color3.Z *= intensity;
            emitter.Data.Color3   *= m_effect.UserColorMultiplier;

            emitter.Data.ColorVar = ColorVar;
            if (emitter.Data.ColorVar > 1.0f)
            {
                emitter.Data.ColorVar = 1.0f;
            }
            else if (emitter.Data.ColorVar < 0)
            {
                emitter.Data.ColorVar = 0;
            }
            emitter.Data.HueVar = HueVar;
            if (emitter.Data.HueVar > 1.0f)
            {
                emitter.Data.HueVar = 1.0f;
            }
            else if (emitter.Data.HueVar < 0)
            {
                emitter.Data.HueVar = 0;
            }

            emitter.Data.Bounciness = Bounciness;

            MatrixD mat = CalculateWorldMatrix();

            emitter.Data.RotationMatrix = mat;
            emitter.Data.Direction      = Direction;
            Velocity.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out emitter.Data.Velocity);
            VelocityVar.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out emitter.Data.VelocityVar);
            float cone;

            DirectionCone.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out cone);
            emitter.Data.DirectionCone = MathHelper.ToRadians(cone);
            DirectionConeVar.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out cone);
            emitter.Data.DirectionConeVar = MathHelper.ToRadians(cone);

            emitter.Data.NumParticlesToEmitThisFrame = 0;

            emitter.Data.ParticleLifeSpan = Life;

            radius.GetKey(0, out time, out emitter.Data.ParticleSize0);
            radius.GetKey(1, out emitter.Data.ParticleSizeKeys1, out emitter.Data.ParticleSize1);
            radius.GetKey(2, out emitter.Data.ParticleSizeKeys2, out emitter.Data.ParticleSize2);
            radius.GetKey(3, out time, out emitter.Data.ParticleSize3);
            emitter.Data.ParticleSize0 *= m_effect.UserRadiusMultiplier;
            emitter.Data.ParticleSize1 *= m_effect.UserRadiusMultiplier;
            emitter.Data.ParticleSize2 *= m_effect.UserRadiusMultiplier;
            emitter.Data.ParticleSize3 *= m_effect.UserRadiusMultiplier;

            EmitterSize.GetInterpolatedValue <Vector3>(m_effect.GetElapsedTime(), out emitter.Data.EmitterSize);
            EmitterSizeMin.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out emitter.Data.EmitterSizeMin);
            emitter.Data.RotationVelocity    = RotationVelocity;
            emitter.Data.RotationVelocityVar = RotationVelocityVar;

            emitter.Data.Acceleration     = Acceleration;
            emitter.Data.Gravity          = m_effect.Gravity * Gravity;
            emitter.Data.StreakMultiplier = StreakMultiplier;

            GPUEmitterFlags flags = 0;

            flags |= Streaks ? GPUEmitterFlags.Streaks : 0;
            flags |= Collide ? GPUEmitterFlags.Collide : 0;
            flags |= SleepState ? GPUEmitterFlags.SleepState : 0;
            flags |= Light ? GPUEmitterFlags.Light : 0;
            flags |= VolumetricLight ? GPUEmitterFlags.VolumetricLight : 0;
            flags |= m_effect.IsSimulationPaused ? GPUEmitterFlags.FreezeSimulate : 0;

            emitter.Data.Flags = flags;

            emitter.Data.SoftParticleDistanceScale = SoftParticleDistanceScale;
            emitter.Data.AnimationFrameTime        = AnimationFrameTime;
            emitter.Data.OITWeightFactor           = OITWeightFactor;

            emitter.Data.Scale = m_effect.GetEmitterScale();

            emitter.AtlasTexture     = (Material.GetValue <MyTransparentMaterial>()).Texture;
            emitter.AtlasDimension   = new Vector2I((int)ArraySize.GetValue <Vector3>().X, (int)ArraySize.GetValue <Vector3>().Y);
            emitter.AtlasFrameOffset = ArrayOffset;
            emitter.AtlasFrameModulo = ArrayModulo;
            emitter.WorldPosition    = mat.Translation;
        }