★お知らせ(2023/12/27)
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。

新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
Live2D公式クリエイターズフォーラム

なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。

Live2D 2.1 DirectX(2.1.04.1) テクスチャのロード枚数が足りないときのReadエラーの回避について

model.jsonからテクスチャをロードする形を取っています
jsonに不足があり、mocが必要とするテクスチャよりもロード枚数が少ない状態で実行すると
live2d::ALive2DModelのdrawを実行したときにメモリーのRead違反エラーでソフトが落ちてしまいます。

ソフトが落ちるのを回避したいのですが、メモリーエラーなのでcatchが効きません。
それならばmocの必要とするテクスチャ枚数とjsonでのロード数が一致しないときはモデルのロードをキャンセルしようと考えているのですが、
mocが必要とするテクスチャ枚数の情報を得るAPIが見つかりませんでした。
generateModelTextureNoでいけるかと思いましたが別の値が入っていました。

一般開発であればjsonを精査するのが一番ですがユーザー側でファイルを入れ替えるためそうも行かないため
mocの必要とするテクスチャ枚数を把握する方法か、
draw時のエラーをキレイに押さえ込む方法を
ご教示いただけると幸いです。
よろしくお願いいたします。

開発環境
------------------------
win10 pro
microsft visual stadio community 2015
c++
DirectX9.0(June 2010)
SDK DirectX 2.1 2.1.04_1
------------------------

ファイルの入れ替え機能はLive2DDrawer for Aviutlで拡張性アプリケーション契約済みです。

コメント

  • @Ganeesya さん

    テクスチャの枚数を直接取得するAPIは用意しておりませんが、以下のやり方で間接的に取得することは出来ます。


    ModelContext* modelContext = live2DModel->getModelContext();

    // テクスチャの数をカウントするためのマップ。
    std::map<int, int> map;

    // 全ての描画オブジェクトの数。
    int drawDataCount = modelContext->getDrawDataCount();

    for (int i = 0; i < drawDataCount; i++)
    {
        // i番目の描画オブジェクト。
        DDTexture* ddt = (DDTexture*)(modelContext->getDrawData(i));

        // 描画オブジェクトが使用しているテクスチャ番号をkeyに設定。valueはダミー。
        map[ddt->getTextureNo()] = i;
    }

    // mocが使用するテクスチャの数。
    int textureCount = map.size();
  • 素早い回答ありがとうございます!

    早速組み込んで問題のあるファイルの読み込みがきちんと回避できるようになりました!
コメントするにはサインインまたは登録して下さい。