RubyCocoa で QuartzComposer CustomPatch (2)
とりあえず、できました。
スクリーンショット
サンプル
input, output ともにStringのPortを1つずつもち、入力にある”Objective-C”を”Ruby”に正規表現で置換するというだけのサンプルを書きました。
RubyPatch (binary & source) rev3 (i386 Binary)
RubyCocoaをUniversal Binary でビルドしていなかったため、いまのところIntel Mac だけで動きます。
RubyCocoa の svn trunk、 MacBook Kuroで動作確認をしています。
何をしているか
- Patchがロードされるとき、すなわち “registerNodesWithManager” が呼ばれるときに、RBBundleInitを呼んでRubyCocoaの準備をする
- Patchの動作を記述するObjective-CのクラスをProxyとして、実際の動作を記述するRubyクラスのインスタンスを保持させる
- Rubyクラスは、Objective-CクラスからPortをもらってくる
- Patchを実行するイベントがきたら、Rubyクラスのインスタンスに対して処理を移譲
といったところ。
実際のコードは、RubyQC::Trac にあるのでご覧ください。
このアプローチの問題点
- いちいち全メソッドを Objective-Cのクラス → Rubyのクラス に投げるよう書くのがめんどう
- Portの記述がObjective-Cのクラスにしか書けない (みたい) なので、Portを加えたり減らしたりするたびにObjective-C/Rubyコードともに変更しないといけない。わすれそう。
OSX::QCPatchクラスをRubyクラスで継承できて、さらにPortの情報もRubyクラスで書けるようになれば、これらの問題は解決しそうです。
課題
QCPatch.execute は、3つの引数をとるのですが、Rubyクラスのメソッドにどうやって3引数を渡すのか分からない…
18:03 追記
MLで、LimeChatの中の人に教えてもらいました。
objc_method :execute_time_arguments, %w|char id double id| def execute_time_arguments(fp8, fp12, fp20) ... end
のようにすればいいよ、とのことで、ばっちり動きました。ありがとうございます。
とはいえ、CustomPatch がRubyで書けるようになったのは大きな進歩です。ApacheReaderPatch とかも、ずいぶんと簡単に書けそう。
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://blog.deadbeaf.org/2007/07/15/rubycocoa-quartzcomposer-custompatch-2/trackback/
- Listed below are links to weblogs that reference
- RubyCocoa で QuartzComposer CustomPatch (2) from mootoh.log



