Cinderについては『Cinderがすごい話 - Qiita』がいい感じにまとまっているのでどうぞ.
CinderにはInterfaceGl
というUIライブラリが付属しています(実体はAntTweakBarのラッパー).
こいつがそこそこいけてるので,Cinder v0.9.0のsamples/ParamsBasic/src/ParamsBasicApp.cppから派手なやつをピックアップして紹介します.
前準備
InterfaceGl
(のRef)をプライベートフィールドで持っておく.draw()
関数内の適当な場所でInterfaceGl
もdraw()
しておく.
class SampleApp : public App {
public:
// snip.
private:
params::InterfaceGlRef mParams;
// snip.
};
void SampleApp::setup() {
mParams = params::InterfaceGl::create( getWindow(), "App parameters", toPixels( ivec2( 200, 300 ) ) );
// snip.
}
void SampleApp::draw() {
// snip.
mParams->draw();
}
この後に出てくるaddParam
やaddText
,addButton
はドコから呼び出しても大丈夫.実際に描画されるのはInterfaceGl#draw()
を読んだ時なので,無理にアプリのdraw()
でやるひつようもない.
数値
お前それでどこで使うねんと言いたくなる感じのかっこいいマウスぐるぐる操作で値をいじることができる.
float mObjSize; // snip. mParams->addParam("Cube Size", &mObjSize) .min(0.1f) .max(20.5f) .keyIncr("z") .keyDecr("Z") .precision(2) .step(0.02f);
注. 適宜コードを整形してます
回転
マウスぐるぐるでオブジェクト回転させたり.
quat mObjOrientation; // snip. mParams->addParam("Cube Rotation", &mObjOrientation);
quat
はクォータニオン.GLMの実装を利用している.
色
RGB/HSVとAlpha値を数値弄るのと同じようにぐりぐりできる.すぐ上に色のプレビュー出てて便利.
ColorA mColor; // snip. mParams->addParam("Cube Color", &mColor);
ColorA
はそのまま,透明度付きの色情報.いろんなとこでおなじようにつかえるよ.
方向
クォータニオンと同じような感じでベクトルもぐりぐりできる.3次元以外のベクトルだとどうなるかは試してないので不明.
vec3 mLightDirection; // snip. mParams->addParam( "Light Direction", setter, getter );
SelectBox(ComboBox,Spinner的な)
vector<string>
を渡せばセレクトボックス的なアレもシュッと作れる.
vector<string> mEnumNames; int mEnumSelection; // snip. mParams->addParam( "an enum", mEnumNames, &mEnumSelection ) .keyDecr( "[" ) .keyIncr( "]" ) .updateFn( [this] { console() << "enum updated: " << mEnumNames[mEnumSelection] << endl; } );
最後にupdateFn()
がチェインされてるけど,これはどのaddParam()
でも共通に使えるやつ.値が更新された時に渡された関数が呼び出される.サンプルの通り,lambdaでもいいしbindしてもいい.
所感
Pros
- ベクトル・クォータニオンぐりぐり系UIが超便利
- メソッドチェインできる系APIも扱いやすい
Cons
- 複数のウィンドウをキレイに並べる方法がわからなかった
- マルチバイト文字が使えないらしい
最終的にInterfaceGl
ではなくCinder-ImGuiを採用した.