public Wire(LogicGate lgFrom, LogicGate lgTo, Connection cFrom, Connection cTo) { derivedwires = new List <Wire>(); lgDonor = lgFrom; lgReceiver = lgTo; cDonor = cFrom; cReceiver = cTo; }
private void Update(object sender, EventArgs e) { gCanvas.Clear(Color.FromArgb(80, 50, 40)); Vector vMouse = Input.MousePos(); Vector vMouseBZ = ScreenToWorld(vMouse); if (Input.WheelScrollUp()) { fScale *= 1.1f; } if (Input.WheelScrollDown()) { fScale *= 0.9f; } Vector vMouseAZ = ScreenToWorld(vMouse); vOffSet += vMouseBZ - vMouseAZ; if (Input.KeyPressed(MouseButtons.Middle)) { vStartPan = new Vector(vMouse.x, vMouse.y); } if (Input.KeyHeld(MouseButtons.Middle)) { vOffSet -= (vMouse - vStartPan) / fScale; vStartPan = new Vector(vMouse.x, vMouse.y); } if (Input.KeyPressed(MouseButtons.Right)) { if (nSelected == 0) { foreach (LogicGate lg in logicgates) { Vector v1 = WorldToScreen(new Vector(lg.vWorldPos.x - lg.nWidth * 0.5f, lg.vWorldPos.y - lg.nHeight * 0.5f)); Vector v2 = WorldToScreen(new Vector(lg.vWorldPos.x + lg.nWidth * 0.5f, lg.vWorldPos.y + lg.nHeight * 0.5f)); if (!vMouse.OutsideBounds(v1.x, v1.y, v2.x, v2.y)) { lgSelected = lg; lgSelected.bSelected = true; break; } } } else { bool none = true; foreach (LogicGate lg in logicgates) { Vector v1 = WorldToScreen(new Vector(lg.vWorldPos.x - lg.nWidth * 0.5f, lg.vWorldPos.y - lg.nHeight * 0.5f)); Vector v2 = WorldToScreen(new Vector(lg.vWorldPos.x + lg.nWidth * 0.5f, lg.vWorldPos.y + lg.nHeight * 0.5f)); if (!vMouse.OutsideBounds(v1.x, v1.y, v2.x, v2.y)) { if (lg.bSelected) { none = false; } else { lgSelected = lg; } break; } } if (none) { nSelected = 0; foreach (LogicGate lg in logicgates) { lg.bSelected = false; } if (lgSelected != null) { lgSelected.bSelected = true; } } } vStartPan = new Vector(vMouse.x, vMouse.y); } if (Input.KeyHeld(MouseButtons.Right)) { if (nSelected == 0) { if (lgSelected != null) { lgSelected.vWorldPos += (vMouse - vStartPan) / fScale; vStartPan = new Vector(vMouse.x, vMouse.y); } else { gCanvas.DrawLine(Pens.Green, vStartPan.x, vStartPan.y, vMouse.x, vStartPan.y); gCanvas.DrawLine(Pens.Green, vStartPan.x, vStartPan.y, vStartPan.x, vMouse.y); gCanvas.DrawLine(Pens.Green, vMouse.x, vStartPan.y, vMouse.x, vMouse.y); gCanvas.DrawLine(Pens.Green, vStartPan.x, vMouse.y, vMouse.x, vMouse.y); } } else { foreach (LogicGate lg in logicgates) { if (lg.bSelected) { lg.vWorldPos += (vMouse - vStartPan) / fScale; } } vStartPan = new Vector(vMouse.x, vMouse.y); } } if (Input.KeyReleased(MouseButtons.Right)) { if (lgSelected != null) { lgSelected.bSelected = false; lgSelected = null; } foreach (LogicGate lg in logicgates) { Vector mouseworld = ScreenToWorld(vMouse); Vector startpanworld = ScreenToWorld(vStartPan); if (!lg.vWorldPos.OutsideBounds(mouseworld.x, mouseworld.y, startpanworld.x, startpanworld.y)) { lg.bSelected = true; nSelected++; } } } if (Input.KeyPressed(MouseButtons.Left)) { foreach (LogicGate lg in logicgates) { foreach (Connection c in lg.cConnections) { if ((c.vScreenPos - vMouse).Magnitude() < c.nSize * fScale * 0.5f) { lgSelected = lg; cSelected = c; goto Next; } } } foreach (Wire w in wires) { if (DistancePointToLine(vMouse, w) <= 10f * fScale * 0.5f) { lgSelected = w.lgDonor; cSelected = w.cDonor; bDerived = true; wDerived = w; goto Next; } } Next: vStartPan = new Vector(vMouse.x, vMouse.y); } if (Input.KeyHeld(MouseButtons.Left)) { if (cSelected != null) { gCanvas.DrawLine(new Pen(cSelected.bState ? Color.Green : Color.Red, 10f * fScale), vStartPan.AsPoint(), vMouse.AsPoint()); } } if (Input.KeyReleased(MouseButtons.Left)) { if (cSelected != null) { foreach (LogicGate lg in logicgates) { foreach (Connection c in lg.cConnections) { if ((c.vScreenPos - vMouse).Magnitude() < c.nSize * fScale * 0.5f && c.bAsInput != cSelected.bAsInput && lg != lgSelected && !c.bConnected && !cSelected.bConnected) { Wire w = new Wire(lgSelected, lg, cSelected, c); c.bConnected = true; c.wLinkWire = w; cSelected.bConnected = true; cSelected.wLinkWire = w; wires.Add(w); goto Next; } if ((c.vScreenPos - vMouse).Magnitude() < c.nSize * fScale * 0.5f && c.bAsInput != cSelected.bAsInput && lg != lgSelected && bDerived) { Wire w = new Wire(lgSelected, lg, cSelected, c); wDerived.derivedwires.Add(w); w.bDerivedWire = true; w.vDerivedPin = PointOnLineClosest(vStartPan, wDerived); w.wParentWire = wDerived; w.Calculate(); c.bConnected = true; c.wLinkWire = w; wires.Add(w); goto Next; } if ((c.vScreenPos - vMouse).Magnitude() < c.nSize * fScale * 0.5f && lg == lgSelected && lg.eGateType == GateType.IN) { lg.bState = !lg.bState; goto Next; } } } for (int i = 0; i < wires.Count; i++) { if (wires[i] == cSelected.wLinkWire && !bDerived) { if (!wires[i].bDerivedWire) { wires[i].cDonor.wLinkWire = null; wires[i].cReceiver.wLinkWire = null; wires[i].cDonor.bConnected = false; wires[i].cReceiver.bConnected = false; wires[i].cDonor.bState = false; wires[i].cReceiver.bState = false; } else { wires[i].cReceiver.wLinkWire = null; wires[i].cReceiver.bConnected = false; wires[i].cReceiver.bState = false; } DeleteDerivedWires(wires[i]); wires.RemoveAt(i); goto Next; } } Next: bDerived = false; wDerived = null; lgSelected = null; cSelected = null; } } if (Input.KeyPressed(Keys.I)) { Vector v = ScreenToWorld(vMouse); logicgates.Add(new IN(v.x, v.y)); } if (Input.KeyPressed(Keys.O)) { Vector v = ScreenToWorld(vMouse); logicgates.Add(new OUT(v.x, v.y)); } if (Input.KeyPressed(Keys.D1)) { Vector v = ScreenToWorld(vMouse); logicgates.Add(new NOT(v.x, v.y)); } if (Input.KeyPressed(Keys.D2)) { Vector v = ScreenToWorld(vMouse); logicgates.Add(new AND(v.x, v.y)); } if (Input.KeyPressed(Keys.D3)) { Vector v = ScreenToWorld(vMouse); logicgates.Add(new OR(v.x, v.y)); } if (Input.KeyPressed(Keys.D4)) { Vector v = ScreenToWorld(vMouse); logicgates.Add(new NAND(v.x, v.y)); } if (Input.KeyPressed(Keys.D5)) { Vector v = ScreenToWorld(vMouse); logicgates.Add(new NOR(v.x, v.y)); } if (Input.KeyPressed(Keys.D6)) { Vector v = ScreenToWorld(vMouse); logicgates.Add(new XOR(v.x, v.y)); } if (Input.KeyPressed(Keys.D7)) { Vector v = ScreenToWorld(vMouse); logicgates.Add(new XNOR(v.x, v.y)); } if (Input.KeyPressed(Keys.Delete) && nSelected > 0) { while (nSelected > 0) { for (int i = 0; i < logicgates.Count; i++) { if (logicgates[i].bSelected) { for (int j = 0; j < logicgates[i].cConnections.Length; j++) { Wire w = logicgates[i].cConnections[j].wLinkWire; if (w != null) { w.cDonor.wLinkWire = null; w.cReceiver.wLinkWire = null; w.cDonor.bConnected = false; w.cReceiver.bConnected = false; w.cDonor.bState = false; w.cReceiver.bState = false; } wires.Remove(w); } logicgates.RemoveAt(i); nSelected--; } } } } Vector coordonates = ScreenToWorld(vMouse); foreach (LogicGate lg in logicgates) { lg.Render(ref gCanvas, vOffSet, fScale); } foreach (Wire w in wires) { w.Render(ref gCanvas, fScale); } gCanvas.DrawString("Zoom Level: " + (int)(fScale * 100) + "%\n" + "World coordonates: " + (int)coordonates.x + " " + -(int)coordonates.y, new Font("Times New Roman", 15f), Brushes.Black, 0, 0); if (bHelpMenu) { gCanvas.DrawString(sHelpText, HelpFont, Brushes.Black, vHelpPos.AsPoint()); } Canvas.Image = bCanvas; Input.UpdateKeys(); }