/*public static void SaveModelLookSet(ICLIFlags flags, string path, SaveContext info, * IEnumerable<ulong> modelLookSet) { * if(modelLookSet.Count() < 2) { * if (modelLookSet.Count() < 1) { * return; * } * SaveModelLook(flags, path, info, modelLookSet.ElementAt(0)); * return; * } * * FindLogic.Combo.ModelLookAsset modelLookInfo = new FindLogic.Combo.ModelLookAsset(0) { * m_name = string.Join("_", modelLookSet.Select(x => info.m_info.m_modelLooks.ContainsKey(x) ? info.m_info.m_modelLooks[x].GetNameIndex() : $"{x & 0xFFFFFFFFFFFF:X12}")), * m_materialGUIDs = new HashSet<ulong>() * }; * * var doneIDs = new HashSet<ulong>(); * * foreach (ulong modelLookGuid in modelLookSet.Reverse()) { * if (info.m_info.m_modelLooks.ContainsKey(modelLookGuid)) { * foreach(var materialGuid in info.m_info.m_modelLooks[modelLookGuid].m_materialGUIDs) { * var material = info.m_info.m_materials[materialGuid]; * if (doneIDs.Any(x => material.m_materialIDs.Contains(x))) { * continue; * } * doneIDs.UnionWith(material.m_materialIDs); * modelLookInfo.m_materialGUIDs.Add(materialGuid); * } * } * } * * SaveOWMaterialModelLookFile(path, modelLookInfo, info.m_info); * * if (modelLookInfo.m_materialGUIDs == null) return; * foreach (ulong modelLookMaterial in modelLookInfo.m_materialGUIDs) { * SaveMaterial(flags, path, info, modelLookMaterial); * } * }*/ public static void SaveOWMaterialFile(string path, FindLogic.Combo.MaterialAsset materialInfo, FindLogic.Combo.ComboInfo info) { Model.OverwatchMaterial material = new Model.OverwatchMaterial(info, materialInfo); string materialPath = Path.Combine(path, "Materials", $"{materialInfo.GetNameIndex()}.{material.Extension}"); CreateDirectoryFromFile(materialPath); using (Stream materialOutputStream = File.OpenWrite(materialPath)) { materialOutputStream.SetLength(0); material.Write(materialOutputStream); } }
private static void SaveShader(string path, FindLogic.Combo.MaterialAsset materialInfo, FindLogic.Combo.ComboInfo info) { string shaderDirectory = Path.Combine(path, "Shaders", $"{materialInfo.m_materialDataGUID:X16}"); var fn = teResourceGUID.LongKey(materialInfo.m_shaderGroupGUID).ToString("X12"); WriteFile(materialInfo.m_shaderGroupGUID, shaderDirectory, $"{fn}.shadergroup"); WriteFile(materialInfo.m_shaderSourceGUID, shaderDirectory, $"{fn}.shadersource"); // note to others: this isn't source code, its another shader group foreach (var(instance, code, byteCode) in materialInfo.m_shaders) { //var instancePath = Path.Combine(shaderDirectory, $"{instance:X12}"); var codefn = $"{fn}{Path.DirectorySeparatorChar}{teResourceGUID.LongKey(code):X12}"; WriteFile(instance, shaderDirectory, $"{codefn}.fxi"); WriteFile(code, shaderDirectory, $"{codefn}.owfx"); WriteFile(byteCode, Path.Combine(shaderDirectory, $"{codefn}.fxc")); } }
public void Write(Stream stream) { using (BinaryWriter writer = new BinaryWriter(stream)) { writer.Write(OverwatchMaterial.VersionMajor); writer.Write(OverwatchMaterial.VersionMinor); if (ModelLookInfo.m_materialGUIDs == null) { writer.Write(0L); writer.Write((uint)OverwatchMaterial.OWMatType.ModelLook); return; } writer.Write(ModelLookInfo.m_materialGUIDs.LongCount()); writer.Write((uint)OverwatchMaterial.OWMatType.ModelLook); foreach (ulong modelLookMaterial in ModelLookInfo.m_materialGUIDs) { FindLogic.Combo.MaterialAsset materialInfo = Info.m_materials[modelLookMaterial]; writer.Write($"..\\..\\Materials\\{materialInfo.GetNameIndex()}.{Extension}"); } } }
public static void SaveMaterial(ICLIFlags flags, string path, SaveContext info, ulong material) { FindLogic.Combo.MaterialAsset materialInfo = info.m_info.m_materials[material]; FindLogic.Combo.MaterialDataAsset materialDataInfo = info.m_info.m_materialData[materialInfo.m_materialDataGUID]; string textureDirectory = Path.Combine(path, "Textures"); SaveOWMaterialFile(path, materialInfo, info.m_info); if (materialDataInfo.m_textureMap != null) { foreach (KeyValuePair <ulong, uint> texture in materialDataInfo.m_textureMap) { SaveTexture(flags, textureDirectory, info, texture.Key); } } if (Program.Flags.ExtractShaders && materialInfo.m_shaders != null) { SaveShader(path, materialInfo, info.m_info); } }
public OverwatchMaterial(FindLogic.Combo.ComboInfo info, FindLogic.Combo.MaterialAsset materialInfo) { Info = info; MaterialInfo = materialInfo; }