Program.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 GetShaderParameters(string file)
  62. {
  63. // file = @"..\..\..\..\Urho3D\CoreData\Shaders\GLSL\Uniforms.glsl";
  64. string code = "";
  65. var lines = File.ReadAllLines(file);
  66. int lineIndex = -1;
  67. code += "public static class ShaderParameters\n{\n";
  68. foreach (var line in lines)
  69. {
  70. lineIndex++;
  71. var paramName = line.Trim(';', ' ', '\t', '\n', '\r');
  72. if (!paramName.StartsWith("uniform "))
  73. continue;
  74. paramName = paramName.Remove(0, "uniform ".Length);
  75. if (!paramName.Contains(" "))
  76. continue;
  77. var paramType = paramName.Substring(0, paramName.IndexOf(' '));
  78. paramName = paramName.Remove(0, paramType.Length + 1);
  79. if (!paramName.StartsWith("c") || paramName.Contains("["))
  80. continue;
  81. paramName = paramName.Remove(0, 1);// remove 'c' prefix
  82. string comment = $"Type: {paramType}, Defined in {Path.GetFileName(file)}:L{lineIndex}";
  83. code += $"\t/// <summary>\n";
  84. code += $"\t/// {comment}\n";
  85. code += $"\t/// </summary>\n";
  86. code += $"\tpublic const string {paramName} = \"{paramName}\";\n\n";
  87. }
  88. code += "}";
  89. return code;
  90. }
  91. static string Tabs(int c) => new string('\t', c);
  92. static void VisitFolder(string folder, Node currentNode)
  93. {
  94. var folderName = Path.GetFileName(folder);
  95. switch (folderName)
  96. {
  97. case "Materials": currentNode.AssetType = AssetType.Material; break;
  98. case "Textures": currentNode.AssetType = AssetType.Texture2D; break;
  99. case "Models": currentNode.AssetType = AssetType.Model; break;
  100. case "Fonts": currentNode.AssetType = AssetType.Font; break;
  101. //case "Shaders": currentNode.AssetType = AssetType.Shader; break;
  102. case "Techniques": currentNode.AssetType = AssetType.Technique; break;
  103. case "RenderPaths": currentNode.AssetType = AssetType.XmlFile; break;
  104. case "Music": currentNode.AssetType = AssetType.Sound; break;
  105. case "Sounds": currentNode.AssetType = AssetType.Sound; break;
  106. case "Scenes": currentNode.AssetType = AssetType.XmlFile; break;
  107. case "PostProcess": currentNode.AssetType = AssetType.XmlFile; break;
  108. }
  109. if (currentNode.AssetType > AssetType.Unknown)
  110. {
  111. currentNode.Files.AddRange(Directory.GetFiles(folder));
  112. }
  113. foreach (var subDir in Directory.GetDirectories(folder))
  114. {
  115. Node childNode = new Node { Name = Path.GetFileName(subDir), AssetType = currentNode.AssetType, Level = currentNode.Level + 1 };
  116. currentNode.Children.Add(childNode);
  117. VisitFolder(subDir, childNode);
  118. }
  119. }
  120. public enum AssetType
  121. {
  122. Default = 0,
  123. Unknown,
  124. Model,
  125. Material,
  126. Texture2D,
  127. Font,
  128. XmlFile,
  129. //Shader,
  130. Technique,
  131. Sound
  132. }
  133. public class Node
  134. {
  135. public int Level { get; set; }
  136. public string Name { get; set; }
  137. public AssetType AssetType { get; set; }
  138. public List<Node> Children { get; } = new List<Node>();
  139. public List<string> Files { get; } = new List<string>();
  140. public override string ToString() => $"{Name}, Type={AssetType}, Files={Files.Count}, Children={Children.Count}";
  141. }
  142. }
  143. }