Tom Krcha's FlashRealtime

Hey amigo!
I am Tom Krcha, Gaming Evangelist at Adobe. These are my notes


Pixel Bender 2. – filter ve Flashi

November 26th, 2008

V minulém díle (http://tom.krcha.com/pixel-bender-1-uvod/) jsme si představili v kostce jazyk Pixel Bender. Vzhledem k tomu, že je již konečně ke stažení CS4 Trial a všichni si jej můžou vyzkoušet, přešel bych rovnou k věci, a sice aplikaci Pixel Bender filtrů ve Flashi 10.

Aplikace, kterou si dnes vytvoříme je zde.
pixel bender in flash

(MusĂ­te mĂ­t nainstalovanĂ˝ Flash Player 10)

1) Stáhněte si a nainstalujte Flash CS4 z www.adobe.com/cz/downloads/

2) Nachystejte si nějaký Pixel Bender filter (viz. inspirace v minulém díle)

IdeálnĂ­ však bude použít nÄ›jakĂ˝ pokroÄŤilejší filtr. Já jsem zvolil twirl.pbk – příklad, kterĂ˝ se nainstaluje s Pixel Benderem. 

- Otevřete twirl.pbk v Pixel Bender Toolkit

- File -> Export Kernel Filter For Flash Player … uloĹľte soubor *.pbj – pokud nastane problĂ©m pĹ™i exportu*, odstraňte nÄ›kterĂ© nepodporovanĂ© části nebo pouĹľijte mĹŻj vyexportovanĂ˝ twirl.pbj. 

* Flash Player Pixel Bender Runtime nepodporuje všechny moĹľnosti jazyka Pixel Bender (napĹ™. blok needed) – o tÄ›chto moĹľnostech si Ĺ™ekneme v dalším dĂ­lech. 

3) SpusĹĄte Flash CS4

- Vytvoříme si třídu PixelBenderLoader, která bude načítat filtry za běhu a aplikovat je na jakýkoliv DisplayObject = snad jakákoliv vizuální komponenta, MovieClip, Video, Fotka, Vektor apod.

- PixelBenderLoader je moje třída, kterou můžete používat, nicméně inovaci se meze nekladou a určitě si najdete vlastní cestu pro vaše konkrétní využití.

package
{
	import flash.display.*;
	import flash.events.*;
	import flash.filters.*;
	import flash.net.*;
	import flash.events.EventDispatcher;
 
	public class PixelBenderLoader extends EventDispatcher
	{		
		private var loader:URLLoader;
		private var shader:Shader;
		// ShaderFilter muzeme aplikovat pomoci parametru filters DisplayObjectu
		private var filter:ShaderFilter;
 
		public function PixelBenderLoader():void
		{
 
		}
	        // nacteni filtru
		public function loadFilter(filterURL:String):void{
			loader = new URLLoader();
			loader.dataFormat = URLLoaderDataFormat.BINARY;
 
			// odchytime jen udalost nacteni, doporucuju vsak odchytit pripadne errory
			loader.addEventListener(Event.COMPLETE, onComplete);
			loader.load(new URLRequest(filterURL));
		}
 
		// aplikuje filter pomoci transformacni objektu
		public function applyFilter(displayObject:DisplayObject,transformObject:Object){
			applyShaderWithTransformObject(shader,transformObject);
			filter = new ShaderFilter(shader);
			displayObject.filters = [filter];
		}
 
                // vrati filter pro pripadnou aplikaci volnejsim zpusobem
		public function getFilter(transformObject:Object):ShaderFilter{
			applyShaderWithTransformObject(shader,transformObject);
			filter = new ShaderFilter(shader);
			return filter;
		}
 
                // aplikuje transformacni objekt na shader pomoci cyklu
		protected function applyShaderWithTransformObject(shader:Shader,transformObject:Object):void{
			for(var i:String in transformObject){
				shader.data[i].value = [transformObject[i]];
			}
		}
 
		// po naÄŤtenĂ­ filteru
		protected function onComplete(e:Event):void
		{
			shader = new Shader(loader.data);
			dispatchEvent(e);
		}
	}
}

transformObject:Object – hodnoty parametrĹŻ, kterĂ© filter umožňuje mÄ›nit
napĹ™. tranformObject = {radius:150};

- Ve Flashi pak pouĹľijeme filter tĂ­mto zpĹŻsobem

NaÄŤtenĂ­ filtru:

var pbl:PixelBenderLoader = new PixelBenderLoader();
pbl.addEventListener(Event.COMPLETE,onComplete);
pbl.loadFilter("twirl.pbj");

Aplikace filtru – v tomto případÄ› budeme mÄ›nit radius:
(deformClip je klasickĂ˝ MovieClip v library, obsahuje fotku a dynamickĂ˝ text)

function applyRadius(radius:Number){
	// transformacni objekt, zmenime jen radius
	var transformObject:Object = new Object();
	transformObject.radius = radius;
 
	// zmen dynamicky text
	deformClip.txt.text = radius.toString();
 
	// aplikuj filtr
	pbl.applyFilter(deformClip,transformObject);
}

Změna parametru při pohybu myši:

// zmen radius pri pohybu mysi
function mouseMoveChange(event:MouseEvent):void{
	applyRadius(Math.abs(event.localX));
}

OdchycenĂ­ události naÄŤtenĂ­ filtru – v tuto chvĂ­li lze zaÄŤĂ­t filter používat:

function onComplete(e:Event):void{
	trace("filter load complete - aplikace");	
	applyRadius(100);
	stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveChange);
}

Demo soubory ke staĹľenĂ­ zde.

Facebook comments:

11 Comments »

  1. Zdravim.

    super clanok od ktoreho sa odrazilo vela ludi.

    Napada ma ci by sa do triedy nedal importovat uz nacitany filter. a nie ho vzdy nacitat. pricom by bola trieda univerzalna

    nieco taketo :
    pbl.loadEmbedFilter(“pixelate.pbj”);
    ostatne metody zachovali.

    alebo to napvno anstavit do tej triedy.

    sukusal som to dlho ale bez uspesne :(

    [Embed(source='Test_filter.pbj',mimeType='application/octet-stream')]
    private static const WaterKernel: Class;

    Comment by TS — March 7, 2009 @ 2:09 am

  2. Diky.

    Tu druhou variantu bych musel vyzkouset. V tuto chvili si nejsem jisty zdali to tak jde. Nicmene cilem je udelat z *.pbj instanci ShaderFilter

    Comment by tom — March 8, 2009 @ 11:23 pm

  3. Cavko, paradny clanok, ale neviem ako docielti pomocou tvojej tredy aby som nastavil dva a viac parametrov, danemu filtru napriklad

    function applyRadius(radius:Number){

    var transformObject2:Object = new Object();
    transformObject2.outerRadius = 20

    // PROSTE TOTO TO NEVIE SPRACOVAT A NEVIEM AKO TO ZAPISAT
    transformObject2.center = [0,0];

    pbl2.applyFilter(obrazok,transformObject2);

    }

    Comment by MISO — March 19, 2009 @ 10:19 am

  4. //dalsi parametry posles velmi jednoduse:

    var transformObject:Object = new Object();
    transformObject.parametr1 = hodnota1;
    transformObject.parametr2 = hodnota2;

    // samotna aplikace:
    pbl.applyFilter(deformClip,transformObject);

    Comment by tom — March 24, 2009 @ 1:25 am

  5. to ano ale ono mi to pride ze to neni osterene ked ma filtren na pariklad parameter center ktory sa sklada z dvoch suradnic napr

    transformObject.center = [0,5]
    alebo

    transformObject.center[0] = 0

    transformObject.center[1] = 5

    tento zapis to uz nezobere

    Comment by MISO — March 24, 2009 @ 10:13 pm

  6. musis to zapsat takhle:
    transformObject.center = new Array();
    transformObject.center[0] = 0;
    transformObject.center[1] = 5;

    Comment by tom — March 27, 2009 @ 3:30 pm

  7. dakujem moc

    Comment by miso — March 29, 2009 @ 3:33 am

  8. cavko po dlhom case som sa ktomu dostal a popisany postup mi nefunguje importujem triedu napisem :

    var pbl:PixelBenderLoader = new PixelBenderLoader();
    pbl.addEventListener(Event.COMPLETE,onComplete);
    pbl.loadFilter(“pinch.pbj”);

    function applyRadius(radius:Number){
    // transformacni objekt, zmenime jen radius

    var transformObject:Object = new Object();
    transformObject.center = new Array();

    //transformObject.magnification = radius;

    transformObject.center[0] = 5;
    transformObject.center[1] = 5;

    // aplikuj filtr
    pbl.applyFilter(deformClip,transformObject);
    }

    // zmen radius pri pohybu mysi
    function mouseMoveChange(event:MouseEvent):void{
    applyRadius(mouseX/500);
    }

    function onComplete(e:Event):void{
    stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveChange);
    }

    a po spusteni hlasi chybu

    ArgumentError: Error #2004: One of the parameters is invalid.
    at flash.display::DisplayObject/set filters()
    at PixelBenderLoader/applyFilter()
    at omnio_fla::MainTimeline/applyRadius()
    at omnio_fla::MainTimeline/mouseMoveChange()

    Comment by Miso — April 10, 2009 @ 5:07 pm

  9. fuu nejako zle to sformatovalo

    Comment by Miso — April 10, 2009 @ 5:07 pm

  10. I like browsing your blog given that it has quite interesting themes.

    Comment by Phil Ladika — September 7, 2011 @ 9:57 pm

  11. Cpr KIts

    Comment by Homepage — December 9, 2011 @ 6:10 am

RSS feed for comments on this post. / TrackBack URL

Leave a comment

Comment moderation is enabled. Your comment may take some time to appear.