123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- using System.Collections.Generic;
- using System.Linq;
- using AssetBank.Editor.SchemaConverter.Data.Input;
- using AssetBank.Editor.SchemaConverter.Data.Output;
- using AssetBank.Editor.SchemaConverter.Processors;
- using Newtonsoft.Json;
- namespace AssetBank.Editor.SchemaConverter
- {
- /// <summary>
- /// Public-facing static class to orchestrate the JSON schema conversion.
- /// </summary>
- public static class JsonSchemaConverter
- {
- /// <summary>
- /// Converts a raw JSON string from the original format to the new, hierarchical SceneGraph format.
- /// </summary>
- /// <param name="originalJson">The raw JSON string to convert.</param>
- /// <param name="isRecursiveCall">Internal flag to prevent infinite loops when processing prefabs inside prefabs.</param>
- /// <returns>A new JSON string representing the structured SceneGraph.</returns>
- public static string Convert(string originalJson, bool isRecursiveCall = false)
- {
- var sceneGraph = ConvertToSceneGraph(originalJson, isRecursiveCall);
- return JsonConvert.SerializeObject(sceneGraph, Formatting.None);
- }
- /// <summary>
- /// Converts the JSON to a SceneGraph object. This is the core logic.
- /// </summary>
- public static SceneGraph ConvertToSceneGraph(string originalJson, bool isRecursiveCall = false)
- {
- var allNodes = JsonConvert.DeserializeObject<List<OriginalNode>>(originalJson);
- if (allNodes == null) return new SceneGraph();
- var warnings = new List<string>();
- var sceneGraph = new SceneGraph();
- // 1. Process Prefabs first to get a definitive list of all GUIDs.
- var prefabInstanceNodes = allNodes.Where(n => n.type_id == "1001").ToList();
- var (prefabGuids, prefabWarnings) = PrefabProcessor.Process(prefabInstanceNodes);
- if (!isRecursiveCall)
- {
- sceneGraph.prefabs = prefabGuids;
- }
- warnings.AddRange(prefabWarnings);
-
- // 2. Process Hierarchy, passing the prefab GUID list for context.
- var prefabInstanceMap = prefabInstanceNodes.ToDictionary(n => n.anchor_id);
- var hierarchyProcessor = new HierarchyProcessor();
- var (rootNodes, hierarchyWarnings, consumedIds) = hierarchyProcessor.Process(allNodes, prefabInstanceMap, prefabGuids);
- sceneGraph.hierarchy = rootNodes;
- warnings.AddRange(hierarchyWarnings);
- // Also mark all prefab instances themselves as "consumed"
- foreach (var key in prefabInstanceMap.Keys)
- {
- consumedIds.Add(key);
- }
- // 3. Process Scene Data with the remaining, unconsumed nodes
- // sceneGraph.scene_data = SceneDataProcessor.Process(allNodes, consumedIds);
-
- // 4. Assemble Metadata
- sceneGraph.metadata = new Metadata
- {
- warnings = warnings.Count > 0 ? warnings : null
- };
- return sceneGraph;
- }
- }
- }
|