using Godot; using System.Collections.Generic; namespace Rokojori { public class SceneFile { public static SceneFileEntry Create( string type, string line ) { var entry = new SceneFileEntry(); entry.type = type; entry.line = line; entry.Parse(); return entry; } public static SceneFileEntry Seperator() { return Create( SceneFileLinesLexer.SeperatorMatcher.type, "" ); } // Parsed lines public List entries = new List(); // Combined objects of parsed lines public List objects = new List(); public GDSceneSFO gdScene; public NodeSFO rootNode; // Nodes of the scene public List nodes = new List(); // NodePath -> Node public Dictionary nodePathMap = new Dictionary(); // External Resources public List extResources = new List(); // Built-In Resources public List subResources = new List(); public SceneFile GetSerializableJSONVersion() { var file = new SceneFile(); file.entries = entries; return file; } public void CreateObjects() { SceneFileObject lastSFO = null; entries.ForEach( ( e )=> { if ( ! e.hasHeader ) { lastSFO.AddData( e ); return; } var sfo = SceneFileObjectFactory.Create( e ); if ( sfo == null ) { return; } lastSFO = sfo; if ( sfo is GDSceneSFO ) { gdScene = (GDSceneSFO) sfo; } else if ( sfo is NodeSFO ) { var node = (NodeSFO) sfo; nodes.Add( node ); if ( node.elementPath == "." ) { rootNode = node; } nodePathMap[ node.elementPath ] = node; // RJLog.Log( "'" + node.elementPath + "'", node.name.value ); } else if ( sfo is ExtResourceSFO ) { extResources.Add( (ExtResourceSFO) sfo ); } else if ( sfo is SubResourceSFO ) { subResources.Add( (SubResourceSFO) sfo ); } objects.Add( sfo ); } ); nodes.ForEach( ( n )=> { n.ResolveParent( nodePathMap, rootNode ); } ); } } }