FLTK 用シーン描画ウィジェットクラス. [詳細]
Public メソッド | |
fk_Window (int x=0, int y=0, int w=300, int h=300, std::string name="FK Window") | |
コンストラクタ | |
~fk_Window () | |
デストラクタ | |
シーン制御関数 | |
void | setScene (fk_Scene *scene) |
シーン登録関数 | |
イベント・デバイス制御関数 | |
int | drawWindow (bool drawFlag=true) |
描画更新関数 | |
bool | winOpenStatus (void) |
描画状態取得関数 | |
void | resizeWindow (int x, int y, int w, int h) |
描画領域寸法変更関数 | |
bool | getKeyStatus (char key, bool insideFlag=true) |
標準キー状態取得関数 | |
bool | getSpecialKeyStatus (fk_SpecialKey key, bool insideFlag=true) |
特殊キー状態取得関数 | |
char | getLastKey (void) |
最終押下キー取得関数 | |
void | getMousePosition (int *x, int *y, bool insideFlag=true) |
マウスポインタ位置取得関数 | |
bool | getMouseStatus (fk_MouseButton button, bool insideFlag=true) |
マウスボタン状態取得関数 | |
int | getMouseWheelStatus (void) |
マウスホイール回転量取得関数 | |
void | getPickModel (fk_PickData *data, int pixel) |
ピックによるモデル選択関数 | |
void | getPickModel (fk_PickData *data, int pixel, int x, int y) |
任意投影座標でのモデル選択関数 | |
フレームレート制御関数 | |
void | setFrameMode (fk_FrameMode mode) |
フレームレート制御方法指定関数 | |
fk_FrameMode | getFrameMode (void) |
フレームレート制御方法参照関数 | |
void | setFrameInterval (int ms) |
フレーム間時間設定関数 | |
int | getFrameInterval (void) |
フレーム間時間参照関数 | |
int | getSkipFrame (void) |
スキップフレーム数参照関数 | |
投影座標・空間座標変換関数 | |
bool | getProjectPosition (double x, double y, fk_Plane *plane, fk_Vector *pos) |
投影平面から任意平面への射影点算出関数 | |
bool | getProjectPosition (double x, double y, double dist, fk_Vector *pos) |
投影平面から任意距離での射影点算出関数 | |
bool | getWindowPosition (fk_Vector pos_3D, fk_Vector *pos_2D) |
空間座標から投影座標への射影点算出関数 | |
グラフィックス処理制御関数 | |
void | setOGLPointerMode (bool mode) |
OpenGL 頂点配列処理制御関数. | |
bool | getOGLPointerMode (void) |
OpenGL 頂点配列処理参照関数. | |
void | clearTextureMemory (void) |
テクスチャメモリ解放関数 | |
virtual void | preInit (void) |
初期化前処理関数 | |
virtual void | postInit (void) |
初期化後処理関数 | |
virtual void | preDraw (void) |
描画前処理関数 | |
virtual void | postDraw (void) |
描画後処理関数 | |
描画画像取り込み関数 | |
bool | snapImage (std::string fileName, fk_ImageType format=FK_IMAGE_BMP, fk_SnapProcMode mode=FK_SNAP_GL_FRONT) |
描画画像ファイル出力関数 | |
bool | snapImage (fk_Image *image, fk_SnapProcMode mode=FK_SNAP_GL_FRONT) |
描画画像データ出力関数 | |
立体視モード制御関数 | |
void | setOGLStereoMode (bool mode) |
立体視モード設定関数 | |
bool | getOGLStereoMode (void) |
立体視モード取得関数 | |
Static Public メソッド | |
時間参照関数 | |
static unsigned long | getNow (void) |
現時点システム時間参照関数 | |
メッセージ出力制御関数 | |
static void | setPutStrMode (const fk_PutStrMode mode) |
メッセージ出力モード設定関数 | |
static fk_PutStrMode | getPutStrMode (void) |
メッセージ出力モード参照関数 | |
static bool | setPutFile (const std::string &fileName) |
メッセージ出力用ファイル設定関数 | |
static void | putString (const std::string &str) |
メッセージ出力文字列設定関数 | |
static void | printf (const char *format,...) |
メッセージ出力書式付き設定関数 | |
static void | clearBrowser (void) |
メッセージ出力用ブラウザ初期化関数 |
FLTK 用シーン描画ウィジェットクラス.
このクラスは、FK によるシーンを FLTK 用ウィジェットとして作成、制御するための機能を提供します。
fk_Window クラスは、FLTK の Fl_Gl_Window の派生クラスとなっています。 実際にアプリケーションとして表示を行うには、 Fl_Window によってウィンドウを生成し、 この fk_Window インスタンスを子ウィジェットとして登録する必要があります。 具体的な利用方法はユーザーズマニュアルのウィンドウに関する章や、 サンプルプログラムを参照して下さい。
fk_Window クラスが持つ機能は、以下のように多岐に渡ります。
しかし、シーンを表示するのに最低限必要な関数は setScene(), drawWindow(), winOpenStatus() の 3 つ (と、 Fl::wait() もしくは Fl::check()) のみです。 その他の関数は、必要に応じて参照して下さい。
本クラスの解説では、「投影座標」というものが多く登場します。 投影座標とは描画領域の左上を原点とし、 x 軸の正方向を右向き、y 軸の正方向を下向きとする平面座標系のことです。 数値はピクセル幅となります。 例えば、描画領域の大きさが (400, 500) であった場合、 その中心の投影座標は (200, 250)、右上端の投影座標は (400, 0) となります。
fk_Window::fk_Window | ( | int | x = 0 , |
|
int | y = 0 , |
|||
int | w = 300 , |
|||
int | h = 300 , |
|||
std::string | name = "FK Window" | |||
) |
コンストラクタ
[in] | x | 描画領域左上位置 x 座標 |
[in] | y | 描画領域左上位置 y 座標 |
[in] | w | 描画領域横幅 |
[in] | h | 描画領域縦幅 |
[in] | name | ウィジェット名称 |
fk_Window::~fk_Window | ( | ) |
デストラクタ
void fk_Window::setScene | ( | fk_Scene * | scene | ) |
シーン登録関数
シーンを本ウィジェットの描画対称として登録します。
[in] | scene | シーンインスタンス |
int fk_Window::drawWindow | ( | bool | drawFlag = true |
) |
描画更新関数
画面の描画を行います。 この関数を呼ばない限りは、シーン内のモデル状態に変更があっても、 画面には反映されません。
[in] | drawFlag | true の場合、正常に画面を更新します。 false の場合は、正常に画面更新が行えるかどうかだけの判定を行い、 実際の画面更新は行いません。 |
bool fk_Window::winOpenStatus | ( | void | ) |
描画状態取得関数
drawWindow() を呼んだ後、実際に描画が適切に行われているかどうかを参照します。
void fk_Window::resizeWindow | ( | int | x, | |
int | y, | |||
int | w, | |||
int | h | |||
) |
描画領域寸法変更関数
描画領域の位置と大きさを変更します。
[in] | x | 描画領域左上位置 x 座標 |
[in] | y | 描画領域左上位置 y 座標 |
[in] | w | 描画領域横幅 |
[in] | h | 描画領域縦幅 |
bool fk_Window::getKeyStatus | ( | char | key, | |
bool | insideFlag = true | |||
) |
標準キー状態取得関数
指定したキーの現在の押下状態を参照します。 例えば、「a」キーが押されているかどうかを調べる場合は、 以下のようなコードを記述します。
fk_Window win; if(win.getKeyStatus('a', true) == true) { // 押されている場合の処理 }
特殊キーの状態については、 getSpecialKeyStatus() を用いてください。
[in] | key | キーを表す文字。ここには、スペース(' ') や数字 ('1') なども含みます。 |
[in] | insideFlag | true だった場合、 マウスポインタが描画領域の外にあった場合は無条件に false を返します。 false だった場合は、マウスポインタの位置に関わらず押下状態を返します。 |
bool fk_Window::getSpecialKeyStatus | ( | fk_SpecialKey | key, | |
bool | insideFlag = true | |||
) |
特殊キー状態取得関数
指定した特殊キーの現在の押下状態を参照します。 例えば、右矢印キーが押されているかどうかを調べる場合は、 以下のようなコードを記述します。
fk_Window win; if(win.getSpecialKeyStatus(FK_RIGHT, true) == true) { // 押されている場合の処理 }
特殊キーの種類については、 fk_SpecialKey の項目を参照して下さい。
標準キーの状態については、 getKeyStatus() を用いてください。
[in] | key | キーを表す文字。 |
[in] | insideFlag | true だった場合、 マウスポインタが描画領域の外にあった場合は無条件に false を返します。 false だった場合は、マウスポインタの位置に関わらず押下状態を返します。 |
char fk_Window::getLastKey | ( | void | ) |
最終押下キー取得関数
最後に押された標準キーを取得します。 ここで「押された」というのは、いわゆる「押し始めた瞬間」のことを指します。 例えば、以下のような順番でキー操作を行ったとします。
この場合、最後まで押さえられていたのは「a」キーとなりますが、 「押し始めた瞬間」は「b」キーの方が後であるため、 getLastKey() は「b」を返すことになります。
void fk_Window::getMousePosition | ( | int * | x, | |
int * | y, | |||
bool | insideFlag = true | |||
) |
マウスポインタ位置取得関数
現在のマウスポインタの位置を与えられた引数ポインタに格納します。 コード例は以下の通りです。
fk_Window win; int x, y; win.getMousePosition(&x, &y, true);
格納される値は投影座標となります。 投影座標の詳細は本クラスの概要を参照して下さい。
[out] | x | マウスポインタの x 座標 |
[out] | y | マウスポインタの y 座標 |
[in] | insideFlag | true の場合は、もしマウスポインタが描画領域の外側にあった場合は x, y の両方に -1 を格納します。 false の場合は、描画領域の内外に関係なく、 投影座標に従って値を格納します。 この場合、マウスポインタが描画領域の左側や上側にあった場合は、 負の値が x や y に格納されることがありえることを意味しますので、 注意が必要です。 |
bool fk_Window::getMouseStatus | ( | fk_MouseButton | button, | |
bool | insideFlag = true | |||
) |
マウスボタン状態取得関数
指定したマウスボタンの現在の押下状態を参照します。 例えば、左マウスボタンが押されているかどうかを調べる場合は、 以下のようなコードを記述します。
fk_Window win; if(win.getMouseStatus(FK_MOUSE1, true) == true) { // 押されている場合の処理 }
マウスボタンの種類については、 fk_MouseButton の項目を参照して下さい。
[in] | button | マウスボタンの種類 |
[in] | insideFlag | true だった場合、 マウスポインタが描画領域の外にあった場合は無条件に false を返します。 false だった場合は、マウスポインタの位置に関わらず押下状態を返します。 |
int fk_Window::getMouseWheelStatus | ( | void | ) |
マウスホイール回転量取得関数
この関数は、ウスホイールの回転量を取得するときに使用します。 返り値は整数で、正の場合は手前側、負の場合は奥側に回転していることを意味します。 数値の単位は、テキストをスクロールさせた場合の「行数」に相当するものです。
この関数の回転量とは、この関数が以前に呼び出してからのホイール回転量を意味します。 従って、最初に呼び出したときは必ず 0 を返すことになります。 また、一度この関数で回転量を取得した後、 drawWindow() 関数を実行しない限りは常に 0 を返す仕様となっています。
void fk_Window::getPickModel | ( | fk_PickData * | data, | |
int | pixel | |||
) |
ピックによるモデル選択関数
この関数を呼び出すと、 プログラムは描画領域にマウスピックが行われるまで一旦停止します。 ピックが行われたときに、 fk_Solid およびその派生クラスによる形状が表示されていた場合、 ピックした付近にあったモデルと位相要素を格納します。 格納データの詳細については、 fk_PickData を参照して下さい。
ピック操作を行わず、任意の投影座標において探索を行いたい場合は、 getPickModel(fk_PickData *, int, int, int) を用いてください。
[out] | data | モデルと位相要素を格納するための、 fk_PickData 型インスタンスのポインタ。 |
[in] | pixel | 選択の際、どの程度の範囲までを取得対象とするかの距離。 単位はピクセルとなります。 |
void fk_Window::getPickModel | ( | fk_PickData * | data, | |
int | pixel, | |||
int | x, | |||
int | y | |||
) |
任意投影座標でのモデル選択関数
この関数は、 fk_Solid およびその派生クラスによる形状が表示されていた場合、 指定した投影座標の付近にあったモデルと位相要素を格納します。 投影座標についての詳細は、本クラスの概要を参照して下さい。 格納データの詳細については、 fk_PickData を参照して下さい。
ピック操作によってモデルや位相要素を選択したい場合は、 getPickModel(fk_PickData *, int) を用いてください。
[out] | data | モデルと位相要素を格納するための、 fk_PickData 型インスタンスのポインタ。 |
[in] | pixel | 選択の際、どの程度の範囲までを取得対象とするかの距離。 単位はピクセルとなります。 |
[in] | x | 探索対象の投影座標 x 成分 |
[in] | y | 探索対象の投影座標 y 成分 |
void fk_Window::setFrameMode | ( | fk_FrameMode | mode | ) |
フレームレート制御方法指定関数
この関数は、フレームレートを制御するためのモードを指定します。 「フレームレート」とは、1秒間あたりの画面更新回数のことです。 フレームレートの制御には、以下の2種類があります。
モードには、以下の3種類が指定できます。
なお、FK_WAIT_FRAME と FK_SKIP_FRAME は同時に指定することが可能です。 その場合は、以下のようにビット論理和演算子を利用します。
fk_Window win; win.setFrameMode(FK_WAIT_FRAME | FK_SKIP_FRAME);
[in] | mode | 制御モード |
fk_FrameMode fk_Window::getFrameMode | ( | void | ) |
void fk_Window::setFrameInterval | ( | int | ms | ) |
フレーム間時間設定関数
この関数は、フレームレート制御の「ウェイトモード」および 「スキップモード」における、 フレーム間時間の設定を行います。 「フレーム間時間」とは、 あるフレームが表示されてから次のフレームが表示されるまでの時間のことです。 例えば秒間60フレームとしたい場合は、 フレーム間時間は となります。 なお、本関数では指定はミリ秒(1000分の1秒)単位で行い、 型は int 型となります。従って、前述した秒間60フレームの場合は 「16」または「17」を指定することになります。
[in] | ms | フレーム間時間。単位はミリ秒です。 |
int fk_Window::getFrameInterval | ( | void | ) |
int fk_Window::getSkipFrame | ( | void | ) |
スキップフレーム数参照関数
フレーム制御で「スキップモード」を用いている場合に、 現在表示されているフレームとその前のフレームの間に、 何枚分のフレームが描画スキップされたかを参照します。
投影平面から任意平面への射影点算出関数
この関数は、描画領域上の投影座標から、 任意の平面への射影変換を行い、射影点を求めます。 これは、投影面上の投影座標とカメラを結ぶ直線と、 引数として入力された平面の交点を求めるということと同義です。 投影座標の詳細は本クラスの概要を参照して下さい。
[in] | x | 投影座標の x 成分 |
[in] | y | 投影座標の y 成分 |
[in] | plane | 射影先の平面。平面情報の設定については fk_Plane の解説を参照して下さい。 |
[out] | pos | 算出した点の位置ベクトル |
bool fk_Window::getProjectPosition | ( | double | x, | |
double | y, | |||
double | dist, | |||
fk_Vector * | pos | |||
) |
投影平面から任意距離での射影点算出関数
この関数は、描画領域上の投影座標に対し、 カメラから指定した距離となっている3D空間中の点を算出します。 これは、投影面上の投影座標とカメラを結ぶ直線と、 カメラを中心とし指定距離を半径とする球面の交点を求めることと同義です。 投影座標の詳細は本クラスの概要を参照して下さい。
[in] | x | 投影座標の x 成分 |
[in] | y | 投影座標の y 成分 |
[in] | dist | カメラからの空間中の距離 |
[out] | pos | 算出した点の位置ベクトル |
空間座標から投影座標への射影点算出関数
この関数は、空間座標から投影座標への射影点を算出します。 これは、ある空間中の位置が画面上でどこに表示されるかを知ることと同義です。 投影座標の詳細は本クラスの概要を参照して下さい。
なお、射影点の z 成分は投影における Near 面上の場合 0、 Far 面上の場合 1 となり、その間は線形補間した値となります。 つまり、カメラに近いほど値が小さくなるということです。
[in] | pos_3D | 空間座標位置ベクトル |
[out] | pos_2D | 射影点となる投影座標の位置ベクトル |
void fk_Window::setOGLPointerMode | ( | bool | mode | ) |
OpenGL 頂点配列処理制御関数.
この関数は、OpenGL 環境における頂点配列の使用を制御します。 OpenGL には「頂点配列」と呼ばれる仕組みがあり、 一般的にはこの機能を用いると描画処理が高速になります。 しかし、実行する環境によってはかえって低速になったり、 描画に不具合が生じることもあります。 そのような場合、この関数を用いて頂点配列を利用しないように、 内部処理を切り替えることが可能です。 デフォルトでは「有効」となっています。
[in] | mode | true の場合、頂点配列処理を有効とします。 false の場合は無効とします。 |
bool fk_Window::getOGLPointerMode | ( | void | ) |
OpenGL 頂点配列処理参照関数.
現在の OpenGL 頂点配列処理が有効であるかどうかを参照します。 頂点配列についての詳細は setOGLPointerMode() の解説を参照して下さい。
void fk_Window::clearTextureMemory | ( | void | ) |
テクスチャメモリ解放関数
この関数は、現在確保されているテクスチャメモリの解放を行います。
アプリケーションの中でテクスチャマッピングを行う際、 各テクスチャ画像のキャッシングを行っています。 これは、一般的にテクスチャマッピングにおいては同じ画像を再利用する割合が高いため、 キャッシングの効率が良いためです。 しかし、それは同時にテクスチャの格納によるメモリ使用量増大を意味します。 本関数は、確保したメモリを全て解放します。 これによりメモリ使用量は減少しますが、 テクスチャ画像入力のための処理時間が増加する可能性があります。
virtual void fk_Window::preInit | ( | void | ) | [inline, virtual] |
初期化前処理関数
この関数は、グラフィックスシステムの初期化処理において、 処理前に自動的にシステム内部から呼び出される関数です。 fk_Window クラスの派生クラスを作成し、 そのクラスにおいて本関数を再定義することによって、 グラフィックスシステム初期化時の処理を追加することが可能です。 代表的な用途として、特殊デバイスの初期化処理などがあります。
virtual void fk_Window::postInit | ( | void | ) | [inline, virtual] |
初期化後処理関数
この関数は、グラフィックスシステムの初期化処理において、 処理後に自動的にシステム内部から呼び出される関数です。 fk_Window クラスの派生クラスを作成し、 そのクラスにおいて本関数を再定義することによって、 グラフィックスシステム初期化時の処理を追加することが可能です。 代表的な用途として、特殊デバイスの初期化処理などがあります。
virtual void fk_Window::preDraw | ( | void | ) | [inline, virtual] |
描画前処理関数
この関数は、グラフィックスシステムの描画処理において、 描画前に自動的にシステム内部から呼び出される関数です。 fk_Window クラスの派生クラスを作成し、 そのクラスにおいて本関数を再定義することによって、 グラフィックスシステム毎描画時の処理を追加することが可能です。 代表的な用途として、特殊デバイスの情報取得などがあります。
virtual void fk_Window::postDraw | ( | void | ) | [inline, virtual] |
描画後処理関数
この関数は、グラフィックスシステムの描画処理において、 描画後に自動的にシステム内部から呼び出される関数です。 fk_Window クラスの派生クラスを作成し、 そのクラスにおいて本関数を再定義することによって、 グラフィックスシステム毎描画時の処理を追加することが可能です。 代表的な用途として、特殊デバイスの情報取得などがあります。
bool fk_Window::snapImage | ( | std::string | fileName, | |
fk_ImageType | format = FK_IMAGE_BMP , |
|||
fk_SnapProcMode | mode = FK_SNAP_GL_FRONT | |||
) |
描画画像ファイル出力関数
この関数は、描画領域に表示されている画像を、画像ファイルとして出力します。
[in] | fileName | 画像ファイル名 |
[in] | format | 画像ファイルのフォーマット。 現在利用可能なフォーマットは、 fk_ImageType の解説を参照して下さい。 |
[in] | mode | 画像の取込先となるグラフィックスデバイス名。 取り込みがうまく動作しない場合は、 この引数の値を変更してください。 |
bool fk_Window::snapImage | ( | fk_Image * | image, | |
fk_SnapProcMode | mode = FK_SNAP_GL_FRONT | |||
) |
描画画像データ出力関数
この関数は、描画領域に表示されている画像を、 fk_Image 型のインスタンスに出力します。
[in] | image | 画像データ出力先インスタンス |
[in] | mode | 画像の取込先となるグラフィックスデバイス名。 取り込みがうまく動作しない場合は、 この引数の値を変更してください。 |
static unsigned long fk_Window::getNow | ( | void | ) | [static] |
現時点システム時間参照関数
この関数は、呼んだ時点でのシステム時間を取得します。 システム時間の定義は実行プラットフォームによって意味が異なりますが、 どのプラットフォームでも単位はミリ秒です。
unsigned long nowTime = fk_Window::getNow();
static void fk_Window::setPutStrMode | ( | const fk_PutStrMode | mode | ) | [static] |
メッセージ出力モード設定関数
この関数は、メッセージ出力のモードを設定します。 モードには、以下のようなものがあります。
[in] | mode | 出力モード |
static fk_PutStrMode fk_Window::getPutStrMode | ( | void | ) | [static] |
static bool fk_Window::setPutFile | ( | const std::string & | fileName | ) | [static] |
メッセージ出力用ファイル設定関数
この関数は、メッセージ出力のモードにおいてファイル出力 (FK_PUTSTR_FILE) を指定したときの、出力ファイル名を設定するものです。
fk_Window::setPutFile("sample.txt");
[in] | fileName | 出力ファイル名 |
static void fk_Window::putString | ( | const std::string & | str | ) | [static] |
メッセージ出力文字列設定関数
この関数は、与えられた文字列をメッセージとして出力を行います。 出力先は、 setPutStrMode() によって設定したものとなります。
fk_Window::putString("sample");
[in] | str | 出力文字列 |
static void fk_Window::printf | ( | const char * | format, | |
... | ||||
) | [static] |
メッセージ出力書式付き設定関数
この関数は、与えられたフォーマットに従ってメッセージとして出力します。 この関数の引数は、C や C++ における標準関数である printf に準じます。
int i = 10; fk_Window::printf("i = %d", i);
static void fk_Window::clearBrowser | ( | void | ) | [static] |
メッセージ出力用ブラウザ初期化関数
この関数は、メッセージ出力における出力用ブラウザに対し、 表示の初期化を行います。 この関数を呼ぶ前に表示されていた文字列は全て削除されます。
void fk_Window::setOGLStereoMode | ( | bool | mode | ) |
立体視モード設定関数
ウィンドウに対して立体視モードを設定します。
[in] | mode | trueだった場合、立体視モードを有効にします。 falseだった場合、立体視モードを無効にします。 いずれの動作においても、OpenGLの動作モードの再設定が行われます。 |
bool fk_Window::getOGLStereoMode | ( | void | ) |
立体視モード取得関数
ウィンドウの現在の立体視モードを取得します。