/**
* 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;
}