No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ControlOutput.cs 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Unity.VisualScripting
  5. {
  6. public sealed class ControlOutput : UnitPort<ControlInput, IUnitInputPort, ControlConnection>, IUnitControlPort, IUnitOutputPort
  7. {
  8. public ControlOutput(string key) : base(key) { }
  9. public override IEnumerable<ControlConnection> validConnections => unit?.graph?.controlConnections.WithSource(this) ?? Enumerable.Empty<ControlConnection>();
  10. public override IEnumerable<InvalidConnection> invalidConnections => unit?.graph?.invalidConnections.WithSource(this) ?? Enumerable.Empty<InvalidConnection>();
  11. public override IEnumerable<ControlInput> validConnectedPorts => validConnections.Select(c => c.destination);
  12. public override IEnumerable<IUnitInputPort> invalidConnectedPorts => invalidConnections.Select(c => c.destination);
  13. public bool isPredictable
  14. {
  15. get
  16. {
  17. using (var recursion = Recursion.New(1))
  18. {
  19. return IsPredictable(recursion);
  20. }
  21. }
  22. }
  23. public bool IsPredictable(Recursion recursion)
  24. {
  25. if (unit.isControlRoot)
  26. {
  27. return true;
  28. }
  29. if (!recursion?.TryEnter(this) ?? false)
  30. {
  31. return false;
  32. }
  33. var isPredictable = unit.relations.WithDestination(this).Where(r => r.source is ControlInput).All(r => ((ControlInput)r.source).IsPredictable(recursion));
  34. recursion?.Exit(this);
  35. return isPredictable;
  36. }
  37. public bool couldBeEntered
  38. {
  39. get
  40. {
  41. if (!isPredictable)
  42. {
  43. throw new NotSupportedException();
  44. }
  45. if (unit.isControlRoot)
  46. {
  47. return true;
  48. }
  49. return unit.relations.WithDestination(this).Where(r => r.source is ControlInput).Any(r => ((ControlInput)r.source).couldBeEntered);
  50. }
  51. }
  52. public ControlConnection connection => unit.graph?.controlConnections.SingleOrDefaultWithSource(this);
  53. public override bool hasValidConnection => connection != null;
  54. public override bool CanConnectToValid(ControlInput port)
  55. {
  56. return true;
  57. }
  58. public override void ConnectToValid(ControlInput port)
  59. {
  60. var source = this;
  61. var destination = port;
  62. source.Disconnect();
  63. unit.graph.controlConnections.Add(new ControlConnection(source, destination));
  64. }
  65. public override void ConnectToInvalid(IUnitInputPort port)
  66. {
  67. ConnectInvalid(this, port);
  68. }
  69. public override void DisconnectFromValid(ControlInput port)
  70. {
  71. var connection = validConnections.SingleOrDefault(c => c.destination == port);
  72. if (connection != null)
  73. {
  74. unit.graph.controlConnections.Remove(connection);
  75. }
  76. }
  77. public override void DisconnectFromInvalid(IUnitInputPort port)
  78. {
  79. DisconnectInvalid(this, port);
  80. }
  81. public override IUnitPort CompatiblePort(IUnit unit)
  82. {
  83. if (unit == this.unit) return null;
  84. return unit.controlInputs.FirstOrDefault();
  85. }
  86. }
  87. }