備忘録です。
前回(Ogre v2.1のビルド)からの続き
https://qiita.com/ManukeFace/items/9e9cc8ed53294fcc9b88
#動機
最終的にはかっこよく可視化できる自前の物理シミュレーションのプリポストが作れたらいいなと
#環境
前回と同じ
・windows10
・visual studio community 2017 (15.7.5)
・CMake 3.12.0
・Ogre 2.1(Commits on Aug 5, 2018)
・nana 1.61
#今回やったこと
・Ogre側にnanaのフォームのウィンドウハンドルを渡してnanaのフォーム上に描画させた。
・Ogreのレンダリングループをnanaのタイマーイベントに移して処理させた。
#nana
http://nanapro.org/en-us/
Ogre側とランタイムは合わせるようにする以外は
公式HPから落としてCmakeで問題ないはず。
C++11以降の機能を使って書かれていて勉強になる。
#Ogreの参考プログラム
前回ビルドはできたものの、
・サンプルはラッパクラスがかませてあって何やってるのかよくわからない
・資料はv1.xのものがほとんど
・v1.xのチュートリアルはv2.1だとそのままでは動かないが
どう修正したらいいのかは、何やってるのかよくわからないのでよくわからない
といったところで困っていたところ,プリミティブなプログラムを見つけたので
ここを参考にすることにした。
https://github.com/Ybalrid/Ogre2Test
ただ、上記の実行するとSinbadメッシュのテクスチャまわりで
例外が出るので、今回Sinbadメッシュ関連の部分はコメントアウトした。
(そのうち勉強しよう)
#main.cppでいじったところ
####コメントアウトする行
225~249
295~307
####nanaのインクルードを追加
#include <nana/gui.hpp>
#include <nana/gui/wvl.hpp>
#include <nana/gui/timer.hpp>
#include <nana/gui/widgets/button.hpp>
#include <iostream>
####nanaのフォーム作成とウィンドウハンドルの取得
Ogreの描画ウィンドウ作成前ならどこでもよい
int main(void)
{
auto run{ true };
//Ogreに描画させるnanaのフォームfmを作成、サイズはOgreのウィンドウサイズに合わせる
nana::form fm(nana::API::make_center(WindowSize.x, WindowSize.y));
//ボタンを手前に表示させるためのnested_formを作成
nana::nested_form nfm(fm, nana::rectangle{ 10, 10, 100, 20 }, nana::form::appear::bald<>());
nfm.show();
//exitボタンの作成
nana::button btn(nfm, nana::rectangle{ 0, 0, 100, 20 });
btn.caption(L"いぐじっと");
//exitボタンの動作の登録
btn.events().click([&fm] {
fm.close();//フォームが一つなのでnana::exec()を抜けて終了
});
fm.show();
//fmのウィンドウハンドルを取得
auto fmHndl= reinterpret_cast<HWND>(fm.native_handle());
//Ogreの描画ウィンドウ指定はunsigned intなので変換
auto uifmHndl = reinterpret_cast<unsigned int>(fmHndl);
####Ogreの描画ウィンドウをnanaのフォームに設定
もとのmain.cppの173行目に書く
misc["externalWindowHandle"] = std::to_string(uifmHndl);
####描画更新のタイマー設定とnanaのメインループ開始
もとのmain.cppの295行目に挿入
20msecおきに描画を更新させるタイマーイベントを作成して、nanaのメインループ内で処理する。
//描画更新のためのタイマー
nana::timer tmr;
//描画更新イベントを登録
tmr.elapse([&] {
//内容は元のレンダリングループの処理そのまま
then = now;
orientation = animation(now = (static_cast<float>(root->getTimer()->getMilliseconds()) / 1000.0f));
objectNode->setOrientation(orientation);
root->renderOneFrame();
});
//更新タイミングの設定
tmr.interval(20);
//タイマーの開始
tmr.start();
//nanaのメインループ開始
nana::exec();
#実行すると
アテナ像がくるくる回るはず。
いぐじっとボタンを押すと終了。
#以上
お疲れさまでした。
ところで、OSSとはいえ人様のソースをいじったものを全部のせても良いのかわからなかったのでそうしなかったのですが普通はどうするもんなんでしょう。