GLUI の説明@RML

menu


Table of Contents

  1. Introduction
    1. Overview
    2. Background
    3. What's New in Version 2.0
  2. Overview
    1. Simple Programming Interface
    2. Full Integration with GLUT
    3. Live Variables
    4. Callbacks
    5. Usage for standalone GLUI windows
    6. Usage for GLUI subwindows
    7. List of Controls
  3. Example
  4. API
    1. Windows
      1. Initialization
      2. Viewport Management
      3. Window management
    2. Controls
      1. Common Functions
      2. Panels
      3. Rollouts
      4. Columns
      5. Buttons
      6. Checkboxes
      7. Radio Buttons
      8. Static Text
      9. Editable Text Boxes
      10. Spinners
      11. Separators
      12. Rotation Controls
      13. Translation Controls
      14. Listboxes
  5. Usage Advice

[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 と記す)の機能には以下のようなものがあります.

1.2 背景

#省略

1.3 Version 2.0 で追加された機能

次の新しい機能とコントロールが追加されました.


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 を統合することは,非常に簡単です.次のようなステップを行います.

  1. GLUI ライブラリ(例えば,Windows 用の glui32.lib)をリンクに付け加えます.正しい順番でライブラリを追加します: GLUI, GLUT, GLU, OpenGL
  2. #include "glui.h" というように GLUI ライブラリを使うすべてのソースにインクルードします.
  3. 通常の GLUT ウィンドウとポップアップメニュを普段どおりに作ります.メイングラフィックウィンドウの window id を保持するものを作り, GLUI ウィンドウが後で redisplay イベントを送れるようにします.
    int window_id = glutCreateWindow( "Main gfx window" );
    
  4. 通常と同じように GLUT コールバックを登録します(Idle コールバックは除きます.後ほど説明します).
  5. GLUT idle コールバックに(既に宣言されてグローバルオブジェクトである)GLUI_Masterを登録します.あなたのアプリケーションの idle イベントとの衝突を避けて, GLUI ウィンドウが idle イベントの優先権を持つことを可能にするために.もし idle コールバックを持たないならば, NULL を渡してください.
    GLUI_Master.set_glutIdleFunc( myGlutIdle );
    
    あるいは
    GLUI_Master.set_glutIdleFunc( NULL );
    
  6. あなたの idle コールバック内で,レンダリングや redisplay イベントが発生する前に,明示的に現在の GLUT ウィンドウをセットしてください.そうしなければ,偶然 GLUI ウィンドウに redisplay を送ってしまうかもしれません.
    void myGlutIdle( void )
    {
        glutSetWindow(main_window);
        glutPostRedisplay();
    }
    
  7. 次の命令を使って GLUI ウィンドウを作ります:
    GLUI *glui = GLUI_Master.create_glui( "name", flags, x, y );
    
    flags, x, y は選択的引数であることに注意してください.もしそれらが指定されない場合,デフォルト値が使用されます.GLUI は,可能な限りデフォルト値を備えています.
  8. GLUI ウィンドウへコントロールを追加します.例えば,チェックボックスと QUIT ボタンを追加するには,次のようにします:
    glui->add_checkbox( "Lighting", &lighting );
    glui->add_button( "Quit", QUIT_ID, callback_func );
    
  9. 各 GLUI ウィンドウへメイングラフィックウィンドウのIDを知らせます:
    glui->set_main_gfx_window( window_id );
    
  10. 他の GLUT アプリケーションと同様に,標準的な GLUT メインイベントループを起動します.
    glutMainLoop();
    

2.6 GLUI サブウィンドウの使い方

GLUI サブウィンドウを追加は,スタンドアロン GLUI ウィンドウを追加するのより少しだけ複雑なだけです.グラフィックアプリケーションと GLUI の所有するウィンドウ空間から,適当に働きあうのを確実にするために少しだけ追加的な作業が必要です.

  1. GLUI ライブラリ(例えば,Windows 用の glui32.lib)をリンクに付け加えます.正しい順番でライブラリを追加します: GLUI, GLUT, GLU, OpenGL
  2. #include "glui.h" というように GLUI ライブラリを使うすべてのソースにインクルードします.
  3. 通常の GLUT ウィンドウとポップアップメニュを普段どおりに作ります.メイングラフィックウィンドウの window id を保持するものを作り, GLUI ウィンドウが後で redisplay イベントを送れるようにします.
    int main_win = glutCreateWindow( "Main gfx window" );
    
  4. 通常と同じように GLUT コールバックを登録しますが,Keyboard, Special, Mouse, Reshape, Idle コールバックは除きます.これら4つは, GLUI で登録しなければなりません(次で説明).
  5. 次の関数を用いて,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 コールバックに置き換えてください.
  6. GLUT idle コールバック(があるとすれば)を登録します.あなたのアプリケーションの idle イベントとの衝突を避け,GLUI ウィンドウが idle イベントの優先権をもつことを可能にするために.もし idle コールバックを持たないならば, NULL を渡してください.
    GLUI_Master.set_glutIdleFunc( myGlutIdle );
    
    あるいは
    GLUI_Master.set_glutIdleFunc( NULL );
    
  7. あなたの idle コールバック内で,レンダリングや redisplay イベントが発生する前に,明示的に現在の GLUT ウィンドウをセットしてください.そうしなければ,偶然 GLUI ウィンドウに redisplay を送ってしまうかもしれません.
    void myGlutIdle( void )
    {
        glutSetWindow(main_window);
        glutPostRedisplay();
    }
    
  8. GLUI_Master::create_glui_subwindow() 命令を使って GLUI サブウィンドウを作ります.例として,
    GLUI *glui_subwin = GLUI_Master.create_glui_subwindow( main_win,
                                                           GLUI_SUBWINDOW_RIGHT );
    
    これは,サブウィンドウを main_win で参照される GLUT ウィンドウの中に作ります.
  9. 新しいサブウィンドウに,どのグラフィックウィンドウに対して redisplay イベントを送るのかを教えます.例えば,
    glui_subwin->set_main_gfx_window( window_id );
  10. GLUI サブウィンドウにコントロールを追加します.
  11. さらにサブウィンドウを追加したい場合は, 8〜10 のステップを繰り返します.
  12. 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();
    
    どちらも全く同じことをしています.
  13. 他の GLUT アプリケーションと同様に,標準的な GLUT メインイベントループを起動します.
    glutMainLoop();
    

2.7 コントロールの一覧

GLUI コントロール一覧 [glui_000.png 9527(byte)]
GLUI コントロールの一覧表
コントロール型 クラス名 用途 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 例

GLUI ウィンドウ例 [glui_001.png 3040(byte)]

#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)]
名前付きパネル
Panel without name [glui_pnl001.png(365 byte)]
名前なしパネル
Two nested panels [glui_pnl002.png(1038 byte)]
ネストしたパネル
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() のすべての関数は,パネルとロールアウトのどちらでも受け取ることができます.ロールアウトは,他のロールアウトやパネルの中にネストできます.同様に,パネルはロールアウトの中にネストできます.

glui_rllout000.png(2200 byte)
展開したロールアウト
glui_rllout001.png(719 byte)
折りたたんだロールアウト
glui_rllout002.png(3729 byte)
ネストされたロールアウト
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)]
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)]
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)]
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)]
ボタン
Button nested within panel [glui_bttn001.png(851 byte)]
パネル内にネストされたボタン
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)]
チェックボックス
Checkbox nested within panel [glui_chck001.png(911 byte)]
パネル内にネストされたチェックボックス
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)]
3つのラジオボタンを備えたラジオグループ
Radio group with 3 radio buttons, nested within panel [glui_radio001.png(1173 byte)]
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)]
静的テキスト
Static text nested within panel [glui_stxt001.png(833 byte)]
パネル内にネストされた静的テキスト
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)]
編集可能テキストボックス
Editable text boxes nested within panel [glui_edtxt001.png(1860 byte)]
パネル内にネストされた編集可能テキストボックス
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)]
整数型と浮動小数点型のスピナー
Int and float spinners nested within panel [glui_spn001.png(1680 byte)]
パネルにネストした整数型と浮動小数点型のスピナー
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)]
セパレータ
Separator nested within panel [glui_sprtr001.png(495 byte)]
パネルにネストされたセパレータ
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)]
回転コントロール
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)]
XY コントロール
X control[glui_trans001.png(1054 byte)]
X コントロール
Y control[glui_trans002.png(1003 byte)]
Y コントロール
Z control[glui_trans003.png(1161 byte)]
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)]
リストボックス
Listbox, selected [glui_lst001.png(1692 byte)]
選択された状態のリストボックス
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. 使い方のアドバイス


管理者へメール. @ RML [Miura Lab]. ©2004.
更新:2004/06/28.