Example #1
0
    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;
    }
Example #2
0
    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);
    }
Example #4
0
    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);
    }
Example #5
0
        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);
            }
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }