summaryrefslogtreecommitdiff
path: root/Plugins/MonoGame.Extended/source/MonoGame.Extended.Particles/ParticleExtensions.cs
blob: 7566e8d016a9f2240ab512a5c6cd9c45f271672e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MonoGame.Extended.TextureAtlases;

namespace MonoGame.Extended.Particles
{
    public static class ParticleExtensions
    {
        public static void Draw(this SpriteBatch spriteBatch, ParticleEffect effect)
        {
            for (var i = 0; i < effect.Emitters.Count; i++)
                UnsafeDraw(spriteBatch, effect.Emitters[i]);
        }

        public static void Draw(this SpriteBatch spriteBatch, ParticleEmitter emitter)
        {
            UnsafeDraw(spriteBatch, emitter);
        }

        private static unsafe void UnsafeDraw(SpriteBatch spriteBatch, ParticleEmitter emitter)
        {
            if(emitter.TextureRegion == null)
                return;

            var textureRegion = emitter.TextureRegion;
            var origin = new Vector2(textureRegion.Width/2f, textureRegion.Height/2f);
            var iterator = emitter.Buffer.Iterator;

            while (iterator.HasNext)
            {
                var particle = iterator.Next();
                var color = particle->Color.ToRgb();

                if (spriteBatch.GraphicsDevice.BlendState == BlendState.AlphaBlend)
                    color *= particle->Opacity;
                else
                    color.A = (byte) (particle->Opacity*255);

                var position = new Vector2(particle->Position.X, particle->Position.Y);
                var scale = particle->Scale;
                var particleColor = new Color(color, particle->Opacity);
                var rotation = particle->Rotation;
                var layerDepth = particle->LayerDepth;

                spriteBatch.Draw(textureRegion, position, particleColor, rotation, origin, scale, SpriteEffects.None, layerDepth);
            }
        }
    }
}