|
その三 NX++に挑戦(環境構築編) 今回は、番外編として、Irrlichtの派生バージョンであるNX++について扱おうと思います。NX++って何? まずIrrlichtNXありき NX++の前身にあたるものとして、IrrlichtNXというものがありました。基本的に開発者のniko氏一人によってメンテナンスが行われている本家とは別に、 Irrlicht Forumで投稿された各種バグフィックスや拡張パッチを、 cvsベースで積極的に取り込んだIrrlichtの拡張バージョンでした。 そしてNX++へ 最初は、「ちょっとパッチが当たったIrrlicht」というレベルの違いしかなかったIrrlichtNXだったわけですが、やがて、Irrlichtの基本構造そのものに対しての不満点(主にイベントハンドリング)の解消をするために、 若干の仕様変更を行わざるを得なくなってきました。 そこで、IrrlichtNXから、NX++へと名称変更された、というのがおおまかな流れです。 で、何が偉いの? ごくごく大まかなnx++の特徴として、以下の点が上げられます。対応モデル、テクスチャフォーマットの追加 IrrlichtNXの頃からのポイントになりますが、対応するモデル、テクスチャフォーマットがIrrlichtより増えています。 代表的なところでは、PNGテクスチャ、MD3モデル等が挙げられます。 ノード単位でのイベントハンドリング Irrlichtとnx++の一番の違いがここになると思います。Irrlichtでは、画面全体に対して一つのイベントマネージャが全てのイベントを取り仕切っていましたが、 nx++では、シーンノード、GUIパーツの個々に対してイベントリスナを設定する仕組みになっています。 一般的なGUIアプリケーションと似たような構造ですね。 これにより、個々のノードの独立性、可搬性が上がっています。 積極的なLinux対応 本家ではどうしてもWindowsが主でLinuxは従という開発上の位置づけになりがちな状態ですが、nx++ではLinux/OpenGL関連の最適化がかなり積極的に行われています。 OS-X対応 まだ試験段階ではありますが、OS-X対応デバイスの開発が進んでいます。その他色々 その他、拡張されたヘイトフィールド地形や、3rd Person Camera等、様々な機能追加がなされています。 入手して設定して それでは実際に使ってみるために、NX++を入手して設定してみましょう。チュートリアル第一回と同じように、Visual C++6.0を前提として話を進めます。 基本はCVS NX++は、基本的にCVSベースでリリースが行われています。そのため、入手にはCVSクライアントと言われる専用のツールが必要になります。 Windows上のCVSクライアントと言えば、WinCVSあたりがメジャーですが、 ここではもっと簡単な奴ということで、TortoiseCVSを使ってみようと思います。 こちらからダウンロードしてきてください。 インストールが完了すると、再起動を要求されますので、再起動してください。 まずは日本語化 再起動後、適当な場所にNX++の受入ディレクトリを用意します。ここではC:\CVSの下にC:\CVS\NX++というフォルダを用意しました。 ![]() フォルダを選ばない状態で右クリックをすると、 CVS関連のメニューが追加されているはずです。 まずは「Preferences...」を選んでください。 ![]() 設定ダイアログが出ますので、「Language」を「Japanese」にしてOKしてください。 ![]() これで日本語化されます。 ![]() CVSからソースを入手 それではCVSからソースを入手します。CVSでは、CVSサーバからソースを入手することを「チェックアウト」と呼びます。 先ほど用意したフォルダを選んで右クリックすると、 「CVSチェックアウト」というメニューが出ますので、選んでください。 ![]() チェックアウトの設定ダイアログが出ますので、こちらを参考に設定してください。 ![]() NX++のCVSサーバ中のソースはUnix形式の改行コードで保存されていますので、 「オプション」タブ中の「Unix形式の改行コードを使用する」をOnにしてください。 ![]() 設定が完了したら、「OK」を押せばチェックアウトを開始します。 ![]() チェックアウトが完了すると、フォルダの下に「nx++-devel」というフォルダができているはずです。
ソースのコンパイル・・・の前に CVSから入手できるのは、ライブラリのソースだけですから、実際にライブラリを使うためには構築を行う必要があります。 が、構築の前に少々重要な問題が・・・ nx++はOpenGL関係のライブラリ等の新機能を使用している部分等があったり、 テンプレート関連でVC++6.0のコンパイラでは実装の不完全な部分を使っていたりとかの理由で、 VC++6.0のコンパイラではコンパイルできませんorz そこで、コンパイラのアップグレードを行う必要があるわけですが、 そのためだけにVC.netを買う、というのも抵抗がある人は、 フリーのMSVC++Toolkitを使ってコンパイラを差し替えるという方法があります。 こちらからMSVC++Toolkitをダウンロードした上で、インストールを行ってください。 C:\cvs\nx++\nx++-devel\の下にbuild\VisualStudio6というフォルダがありますので、 そこを開いて、nx++.dswを開いてください。 コンパイラの差し替えを行う前に、 VC++のインストールディレクトリ(デフォルトではC:\Program Files\Microsoft Visual Studio\VC98) の中のbin/include/libの三つのフォルダのバックアップを取っておくといいでしょう。 ![]() 続いて、MSVC++ ToolKitのインストールディレクトリ(デフォルトでC:\Program Files\Microsoft Visual C++ Toolkit 2003)から、 /bin/include/libをVC++6.0のディレクトリに上書きでコピーします。 ![]() これでコンパイルの準備が整いました。 NX++の取得ディレクトリ中の、build\VisualStudio6\nx++.dswを開いてください。 やっとコンパイル dswファイルを開くと、nx++本体と複数のサンプルプログラムプロジェクトが入っているはずです。デフォルトでnx++本体がアクティブになっているはずです。 アクティブな構成をIrrlichtNX-ReleaseにしてからF7でビルドしてください。 ![]() うまくいけば、build\VisualStudio6\の下にirrlichtNX.dllとirrlichtNX.libができているはずです。 ![]() 出来上がったirrlicht.libをlib\VisualStudioにコピーしましょう。これでnx++ライブラリは出来上がりです。 コンパイルが終わったら、VC++ ToolKitのコンパイラは不要ですので、 適当な名前にリネームして元の構成に戻しておきましょう。 CVSの更新等を行って、再コンパイルが必要になったら改めてリネームすればOKです。 ![]() ディレクトリを設定 続いて、VC++の参照ディレクトリを変更します。チュートリアル第一回と同じようにVC++のオプションから、 インクルードとライブラリディレクトリを設定してください。 ![]() ![]() これでNX++を使用する準備が整いました。 動作確認 それでは、動作確認を兼ねて、チュートリアル第一回と同様にウィンドウを出すだけのプログラムを書いてみましょう。 枠組を作る チュートリアル第一回を参照しつつ、Win32 Applicationのプロジェクトを作って、以下のソースを作成してください。 #ifdef _MSC_VER
#include <windows.h>
#endif
#include <nx++/irrlicht.h>
using namespace irr;
using namespace core;
using namespace video;
#ifdef _MSC_VER
#pragma comment(lib, "IrrlichtNX.lib")
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main()
#endif
return 0;
}
Irrlichtと異なっている点としては、インクルードするディレクトリが変わったこと、 pragmaで指定するライブラリ名が変わったことぐらいでしょうか。 基本はNXRoot 続いて、以下のコードを追加してください。#ifdef _MSC_VER
#include <windows.h>
#endif
#include <nx++/irrlicht.h>
#include <nx++/NXRoot.h>
using namespace irr;
using namespace core;
using namespace video;
#ifdef _MSC_VER
#pragma comment(lib, "IrrlichtNX.lib")
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main()
#endif
{
NXRoot *root = new NXRoot();
delete root;
}
NX++では、全てのNX++環境をNXRootと呼ばれるクラスが管理します。これによって、一つのプログラムで複数のNX++環境を制御することが容易になりました。 新しい描画ループ さらに、以下のコードを追加してください。#ifdef _MSC_VER
#include <windows.h>
#endif
#include <nx++/irrlicht.h>
#include <nx++/NXRoot.h>
using namespace irr;
using namespace core;
using namespace video;
#ifdef _MSC_VER
#pragma comment(lib, "IrrlichtNX.lib")
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main()
#endif
{
NXRoot *root = new NXRoot();
IRenderWindow *rwin = root->createRenderWindow(video::EDT_OPENGL,dimension2d<s32>(640,480),32,false,false,false);
while (rwin->update()){
}
rwin->drop();
delete root;
return 0;
}
Irrlichtでは、従来createDevice()でレンダリングウィンドウIrrlichtDeviceを生成していましたが、NX++ではcreateRenderWindow()でIRenderWindowを生成するように変わっています。 そしてIrrlichtでは、従来IrrlichtDevcie.run()がtrueの間、 IVideoDriverを使用して自前でループ中でbeginScene()..endScene()を行っていましたが、 NX++ではIRenderWindow->update()がtrueの間ループすればよい構造に変わりました。 実行してみる それではF5を押して実行してみましょう。j実行前にdllにパスを通すか、実行ディレクトリにコピーするのを忘れないでください。 (dllもIrrlichtNX.dllになっています。) 以下のようなウィンドウが表示されれば成功です。 ![]() 今回はここまでにしておきましょう。NX++固有の新機能については次回以降で取り扱いたいと思います。 |