>

2014年9月4日木曜日

retina displayでAntTweakBarを表示すると異常に小さく表示されてカーソル位置も正しく認識されない件

ネット上に似たような問題についての書き込みの記事はちらほらあるが抜本的な対応がいまいちよく分からない。
https://github.com/memononen/nanovg/issues/12
https://groups.google.com/forum/#!topic/pupil-discuss/2Ga6aQWVoWQ

AntTweakBarの操作においてretinaディスプレイの画素シミュレーションがうまくいっていないことが原因。
マウスイベントから取るWindow上の位置は低解像度の値にシミュレートされた値だがglViewPortやAntTweakBarではretinaのフル解像度の値で描画している。なのでイベント発生時のコールバック関数内でresizeイベントやmouseイベントから取ってきた低解像度の値にシミュレートされた位置情報をretinaのフル解像度での値に直す(2倍する)した上でOpenGLやAntTweakBarの関数を呼ぶようにすることで対応。

対応の例
static void resizeCallback(GLFWwindow* window, int width, int height)
{
    TwWindowSize(width*2, height*2);

}

とりあえず動くが表示が小さいという問題は未解決。本当はretinaのシミュレーション機能に乗っ取った抜本的な対応方法(glViewPorttはwindowサイズではなくてframe bufferのサイズを設定して、AntTweakBarは二倍のサイズで描画する?)があると思う。抜本的な対応が分かる方いらっしゃいましたら是非コメントお願いします。

2014年9月2日火曜日

AntTweakBarをMac OSX 10.9でビルドしようとするとエラーが出る件

AntTweakBarをMac OSX 10.9でビルドしようと
$make -f Makefile.osx
を実行すると下のようなエラーが出て戸惑う。噂ではOSX 10.8から出るようなったらしい。

 TwOpenGLCore.o TwOpenGLCore.cpp
In file included from TwOpenGLCore.cpp:22:
./LoadOGLCore.h:149:24: error: conflicting types for 'glMultiDrawElements'ANT_GL_CORE_DECL(void, glMultiDrawElements, (GLenum mode, const GLsizei ...
                       ^./LoadOGLCore.h:34:36: note: expanded from macro 'ANT_GL_CORE_DECL'
        extern "C" { _Ret APIENTRY _Fct _Params; }
                                   ^/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:2836:13: note:       previous declaration is here
extern void glMultiDrawElements (GLenum mode, const GLsizei *count, GLen...
            ^In file included from TwOpenGLCore.cpp:22:
./LoadOGLCore.h:214:24: error: conflicting types for 'glShaderSource'ANT_GL_CORE_DECL(void, glShaderSource, (GLuint shader, GLsizei count, co...
                       ^./LoadOGLCore.h:34:36: note: expanded from macro 'ANT_GL_CORE_DECL'
        extern "C" { _Ret APIENTRY _Fct _Params; }
                                   ^/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:2923:13: note:       previous declaration is here
extern void glShaderSource (GLuint shader, GLsizei count, const GLchar* ...
            ^2 errors generated.
make: *** [TwOpenGLCore.o] Error 1
これは何かっていうと/System/Library/Frameworks/OpenGL.framework/Headers/gl.hで定義されている関数をAntTweakBarのAntTweakBar/src/TwOpenGLCore.hの中で参照しているんだけど関数の引数が合っていないよ!というエラーであり、どうやらいつかの更新でOSXに同梱されているgl.hの関数宣言に変更(といっても修飾子の軽微な変更)があったのが原因らしい。
そこで今のgl.h内の関数宣言に合わせてAntTweakBar/src/TwOpenGLCore.hの中身に次の二つの編集を加えれば良い。ファイル内の修正場所は関数名とかで検索して見つけてください。
  1. ANT_GL_CORE_DECL(void, glMultiDrawElements, (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* * indices, GLsizei primcount))

    ANT_GL_CORE_DECL(void, glMultiDrawElements, (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const * indices, GLsizei primcount))
    に修正。(引数indicesの修飾子に後付けのconstを追加。)
  2. ANT_GL_CORE_DECL(void, glShaderSource, (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length))

    ANT_GL_CORE_DECL(void, glShaderSource, (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length))
    に修正。(引数stringの修飾子に後付けのconstを追加。)
上記修正をしてからもう一回
$make -f Makefile.osx
でビルドすれば通るようになるはず。