public static void AssignCircuitIdsToNonGates(RectList rects, List <List <int> > touchGraph, List <List <int> > circuitIds) { int circuitId = 0; var listid = 0; foreach (List <int> list in touchGraph) { circuitIds.Add(new List <int>()); if (list.Count > 0) { if (rects.GetRect(list[0]).Properties.PhysicsId >= (byte)PhysicsType.GateNot) { } else { //Make sure that we don't assign circuitid 0 if circuit type if (rects.GetRect(list[0]).Properties.PhysicsId > 0 && circuitId == 0) { circuitId = 1; } circuitIds[listid].Add(circuitId); circuitId++; } } listid++; } }
public static bool HasPathConstrained(RectList rects, bool[,] graph, int i, int j, int depth) { if (depth > 6) { return(false); } Rect rect1 = rects.GetRect(i); Rect rect2 = rects.GetRect(j); if (!DirectLinkingType((PhysicsType)rect1.Properties.PhysicsId, (PhysicsType)rect2.Properties.PhysicsId)) { return(false); } if (graph[i, j]) //direct path { return(true); } //If didn't find, then recurse for (int q = 0; q < graph.GetLength(0); q++) { if (graph[i, q]) { if (HasPathConstrained(rects, graph, q, j, depth + 1)) { return(true); } } } return(false); }
public static void DisplayAdjacencyGraph(RectList rects, bool[,] graph) { Console.WriteLine("Adjacency graph:"); for (int i = 0; i < rects.Count; i++) { Console.Write(i + "=" + rects.GetRect(i).Properties.PhysicsId + "\t: "); for (int j = 0; j < rects.Count; j++) { if (graph[i, j]) { Console.Write(j + "=" + rects.GetRect(j).Properties.PhysicsId + " "); } } Console.WriteLine(); } }
public static void AssignCircuitIdsToRects(RectList rects, List <List <int> > touchGraph, List <List <int> > circuitIds) { int listid = 0; foreach (List <int> list in touchGraph) { foreach (int id in list) { if (circuitIds[listid][0] > 0) { rects.GetRect(id).Properties.CircuitIds = new List <int>(); foreach (int cid in circuitIds[listid]) { rects.GetRect(id).Properties.CircuitIds.Add(cid); } } } listid++; } }
public static List <List <int> > CreateTouchGraphFromRects(RectList rects) { var touchGraph = new List <List <int> > { new List <int>() }; for (int i = 0; i < rects.Count; i++) { if (rects.GetRect(i).Properties.PhysicsId == 0) { touchGraph[0].Add(i); } } return(touchGraph); }
//True if same public bool IsEqualTo(RectList rects) { if (rects == null || rects.Count != Count) { return(false); } for (int i = 0; i < Count; i++) { Rect rect1 = rects.GetRect(i); Rect rect2 = Rects[i]; if (rect1.IsEqualTo(rect2) == false) { return(false); } } return(true); }
public static void AssignCircuitIdsToGates(bool[,] graph, RectList rects, List <List <int> > touchGraph, List <List <int> > circuitIds) { int listid = 0; foreach (List <int> list in touchGraph) { if (list.Count > 0 && rects.GetRect(list[0]).Properties.PhysicsId >= (byte)PhysicsType.GateNot) { Console.WriteLine("GATE " + listid); int id = list[0]; for (int i = 0; i < graph.GetLength(0); i++) { if (graph[id, i]) { int cid = FindCircuitIdFor(i, touchGraph, circuitIds); Console.WriteLine(" connects to " + i + " cid=" + cid); circuitIds[listid].Add(cid); } } } listid++; } }
//Deserialized SerializedRects back to set of rectangles(RectList) public static RectList SerializedRectsToRects(SerializedRects serializedRects) { RectList rects = new RectList(); char state = ' '; byte shapeId = 0; byte textureId = 0; ulong rgba = 0; byte groupId = 0; ulong worldid = 0; string serial = serializedRects.SerializedData; char mode = CharRects3D; for (int i = 0; i < serial.Length; i++) { if (serial[i] == CharRects2D) { mode = CharRects2D; state = CharRgba; } if (serial[i] == CharRgba) { mode = CharRects3D; state = CharRgba; } if (serial[i] == CharGroup) { state = CharGroup; } if (serial[i] == CharLimit255) { state = CharLimit255; } if (serial[i] == CharCircuit) { state = CharCircuit; } if (serial[i] == CharWorld) { state = CharWorld; } switch (state) { case CharGroup: { groupId = Transcode64.From64(serial[++i]); state = mode; break; } case CharRgba: //Reading RGBA palette { i++; int r = Transcode64.From64(serial[i++]); int g = Transcode64.From64(serial[i++]); int b = Transcode64.From64(serial[i++]); int a = Transcode64.From64(serial[i++]); rgba = Transcode64.RecodeRgbatoUlong((byte)r, (byte)g, (byte)b, (byte)a); shapeId = Transcode64.From64(serial[i++]); textureId = Transcode64.From64(serial[i]); state = mode; break; } case CharRects2D: //Reading emergents { Rect rect = new Rect(); rect.Pt1[0] = Transcode64.From64(serial[i++]); rect.Pt1[2] = Transcode64.From64(serial[i++]); rect.Pt2[0] = Transcode64.From64(serial[i++]); rect.Pt2[2] = Transcode64.From64(serial[i]); //Convert from inclusve rect.Pt2[0]++; rect.Pt2[2]++; rect.Properties.Rgba = rgba; rect.Properties.ShapeId = shapeId; rect.Properties.TextureId = textureId; rect.Properties.GroupId = groupId; rect.Properties.WorldId = worldid; rects.AddRect(rect); break; } case CharRects3D: //Reading emergents { Rect rect = new Rect(); rect.Pt1[0] = Transcode64.From64(serial[i++]); rect.Pt1[1] = Transcode64.From64(serial[i++]); rect.Pt1[2] = Transcode64.From64(serial[i++]); rect.Pt2[0] = Transcode64.From64(serial[i++]); rect.Pt2[1] = Transcode64.From64(serial[i++]); rect.Pt2[2] = Transcode64.From64(serial[i]); //Convert from inclusve rect.Pt2[0]++; rect.Pt2[1]++; rect.Pt2[2]++; rect.Properties.Rgba = rgba; rect.Properties.ShapeId = shapeId; rect.Properties.TextureId = textureId; rect.Properties.GroupId = groupId; rect.Properties.WorldId = worldid; rects.AddRect(rect); break; } case CharCircuit: { i++; byte pid = Transcode64.From64(serial[i++]); //physics id byte cid = Transcode64.From64(serial[i]); //circuit id if (rects.GetRect(rects.Count - 1).Properties.CircuitIds == null) { rects.GetRect(rects.Count - 1).Properties.CircuitIds = new List <int>(); } rects.GetRect(rects.Count - 1).Properties.PhysicsId = pid; rects.GetRect(rects.Count - 1).Properties.CircuitIds.Add(cid); state = mode; break; } case CharWorld: //Reading World ID { i++; int v4 = Transcode64.From64(serial[i++]); int v3 = Transcode64.From64(serial[i++]); int v2 = Transcode64.From64(serial[i++]); int v1 = Transcode64.From64(serial[i++]); worldid = (ulong)((v4 << 24) | (v3 << 16) | (v2 << 8) | v1); state = mode; break; } } } GridConverter.BuildCircuit(rects, false); return(rects); }