package { import flash.display.BitmapData; import flash.geom.ColorTransform; import flash.geom.Point; import flash.geom.Matrix; import flash.display.BlendMode; import flash.events.Event; import flash.filters.ColorMatrixFilter; import flash.filters.DisplacementMapFilter; public class SmokingPixels extends BitmapData { private var pixels:BitmapData; private var perlinData:BitmapData; private var displacer:DisplacementMapFilter; // for faster performance we donät create a perlinNoise // each render, but modify by a color rotation, // rgb values around the (0,0,0)-(1,1,1) -axis var c:Number = Math.cos( 10*Math.PI/180 ); var s:Number = Math.sin( 10*Math.PI/180 ); var f1:Number = (1.0 + 2.0* c )/3.0; var f2:Number = (1.0-c - s *Math.sqrt(3))/3.0; var f3:Number = (1.0-c + s *Math.sqrt(3))/3.0; var mat:Array = [ f1, f2, f3, 0, 0, f3, f1, f2, 0, 0, f2, f3, f1, 0, 0, 0, 0, 0, 1, 0]; var colorRotation:ColorMatrixFilter = new ColorMatrixFilter( mat ); private var counter:int =0; public function SmokingPixels(w:int, h:int, npixels:int =400) { super(w,h,true,0xFFFFFFFF); init(npixels); } public function init(npixels:int =400):void { pixels = new BitmapData(width,height,true, 0x000000); var i:int; var px:int; var py:int; // pixels: bitmap with by default 400 random dots for (i=0; i=width) { bx=0; } // draw pixels-bitmap to this // for overlapping it's done twice this.draw(pixels, new Matrix(1.0,0,0,1.0, bx,0.0), clickColor, BlendMode.LIGHTEN); this.draw(pixels, new Matrix(1.0,0,0,1.0, bx-width,0.0), clickColor, BlendMode.LIGHTEN); // animate perlinData if (++counter == 10) { counter =0; perlinData.applyFilter(perlinData, perlinData.rect, new Point(),colorRotation); } this.applyFilter(this, this.rect, new Point(), displacer); } } }