Exemplo n.º 1
0
 /// <summary>
 ///     コンストラクタ。
 ///     初期化だけ行い、読み込み(Load)は行わない。
 /// </summary>
 public PMXModel(PMXモデル modeldata, サブリソースローダー subResourceLoader, string filename)
 {
     モデル        = modeldata;
     サブリソースローダー = subResourceLoader;
     モデル状態      = new Transformer基本実装();
     サブセット管理    = new サブセット管理(this, modeldata);
     トゥーン管理     = new PMXトゥーンテクスチャ管理();
     セルフシャドウ色   = new Vector4(0, 0, 0, 1);
     地面影色       = new Vector4(0, 0, 0, 1);
     ファイル名      = filename;
     表示中        = true;
 }
Exemplo n.º 2
0
        public virtual void Dispose()
        {
            エフェクト管理?.Dispose();
            エフェクト管理 = null;

            バッファ管理?.Dispose();
            バッファ管理 = null;

            トゥーン管理?.Dispose();
            トゥーン管理 = null;

            サブセット管理?.Dispose();
            サブセット管理 = null;
        }
Exemplo n.º 3
0
        public void 初期化する(トゥーンテクスチャ管理 ToonManager, サブリソースローダー subresourceManager)
        {
            _サブリソースローダー  = subresourceManager;
            _トゥーンテクスチャ管理 = ToonManager;

            サブセットリスト = new List <サブセット>(_モデル.材質リスト.Count);


            // すべての材質について、サブセットを生成する。

            int 現在の合計頂点数 = 0;

            Debug.Write($"サブセット:{_モデル.材質リスト.Count} ");

            for (int i = 0; i < _モデル.材質リスト.Count; i++)
            {
                Debug.Write(">");

                var 材質 = _モデル.材質リスト[i];


                // サブセット生成

                var subset = new PMXサブセット(Drawable, 材質, i)
                {
                    カリングする             = !(材質.描画フラグ.HasFlag(描画フラグ.両面描画)),
                    頂点数                = 材質.頂点数 / 3,
                    インデックスバッファにおける開始位置 = 現在の合計頂点数,
                };


                // トゥーンテクスチャを決定する

                if (材質.共有Toonのテクスチャ参照インデックス >= _トゥーンテクスチャ管理.このアバターのトゥーンの配列.Length)
                {
                    // (A) 材質が、まだ読み込まれていないトゥーンテクスチャを指定している場合

                    subset.エフェクト用材質情報.トゥーンを使用する = false;

                    if (0 == _トゥーンテクスチャ管理.このアバターのトゥーンの配列.Length)
                    {
                        int index = _トゥーンテクスチャ管理.トゥーンを追加で読み込み現在の最後のトゥーンインデックスを返す(_モデル.テクスチャリスト[材質.共有Toonのテクスチャ参照インデックス]);
                        subset.エフェクト用材質情報.トゥーンテクスチャ = _トゥーンテクスチャ管理.このアバターのトゥーンの配列[index];
                    }
                    else
                    {
                        subset.エフェクト用材質情報.トゥーンテクスチャ = _トゥーンテクスチャ管理.このアバターのトゥーンの配列[0];
                    }
                }
                else
                {
                    // (B) 材質が、すでに読み込み済みのトゥーンテクスチャを指定している場合

                    if (材質.共有Toonフラグ == 1)
                    {
                        // (B-a) 共有トゥーンテクスチャを指定している場合

                        subset.エフェクト用材質情報.トゥーンテクスチャ = _トゥーンテクスチャ管理.このアバターのトゥーンの配列[材質.共有Toonのテクスチャ参照インデックス + 1];
                        subset.エフェクト用材質情報.トゥーンを使用する = true;
                    }
                    else if (材質.共有Toonのテクスチャ参照インデックス != -1)
                    {
                        // (B-b) 材質が、共有トゥーンテクスチャ以外のトゥーンテクスチャを指定している場合

                        if (_モデル.テクスチャリスト.Count < 材質.共有Toonのテクスチャ参照インデックス + 1)
                        {
                            // (B-b-a) 存在しないトゥーンテクスチャが指定されている場合 → 先頭のものを使っておく。
                            subset.エフェクト用材質情報.トゥーンテクスチャ = _トゥーンテクスチャ管理.このアバターのトゥーンの配列[0];
                            subset.エフェクト用材質情報.トゥーンを使用する = true;
                        }
                        else
                        {
                            // (B-b-b) 存在するテクスチャの場合、そのテクスチャを読み込んで、それをトゥーンテクスチャとする。
                            int index = _トゥーンテクスチャ管理.トゥーンを追加で読み込み現在の最後のトゥーンインデックスを返す(_モデル.テクスチャリスト[材質.共有Toonのテクスチャ参照インデックス]);
                            subset.エフェクト用材質情報.トゥーンテクスチャ = _トゥーンテクスチャ管理.このアバターのトゥーンの配列[index];
                            subset.エフェクト用材質情報.トゥーンを使用する = true;
                        }
                    }
                    else
                    {
                        // (B-c) 材質が、トゥーンテクスチャを指定していない場合 → 先頭のものを使っておく。
                        subset.エフェクト用材質情報.トゥーンテクスチャ = _トゥーンテクスチャ管理.このアバターのトゥーンの配列[0];
                        subset.エフェクト用材質情報.トゥーンを使用する = true;
                    }
                }


                // 頂点数を更新

                現在の合計頂点数 += 材質.頂点数;


                // テクスチャの読み込み

                if (材質.通常テクスチャの参照インデックス != -1)
                {
                    subset.エフェクト用材質情報.テクスチャ = _サブリソースを検索して返す(_モデル.テクスチャリスト[材質.通常テクスチャの参照インデックス]);
                }

                // スフィアマップの読み込み

                if (材質.スフィアテクスチャの参照インデックス != -1)
                {
                    subset.エフェクト用材質情報.スフィアモード = 材質.スフィアモード;
                    subset.エフェクト用材質情報.スフィアマップ = _サブリソースを検索して返す(_モデル.テクスチャリスト[材質.スフィアテクスチャの参照インデックス]);
                }


                // 完成したサブセットをリストに追加

                サブセットリスト.Add(subset);
            }
            Debug.WriteLine(" done.");
        }