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
{
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);
}
}
}