寝すぎるわー。 ちゃんと朝起きてプログラム書きしたいんだけど、朝は涼しくてとても寝やすいのでどうしても寝過ぎてしまう。こまったな。
GLSLパーサはプリプロセッサをせっせと書いてる途中。#ifの条件式、パーサでめんどいからトークン列に分解しちゃったんだけど、ちゃんと構文木にしたほうが良かったな。
PEGで構文木作るの難しいんだよなぁ。プリプロセッサじゃなくて本文のパースするときにはやらないといけないから、そうも言ってられないんだけど。
MacRubyで遊んでみた。
MacRuby 0.6を入れたんだけどインストールに160MB容量食うって一体何入れてんだ。
だいたい普通に使えるんだけど、QTKitを使おうとしたら定数が無いっていわれてしまう。コマンドラインからmacrubyとかmacirbを使うと問題無いんだけどアプリからだと定数が読み込まれないようだ。
いろいろ調べてたら0.6にあったBridgeSupport読み込みバグでtrunkでは直っているようだ。load_bridge_supportで無理矢理読み込んであげて解決。
NSPanelのウィンドウを作って表示してたら、ウィンドウが非アクティブになってしばらくしたら消えてしまった。非アクティブの時に消える設定をやめても消えちゃうし、そもそもその設定ってアプリケーションが非アクティブになった時に非表示でウィンドウが非アクティブの時じゃない。しかもしばらくしてから消えるとかありえないから!
finalizeをオーバーライドしてみたら呼ばれてるので非表示じゃなくて死んでるのか。しばらくしたら死んでる?GCか!
というわけでそのパネルを誰かから参照保持してあげたら消えなくなった。GCこわいわー。表示されてるパネルすらGCするのかよ。NSWindowなら問題無いんだけどなぁ。
まあ誰からも参照されないパネルってのも閉じたが最後で再び表示できなくなっちゃうので、実用上はどこかから参照されてるだろうし問題無いんだろうけどね。
作ってたものはビデオデバイスからキャプチャした画像をそのまま表示するってもので、特に難しいところも無くできた。
QuartzComposerなら秒単位で出来ちゃうようなものなんだけど、QuartzComposerのビデオ入力パッチではプログラム的にデバイス選択が出来ないので普通にCocoaで作ったのであった。
しかしビデオ入力パッチにはインターレース解除設定があって、有効にしておくと勝手にインターレース解除してくれるんだよね。
俺もそれ欲しーのでやろうと思ったんだがどうにもわからず断念。一旦QTMovieになっちゃえば出来そうなんだけど、キャプチャしたデータをファイルに書き出さずにリアルタイムにQTMovieにするってどうやるんだろ?少なくとも簡単には出来そうにないのであきらめた。自前でインターレース解除を書くこともできはするけど大変だしね。
とりあえずこのアプリはこれで終わり。リクエストがあったら機能拡張したい。
Rikoはこれから何をやるべきか考えたけどシェーダ書くしかねぇや。これ以上高位の機能実装しようとしてもまずBasicEffect的なものが無いとめんどい。めんどいしシェーダが無いと描画できないし。
シェーダジェネレータを作るってのはあるんだが、基本的な機能のシェーダくらいは全部手で書いてもそんなに大変ではないだろう。というかシェーダジェネレータ作るのは楽しいだろうからそれの完成を待ってたら進まねーって!
しかし基本機能のシェーダを書こうと思ったらパラメータの名前を決めないととか、どこでライトのパラメータ渡せばいいんだろうとか困った感じだわ。これを決め打ちしちゃっていいものか。ずっとこれで悩んでて進んでないんだよねぇ。
今思ったけど、シーングラフ的な機能を基本のRikoの方に入れないほうがいいね。Rikoは一応低レベルということになってるから、そこはXNAみたいに最低限の機能を実装するくらいにしといたほうがいいかも。
シーングラフは上位機能のGRikoの方にまとめてしまうか。それなら決め打ちでも諦めつくわ。
基本的なシェーダー、というかエフェクトはXNAのBasicEffectを参考にしよう。