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>(); }