public InseparableCode(bool[] gx, SimpleShader simpleShader) : base(simpleShader) { // if (gx.Length != 4) throw new Exception("Неправильный размер массива"); int gCount = gx.Length; streamingSource = new StreamingSource(new[] { 0, 1, 1, 0 }, simpleShader) { Translate = new Vector2(Delta * 1, Delta * 11) }; #region Register int regCount = gx.Length - 1; Registers = new StreamingRegister[regCount]; for (int i = 0; i < regCount; i++) { Registers[i] = new StreamingRegister(simpleShader) { Translate = new Vector2(Delta * 8 + i * Delta * 8, Delta * 10) }; } #endregion #region Sumators int sumCount = gx.Count(x => x) - 1; Splitters = new StreamingSplitter[sumCount]; Splitters[0] = new StreamingSplitter(simpleShader) { Translate = new Vector2(Delta * 7, Delta * 11) }; Summators = new StreamingSummator[sumCount]; for (int i = 1, j = 0; i < gx.Length; i++) { if (!gx[i]) { continue; } Summators[j] = new StreamingSummator(simpleShader, 2) { Up = true, Translate = new Vector2(Delta * 5 + i * Delta * 8, Delta * 3) }; j++; if (j >= sumCount) { continue; } Splitters[j] = new StreamingSplitter(simpleShader) { Translate = new Vector2(Delta * 7 + i * Delta * 8, Delta * 11) }; ConnectWire(Splitters[j], 0, Summators[j - 1], 1); } for (int i = 0; i < sumCount - 1; i++) { ConnectWire(Summators[i], 0, Summators[i + 1], 0); } for (int i = 1, j = 0; i < gx.Length - 1; i++) { if (!gx[i]) { ConnectWire(Registers[i - 1], 0, Registers[i], 0); } else { j++; ConnectWire(Registers[i - 1], 0, Splitters[j], 0); ConnectWire(Splitters[j], 1, Registers[i], 0); } } #endregion streamingReceiver = new StreamingReceiver(simpleShader) { Translate = new Vector2(Delta * 2 + Delta * gx.Length * 8, Delta * 5) }; ConnectWire(streamingSource, 0, Splitters[0], 0); ConnectWire(Splitters[0], 0, Summators[0], 0, new[] { new Vector2(Delta * 7, Delta * 5) }); ConnectWire(Splitters[0], 1, Registers[0], 0); ConnectWire(Registers.Last(), 0, Summators.Last(), 1, new[] { new Vector2(Delta * gx.Length * 8 - Delta * 1, Delta * 11) }); ConnectWire(Summators.Last(), 0, streamingReceiver, 0); foreach (var reg in Registers) { Childrens.Add(reg); } foreach (var spl in Splitters) { Childrens.Add(spl); } foreach (var summ in Summators) { Childrens.Add(summ); } Childrens.Add(streamingSource); Childrens.Add(streamingReceiver); ButtonTickZero = new Button(Delta, simpleShader) { Translate = new Vector2(Delta * 4, Delta * 10) }; Childrens.Add(ButtonTickZero); TestBit = new Glyph7x5('0', new Vector2(Delta * 3, Delta * 3), simpleShader); Childrens.Add(TestBit); ButtonTickZero.Click += (s, e) => { TestBit.Char = TestBit.Char == '0' ? '=' : '0'; }; ButtonTickOne = new Button(Delta, simpleShader) { Translate = new Vector2(Delta * 2, Delta * 10) }; Childrens.Add(ButtonTickOne); ButtonTickOne.Click += (s, e) => { streamingSource.Start(); }; }