// 2つのマテリアルが等しいか判定する public bool EqualMaterials(PMD_Material m1, PMD_Material m2) { if (m1.flags != m2.flags) { return(false); } if (m1.tex_id != m2.tex_id) { return(false); } if (m1.tex_toon_id != m2.tex_toon_id) { return(false); } if (m1.edge_color != m2.edge_color) { return(false); } if (m1.edge_width != m2.edge_width) { return(false); } return(true); }
// 2つのマテリアルが等しいか判定する public int EqualMaterial(PMD_Material m1, PMD_Material m2) { // edge_flag if (m1.edge_flag != m2.edge_flag) { return(-1); } // colorテクスチャ if (m1.szTextureFileName != m2.szTextureFileName) { return(-1); } // toonテクスチャ if (m1.toon_index != m2.toon_index) { return(-1); } return(0); }
// TSOSubScriptを元にPMD_Materialを生成して追加する // 頂点インデックス数は後で設定する public void Add(int tso_num, int script_num, bool use_edge, string memo) { PMD_Material pmd_m = new PMD_Material(); pmd_m.name = categories[tso_num] + " " + tsos[tso_num].sub_scripts[script_num].Name; // スクリプトよりシェーダパラメータを取得 Shader shader = new Shader(); shader.Load(tsos[tso_num].sub_scripts[script_num].lines); pmd_m.diffuse = new Vector4(1.0f, 1.0f, 1.0f, 1.0f); pmd_m.specular = new Vector4(0.15f, 0.15f, 0.15f, 6.0f); pmd_m.ambient = new Vector3(0.5f, 0.5f, 0.5f); /* * pmd_m.UseEdge = use_edge; * pmd_m.UseShadow = use_edge; */ foreach (ShaderParameter pm in shader.shader_parameters) { // エッジ色があれば、materialに設定する. if (pm.Name == "PenColor") { pmd_m.edge_color = pm.GetFloat4(); } // 輪郭線の太さを設定する. if (pm.Name == "Thickness") { pmd_m.edge_width = pm.GetFloat() * 100F; // MMDとカス子で挙動が違うので補正する if (pmd_m.edge_width < 0F) { pmd_m.edge_width = 0F; } if (pmd_m.edge_width > 1F) { pmd_m.edge_width = 1F; } } // エッジが出るtechniqueのみエッジをつける. if (use_edge) { if (pm.Name == "technique") { // dictionaryを見て該当するならエッジをつける if (edgelist.hasedge(pm.GetValueString())) { pmd_m.UseEdge = use_edge; } // 影は常に落とす pmd_m.UseShadow = use_edge; } } } pmd_m.memo += " " + memo; // 頂点インデックス数(後で設定する) pmd_m.vindices_count = 0; // colorテクスチャ pmd_m.tex_id = tex_list.GetBitmapID(tso_num, shader.ColorTexName); // toonテクスチャ pmd_m.tex_toon_id = tex_list.GetBitmapID(tso_num, shader.ShadeTexName); // スフィアマップを使う if (tex_list.use_spheremap) { pmd_m.tex_sphere_id = tex_list.GetSphereID(tso_num, shader.ShadeTexName); if (pmd_m.tex_sphere_id != -1) { pmd_m.sphere_mode = 1; } } // 要素を追加 materials.Add(pmd_m); }
// TSOSubScriptより、PMD_Materialを生成する // (ただし、頂点インデックス数は0となっているため、後に設定する必要がある) public void Add(int tso_num, int script_num, bool edge, bool spheremap_flag) { PMD_Material pmd_m = new PMD_Material(); // スクリプトよりシェーダパラメータを取得 Shader shader = new Shader(); shader.Load(TSOList[tso_num].sub_scripts[script_num].lines); pmd_m.col4Diffuse = new MmdColor4(1.0f, 1.0f, 1.0f, 1.0f); pmd_m.fShininess = 6.0f; pmd_m.col3Specular = new MmdColor3(0.15f, 0.15f, 0.15f); pmd_m.col3Ambient = new MmdColor3(0.5f, 0.5f, 0.5f); if (edge == true) { pmd_m.edge_flag = 1; } else { pmd_m.edge_flag = 0; } // 頂点インデックス数(0となっているため、後に設定する必要がある) pmd_m.ulNumIndices = 0; // colorテクスチャ pmd_m.szTextureFileName = tex_list.GetFileName(tso_num, shader.ColorTexName); // toonテクスチャ string toon_file = tex_list.GetFileName(tso_num, shader.ShadeTexName); if (toon_file != null) // 存在しないtoonテクスチャを参照しているパーツがあるのでこれを確認 { if (toon_name_list.IndexOf(toon_file) != -1) { // toonテクスチャファイル中でのインデックス pmd_m.toon_index = toon_name_list.IndexOf(toon_file); } else { if (toon_name_list.Count <= 9) { // toonテクスチャとするテクスチャ名を記憶 // 後にtoonテクスチャファイル名を出力するときに使用。 toon_name_list.Add(toon_file); // toonテクスチャファイル中でのインデックス pmd_m.toon_index = toon_name_list.Count - 1; } else { // toonテクスチャとするテクスチャ名を記憶 // 後にtoonテクスチャファイル名を出力するときに使用。 toon_name_list.Add("toon10.bmp"); // 10以上は無理なので、それ以上は全てtoon10.bmp // toonテクスチャファイル中でのインデックス pmd_m.toon_index = 9; // 10以上は無理なので、それ以上は全て9 } } // スフィアマップ if (spheremap_flag == true) { // toonテクスチャが256×16のサイズなら、スフィアマップを指定する Bitmap toon_bmp = tex_list.GetBitmap(tso_num, shader.ShadeTexName); if (toon_bmp.Width == 256 && toon_bmp.Height == 16) { string sphere_file = System.Text.RegularExpressions.Regex.Replace(toon_file, ".bmp", ".sph"); pmd_m.szTextureFileName = pmd_m.szTextureFileName + "*" + sphere_file; } } } else { pmd_m.toon_index = 9; } // 要素を追加 name_list.Add(cateList[tso_num] + " " + TSOList[tso_num].sub_scripts[script_num].Name); material_list.Add(pmd_m); }