openFrameworksの複数モニタ対応、或いは楽しいofxFenster

概要

openFrameworksを用いたマルチディスプレイ上で動くアプリケーションを作るときに、定番のAdd-onとしてofxFensterがあります。
これは広く使われていますが、一度でもofxFensterを使った物を作った人は、大抵「ofxFensterにはお世話になったし苦しめられた」みたいな感想を持っていることが多いです。
中身としてはBlenderのGhost( http://www.letworyinteractive.com/blendercode/d5/d2e/GHOSTPage.html )とGLUTに依存しています。
openFrameworksから使えるマルチウィンドウシステム用のadd-onみたいな物です。

僕はそれほど詳しくないですが、歴史的な経緯を含めて調べたのでまとめておきます。

結論

ofAppGLFWWindow win;
win.setMultiDisplayFullscreen(true);
ofSetupOpenGL(&win, 1920+1920,1080+1080, OF_FULLSCREEN);

こんな感じで良い。無理にofxFensterとか使わなくても良いと思います。

ofxFensterの歴史

つらい…

-openframeworks0.74

openFrameworksが一気に普及して、add-onがワシャワシャ出てきた ofxFensterもバリバリと開発されてドンドンissue出て、ちゃんと(?)ワークアラウンドも整備された

0.8-

changed default window manager from GLUT to GLFW とeventシステム周りがちょっと変わったので、ofxFensterもissueいっぱい出て枯れてきた

最近

作者が「ヨッシャなんか破壊的変更してGhost非依存でGLFWベースに書き換えるわ!!!」 みたいな事言って書き換えている最中。usage examplesとかもほとんど空っぽになってるので今使うのはちょっと怖い。
作者が「まあ開発中に安定板使いたければghostブランチ作っておく。それ使って」みたいな事言っています。

windows上でopenFrameworks0.8以上でofxFensterを使う

安定板扱いなので、ghostブランチのheadから持ってくる https://github.com/underdoeg/ofxFenster/tree/ghost/

ここに含まれる依存ライブラリ(ghost.lib)のビルドしたコンパイラが古いままなのでghost.libをビルドし直す。 ghostは https://github.com/underdoeg/ghost からチェックアウトしてVS2012でビルドし直す。
後は無限にwindowが生成されたらこんな感じで書き換える。 https://github.com/underdoeg/ofxFenster/commit/42a080e1457c6fab9d8046f31305d93022d6c50f

この使おうとしているghostブランチの古いofxfensterはGLUT依存で、最近のopenFrameworksはGLFW依存なので、openFrameworksの本体のsetup()の早い段階でおまじないとして glewInit(); を呼んでおくと良い(例えばフレームバッファ確保しようとしてaccess violation例外が出たら、これをしないとダメ)

そしてissueを眺めて地雷踏まない事を祈ります。 https://github.com/underdoeg/ofxFenster/issues?state=open

結論

Windowsつらい
openFrameworks周りのエコシステム、ProjectGeneratorやadd-on等で非常に素晴らしいけど、バージョンアップに追従していけないadd-onとかで酷いことになる。RubyのBundler相当のものが欲しい。