Example #1
0
        /// <summary>
        /// Sets the position of the particle.
        /// </summary>
        /// <param name="particle">Particle for which to set position.</param>
        /// <param name="position">Position to set.</param>
        public static void SetPosition(IParticle particle, Vector3 position)
        {
            IParticle3d p3d = (particle as IParticle3d);

            if (p3d != null)
            {
                p3d.Position = position;
            }
            else
            {
                IParticle2d p2d = (particle as IParticle2d);
                if (p2d != null)
                {
                    p2d.Position = position.Vector2;
                }
            }
        }
Example #2
0
        //---------------------------------------------------------------
        #endregion
        //---------------------------------------------------------------

        //---------------------------------------------------------------
        #region Methods
        //---------------------------------------------------------------
        /// <summary>
        /// Updates the particle system.
        /// </summary>
        /// <param name="deltaTime">The time since the last update.</param>
        public override void Update(float deltaTime)
        {
            base.Update(deltaTime);

            // update streams
            PositionStream2 posStream     = (PositionStream2)vertexUnit[typeof(PositionStream2)];
            ColorStream     colorStream   = (ColorStream)vertexUnit[typeof(ColorStream)];
            TextureStream   textureStream = (TextureStream)vertexUnit[typeof(TextureStream)];

            // Update all particles
            for (int i = 0; i < particles.Count; i++)
            {
                int         offset     = i * 4;
                IParticle   particle   = particles[i] as IParticle;
                IParticle2d particle2d = particles[i] as IParticle2d;
                if (particle2d != null)
                {
                    Vector2 position = particle2d.Position;
                    posStream[offset]     = position + new Vector2(-particle.Size.X, particle.Size.Y);
                    posStream[offset + 1] = position + new Vector2(particle.Size.X, particle.Size.Y);
                    posStream[offset + 2] = position + new Vector2(particle.Size.X, -particle.Size.Y);
                    posStream[offset + 3] = position + new Vector2(-particle.Size.X, -particle.Size.Y);
                }
                IParticleColor particleColor = particles[i] as IParticleColor;
                if (particleColor != null)
                {
                    colorStream[offset]     = particleColor.Color;
                    colorStream[offset + 1] = particleColor.Color;
                    colorStream[offset + 2] = particleColor.Color;
                    colorStream[offset + 3] = particleColor.Color;
                }
                IParticleIndex            particleIndex = particles[i] as IParticleIndex;
                System.Drawing.RectangleF tc;
                if (particleIndex == null || subTextures == null)
                {
                    tc = (Texture as ITexture2d).TextureCoordinates;
                }
                else
                {
                    tc = subTextures[(int)particleIndex.TextureIndex % subTextures.Length].TextureCoordinates;
                }
                textureStream[offset]     = new Vector2(tc.Left, tc.Top);
                textureStream[offset + 1] = new Vector2(tc.Right, tc.Top);
                textureStream[offset + 2] = new Vector2(tc.Right, tc.Bottom);
                textureStream[offset + 3] = new Vector2(tc.Left, tc.Bottom);
            }
            posStream.Upload();
            colorStream.Upload();
            textureStream.Upload();

            // Render all particles
            Device.Instance.VertexUnit  = vertexUnit;
            Device.Instance.IndexStream = indexStream;
            textures.Apply();
            int steps = Effect.Begin();

            for (int i = 0; i < steps; i++)
            {
                Effect.BeginPass(i);
                Effect.CommitChanges(); // Oct Update BUG!!!
                Device.Instance.DrawIndexed(vertexUnit.Position, 0, particles.Count * 4, indexStream.Position, particles.Count * 2);
                Effect.EndPass();
            }
            Effect.End();
        }