private static PMXFormat.Material ConvertMaterial(PMDFormat pmd, int material_index, System.Func <string, uint> get_texture_index) { PMXFormat.Material result = new PMXFormat.Material(); PMDFormat.Material pmd_material = pmd.material_list.material[material_index]; result.name = "材質_" + material_index.ToString(); result.english_name = "Material_" + material_index.ToString(); result.diffuse_color = new Color(pmd_material.diffuse_color.r, pmd_material.diffuse_color.g, pmd_material.diffuse_color.b, pmd_material.alpha); result.specularity = pmd_material.specularity; result.specular_color = pmd_material.specular_color; result.ambient_color = pmd_material.mirror_color; result.flag = new PMXFormat.Material.Flag(); if (pmd_material.alpha < 1.0f) { result.flag |= PMXFormat.Material.Flag.Reversible; } if (0 != pmd_material.edge_flag) { result.flag |= PMXFormat.Material.Flag.Edge | PMXFormat.Material.Flag.CastShadow | PMXFormat.Material.Flag.CastSelfShadow; } if (!(0.98f == pmd_material.alpha)) //浮動小数点の比較だけど、0.98fとの同値確認でPMXエディタの0.98と一致したので一旦これで。 { result.flag |= PMXFormat.Material.Flag.ReceiveSelfShadow; } result.edge_color = Color.black; result.edge_size = 1.0f; //result.usually_texture_index = uint.MaxValue; if (!string.IsNullOrEmpty(pmd_material.texture_file_name)) { result.usually_texture_index = get_texture_index(pmd_material.texture_file_name); } result.sphere_texture_index = uint.MaxValue; result.sphere_mode = PMXFormat.Material.SphereMode.Null; if (!string.IsNullOrEmpty(pmd_material.sphere_map_name)) { result.sphere_texture_index = get_texture_index(pmd_material.sphere_map_name); switch (System.IO.Path.GetExtension(pmd_material.sphere_map_name)) { case ".sph": result.sphere_mode = PMXFormat.Material.SphereMode.MulSphere; break; case ".spa": result.sphere_mode = PMXFormat.Material.SphereMode.AddSphere; break; default: break; } } result.common_toon = pmd_material.toon_index; result.toon_texture_index = ((0 < pmd_material.toon_index)? pmd_material.toon_index: uint.MaxValue); result.memo = ""; result.face_vert_count = pmd_material.face_vert_count; return(result); }
// 色の生成 void EntryColors(Material[] mats) { // マテリアルの生成 for (int i = 0; i < mats.Length; i++) { // PMDフォーマットのマテリアルを取得 PMDFormat.Material pmdMat = format_.material_list.material[i]; //先にテクスチャ情報を検索 Texture2D main_texture = null; if (pmdMat.texture_file_name != "") { string path = format_.folder + "/" + pmdMat.texture_file_name; main_texture = new Texture2D(1, 1, TextureFormat.RGBA32, false); main_texture.LoadImage(File.ReadAllBytes(path)); // Fill the texture field //main_texture.alphaIsTransparency = true; } Material result = new Material(Resources.Load <Material>("Transparent")); result.SetTexture("_BaseColorMap", main_texture); mats[i] = result; } }
private PMDFormat.Material ReadMaterial() { PMDFormat.Material result = new PMDFormat.Material(); result.diffuse_color = ReadSinglesToColor(binary_reader_, 1); result.alpha = binary_reader_.ReadSingle(); result.specularity = binary_reader_.ReadSingle(); result.specular_color = ReadSinglesToColor(binary_reader_, 1); result.mirror_color = ReadSinglesToColor(binary_reader_, 1); result.toon_index = binary_reader_.ReadByte(); result.edge_flag = binary_reader_.ReadByte(); result.face_vert_count = binary_reader_.ReadUInt32(); // テクスチャ名の抜き出し // スフィアマップも行う string buf = ConvertByteToString(binary_reader_.ReadBytes(20), ""); //Debug by Wilfrem: テクスチャが無い場合を考慮していない //Debug by Wilfrem: テクスチャはfoo.bmp*bar.sphのパターンだけなのか? bar.sph*foo.bmpのパターンがあり得るのでは? 対策をしておくべき //Debug by GRGSIBERIA: スフィアマップとテクスチャが逆になる現象が発生したので修正 //Debug by GRGSIBERIA: "./テクスチャ名"で始まるモデルで異常発生したので修正 if (!string.IsNullOrEmpty(buf.Trim())) { string[] textures = buf.Trim().Split('*'); foreach (var tex in textures) { string texNameEndAssignVar = ""; string ext = Path.GetExtension(tex); if (ext == ".sph" || ext == ".spa") { result.sphere_map_name = tex; /*} else if (string.IsNullOrEmpty(tex)) { result.texture_file_name=""; */ } else { if (tex.Split('/')[0] == ".") { // テクスチャ名の後端に"./"があった場合の回避処理 string[] texNameBuf = tex.Split('/'); for (int i = 1; i < texNameBuf.Length-1; i++) { texNameEndAssignVar += texNameBuf[i] + "/"; } texNameEndAssignVar += texNameBuf[texNameBuf.Length-1]; } else { // 特に異常がない場合はそのまま代入 texNameEndAssignVar = tex; } #if UNITY_STANDALONE_OSX // MACの場合,濁点のあるひらがなを使うと動かないらしいので対策 // http://sourceforge.jp/ticket/browse.php?group_id=6158&tid=31929 texNameEndAssignVar = texNameEndAssignVar.Normalize(NormalizationForm.FormKD); #endif result.texture_file_name = texNameEndAssignVar; } } } else { result.sphere_map_name=""; result.texture_file_name=""; } if (string.IsNullOrEmpty(result.texture_file_name)) { result.texture_file_name = ""; } return result; }
private static PMDFormat.Material ConvertMaterial(PMXFormat pmx, int material_index) { PMDFormat.Material result = new PMDFormat.Material(); PMXFormat.Material pmx_material = pmx.material_list.material[material_index]; result.diffuse_color = pmx_material.diffuse_color; result.alpha = result.diffuse_color.a; result.diffuse_color.a = 1.0f; result.specularity = pmx_material.specularity; result.specular_color = pmx_material.specular_color; result.mirror_color = pmx_material.ambient_color; if (0 < pmx_material.common_toon) { //共通トゥーン string toon_name = "toon" + pmx_material.common_toon.ToString("00") + ".bmp"; int toon_name_index = -1; for (int i = 0, i_max = pmx.texture_list.texture_file.Length; i < i_max; ++i) { if (toon_name == pmx.texture_list.texture_file[i]) { //既存の pmx.texture_list.texture_file に有れば //使う toon_name_index = i; break; } } if (toon_name_index < 0) { //既存の pmx.texture_list.texture_file になければ //後ろに追加する string[] texture_file = new string[pmx.texture_list.texture_file.Length + 1]; System.Array.Copy(pmx.texture_list.texture_file, texture_file, pmx.texture_list.texture_file.Length); texture_file[pmx.texture_list.texture_file.Length] = toon_name; //最後に追加 toon_name_index = pmx.texture_list.texture_file.Length; pmx.texture_list.texture_file = texture_file; } result.toon_index = (byte)toon_name_index; } else { //自前トゥーン result.toon_index = (byte)pmx_material.toon_texture_index; } result.edge_flag = (byte)((0 != ((int)pmx_material.flag & (int)PMXFormat.Material.Flag.Edge))? 1: 0); result.face_vert_count = pmx_material.face_vert_count; if (uint.MaxValue != pmx_material.sphere_texture_index) { string tex = pmx.texture_list.texture_file[pmx_material.sphere_texture_index]; result.sphere_map_name = ((0 == tex.IndexOf("./"))? tex.Substring(2): tex); //"./"開始なら除去 #if MFU_PMX2PMD_SPHERE_MAP_NAME_ADD_EXTENSION_FOR_SPHERE_MODE //スフィアモードの為に、拡張子を付加する(ファイルパスが変更されるのでMMDConverter側で2重拡張子に対応する迄無効化) switch (pmx_material.sphere_mode) { case PMXFormat.Material.SphereMode.AddSphere: result.sphere_map_name += ".spa"; break; case PMXFormat.Material.SphereMode.MulSphere: result.sphere_map_name += ".sph"; break; default: break; } #endif } if (uint.MaxValue != pmx_material.usually_texture_index) { string tex = pmx.texture_list.texture_file[pmx_material.usually_texture_index]; result.texture_file_name = ((0 == tex.IndexOf("./"))? tex.Substring(2): tex); //"./"開始なら除去 } return(result); }
private static PMDFormat.Material ConvertMaterial(PMXFormat pmx, int material_index) { PMDFormat.Material result = new PMDFormat.Material(); PMXFormat.Material pmx_material = pmx.material_list.material[material_index]; result.diffuse_color = pmx_material.diffuse_color; result.alpha = result.diffuse_color.a; result.diffuse_color.a = 1.0f; result.specularity = pmx_material.specularity; result.specular_color = pmx_material.specular_color; result.mirror_color = pmx_material.ambient_color; if (0 < pmx_material.common_toon) { //共通トゥーン string toon_name = "toon" + pmx_material.common_toon.ToString("00") + ".bmp"; int toon_name_index = -1; for (int i = 0, i_max = pmx.texture_list.texture_file.Length; i < i_max; ++i) { if (toon_name == pmx.texture_list.texture_file[i]) { //既存の pmx.texture_list.texture_file に有れば //使う toon_name_index = i; break; } } if (toon_name_index < 0) { //既存の pmx.texture_list.texture_file になければ //後ろに追加する string[] texture_file = new string[pmx.texture_list.texture_file.Length + 1]; System.Array.Copy(pmx.texture_list.texture_file, texture_file, pmx.texture_list.texture_file.Length); texture_file[pmx.texture_list.texture_file.Length] = toon_name; //最後に追加 toon_name_index = pmx.texture_list.texture_file.Length; pmx.texture_list.texture_file = texture_file; } result.toon_index = (byte)toon_name_index; } else { //自前トゥーン result.toon_index = (byte)pmx_material.toon_texture_index; } result.edge_flag = (byte)((0 != ((int)pmx_material.flag & (int)PMXFormat.Material.Flag.Edge))? 1: 0); result.face_vert_count = pmx_material.face_vert_count; if (uint.MaxValue != pmx_material.sphere_texture_index) { string tex = pmx.texture_list.texture_file[pmx_material.sphere_texture_index]; result.sphere_map_name = ((0 == tex.IndexOf("./"))? tex.Substring(2): tex); //"./"開始なら除去 #if MFU_PMX2PMD_SPHERE_MAP_NAME_ADD_EXTENSION_FOR_SPHERE_MODE //スフィアモードの為に、拡張子を付加する(ファイルパスが変更されるのでMMDConverter側で2重拡張子に対応する迄無効化) switch (pmx_material.sphere_mode) { case PMXFormat.Material.SphereMode.AddSphere: result.sphere_map_name += ".spa"; break; case PMXFormat.Material.SphereMode.MulSphere: result.sphere_map_name += ".sph"; break; default: break; } #endif } if (uint.MaxValue != pmx_material.usually_texture_index) { string tex = pmx.texture_list.texture_file[pmx_material.usually_texture_index]; result.texture_file_name = ((0 == tex.IndexOf("./"))? tex.Substring(2): tex); //"./"開始なら除去 } return result; }
private PMDFormat.Material ReadMaterial() { PMDFormat.Material result = new PMDFormat.Material(); result.diffuse_color = ReadSinglesToColor(binary_reader_, 1); result.alpha = binary_reader_.ReadSingle(); result.specularity = binary_reader_.ReadSingle(); result.specular_color = ReadSinglesToColor(binary_reader_, 1); result.mirror_color = ReadSinglesToColor(binary_reader_, 1); result.toon_index = binary_reader_.ReadByte(); result.edge_flag = binary_reader_.ReadByte(); result.face_vert_count = binary_reader_.ReadUInt32(); // テクスチャ名の抜き出し // スフィアマップも行う string buf = ConvertByteToString(binary_reader_.ReadBytes(20), ""); //Debug by Wilfrem: テクスチャが無い場合を考慮していない //Debug by Wilfrem: テクスチャはfoo.bmp*bar.sphのパターンだけなのか? bar.sph*foo.bmpのパターンがあり得るのでは? 対策をしておくべき //Debug by GRGSIBERIA: スフィアマップとテクスチャが逆になる現象が発生したので修正 //Debug by GRGSIBERIA: "./テクスチャ名"で始まるモデルで異常発生したので修正 if (!string.IsNullOrEmpty(buf.Trim())) { string[] textures = buf.Trim().Split('*'); foreach (var tex in textures) { string texNameEndAssignVar = ""; string ext = Path.GetExtension(tex); if (ext == ".sph" || ext == ".spa") { result.sphere_map_name = tex; /*} else if (string.IsNullOrEmpty(tex)) { * result.texture_file_name=""; */ } else { if (tex.Split('/')[0] == ".") { // テクスチャ名の後端に"./"があった場合の回避処理 string[] texNameBuf = tex.Split('/'); for (int i = 1; i < texNameBuf.Length - 1; i++) { texNameEndAssignVar += texNameBuf[i] + "/"; } texNameEndAssignVar += texNameBuf[texNameBuf.Length - 1]; } else { // 特に異常がない場合はそのまま代入 texNameEndAssignVar = tex; } #if UNITY_STANDALONE_OSX // MACの場合,濁点のあるひらがなを使うと動かないらしいので対策 // http://sourceforge.jp/ticket/browse.php?group_id=6158&tid=31929 texNameEndAssignVar = texNameEndAssignVar.Normalize(NormalizationForm.FormKD); #endif result.texture_file_name = texNameEndAssignVar; } } } else { result.sphere_map_name = ""; result.texture_file_name = ""; } if (string.IsNullOrEmpty(result.texture_file_name)) { result.texture_file_name = ""; } return(result); }