趣味で作っている自作ゲームエンジン(もどき)がある程度組めたのでAssimp(ver 5.0.0)を導入してモデルを色々読み込んで遊んでいて、
ふとPMXモデルも読み込めたよな?と思いニコニ立体から適当にダウンロードして読み込ませたところ"Unable to load this asset ~~"といったエラーが発生するではないですか。
幸いAssimpはコード触りたい放題拡張し放題なのでパスに日本語が含まれている場合でもファイルを読み込めるよう改造してみました。
(何らかの意図があって現状のコードになっているはずなのでコードをイジる際は自己責任でどうぞ)
やったこと
とりあえずニコニコ動画ランキングで目についたMMD動画で使われていたアンジュカトリーナモデルをassimp_viewerで拝めるようにはしました。
(面倒だったのでファイル名に日本語を含むテクスチャの読み込み部分は修正していませんが)
シェーダのせいでびっくりするほどモデルの見栄えが悪い..
肝心の変更箇所
assimp-5.0.0/code/Common/DefaultIOSystem.cppのExists、Open関数内の処理を下記のようにfopenに統一します。
// 83行目あたり
// ------------------------------------------------------------------------------------------------
// Tests for the existence of a file at the given path.
bool DefaultIOSystem::Exists(const char* pFile) const
{
FILE* file = ::fopen(pFile, "rb");
if (!file) return false;
::fclose(file);
return true;
}
// ------------------------------------------------------------------------------------------------
// Open a new file with a given path.
IOStream* DefaultIOSystem::Open(const char* strFile, const char* strMode)
{
ai_assert(strFile != nullptr);
ai_assert(strMode != nullptr);
FILE* file;
file = ::fopen(strFile, strMode);
if (!file) return nullptr;
return new DefaultIOStream(file, strFile);
}
以上です、はい。
なぜわざわざWIN32ではコンパイル分岐でfopenの使用を避けるのかが自分では理解できない...