Windows版は目処がたった!
いやー、もっと大変かと思ったけどさほど苦労せず出来たよ。よかったよかった。
レイヤードウィンドウは普通に作った。何気にここが一番はめられたんだが、UpdateLayeredWindowを呼ぶときには少なくとも初回はサイズを省略できないみたい。ドキュメントにも書いてないし、関数は失敗するのにエラーコードは成功ってひどくね?
OpenGLのオフスクリーン描画は簡単。非表示のトップレベルウィンドウを別につくってそいつをレンダリングコンテキストに。
あとは描画したのをglReadPixelsでDIBに直接読み出して、そのDIBをレイヤードウィンドウに設定。はいできたー。
オフスクリーン描画といっても、高々ウィンドウと同じサイズだけ描画できればいいから、非表示のウィンドウ別に作れば良かったんだね。
Aero有効でもちゃんと表示できました。よしよし。
そのあとドラッグでウィンドウ移動させようとしたんだけど、UpdateLayeredWindowで位置を更新したら変になった。MoveWindowを呼ぶだけにしたらうまくいったが何なんだ一体。
UpdateLayeredWindowは変に癖があるなぁ。バグってるとも思えるような挙動なんですが。
さてさて、俺だったらこれが先にきてもおかしくないMac版。
というか先にMac版やったんですけどね、見事に失敗ですよええ。
ウィンドウ透過とNSOpenGLViewの透過はそんなに難しくなかった。
NSOpenGLViewの透過だけ、コンテキストの設定で本当に透過描画するオプションがあるのと、ViewのisOpaqueがNOを返すようにしないといけなかったのにはちょっと迷ったくらい。
だが、予想していたことではあるんだが、描画を透過させただけではマウスクリックに対するヒットは透過してくれないのだ。
いや、普通にCocoaの描画関数など使って描いた場合はヒットの透過もしてくれるんだが、OpenGLで直接描いたときには無理。
QuartzCompozerのViewを透過させたときにもこの問題はあったんだけど、そのときはほぼ四角い物しか描いてなかったんで、見なかったことにしたのだ。
いろいろ調べてみたけどどうにも無理っぽい。想像だけどヒット用のビットマップみたいなものをウィンドウマネージャ辺りが持ってて、OpenGL直描画ではそれを更新できないんじゃないかなぁ。
もちろんそのヒット用のビットマップを直接いじることは不可能。
それならば、クリックされた所が透明だったらクリック自体をシカトすればいいじゃないと調べてみたが、メッセージが渡ってきてるという時点で自分のウィンドウがアクティブになってるに決まってるじゃないですかー。
そんなこんなで挫折した所で時間切れで終了して、先にWindows版やってました。
でも挫折しっぱなしでもしかたないので、ちゃんとやりますよ。
結局はWindows版と同じようにやればいいのかな。
どこかにレンダリングコンテキスト作って、描画してglReadPixelsで取得。それからマスコット用のウィンドウにビットマップを描画してやれば大丈夫そうな気がする。っつーか駄目な理由が見当たらない。
描画はQuartz2Dでも大丈夫そう。というかCocoaの描画はQuartz2Dのラッピングされた物らしい。Quartz2Dのサーフェス(?)に描かないといけない所をOpenGL直描画だとすっとばすんだろうねぇ。
これをもっと早く試せば良かったんだが、RubyCocoaでやれる範囲でってかんがえてたら、glReadPixelsとかめんどくなってやらなかった失敗。
まあこれでCocoaに対する無駄っぽい知識が増えたのでよしとしよう。普通のCocoaの知識が無くて、無駄な知識しか無いのが困るんだが。