Program.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System;
  4. namespace AssetsModelGenerator
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. /*
  11. Create object model from assets folder
  12. Can be used via T4
  13. */
  14. if (args.Length != 2)
  15. {
  16. Console.WriteLine("Usage: assets_folder output_path");
  17. return;
  18. }
  19. string assetsFolder = args[0];
  20. string codeFile = args[1];
  21. string code = @"using Urho.Gui;
  22. using Urho.Urho2D;
  23. using Urho.Resources;
  24. namespace Urho
  25. {" + "\n";
  26. Node rootNode = new Node { Name = "CoreAssets", Level = 1 };
  27. VisitFolder(assetsFolder, rootNode);
  28. GenerateCode(rootNode, ref code, assetsFolder);
  29. code += "\n}";
  30. File.WriteAllText(codeFile, code);
  31. }
  32. static void GetFiles(Node node, List<string> files)
  33. {
  34. files.AddRange(node.Files);
  35. foreach (var child in node.Children)
  36. GetFiles(child, files);
  37. }
  38. static void GenerateCode(Node node, ref string code, string rootFolder)
  39. {
  40. List<string> allFiles = new List<string>();
  41. GetFiles(node, allFiles);
  42. if (allFiles.Count < 1)
  43. return;
  44. //check if node has any files
  45. code += $"\n{Tabs(node.Level)}public static class {node.Name}";
  46. if (node.Level == 1)
  47. code += $"\n{Tabs(node.Level)}{{\n{Tabs(node.Level + 1)}public static ResourceCache Cache => Application.Current.ResourceCache;\n";
  48. else
  49. code += $"\n{Tabs(node.Level)}{{\n";
  50. foreach (var file in node.Files)
  51. {
  52. string relativePath = file.Remove(0, rootFolder.Length + 1).Replace("\\", "/");
  53. code += $"{Tabs(node.Level + 1)}public static {node.AssetType} {Path.GetFileNameWithoutExtension(file)} => Cache.Get{node.AssetType}(\"{relativePath}\");\n";
  54. }
  55. foreach (var child in node.Children)
  56. {
  57. GenerateCode(child, ref code, rootFolder);
  58. }
  59. code += $"{Tabs(node.Level)}}}\n";
  60. }
  61. static string Tabs(int c) => new string('\t', c);
  62. static void VisitFolder(string folder, Node currentNode)
  63. {
  64. var folderName = Path.GetFileName(folder);
  65. switch (folderName)
  66. {
  67. case "Materials": currentNode.AssetType = AssetType.Material; break;
  68. case "Textures": currentNode.AssetType = AssetType.Texture2D; break;
  69. case "Models": currentNode.AssetType = AssetType.Model; break;
  70. case "Fonts": currentNode.AssetType = AssetType.Font; break;
  71. //case "Shaders": currentNode.AssetType = AssetType.Shader; break;
  72. case "Techniques": currentNode.AssetType = AssetType.Technique; break;
  73. case "RenderPaths": currentNode.AssetType = AssetType.XmlFile; break;
  74. case "Music": currentNode.AssetType = AssetType.Sound; break;
  75. case "Sounds": currentNode.AssetType = AssetType.Sound; break;
  76. case "Scenes": currentNode.AssetType = AssetType.XmlFile; break;
  77. case "PostProcess": currentNode.AssetType = AssetType.XmlFile; break;
  78. }
  79. if (currentNode.AssetType > AssetType.Unknown)
  80. {
  81. currentNode.Files.AddRange(Directory.GetFiles(folder));
  82. }
  83. foreach (var subDir in Directory.GetDirectories(folder))
  84. {
  85. Node childNode = new Node { Name = Path.GetFileName(subDir), AssetType = currentNode.AssetType, Level = currentNode.Level + 1 };
  86. currentNode.Children.Add(childNode);
  87. VisitFolder(subDir, childNode);
  88. }
  89. }
  90. public enum AssetType
  91. {
  92. Default = 0,
  93. Unknown,
  94. Model,
  95. Material,
  96. Texture2D,
  97. Font,
  98. XmlFile,
  99. //Shader,
  100. Technique,
  101. Sound
  102. }
  103. public class Node
  104. {
  105. public int Level { get; set; }
  106. public string Name { get; set; }
  107. public AssetType AssetType { get; set; }
  108. public List<Node> Children { get; } = new List<Node>();
  109. public List<string> Files { get; } = new List<string>();
  110. public override string ToString() => $"{Name}, Type={AssetType}, Files={Files.Count}, Children={Children.Count}";
  111. }
  112. }
  113. }