Plasma v2

by bradsedito
...a work in progress.
♥0 | Line 63 | Modified 2012-09-10 03:00:11 | MIT License
play

ActionScript3 source code

/**
 * Copyright bradsedito ( http://wonderfl.net/user/bradsedito )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/nJy2
 */






package 
{
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.utils.ByteArray;    
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    public class Plasma extends Sprite 
    {
        private var w:Number       =  400 
        private var h:Number       =  200
        private var time:Number    =  0
        private var a:Number       =  1
        private var b:Number       =  2
        private var c:Number       =  1
        private var d:Number       =  1
        private var e:Number       =  1
        private var sin:Array      =  new Array( 512 )
        private var img:ByteArray  =  new ByteArray()
        private var bd
        //private var data           =   new 4);    // array of Bytes
        //private var buff           =   new Uint8Array (data );    // two "views" on the same array
        

        public function Plasma() 
        {
            stage.frameRate = 60;
            for (var i=0; i<512; i++) sin[i] = Math.floor(Math.sin(2*Math.PI/512*i) * 127 + 127);            
            
            // write as3 code here..
            bd = new BitmapData(w, h, true, 0x00000000);

            var bm = new Bitmap(bd);
            bm.scaleX = stage.stageWidth/w;
            bm.scaleY = stage.stageHeight/h;
            stage.addChild(bm);

            stage.addEventListener(Event.ENTER_FRAME, onEF);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, onMD); 
        }
        
        private function onEF(ev)
        {
            visualize();
            bd.setPixels(bd.rect, img);
            time++;
        }
        
        private function visualize()
        {
            img.position = 0;
            var hh = h*0.5 +10*d-400;
            var hw = w*0.5 +10*e-400;
            var fr = time<<2, i3 = 1/3;
            var am = a-1, bm = b-1, es = e<<2;
            for(var i=0; i<h; i++)    // rows
                for(var j=0; j<w; j++)    // columns
                {
                    var di = Math.floor( Math.sqrt((hh-i)*(hh-i) + (hw-j)*(hw-j)) );
                    var hi = (sin[(j*b+fr)&511]+sin[(di*a+fr*b)&511]+sin[359-(i*a+j*b+fr)&511])*i3;
                    
                    var re = sin[((hi << am)+d)  & 511];
                    var gr = sin[((hi << bm)+es) & 511];
                    var bl = sin[ (hi << bm)     & 511];
                    var col:uint = (255<<24 | bl<<16 | gr<<8 | re);
                    img.writeUnsignedInt(col);
                }
            img.position = 0;
        }
        
        private function onMD(ev) { a = rand(4); b = rand(4); c = rand(8); d = rand(180); e = rand(180); }
        private function rand(n)  { return 1+Math.floor(Math.random()*n); }
    }
}