dlib C++ ライブラリ OpenGLサンプル

前回、dlib C++ ライブラリでOpenGLを使えるようにしたことを紹介しました。
前回から仕様を修正したので、使い方が少し変わりました。
OpenGL機能の実装のために、freeglutのソースを
拝借していますので、freeglut用のCOPYINGファイルもパッチの中に入れておきます。

↓差分パッチ+サンプルプログラム
バージョン15.8


base_windowに5つの関数を追加してあります。
・initialize_opengl
ウィンドウをOpenGLに対応させるために一度だけ呼び出す必要があります。
引数を1つとります。
定数の意味や使い方は、GLUT_*** が OPENGL_***になっていることを除いてはfreeglutと同様です。

・swap_buffers_opengl
この関数は引数なしで呼びます。機能はglutSwapBuffersと同様です。

・paint_opengl
再描画が必要となったときに呼び出されるコールバック関数です。
initialize_opengl関数を呼び出すと、paint関数の代わりにpaint_opengl関数が
呼び出されるようになります(paint関数は呼び出されなくなります)。

・begin_opengl
この関数には引数はありません。
end_openglとペアで使用します。
gl系の関数、及びswap_buffers_openglは、begin_openglとend_openglの間で呼び出す必要があります。
begin_opengl関数内部でmutexによるロックを施しています。
・end_opengl
この関数には引数はありません。
begin_openglとペアで使用します。
gl系の関数、及びswap_buffers_openglは、begin_openglとend_openglの間で呼び出す必要があります。
end_opengl関数内部で、begin_openglでlockしたmutexをunlockします。

サンプルプログラムのスクリーンショット
イメージ 1



関連
- dlib C++ Library 目次
- dlib C++ ライブラリ OpenGLサンプル
- dlib C++ライブラリでOpenGLを使えるようにした
- dlib C++ ライブラリ winmain関数について




もっちーの小部屋 自作のソフトを公開してます。
http://www.geocities.jp/mocchi_2003/index.html

dlib C++ライブラリでOpenGLを使えるようにした

dlib C++ライブラリでOpenGLを使えるようにしてみました。

本家が ver.15.8にバージョンアップしていましたので、ついでにバージョンも揃えました。

↓差分パッチ
バージョン15.8

base_windowに3つの関数を追加してあります。
・initialize_opengl
・swap_buffers_opengl
・paint_gl

base_windowの継承クラスのコンストラクタでinitialize_openglを呼び出すと、
そのウィンドウはOpenGL用のウィンドウに変化します。

・initialize_opengl
この関数は引数を1つ必要とします。
dlibのGUIOpenGLを使用するために一度呼び出す必要があります。
引数はgui_core/opengldefs.hで#defineされている定数の組み合わせです。
定数や実装はfreeglutのものを拝借しています。
(なのでfreeglut用のCOPYINGファイルもパッチの中に入れてあります)
定数の意味や使い方はfreeglutと同様です。

・swap_buffers_opengl
この関数は引数なしで呼びます。使い方はglutSwapBuffersと同様です。

・paint_gl
再描画が必要となったときに呼び出されるコールバック関数です。
initialize_opengl関数を呼び出すと、paint関数の代わりにpaint_gl関数が
呼び出されるようになります(paint関数は呼び出されなくなります)。
この中でOpenGL関数の描画処理を行います。
全てのgl関数はこの中でのみ呼び出してください。

サンプルは気が向いたときにまた、ということで…

使用する場合は、↓の本家サイトからソースをダウンロードして、差分パッチを
その中に上書きコピーした後コンパイルしてください。
http://dclib.sourceforge.net/




もっちーの小部屋 自作のソフトを公開してます。
http://www.geocities.jp/mocchi_2003/index.html

dlib C++ ライブラリ winmain関数について

dlib C++ ライブラリには、console版とgui版があります。

通常、C 及び C++ はmain関数から始まりますが、dlib C++ライブラリの
gui版を使うときは、main関数の代わりにwinmain関数を使います。
winmain関数の引数と戻り値の型は、↓のようになってます。

void winmain(int argc, char **argv);

winmain の中で、base_windowクラスを継承したユーザが定義するクラス(仮に
クラス名winとします)を↓のように呼び出すような使い方をします。

win *w = new win();

ソースを見て気づいたのですが、このwinmain関数、メインスレッドと別スレッドで
動くようにできています。一方、イベントループはメインスレッドで動きます。

このせいで、winクラスのコンストラクタが終了する前にwinクラス内のコールバック関数
が起動してしまうことがあるようなのでコールバック関数がコンストラクタの後に実行
される前提で組むことができないようです。
winクラスのコンストラクタに初期化処理を入れるときなど、注意する必要がありそうです。
追記:
勘違いでしたorz
winmain関数とイベントループは確かに別スレッドで動きますが、base_windowクラスのコン
ストラクタとイベントループをmutexでロックしていましたので、上の枠内のようなことは
起こらないようです。




もっちーの小部屋 自作のソフトを公開してます。
http://www.geocities.jp/mocchi_2003/index.html

dlib C++ライブラリ GUI部品のマルチバイト化

イメージ 1

dlib C++ライブラリのGUI部品をマルチバイト化して日本語の表示をできるように
してみました。

スクリーンショットはオリジナルのアーカイブに含まれているサンプル
gui_api_ex.cppを一部修正したものです(gui_api_ex_ja.cpp)
X11環境でこのサンプルをコンパイルする場合は、あらかじめ文字コード
それぞれの環境に合わせて変換してください。

↓差分パッチとサンプルプログラム gui_api_ex_ja.cpp
バージョン15.5
バージョン15.6
(vc2005でコンパイルしたlibファイルも入ってます)

更新履歴
08/22 1:00更新
 ・オリジナルのバージョンアップ(15.5 => 15.6)に追従
08/17 18:00更新
 ・'x'が表示されない問題の修正
 ・等幅フォントを使用するように変更

オリジナルのソースをダウンロードして差分パッチをその中に上書きコピーした後
コンパイルしてください。
http://dclib.sourceforge.net/




もっちーの小部屋 自作のソフトを公開してます。
http://www.geocities.jp/mocchi_2003/index.html ←パッチの最新版を置いてあります。

オープンソースでGPLでもLGPLでもなくてマルチプラットフォームなC/C++用GUIライブラリ

探してもなかなかいい感じのGUIライブラリがありません(T-T)

タイトルに書いた条件を全部満たしてるライブラリで最近新たに発見したものをひとつ紹介します。
- dlib C++ライブラリ
boostライセンスです。

GUIの他にも色々機能を持っているようです。
少し触ってみてわかったこと
・Win32とX11に対応している。
・all_gui.cpp が全部のソースをインクルードする構造になってる。
 つまり、all_gui.cppだけをコンパイルすることでライブラリが完成する。
メッセージループは最初のスレッドとは別スレッドで動くらしい。
07/09/23修正
winmain関数とメッセージループがそれぞれ異なるスレッドで動く。
GUI部品はCreateWindowやXCreateWindowで作るサブウィンドウを使わずに、
自力で描画している。確かJavaのSwingもそういう方法だったと思います。
・フォント内蔵(default_fontクラスにフォントデータがどっさりと)
GUI部品には一切日本語が使えない

日本語が使えないのが惜しいです。
ソースを見ても、1文字=1バイト決め打ちという感じで組んであります。




もっちーの小部屋 自作のソフトを公開してます。
http://www.geocities.jp/mocchi_2003/index.html

font_rendererバージョンアップ

font_rendererをバージョンアップしました。

バージョン 1.10 => 1.20
更新内容
・同じ条件で何回もレンダリングする際のパフォーマンスの向上(createメソッド)
・ascender,descenderも取得できるようにした
・バグ修正

createメソッドは,前回のレンダリングとフォントの条件(フォントの高さや装飾)が同じ場合,
フォントやウィンドウの再生成を省略するので,同じ条件で何回も呼び出すような使い方をするケースではパフォーマンスが向上します。 








もっちーの小部屋 自作のソフトを公開してます。
http://www.geocities.jp/mocchi_2003/index.html

窓助タッチの使い道

自作ソフト 窓助タッチの使い方の例

その1 ウィンドウを移動せずにデスクトップのアイコンを操作する


デスクトップのアイコンをダブルクリックしたい。だけど、
そのアイコンは今操作しているウィンドウの下側にある!

こんなとき、窓助タッチを使えば、ウィンドウを動かさずに
目的のアイコンのダブルクリックができますので、便利です。

イメージ 1

これは、表計算ソフト Gnumeric を操作している途中で調べ物を
したいと思い、ブラウザ Firefox を起動しようとしている状況です。

その2 ペイントでトレース


手持ちの写真や画像を使ってちょっとトレースしたい!だけど、
このパソコンにはペイントしか入っていない
とか、
お気に入りの画像編集ソフトを使いたいけどレイヤー機能のようなものを持ってない
といったとき、窓助タッチさえあればこの通り!
イメージ 2

これは、WindowsXP標準の画像ビューアに花の写真を表示させて、
ペイントでトレースしている状況です。
画像ビューアを窓助タッチで透過させて、裏側にペイントを置き、ペイントを
操作することでトレースを実現しています。



そのほかに、2枚の写真やPDF文書などの照合、というか、間違い探しなどにも
使えるかもしれませんね。

ほかに面白い使い方を思いついたら紹介できればと思います。