[GLUI A GLUT-Based User Interface Library by Paul Rademacher Version 2.0] を日本語に翻訳する. 間違い等発見されましたら,連絡ください. 問題がある場合も,こっそり教えてください.
1 導入
1.1 概要
GLUI は,GLUT C++ ベースのユーザインターフェースライブラリを OpenGL へ提供します. GLUT 上で GLUI は動作するので,システムに依存しない GUI を書くことができます. GLUI ユーザインターフェース(以下 UI と記す)の機能には以下のようなものがあります.
- GLUT ツールキットに完全に統合されています.
- 1行のコードで新しい UI ウィンドウを簡単に作成します.
- 複数の UI ウィンドウのサポート.
- 以下のような標準的な UI コントロールを提供します:
- ボタン:
- チェックボックス:boolean 変数
- ラジオボタン:1つを選択する形式のオプション
- テキストボックス:文字列,整数,浮動小数点値の入力
- スピナー:整数,浮動小数点値を操作
- アークボールコントローラ:回転操作の入力
- トランスレーションコントローラ:X, Y, Z 値の入力
- リストボックス:
- 静的テキスト領域:文字列の貼り付け
- パネル:コントロールのグループ化
- ロールアウト:折りたたみできるパネル
- セパレータ:視覚的にコントロールを区別するための線
- 値が変化したときにコントロールはコールバックできます.
- 変数はコントロールにリンク可能で,値が変化したときに自動的に更新されます.
- コントロールは変数の変化を反映して自動的に同期されます.
- コントロールは変数が変化したとき GLUT Redisplay イベントのトリガとなります.
- コントロールのレイアウトとサイズは,自動的になされます.
- Tab キーでコントロールのフォーカスを循環できます.
1.2 背景
#省略
1.3 Version 2.0 で追加された機能
次の新しい機能とコントロールが追加されました.
- GLUI コントロールはメインウィンドウ内に配置できるようになりました. これによって,一つのウィンドウだけのグラフィックカードに対応できます. GLUI ウィンドウ領域は,メインウィンドウの上下左右のいずれかにドッキングできます.
- GLUI ウィンドウ,サブウィンドウを綺麗に破棄する関数.
- GLUI ウィンドウ,サブウィンドウを隠したり出現させたりする関数.
- すべての変数を同時に自動的に同期されせられる A sync_live_all() 関数.
- ロールアウト:画面の乱雑さを軽減するための折りたたみパネル.
- リストボックス:文字列のリストから項目を選ぶことをユーザに許可します.
- ローテーション,トランスレーションコントローラ:3次元の入力を簡単に行うために.
2 概要
GLUI は,簡単でパワフルな UI ライブラリです.この節では,主な機能の詳細を説明します.
2.1 簡単なプログラミングインターフェース
GLUI は,単純で最大のプログラミングをデザインされています.GLUI ウィンドウやコントロールは,1行のコードで作成できます.GLUIは自動的にサイズ変更と配置を行います.プログラマは明示的なXY座標や幅,高さなどのパラメータを与える必要がありません. GLUI は,APIでの多くのパラメータについてデフォルト値を提供します.これにより, NULL やダミーの値を与える必要がありません.例えば,チェックボックスを作るのにいくつかの方法があります.
GLUI *glui;
...
glui->add_checkbox("Click me");
//"Click me" という名前の単純なチェックボックスを加えます
glui->add_checkbox("Click me", &state );
//変数 state は,チェックボックスの変数値を反映して自動的に更新されます. (2.3 節を参照)
glui->add_checkbox( "Click me", state, 17, callback_fn );
//チェックボックスの状態が変化したとき,"live variable" に加えて,コールバック関数を呼び出し,値 "17" を渡します.
チェックボックスのデフォルトのサイズと位置は指定されていないいことに注意してください.GLUI は自動的にウィンドウ内にコントロールをレイアウトします.
2.2 GLUTとの完全な統合
GLUI は,GLUTの上で成り立っています.GLUT アプリケーションは,ほんのわずかな変更で UI ライブラリを使うことができます (これらの変更は後ほど節 2.5 で説明されます).一度統合されると,UI の存在は,GLUT アプリケーションを大抵透過します.
2.3 Live Variables (対応する日本語がわかりません.知っている方は教えてください.)
GLUI はコントロールの多くの型として "live variables" を割り当てます. これらの通常の C 変数は,ユーザが GLUI コントロールを操作したとき自動的に更新されます. 例えば,チェックボックスは int 型変数に関連付けられていたとすると,ユーザがコントロールのチェックをつけた(チェックを外した)場合に,1(0)が自動的に入ります. 編集可能なテキストコントロールは,live value として char 型の配列に保持されるでしょう,そして,ユーザがテキストボックスに何かを入力したとき,その文字は自動的にアプリケーションの char 配列にコピーされます. これにより,現在の値あるいはコンテンツを定義するために,プログラマが明示的にコントロールのステータスを問い合わせる必要がなくなります. さらに,GLUI ウィンドウは,インターフェース内の値が変化したときに GLUT redisplay message を他のウィンドウ(メイングラフィックウィンドウなど)へ送ることができます. これは,すべての live variables の新しい値を用いて自動的に,他のウィンドウの再描画を発生させます. 例えば,GLUI ウィンドウは,スクリーン上のオブジェクトの半径を操作するためのスピナーを持つことができます. ユーザがスピナーの値を変化させたとき,live value (float radius,と宣言しておきます)は自動的に更新され,メイングラフィックウィンドウは redisplay を送ります. グラフィックウィンドウは,最後のフレームで更新された現在の(更新された) radius 値を使って,再描画されます. live variables は,GLUI インターフェース透過性をアプリケーション休止状態になることを手助けします.
live variables は,ユーザがコントロールを操作したとき GLUI によって自動的に更新されますが,もしユーザが変数の値を直接変化させるとどうなるでしょうか? 例えば,もしアプリケーションが次のように radius を変えたとしたら:
radius = radius * .05; // Updates variable, but not control
以下のように GLUI API を通さないで:
radius_control->set_float_val( radius * .05 ); // Updates control also
明らかに,最初の方法は変数とスクリーン上のコントロールを同期させません.これを避けるために, live variables を同期させることができます.このプロシージャは, GLUI ウィンドウ上のすべての live variables の現在の値をチェックして,コントロールの現在の値を比較します.もしその2つが一致しない(ユーザが GLUI を呼ばずに live variables を変化させた)場合,コントロールは変数を反映して自動的に更新されます.したがって,変化の連続をメモリ上の変数にしておき,それから sync_live() という一つの関数を呼んで UI を同期させます:
radius = radius * .05; // Make changes to a group of variables that aperture = aperture + .1; // are linked to controls num_segments++; glui->sync_live(); // Update user interface to reflect these changes
もし live variables へのポインタがコントロール作成関数へ渡されたなら(例えば,add_checkbox() ),現在の変数の値はコントロールの初期値として使用されます.常にプロパティは, live variables (文字列を含む)をコントロール作成関数へ渡す前に,初期化することを覚えておいてください.
▲2.4 コールバック
GLUI は,コントロールの値が変化したときにコールバックを生成できます.新しいコントロールの作成上で,コールバックとして使用する関数を指定し,コントロールの値が変化するとき整数のIDを関数へ渡します.
▲2.5 スタンドアロン GLUI ウィンドウの使い方
GLUT アプリケーションに GLUI を統合することは,非常に簡単です.次のようなステップを行います.
- GLUI ライブラリ(例えば,Windows 用の glui32.lib)をリンクに付け加えます.正しい順番でライブラリを追加します: GLUI, GLUT, GLU, OpenGL
- #include "glui.h" というように GLUI ライブラリを使うすべてのソースにインクルードします.
- 通常の GLUT ウィンドウとポップアップメニュを普段どおりに作ります.メイングラフィックウィンドウの window id を保持するものを作り, GLUI ウィンドウが後で redisplay イベントを送れるようにします.
int window_id = glutCreateWindow( "Main gfx window" );
- 通常と同じように GLUT コールバックを登録します(Idle コールバックは除きます.後ほど説明します).
- GLUT idle コールバックに(既に宣言されてグローバルオブジェクトである)GLUI_Masterを登録します.あなたのアプリケーションの idle イベントとの衝突を避けて, GLUI ウィンドウが idle イベントの優先権を持つことを可能にするために.もし idle コールバックを持たないならば, NULL を渡してください.
GLUI_Master.set_glutIdleFunc( myGlutIdle );
あるいはGLUI_Master.set_glutIdleFunc( NULL );
- あなたの idle コールバック内で,レンダリングや redisplay イベントが発生する前に,明示的に現在の GLUT ウィンドウをセットしてください.そうしなければ,偶然 GLUI ウィンドウに redisplay を送ってしまうかもしれません.
void myGlutIdle( void ) { glutSetWindow(main_window); glutPostRedisplay(); } - 次の命令を使って GLUI ウィンドウを作ります:
GLUI *glui = GLUI_Master.create_glui( "name", flags, x, y );
flags, x, y は選択的引数であることに注意してください.もしそれらが指定されない場合,デフォルト値が使用されます.GLUI は,可能な限りデフォルト値を備えています. - GLUI ウィンドウへコントロールを追加します.例えば,チェックボックスと QUIT ボタンを追加するには,次のようにします:
glui->add_checkbox( "Lighting", &lighting ); glui->add_button( "Quit", QUIT_ID, callback_func );
- 各 GLUI ウィンドウへメイングラフィックウィンドウのIDを知らせます:
glui->set_main_gfx_window( window_id );
- 他の GLUT アプリケーションと同様に,標準的な GLUT メインイベントループを起動します.
glutMainLoop();
2.6 GLUI サブウィンドウの使い方
GLUI サブウィンドウを追加は,スタンドアロン GLUI ウィンドウを追加するのより少しだけ複雑なだけです.グラフィックアプリケーションと GLUI の所有するウィンドウ空間から,適当に働きあうのを確実にするために少しだけ追加的な作業が必要です.
- GLUI ライブラリ(例えば,Windows 用の glui32.lib)をリンクに付け加えます.正しい順番でライブラリを追加します: GLUI, GLUT, GLU, OpenGL
- #include "glui.h" というように GLUI ライブラリを使うすべてのソースにインクルードします.
- 通常の GLUT ウィンドウとポップアップメニュを普段どおりに作ります.メイングラフィックウィンドウの window id を保持するものを作り, GLUI ウィンドウが後で redisplay イベントを送れるようにします.
int main_win = glutCreateWindow( "Main gfx window" );
- 通常と同じように GLUT コールバックを登録しますが,Keyboard, Special, Mouse, Reshape, Idle コールバックは除きます.これら4つは, GLUI で登録しなければなりません(次で説明).
- 次の関数を用いて,GLUT Keyboard, Special, Mouse コールバックを登録します.
GLUI_Master.set_glutKeyboardFunc( myGlutKeyboard ); GLUI_Master.set_glutSpecialFunc( myGlutSpecial ); GLUI_Master.set_glutMouseFunc( myGlutMouse ); GLUI_Master.set_glutReshapeFunc( myGlutReshape );
ここで, "myGlut" 関数は,アプリケーションの各自の GLUT コールバックに置き換えてください. - GLUT idle コールバック(があるとすれば)を登録します.あなたのアプリケーションの idle イベントとの衝突を避け,GLUI ウィンドウが idle イベントの優先権をもつことを可能にするために.もし idle コールバックを持たないならば, NULL を渡してください.
GLUI_Master.set_glutIdleFunc( myGlutIdle );
あるいはGLUI_Master.set_glutIdleFunc( NULL );
- あなたの idle コールバック内で,レンダリングや redisplay イベントが発生する前に,明示的に現在の GLUT ウィンドウをセットしてください.そうしなければ,偶然 GLUI ウィンドウに redisplay を送ってしまうかもしれません.
void myGlutIdle( void ) { glutSetWindow(main_window); glutPostRedisplay(); } - GLUI_Master::create_glui_subwindow() 命令を使って GLUI サブウィンドウを作ります.例として,
GLUI *glui_subwin = GLUI_Master.create_glui_subwindow( main_win, GLUI_SUBWINDOW_RIGHT );これは,サブウィンドウを main_win で参照される GLUT ウィンドウの中に作ります. - 新しいサブウィンドウに,どのグラフィックウィンドウに対して redisplay イベントを送るのかを教えます.例えば,
glui_subwin->set_main_gfx_window( window_id );
- GLUI サブウィンドウにコントロールを追加します.
- さらにサブウィンドウを追加したい場合は, 8〜10 のステップを繰り返します.
- GLUI サブウィンドウを含む各グラフィックウィンドウのために, OpenGL viewport の設定時にサブウィンドウを補正する必要があります.これは,グラフィックウィンドウの Reshape コールバックの中へ,次のコードを追加することによってなされます:
int tx, ty, tw, th; GLUI_Master.get_viewport_area( &tx, &ty, &tw, &th ); glViewport( tx, ty, tw, th);
上のコードは,多くのアプリケーションで見られる標準的な glViewport( 0, 0, w, h ) の場所が使われていることが必要です.上のコードのショートカットとして,次のコードを使うこともできます:GLUI_Master.auto_set_viewport();
どちらも全く同じことをしています. - 他の GLUT アプリケーションと同様に,標準的な GLUT メインイベントループを起動します.
glutMainLoop();
2.7 コントロールの一覧
| コントロール型 | クラス名 | 用途 | Set/Get 値 | Live variable | コールバック(Yes/No) |
|---|---|---|---|---|---|
| パネル | GLUI_Panel | ボックス内にコントロールをグループ化. | - | - | N |
| コラム | GLUI_Column | コラム内にコントロールをグループ化. | - | - | N |
| ロールアウト | GLUI_Rollout | 折りたためるボックス内にコントロールをグループ化. | - | - | N |
| ボタン | GLUI_Button | ユーザアクションを実行します. | - | - | Y |
| チェックボックス | GLUI_Checkbox | ブール値を扱う. | get_int_val set_int_bal |
int | Y |
| ラジオグループ, ラジオボタン |
GLUI_RadioGroup, GLUI_RadioButton |
1つを選択する形式のオプションを扱う. | get_int_val set_int_bal |
int | Y |
| スタティックテキスト | GLUI_StaticText | プレーンテキストラベル. | set_text | - | N |
| 編集可能テキスト | GLUI_EditText | 編集可能で整数あるいは浮動小数点として任意に解釈されるテキスト.上限と下限を整数あるいは小数として指定できる. | get_int_val/set_int_val get_float_val/set_float_val get_text/set_text |
int float text |
Y |
| ローテーション | GLUI_Rotation | アークボールによるローテーション値の入力. | get_float_array_val | float[16] | Y |
| トランスレーション | GLUI_Translation | X,Y,Z値の入力 | get_x get_y get_z |
float[1] あるいは [2} | Y |
| スピナー | GLUI_Spinner | 数値の操作.シングルクリック,クリックホールド,クリック-ドラッグに対応.上限下限を指定できます. | get_int_val/set_int_val get_float_val/set_float_val |
int float |
Y |
| セパレータ | GLUI_Separator | 単純な水平線でコントロールを分けます. | - | - | N |
3 例
#include <GL/glut.h>
#include "glui.h"
void myGlutInit();
void myGlutKeyboard(unsigned char Key, int x, int y)
void myGlutMenu( int value )
void myGlutIdle( void )
void myGlutMouse(int button, int button_state, int x, int y )
void myGlutMotion(int x, int y )
void myGlutReshape( int x, int y )
void myGlutDisplay( void );
void control_cb( int ID );
. . .
void main(int argc, char* argv[])
{
int main_window;
/** Initialize GLUT and create window - This **/
/** is all regular GLUT code so far **/
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
glutInitWindowPosition( 50, 50 );
glutInitWindowSize( 300, 300 );
main_window = glutCreateWindow( "GLUI test app" );
glutKeyboardFunc( myGlutKeyboard );
glutDisplayFunc( myGlutDisplay );
glutReshapeFunc( myGlutReshape );
glutMotionFunc( myGlutMotion );
glutMouseFunc( myGlutMouse );
myGlutInit();
/** Now create a GLUI user interface window and add controls **/
GLUI *glui = GLUI_Master.create_glui( "GLUI", 0 );
glui->add_statictext( "Simple GLUI Example" );
glui->add_separator();
glui->add_checkbox( "Wireframe", &wireframe, 1, control_cb );
GLUI_Spinner *segment_spinner =
glui->add_spinner( "Segments:",GLUI_SPINNER_INT, &segments );
segment_spinner->set_int_limits( 3, 60, GLUI_LIMIT_WRAP );
GLUI_EditText *edittext =
glui->add_edittext( "Text:", GLUI_EDITTEXT_TEXT, text );
glui->add_column(true); /** Begin new column - 'true' indicates **/
/* * a vertical bar should be drawn **/
GLUI_Panel *obj_panel = glui->add_panel ( "Object Type" );
GLUI_RadioGroup *group1 =
glui->add_radiogroup_to_panel(obj_panel,&obj,3,control_cb);
glui->add_radiobutton_to_group( group1, "Sphere" );
glui->add_radiobutton_to_group( group1, "Torus" );
glui->add_button( "Quit", 0,(GLUI_Update_CB)exit );
/** Tell GLUI window which other window to recognize as the main gfx window **/
glui->set_main_gfx_window( main_window );
/** Register the Idle callback with GLUI (instead of with GLUT) **/
GLUI_Master.set_glutIdleFunc( myGlutIdle );
/** Now call the regular GLUT main loop **/
glutMainLoop();
}
▲
4. API
GLUI ライブラリは,主に3つのクラスからなります:GLUI_Master_Object, GLUI, GLUI_Control.GLUI_Master と名づけられた,一つのグローバルな GLUI_Master_Object オブジェクトがあります.すべての GLUI ウィンドウの生成は,このオブジェクトを通してなされます.これは, GLUI ライブラリに単一グローバルオブジェクトを備えるすべてのウィンドウを追跡させます. GLUI_Master は,GLUT idle 関数をセットすることや,現在の GLUI バージョンを検索するためにも使用されます.
4.1 ウィンドウ
この節では,ウィンドウの作成と操作に関する関数を説明します.ここに示す関数は,次の2つのクラスに属しています:GLUI_Master_Object, GLUI.GLUI_Master_Object クラスのすべてのメンバ関数は,GLUI_Master という名前のグローバルオブジェクトから起動されなければならないことに気をつけてください.GLUI のすべての関数は GLUI_Master.create_glui() から戻ってくる GLUI ポインタによって起動されなければなりません.例えば:
float version = GLUI_Master.get_version(); GLUI *glui_window = GLUI_Master.create_glui( "GLUI" ); glui_window->add_StaticText( "Hello World" );▲
4.1.1 初期化
get_version
GLUI のバージョンを返します.
- Usage
- float GLUI_Master_Object::get_version( void );
- 戻り値
- 現在の GLUI のバージョン
create_glui
新しい UI ウィンドウを作成します.
- Usage
- GLUI *GLUI_Master_Object::create_glui( char *name, int flags=0, int x=-1, int y=-1 );
- name
- GLUI ウィンドウの名前
- flags
- フラグの初期化.現在のバージョンではフラグは定義されていません.
- x, y
- ウィンドウ位置の初期化.初期サイズは指定されていないことに注意してください.なぜなら,GLUI は自動的にウィンドウサイズをすべてのコントロールがフィットするようにリサイズするからです.
- 戻り値
- 新しいGLUI ウィンドウへのポインタ
create_glui_subwindow
GLUT グラフィックウィンドウの中に,新しい UI サブウィンドウを作成します.
- Usage
- GLUI *GLUI_Master_Object::create_glui_subwindow( int window, int position );
- window
- 存在する GLUT グラフィックウィンドウの ID
- position
- GLUT グラフィックウィンドウに対する新しいサブウィンドウを組み込む位置.この変数は,次の値をとる:
- GLUI_SUBWINDOW_RIGHT
- GLUI_SUBWINDOW_LEFT
- GLUI_SUBWINDOW_TOP
- GLUI_SUBWINDOW_BOTTOM
- あなたはあなたは同じ相対位置でサブウィンドウのどの数字でも配置できる;この場合,複数のサブウィンドウが単純にもう一つの上方で積み重ねられる.例えば,もし2つのサブウィンドウが同じ GLUT ウィンドウ内に作成され,そして両方とも GLUI_SUBWINDOW_TOP が使用されたとき,2つのサブウィンドウは,最初のサブウィンドウが2番目のサブウィンドウの上になる形で,ウィンドウの上方に配置されます.
- 戻り値
- 新しい GLUI サブウィンドウへのポインタ
set_glutIdleFunc
標準の GLUT idle コールバック f() を GLUI で登録します. GLUI は,自分自身の Idle コールバックを GLUT で登録しますが,ユーザの関数 f() は各 Idle イベントの後にコールされます.従ってすべての Idle イベントはコールバック f() によって受け取られますが, GLUI がそれ自身の Idle 処理を行った後だけです.これは,ほとんどの GLUT アプリケーションにとって適応されます:標準の GLUT 関数の glutIdleFunction() を使うのではなく,単純にアイドルコールバックをこの関数で登録してください.そうすれば, GLUT アプリケーションは通常どおりに動作するでしょう.ただ一つ注意すべきことは,GLUT の仕様上,現在のウィンドウはアイドルコールバック内で未定義であることです.したがって,あなたのアプリケーションは,どの GLUT Redisplay イベントが発生してレンダリングされる前に,明示的に現在のウィンドウをセットする必要があります:
int main_window;
void myGlutIdle( void )
{
/* ... */
if ( glutGetWindow() != main_window )
glutSetWindow( main_window );
glutPostRedisplay();
}
これによって, Redisplay メッセージが GLUI ウィンドウではなくグラフィックウィンドウへ正しく送信されることを確実に行います.
- Usage
- void GLUI_Master_Object::set_glutIdleFunc(void (*f)(void));
- f
- GLUT アイドルイベントコールバック関数
set_glutReshapeFunc
set_glutKeyboardFunc
set_glutMouseFunc
set_glutSpecialFunc
標準 GLUT コールバックを GLUI で登録します. GLUI は,自身の処理のためにこれらのイベントを受け取る必要がありますが,イベントはアプリケーションへ渡されます.これらの関数は,GLUI サブウィンドウが使用されるときに,標準 GLUT コールバック登録関数の代わりに,使用されなければなりません.しかし,これらの関数は,スタンドアロンの GLUI ウィンドウを使用しているときでも,正しく動作するでしょう.
- Usage
- void GLUI_Master_Object::set_glutReshapeFunc( void (*f)(int width, int height) );
- void GLUI_Master_Object::set_glutKeyboardFunc( void (*f)(unsigned char key, int x, int y) );
- void GLUI_Master_Object::set_glutMouseFunc( void (*f)(int, int, int, int) );
- void GLUI_Master_Object::set_glutSpecialFunc( void (*f)(int key, int x, int y) );
- f
- GLUT イベントコールバック関数
set_main_gfx_window
GLUI ウィンドウへ,どの(標準 GLUT )ウィンドウがメイングラフィックウィンドウであるかを教えます.GLUI ウィンドウ内のコントロールが値を変化させたとき,Redisplay 要求をこのメイングラフィックウィンドウへ送ります.
- Usage
- void GLUI::set_main_gfx_window( int window_id );
- window_id
- メイングラフィックウィンドウの ID .glutCreateWindow() の結果,あるいはメイングラフィックウィンドウが作られた直後に glutGetWindow() で手に入ります.
4.1.2 ビューポート管理
get_view_port_area
現在のウィンドウの描画エリアの寸法と位置を測定します.この関数は, GLUI サブウィンドウが使用されるときに必要とされ,サブウィンドウはウィンドウの領域の一部を使用するので,グラフィックアプリケーションは上書きすべきではありません.この関数の使用例は,セクション2.6を見てください.
- Usage
- void GLUI_Master_Object::get_viewport_area( int *x, int *y, int *w, int *h );
- x, y, w, h
- 関数が戻ってきたとき,これらの変数は,現在の描画エリアの x, y, width, height を保持します.これらの値は,その後, OpenGL ビューポートコマンド glViewport() へ渡されるべきです.
auto_set_viewport
現在のウィンドウへビューポートを自動的にセットします.この一つの関数は,次の一連のコマンドと同じ物です:
int x, y, w, h; GLUI_Master.get_viewport_area( &x, &y, &w, &h ); glViewport( x, y, w, h );
- Usage
- void GLUI_Master_Object::auto_set_viewport( void );
4.1.3 ウィンドウ管理
get_glut_window_id
GLUI ウィンドウの 標準 GLUT ウィンドウ ID を返します.
- Usage
- int GLUI::get_glut_window_id( void );
- 戻り値
- GLUI ウィンドウの GLUT ウィンドウ ID
enable, disable
GLUI ウィンドウを動作可能,動作不可能(灰色)にする.GLUI ウィンドウが disable のとき,コントロールはアクティブになりません.
- Usage
- void GLUI::enable( void );
- void GLUI::disable( void );
hide
GLUI ウィンドウ,サブウィンドウを隠します.隠されたウィンドウ,サブウィンドウは,ユーザ入力を受け取ることが出来ません.
- Usage
- void GLUI::hide( void );
show
隠していた GLUI ウィンドウ,サブウィンドウを再び見えるようにします.
- Usage
- void GLUI::show( void );
close
GLUI ウィンドウ,サブウィンドウを完全に破棄します.
- Usage
- void GLUI::close( void );
close_all
すべての GLUI ウィンドウ,サブウィンドウを完全に破棄します.この関数は,次に示す例のようなコードで呼ばれます:
GLUI_Master.close_all();
- Usage
- void GLUI_Master_Object::close_all( void );
sync_live
GLUI ウィンドウに関連付けられたすべての Live variables を同期させます.これは, Live variables の現在の値を読み,そして関連付けられたコントロールにこれらの変数を反映します. Live variables と同期についてのより多くの情報は,セクション2.3を見てください.
- Usage
- void GLUI::sync_live( void );
sync_live_all
すべての GLUI ウィンドウ内のすべての Live variables を同期させます.この関数は,各 GLUI ウィンドウ,サブウィンドウを通じて, sync_live() 関数を起動します.この関数は,グローバルオブジェクト GLUI_Master から呼びだされます:
GLUI_Master.sync_live_all();
- Usage
- void GLUI_Master_Object::sync_live_all( void );
4.2 コントロール
すべてのコントロールは,基本クラス GLUI_Control から派生したものです.そのため,それらはすべて同じように作成され,操作されます.セクション0の残りが,各タイプのコントロールを作成あるいは管理するために使用される特定の機能をリストしている一方,セクション4.2.1は,一部あるいはすべてのコントロールによって共有された関数を一覧にしています.
各タイプのコントロールを作成するための2つの関数があります.一つは, add_control() という名前(control という部分は,特定のコントロールの名前に置き換わります)になっており,もう一方は, add_control_to_panel() という形式に従います.最初の形式はウィンドウのトップレベルにコントロールを配置するのに対して,2番目の形式は,パネル内にコントロールを配置します.パネルは,関連するコントロールと共にグループ化して使用され,パネルは他のパネル内へネストできます.
多くのコントロールは, Live variables (セクション2.3)そして/あるいは コールバック(セクション2.4)を許可します. Live variables (GLUI ライブラリにより自動的に更新されるアプリケーションの変数)を使用するためには,コントロールが作成されるときに,変数(int, float, character string)へのポインタを add_control 関数へ単純に渡します.コールバックを使用するためには,整数型の ID とコールバック関数の両方を渡します.コールバック関数は,コントロールの値が変化したときに,一つのパラメータとして ID で,呼び出されるでしょう.複数のコントロールは,コントロールはコールバック関数を共有することができます.コールバック関数は,どのコントロールがそれを起動したのかを決定するために ID を使用します.
コールバック内あるいは他の時では,コントロールの現在値はコントロールのタイプに依存した関数 get_int_val(),get_float_val(), get_text()のうちの1つで検索することができます.例えば,編集可能テキストボックスが入力された文字に依存して浮動小数点,整数,テキスト型のデータを持つのに対して,チェックボックスは整数値だけを保持します.コントロールの値は,set_int_val, set_float_val, set_text() の一つを使って,セットすることがきます.それぞれのコントロールに対するドキュメントを,これらの関数がサポートするものを以下にリスト化しています.
▲4.2.1 共通関数
set_name
ボタン,チェックボックスなどのラベルをセットします.
- Usage
- void GLUI_Control::set_name( char *name );
- name
- コントロールのラベル
set_w, set_h
コントロールの最小の幅/高さをセットします. set_w() は,編集可能テキストコントロールやスピナー内の編集可能テキストボックスエリアのサイズを大きくすることに主に役立ちます.
- Usage
- void GLUI_Control::set_w( int new_size );
- void GLUI_Control::set_h( int new_size );
get, set
コントロールの値を取得やセットをします.それぞれのコントロールが読み込める値,セットできる値の種類は,個々のコントロールの説明を参照してください.
- Usage
- int GLUI_Control::get_int_val( void );
- 戻り値
- 現在のコントロールの整数値
- float GLUI_Control::get_float_val( void );
- 戻り値
- 現在のコントロールの浮動小数点値
- void GLUI_Control::get_float_array_val( float *float_array_ptr );
- 戻り値
- 戻り値はありませんが, float_array_ptr という配列に浮動小数点値がセットされます.正しいサイズの配列へのポインタとなる float_array_ptr を与えるように気をつけてください(例えば,ローテーションコントロールには 16bit の浮動小数点が必要です).
- char *GLUI_Control::get_text( void );
- 戻り値
- コントロールの文字列値へのポインタ.この文字列を set_text を使って直接変更しないでください.
- void GLUI_Control::set_int_val( int int_val );
- void GLUI_Control::set_float_val( float float_val );
- void GLUI_Control::set_float_array_val( float *float_array_ptr );
- void GLUI_Control::set_text( char *text );
- int_val
- コントロールの新しい整数値
- float_val
- コントロールの新しい浮動小数点値
- float_array_val
- コントロールの新しい浮動小数点の配列の値
- text
- コントロールの新しいテキスト.これは, set_name() を使ったボタンやチェックボックスのラベルではなく,編集可能テキストボックスあるいはスピナーの編集可能テキストです.
disable, enable
個々のコントロールを動作不可能(灰色にする)あるいは動作可能にします.動作不可能にしたコントロールは,アクティブにしたり使用したりすることはできません.ラジオグループを動作不可能にすると,それに含まれるすべてのラジオボタンは動作不可能になり,パネルを動作不可能にすると,(他のパネルを含んでいる)それに含まれるすべてのコントロールはすべて動作不可能になります.動作可能にするときも同様です.
- Usage
- void GLUI_Control::enable( void );
- void GLUI_Control::disable( void );
set_alignment
コントロールの配置を,左,右,中央のいずれかにセットします.
- Usage
- void GLUI_Control::set_alignment( int align );
- align
- 新しい位置.GLUI_ALIGN_CENTER, GLUI_ALIGN_RIGHT, GLUI_ALIGN_LEFT のどれか一つを指定してください.
4.2.2 パネル
パネルは,コントロールをグループ化するのに使われます.エンボスの四角形がパネル内のすべてのコントロールを取り囲みます.パネルに名前を与えれば,その四角形の左上に表示されます.パネルは,ネストできます.
![Panel with name [glui_pnl000.png(606 byte)]](img/glui_pnl000.png)
- 名前付きパネル
![Panel without name [glui_pnl001.png(365 byte)]](img/glui_pnl001.png)
- 名前なしパネル
![Two nested panels [glui_pnl002.png(1038 byte)]](img/glui_pnl002.png)
- ネストしたパネル
add_panel, add_panel_to_panel
新しいパネルを GLUI ウィンドウへ追加します.他のパネル内へネストします.
- Usage
- GLUI_Panel *GLUI::add_panel( char *name, int type = GLUI_PANEL_EMBOSSED );
- GLUI_Panel *GLUI::add_panel_to_panel( GLUI_Panel *panel, char *name, int type = GLUI_PANEL_EMBOSSED );
- name
- パネルに表示するラベルです. もし指定しなければ,ラベルは表示されません.
- type
- パネルの描画方法を指定します.
選択できるのは次のどれかです:
- GLUI_PANEL_EMBOSSED
- 一段下がったボックスとしてパネルを描画します(デフォルト)
- GLUI_PANEL_RAISED
- 浮き上がったボックスとして描画します.名前は表示されません.
- GLUI_PANEL_NONE
- ボックスを描きません.囲まれていないボックスを作りたいときに使用します.
- panel
- ネストする対象のパネルを指定します.
- 戻り値
- 新しいパネルコントロールへのポインタ.
4.2.3 ロールアウト
ロールアウトは,関連するコントロールをグループ化するのに用いる,折りたたみ可能なパネルです.折りたたむことによって,スクリーンの乱雑さを大きく軽減できます.ロールアウトは,パネルの代わりに用いることができます.それは,フォーム add_control_to_panel() のすべての関数は,パネルとロールアウトのどちらでも受け取ることができます.ロールアウトは,他のロールアウトやパネルの中にネストできます.同様に,パネルはロールアウトの中にネストできます.

- 展開したロールアウト

- 折りたたんだロールアウト

- ネストされたロールアウト
add_rollout, add_rollout_to_panel
GLUI ウィンドウへ新しいロールアウトを加えます.他のロールアウトやパネルの中へネストすることも可能です.
- Usage
- GLUI_Rollout *GLUI::add_rollout( char *name, int open = true );
- GLUI_Rollout *GLUI::add_rollout_to_panel( GLUI_Panel *panel, char *name, int open = true );
- name
- パネルに表示するラベルです.もし指定しなければ,ラベルは表示されません.
- open
- true ならば,ロールアウトは展開した状態が初期値となります.false ならば,折りたたんだ状態が初期値となります.
- panel
- 配置対象のパネル(あるいはロールアウト)を指定します.
- 戻り値
- 新しいロールアウトコントロールへのポインタ.
4.2.4 コラム
コントロールは,垂直方向のコラムにグループ化されます.関数 GLUI::add_column() は,新しいコラムを開始し,すべてのコントロールは,その後(他のコラムが追加されるまで)この新しいコラム内へ配置されます.コラムは,任意のレイアウトで作成されることを許可するパネルの中に追加することができます.
- Example:
![Example 1 image [glui_clmn000.png(1449 byte)]](img/glui_clmn000.png)
- glui->add_checkbox("foo");
glui->add_checkbox("bar");
glui->add_column(true);
glui->add_checkbox("Hello");
glui->add_checkbox("World!");
![Example 2 image [glui_clmn001.png(2066 byte)]](img/glui_clmn001.png)
- glui->add_checkbox("foo");
glui->add_checkbox("bar");
GLUI_Panel *panel = glui->add_panel( "Panel" );
glui->add_checkbox_to_panel(panel, "Hello");
glui->add_column_to_panel(panel, true);
glui->add_checkbox_to_panel(panel, "World!");
![Example 3 image [glui_clmn002.png(983 byte)]](img/glui_clmn002.png)
- glui->add_checkbox( "A" );
glui->add_column( false );
glui->add_checkbox( "B" );
glui->add_column( false );
glui->add_checkbox( "C" );
add_column, add_column_to_panel
GLUI ウィンドウ内に新しいコラムを開始する.パネル内に作ることも可能.
- Usage
- void GLUI::add_column( int draw_bar = true );
- void GLUI::add_column_to_panel( GLUI_Panel *panel, int draw_bar = true );
- draw_bar
- true ならば,コラムの境界に垂直方向のバーが描かれます.
- panel
- コラムを配置するパネル(あるいはロールアウト)を指定します.
- 戻り値
- 新しいボタンコントロールへのポインタ.
4.2.5 ボタン
ボタンは,アプリケーション内のイベントのトリガとしてコールバックと共に使用されます.
![Button [glui_bttn000.png(472 byte)]](img/glui_bttn000.png)
- ボタン
![Button nested within panel [glui_bttn001.png(851 byte)]](img/glui_bttn001.png)
- パネル内にネストされたボタン
add_button, add_button_to_panel
GLUI ウィンドウへ新しいボタンを追加します.パネル(あるいはロールアウト)の中にネストすることも可能です.
- Usage
- GLUI_Button *GLUI::add_button( char *name, int id=-1, GLUI_Update_CB callback=NULL );
- GLUI_Button *GLUI::add_button_to_panel( GLUI_Panel *panel, char *name, int id=-1, GLUI_Update_CB callback=NULL );
- name
- ボタンの名前
- id
- callback が定義されていたら,この整数値が渡される.
- callback
- ボタンが押されたときに呼び出される(一つの int 型の引数をとる)コールバック関数へのポインタ.
- panel
- ボタンがネストされる存在するパネル(あるいはロールバック)を指定する.
- 戻り値
- 新しいボタンコントロールへのポインタ
4.2.6 チェックボックス
チェックボックスは,論理型変数を扱うために使用されます.それらは,0 か 1 の値をとります.現在のチェックボックスの値は, GLUI_Checkbox::get_int_val() で読み取ることができ, GLUI_Checkbox::set_int_val() でセットすることができます.
![Checkbox [glui_chck000.png(497 byte)]](img/glui_chck000.png)
- チェックボックス
![Checkbox nested within panel [glui_chck001.png(911 byte)]](img/glui_chck001.png)
- パネル内にネストされたチェックボックス
add_checkbox, add_checkbox_to_panel
- Usage
- GLUI_Checkbox *GLUI::add_checkbox( char *name, int *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- GLUI_Checkbox *GLUI::add_checkbox_to_panel( GLUI_Panel *panel, char *name, int *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- name
- チェックボックス
- live_var
- int 型変数へのポインタ.トリガが働いたとき,この変数は,自動的にチェックボックスの値(0 か 1)で更新されます.
- id
- callback が定義されているならば,この整数値が渡されます.
- callback
- チェックボックスの状態が変化したときに呼び出される(一つの int 型の引数をとる)コールバック関数へのポインタ.コールバックは,上でリスト化された id の値を渡されます.
- panel
- チェックボックスをネストする現在のパネル(あるいはロールアウト)を指定します.
- 戻り値
- 新しいチェックボックスコントロールへのポインタ.
4.2.7 ラジオボタン
ラジオボタンは,選択式のオプションを扱うために使用されます.ラジオボタンは,関連付けたラジオグループ内でのみ存在します.まずグループが作られてから,それにボタンが追加されます.グループに追加された順番で,0番から始まる番号がラジオボタンに割り当てられます.選択されたボタンは, GLUI_RadioGroup::get_int_val() で決定することができ,GLUI_RadioGroup::set_int_val() でセットすることができます.
![Radio group with 3 radio buttons [glui_radio000.png(811 byte)]](img/glui_radio000.png)
- 3つのラジオボタンを備えたラジオグループ
![Radio group with 3 radio buttons, nested within panel [glui_radio001.png(1173 byte)]](img/glui_radio001.png)
- 3つのラジオボタンを備えたラジオグループを,パネル内にネストしています.
add_radiogroup, add_radiogroup_to_panel
- Usage
- GLUI_RadioGroup *GLUI::add_radiogroup( int *live_var=NULL, int user_id=-1, GLUI_Update_CB callback=NULL );
- GLUI_RadioGroup *GLUI::add_radiogroup_to_panel( GLUI_Panel *panel, int *live_var=NULL, int user_id=-1, GLUI_Update_CB callback=NULL );
- panel
- ラジオボックスをネストするパネル(あるいはロールアウト)を指定します.
- live_var
- int 型変数へのポインタを選択します.選択されたラジオボタンの番号で自動的に更新されます.ボタンは,グループに追加された順番で 0 から順に番号付けされます.
- id
- callback が定義されているならば,新しいラジオボタンを選択したときに,この整数値が渡されます.
- callback
- 異なるラジオボタンを選択したときに呼び出される(一つの int 型の引数をとる)コールバック関数へのポインタ.コールバックは,上でリスト化された id の値を渡されます.どのボタンが選択されたのかをコールバック内で定義するために GLUI_RadioGroup::get_int_val() を使います.
- 戻り値
- 新しいラジオグループへのポインタ.
add_radiobutton_to_group
- Usage
- GLUI_RadioButton *GLUI::add_radiobutton_to_group( GLUI_RadioGroup *group, char * name );
- group
- ラジオボタンを加えるラジオグループを指定します.
- name
- ラジオボタンの名前.
- 戻り値
- 新しいラジオボタンへのポインタ.
4.2.8 静的テキスト(ラベル)
静的テキストコントロールは, GLUI ウィンドウ内に単純なテキストラベルを表示するために使用されます.表示されている文字は, GLUI_StaticText::set_text() を用いて変更することができます.
![Static text [glui_stxt000.png(392 byte)]](img/glui_stxt000.png)
- 静的テキスト
![Static text nested within panel [glui_stxt001.png(833 byte)]](img/glui_stxt001.png)
- パネル内にネストされた静的テキスト
add_statictext, add_statictext_to_panel
- Usage
- GLUI_StaticText *GLUI::add_statictext( char *name );
- GLUI_StaticText *GLUI::add_statictext_to_panel( GLUI_Panel *panel, char * name );
- name
- 表示するテキスト.
- panel
- 静的テキストを追加するパネル(あるいはロールアウト)を指定します.
- 戻り値
- 新しい静的テキストコントロールへのポインタ.
4.2.9 編集可能テキストボックス(エディットボックス)
編集可能テキストボックスは,普通の文字列,整数値,浮動小数点値を入力するために使用されます. 整数値を指定された EditText ボックスは,数字とマイナス記号のみを受け付けます. 浮動小数点値を指定された EditText は,数字とマイナス記号と小数点のみを受け付けます. コントロールキーと左右キーを同時に使用して,単語の前後へ移動できます. HOME キー( END キー)はカーソルをテキストエリアの最初(最後)へ移動させます. EditText コントロールは,SHIFT キーとカーソル移動キーの併用,あるいはマウスによる文字列の選択をサポートしています. EditText ボックスの現在のテキストは, GLUI_EditText::get_text() を用いて取得することができます. コントロールに整数値が保持されている場合は GLUI_EditText::get_int_val() ,浮動小数点値ならば GLUI_EditText::get_float_val() を用いて取得できます. GLUI_EditText::set_text(), GLUI_EditText::set_int_val(), GLUI_EditText::set_float_val() を使って値をセットすることもできます.
![Editable text boxes [glui_edtxt000.png(1446 byte)]](img/glui_edtxt000.png)
- 編集可能テキストボックス
![Editable text boxes nested within panel [glui_edtxt001.png(1860 byte)]](img/glui_edtxt001.png)
- パネル内にネストされた編集可能テキストボックス
add_edittext, add_edittext_to_panel
新たなエディットボックスを GLUI ウィンドウに追加します.
- Usage
- GLUI_EditText *GLUI::add_edittext( char *name, int data_type=GLUI_EDITTEXT_TEXT, coid *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- GLUI_EditText *GLUI::add_edittext_to_panel( GLUI_Panel *panel, char *name, int data_type=GLUI_EDITTEXT_TEXT, coid *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- name
- 表示するラベル.
- data_type
- エディットボックス コントロールに入力するデータ型.次の値が認められている:
- GLUI_EDITTEXT_TEXT
- デフォルト:通常のテキスト入力
- GLUI_EDITTEXT_INT
- 整数入力
- GLUI_EDITTEXT_FLOAT
- 浮動小数点入力
- live_var
- 指定されているならば,(少なくとも sizeof(GLUI_String) の大きさの)キャラクタ型配列,int 型変数あるいは float 型変数のいずれかへのポインタでなければなりません. この変数の型は, data_type の値に依存します. その文字列,整数または浮動小数点は,ユーザが値を変えたときに変更されます.
- id
- callback が定義されていれば,エディットボックス コントロールのテキストが変更されたときに,この整数が渡されます.
- callback
- エディットボックスのテキストが変更されたときに呼ばれるコールバック関数へのポインタ.コールバックには,上述した 1 つの int 型の引数 'id' が渡されます.
- panel
- セパレータを追加する既存の GLUI パネル(あるいはロールアウト).
- 戻り値
- 新たなエディットボックス コントロールへのポインタ
set_int_limits, set_float_limits
これらの関数は,エディットボックスに許可された整数あるいは浮動小数点の値の上限と下限を決めます.
- Usage
- void GLUI_EditText::set_int_limits(int low, int high, int limit_type = GLUI_LIMIT_CLAMP);
- void GLUI_EditText::set_float_limits(float low, float high, int limit_type = GLUI_LIMIT_CLAMP);
- low
- 許可された型の下限.
- high
- 許可された型の上限
- limit_type
- 値域外の値の扱いの方法. GLUI_LIMIT_CLAMP は,値域外の値を単に上限または下限へクランプします(境界値に留める). GLUI_LIMIT_WRAP は,下限より低い場合は上限へ,上限より高い場合は下限へセットします. GLUI_LIMIT_WRAP は,エディットボックスではその用途が限られていますが, スピナーでは,範囲内で連続的な繰り返しを提供するために用いられます(例えば,0〜360 の範囲の回転量を連続的に増加させたりすることができます).
4.2.10 スピナー
スピナーは,整数あるいは浮動小数点をエディットする 2 つの矢印のついたテキストボックスで,現在の値を増加あるいは減少させます. 矢印は,3つの方法で働きます: 矢印を 1 回クリックすると,1 ステップ単位でスピナーの値が増減します. クリックしたままだと,スピナーの値が連続的に増減します. マウスのクリック&ドラッグで,マウスの動きの上下で,値が増減します. スピナーの増減の比率は,SHIFT キーと CTRL キーで変動します. 最初に矢印をクリックをするときにSHIFT を押した状態だとステップ量が 100 倍に増加します. CTRL を押した状態だと,通常の 1/100 になります.
現在の値は,データストアの型に依存して GLUI_Spinner::get_int_val() あるいは GLUI_Spinner::get_float_val() のどちらかで受け取ることができます. GLUI_Spinner::set_int_val() あるいは GLUI_Spinner::set_float_val() を用いてセットします.
![Int and float spinners [glui_spn000.png(1330 byte)]](img/glui_spn000.png)
- 整数型と浮動小数点型のスピナー
![Int and float spinners nested within panel [glui_spn001.png(1680 byte)]](img/glui_spn001.png)
- パネルにネストした整数型と浮動小数点型のスピナー
add_spinner, add_spinner_to_panel
新たなスピナーを GLUI ウィンドウに追加します.
- Usage
- GLUI_Spinner *GLUI::add_spinner( char *name, int data_type=GLUI_SPINNERINT, void *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- GLUI_Spinner *GLUI::add_spinner_to_panel( GLUI_Panel *panel, char *name, int data_type=GLUI_SPINNERINT, void *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- name
- 表示するラベル.
- data_type
- スピナーコントロールに入力するデータ型.次の値が認められている:
- GLUI_SPINNER_INT
- 整数入力
- GLUI_SPINNER_FLOAT/dt>
- 浮動小数点入力
- live_var
- 指定されているならば,int 型あるいは float 型どちらかの変数へのポインタでなければなりません. この変数の型は, data_type の値に依存します. 整数または浮動小数点は,ユーザが値を変えたときに変更されます.
- id
- callback が定義されていれば,スピナーの値が変更されたときに,この整数が渡されます.
- callback
- スピナーの値が変更されたときに呼ばれるコールバック関数へのポインタ.コールバックには,上述した 1 つの int 型の引数 'id' が渡されます.
- panel
- セパレータを追加する既存の GLUI パネル(あるいはロールアウト).
- 戻り値
- 新たなスピナー コントロールへのポインタ
set_int_limits, set_float_limits
これらの関数は,エディットボックスに許可された整数あるいは浮動小数点の値の上限と下限を決めます.
- Usage
- void GLUI_Spinner::set_int_limits(int low, int high, int limit_type = GLUI_LIMIT_CLAMP);
- void GLUI_Spinner::set_float_limits(float low, float high, int limit_type = GLUI_LIMIT_CLAMP);
- low
- 許可された型の下限.
- high
- 許可された型の上限
- limit_type
- 値域外の値の扱いの方法. GLUI_LIMIT_CLAMP は,値域外の値を単に上限または下限へクランプします(境界値に留める). GLUI_LIMIT_WRAP は,下限より低い場合は上限へ,上限より高い場合は下限へセットします. これは,範囲内で連続的な繰り返しを提供するために用いることができます(例えば,0〜360 の範囲の回転量を連続的に増加させたりすることができます).
set_speed
この関数は,ボタンが押されたとき,あるいはクリックされたときのスピナーの変化の割合を調整します. この関数は,速いマシンあるいは遅いマシンなどでスピナーの応答性を調整するために使用されます. つまり,とても高速なマシンでは,この速度は 1.0 以下の値にセットする必要があります. 同様に,とても遅いマシンあるいは更新レートが遅いアプリケーションでは,速度はインターフェースのレスポンスをよくするために,ある程度高い値をセットする必要があります.
- Usage
- void GLUI_Spinner::set_speed( float speed );
- speed
- スピナーの変化の割合. デフォルトは 1.0 . 大きな値は高速に,小さな値は遅く変化することを示します.
4.2.11 セパレータ
セパレータは,単なる水平線です. コントロールを,グループに分けるときに使用します.
![Separator [glui_sprtr000.png(178 byte)]](img/glui_sprtr000.png)
- セパレータ
![Separator nested within panel [glui_sprtr001.png(495 byte)]](img/glui_sprtr001.png)
- パネルにネストされたセパレータ
add_separator, add_separator_to_panel
セパレータを GLUI ウィンドウに追加します.
- Usage
- void GLUI::add_separator( void );
- void GLUI::add_separator_to_panel( GLUI_Panel *panel );
- panel
- セパレータを追加する既存の GLUI パネル(あるいはロールアウト).
- 戻り値
- -
4.2.12 回転コントロール [Rotation Controls]
回転コントロールは,アークボール コントロールによって,アプリケーションにローテーション入力を可能にします. このコントロールは,チェック模様のテクスチャの張られた球体として表示され,ユーザは直接これを操作します. 現在のコントロールの回転は,4x4 回転行列で表現される 16 要素の float 型の配列としてアプリケーションに渡されます. この配列は,関数 glMultiMatrix() を用いてオブジェクトを回転させるために,そのまま OpenGL へ渡すことができます. このコントロールは純粋に(移動やスケーリングのない)回転のみを扱うので,4x4 行列の転置(transpose)はそれの逆行列(inverse)と同じであることに注意してください.
16 個の float は,2 つの方法でアプリケーションから取り出すことができます. 最も簡単な方法は,アプリケーションのオプションのコールバックを持たせて, GLUI に live array を自動的にセットすることです. つまり,回転コントロールが作られたときに,アプリケーションは GLUI に 16 個の float 配列を与えます. そしてユーザがアークボールを回転させている間,この配列は自動的に更新されます. 回転行列を(live variables)取り出す 2 つめの方法は,関数 GLUI_Rotation::get_float_array_val() を用いることです(セクション 4.2.1 を参照). 同様に,現在のコントロールの回転は,16 要素の float 配列へのポインタを引数とする GLUI_Rotation::set_float_array_val() を使ってセットできます.
16 要素の float 配列が live variables として新しい回転コントロールへ渡されたとき,コントロールはこの配列から初期回転を取ります(4x4 行列として解釈します). したがって,live array は,GLUI_Rotation::add_rotation() 関数に渡される前に,単位行列で初期化されている必要があります:
float array[16] = { 1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0 };
代わりに,コントロールとそれに関連付けられた live array は,回転コントロールを生成したあとで, GLUI_Rotation::reset() を呼ぶことで単位行列に初期化されます.
回転コントロールは, CTRL キーを押したままにすると,水平方向のみの動きに制限されます. また, ALT キーを押したままにすると,垂直方向のみの回転となります.
回転コントロールは,マウスボタンを離したあとも回転を維持する設定にすることもできます. これを有効にするには,関数 GLUI_Rotation::set_spin() を用います. 回転維持はパフォーマンス重視のアプリケーションでは,無効にすべきです(デフォルトでは無効です).
![Rotation control [glui_rot000.png(2048 byte)]](img/glui_rot000.png)
- 回転コントロール
add_rotation, add_rotation_to_panel
新たな回転コントロールを GLUI ウィンドウに追加します.
- Usage
- GLUI_Rotation *GLUI::add_rotation( char *name, float *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- GLUI_Rotation *GLUI::add_rotation_to_panel( GLUI_Panel *panel, char *name, float *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- name
- 表示するラベル.
- live_var
- もし NULL でないならば,float 型 16 要素の配列へのポインタでなければなりません. 注意:もし 16 float 以下の配列が指定された場合,アプリケーションはクラッシュする, この配列は,内部的に 4x4 の回転行列として扱われます.
- id
- callback が NULL でないならば,コールバック関数は,ユーザが回転コントロールを操作したとき,この整数の ID が渡されます.
- callback
- NULL でないならば,1 つの int 型の引数で戻り値のない関数を指さなければなりません. この関数は,コントロールを回転すると呼ばれます(そして,上で与えられる 1 つの id 値を渡されます).コールバックは,上でリスト化された id の値を渡されます.どのエントリが選択されたのかをコールバック内で決定するために GLUI_Listbox::get_int_val() を使います.
- panel
- 既存の GLUI パネル(あるいはロールアウト)にこのコントロールを加えます.
- 戻り値
- 新しい回転コントロールへのポインタ.
get_float_array_val, set_float_array_val
現在の回転を受け取ったり,セットしたりします.
- Usage
- void GLUI_Rotation::get_float_array_val( float *array_ptr );
- void GLUI_Rotation::set_float_array_val( float *array_ptr );
- array_ptr
- 16 要素の float 型配列へのポインタです.
- 戻り値
- -
set_spin
アークボールの回転の減衰要素を設定します. 高い値は減衰が小さいです. 最大値 1.0 を指定すると,アークボールは減衰なしとなり,一度回転させると回転しつづけます. 最小値 0.0 を指定すると,惰性で転がらなくなります. 一般的に減衰要素の値として, 0.95〜0.99 を指定します. アプリケーションのパーフォーマンスに影響をあたえるため,デフォルトで無効にされていることに注意してください.
- Usage
- void GLUI::Rotation::set_spin( float damping_factor );
- damping_factor
- 0〜1 の範囲の浮動小数点値を指定します. 0.0 を指定した場合,無効になります. 1.0 を指定した場合,アークボールは減速せずに回転しつづけます.
- 戻り値
- -
reset
コントロールの回転をリセットします(回転行列を単位行列にセットします). 減衰要素(set_spin を参照)は,この関数では変化しません.
- Usage
- void GLUI::Rotation::reset( void );
- 戻り値
- -
4.2.13 トランスレーション コントロール
トランスレーション コントロールは,スクリーン上の矢印をクリックすることで 3D オブジェクトの X, Y, Z 値を操作する機能をユーザに提供します. SHIFT キーを押しながら操作することで,トランスレーションの割合は変化し,高速に動かすことが可能です(100倍早くなります). また,CTRL キーを押した場合は,ゆっくりと動きます(100倍遅くなります). 関数 GLUI_Translation::set_scalling() によって,全ての動作の移動比率をセットできます.
4 種類のトランスレーション コントロールを以下に示します. XY コントロールを使うとき,ALT キーを押しながら水平矢印あるいは垂直矢印をクリックすることで,移動方向を 1 つ(X あるいは Y のどちらか)に制限できます.
![XY control [glui_trans000.png(1365 byte)]](img/glui_trans000.png)
- XY コントロール
![X control[glui_trans001.png(1054 byte)]](img/glui_trans001.png)
- X コントロール
![Y control[glui_trans002.png(1003 byte)]](img/glui_trans002.png)
- Y コントロール
![Z control[glui_trans003.png(1161 byte)]](img/glui_trans003.png)
- Z コントロール
add_translation, add_translation_to_panel
新たなトランスレーション コントロールを GLUI ウィンドウに追加します.
- Usage
- GLUI_Translation *GLUI::add_translation( char *name, int trans_type, float *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- GLUI_Translation *GLUI::add_translation_to panel( GLUI_Panel *panel, char *name, int trans_type, float *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- name
- 表示するラベル.
- trans_type
- このコントロールが提供するトランスレーションのタイプを指定します.
選択肢は次のものがあります.
- GLUI_TRANSLATION_XY
- X と Y のトランスレーションを提供
- GLUI_TRANSLATION_X
- X のみのトランスレーションを提供
- GLUI_TRANSLATION_Y
- Y のみのトランスレーションを提供
- GLUI_TRANSLATION_Z
- Z のみのトランスレーションを提供
- live_var
- もし NULL でないならば,float 型配列へのポインタでなければなりません. この配列の大きさは,トランスレーションのタイプに依存します. XY トランスレーションタイプの場合,その配列の大きさは 2 でなければなりません(最初の要素には X 位置,2 番目の要素には Y 位置が対応します). XY 以外のトランスレーションタイプの場合,配列の大きさは 1 でなければなりません(1つの要素をもつ配列). この要素は,選んだトランスレーション コントロールに依存した X, Y, Z のいずれかの位置に対応します.
- id
- callback が NULL でないならば,コールバック関数は,ユーザがトランスレーション コントロールを操作したとき,この整数の ID が渡されます.
- callback
- NULL でないならば,1 つの int 型の引数で戻り値のない関数を指さなければなりません. この関数は,コントロールがトランスレーションされると呼ばれます(そして,上で与えられる 1 つの id 値を渡されます).コールバックは,上でリスト化された id の値を渡されます.どのエントリが選択されたのかをコールバック内で決定するために GLUI_Listbox::get_int_val() を使います.
- panel
- 既存の GLUI パネル(あるいはロールアウト)にこのコントロールを加えます.
- 戻り値
- 新しいトランスレーション コントロールへのポインタ.
get_x, get_y, get_z
set_x, set_y, set_z
特定のトランスレーションコントロールの X, Y, Z 値は,特別な get, set 関数を用いて,直接読み書きされます. これらは,他のコントロールで使われる標準的な get_float_val(), set_float_val() 関数の代わりに使われます. get_x() は,GLUI_TRANSLATION_XY あるいは GLUI_TRANSLATION_X のいずれか一方のコントロールのみに使用することに注意してください. get_y() も,同様です. get_z() は,GLUI_TRANSLATION_Z コントロールのみに使用します. set 関数も,同じように適用します.
- Usage
- float GLUI_Translation::get_x( void );
- float GLUI_Translation::get_y( void );
- float GLUI_Translation::get_z( void );
- //
- void GLUI_Translation::set_x( float x );
- void GLUI_Translation::set_y( float y );
- void GLUI_Translation::set_z( float z );
set_speed
この関数は,ユーザのマウスの動きに対するトランスレーション コントロールの速度をどれくらいにするのかを決めます. ユーザの入力したすべてのトランスレーションは,アプリケーションに渡される前に,まずこの速度要素が乗算されます. とても遅いトランスレーションを必要とするアプリケーションは,速度に 1.0 以下の小さな数値をセットすべきです. 大きなトランスレーションを必要とするアプリケーションには,速度要素に大きな数値をセットすべきです. 速度値のデフォルト値は,1.0 です.
- Usage
- void GLUI_Translation::set_speed( float speed_factor );
- speed_factor
- アプリケーションにトランスレーションを渡す前にすべてのトランスレーションに乗算される値.
4.2.14 リストボックス
リストボックス コントロールは,テキストオプションのセットからユーザに選択させるコントロールを提供します.ユーザが,リストボックスをクリックしたとき,テキストエントリのリストがドロップダウンし,その中の 1 つをユーザが選択します.現在の選択されたているテキストエントリが,リストボックス内に表示されます.
リストボックス内の各テキストエントリは,数値 ID に関連付けられています.この ID は,テキストエントリをリストボックスに加えるときに明示的に割り当てます.選択されているエントリは, GLUI_Listbox::get_int_val() によって得られます.また, GLUI_Listbox::set_int_val() によってセットすることもできます.
![Listbox [glui_lst000.png(918 byte)]](img/glui_lst000.png)
- リストボックス
![Listbox, selected [glui_lst001.png(1692 byte)]](img/glui_lst001.png)
- 選択された状態のリストボックス
add_listbox, add_listbox_to_panel
新たなリストボックスを GLUI ウィンドウに加えます.
- Usage
- GLUI_Listbox *GLUI::add_listbox( char *name, void *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- GLUI_Listbox *GLUI::add_listboxto_panel( GLUI_Panel *panel, char *name, void *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- name
- 表示するラベルです.
- live_var
- int 型変数へのポインタを選択します.リストボックス内で選択されたテキストエントリの数値 ID で自動的に更新されます.
- id
- このリストボックスのための ID です.callback が定義されているならば,新しいリストボックス エントリを選択したときに,この整数値がコールバックへ渡されます.
- callback
- 異なるエントリがを選択したときに呼び出される(一つの int 型の引数をとる)コールバック関数へのポインタ.コールバックは,上でリスト化された id の値を渡されます.どのエントリが選択されたのかをコールバック内で決定するために GLUI_Listbox::get_int_val() を使います.
- panel
- 既存の GLUI パネル(あるいはロールアウト)にこのコントロールを加えます.
- 戻り値
- 新しいリストボックス コントロールへのポインタ.
add_item
新たなエントリを既存のリストボックスに加えます.
- Usage
- int GLUI_Listbox::add_item( int id, char *text );
- id
- このエントリの数値 ID .これは,GLUI_Listbox::get_int_val() の戻す,あるいは GLUI_Listbox::set_int_val() でセットする整数値です.
- text
- このエントリのテキストラベル.この文字列は 300 文字以内でなければなりません.
- 戻り値
- リストボックスにエントリが追加された場合は true,それ以外は false.
delete_item
新たなエントリを既存のリストボックスに加えます.
- Usage
- int GLUI_Listbox::delete_item( int id );
- int GLUI_Listbox::delete_item( char *text );
- id
- このエントリの数値 ID .これは,GLUI_Listbox::get_int_val() の戻す,あるいは GLUI_Listbox::set_int_val() でセットする整数値です.
- text
- このエントリのテキストラベル.この文字列は 300 文字以内でなければなりません.
- 戻り値
- リストボックスにエントリが見つかり,削除に成功した場合は true,それ以外は false.
5. 使い方のアドバイス
- GLUT ではなく, GLUI でアイドルコールバックを登録してください. つまり, GLUI はアイドルイベントを受け取ることができません(一方が他方をオーバーライドしてしまうので,GLUI と GLUT の両方でアイドルコールバックを登録しないようにしてください). レンダリングや GLUT redisplay イベントを送る前に,アイドルコールバック内の現在のウィンドウをチェックし,もし必要ならばメイングラフィックウィンドウをセットしてください. なぜなら, GLUT はアイドルコールバック関数が呼ばれる時に,どちらが現在のウィンドウになるのかを保証しないからです.
- もしアイドルコールバックを持たないならば, NULL または _Master.set_glutIdleFunc() を渡してください.
- もし live variable が使用されるなら, GLUI はそれらの値をコントロールの初期値として持ちます.
GLUI へそれらを渡す前に,適当な値で live variable を初期化を行ってください.
例えば,次のコードは,チェックボックスを不正な値(1でも0でもない値)で初期化してしまうかもしれません.
int some_var; //This variable may contain any integer value glui->add_checkbox( "Some Var", &some_var );
代わりに,次のように書くべきです:int some_var = 1; //Or zero, if appropriate glui->add_checkbox( "Some Var", &some_var );
- 編集可能テキストコントロールへ渡される文字列バッファは,少なくとも sizeof(GLUI_String) の大きさでなければなりません. そうしなければ,そのバッファを上書きした際に,セグメンテーション障害が生じるでしょう.
- 静的な文字列の中へ,編集可能テキストの live variable を渡さないでください.
GLUI はその空間をユーザに入力されたテキストのバッファとして使おうと試すでしょう.
glui->add_edittext( "Text", GLUI_EDITTEXT_TEXT, "Hello!" ); //This is incorrect, as "Hello!" is a static string char buffer[sizeof(GLUI_String)]; glui->add_edittext( "Text", GLUI_EDITTEXT_TEXT, buffer ); //This will work without crashing GLUI_String buffer2; glui->add_edittext( "Text", GLUI_EDITTEXT_TEXT, buffer2 ); //This will also work - live varable にローカル変数のポインタを渡さないでください. このポインタはローカル関数外で不正となり,おそらくセグメンテーション障害が生じるでしょう.
- 様々な set/get 関数(set_int_val, set_float_val, set_text, get_...)は,コントロールの現在の値を変更し,そのコントロールに割り当てられた live variablse の更新もします. それらはコールバックを発生させません.
- 標準の GLUT ウィンドウ(一般にメイングラフィックウィンドウ)を関連付けるために,GLUI::set_main_gfx_window() を呼び出すことを忘れないでください. これによって,コントロールの値が変更されたときに GLUI がグラフィックウィンドウの redisplay イベントを発生させることを許可します.
- GLUI コールバックの中で, GLUI::set_main_gfx_window() で定義されたカレント GLUT ウィンドウがメイングラフィックウィンドウにセットされます. もし定義されていない場合,カレントウィンドウは,定義されていません. OpenGL 関数が実行される前に,必要なウィンドウを明示的にセットしてください.