『 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

« 
» 

3 Responses to “PixelBender (.pbj) をActionScriptに埋め込む”

  1. 1 cm
    7月 26th, 2010 at 6:05 PM

    Wow! very good job.
    Thank you :)

  2. 2 alumican
    7月 28th, 2010 at 11:34 PM

    >cm

    Thanks for your comment.

  3. 3 s_s_k
    7月 31st, 2010 at 2:27 AM

    すごく便利ですね。早速使わせていただきます!

Leave a Reply