예제 #1
0
        /*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);
            }
        }
예제 #2
0
        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"));
            }
        }
예제 #3
0
파일: Model.cs 프로젝트: Pandaaa2507/OWLib
            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}");
                    }
                }
            }
예제 #4
0
        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);
            }
        }
예제 #5
0
파일: Model.cs 프로젝트: Pandaaa2507/OWLib
 public OverwatchMaterial(FindLogic.Combo.ComboInfo info, FindLogic.Combo.MaterialAsset materialInfo)
 {
     Info         = info;
     MaterialInfo = materialInfo;
 }