dlib C++ ライブラリ OpenGLサンプル
前回、dlib C++ ライブラリでOpenGLを使えるようにしたことを紹介しました。
前回から仕様を修正したので、使い方が少し変わりました。
OpenGL機能の実装のために、freeglutのソースを
拝借していますので、freeglut用のCOPYINGファイルもパッチの中に入れておきます。
前回から仕様を修正したので、使い方が少し変わりました。
OpenGL機能の実装のために、freeglutのソースを
拝借していますので、freeglut用のCOPYINGファイルもパッチの中に入れておきます。
base_windowに5つの関数を追加してあります。
・initialize_opengl
![イメージ 1](https://cdn-ak.f.st-hatena.com/images/fotolife/m/mocchi_2006/20190818/20190818140626.jpg)
関連
- dlib C++ Library 目次
- dlib C++ ライブラリ OpenGLサンプル
- dlib C++ライブラリでOpenGLを使えるようにした
- dlib C++ ライブラリ winmain関数について
・initialize_opengl
ウィンドウをOpenGLに対応させるために一度だけ呼び出す必要があります。
引数を1つとります。
定数の意味や使い方は、GLUT_*** が OPENGL_***になっていることを除いてはfreeglutと同様です。
・swap_buffers_opengl引数を1つとります。
定数の意味や使い方は、GLUT_*** が OPENGL_***になっていることを除いてはfreeglutと同様です。
この関数は引数なしで呼びます。機能はglutSwapBuffersと同様です。
・paint_opengl
再描画が必要となったときに呼び出されるコールバック関数です。
initialize_opengl関数を呼び出すと、paint関数の代わりにpaint_opengl関数が
呼び出されるようになります(paint関数は呼び出されなくなります)。
・begin_openglinitialize_opengl関数を呼び出すと、paint関数の代わりにpaint_opengl関数が
呼び出されるようになります(paint関数は呼び出されなくなります)。
この関数には引数はありません。
end_openglとペアで使用します。
gl系の関数、及びswap_buffers_openglは、begin_openglとend_openglの間で呼び出す必要があります。
begin_opengl関数内部でmutexによるロックを施しています。
・end_openglend_openglとペアで使用します。
gl系の関数、及びswap_buffers_openglは、begin_openglとend_openglの間で呼び出す必要があります。
begin_opengl関数内部でmutexによるロックを施しています。
この関数には引数はありません。
begin_openglとペアで使用します。
gl系の関数、及びswap_buffers_openglは、begin_openglとend_openglの間で呼び出す必要があります。
end_opengl関数内部で、begin_openglでlockしたmutexをunlockします。
サンプルプログラムのスクリーンショットbegin_openglとペアで使用します。
gl系の関数、及びswap_buffers_openglは、begin_openglとend_openglの間で呼び出す必要があります。
end_opengl関数内部で、begin_openglでlockしたmutexをunlockします。
![イメージ 1](https://cdn-ak.f.st-hatena.com/images/fotolife/m/mocchi_2006/20190818/20190818140626.jpg)
関連
- dlib C++ Library 目次
- dlib C++ ライブラリ OpenGLサンプル
- dlib C++ライブラリでOpenGLを使えるようにした
- dlib C++ ライブラリ winmain関数について
dlib C++ライブラリでOpenGLを使えるようにした
本家が ver.15.8にバージョンアップしていましたので、ついでにバージョンも揃えました。
・initialize_opengl
この関数は引数を1つ必要とします。
dlibのGUIでOpenGLを使用するために一度呼び出す必要があります。
引数はgui_core/opengldefs.hで#defineされている定数の組み合わせです。
定数や実装はfreeglutのものを拝借しています。
(なのでfreeglut用のCOPYINGファイルもパッチの中に入れてあります)
定数の意味や使い方はfreeglutと同様です。
この関数は引数を1つ必要とします。
dlibのGUIでOpenGLを使用するために一度呼び出す必要があります。
引数はgui_core/opengldefs.hで#defineされている定数の組み合わせです。
定数や実装はfreeglutのものを拝借しています。
(なのでfreeglut用のCOPYINGファイルもパッチの中に入れてあります)
定数の意味や使い方はfreeglutと同様です。
・paint_gl
再描画が必要となったときに呼び出されるコールバック関数です。
initialize_opengl関数を呼び出すと、paint関数の代わりにpaint_gl関数が
呼び出されるようになります(paint関数は呼び出されなくなります)。
この中でOpenGL関数の描画処理を行います。
全てのgl関数はこの中でのみ呼び出してください。
再描画が必要となったときに呼び出されるコールバック関数です。
initialize_opengl関数を呼び出すと、paint関数の代わりにpaint_gl関数が
呼び出されるようになります(paint関数は呼び出されなくなります)。
この中でOpenGL関数の描画処理を行います。
全てのgl関数はこの中でのみ呼び出してください。
サンプルは気が向いたときにまた、ということで…
関連
- dlib C++ Library 目次
- dlib C++ ライブラリ OpenGLサンプル
- dlib C++ ライブラリ winmain関数について
- dlib C++ ライブラリ GUI部品のマルチバイト化
dlib C++ ライブラリ winmain関数について
通常、C 及び C++ はmain関数から始まりますが、dlib C++ライブラリの
gui版を使うときは、main関数の代わりにwinmain関数を使います。
winmain関数の引数と戻り値の型は、↓のようになってます。
gui版を使うときは、main関数の代わりにwinmain関数を使います。
winmain関数の引数と戻り値の型は、↓のようになってます。
void winmain(int argc, char **argv);
winmain の中で、base_windowクラスを継承したユーザが定義するクラス(仮に
クラス名winとします)を↓のように呼び出すような使い方をします。
クラス名winとします)を↓のように呼び出すような使い方をします。
win *w = new win();
ソースを見て気づいたのですが、このwinmain関数、メインスレッドと別スレッドで動くようにできています。一方、イベントループはメインスレッドで動きます。
このせいで、winクラスのコンストラクタが終了する前にwinクラス内のコールバック関数 が起動してしまうことがあるようなのでコールバック関数がコンストラクタの後に実行 される前提で組むことができないようです。 winクラスのコンストラクタに初期化処理を入れるときなど、注意する必要がありそうです。追記:
勘違いでしたorz
winmain関数とイベントループは確かに別スレッドで動きますが、base_windowクラスのコン
ストラクタとイベントループをmutexでロックしていましたので、上の枠内のようなことは
起こらないようです。
関連
- dlib C++ Library 目次
- dlib C++ライブラリでOpenGLを使えるようにした
- dlib C++ ライブラリ winmain関数について
- dlib C++ ライブラリ GUI部品のマルチバイト化
dlib C++ライブラリ GUI部品のマルチバイト化
スクリーンショットはオリジナルのアーカイブに含まれているサンプル
gui_api_ex.cppを一部修正したものです(gui_api_ex_ja.cpp)
X11環境でこのサンプルをコンパイルする場合は、あらかじめ文字コードを
それぞれの環境に合わせて変換してください。
gui_api_ex.cppを一部修正したものです(gui_api_ex_ja.cpp)
X11環境でこのサンプルをコンパイルする場合は、あらかじめ文字コードを
それぞれの環境に合わせて変換してください。
関連
- dlib C++ Library 目次 ←パッチの最新版に関する情報はこちらから辿ってください。
- dlib C++ ライブラリ winmain関数について
- dlib C++ ライブラリ GUI部品のマルチバイト化
- オープンソースでGPLでもLGPLでもなくてマルチプラットフォームなC/C++用GUIライブラリ
オープンソースでGPLでもLGPLでもなくてマルチプラットフォームなC/C++用GUIライブラリ
探してもなかなかいい感じのGUIライブラリがありません(T-T)
GUIの他にも色々機能を持っているようです。
少し触ってみてわかったこと
・Win32とX11に対応している。
・all_gui.cpp が全部のソースをインクルードする構造になってる。
つまり、all_gui.cppだけをコンパイルすることでライブラリが完成する。
・メッセージループは最初のスレッドとは別スレッドで動くらしい。
・GUI部品には一切日本語が使えない
少し触ってみてわかったこと
・Win32とX11に対応している。
・all_gui.cpp が全部のソースをインクルードする構造になってる。
つまり、all_gui.cppだけをコンパイルすることでライブラリが完成する。
・メッセージループは最初のスレッドとは別スレッドで動くらしい。
07/09/23修正
winmain関数とメッセージループがそれぞれ異なるスレッドで動く。
・GUI部品はCreateWindowやXCreateWindowで作るサブウィンドウを使わずに、winmain関数とメッセージループがそれぞれ異なるスレッドで動く。
自力で描画している。確かJavaのSwingもそういう方法だったと思います。
・フォント内蔵(default_fontクラスにフォントデータがどっさりと)・GUI部品には一切日本語が使えない
日本語が使えないのが惜しいです。
ソースを見ても、1文字=1バイト決め打ちという感じで組んであります。
ソースを見ても、1文字=1バイト決め打ちという感じで組んであります。
関連
- dlib C++ Library 目次
- dlib C++ ライブラリ winmain関数について
- dlib C++ ライブラリ GUI部品のマルチバイト化
- オープンソースでGPLでもLGPLでもなくてマルチプラットフォームなC/C++用GUIライブラリ
font_rendererバージョンアップ
窓助タッチの使い道
自作ソフト 窓助タッチの使い方の例
デスクトップのアイコンをダブルクリックしたい。だけど、
そのアイコンは今操作しているウィンドウの下側にある!
そのアイコンは今操作しているウィンドウの下側にある!
こんなとき、窓助タッチを使えば、ウィンドウを動かさずに
目的のアイコンのダブルクリックができますので、便利です。
目的のアイコンのダブルクリックができますので、便利です。
手持ちの写真や画像を使ってちょっとトレースしたい!だけど、
このパソコンにはペイントしか入っていない
とか、
お気に入りの画像編集ソフトを使いたいけどレイヤー機能のようなものを持ってない
といったとき、窓助タッチさえあればこの通り!
![イメージ 2](https://cdn-ak.f.st-hatena.com/images/fotolife/m/mocchi_2006/20190818/20190818140635.jpg)
これは、WindowsXP標準の画像ビューアに花の写真を表示させて、
ペイントでトレースしている状況です。
画像ビューアを窓助タッチで透過させて、裏側にペイントを置き、ペイントを
操作することでトレースを実現しています。
このパソコンにはペイントしか入っていない
とか、
お気に入りの画像編集ソフトを使いたいけどレイヤー機能のようなものを持ってない
といったとき、窓助タッチさえあればこの通り!
![イメージ 2](https://cdn-ak.f.st-hatena.com/images/fotolife/m/mocchi_2006/20190818/20190818140635.jpg)
これは、WindowsXP標準の画像ビューアに花の写真を表示させて、
ペイントでトレースしている状況です。
画像ビューアを窓助タッチで透過させて、裏側にペイントを置き、ペイントを
操作することでトレースを実現しています。
そのほかに、2枚の写真やPDF文書などの照合、というか、間違い探しなどにも
使えるかもしれませんね。
使えるかもしれませんね。
ほかに面白い使い方を思いついたら紹介できればと思います。