/// <summary> /// Compile Json to PSB /// </summary> /// <param name="inputJson">Json text</param> /// <param name="inputResJson">Resource Json text</param> /// <param name="baseDir">If resource Json uses relative paths (usually it does), specify the base dir</param> /// <param name="version">PSB version</param> /// <param name="cryptKey">CryptKey, if you need to use it outside FreeMote</param> /// <param name="spec">PSB Platform</param> /// <returns></returns> public static byte[] Compile(string inputJson, string inputResJson, string baseDir = null, ushort?version = null, uint?cryptKey = null, PsbSpec?spec = null) { //Parse PSB psb = Parse(inputJson, version ?? 3); //Link if (!string.IsNullOrWhiteSpace(inputResJson)) { if (inputResJson.Trim().StartsWith("{")) //resx.json { PsbResourceJson resx = JsonConvert.DeserializeObject <PsbResourceJson>(inputResJson); if (resx.PsbType != null) { psb.Type = resx.PsbType.Value; } if (resx.PsbVersion != null && version == null) { psb.Header.Version = resx.PsbVersion.Value; } if (resx.Platform != null && spec == null) { spec = resx.Platform; } if (resx.CryptKey != null & cryptKey == null) { cryptKey = resx.CryptKey; } if (resx.ExternalTextures) { Console.WriteLine("[INFO] External Texture mode ON, no resource will be compiled."); } else { psb.Link(resx, baseDir); } } else { List <string> resources = JsonConvert.DeserializeObject <List <string> >(inputResJson); psb.Link(resources, baseDir); } } //Build psb.Merge(); if (spec != null && spec != psb.Platform) { psb.SwitchSpec(spec.Value, spec.Value.DefaultPixelFormat()); psb.Merge(); } var bytes = psb.Build(); //Convert return(cryptKey != null?PsbFile.EncodeToBytes(cryptKey.Value, bytes, EncodeMode.Encrypt, EncodePosition.Auto) : bytes); }
public void TestInline() { var resPath = Path.Combine(Environment.CurrentDirectory, @"..\..\Res"); var path = Path.Combine(resPath, "2001010400_00_mid.pure.psb"); var texPath = Path.Combine(resPath, "2001010400_00_mid_tex000.png"); PSB psb = new PSB(path); psb.Link(new List <string> { texPath }, order: PsbLinkOrderBy.Order); psb.Merge(); File.WriteAllBytes("inline.psb", psb.Build()); PSB p2 = new PSB("inline.psb"); }
private static void Link(string psbPath, List <string> texPaths, PsbLinkOrderBy order) { if (!File.Exists(psbPath)) { return; } var name = Path.GetFileNameWithoutExtension(psbPath); var ext = Path.GetExtension(psbPath); try { List <string> texs = new List <string>(); foreach (var texPath in texPaths) { if (File.Exists(texPath)) { texs.Add(texPath); } else if (Directory.Exists(texPath)) { texs.AddRange(Directory.EnumerateFiles(texPath)); } } PSB psb = new PSB(psbPath); psb.Link(texs, order: order, isExternal: true); psb.Merge(); File.WriteAllBytes(Path.ChangeExtension(psbPath, "linked" + ext), psb.Build()); } catch (Exception e) { Console.WriteLine(e); } Console.WriteLine($"Link {name} succeed."); }
/// <summary> /// Load PSB From Json file /// </summary> /// <param name="inputPath">Json file path</param> /// <param name="inputResPath">Resource Json file</param> /// <param name="version">PSB version</param> /// <returns></returns> public static PSB LoadPsbFromJsonFile(string inputPath, string inputResPath = null, ushort?version = null) { if (string.IsNullOrEmpty(inputPath)) { throw new FileNotFoundException("Can not find input json file."); } if (string.IsNullOrEmpty(inputResPath) || !File.Exists(inputResPath)) { inputResPath = Path.ChangeExtension(inputPath, ".resx.json"); if (!File.Exists(inputResPath)) { inputResPath = Path.ChangeExtension(inputPath, ".res.json"); } } string inputResJson = null; string baseDir = Path.GetDirectoryName(inputPath); if (File.Exists(inputResPath)) { inputResJson = File.ReadAllText(inputResPath); baseDir = Path.GetDirectoryName(inputPath); } //Parse PSB psb = Parse(File.ReadAllText(inputPath), version ?? 3); //Link if (!string.IsNullOrWhiteSpace(inputResJson)) { if (inputResJson.Trim().StartsWith("{")) //resx.json { PsbResourceJson resx = JsonConvert.DeserializeObject <PsbResourceJson>(inputResJson); if (resx.PsbType != null) { psb.Type = resx.PsbType.Value; } if (resx.PsbVersion != null && version == null) { psb.Header.Version = resx.PsbVersion.Value; } if (resx.ExternalTextures) { Console.WriteLine("[INFO] External Texture mode ON, no resource will be compiled."); } else { psb.Link(resx, baseDir); } if (resx.Platform != null) { psb.SwitchSpec(resx.Platform.Value, resx.Platform.Value.DefaultPixelFormat()); } } else { List <string> resources = JsonConvert.DeserializeObject <List <string> >(inputResJson); psb.Link(resources, baseDir); } } if (version != null) { psb.Header.Version = version.Value; } psb.Merge(); return(psb); }
/// <summary> /// Compile Json to PSB /// </summary> /// <param name="inputJson">Json text</param> /// <param name="inputResJson">Resource Json text</param> /// <param name="baseDir">If resource Json uses relative paths (usually it does), specify the base dir</param> /// <param name="version">PSB version</param> /// <param name="cryptKey">CryptKey, use null for pure PSB</param> /// <param name="spec">PSB Platform</param> /// <param name="keepShell">If true, try to compress PSB to shell type (MDF/LZ4 etc.) specified in resx.json; otherwise just output PSB</param> /// <returns></returns> public static byte[] Compile(string inputJson, string inputResJson, string baseDir = null, ushort?version = null, uint?cryptKey = null, PsbSpec?spec = null, bool keepShell = true) { var context = FreeMount.CreateContext(); //Parse PSB psb = Parse(inputJson, version ?? 3); //Link if (!string.IsNullOrWhiteSpace(inputResJson)) { if (inputResJson.Trim().StartsWith("{")) //resx.json { PsbResourceJson resx = JsonConvert.DeserializeObject <PsbResourceJson>(inputResJson); if (resx.PsbType != null) { psb.Type = resx.PsbType.Value; } if (resx.PsbVersion != null && version == null) { psb.Header.Version = resx.PsbVersion.Value; } if (resx.Platform != null && spec == null) { spec = resx.Platform; } if (resx.CryptKey != null & cryptKey == null) { cryptKey = resx.CryptKey; } context = FreeMount.CreateContext(resx.Context); if (resx.HasExtraResources) { PsbResHelper.LinkExtraResources(psb, context, resx.ExtraResources, resx.ExtraFlattenArrays, baseDir); } if (resx.ExternalTextures) { #if DEBUG Console.WriteLine("[INFO] External Texture mode ON, no resource will be compiled."); #endif } else { psb.Link(resx, baseDir); } } else { List <string> resources = JsonConvert.DeserializeObject <List <string> >(inputResJson); psb.Link(resources, baseDir); } } //Build psb.Merge(); if (spec != null && spec != psb.Platform) { psb.SwitchSpec(spec.Value, spec.Value.DefaultPixelFormat()); psb.Merge(); } var bytes = psb.Build(); //Convert if (cryptKey != null) { bytes = PsbFile.EncodeToBytes(cryptKey.Value, bytes, EncodeMode.Encrypt, EncodePosition.Auto); } if (context.HasShell && keepShell) { using var outStream = context.PackToShell(new MemoryStream(bytes)); bytes = outStream.ToArray(); } return(bytes); }