<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%" pageTitle="Conduit Shader Demo"
	initialize="appLoaded();"
	>

    <mx:Script>
        <![CDATA[

		private var lastShader:Shader = null;
		private var loadedFileRef:FileReference = null;


		private function browseForPBJFile():void
		{
			img.filters = [];  // clear out previous shader
			
      		var fileRef:FileReference = new FileReference();
      		fileRef.addEventListener( Event.SELECT, onFileSelect );
      		fileRef.addEventListener( Event.COMPLETE, onFileLoadComplete );
			fileRef.addEventListener( ProgressEvent.PROGRESS, onFileProgress );
			fileRef.addEventListener( IOErrorEvent.IO_ERROR, onFileIOError );
			
			loadedFileRef = fileRef;  // the file reference must be kept around until it has finished loading
			
      		fileRef.browse();
		}
		
	    private function onFileSelect( event:Event ):void {
	    	var fileRef:FileReference = event.target as FileReference;

			traceTxt.text = "file was selected: " + fileRef;

			if ( !fileRef['load'])
				traceTxt.text = "** error: FileRef doesn't have load method";
			
			try {
	    		fileRef['load']();
			} catch (err:Error) {
				traceTxt.text = "** FileRef.load exception: " + err;
			}
	    }
	
		private function onFileProgress( event:ProgressEvent ):void {
			var fileRef:FileReference = event.target as FileReference;
            traceTxt.text = "file: " + fileRef.name + "  bytes: " + event.bytesTotal;
		}
	
		private function onFileIOError( event:Event ):void {
			traceTxt.text = "** IO Error when attempting to load FileRef";
		}

	    private function onFileLoadComplete( event:Event ):void {
	    	var fileRef:FileReference = event.target as FileReference;
	    	var data:ByteArray = fileRef.data as ByteArray;
			//traceTxt.text = "shader data was loaded";
			
			var shader:Shader = new Shader(data);

			/*  // debug: print out the property keys (parameter names, etc.) in the shader's data object
			traceTxt.text = "shaderdata keys: ";
			for (var p:String in shader.data) {
				traceTxt.text += p + "; ";
			}*/
			
			// image size needs to be passed to the shader so that texcoords can be normalized
			if (shader.data["outputImageInfo"]) {
				var imageW:int = 512;
				var imageH:int = 512;
				shader.data["outputImageInfo"].value = [ imageW, imageH, 1.0/imageW, 1.0/imageH ];
			}
			
			if (shader.data["slider1"]) {
				shader.data["slider1"].value = [ 0.5 ];
			}
			if (shader.data["color1"]) {
				shader.data["color1"].value = [ 0.3, 0.3, 0.3, 0.3 ];
			}
			
			var shaderFilter:ShaderFilter = new ShaderFilter();
			shaderFilter.shader = shader;
			
			lastShader = shader;
			
			img.filters = [shaderFilter];
	    }
		

		private function appLoaded():void
		{
		}


		private function onSlider1Change():void
		{
			var shader:Shader = lastShader;
			img.filters = [];
			
			if ( !shader)
				traceTxt.text = "** no shader available";
			else {
				if (shader.data["slider1"]) {
					shader.data["slider1"].value = [ slider1.value ];
				}
				
				var newFilter:ShaderFilter = new ShaderFilter();
				newFilter.shader = shader;
				img.filters = [newFilter];
			}
		}

		private function onSlider2Change():void
		{
			var shader:Shader = lastShader;
			img.filters = [];
			
			if ( !shader)
				traceTxt.text = "** no shader available";
			else {
				if (shader.data["slider2"]) {
					shader.data["slider2"].value = [ slider2.value ];
				}
				
				var newFilter:ShaderFilter = new ShaderFilter();
				newFilter.shader = shader;
				img.filters = [newFilter];
			}
		}

		private function onSlider3Change():void
		{
			var shader:Shader = lastShader;
			img.filters = [];
			
			if ( !shader)
				traceTxt.text = "** no shader available";
			else {
				if (shader.data["slider3"]) {
					shader.data["slider3"].value = [ slider3.value ];
				}
				
				var newFilter:ShaderFilter = new ShaderFilter();
				newFilter.shader = shader;
				img.filters = [newFilter];
			}
		}


        ]]>
    </mx:Script>


<!--top box-->
<mx:Box direction="horizontal" borderStyle="none"
				paddingTop="10" paddingBottom="10" paddingLeft="16" paddingRight="16">


<mx:Image id="img" width="512" height="512" source="@Embed(source='/Users/pauli/Pictures/monteu icon 01 -pixelbender-512px.png')" />


<!--rightside box-->
<mx:Box direction="vertical" borderStyle="none" 
                paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10">

  <mx:Text width="100%">
      <mx:htmlText>
	    <![CDATA[
<p>This is a sample application that shows how shaders created in <a href="http://lacquersoftware.com">Conduit for Pixel Bender</a> can be used in Flash Player 10.</p>
<p>Click on the button below to load a shader file into the Flash Player. The sliders can be used to modify Conduit slider values.</p>
		 ]]>
      </mx:htmlText>
  </mx:Text>

  <mx:Button label="Browse for shader file (.pbj)..." click="browseForPBJFile()" />

  <mx:Spacer height="20" />

<mx:Panel id="panel" title="Conduit sliders" height="100%" width="85%"
        paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10">

<mx:HBox>

   <mx:Label color="0x100030" text="Slider 1:" paddingLeft="10"/>

   <mx:HSlider id="slider1" minimum="0" maximum="1" value="0.5" 
            dataTipPlacement="top" 
            tickColor="black" 
            snapInterval="0" tickInterval="0.1" 
            labels="['0.0','1.0']" 
            allowTrackClick="true" 
            liveDragging="true"
            change="onSlider1Change();"/>

</mx:HBox>

<mx:HBox>

   <mx:Label color="0x100030" text="Slider 2:" paddingLeft="10"/>

   <mx:HSlider id="slider2" minimum="0" maximum="1" value="0.0" 
            dataTipPlacement="top" 
            tickColor="black" 
            snapInterval="0" tickInterval="0.1" 
            labels="['0.0','1.0']" 
            allowTrackClick="true" 
            liveDragging="true"
            change="onSlider2Change();"/>
</mx:HBox>

<mx:HBox>

   <mx:Label color="0x100030" text="Slider 3:" paddingLeft="10"/>

   <mx:HSlider id="slider3" minimum="0" maximum="1" value="0.0" 
            dataTipPlacement="top" 
            tickColor="black" 
            snapInterval="0" tickInterval="0.1" 
            labels="['0.0','1.0']" 
            allowTrackClick="true" 
            liveDragging="true"
            change="onSlider3Change();"/>

</mx:HBox>

</mx:Panel>

<mx:Spacer height="12" />
<mx:Text id="traceTxt" width="80%" fontSize="9" />

</mx:Box> <!--rightside box-->

</mx:Box> <!--top box-->

</mx:Application>