Exemple #1
0
    public NetworkInternal(string JsonPath = "res://stgdata/demo-r.json")
    {
        this.Nodes = new List <NodeInternal>();
        this.Edges = new List <EdgeInternal>();

        var jsonFile = new File();         // Use Godot API to allow res:// paths.

        jsonFile.Open(JsonPath, File.ModeFlags.Read);
        var jsonString = jsonFile.GetAsText();

        jsonFile.Close();

        using (JsonDocument document = JsonDocument.Parse(jsonString))
        {
            JsonElement root    = document.RootElement;
            JsonElement sources = root.GetProperty("sources");
            JsonElement sinks   = root.GetProperty("sinks");
            JsonElement nodes   = root.GetProperty("nodes");
            JsonElement edges   = root.GetProperty("edges");

            var numSources = sources.GetArrayLength();
            var numSinks   = sinks.GetArrayLength();
            var numNodes   = nodes.GetArrayLength();

            foreach (JsonElement source in sources.EnumerateArray())
            {
                var x      = source.GetProperty("x").GetInt32();
                var y      = source.GetProperty("y").GetInt32();
                var cost   = source.GetProperty("cost").GetInt32();
                var active = source.GetProperty("active").GetBoolean();
                var state  = active ? NodeState.NODE_ACTIVE : NodeState.NODE_INACTIVE;
                this.Nodes.Add(new NodeInternal(cost, state, NodeType.NODETYPE_SOURCE, x, y));
            }

            foreach (JsonElement sink in sinks.EnumerateArray())
            {
                var x      = sink.GetProperty("x").GetInt32();
                var y      = sink.GetProperty("y").GetInt32();
                var cost   = sink.GetProperty("cost").GetInt32();
                var active = sink.GetProperty("active").GetBoolean();
                var state  = active ? NodeState.NODE_ACTIVE : NodeState.NODE_INACTIVE;
                this.Nodes.Add(new NodeInternal(cost, state, NodeType.NODETYPE_SINK, x, y));
            }

            foreach (JsonElement node in nodes.EnumerateArray())
            {
                var x      = node.GetProperty("x").GetInt32();
                var y      = node.GetProperty("y").GetInt32();
                var cost   = node.GetProperty("cost").GetInt32();
                var active = node.GetProperty("active").GetBoolean();
                var state  = active ? NodeState.NODE_ACTIVE : NodeState.NODE_INACTIVE;
                this.Nodes.Add(new NodeInternal(cost, state, NodeType.NODETYPE_NORMAL, x, y));
            }

            foreach (JsonElement edge in edges.EnumerateArray())
            {
                var capacity = edge.GetProperty("capacity").GetInt32();
                var link     = edge.GetProperty("link").EnumerateArray().ToArray();
                var type1    = link[0].GetProperty("type").GetString();
                var idx1     = link[0].GetProperty("index").GetInt32();
                var offset1  = 0;

                switch (type1)
                {
                case "source":
                    offset1 = 0;
                    break;

                case "sink":
                    offset1 = numSources;
                    break;

                case "node":
                    offset1 = numSources + numSinks;
                    break;
                }

                NodeInternal ref1 = this.Nodes[offset1 + idx1];

                var type2   = link[1].GetProperty("type").GetString();
                var idx2    = link[1].GetProperty("index").GetInt32();
                var offset2 = 0;

                switch (type2)
                {
                case "source":
                    offset2 = 0;
                    break;

                case "sink":
                    offset2 = numSources;
                    break;

                case "node":
                    offset2 = numSources + numSinks;
                    break;
                }

                NodeInternal ref2    = this.Nodes[offset2 + idx2];
                var          newEdge = new EdgeInternal(capacity, ref1, ref2);
                this.Edges.Add(newEdge);
            }
        }
    }
 static Node()
 {
     Internal = NativeObjectProxyFactory.CreateInstance <NodeInternal>();
 }