<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jozef Chúťka&#039;s blog &#187; ShaderInput</title>
	<atom:link href="http://blog.yoz.sk/tag/shaderinput/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.yoz.sk</link>
	<description>My life, my work</description>
	<lastBuildDate>Tue, 31 Jan 2012 12:40:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Pixel Bender Explorer</title>
		<link>http://blog.yoz.sk/2010/01/pixel-bender-explorer/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pixel-bender-explorer</link>
		<comments>http://blog.yoz.sk/2010/01/pixel-bender-explorer/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 17:06:50 +0000</pubDate>
		<dc:creator>Jozef Chúťka</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash / Flex]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[pixel bender]]></category>
		<category><![CDATA[Shader]]></category>
		<category><![CDATA[ShaderExplorer]]></category>
		<category><![CDATA[ShaderFilter]]></category>
		<category><![CDATA[ShaderInput]]></category>
		<category><![CDATA[ShaderLoader]]></category>
		<category><![CDATA[ShaderParameter]]></category>

		<guid isPermaLink="false">http://blog.yoz.sk/?p=867</guid>
		<description><![CDATA[Pixel Bender Explorer is simple application that lets you dynamicly load .pbj files, apply it on image and edit shader values. Application uses two classes. ShaderLoader class loads external .pbj file and casts loaded binary data into Shader object. ShaderExplorer class inspects created Shader object and generates editable form based on Shader parameters. You can [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.yoz.sk/wp-content/uploads/pixelBenderExplorer-188x200.jpg" alt="" title="pixelBenderExplorer" width="188" height="200" class="alignleft size-medium wp-image-868" /></p>
<p>Pixel Bender Explorer is simple application that lets you dynamicly load .pbj files, apply it on image and edit shader values. Application uses two classes. ShaderLoader class loads external .pbj file and casts loaded binary data into Shader object. ShaderExplorer class inspects created Shader object and generates editable form based on Shader parameters. You can load your own external .pbj files (crossdomain.xml required near .pbj file) or feel free to download and use whole .swf application localy.</p>
<p>Application inspired by <a href="http://cookbooks.adobe.com/post_Enumerating_Pixel_Bender_filter_parameters_and_met-16688.html">Enumerating Pixel Bender filter parameters and metadata dynamically in Flash</a> and <a href="http://www.gotoandlearn.com/play?id=84">Introduction to Pixel Bender: Part 2</a> articles.</p>
<p><span id="more-867"></span></p>
<p style="clear:both;">Pixel Bender Explorer application</p>
<p><iframe src="http://blog.yoz.sk/examples/pixelBenderExplorer/" width="620" height="650" style="border:none;"></iframe></p>
<p><a href="http://classes.yoz.sk/sk/yoz/shader/ShaderLoader.as">sk.yoz.shader.ShaderLoader</a></p>
<pre class="brush: as3; title: ; notranslate">package sk.yoz.shader
{
    import flash.display.Shader;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IOErrorEvent;
    import flash.filters.ShaderFilter;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;

    public class ShaderLoader extends EventDispatcher
    {
        protected var loader:URLLoader = new URLLoader();
        protected var _filters:Array = [];
        protected var _shader:Shader;
        protected var _shaderFilter:ShaderFilter;

        public function ShaderLoader()
        {
            super();

            loader.dataFormat = URLLoaderDataFormat.BINARY;
            loader.addEventListener(Event.COMPLETE, loadCompleteHandler);
            loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        }

        [Bindable(event=&quot;filtersChanged&quot;)]
        public function get filters():Array
        {
            return _filters;
        }

        protected function set filters(value:Array):void
        {
            _filters = value;
            dispatchEvent(new Event(&quot;filtersChanged&quot;));
        }

        [Bindable(event=&quot;shaderChanged&quot;)]
        public function get shader():Shader
        {
            return _shader;
        }

        protected function set shader(value:Shader):void
        {
            _shader = value;
            dispatchEvent(new Event(&quot;shaderChanged&quot;));
        }

        [Bindable(event=&quot;shaderFilterChanged&quot;)]
        public function get shaderFilter():ShaderFilter
        {
            return _shaderFilter;
        }

        protected function set shaderFilter(value:ShaderFilter):void
        {
            _shaderFilter = value;
            dispatchEvent(new Event(&quot;shaderFilterChanged&quot;));
        }

        public function load(url:String):void
        {
            loader.load(new URLRequest(url));
        }

        protected function loadCompleteHandler(event:Event):void
        {
            try
            {
                protected::shader = new Shader(event.target.data);
                protected::shaderFilter = new ShaderFilter(public::shader);
                protected::filters = [public::shaderFilter];
            }
            catch(error:Error)
            {
                protected::shader = null;
                protected::shaderFilter = null;
                protected::filters = [];
            }
        }

        protected function ioErrorHandler(event:IOErrorEvent):void
        {
        }
    }
}</pre>
<p><a href="http://classes.yoz.sk/sk/yoz/shader/ShaderExplorer.as">sk.yoz.shader.ShaderExplorer</a></p>
<pre class="brush: as3; title: ; notranslate">package sk.yoz.shader
{
    import flash.display.Shader;
    import flash.display.ShaderInput;
    import flash.display.ShaderParameter;
    import flash.events.Event;
    import flash.filters.ShaderFilter;

    import mx.containers.VBox;
    import mx.controls.HRule;
    import mx.controls.HSlider;
    import mx.events.SliderEvent;
    import mx.controls.Spacer;
    import mx.controls.Text;

    public class ShaderExplorer extends VBox
    {
        protected var _shader:Shader;

        public function ShaderExplorer()
        {
            super();
        }

        public function get shader():Shader
        {
            return _shader;
        }

        public function set shader(value:Shader):void
        {
            _shader = value;
            createControls();
            dispatchEvent(new Event(&quot;shaderFiltersChanged&quot;));
        }

        [Bindable(event=&quot;shaderFiltersChanged&quot;)]
        public function get shaderFilters():Array
        {
            if(!shader)
                return [];
            return [new ShaderFilter(shader)];
        }

        protected function createControls():void
        {
            var spacer:Spacer;

            removeAllChildren();
            createDescriptors();
            spacer = new Spacer();
            spacer.height = 20;
            addChild(spacer);
            createInputs();
            spacer = new Spacer();
            spacer.height = 20;
            addChild(spacer);
            createParameters();
        }

        protected function createDescriptors():void
        {
            var param:String;
            for(param in shader.data)
                if(shader.data[param] is String)
                    add_text(param + &quot;: &quot; + shader.data[param]);
        }

        protected function createInputs():void
        {
            var param:String;
            for(param in shader.data)
                if(shader.data[param] is ShaderInput)
                    add_text(param + &quot;: &quot; + shader.data[param]);
        }

        protected function sliderChangeHandler(event:SliderEvent):void
        {
            if(!event.target.name)
                return;
            var name:String = String(event.target.name).replace(/_[0-9]+$/, '');
            var shaderParameter:ShaderParameter = shader.data[name];
            var values:Array = [];
            var i:uint = 0;
            while(getChildByName(name + &quot;_&quot; + i))
                values.push(HSlider(getChildByName(name + &quot;_&quot; + i++)).value);
            shaderParameter.value = values;
            dispatchEvent(new Event(&quot;shaderFiltersChanged&quot;));
        }

        protected function createParameters():void
        {
            var param:String;
            var shaderParameter:ShaderParameter;
            for(param in shader.data)
            {
                if(!(shader.data[param] is ShaderParameter))
                    continue;

                shaderParameter = shader.data[param] as ShaderParameter;
                try
                {
                    this[&quot;add_&quot; + shaderParameter.type].apply(null, [shaderParameter]);
                }
                catch(error:Error)
                {
                    add_text(&quot;unknown type (&quot; + shaderParameter.type + &quot;)&quot;);
                }
            }
        }

        protected function add_text(text:String):void
        {
            var txt:Text = new Text();
            txt.text = text;
            txt.percentWidth = 100;
            addChild(txt);
        }

        protected function add_slider(name:String, value:Number, minimum:Number,
            maximum:Number, snapInterval:Number = 0):void
        {
            var slider:HSlider = new HSlider();
            slider.name = name;
            slider.minimum = minimum;
            slider.maximum = maximum;
            slider.value = value;
            slider.snapInterval = snapInterval;
            slider.percentWidth = 100;
            slider.addEventListener(SliderEvent.CHANGE, sliderChangeHandler);
            addChild(slider);
        }

        protected function add_float(p:ShaderParameter):void
        {
            add_text(p.name + &quot; (&quot; + p.type + &quot;)&quot;);
            add_slider(p.name + &quot;_0&quot;, p.defaultValue[0], p.minValue[0], p.maxValue[0]);
        }

        protected function add_float2(p:ShaderParameter):void
        {
            add_text(p.name + &quot; (&quot; + p.type + &quot;)&quot;);
            add_slider(p.name + &quot;_0&quot;, p.defaultValue[0], p.minValue[0], p.maxValue[0]);
            add_slider(p.name + &quot;_1&quot;, p.defaultValue[1], p.minValue[1], p.maxValue[1]);
        }

        protected function add_float3(p:ShaderParameter):void
        {
            add_text(p.name + &quot; (&quot; + p.type + &quot;)&quot;);
            add_slider(p.name + &quot;_0&quot;, p.defaultValue[0], p.minValue[0], p.maxValue[0]);
            add_slider(p.name + &quot;_1&quot;, p.defaultValue[1], p.minValue[1], p.maxValue[1]);
            add_slider(p.name + &quot;_2&quot;, p.defaultValue[2], p.minValue[2], p.maxValue[2]);
        }

        protected function add_float4(p:ShaderParameter):void
        {
            add_text(p.name + &quot; (&quot; + p.type + &quot;)&quot;);
            add_slider(p.name + &quot;_0&quot;, p.defaultValue[0], p.minValue[0], p.maxValue[0]);
            add_slider(p.name + &quot;_1&quot;, p.defaultValue[1], p.minValue[1], p.maxValue[1]);
            add_slider(p.name + &quot;_2&quot;, p.defaultValue[2], p.minValue[2], p.maxValue[2]);
            add_slider(p.name + &quot;_3&quot;, p.defaultValue[3], p.minValue[3], p.maxValue[3]);
        }

        protected function add_int(p:ShaderParameter):void
        {
            add_text(p.name + &quot; (&quot; + p.type + &quot;)&quot;);
            add_slider(p.name + &quot;_0&quot;, p.defaultValue[0], p.minValue[0], p.maxValue[0] ,1);
        }

        protected function add_int2(p:ShaderParameter):void
        {
            add_text(p.name + &quot; (&quot; + p.type + &quot;)&quot;);
            add_slider(p.name + &quot;_0&quot;, p.defaultValue[0], p.minValue[0], p.maxValue[0] ,1);
            add_slider(p.name + &quot;_1&quot;, p.defaultValue[1], p.minValue[1], p.maxValue[1] ,1);
        }

        protected function add_int3(p:ShaderParameter):void
        {
            add_text(p.name + &quot; (&quot; + p.type + &quot;)&quot;);
            add_slider(p.name + &quot;_0&quot;, p.defaultValue[0], p.minValue[0], p.maxValue[0] ,1);
            add_slider(p.name + &quot;_1&quot;, p.defaultValue[1], p.minValue[1], p.maxValue[1] ,1);
            add_slider(p.name + &quot;_2&quot;, p.defaultValue[2], p.minValue[2], p.maxValue[2] ,1);
        }

        protected function add_int4(p:ShaderParameter):void
        {
            add_text(p.name + &quot; (&quot; + p.type + &quot;)&quot;);
            add_slider(p.name + &quot;_0&quot;, p.defaultValue[0], p.minValue[0], p.maxValue[0] ,1);
            add_slider(p.name + &quot;_1&quot;, p.defaultValue[1], p.minValue[1], p.maxValue[1] ,1);
            add_slider(p.name + &quot;_2&quot;, p.defaultValue[2], p.minValue[2], p.maxValue[2] ,1);
            add_slider(p.name + &quot;_3&quot;, p.defaultValue[3], p.minValue[3], p.maxValue[3], 1);
        }

        // TODO, matrix, matrix4x4...
    }
}</pre>
<p>Pixel Bender Explorer application:</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
    layout=&quot;vertical&quot; xmlns:shader=&quot;sk.yoz.shader.*&quot;
    creationComplete=&quot;shadersService.send();&quot; width=&quot;620&quot; height=&quot;650&quot;
    paddingTop=&quot;10&quot; paddingRight=&quot;10&quot; paddingBottom=&quot;10&quot; paddingLeft=&quot;10&quot;
    backgroundGradientColors=&quot;{[0xffffff, 0xffffff]}&quot;&gt;
&lt;mx:Script&gt;
&lt;![CDATA[
    import sk.yoz.shader.ShaderLoader;

    [Embed(source=&quot;../assets/img.jpg&quot;)]
    public static const IMAGE_CLASS:Class;

    [Bindable]
    private var loader:ShaderLoader = new ShaderLoader();
]]&gt;
&lt;/mx:Script&gt;
&lt;mx:HTTPService id=&quot;shadersService&quot; url=&quot;shaders.xml&quot; /&gt;
&lt;mx:HBox width=&quot;100%&quot;&gt;
    &lt;mx:CheckBox id=&quot;useFilter&quot; selected=&quot;true&quot;/&gt;
    &lt;mx:ComboBox id=&quot;combo&quot; editable=&quot;true&quot;
        close=&quot;{loader.load(String(combo.value))}&quot;
        enter=&quot;{loader.load(String(combo.value))}&quot;
        dataProvider=&quot;{shadersService.lastResult.data.shader}&quot; width=&quot;510&quot;/&gt;
    &lt;mx:Button label=&quot;Load&quot; click=&quot;{loader.load(String(combo.value))}&quot;/&gt;
&lt;/mx:HBox&gt;
&lt;mx:HBox width=&quot;100%&quot; height=&quot;100%&quot;&gt;
    &lt;mx:Image source=&quot;{IMAGE_CLASS}&quot;
        filters=&quot;{useFilter.selected ? explorer.shaderFilters : []}&quot;/&gt;
    &lt;mx:Canvas width=&quot;100%&quot; height=&quot;100%&quot; verticalScrollPolicy=&quot;auto&quot;&gt;
        &lt;shader:ShaderExplorer id=&quot;explorer&quot; shader=&quot;{loader.shader}&quot;
            height=&quot;100%&quot; /&gt;
    &lt;/mx:Canvas&gt;
&lt;/mx:HBox&gt;
&lt;/mx:Application&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.yoz.sk/2010/01/pixel-bender-explorer/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

