/// <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; }
public virtual void Dispose() { エフェクト管理?.Dispose(); エフェクト管理 = null; バッファ管理?.Dispose(); バッファ管理 = null; トゥーン管理?.Dispose(); トゥーン管理 = null; サブセット管理?.Dispose(); サブセット管理 = null; }
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."); }