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);
    }
 private PMXFormat.Material ReadMaterial()
 {
     PMXFormat.Material result = new PMXFormat.Material();
     result.name                  = ReadString();
     result.english_name          = ReadString();
     result.diffuse_color         = ReadSinglesToColor(binary_reader_);    // dr, dg, db, da // 減衰色
     result.specular_color        = ReadSinglesToColor(binary_reader_, 1); // sr, sg, sb // 光沢色
     result.specularity           = binary_reader_.ReadSingle();
     result.ambient_color         = ReadSinglesToColor(binary_reader_, 1); // mr, mg, mb // 環境色(ambient)
     result.flag                  = (PMXFormat.Material.Flag)binary_reader_.ReadByte();
     result.edge_color            = ReadSinglesToColor(binary_reader_);    // r, g, b, a
     result.edge_size             = binary_reader_.ReadSingle();
     result.usually_texture_index = CastIntRead(binary_reader_, format_.header.textureIndexSize);
     result.sphere_texture_index  = CastIntRead(binary_reader_, format_.header.textureIndexSize);
     result.sphere_mode           = (PMXFormat.Material.SphereMode)binary_reader_.ReadByte();
     result.common_toon           = binary_reader_.ReadByte();
     PMXFormat.Header.IndexSize texture_index_size = ((result.common_toon == 0)? format_.header.textureIndexSize: PMXFormat.Header.IndexSize.Byte1);
     result.toon_texture_index = CastIntRead(binary_reader_, texture_index_size);
     result.memo            = ReadString();
     result.face_vert_count = binary_reader_.ReadUInt32();         // 面頂点数 // インデックスに変換する場合は、材質0から順に加算
     return(result);
 }
Example #3
0
	private PMXFormat.Material ReadMaterial() {
		PMXFormat.Material result = new PMXFormat.Material();
		result.name = ReadString();
		result.english_name = ReadString();
		result.diffuse_color = ReadSinglesToColor(binary_reader_); // dr, dg, db, da // 減衰色
		result.specular_color = ReadSinglesToColor(binary_reader_, 1); // sr, sg, sb // 光沢色
		result.specularity = binary_reader_.ReadSingle();
		result.ambient_color = ReadSinglesToColor(binary_reader_, 1); // mr, mg, mb // 環境色(ambient)
		result.flag = (PMXFormat.Material.Flag)binary_reader_.ReadByte();
		result.edge_color = ReadSinglesToColor(binary_reader_); // r, g, b, a
		result.edge_size = binary_reader_.ReadSingle();
		result.usually_texture_index = CastIntRead(binary_reader_, format_.header.textureIndexSize);
		result.sphere_texture_index = CastIntRead(binary_reader_, format_.header.textureIndexSize);
		result.sphere_mode = (PMXFormat.Material.SphereMode)binary_reader_.ReadByte();
		result.common_toon = binary_reader_.ReadByte();
		PMXFormat.Header.IndexSize texture_index_size = ((result.common_toon == 0)? format_.header.textureIndexSize: PMXFormat.Header.IndexSize.Byte1);
		result.toon_texture_index = CastIntRead(binary_reader_, texture_index_size);
		result.memo = ReadString();
		result.face_vert_count = binary_reader_.ReadUInt32(); // 面頂点数 // インデックスに変換する場合は、材質0から順に加算
		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 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;
	}