JsonSchemaConverter.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using AssetBank.Editor.SchemaConverter.Data.Input;
  4. using AssetBank.Editor.SchemaConverter.Data.Output;
  5. using AssetBank.Editor.SchemaConverter.Processors;
  6. using Newtonsoft.Json;
  7. namespace AssetBank.Editor.SchemaConverter
  8. {
  9. /// <summary>
  10. /// Public-facing static class to orchestrate the JSON schema conversion.
  11. /// </summary>
  12. public static class JsonSchemaConverter
  13. {
  14. /// <summary>
  15. /// Converts a raw JSON string from the original format to the new, hierarchical SceneGraph format.
  16. /// </summary>
  17. /// <param name="originalJson">The raw JSON string to convert.</param>
  18. /// <param name="isRecursiveCall">Internal flag to prevent infinite loops when processing prefabs inside prefabs.</param>
  19. /// <returns>A new JSON string representing the structured SceneGraph.</returns>
  20. public static string Convert(string originalJson, bool isRecursiveCall = false)
  21. {
  22. var sceneGraph = ConvertToSceneGraph(originalJson, isRecursiveCall);
  23. return JsonConvert.SerializeObject(sceneGraph, Formatting.None);
  24. }
  25. /// <summary>
  26. /// Converts the JSON to a SceneGraph object. This is the core logic.
  27. /// </summary>
  28. public static SceneGraph ConvertToSceneGraph(string originalJson, bool isRecursiveCall = false)
  29. {
  30. var allNodes = JsonConvert.DeserializeObject<List<OriginalNode>>(originalJson);
  31. if (allNodes == null) return new SceneGraph();
  32. var warnings = new List<string>();
  33. var sceneGraph = new SceneGraph();
  34. // 1. Process Prefabs first to get a definitive list of all GUIDs.
  35. var prefabInstanceNodes = allNodes.Where(n => n.type_id == "1001").ToList();
  36. var (prefabGuids, prefabWarnings) = PrefabProcessor.Process(prefabInstanceNodes);
  37. if (!isRecursiveCall)
  38. {
  39. sceneGraph.prefabs = prefabGuids;
  40. }
  41. warnings.AddRange(prefabWarnings);
  42. // 2. Process Hierarchy, passing the prefab GUID list for context.
  43. var prefabInstanceMap = prefabInstanceNodes.ToDictionary(n => n.anchor_id);
  44. var hierarchyProcessor = new HierarchyProcessor();
  45. var (rootNodes, hierarchyWarnings, consumedIds) = hierarchyProcessor.Process(allNodes, prefabInstanceMap, prefabGuids);
  46. sceneGraph.hierarchy = rootNodes;
  47. warnings.AddRange(hierarchyWarnings);
  48. // Also mark all prefab instances themselves as "consumed"
  49. foreach (var key in prefabInstanceMap.Keys)
  50. {
  51. consumedIds.Add(key);
  52. }
  53. // 3. Process Scene Data with the remaining, unconsumed nodes
  54. // sceneGraph.scene_data = SceneDataProcessor.Process(allNodes, consumedIds);
  55. // 4. Assemble Metadata
  56. sceneGraph.metadata = new Metadata
  57. {
  58. warnings = warnings.Count > 0 ? warnings : null
  59. };
  60. return sceneGraph;
  61. }
  62. }
  63. }