public static void DoMatAndPng(string rootName, string path) { string assetPath = TCommon.RemovePathPrefix(path); Material m = AssetDatabase.LoadAssetAtPath <Material>(assetPath); MatData data = MatTool.MatToJson(m); string jsonData = JsonMapper.ToJson(data); StringBuilder sb = new StringBuilder(); JsonWriter write = new JsonWriter(sb); JsonMapper.ToJson(data, write); int idx = path.LastIndexOf('\\'); string paraPath = path.Substring(0, idx); Debug.Log("paraPath:" + paraPath); paraPath = paraPath + "\\mat.json"; File.WriteAllText(paraPath, sb.ToString()); //对mat_json文件标记ab AssetImporter importer = AssetImporter.GetAtPath(TCommon.RemovePathPrefix(paraPath)); importer.assetBundleName = $"{rootName}_mat"; importer.assetBundleVariant = TCommon.ABSUFFIX; AssetImporter importerTex = AssetImporter.GetAtPath(data.attributes[0].texAttri.Item3.bundleDir); importerTex.assetBundleName = $"{rootName}_png"; importerTex.assetBundleVariant = TCommon.ABSUFFIX; }
public GameObject LoadModel(string modelName) { //加载图片 string pngPath = $"{Application.streamingAssetsPath}/model/{modelName}_png{TCommon.ABSUFFIX_AFTER}"; string fbxPath = $"{Application.streamingAssetsPath}/model/{modelName}_base{TCommon.ABSUFFIX_AFTER}"; AssetBundle ab_png = AssetBundle.LoadFromFile(TCommon.RemovePathPrefix(pngPath)); Texture2D png = ab_png.LoadAsset <Texture2D>("city02_beauty"); //加载材质球json string jsonPath = $"{Application.streamingAssetsPath}/model/{modelName}_mat{TCommon.ABSUFFIX_AFTER}"; AssetBundle ab_json = AssetBundle.LoadFromFile(jsonPath); TextAsset textAsset = ab_json.LoadAsset <TextAsset>("mat"); MatData matData = new MatData(); matData = JsonMapper.ToObject <MatData>(textAsset.text); Shader shader = new Shader(); shader = Shader.Find(matData.shader); Material mat = new Material(shader); mat.mainTexture = png; Debug.Log("aa:" + matData.shader); //加载fbx AssetBundle fbx_ab = AssetBundle.LoadFromFile(TCommon.RemovePathPrefix(fbxPath)); GameObject prefab = fbx_ab.LoadAsset <GameObject>(modelName); GameObject model = GameObject.Instantiate(prefab); MeshRenderer render = model.GetComponent <MeshRenderer>(); render.material = mat; return(model); }
//public Material Mat //{ // get // { // return mat; // } //} //public MaterialPropertyBlock Prop //{ // get // { // return prop; // } //} public void SetMatData(Texture2D tex, float max) { if (matData == null) { matData = new MatData(); } matData.SetValue(tex, max); }
public static MatData MatToJson(Material mat) { MatData data = new MatData(); Shader shader = mat.shader; data.shader = shader.name; int propertyCount = ShaderUtil.GetPropertyCount(shader); for (int i = 0; i < propertyCount; i++) { Attritubute attr = new Attritubute(); string propertyName = ShaderUtil.GetPropertyName(shader, i); MatShaderPropertyType type = (MatShaderPropertyType)ShaderUtil.GetPropertyType(shader, i); switch (type) { case MatShaderPropertyType.Color: Color color = mat.GetColor(propertyName); attr.attri = new Tuple <string, MatShaderPropertyType, MatVector>(propertyName, type, new MatVector() { x = color.r, y = color.g, z = color.b, w = color.a }); break; case MatShaderPropertyType.Float: case MatShaderPropertyType.Range: double f = mat.GetFloat(propertyName); attr.floatAttri = new Tuple <string, MatShaderPropertyType, double>(propertyName, type, f); break; case MatShaderPropertyType.Vector: Vector4 v4 = mat.GetVector(propertyName); attr.attri = new Tuple <string, MatShaderPropertyType, MatVector>(propertyName, type, new MatVector() { x = v4.x, y = v4.y, z = v4.z, w = v4.w }); break; case MatShaderPropertyType.TexEnv: Texture t2d = mat.GetTexture(propertyName); string assetPath = AssetDatabase.GetAssetPath(t2d); attr.texAttri = new Tuple <string, MatShaderPropertyType, MatTex>(propertyName, type, new MatTex() { texName = t2d.name, bundleDir = assetPath }); break; } data.attributes.Add(attr); } return(data); }
public void Fill(MatData m) { property = m; listBox1.Items.Clear(); int i = 0, max = (m.frames.Count - 1).ToString().Length; foreach (MatData.frame frame in m.frames) { StandardKeyframe s = new StandardKeyframe(i++, frame, m.name) { maxLength = max }; listBox1.Items.Add(s); } }
private void ParseMaterials(CR2WFile cr2w, Stream meshStream, FileInfo outfile, List <Archive> archives, string matRepo, EUncookExtension eUncookExtension = EUncookExtension.dds) { var primaryDependencies = new List <string>(); var materialEntryNames = new List <string>(); var materialEntries = new List <CMaterialInstance>(); GetMateriaEntries(cr2w, meshStream, ref primaryDependencies, ref materialEntryNames, ref materialEntries, archives); var mlSetupNames = new List <string>(); var mlTemplateNames = new List <string>(); var HairProfileNames = new List <string>(); var TexturesList = new List <string>(); var exportArgs = new GlobalExportArgs().Register( new XbmExportArgs() { UncookExtension = eUncookExtension }, new MlmaskExportArgs() { UncookExtension = eUncookExtension.ToMlmaskUncookExtension() } ); for (var i = 0; i < primaryDependencies.Count; i++) { if (Path.GetExtension(primaryDependencies[i]) == ".xbm") { if (!TexturesList.Contains(primaryDependencies[i])) { TexturesList.Add(primaryDependencies[i]); } var hash = FNV1A64HashAlgorithm.HashString(primaryDependencies[i]); foreach (var ar in archives) { if (ar.Files.ContainsKey(hash)) { if (!File.Exists(Path.Combine(matRepo, Path.ChangeExtension(primaryDependencies[i], "." + exportArgs.Get <XbmExportArgs>().UncookExtension.ToString())))) { if (Directory.Exists(matRepo)) { UncookSingle(ar, hash, new DirectoryInfo(matRepo), exportArgs); } } break; } } } if (Path.GetExtension(primaryDependencies[i]) == ".mlmask") { if (!TexturesList.Contains(primaryDependencies[i])) { TexturesList.Add(primaryDependencies[i]); } var hash = FNV1A64HashAlgorithm.HashString(primaryDependencies[i]); foreach (var ar in archives) { if (ar.Files.ContainsKey(hash)) { if (!File.Exists(Path.Combine(matRepo, primaryDependencies[i].Replace(".mlmask", $"_0.{exportArgs.Get<XbmExportArgs>().UncookExtension.ToString()}")))) { if (Directory.Exists(matRepo)) { UncookSingle(ar, hash, new DirectoryInfo(matRepo), exportArgs); } } break; } } } if (Path.GetExtension(primaryDependencies[i]) == ".hp") { if (!HairProfileNames.Contains(primaryDependencies[i])) { var hash = FNV1A64HashAlgorithm.HashString(primaryDependencies[i]); foreach (var ar in archives) { if (ar.Files.ContainsKey(hash)) { var ms = new MemoryStream(); ExtractSingleToStream(ar, hash, ms); ms.Seek(0, SeekOrigin.Begin); HairProfileNames.Add(primaryDependencies[i]); var path = Path.Combine(matRepo, Path.ChangeExtension(primaryDependencies[i], ".hp.json")); if (!File.Exists(path)) { if (!new FileInfo(path).Directory.Exists) { Directory.CreateDirectory(new FileInfo(path).Directory.FullName); } var hp = _wolvenkitFileService.ReadRed4File(ms); //hp.FileName = primaryDependencies[i]; var dto = new RedFileDto(hp); var doc = RedJsonSerializer.Serialize(dto); File.WriteAllText(path, doc); } break; } } } } if (Path.GetExtension(primaryDependencies[i]) == ".mlsetup") { if (!mlSetupNames.Contains(primaryDependencies[i])) { var hash = FNV1A64HashAlgorithm.HashString(primaryDependencies[i]); foreach (var ar in archives) { if (ar.Files.ContainsKey(hash)) { var ms = new MemoryStream(); ExtractSingleToStream(ar, hash, ms); ms.Seek(0, SeekOrigin.Begin); var isResource = _wolvenkitFileService.IsCR2WFile(ms); if (!isResource) { throw new InvalidParsingException("not a cr2w file"); } using var reader = new CR2WReader(ms); _ = reader.ReadFile(out var mls, false); mlSetupNames.Add(primaryDependencies[i]); var path = Path.Combine(matRepo, Path.ChangeExtension(primaryDependencies[i], ".mlsetup.json")); if (!File.Exists(path)) { if (!new FileInfo(path).Directory.Exists) { Directory.CreateDirectory(new FileInfo(path).Directory.FullName); } //mls.FileName = primaryDependencies[i]; var dto = new RedFileDto(mls); var doc = RedJsonSerializer.Serialize(dto); File.WriteAllText(path, doc); } for (var e = 0; e < reader.ImportsList.Count; e++) { if (Path.GetExtension(reader.ImportsList[e].DepotPath) == ".xbm") { if (!TexturesList.Contains(reader.ImportsList[e].DepotPath)) { TexturesList.Add(reader.ImportsList[e].DepotPath); } var hash1 = FNV1A64HashAlgorithm.HashString(reader.ImportsList[e].DepotPath); foreach (var arr in archives) { if (arr.Files.ContainsKey(hash1)) { if (!File.Exists(Path.Combine(matRepo, Path.ChangeExtension(reader.ImportsList[e].DepotPath, "." + exportArgs.Get <XbmExportArgs>().UncookExtension.ToString())))) { if (Directory.Exists(matRepo)) { UncookSingle(arr, hash1, new DirectoryInfo(matRepo), exportArgs); } } break; } } } if (Path.GetExtension(reader.ImportsList[e].DepotPath) == ".mltemplate") { if (!mlTemplateNames.Contains(reader.ImportsList[e].DepotPath)) { var hash2 = FNV1A64HashAlgorithm.HashString(reader.ImportsList[e].DepotPath); foreach (var arr in archives) { if (arr.Files.ContainsKey(hash2)) { var mss = new MemoryStream(); ExtractSingleToStream(arr, hash2, mss); mss.Seek(0, SeekOrigin.Begin); var mlt = _wolvenkitFileService.ReadRed4File(mss); mlTemplateNames.Add(reader.ImportsList[e].DepotPath); var path1 = Path.Combine(matRepo, Path.ChangeExtension(reader.ImportsList[e].DepotPath, ".mltemplate.json")); if (!File.Exists(path1)) { if (!new FileInfo(path1).Directory.Exists) { Directory.CreateDirectory(new FileInfo(path1).Directory.FullName); } //mlt.FileName = mls.Imports[e].DepotPath; var dto1 = new RedFileDto(mlt); var doc1 = RedJsonSerializer.Serialize(dto1); File.WriteAllText(path1, doc1); } for (var eye = 0; eye < reader.ImportsList.Count; eye++) { if (!TexturesList.Contains(reader.ImportsList[eye].DepotPath)) { TexturesList.Add(reader.ImportsList[eye].DepotPath); } var hash3 = FNV1A64HashAlgorithm.HashString(reader.ImportsList[eye].DepotPath); foreach (var arrr in archives) { if (arrr.Files.ContainsKey(hash3)) { if (!File.Exists(Path.Combine(matRepo, Path.ChangeExtension(reader.ImportsList[eye].DepotPath, "." + exportArgs.Get <XbmExportArgs>().UncookExtension.ToString())))) { if (Directory.Exists(matRepo)) { UncookSingle(arrr, hash3, new DirectoryInfo(matRepo), exportArgs); } } break; } } } break; } } } } } break; } } } } } var RawMaterials = new List <RawMaterial>(); var usedMts = new Dictionary <string, CMaterialTemplate>(); for (var i = 0; i < materialEntries.Count; i++) { RawMaterials.Add(ContainRawMaterial(materialEntries[i], materialEntryNames[i], archives, ref usedMts)); } var matTemplates = new List <RawMaterial>(); { var keys = usedMts.Keys.ToList(); for (var i = 0; i < keys.Count; i++) { var rawMat = new RawMaterial { Name = keys[i], Data = new Dictionary <string, object>() }; foreach (var item in usedMts[keys[i]].Parameters[2]) { rawMat.Data.Add(item.Chunk.ParameterName, GetSerializableValue(item.Chunk)); } matTemplates.Add(rawMat); } } var matData = new MatData { MaterialRepo = matRepo, Materials = RawMaterials, TexturesList = TexturesList, MaterialTemplates = matTemplates }; var str = RedJsonSerializer.Serialize(matData); File.WriteAllText(Path.ChangeExtension(outfile.FullName, ".Material.json"), str); }
private void ParseMaterials(CR2WFile cr2w, Stream meshStream, FileInfo outfile, List <Archive> archives, string matRepo, EUncookExtension eUncookExtension = EUncookExtension.dds) { var settings = new JsonSerializerSettings() { Formatting = Formatting.Indented }; List <string> primaryDependencies = new List <string>(); List <string> materialEntryNames = new List <string>(); List <CMaterialInstance> materialEntries = new List <CMaterialInstance>(); GetMateriaEntries(cr2w, meshStream, ref primaryDependencies, ref materialEntryNames, ref materialEntries, archives); List <string> mlSetupNames = new List <string>(); List <string> mlTemplateNames = new List <string>(); List <string> HairProfileNames = new List <string>(); List <string> TexturesList = new List <string>(); var exportArgs = new GlobalExportArgs().Register( new XbmExportArgs() { UncookExtension = eUncookExtension }, new MlmaskExportArgs() { UncookExtension = eUncookExtension } ); for (int i = 0; i < primaryDependencies.Count; i++) { if (Path.GetExtension(primaryDependencies[i]) == ".xbm") { if (!TexturesList.Contains(primaryDependencies[i])) { TexturesList.Add(primaryDependencies[i]); } ulong hash = FNV1A64HashAlgorithm.HashString(primaryDependencies[i]); foreach (Archive ar in archives) { if (ar.Files.ContainsKey(hash)) { if (!File.Exists(Path.Combine(matRepo, Path.ChangeExtension(primaryDependencies[i], "." + exportArgs.Get <XbmExportArgs>().UncookExtension.ToString())))) { if (Directory.Exists(matRepo)) { UncookSingle(ar, hash, new DirectoryInfo(matRepo), exportArgs); } } break; } } } if (Path.GetExtension(primaryDependencies[i]) == ".mlmask") { if (!TexturesList.Contains(primaryDependencies[i])) { TexturesList.Add(primaryDependencies[i]); } ulong hash = FNV1A64HashAlgorithm.HashString(primaryDependencies[i]); foreach (Archive ar in archives) { if (ar.Files.ContainsKey(hash)) { if (!File.Exists(Path.Combine(matRepo, primaryDependencies[i].Replace(".mlmask", $"_0.{exportArgs.Get<XbmExportArgs>().UncookExtension.ToString()}")))) { if (Directory.Exists(matRepo)) { UncookSingle(ar, hash, new DirectoryInfo(matRepo), exportArgs); } } break; } } } if (Path.GetExtension(primaryDependencies[i]) == ".hp") { if (!HairProfileNames.Contains(primaryDependencies[i])) { ulong hash = FNV1A64HashAlgorithm.HashString(primaryDependencies[i]); foreach (Archive ar in archives) { if (ar.Files.ContainsKey(hash)) { var ms = new MemoryStream(); ExtractSingleToStream(ar, hash, ms); HairProfileNames.Add(primaryDependencies[i]); string path = Path.Combine(matRepo, Path.ChangeExtension(primaryDependencies[i], ".hp.json")); if (!File.Exists(path)) { if (!new FileInfo(path).Directory.Exists) { Directory.CreateDirectory(new FileInfo(path).Directory.FullName); } var hp = _wolvenkitFileService.TryReadCr2WFile(ms); hp.FileName = primaryDependencies[i]; var dto = new RedFileDto(hp); var doc = JsonConvert.SerializeObject(dto, settings); File.WriteAllText(path, doc); } break; } } } } if (Path.GetExtension(primaryDependencies[i]) == ".mlsetup") { if (!mlSetupNames.Contains(primaryDependencies[i])) { ulong hash = FNV1A64HashAlgorithm.HashString(primaryDependencies[i]); foreach (Archive ar in archives) { if (ar.Files.ContainsKey(hash)) { var ms = new MemoryStream(); ExtractSingleToStream(ar, hash, ms); var mls = _wolvenkitFileService.TryReadCr2WFile(ms); mlSetupNames.Add(primaryDependencies[i]); string path = Path.Combine(matRepo, Path.ChangeExtension(primaryDependencies[i], ".mlsetup.json")); if (!File.Exists(path)) { if (!new FileInfo(path).Directory.Exists) { Directory.CreateDirectory(new FileInfo(path).Directory.FullName); } mls.FileName = primaryDependencies[i]; var dto = new RedFileDto(mls); var doc = JsonConvert.SerializeObject(dto, settings); File.WriteAllText(path, doc); } for (int e = 0; e < mls.Imports.Count; e++) { if (Path.GetExtension(mls.Imports[e].DepotPathStr) == ".xbm") { if (!TexturesList.Contains(mls.Imports[e].DepotPathStr)) { TexturesList.Add(mls.Imports[e].DepotPathStr); } ulong hash1 = FNV1A64HashAlgorithm.HashString(mls.Imports[e].DepotPathStr); foreach (Archive arr in archives) { if (arr.Files.ContainsKey(hash1)) { if (!File.Exists(Path.Combine(matRepo, Path.ChangeExtension(mls.Imports[e].DepotPathStr, "." + exportArgs.Get <XbmExportArgs>().UncookExtension.ToString())))) { if (Directory.Exists(matRepo)) { UncookSingle(arr, hash1, new DirectoryInfo(matRepo), exportArgs); } } break; } } } if (Path.GetExtension(mls.Imports[e].DepotPathStr) == ".mltemplate") { if (!mlTemplateNames.Contains(mls.Imports[e].DepotPathStr)) { ulong hash2 = FNV1A64HashAlgorithm.HashString(mls.Imports[e].DepotPathStr); foreach (Archive arr in archives) { if (arr.Files.ContainsKey(hash2)) { var mss = new MemoryStream(); ExtractSingleToStream(arr, hash2, mss); var mlt = _wolvenkitFileService.TryReadCr2WFile(mss); mlTemplateNames.Add(mls.Imports[e].DepotPathStr); string path1 = Path.Combine(matRepo, Path.ChangeExtension(mls.Imports[e].DepotPathStr, ".mltemplate.json")); if (!File.Exists(path1)) { if (!new FileInfo(path1).Directory.Exists) { Directory.CreateDirectory(new FileInfo(path1).Directory.FullName); } mlt.FileName = mls.Imports[e].DepotPathStr; var dto1 = new RedFileDto(mlt); var doc1 = JsonConvert.SerializeObject(dto1, settings); File.WriteAllText(path1, doc1); } for (int eye = 0; eye < mlt.Imports.Count; eye++) { if (!TexturesList.Contains(mlt.Imports[eye].DepotPathStr)) { TexturesList.Add(mlt.Imports[eye].DepotPathStr); } ulong hash3 = FNV1A64HashAlgorithm.HashString(mlt.Imports[eye].DepotPathStr); foreach (Archive arrr in archives) { if (arrr.Files.ContainsKey(hash3)) { if (!File.Exists(Path.Combine(matRepo, Path.ChangeExtension(mlt.Imports[eye].DepotPathStr, "." + exportArgs.Get <XbmExportArgs>().UncookExtension.ToString())))) { if (Directory.Exists(matRepo)) { UncookSingle(arrr, hash3, new DirectoryInfo(matRepo), exportArgs); } } break; } } } break; } } } } } break; } } } } } List <RawMaterial> RawMaterials = new List <RawMaterial>(); Dictionary <string, CMaterialTemplate> usedMts = new Dictionary <string, CMaterialTemplate>(); for (int i = 0; i < materialEntries.Count; i++) { RawMaterials.Add(ContainRawMaterial(materialEntries[i], materialEntryNames[i], archives, ref usedMts)); } List <RawMaterial> matTemplates = new List <RawMaterial>(); { var keys = usedMts.Keys.ToList(); for (int i = 0; i < keys.Count; i++) { var rawMat = new RawMaterial(); rawMat.Name = keys[i]; rawMat.Data = new Dictionary <string, object>(); for (int e = 0; e < usedMts[keys[i]].Parameters[2].Count; e++) { var refer = usedMts[keys[i]].Parameters[2][e].GetReference().Data; if (refer.ChildrEditableVariables.Count > 2) { if (refer.ChildrEditableVariables[2] is Vector4 vec) { vec.X.Value = 0f; vec.Y.Value = 0f; vec.Z.Value = 0f; vec.W.Value = 0f; vec.X.IsSerialized = true; vec.Y.IsSerialized = true; vec.Z.IsSerialized = true; vec.W.IsSerialized = true; } if (refer.ChildrEditableVariables[2] is CFloat flo) { flo.Value = 0f; flo.IsSerialized = true; } if (refer.ChildrEditableVariables[2] is CColor col) { col.Red.Value = 0; col.Green.Value = 0; col.Blue.Value = 0; col.Alpha.Value = 0; col.Red.IsSerialized = true; col.Green.IsSerialized = true; col.Blue.IsSerialized = true; col.Alpha.IsSerialized = true; } if (refer.ChildrEditableVariables[2] is IREDRef dep) { dep.DepotPath = ""; dep.IsSerialized = true; } refer.ChildrEditableVariables[2].IsSerialized = true; rawMat.Data.Add((refer.ChildrEditableVariables[0] as CName).Value, refer.ChildrEditableVariables[2].ToObject()); } } matTemplates.Add(rawMat); } } var matData = new MatData(); matData.MaterialRepo = matRepo; matData.Materials = RawMaterials; matData.TexturesList = TexturesList; matData.MaterialTemplates = matTemplates; string str = JsonConvert.SerializeObject(matData, settings); File.WriteAllText(Path.ChangeExtension(outfile.FullName, ".Material.json"), str); }