/ Published in: Other
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
package swingpants.effect { /** * Magnifgying Glass * @author Jon Howard - www.swingpants.com * 26th Feb 2010 */ import flash.geom.Point; import flash.geom.Rectangle import flash.display.Shader; import flash.display.Sprite; import flash.events.Event; import flash.filters.ShaderFilter; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.display.BitmapData import flash.display.Bitmap public class MagnifyingGlass extends Sprite { private const ZERO_POINT:Point=new Point() private var loader:URLLoader; private var shader:Shader; private var sphereFilter:ShaderFilter; private var inited:Boolean=false private var refrac:Number=0.909 //Refraction - how much the 'light' is bent through the magnifying glass 0=Lots, 1=None private var radius:Number = 55 //Radius of Magnifying Glass private var source_pic:BitmapData private var canvas:BitmapData private var canvas_container:Bitmap private var mag_glass_posn:Point=new Point() /** * CONSTRUCTOR */ public function MagnifyingGlass(refraction:Number=0.5, radius:Number=100, mag_glass_posn:Point=null, source_pic:BitmapData=null) { trace("[MagnifyingGlass] - CONSTRUCTOR") this.refrac = refraction this.radius = radius canvas = new BitmapData(radius * 2, radius * 2, false, 0x0) //Make draw canvas same size as glass if (mag_glass_posn) this.mag_glass_posn = mag_glass_posn if (source_pic) this.source_pic = source_pic else { this.source_pic=new BitmapData(512,512)//If nothing passed then need a stand in } this.buttonMode = false this.mouseEnabled = false this.mouseChildren=false LoadedShader(); //Should really embed the shader } /** * LoadedShader - Load the PixelBender filter */ private function LoadedShader():void { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, loadCompleteHandler); loader.load(new URLRequest("pixelbender/spherize2.pbj")); } /** * Add pixelbdner filter to shader * @param event */ private function loadCompleteHandler(event:Event):void { shader = new Shader(loader.data); init() } /** * init - initialiser */ private function init():void { canvas_container = new Bitmap(canvas) addChild(canvas_container) //Init the canvas container canvas_container.x = -radius canvas_container.y = -radius sphereFilter = new ShaderFilter(shader); inited = true updateShader() } /** * UpdateShader() */ private function updateShader():void { //Copy the pixels underneath the magnifying glass canvas.copyPixels(source_pic, new Rectangle(mag_glass_posn.x-radius, mag_glass_posn.y-radius, radius * 2, radius * 2), ZERO_POINT) //Init the shader and apply as shaderFilter to canvas_container shader.data.refractionIndex.value = [refrac]; shader.data.radius.value = [radius]; shader.data.center.value = [radius, radius]; canvas_container.filters = [sphereFilter]; } /** * update - Need to run this every frame (or at least everytime an update is needed */ public function update():void { if(inited)updateShader() } /** * SETTER: sourcePicture * @param val The bitmapdata object to set as the source picture */ public function set sourcePicture(val:BitmapData):void { source_pic=val } /** * SETTER: magnifyingGlassPosition - Need to make sure that the class knows where to position the mag glass * @param val Point position of mag glass */ public function set magnifyingGlassPosition(val:Point):void { mag_glass_posn=val } /** * SETTER: refraction - Set the spherize refraction */ public function set refraction(val:Number):void { refrac=val } } }