//--------------------------------------------------------------- #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); Matrix4 m = Device.Instance.Transformations.View; Vector3 right = m.RightVector; Vector3 up = m.UpVector; // update streams PositionStream posStream = (PositionStream)vertexUnit[typeof(PositionStream)]; 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; IParticle3d particle3d = particles[i] as IParticle3d; if (particle3d != null) { Vector3 position = particle3d.Position; posStream[offset] = position - particle.Size.X * right + particle.Size.Y * up; posStream[offset + 1] = position + particle.Size.X * right + particle.Size.Y * up; posStream[offset + 2] = position + particle.Size.X * right - particle.Size.Y * up; posStream[offset + 3] = position - particle.Size.X * right - particle.Size.Y * up; } 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(); }
//--------------------------------------------------------------- #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) { UpdateAge(deltaTime); // delete dead particles FixedRoundBuffer buffer = particles as FixedRoundBuffer; while (buffer.Count > 0 && !(buffer[0] as IParticle).IsAlive) { buffer.RemoveFirst(); } UpdateParticles(deltaTime); EmitParticles(deltaTime); ITexture2d texture = Texture; if (particles.Count >= 2) { // update streams PositionStream posStream = (PositionStream)vertexUnit[typeof(PositionStream)]; 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 * 2; IParticle particle = particles[i] as IParticle; IParticle3d particle3d = particles[i] as IParticle3d; if (particle3d != null) { Vector3 position = particle3d.Position; posStream[offset] = position + particle.Size.X * (particle as IParticleOrientation).Orientation; posStream[offset + 1] = position - particle.Size.X * (particle as IParticleOrientation).Orientation; } IParticleColor particleColor = particles[i] as IParticleColor; if (particleColor != null) { colorStream[offset] = particleColor.Color; colorStream[offset + 1] = particleColor.Color; } float tx = texture.TextureCoordinates.Left + texture.TextureCoordinates.Width * particle.Age / particle.LifeTime; textureStream[offset] = new Vector2(tx, texture.TextureCoordinates.Top); textureStream[offset + 1] = new Vector2(tx, texture.TextureCoordinates.Bottom); } posStream.Upload(); colorStream.Upload(); textureStream.Upload(); } }
//--------------------------------------------------------------- #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(); }