2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ogre v2.1 とnanaの連携(windows)

Last updated at Posted at 2018-08-16

備忘録です。

前回(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のインクルードを追加

main.cpp
#include <nana/gui.hpp>
#include <nana/gui/wvl.hpp> 
#include <nana/gui/timer.hpp>
#include <nana/gui/widgets/button.hpp>
#include <iostream>

####nanaのフォーム作成とウィンドウハンドルの取得
Ogreの描画ウィンドウ作成前ならどこでもよい

main.cpp
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行目に書く

main.cpp
	misc["externalWindowHandle"] = std::to_string(uifmHndl);

####描画更新のタイマー設定とnanaのメインループ開始
もとのmain.cppの295行目に挿入
20msecおきに描画を更新させるタイマーイベントを作成して、nanaのメインループ内で処理する。

main.cpp
	//描画更新のためのタイマー
	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();

#実行すると
アテナ像がくるくる回るはず。
いぐじっとボタンを押すと終了。
Ogre2_1withNANA2.png

#以上
お疲れさまでした。
ところで、OSSとはいえ人様のソースをいじったものを全部のせても良いのかわからなかったのでそうしなかったのですが普通はどうするもんなんでしょう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?