pbjExplorer lite ver.Base64

by zahir
♥1 | Line 221 | Modified 2009-05-28 14:57:12 | MIT License
play

ActionScript3 source code

/**
 * Copyright zahir ( http://wonderfl.net/user/zahir )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/ehz2
 */

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	layout="vertical" verticalGap="3" width="465" height="465"
	paddingBottom="0" paddingLeft="3" paddingRight="3" paddingTop="5"
	backgroundColor="0x111111"
	applicationComplete="init()" >
<mx:Style>
Button{
	color: #FFFFFF;
	textRollOverColor: #999999;
	fillAlphas: 1.0, 1.0;
	fillColors: #666666, #333333;
	borderColor: #CCCCCC;
}
Label{
	color: #CCCCCC;
	fontFamily: Georgia;
}
TextArea{
	color: #CCCCCC;
	backgroundColor: #333333;
	borderColor: #000000;
}
</mx:Style>
<mx:Script>
	<![CDATA[
	import mx.utils.Base64Encoder;
	import __AS3__.vec.Vector;
	
	private var file:FileReference;
	
	// パラメーター用配列
	private var meta:Array;
	private var params:Array;
	private var inputs:Array;
	
	private const br:String = "<br />";	
	private const sFont:String = "<font color=\"#";
	private const _sFont:String = "\">";
	private const eFont:String = "</font>";
	private static const tab:String = "\t";
	private static const tab2:String = "\t\t";
	private static const tab3:String = "\t\t\t";
	private static const tab4:String = "\t\t\t\t";
	
	private const Name:uint = 0x00CCFF;
	private const Type:uint = 0x00CC00;
	private const Menbers:uint = 0xFF6600;
	
	private var h:int;
	private var __Name:String;
	
	private function init():void{
		var str:String = "";
		str += "<a href=\"http://zahir.s69.coreserver.jp/air/pbjexplorer/pbjExplorer.air\">"
		str += "<u><font color=\"#00CCFF\">Get pbjExplorer2</font></u>";
		str += "</a>";
		str += "	AIR 1.5.1"
		footer.htmlText = str;
		
		param_txt.text = "pbjファイルをロードしてね";
		
		h = cont.height -25;
		viewparam();
		Wonderfl.capture_delay( 1 );
	}
	private function viewparam():void{
		param_txt.height = h;
		exp_txt.height = 0;
	}
	private function viewexp():void{
		param_txt.height = 0;
		exp_txt.height = h;
	}
	
	//-------------------------------------------------------------------------
	// pbjのロード
	private function onLoad():void{
		if(file != null) file = null;
		
		file = new FileReference();
		file.addEventListener(Event.SELECT, onSelect);
		file.browse(  [ new FileFilter("pbj File (*.pbj)", "*.pbj") ] );
	}
	private function onSelect( e:Event ):void{
		file.addEventListener(Event.COMPLETE, onComp);
		file.load();
	}
	private function onComp(e:Event):void{
		readParam( file.data );
		Export( file.data );
	}
	//-------------------------------------------------------------------------
	
	//-------------------------------------------------------------------------
	// shaderのパラメータ群を取得
	private function readParam( data:ByteArray ):void{
		var s:Shader = new Shader( data );
		
		meta = [];
		params = [];
		inputs = [];
			
		for (var p:String in s.data) {
			if(s.data[p] is ShaderParameter){
				var o:Vector.<Object> = new Vector.<Object>();
				for (var d:String in s.data[p]) 
					o.push({"type":d, "value":s.data[p][d] });
				params.push({ "name": p, "type":s.data[p].type, "values": sortParamValues( o ) });
			}else if(s.data[p] is ShaderInput == false && s.data[p] is ShaderParameter == false){
				meta.push({ "name":p, "value":s.data[p] });
			}else{
				inputs.push({ "name":p, "channels":s.data[p].channels });
			}
        }
        params.sortOn( "name", Array.CASEINSENSITIVE );
        inputs.sortOn("name", Array.CASEINSENSITIVE );
        
        param_txt.htmlText = getMetaData();
        param_txt.htmlText += getInputsHTML(inputs);
        param_txt.htmlText += getParamsHTML(params);
	}
	private function sortParamValues( vec:Vector.<Object> ):Vector.<Object>{
		var len:int = vec.length;
		var _name:Object;
		var _description:Object;
		var _maxValue:Object;
		var _minValue:Object;
		var _defaultValue:Object;
		for(var i:int = 0; i<len; i++){
			if(vec[i].type == "name") _name = vec[i]; 
			else if(vec[i].type == "description") _description = vec[i];
			else if(vec[i].type == "maxValue") _maxValue = vec[i];
			else if(vec[i].type == "minValue") _minValue = vec[i];
			else if(vec[i].type == "defaultValue") _defaultValue = vec[i];
		}
		vec = new Vector.<Object>();
		if(_name) vec.push(_name);
		if(_description) vec.push(_description);
		if(_maxValue) vec.push(_maxValue);
		if(_minValue) vec.push(_minValue);
		if(_defaultValue) vec.push(_defaultValue);
		
		return vec;
	}
	private  function getMetaData():String{
		var str:String = "";
		var _name:String;
		var _nameSpace:String;
		var _vendor:String;
		var _version:String;
		var _description:String;
		
		var len:int = meta.length;
		for(var i:int = 0; i<len; i++){
			if(meta[i].name == "name"){ _name = "<b>" + meta[i].name + "</b> : " + meta[i].value + "\n"; __Name = meta[i].value;}
			else if(meta[i].name == "namespace") _nameSpace = "<b>" + meta[i].name + "</b> : " + meta[i].value + "\n";
			else if(meta[i].name == "vendor") _vendor = "<b>" + meta[i].name + "</b> : " + meta[i].value + "\n";
			else if(meta[i].name == "version") _version = "<b>" + meta[i].name + "</b> : " + meta[i].value + "\n";
			else if(meta[i].name == "description") _description = "<b>" + meta[i].name + "</b> : " + meta[i].value + "\n";
		}
		if(_name) str += _name;
		if(_nameSpace) str += _nameSpace;
		if(_vendor) str +=_vendor;
		if(_version) str += _version;
		if(_description ) str += _description;
		str += br+br;
		return str;
	}
	private function getInputsHTML( _arr:Array ):String{
		var str:String = sFont + (0x00CC33).toString(16) + _sFont;
		str += "/////////////////////////////////" + br;
		str += "//  Input's  ////////////////////" + br;
		str += "/////////////////////////////////" + eFont + br + br;
		var len:int = _arr.length;
		for(var i:int = 0; i<len; i++){
			str += sFont + Name.toString(16) + _sFont + _arr[i].name + eFont;
			str +=  " ( " + sFont + Type.toString(16) + _sFont + _arr[i].channels + eFont + " ) " + br;
		}
		str += br + br;
		return str;
	}
	
	private function getParamsHTML( _arr:Array ):String{
		var str:String = sFont + (0x00CC33).toString(16) + _sFont;
		str += "/////////////////////////////////" + br;
		str += "//  Parameter's  //////////////" + br;
		str += "/////////////////////////////////" + eFont + br + br;
		var len:int = _arr.length;
		for(var i:int = 0; i<len; i++){
			var lv:Vector.<Object> = _arr[i].values as Vector.<Object>;
			str += sFont + Name.toString(16) + _sFont + _arr[i].name + eFont;
			str +=  " ( " + sFont + Type.toString(16) + _sFont + _arr[i].type + eFont + " ) " + br;
			str += "<" + br;
			if(lv){
				var l:int = lv.length;
				for(var j:int=0; j<l; j++){
					str += "\t\t" + sFont + Menbers.toString(16) + _sFont + lv[j].type + eFont + " : " + lv[j].value + br; 
				}
				str += ">;" + br + br;
			}
		}
		return str;
	}
	//-------------------------------------------------------------------------
	// Exporter
	private function Export( data:ByteArray ):void{
		var enc:Base64Encoder = new Base64Encoder();
		enc.encodeBytes( data );
		var str2:String = "";
		var b64:String = enc.toString();
		var len:uint = b64.length;
		for (var i:uint = 0; i < len; i++){
			var sub:String = b64.substr(i, 1);
			if (sub == "\n")
				continue;
			str2 += sub;
		}
		var str:String = 
"class " + __Name + " extends Shader" + br +
"{" + br +
tab + "public function " + __Name + "():void" + br +
tab + "{" + br +
tab2 +"var dec:Base64Decoder = new Base64Decoder();" + br +
tab2 +"dec.decode( \"" + str2+ "\" );" + br +
tab2 +"this.byteCode = dec.toByteArray();" + br +
tab2 +"super(byteCode);" + br + 
tab + "}"+ br +
"}";

		exp_txt.htmlText = str;
	}
	]]>
</mx:Script>
	<mx:HBox width="100%">
		<mx:Label text="pbjExplorer lite" fontSize="16" fontWeight="bold" />
		<mx:Spacer width="100%" />
		<mx:Button id="p_btn" label="Params" click="viewparam();" />
		<mx:Button id="e_btn" label="Export" click="viewexp();" />
		<mx:Button label="load" click="onLoad()" />
	</mx:HBox>
	<mx:VDividedBox id="cont" width="100%" height="100%">
		<mx:TextArea id="param_txt" width="100%" height="100%" editable="false" />
		<mx:TextArea id="exp_txt" width="100%" height="100%" editable="false" />
	</mx:VDividedBox>
	<mx:Text id="footer" />
</mx:Application>