private void Init(ParticleSystemSettings Settings, ContentManager Content, GraphicsDevice GraphicsDevice)
        {
            this.Settings = Settings;
            UseAlphaBlend = false;

            // Allocate the particle array, and fill in the corner fields (which never change).
            ArrayParticles = new ParticleVertex[Settings.MaxParticles * 4];
            for (int i = 0; i < Settings.MaxParticles; i++)
            {
                ArrayParticles[i * 4 + 0].UV = new Vector2(0, 0);
                ArrayParticles[i * 4 + 1].UV = new Vector2(1, 0);
                ArrayParticles[i * 4 + 2].UV = new Vector2(1, 1);
                ArrayParticles[i * 4 + 3].UV = new Vector2(0, 1);
            }
            Effect effect = Content.Load <Effect>("Shaders/Particle shader 3D");

            // If we have several particle systems, the content manager will return
            // a single shared effect instance to them all. But we want to preconfigure
            // the effect with parameters that are specific to this particular
            // particle system. By cloning the effect, we prevent one particle system
            // from stomping over the parameter settings of another.
            ParticleEffect = effect.Clone();
            Parameters     = ParticleEffect.Parameters;
            // Look up shortcuts for parameters that change every frame.
            EffectViewParameter          = Parameters["View"];
            EffectProjectionParameter    = Parameters["Projection"];
            EffectViewportScaleParameter = Parameters["ViewportScale"];
            EffectTimeParameter          = Parameters["CurrentTime"];
            // Set the values of parameters that do not change.
            Parameters["NumberOfImages"].SetValue(Settings.NumberOfImages);
            Parameters["RotateTowardCamera"].SetValue(Settings.RotateTowardCamera ? 1f : 0);
            // Load the particle texture, and set it onto the effect.
            Texture2D sprBackground = Content.Load <Texture2D>(Settings.TextureName);

            this.ParticleSize = new Vector2((sprBackground.Width / Settings.NumberOfImages) * 0.5f, sprBackground.Height * 0.5f);
            Parameters["Size"].SetValue(ParticleSize);
            Parameters["t0"].SetValue(sprBackground);

            // Create a dynamic vertex buffer.
            VertexBuffer = new DynamicVertexBuffer(GraphicsDevice, ParticleVertex.VertexDeclaration,
                                                   Settings.MaxParticles * 4, BufferUsage.WriteOnly);
            // Create and populate the index buffer.
            ushort[] ArrayIndex = new ushort[Settings.MaxParticles * 6];
            for (int i = 0; i < Settings.MaxParticles; i++)
            {
                ArrayIndex[i * 6 + 0] = (ushort)(i * 4 + 0);
                ArrayIndex[i * 6 + 1] = (ushort)(i * 4 + 1);
                ArrayIndex[i * 6 + 2] = (ushort)(i * 4 + 2);
                ArrayIndex[i * 6 + 3] = (ushort)(i * 4 + 0);
                ArrayIndex[i * 6 + 4] = (ushort)(i * 4 + 2);
                ArrayIndex[i * 6 + 5] = (ushort)(i * 4 + 3);
            }

            IndexBuffer = new IndexBuffer(GraphicsDevice, typeof(ushort), ArrayIndex.Length, BufferUsage.WriteOnly);
            IndexBuffer.SetData(ArrayIndex);
        }
        public ParticleSystem(string TextureName, int MaxParticles, int NumberOfImages, BlendState BlendState, bool RotateTowardCamera, ContentManager Content, GraphicsDevice GraphicsDevice)
        {
            ParticleSystemSettings NewParticleSystemSettings = new ParticleSystemSettings(TextureName, MaxParticles, NumberOfImages, BlendState, RotateTowardCamera);

            Init(NewParticleSystemSettings, Content, GraphicsDevice);
        }