예제 #1
0
        /// <summary>
        /// Updates the field by interpolating between two sampled values over the particle's lifetime
        /// </summary>
        /// <param name="pool">Target <see cref="ParticlePool"/></param>
        private unsafe void UpdateDoubleSampler(ParticlePool pool)
        {
            var colorField = pool.GetField(ParticleFields.Color);
            var lifeField  = pool.GetField(ParticleFields.Life);
            var randField  = pool.GetField(ParticleFields.RandomSeed);

            SamplerMain.UpdateChanges();
            SamplerOptional.UpdateChanges();

            foreach (var particle in pool)
            {
                var life = 1f - (*((float *)particle[lifeField]));   // The Life field contains remaining life, so for sampling we take (1 - life)

                var randSeed = particle.Get(randField);
                var lerp     = randSeed.GetFloat(RandomOffset.Offset1A + SeedOffset);

                var colorMin = (Color4)SamplerMain.Evaluate(life);
                var colorMax = (Color4)SamplerOptional.Evaluate(life);
                var color    = Color4.Lerp(colorMin, colorMax, lerp);

                // Premultiply alpha
                color.R *= color.A;
                color.G *= color.A;
                color.B *= color.A;

                (*((Color4 *)particle[colorField])) = color;
            }
        }
예제 #2
0
        /// <inheritdoc />
        public override void PreUpdate()
        {
            base.PreUpdate();

            SamplerMain?.UpdateChanges();
            SamplerOptional?.UpdateChanges();
        }
예제 #3
0
        /// <summary>
        /// Updates the field by interpolating between two sampled values over the particle's lifetime
        /// </summary>
        /// <param name="pool">Target <see cref="ParticlePool"/></param>
        private unsafe void UpdateDoubleSampler(ParticlePool pool)
        {
            var sizeField = pool.GetField(ParticleFields.Size);
            var lifeField = pool.GetField(ParticleFields.Life);
            var randField = pool.GetField(ParticleFields.RandomSeed);

            SamplerMain.UpdateChanges();
            SamplerOptional.UpdateChanges();

            foreach (var particle in pool)
            {
                var life = 1f - (*((float *)particle[lifeField]));   // The Life field contains remaining life, so for sampling we take (1 - life)

                var randSeed = particle.Get(randField);
                var lerp     = randSeed.GetFloat(RandomOffset.Offset1A + SeedOffset);

                var size1 = SamplerMain.Evaluate(life);
                var size2 = SamplerOptional.Evaluate(life);

                (*((float *)particle[sizeField])) = WorldScale.X * (size1 + (size2 - size1) * lerp);
            }
        }