pbjをwonderflで使いやすいようにしてみる zahir forked:0favorite:3lines:120license : All rights reserved modified : 2009-05-03 22:12:00 Embed Tweet <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.utils.Base64Encoder; private var file:FileReference; private var s_name:String; private var pbjParamNameColor:uint = 0xCC3333; private var pbjParamTypeNameColor:uint = 0x00CCCC; private var pbjsubParamNameColor:uint = 0xCC6633; 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{ if(!txt_VDBox.enabled) txt_VDBox.enabled = true; var byteArr:ByteArray = file.data; //------------------------------------------------- setParamTxt( byteArr ); setCodeTxt( byteArr ); } private function setParamTxt(data:ByteArray):void{ var str:String = ""; var shader:Shader = new Shader( data ); var meta_arr:Array = new Array(); var param_arr:Array = new Array(); var arr:Array = new Array(); var i:int = 0; var len:int = 0; var name:String=""; var nameSpace:String=""; var ven:String=""; var ver:String=""; var des:String=""; for(var p:String in shader.data){ if(shader.data[p] is String || shader.data[p] is int){ if(p == "name"){ name = "<b>name</b> : " + shader.data[p] + "\n"; s_name = shader.data[p]; }else if(p == "namespace"){ nameSpace = "<b>namespace</b> : " + shader.data[p] + "\n"; }else if(p == "vendor"){ ven = "<b>vendor</b> : " + shader.data[p] + "\n"; }else if(p == "version"){ ver = "<b>version</b> : " + shader.data[p] + "\n"; }else{ des = "<b>description</b> : " + shader.data[p] + "\n"; } }else{ var _arr:Array =[]; for (var d:String in shader.data[p]) { _arr.push({ "paramDataName":d, "value":String(shader.data[p][d]) }); } param_arr.push({"paramName":p, "paramData":String(shader.data[p]), "paramType":String(shader.data[p].type), "param_arr":_arr}); } } str = name + nameSpace + ven + ver + des; /*--------------------------------------------------------------------------------------------- ActionScriptから値を渡すパラメータ群 ---------------------------------------------------------------------------------------------*/ param_arr.sortOn("paramName"); var shaderParam_arr:Array = new Array(); shaderParam_arr.push(arr); shaderParam_arr.push(param_arr); len = shaderParam_arr[1].length; for(i=0; i<len; i++){ str += "\n<font color=\"#" + pbjParamNameColor.toString(16) + "\">"+ shaderParam_arr[1][i].paramName + "</font>" + " : " ; str += "( " + "<font color=\"#" + pbjParamTypeNameColor.toString(16) + "\">" + shaderParam_arr[1][i].paramType + "</font> )\n"+ '<' +"\n" ; for(var j:int=0, len2:int = shaderParam_arr[1][i].param_arr.length; j<len2; j++){ str += " <font color=\"#" + pbjsubParamNameColor.toString(16) + "\">" + shaderParam_arr[1][i].param_arr[j].paramDataName + "</font> : " + shaderParam_arr[1][i].param_arr[j].value + "\n"; } str += '>'+ "\n" } //----------------------------------------------------------------------------------------------- param_txt.htmlText = str; } private function setCodeTxt(data:ByteArray):void{ data.deflate(); //とりあえず圧縮 解凍にはinflate()を使う var len:int = data.length; var str:String = "[ " for(var i:int = 0; i<len; i++){ str += i==len-1 ? data[i] : data[i] + ","; } str += " ]"; code_txt.text = "class " + s_name + "Shader extends Shader\n"+ "{\n\n" + " private var vec:Vector.<int> = Vector.<int>( " + str + " );\n" + " private var byteArr:ByteArray;\n"+ " public function " + s_name + "Shader():void\n"+ " {\n"+ " var len:int = vec.length;\n"+ " if(!byteArr)\n"+ " {\n"+ " byteArr = new ByteArray();\n"+ " for(var i:int=0; i<len; i++)\n"+ " {\n"+ " byteArr.writeByte( vec[i] );\n"+ " }\n"+ " byteArr.inflate();\n"+ " this.byteCode = byteArr;\n"+ " }\n"+ " }\n"+ "}"; } ]]> </mx:Script> <mx:VBox width="100%" height="100%" verticalGap="0"> <mx:HBox width="100%" height="30" backgroundColor="#000000" verticalAlign="middle" paddingLeft="5" paddingRight="10"> <mx:Label text="pbjExplorer" fontSize="18" fontWeight="bold" color="#CCCCCC"/> <mx:Spacer width="100%" /> <mx:Button label="ロード" color="#000000" fillAlphas="[1.0, 1.0]" fillColors="[#FFFFFF, #FFFFFF]" click="onLoad()"/> </mx:HBox> <mx:VDividedBox id="txt_VDBox" width="100%" height="100%" backgroundColor="#000000" paddingLeft="3" paddingRight="3" paddingTop="3" paddingBottom="5" enabled="false"> <mx:TextArea width="100%" backgroundColor="#333333" color="#CCCCCC" id="param_txt" height="100%"/> <mx:TextArea width="100%" backgroundColor="#333333" color="#CCCCCC" id="code_txt" height="100%"/> </mx:VDividedBox> </mx:VBox> </mx:Application> Code Fullscreen Preview Fullscreen uwi rsakane : ちょー便利 keiso : PixelBender PixelBender namespace toString name text length String int