Pick Color

by Thy
color picking + particle flow
♥2 | Line 188 | Modified 2010-09-02 01:22:46 | MIT License
play

ActionScript3 source code

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

// color picking + particle flow
// forked from Hasufel's Perlin Particles (http://wonderfl.net/c/33ea)
package {
    import flash.filters.BlurFilter;
    import flash.geom.Rectangle;
    import flash.geom.Point;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.geom.ColorTransform;
    import flash.display.Sprite;
    public class FlashTest extends Sprite 
    {
        private const // setup
        p_num:int = 10000,
        p_width:Number = 128,
        p_height:Number = 100;
        
        private var // system
        mouse_down:Boolean,
        color:uint, R:uint, G:uint, B:uint,
        R2:uint, G2:uint, B2:uint;
        
        private var // temp
        i:int, j:int, c:uint,
        p:Part, vx:Number, vy:Number,
        r:Rectangle = new Rectangle(0,0,1,20);
        
        private var // particles
        p_list:Vector.<Part> = new Vector.<Part>(p_num, true);
        
        private var // force
        force_data:BitmapData = 
        new BitmapData(p_width, p_height, false, 0x0),
        oct:uint = 4, angle:Number = 0,
        freqs:Vector.<Number> = new Vector.<Number>(oct*2, true),
        phases:Vector.<Number> = new Vector.<Number>(oct*2, true),
        offsets:Array = new Array(oct, true);
        
        private var // bitmap
        data:BitmapData = new BitmapData(p_width,p_height,true, 0xFFFFFF),
        bitmap:Bitmap = new Bitmap(data, "auto", true);
        
        private var // effect
        rect:Rectangle = new Rectangle(0,0,p_width, p_height),
        point:Point = new Point(),
        col:ColorTransform = new ColorTransform(1,1,1, .8),
        blur:BlurFilter = new BlurFilter(2,2,1);
        
        private var // color Channel Bitmaps
        RGB_data:BitmapData = new BitmapData(128, 3*20, false, 0x0),
        RGB_bitmap:Bitmap = new Bitmap(RGB_data, "auto", true);
        
        
        public function FlashTest() 
        {
            
            // bitmap Child
            stage.addChild(bitmap);
            stage.addChild(RGB_bitmap);
            // positions
            bitmap.x = (465 - p_width)*.5;
            bitmap.y = (465 - p_height)*.5;
            RGB_bitmap.x = bitmap.x;
            RGB_bitmap.y = bitmap.y - RGB_bitmap.height - 1;
            
            // listeners
            stage.addEventListener(MouseEvent.MOUSE_DOWN,
            function():void {mouse_down = true;});
            stage.addEventListener(MouseEvent.MOUSE_UP, 
            function():void {mouse_down = false;});
            stage.addEventListener(Event.ENTER_FRAME, ef);
            
            
            // create first particle, who'll be *ignored*
            p = new Part(); //   in the rendering process
            p_list[0] = p;
            
            // create particles
            i = 0;
            while(++i < p_num)
            {
                p = new Part();
                p.x = p_width * Math.random();
                p.y = p_height * Math.random();
                p_list[i] = p;
                p_list[i-1].next = p;
            }
            
            // create offsets
            i = -1;
            while(++i < oct)
            {
                offsets[i] = new Point();
                freqs[i*2] = 5 * Math.random()+1;
                freqs[i*2+1] = 6 * Math.random()+1;
                phases[i*2] = 2 * Math.random() * Math.PI;
                phases[i*2+i] = 2 * Math.random() * Math.PI;
            }


            
        }
        
        private function ef(e:Event):void
        {
            // color
            colors();

            // particles
            particles();        
        }
        
        private function colors():void
        {
            // update color values
            var X:Number, Y:Number;
            if(mouse_down)
            {
                X = mouseX - RGB_bitmap.x
                if(X < 0) X = 0;
                if(X > 128) X = 128;
                X *= 2;
                if (mouseY > RGB_bitmap.y && 
                mouseY < RGB_bitmap.y + RGB_bitmap.height)
                {
                    Y = mouseY - RGB_bitmap.y;
                    if(Y < 20)
                    {
                        R2 = X
                    } else if (Y < 40)
                    {
                        G2 = X
                    } else
                    {
                        B2 = X
                    }
                }
            }
            
            // color easying
            R += (R2-R)*.1;
            G += (G2-G)*.1;
            B += (B2-B)*.1;
            
            // red
            r.y = 0;
            i = -1;
            while(++i < 128)
            {
                  r.x = i;
                  RGB_data.fillRect(r, (i*2)<<16 | G<<8 | B);
            }
            // green
            r.y = 20;
            i = -1;
            while(++i < 128)
            {
                  r.x = i;
                  RGB_data.fillRect(r, R<<16 | (i*2)<<8 | B);
            }
            // blue
            r.y = 40;
            i = -1;
            while(++i < 128)
            {
                  r.x = i;
                  RGB_data.fillRect(r, R<<16 | G<<8 | i*2);
            }
            
            // color
            color = R<<16 | G<<8 | B;
            
            // slides
            r.y = 0;
            r.x = Math.round(R*.5);
            RGB_data.fillRect(r, uint(0xFFFFFF - color))
            r.y = 20;
            r.x = Math.round(G*.5);
            RGB_data.fillRect(r, uint(0xFFFFFF - color))
            r.y = 40;
            r.x = Math.round(B*.5);
            RGB_data.fillRect(r, uint(0xFFFFFF - color))
            
            // color 32 bits
            color = 0xFF<<24 | color
            
            
        }

        
        private function particles():void
        {
            // offsets update
            angle += .0001;
            i = -1;
            while(++i < oct)
            {
                
                offsets[i].x = p_width*Math.cos
                (freqs[int(i*2)]*angle + phases[int(i*2)]);
                offsets[i].y = p_height*Math.sin
                (freqs[int(i*2+1)]*angle + phases[int(i*2+1)]);
                
            }

            
            // perlin noise
            force_data.perlinNoise(p_width, p_height, oct, 3, 
            false, false, 1 | 4, false, offsets);
            
            // particles
            data.lock();
            data.colorTransform(rect, col);
            data.applyFilter(data, rect, point, blur);
            p = p_list[0]; // nvm the fisrt particle
            while(p = p.next)
            {
                if(p.x < 0 || p.x > p_width || 
                p.y < 0 || p.y > p_height)
                {
                    p.x = Math.random() * p_width;
                    p.y = Math.random() * p_height;
                    p.vx = p.vy = 0;
                }

                c = force_data.getPixel(p.x,p.y);
                vx = 128 - (c & 0xFF);
                vy = 128 - (c >> 16);
                
                data.setPixel32(p.x += (p.vx += vx*.005), 
                p.y += (p.vy += vy*.005), color);
                
                p.vx *= .9;
                p.vy *= .9;
            }
            data.unlock();
        }

    
    
    }

}


class Part
{
    public var
    x:Number = 0, y:Number = 0, vx:Number = 0, vy:Number = 0,
    next:Part = null;    
    
    
}