package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.MovieClip;
    import flash.display.Shader;
    import flash.events.Event;
    import flash.filters.ShaderFilter;
    import flash.geom.ColorTransform;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.utils.ByteArray;
    
    [SWF(width="512", height="512", frameRate="30", backgroundColor="0x000000")]
    public class SmokePB extends MovieClip
    {
        // import flash.display.BitmapData;
        
        private var _buffer1 : BitmapData;
        private var _destBuffer : BitmapData;
        
        [Embed(source="smoke3.pbj", mimeType="application/octet-stream")]
        private var _fluidShader : Class;
        
        private var _shader : Shader;
        private var _filter : ShaderFilter;
        
        private var _origin : Point = new Point();
        private var _rect : Rectangle;
    
        private var _bitmap : Bitmap;
    
        public function SmokePB()
        {
            initBitmapData(256);
            initShader();
            addEventListener(Event.ENTER_FRAME, handleEnterFrame);
        }
        
        private function initShader() : void
        {
            _shader = new Shader(new _fluidShader() as ByteArray);
            _filter = new ShaderFilter(_shader);
            _shader.data.timeStep.value = [ 0.02 ];
            _shader.data.density.value = [ 0.01 ];
            _shader.data.viscosityV.value = [ 0.01 ];
            _shader.data.viscosityP.value = [ 0.1 ];
            _shader.data.force.value = [0.0, -1];
        }

        private function initBitmapData(size : int) : void
        {
            _buffer1 = new BitmapData(size, size, false, 0x7f7f00);
            _destBuffer = new BitmapData(size, size, false, 0x000000);
            _rect = new Rectangle(0, 0, size, size);
            _bitmap = new Bitmap(_destBuffer);
            _bitmap.scaleX = _bitmap.scaleY = 2;
            _bitmap.smoothing = true;
            addChild(_bitmap);
        }
    
        private function handleEnterFrame(event : Event) : void
        {
            var pix : int = _buffer1.getPixel(_bitmap.mouseX, _bitmap.mouseY);
            pix = (pix & 0xffff00) + 0xff;
            _buffer1.setPixel(_bitmap.mouseX, _bitmap.mouseY, pix);
            pix = _buffer1.getPixel(_bitmap.mouseX+1, _bitmap.mouseY);
            pix = (pix & 0xffff00) + 0xff;
            _buffer1.setPixel(_bitmap.mouseX+1, _bitmap.mouseY, pix);
            pix = _buffer1.getPixel(_bitmap.mouseX, _bitmap.mouseY+1);
            pix = (pix & 0xffff00) + 0xff;
            _buffer1.setPixel(_bitmap.mouseX, _bitmap.mouseY+1, pix);
            pix = _buffer1.getPixel(_bitmap.mouseX+1, _bitmap.mouseY+1);
            pix = (pix & 0xffff00) + 0xff;
            _buffer1.setPixel(_bitmap.mouseX+1, _bitmap.mouseY+1, pix);
            
            _buffer1.applyFilter(_buffer1, _rect, _origin, _filter);
            _destBuffer.copyChannel(_buffer1, _rect, _origin, BitmapDataChannel.BLUE, BitmapDataChannel.RED);
            _destBuffer.copyChannel(_buffer1, _rect, _origin, BitmapDataChannel.BLUE, BitmapDataChannel.GREEN);
            _destBuffer.copyChannel(_buffer1, _rect, _origin, BitmapDataChannel.BLUE, BitmapDataChannel.BLUE);
            
        }
    }
}