package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.DisplayObject; import flash.display.Sprite; import flash.filters.DropShadowFilter; import flash.geom.Point; import flash.geom.Rectangle; import flash.sampler.NewObjectSample; public class Perlin extends Sprite { private var noise:BitmapData private var point:Point = new Point() private var box:Sprite private var offsetX:Number = 0 private var offsetY:Number = 0 private var rect:Rectangle = new Rectangle(0, 0, 320, 240) private var layers:Array = new Array(10) private var shadow:DropShadowFilter = new DropShadowFilter(0, 0, 0x00ff00, 1, 4, 4, 1, 3, false, true) private var interactive:Boolean = false public function Perlin() { stage.align = 'TL' stage.scaleMode = 'noScale' stage.addEventListener('enterFrame',onEnterFrame) stage.addEventListener('resize', onStageResize) stage.addEventListener('mouseDown',onMouseDown) stage.addEventListener('mouseMove', onMouseMove) stage.addEventListener('mouseLeave', onMouseLeave) noise = new BitmapData(rect.width, rect.height, true, 0x00000000) addChild(box = new Sprite()) for (var c:Number = 0; c < layers.length; c++ ) with (box.addChild(new Bitmap(layers[c] = new BitmapData(rect.width, rect.height, true, 0x00000000)))) { x = rect.width / -2 y = rect.height / -2 z = 80 / layers.length * c } onStageResize() onEnterFrame() } private function onMouseLeave(...e):void { interactive = false } private function onMouseMove(...e):void { interactive = true } private function onMouseDown(...e):void { for (var c:Number = 0; c < box.numChildren; c++ ) { var child:DisplayObject = box.getChildAt(c) child.filters = child.filters.length? [] : [shadow] } } private function onStageResize(...e):void { box.x = stage.stageWidth /2 box.y = stage.stageHeight /2 } private function onEnterFrame(...e):void { noise.perlinNoise(100, 100, 1, 1, true, true, 8, false, [ new Point(offsetX+=2, offsetY+=2)]) var xp:Number = interactive? ( 1 - stage.mouseX / stage.stageWidth) : .5 var yp:Number = interactive? ( 1 - stage.mouseY / stage.stageHeight) : .75 box.rotationY = 90 + xp * 180 box.rotationX = -90 + yp * 180 for (var c:Number = 0; c < layers.length; c++ ) { layers[c].fillRect(rect,0x00000000) layers[c].threshold ( noise, rect, point, '>', 0x55000000 + 0x55000000 / layers.length * c , 0xff000000 + (0xff / layers.length * c << 16), 0xff00ff00, false ) } } } }