2010年4月に公開したIrrlichtML 1.7.1。ここで纏めを兼ねて、今までのバージョンとの違いや既知の不具合等、詳細情報をお届けします。
文字コードの変更
まず、今回のバージョンから文字列の扱いに下位互換性が全く有りません。文字コードをANSIからUnicodeに変更したからです。この変更の経緯には、Irrlicht 1.6で一新されたFileSystemが関わってきます。1.6以上では、日本語Windowsで使われているShift-jis文字列を、FileSystemが破壊してしまうのです。そのため、FileDialogの表示からファイルの読み書きに到るまで、日本語が使えなくなってしまいました。
この問題は、日本語以外の言語でもおこる可能性があり深刻です。しかし、ANSIベースで回避策を講じても、ソースが汚くなるだけで、あまり良い結果は得られないでしょう。そこでUnicodeの出番なのです。これらの問題はUnicodeでコンパイルすれば全て解決します。ただし、今まで作ってきたアプリケーションは大幅な変更を強いられる場合があります。
今のところUnicodeコンパイルに対応しているのはWindows環境のみです。Linux環境では元々UTF-32が採用されているために、ANSIベースでコンパイルしても何ら問題はありません。言い換えるならば、Linuxでは本家共々ANSIベースしか考慮されていません。詳細は「Irrlicht 1.6のFileOpenDialogで日本語が化ける原因」を参照して下さい。
サロゲートペア問題
Unicodeベースへ切り替えた事により文字化けからは解消されました。しかし、新たな問題が浮上します。それはサロゲートペアの取り扱いについてです。WindowsでのUnicode文字列はUTF-16が採用されています。1文字は16bitで表現されます。これは、メモリ効率と登録文字数の観点から、今のところ一番バランスの良い仕様です。ですが、この仕様には後にサロゲートペアに関する拡張が盛り込まれました。UTF-16を2文字分使い1文字を表現しようと言う試みです。Windows Vista以降のOSでは、"環境依存文字(Unicode)"として入力可能です。IrrlichtMLでは、このサロゲートペアの入出力に最大限対応するようにしました。試しに旧字体で「森鴎(U+9DD7)外叱(D+20B9F)る」と入力してみて下さい。
新しいCGUITTFont
CGUITTFontをzgock氏の旧版からNalin氏が新たに書き直したUnicode対応版に変更しました。このCGUITTFontはフォントキャッシュの実装や描画最適化が行われ、使い勝手が向上しています。ただし、従来のようにIrrlicht本体に埋め込んで使う事は想定されていません。それ故、埋め込んで使うとメモリリークを起こしてしまいます。本体ではなく、自己のプロジェクトにリンクして使うようにして下さい。
コンパイル定義の追加
IrrCompileConfig.hで次の定義が使えます。
- _IRR_IMPROVE_UNICODE : _IRR_WCHAR_FILESYSTEMと_UNICODEオプションを使うときには必須。クリップボードやログ出力でUnicode文字列が使えるようになります
- _IRR_USE_INPUT_METHOD : 日本語入力が可能になります。今のところWindowsのみ。Linuxは今後再対応予定
- _IRR_COMPILE_WITH_CGUITTFONT_ : CGUIFontをCGUITTFontに置き換えます。先述のメモリリークの問題があるため非推奨
既知の不具合
MultiLineプロパティをtrueにしたテキストボックスで日本語変換を試みると、IME変換候補の表示位置があちこちに飛びます。原因不明。
IrrlichtMLは本家に多言語表示の不具合修正と入力機能を加えたものです。入力を必要としないのであれば、現在は本家だけでも十分実用に耐えます。用途に合わせて、うまく使い分けて見て下さい。