topical media & game development
#graphic-flex-image-effects-07-source-aether-effects-shaders-ShaderEffect.ax
#graphic-flex-image-effects-07-source-aether-effects-shaders-ShaderEffect.ax
[swf]
[flash]
flex
package aether.effects.shaders {
import aether.effects.ImageEffect;
import flash.display.BitmapData;
import flash.display.Shader;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.filters.ShaderFilter;
import flash.geom.Point;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;
import flash.utils.getDefinitionByName;
public class @ax-graphic-flex-image-effects-07-source-aether-effects-shaders-ShaderEffect extends ImageEffect implements IEventDispatcher {
public static var shaderFilePath:String = "/pixelBender/";
public static var shaderClassPath:String = "";
private var _filter:ShaderFilter;
private var _ready:Boolean;
private var _eventDispatcher:EventDispatcher;
protected var _shaderClass:String;
protected var _shaderFile:String;
override protected function init(blendMode:String=null, alpha:Number=1):void {
super.init(blendMode, alpha);
_eventDispatcher = new EventDispatcher();
try {
var shaderClass:Class = getDefinitionByName(shaderClassPath + "_" + _shaderClass) as Class;
createShader(ByteArray(new shaderClass()));
} catch (e:Error) {
loadShader(shaderFilePath + _shaderFile);
}
}
private function loadShader(pPath:String):void {
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, onShaderLoaded);
loader.load(new URLRequest(pPath));
}
private function createShader(data:ByteArray):void {
var shader:Shader = new Shader(data);
_filter = new ShaderFilter(shader);
_ready = true;
dispatchEvent(new Event(Event.COMPLETE));
}
protected function configureShader(data:Object):void {}
private function onShaderLoaded(event:Event):void {
var loader:URLLoader = event.target as URLLoader;
createShader(loader.data as ByteArray);
}
public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=true):void {
_eventDispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
}
public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void {
_eventDispatcher.removeEventListener(type, listener, useCapture);
}
public function dispatchEvent(event:Event):Boolean {
return _eventDispatcher.dispatchEvent(event);
}
public function willTrigger(type:String):Boolean {
return _eventDispatcher.willTrigger(type);
}
public function hasEventListener(type:String):Boolean {
return _eventDispatcher.hasEventListener(type);
}
override protected function applyEffect(bitmapData:BitmapData):void {
if (_ready) {
configureShader(_filter.shader.data);
bitmapData.applyFilter(bitmapData, bitmapData.rect, new Point(), _filter);
}
}
public function get ready():Boolean {
return _ready;
}
}
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.