rj-action-library/Runtime/Godot/Scenes/SceneFile.cs

115 lines
2.5 KiB
C#
Raw Normal View History

2024-07-25 05:40:31 +00:00
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, "" );
2024-07-25 05:40:31 +00:00
}
// Parsed lines
2024-07-25 05:40:31 +00:00
public List<SceneFileEntry> entries = new List<SceneFileEntry>();
// Combined objects of parsed lines
2024-07-25 05:40:31 +00:00
public List<SceneFileObject> objects = new List<SceneFileObject>();
2024-07-25 05:40:31 +00:00
public GDSceneSFO gdScene;
public NodeSFO rootNode;
// Nodes of the scene
2024-07-25 05:40:31 +00:00
public List<NodeSFO> nodes = new List<NodeSFO>();
// NodePath -> Node
public Dictionary<string,NodeSFO> nodePathMap = new Dictionary<string, NodeSFO>();
// External Resources
2024-07-25 05:40:31 +00:00
public List<ExtResourceSFO> extResources = new List<ExtResourceSFO>();
// Built-In Resources
public List<SubResourceSFO> subResources = new List<SubResourceSFO>();
2024-07-25 05:40:31 +00:00
public SceneFile GetSerializableJSONVersion()
{
var file = new SceneFile();
file.entries = entries;
return file;
}
public void CreateObjects()
{
SceneFileObject lastSFO = null;
2024-07-25 05:40:31 +00:00
entries.ForEach(
( e )=>
{
if ( ! e.hasHeader )
{
lastSFO.AddData( e );
2024-07-25 05:40:31 +00:00
return;
}
var sfo = SceneFileObjectFactory.Create( e );
if ( sfo == null )
{
return;
}
lastSFO = sfo;
2024-07-25 05:40:31 +00:00
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;
2024-07-25 05:40:31 +00:00
// 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 );
2024-07-25 05:40:31 +00:00
}
objects.Add( sfo );
}
);
nodes.ForEach(
( n )=>
{
n.ResolveParent( nodePathMap, rootNode );
2024-07-25 05:40:31 +00:00
}
);
}
}
}