コード例 #1
0
    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);
    }
コード例 #2
0
        // 色の生成
        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;
            }
        }
コード例 #3
0
	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;
	}
コード例 #4
0
    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);
    }
コード例 #5
0
	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;
	}
コード例 #6
0
    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);
    }