『 PixelBender (.pbj) をActionScriptに埋め込む 』
2010 年 7 月 12 日まじめにPixelBenderやろうかなと思いつつ、いちいちpbjファイルをロードするのも面倒くさいなと思ったので、ちょっと便利そうなツールを作ってみました。
pbjファイルをローカルからアップロードすると、PixelBenderのコードを内部に埋め込んだActionScriptのクラスを生成します。pbjファイルがパラメータを含む場合は、各パラメータに対して自動的にgetter/setterも用意します。インプットに対しても自動でgetter/setterを生成します。
このツールの利点としては
- コンパイル時にPixelBenderのコードを含めることができるので、pbjファイルを外部読み込みする必要が無くなる
- pbjファイルにどのようなパラメータやインプットを設定すればいいのか分かる
といったことがあります。wonderflに投稿する際にメインのコードとPixelBenderをひとつのファイルにまとめたり、パラメータやインプットの指定ミスを減らせることができるかと思います。
エンコード/デコード処理はこのようになっています。
//pbjファイル → 埋め込みコード
function encode(bytes:ByteArray):Array {
var code:Array = new Array();
bytes.position = 0;
while (bytes.bytesAvailable) {
code.push(bytes.readByte());
}
return code;
}
encode(loader.data);
//埋め込みコード → Shaderインスタンス
function decode(code:Array):ByteArray {
var bytes:ByteArray = new ByteArray();
for (var i:uint = 0, l:uint = code.length; i < l; ++i) {
bytes.writeByte(code[i]);
}
return bytes;
}
var shader:Shader = new Shader( decode(code) );
おまけ
結局使わなかったのですが、このツールを作るにあたりpbjファイルをディスアセンブルするクラスをC++からASに移植しました。
» Pixel Bender .pbj files (C++版のディスアセンブラ)
当初はpbjファイルをディスアセンブルしてパラメータのgetter/setterを自動生成sていたのですが、Shaderインスタンスのdataプロパティを列挙すれば必要な情報を取得できることに、移植完了後に気づきました。なのでディスアセンブラはお蔵入りとなってしまったのですが、せっかくなので置いておきます。使い方はクラスファイルの最初のほうを見てください。
» PBJDecoder.as
7月 26th, 2010 at 6:05 PM
Wow! very good job.
Thank you
7月 28th, 2010 at 11:34 PM
>cm
Thanks for your comment.
7月 31st, 2010 at 2:27 AM
すごく便利ですね。早速使わせていただきます!