4 using System.Collections.Generic;
5 using System.Collections.Immutable;
7 using Microsoft.Xna.Framework;
11 internal partial class CircuitBoxNode : CircuitBoxSelectable
14 public RectangleF Rect;
15 private Vector2 position;
17 public virtual bool IsResizable =>
false;
19 public Vector2 Position
24 const float clampSize = CircuitBoxSizes.PlayableAreaSize / 2f;
26 position =
new Vector2(Math.Clamp(value.X, -clampSize, clampSize),
27 Math.Clamp(value.Y, -clampSize, clampSize));
32 public ImmutableArray<CircuitBoxConnection> Connectors = ImmutableArray<CircuitBoxConnection>.Empty;
34 public static float Opacity = 0.8f;
36 public readonly CircuitBox CircuitBox;
38 public CircuitBoxNode(CircuitBox circuitBox)
40 CircuitBox = circuitBox;
43 public (Vector2 Size, Vector2 Pos) ResizeBy(CircuitBoxResizeDirection directions, Vector2 amount)
45 Vector2 newSize = Size;
46 Vector2 newPos = Position;
49 if (directions.HasFlag(CircuitBoxResizeDirection.Down))
51 newSize.Y += amount.Y;
52 newSize.Y = Math.Max(newSize.Y, CircuitBoxLabelNode.MinSize.Y);
53 newPos =
new Vector2(newPos.X, newPos.Y - (newSize.Y - Size.Y) / 2f);
56 if (directions.HasFlag(CircuitBoxResizeDirection.Right))
58 newSize.X += amount.X;
59 newSize.X = Math.Max(newSize.X, CircuitBoxLabelNode.MinSize.X);
60 newPos =
new Vector2(newPos.X + (newSize.X - Size.X) / 2f, newPos.Y);
63 if (directions.HasFlag(CircuitBoxResizeDirection.Left))
65 newSize.X -= amount.X;
66 newSize.X = Math.Max(newSize.X, CircuitBoxLabelNode.MinSize.X);
67 newPos =
new Vector2(newPos.X + (Size.X - newSize.X) / 2f, newPos.Y);
70 return (newSize, newPos);
73 public void ApplyResize(Vector2 newSize, Vector2 newPos)
75 if (!MathUtils.IsValid(newSize)) {
return; }
84 public static Vector2 CalculateSize(IReadOnlyList<CircuitBoxConnection> conns)
86 Vector2 leftSize = Vector2.Zero,
87 rightSize = Vector2.Zero;
89 foreach (var c
in conns)
93 rightSize.X = MathF.Max(rightSize.X, c.Length);
97 leftSize.X = MathF.Max(leftSize.X, c.Length);
102 rightSize.Y += CircuitBoxConnection.Size;
106 leftSize.Y += CircuitBoxConnection.Size;
110 return new Vector2(leftSize.X + CircuitBoxSizes.NodeInitialPadding + rightSize.X, CircuitBoxSizes.NodeInitialPadding + MathF.Max(leftSize.Y, rightSize.Y));
113 protected void UpdatePositions()
115 Vector2 rectStart = Position - Size / 2f;
116 Vector2 rectSize = Size;
117 rectSize.Y += CircuitBoxSizes.NodeHeaderHeight;
118 Rect =
new RectangleF(rectStart, rectSize);
130 foreach (var c
in Connectors)
142 Vector2 drawPos = Position;
143 drawPos.Y = -drawPos.Y;
145 foreach (var c
in Connectors)
147 bool isOutput = c.IsOutput;
149 int yIndex = isOutput ? rightIndex : leftIndex;
150 int count = isOutput ? outputCount : inputCount;
152 float totalHeight = (count * CircuitBoxConnection.Size) / 2f;
153 float y = (yIndex * CircuitBoxConnection.Size) - totalHeight;
155 float halfWidth = Rect.Width / 2f - CircuitBoxConnection.Size / 2f;
159 float xOffset = c.IsOutput ? halfWidth : -halfWidth;
161 Vector2 inputPos = drawPos +
new Vector2(xOffset, y + c.Rect.Height / 2f);
162 c.Position = inputPos;