public override void BeforeDraw(MousePoint p) { // in Initialize, it's too early to get UI values (!!??!!) t_skipper = new Utilities.Iterativ.Skipper(6); t_previousPoint = new MousePoint(p.X, p.Y); CreateParticles(p.X, p.Y); t_attractor = new Effects.Particles.Attractor(new Engine.Calc.Vector(p.X, p.Y), t_force, t_expression, t_intensity); }
private void ThreadedProcess() { t_workflow.AllowInvalidate = true; Engine.Effects.Particles.Attractor attr1 = new Particles.Attractor(new Engine.Calc.Vector(400, 600)); Engine.Effects.Particles.Attractor attr2 = new Particles.Attractor(new Engine.Calc.Vector(800, 600)); Engine.Effects.Particles.Attractor[] attrs = new Particles.Attractor[2]; attrs[0] = attr1; attrs[1] = attr2; Engine.Effects.Particles.ForceParticle[] fp = new Particles.ForceParticle[100]; for (int i = 0; i < fp.Length; i++) { double variance = Engine.Calc.Math.Rand.NextDouble() + 1; fp[i] = new Particles.ForceParticle(600, 300, 10f + (float)variance, -50f + (float)variance); } // move the particles simulating animation for (int i = 0; i < 5000; i++) { for (int j = 0; j < fp.Length; j++) { fp[j].Update(attrs); Engine.Color.Cell c = Engine.Application.UISelectedValues.SelectedColor; // draw a line between last position and current position List <MousePoint> points = LinearInterpolate(fp[j].PreviousPoint, new Point((int)Math.Round(fp[j].Position.X), (int)Math.Round(fp[j].Position.Y))); foreach (MousePoint p in points) { if (t_imageProcessed.IsOutOfBounds(p.X, p.Y)) { continue; } Engine.Color.Cell img = t_imageProcessed.GetPixel(p.X, p.Y, Surface.PixelRetrievalOptions.ReturnEdgePixel); t_imageProcessed.SetPixel(Engine.Calc.Color.FastAlphaBlend(c, img), p.X, p.Y, Surface.PixelSetOptions.Ignore); } } } base.PostProcess(); }