From 401e48e0ba5276a999d983b88c1a418a01afe5f4 Mon Sep 17 00:00:00 2001 From: hzhang Date: Wed, 10 Jul 2024 07:02:11 +0100 Subject: [PATCH] source generator --- Boards/BaseBoard.cs | 28 +++++++++- Boards/FilterModuleBoard.cs | 7 +-- Boards/FunctionModuleBoard.cs | 3 +- Boards/OptimizationModuleBoard.cs | 16 +++--- Cables/DataCable.cs | 33 ++++++++++++ Cables/SignalCable.cs | 33 ++++++++++++ Enigmos.csproj | 4 ++ Manual/CommunicatorPairTab.cs | 3 +- Manual/ErrorHandlerTab.cs | 3 +- Manual/ModuleBoolValueParameterSetter.cs | 3 +- Manual/ModuleCharValueParameterSetter.cs | 3 +- Manual/ModuleKeyValueParameterSetter.cs | 3 +- Manual/ModuleManual.cs | 46 ++++++++-------- Manual/ModuleParameterTab.cs | 25 +++++---- Manual/ModulePolymorphismTab.cs | 10 ++-- Manual/ModuleRealValueParameterSetter.cs | 3 +- Manual/PortMaintenanceTab.cs | 18 ++++--- Manual/PortTypeSelector.cs | 3 +- Manual/ProgrammableModuleSettingTab.cs | 4 +- Modules/BaseModule.cs | 46 ++++++++-------- Modules/CompositeModule.cs | 41 ++++++++++++++ .../Binary/AdditionModule.cs | 3 +- .../Binary/BinaryLogicModule.cs | 4 +- .../Binary/ComparisionModule.cs | 1 - .../Binary/ControlledOutputModule.cs | 1 - .../Binary/DivisionModule.cs | 1 - .../Binary/DotProductModule.cs | 2 - .../ComputationalModules/Binary/MaxModule.cs | 1 - .../ComputationalModules/Binary/MinModule.cs | 1 - .../Binary/MultiplicationModule.cs | 2 - .../Binary/PowerModule.cs | 1 - .../Binary/ScalarDivisionModule.cs | 1 - .../Binary/ScalarMultiplicationModule.cs | 1 - .../Binary/SubtractionModule.cs | 2 - .../ComputationalModules/Binary/V2Module.cs | 6 +-- .../BinaryComputationalModule.cs | 2 - .../Nullary/ConstantModule.cs | 1 - .../Nullary/KeyListenerModule.cs | 1 - .../Nullary/NormalDistributionModule.cs | 1 - .../NullaryComputationalModule.cs | 2 +- .../Ternary/SelectorModule.cs | 1 - .../TernaryComputationalModule.cs | 1 - .../ComputationalModules/Unary/CopyModule.cs | 1 - .../Unary/LogicalNegationModule.cs | 1 - .../Unary/NegationModule.cs | 6 +-- .../Unary/SquareModule.cs | 1 - .../Unary/V2ComponentModule.cs | 3 +- .../UnaryComputationalModule.cs | 1 - .../ActionModules/AttackActionModule.cs | 2 +- .../ActionModules/MoveActionModule.cs | 2 +- Modules/ControllingModules/RootModule.cs | 1 - .../SinglePoleDoubleThrowSwitchModule.cs | 4 +- .../SinglePoleSingleThrowSwitchModule.cs | 4 +- .../InterlayerDataInModule.cs | 2 +- .../InterlayerDataOutModule.cs | 3 +- .../InterlayerSignalInModule.cs | 2 +- .../InterlayerSignalOutModule.cs | 2 +- Modules/Other/OutputSubModule.cs | 35 ------------ .../FilterModule/FilterIndicateModule.cs | 1 + .../FilterModule/FilterInputProviderModule.cs | 2 +- .../FilterModule/FilterModule.cs | 49 ++++++++--------- .../FilterModule/FilterOutputModule.cs | 41 -------------- .../FunctionModule/FunctionModule.cs | 34 +++++++----- .../OptimizationInputProviderModule.cs | 4 +- .../OptimizationModule/OptimizationModule.cs | 54 ++++++++----------- .../OptimizationOutputModule.cs | 25 --------- .../OptimizationSelectorModule.cs | 1 + .../ProgrammableModules/ProgrammableModule.cs | 24 +++++---- .../SubModules/EnumerableArrayInputModule.cs | 32 +++++++++++ .../EnumerableElementOutputModule.cs | 9 ++++ Modules/SubModules/OutputSubModule.cs | 35 ++++++++++++ Modules/{ => SubModules}/SubModule.cs | 4 +- Modules/TerminalModules/MemoryModule.cs | 2 +- Modules/TerminalModules/SRLatchModule.cs | 4 +- .../LightEmittingDiodeModule.cs | 1 - .../TestingModules/R2ReaderModule.cs | 2 - .../TestingModules/RealReaderModule.cs | 3 +- 77 files changed, 432 insertions(+), 336 deletions(-) create mode 100644 Cables/DataCable.cs create mode 100644 Cables/SignalCable.cs create mode 100644 Modules/CompositeModule.cs delete mode 100644 Modules/Other/OutputSubModule.cs delete mode 100644 Modules/ProgrammableModules/FilterModule/FilterOutputModule.cs delete mode 100644 Modules/ProgrammableModules/OptimizationModule/OptimizationOutputModule.cs create mode 100644 Modules/SubModules/EnumerableArrayInputModule.cs create mode 100644 Modules/SubModules/EnumerableElementOutputModule.cs create mode 100644 Modules/SubModules/OutputSubModule.cs rename Modules/{ => SubModules}/SubModule.cs (77%) diff --git a/Boards/BaseBoard.cs b/Boards/BaseBoard.cs index 1221c2c..e62a7ad 100644 --- a/Boards/BaseBoard.cs +++ b/Boards/BaseBoard.cs @@ -1,11 +1,13 @@ using Enigmos.Cables; using Enigmos.Modules; using Enigmos.Modules.ProgrammableModules; +using Enigmos.Modules.SubModules; using Godot; using Nocturnis.DataStructures; using Nocturnis.Enigmos.Boards; using Nocturnis.Enigmos.Cables; using Nocturnis.Enigmos.Modules; +using Nocturnis.Enigmos.Modules.InterlayerModules; using Nocturnis.Enigmos.Ports; using Nocturnis.GlobalManagement.Controls; using Nocturnis.GlobalManagement.Providers; @@ -62,6 +64,17 @@ public abstract partial class BaseBoard : Panel, IBaseBoard protected HashSet Ports => Modules.SelectMany(module => module.Ports).ToHashSet(); public IPanelViewer? PanelViewer { get; set; } public Dictionary CablePairing { get; set; } = new(); + + public IEnumerable OnBoardPorts + { + get + { + IEnumerable res = Array.Empty(); + foreach (IInterlayerModule im in GetChildren().OfType()) + res = res.Union(im.Ports); + return res; + } + } public IBasePort? ConnectPending { get; set; } public IBoardControlLayer? CircuitBoardControlLayer { get; set; } public IModuleMovingLayer? ModuleMovingLayer { get; set; } @@ -153,7 +166,7 @@ public abstract partial class BaseBoard : Panel, IBaseBoard if (item is IBaseModuleItem moduleItem) { foreach (IBaseModule module in Modules) - if (GlobalProvider.UIProvider.Overlap(atPosition, moduleItem.ContentModule.Size, module.Position, module.Size)) + if (GlobalProvider.UIProvider!.Overlap(atPosition, moduleItem.ContentModule.Size, module.Position, module.Size)) return false; return true; } @@ -198,4 +211,17 @@ public abstract partial class BaseBoard : Panel, IBaseBoard res.Board = this; return res; } + + public T[] GetModules() where T : BaseModule + { + T[] res = GetChildren().OfType().OrderBy(x => x.Name).ToArray(); + foreach (T m in res) + { + m.Init(); + Modules.Add(m); + m.Board = this; + } + + return res; + } } diff --git a/Boards/FilterModuleBoard.cs b/Boards/FilterModuleBoard.cs index a85f9e8..4c68176 100644 --- a/Boards/FilterModuleBoard.cs +++ b/Boards/FilterModuleBoard.cs @@ -1,13 +1,14 @@ using Enigmos.Modules.InterlayerModules; using Enigmos.Modules.ProgrammableModules.FilterModule; +using Nocturnis; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.InterlayerModules; using Nocturnis.GlobalManagement.Constants; namespace Enigmos.Boards; -public partial class FilterModuleBoard : BaseBoard +public partial class FilterModuleBoard : BaseBoard, ISceneConcept { - public IFilterModule? FilterModule { get; set; } + public FilterModule? FilterModule { get; set; } public FilterInputProviderModule? InputProvider { get; set; } @@ -19,7 +20,7 @@ public partial class FilterModuleBoard : BaseBoard //public IndicateInputModule? Indicate { get; set; } public FilterIndicateModule? Indicate { get; set; } - public void Init(IFilterModule filterModule) + public void Init(FilterModule filterModule) { base.Init(); FilterModule = filterModule; diff --git a/Boards/FunctionModuleBoard.cs b/Boards/FunctionModuleBoard.cs index 1339094..952987b 100644 --- a/Boards/FunctionModuleBoard.cs +++ b/Boards/FunctionModuleBoard.cs @@ -1,8 +1,9 @@ using Enigmos.Modules.InterlayerModules; +using Nocturnis; namespace Enigmos.Boards; -public partial class FunctionModuleBoard : BaseBoard +public partial class FunctionModuleBoard : BaseBoard, ISceneConcept { public InterlayerDataInModule[] DataIns { get; set; } = Array.Empty(); public InterlayerDataOutModule[] DataOuts { get; set; } = Array.Empty(); diff --git a/Boards/OptimizationModuleBoard.cs b/Boards/OptimizationModuleBoard.cs index 4620cfe..f797ee4 100644 --- a/Boards/OptimizationModuleBoard.cs +++ b/Boards/OptimizationModuleBoard.cs @@ -1,26 +1,28 @@ using Enigmos.Modules.InterlayerModules; -using Enigmos.Modules.Other; using Enigmos.Modules.ProgrammableModules.OptimizationModule; -using Nocturnis.GlobalManagement.Constants; +using Nocturnis; +using Nocturnis.Attributes; namespace Enigmos.Boards; - -public partial class OptimizationModuleBoard : BaseBoard +[UniqueInheritance] +public partial class OptimizationModuleBoard : BaseBoard, ISceneConcept { public OptimizationModule? OptimizationModule { get; set; } public OptimizationInputProviderModule? InputProvider { get; set; } public OptimizationSelectorModule? Selector { get; set; } public InterlayerDataOutModule[] ImplicitDataOuts { get; set; } = Array.Empty(); - public override void Init() + public void Init(OptimizationModule m) { - + + OptimizationModule = m; ImplicitDataOuts = new InterlayerDataOutModule[3]; base.Init(); for (int i = 0; i < 3; i++) ImplicitDataOuts[i] = GetModule($"IO{i + 1}"); InputProvider = GetModule("InputProvider"); Selector = GetModule("Selector"); - + InputProvider.Init(this); + Selector.Init(); } } diff --git a/Cables/DataCable.cs b/Cables/DataCable.cs new file mode 100644 index 0000000..3cccdcc --- /dev/null +++ b/Cables/DataCable.cs @@ -0,0 +1,33 @@ +using Godot; +using Nocturnis.Enigmos.Ports.DataPorts.Directions; + +namespace Enigmos.Cables; + +public partial class DataCable : BaseCable +{ + public new IDataOutPort PortTo + { + get => (base.PortTo as IDataOutPort)!; + set => base.PortTo = value; + } + + public new IDataInPort PortFrom + { + get => (base.PortFrom as IDataInPort)!; + set => base.PortFrom = value; + } + + public override void LineUpdate() + { + Vector2 fromPosition = PortFrom.PositionToBoard; + Vector2 toPosition = PortTo.PositionToBoard; + Points = new[] + { + fromPosition, + new Vector2((fromPosition.X + toPosition.X) / 2, fromPosition.Y), + new Vector2((fromPosition.X + toPosition.X) / 2, toPosition.Y), + toPosition + }; + InFill.Points = Points; + } +} diff --git a/Cables/SignalCable.cs b/Cables/SignalCable.cs new file mode 100644 index 0000000..55a5301 --- /dev/null +++ b/Cables/SignalCable.cs @@ -0,0 +1,33 @@ +using Enigmos.Ports.SignalPorts; +using Godot; +using Nocturnis.Enigmos.Ports.SignalPorts.Directions; + +namespace Enigmos.Cables; + +public partial class SignalCable : BaseCable +{ + public new ISignalOutPort PortTo + { + get => (base.PortTo as ISignalOutPort)!; + set => base.PortTo = value; + } + + public new ISignalInPort PortFrom + { + get => (base.PortFrom as ISignalInPort)!; + set => base.PortFrom = value; + } + public override void LineUpdate() + { + Vector2 fromPosition = PortFrom.PositionToBoard; + Vector2 toPosition = PortTo.PositionToBoard; + Points = new [] + { + fromPosition, + new Vector2(fromPosition.X, (fromPosition.Y + toPosition.Y) / 2), + new Vector2(toPosition.X, (fromPosition.Y + toPosition.Y) / 2), + toPosition + }; + InFill.Points = Points; + } +} \ No newline at end of file diff --git a/Enigmos.csproj b/Enigmos.csproj index ff303e8..332693e 100644 --- a/Enigmos.csproj +++ b/Enigmos.csproj @@ -16,4 +16,8 @@ + + + + diff --git a/Manual/CommunicatorPairTab.cs b/Manual/CommunicatorPairTab.cs index 913e298..9433b12 100644 --- a/Manual/CommunicatorPairTab.cs +++ b/Manual/CommunicatorPairTab.cs @@ -1,10 +1,11 @@ using Godot; +using Nocturnis; using Nocturnis.Communicators; using Nocturnis.Enigmos.ModuleManuals; using Nocturnis.Enigmos.Modules; namespace Enigmos.Manual; -public partial class CommunicatorPairTab : Panel, IModuleManualTab +public partial class CommunicatorPairTab : Panel, IModuleManualTab, ISceneConcept { private bool InitFlag { get; set; } public string FullName() => "Pair"; diff --git a/Manual/ErrorHandlerTab.cs b/Manual/ErrorHandlerTab.cs index 1485b3d..08da552 100644 --- a/Manual/ErrorHandlerTab.cs +++ b/Manual/ErrorHandlerTab.cs @@ -1,10 +1,11 @@ using Godot; +using Nocturnis; using Nocturnis.Enigmos.ModuleManuals; using Nocturnis.Enigmos.Modules; namespace Enigmos.Manual; -public partial class ErrorHandlerTab : Panel, IModuleManualTab +public partial class ErrorHandlerTab : Panel, IModuleManualTab, ISceneConcept { public string FullName() => "Error Handling"; private bool InitFlag { get; set; } diff --git a/Manual/ModuleBoolValueParameterSetter.cs b/Manual/ModuleBoolValueParameterSetter.cs index eb0c641..5d4f3df 100644 --- a/Manual/ModuleBoolValueParameterSetter.cs +++ b/Manual/ModuleBoolValueParameterSetter.cs @@ -1,9 +1,10 @@ using Godot; +using Nocturnis; using Nocturnis.DataStructures.ConfigurableParameters; namespace Enigmos.Manual; -public partial class ModuleBoolValueParameterSetter : ModuleParameterSetter +public partial class ModuleBoolValueParameterSetter : ModuleParameterSetter, ISceneConcept { private CheckButton ToggleSetter { get; set; } private Label TrueLabel { get; set; } diff --git a/Manual/ModuleCharValueParameterSetter.cs b/Manual/ModuleCharValueParameterSetter.cs index 77ac55d..975615e 100644 --- a/Manual/ModuleCharValueParameterSetter.cs +++ b/Manual/ModuleCharValueParameterSetter.cs @@ -1,9 +1,10 @@ using Godot; +using Nocturnis; using Nocturnis.DataStructures.ConfigurableParameters; namespace Enigmos.Manual; -public partial class ModuleCharValueParameterSetter : ModuleParameterSetter +public partial class ModuleCharValueParameterSetter : ModuleParameterSetter, ISceneConcept { private LineEdit CharInput { get; set; } private Button Apply { get; set; } diff --git a/Manual/ModuleKeyValueParameterSetter.cs b/Manual/ModuleKeyValueParameterSetter.cs index 7818675..14755af 100644 --- a/Manual/ModuleKeyValueParameterSetter.cs +++ b/Manual/ModuleKeyValueParameterSetter.cs @@ -1,9 +1,10 @@ using Godot; +using Nocturnis; using Nocturnis.DataStructures.ConfigurableParameters; namespace Enigmos.Manual; -public partial class ModuleKeyValueParameterSetter : ModuleParameterSetter +public partial class ModuleKeyValueParameterSetter : ModuleParameterSetter, ISceneConcept { public new IKeyParameter UnderlyingParameter { diff --git a/Manual/ModuleManual.cs b/Manual/ModuleManual.cs index 07cb1ff..f187b3b 100644 --- a/Manual/ModuleManual.cs +++ b/Manual/ModuleManual.cs @@ -1,12 +1,13 @@ using Enigmos.Modules.ProgrammableModules; using Godot; +using Nocturnis; using Nocturnis.Enigmos.ModuleManuals; using Nocturnis.Enigmos.Modules; using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Manual; -public partial class ModuleManual : Panel +public abstract partial class ModuleManual : Panel, ISceneConcept { private bool InitFlag { get; set; } @@ -16,15 +17,14 @@ public partial class ModuleManual : Panel InitFlag = true; } - private Label ModuleDescriptionTitle { get; set; } - private RichTextLabel ModuleDescription { get; set; } - private Label ModuleConfigurationTitle { get; set; } - private TextureButton Close { get; set; } - private TabContainer ConfigurationTabs { get; set; } - private IBaseModule Module { get; set; } - private List Tabs { get; set; } - private LineEdit LabelString { get; set; } - + private Label? ModuleDescriptionTitle { get; set; } + private RichTextLabel? ModuleDescription { get; set; } + private Label? ModuleConfigurationTitle { get; set; } + private TextureButton? Close { get; set; } + private TabContainer? ConfigurationTabs { get; set; } + private IBaseModule? Module { get; set; } + private List Tabs { get; set; } = new(); + private LineEdit? LabelString { get; set; } public override void _Ready() { if(!InitFlag) @@ -38,16 +38,16 @@ public partial class ModuleManual : Panel LabelString = GetNode("LabelString"); LabelString.Text = Module.LabelString; Tabs = new List(); - PortMaintenanceTab mainTab = GlobalProvider.SceneProvider - .AssetMapper() + PortMaintenanceTab mainTab = GlobalProvider + .AssetMapper.Scene .Instantiate(); mainTab.Init(Module); Tabs.Add(mainTab); ConfigurationTabs.AddChild(mainTab); if (Module is IPolymorphismModule polyModule) { - ModulePolymorphismTab polyTab = GlobalProvider.SceneProvider - .AssetMapper() + ModulePolymorphismTab polyTab = GlobalProvider + .AssetMapper.Scene .Instantiate(); polyTab.Init(polyModule); Tabs.Add(polyTab); @@ -56,8 +56,8 @@ public partial class ModuleManual : Panel if (Module is IParameterizedModule paraModule) { - ModuleParameterTab paraTab = GlobalProvider.SceneProvider - .AssetMapper() + ModuleParameterTab paraTab = GlobalProvider + .AssetMapper.Scene .Instantiate(); paraTab.Init(paraModule); Tabs.Add(paraTab); @@ -66,8 +66,8 @@ public partial class ModuleManual : Panel if (Module is ICommunicateModule comModule) { - CommunicatorPairTab pairTab = GlobalProvider.SceneProvider - .AssetMapper() + CommunicatorPairTab pairTab = GlobalProvider + .AssetMapper.Scene .Instantiate(); pairTab.Init(comModule); Tabs.Add(pairTab); @@ -76,8 +76,8 @@ public partial class ModuleManual : Panel if (Module is ProgrammableModule programmableModule) { - ProgrammableModuleSettingTab progTab =GlobalProvider.SceneProvider - .AssetMapper() + ProgrammableModuleSettingTab progTab =GlobalProvider + .AssetMapper.Scene .Instantiate(); progTab.Init(programmableModule); Tabs.Add(progTab); @@ -86,8 +86,8 @@ public partial class ModuleManual : Panel if (Module is IErrorHandlerModule errorHandlerModule) { - ErrorHandlerTab errTab = GlobalProvider.SceneProvider - .AssetMapper() + ErrorHandlerTab errTab = GlobalProvider + .AssetMapper.Scene .Instantiate(); errTab.Init(errorHandlerModule); Tabs.Add(errTab); @@ -110,4 +110,4 @@ public partial class ModuleManual : Panel Module.Label.Text = label; Module.LabelString = label; } -} \ No newline at end of file +} diff --git a/Manual/ModuleParameterTab.cs b/Manual/ModuleParameterTab.cs index 310e55b..c233697 100644 --- a/Manual/ModuleParameterTab.cs +++ b/Manual/ModuleParameterTab.cs @@ -1,4 +1,5 @@ using Godot; +using Nocturnis; using Nocturnis.DataStructures.ConfigurableParameters; using Nocturnis.Enigmos.ModuleManuals; using Nocturnis.Enigmos.Modules; @@ -6,7 +7,7 @@ using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Manual; -public partial class ModuleParameterTab : Panel, IModuleManualTab +public partial class ModuleParameterTab : Panel, IModuleManualTab, ISceneConcept { public string FullName() => "Parameter"; private bool InitFlag { get; set; } @@ -18,11 +19,7 @@ public partial class ModuleParameterTab : Panel, IModuleManualTab public IParameterizedModule Module { get; set; } - private static readonly PackedScene RealParameterSetterScene = - GlobalProvider.SceneProvider.AssetMapper(); - private static readonly PackedScene BoolParameterSetterScene = - GlobalProvider.SceneProvider.AssetMapper(); private VBoxContainer Parameters { get; set; } public override void _Ready() { @@ -33,24 +30,26 @@ public partial class ModuleParameterTab : Panel, IModuleManualTab { if(parameter is IDoubleParameter doubleParameter) { - ModuleRealValueParameterSetter setter = - RealParameterSetterScene.Instantiate(); + ModuleRealValueParameterSetter setter = GlobalProvider + .AssetMapper.Scene + .Instantiate(); setter.Init(doubleParameter); Parameters.AddChild(setter); } else if (parameter is IBoolParameter boolParameter) { - ModuleBoolValueParameterSetter setter = - BoolParameterSetterScene.Instantiate(); + ModuleBoolValueParameterSetter setter = GlobalProvider + .AssetMapper.Scene + .Instantiate(); setter.Init(boolParameter); Parameters.AddChild(setter); } else if (parameter is ICharParameter charParameter) { ModuleCharValueParameterSetter setter = - GlobalProvider.SceneProvider - .AssetMapper() + GlobalProvider + .AssetMapper.Scene .Instantiate(); setter.Init(charParameter); Parameters.AddChild(setter); @@ -58,8 +57,8 @@ public partial class ModuleParameterTab : Panel, IModuleManualTab else if (parameter is IKeyParameter keyParameter) { ModuleKeyValueParameterSetter setter = - GlobalProvider.SceneProvider - .AssetMapper() + GlobalProvider + .AssetMapper.Scene .Instantiate(); setter.Init(keyParameter); Parameters.AddChild(setter); diff --git a/Manual/ModulePolymorphismTab.cs b/Manual/ModulePolymorphismTab.cs index cf46609..188ab26 100644 --- a/Manual/ModulePolymorphismTab.cs +++ b/Manual/ModulePolymorphismTab.cs @@ -1,4 +1,5 @@ using Godot; +using Nocturnis; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.Enigmos.ModuleManuals; using Nocturnis.Enigmos.Modules; @@ -6,7 +7,7 @@ using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Manual; -public partial class ModulePolymorphismTab : Panel, IModuleManualTab +public partial class ModulePolymorphismTab : Panel, IModuleManualTab, ISceneConcept { private bool InitFlag { get; set; } @@ -17,9 +18,6 @@ public partial class ModulePolymorphismTab : Panel, IModuleManualTab } public string FullName() => "Polymorphism"; - - private static readonly PackedScene PortTypeSelectorScene = - GlobalProvider.SceneProvider.AssetMapper(); public IPolymorphismModule Module { get; set; } private VBoxContainer PortGroups { get; set; } @@ -30,7 +28,9 @@ public partial class ModulePolymorphismTab : Panel, IModuleManualTab PortGroups = GetNode("ScrolledItems/PortGroups"); foreach (IDataPortGroup group in Module.ConfigurablePortGroups) { - PortTypeSelector selector = PortTypeSelectorScene.Instantiate(); + PortTypeSelector selector = GlobalProvider + .AssetMapper.Scene + .Instantiate(); selector.Init(group); PortGroups.AddChild(selector); } diff --git a/Manual/ModuleRealValueParameterSetter.cs b/Manual/ModuleRealValueParameterSetter.cs index f833add..2899ef7 100644 --- a/Manual/ModuleRealValueParameterSetter.cs +++ b/Manual/ModuleRealValueParameterSetter.cs @@ -1,9 +1,10 @@ using Godot; +using Nocturnis; using Nocturnis.DataStructures.ConfigurableParameters; namespace Enigmos.Manual; -public partial class ModuleRealValueParameterSetter : ModuleParameterSetter +public partial class ModuleRealValueParameterSetter : ModuleParameterSetter, ISceneConcept { public void Init(IDoubleParameter parameter) { diff --git a/Manual/PortMaintenanceTab.cs b/Manual/PortMaintenanceTab.cs index e57dfad..dbfb07b 100644 --- a/Manual/PortMaintenanceTab.cs +++ b/Manual/PortMaintenanceTab.cs @@ -1,5 +1,6 @@ using Enigmos.Modules.ProgrammableModules; using Godot; +using Nocturnis; using Nocturnis.Enigmos.ModuleManuals; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Ports; @@ -7,7 +8,7 @@ using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Manual; -public partial class PortMaintenanceTab : Panel, IModuleManualTab +public abstract partial class PortMaintenanceTab : Panel, IModuleManualTab, ISceneConcept { private bool InitFlag { get; set; } @@ -18,7 +19,10 @@ public partial class PortMaintenanceTab : Panel, IModuleManualTab } public string FullName() => "Maintenance"; - private static readonly PackedScene PortFixerScene = GlobalProvider.SceneProvider!.AssetMapper(); + + protected abstract PortFixer PortFixerInstantiate(); + + /// /// Should Be Assigned Before This Tab Been Added As Child To Tab Container /// @@ -31,7 +35,7 @@ public partial class PortMaintenanceTab : Panel, IModuleManualTab Ports = GetNode("ScrolledItems/Ports"); foreach (IBasePort port in Module!.Ports) { - PortFixer fixer = PortFixerScene.Instantiate(); + PortFixer fixer = PortFixerInstantiate(); fixer.Init(port); Ports.AddChild(fixer); } @@ -39,18 +43,18 @@ public partial class PortMaintenanceTab : Panel, IModuleManualTab if (Module is ProgrammableModule programmableModule) { HashSet used = new HashSet(); - foreach (IBasePort port in programmableModule.ExplicitPorts) + foreach (IBasePort port in programmableModule.Ports) { int i = 0; while (used.Contains("Exterior" + port.Name + $"#{i}")) i++; used.Add("Exterior" + port.Name + $"#{i}"); port.Name = "Exterior" + port.Name + $"#{i}"; - PortFixer fixer = PortFixerScene.Instantiate(); + PortFixer fixer = PortFixerInstantiate(); fixer.Init(port); Ports.AddChild(fixer); } - foreach (IBasePort port in programmableModule.ImplicitPorts) + foreach (IBasePort port in programmableModule.Board!.OnBoardPorts) { string baseName = port.Name.ToString().Replace("Empty", "Interior"); int i = 0; @@ -58,7 +62,7 @@ public partial class PortMaintenanceTab : Panel, IModuleManualTab i++; used.Add(baseName + $"#{i}"); port.Name = baseName + $"#{i}"; - PortFixer fixer = PortFixerScene.Instantiate(); + PortFixer fixer = PortFixerInstantiate(); fixer.Init(port); Ports.AddChild(fixer); } diff --git a/Manual/PortTypeSelector.cs b/Manual/PortTypeSelector.cs index f491baa..0d8661a 100644 --- a/Manual/PortTypeSelector.cs +++ b/Manual/PortTypeSelector.cs @@ -1,10 +1,11 @@ using Godot; +using Nocturnis; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Manual; -public partial class PortTypeSelector : Control +public partial class PortTypeSelector : Control, ISceneConcept { private bool InitFlag { get; set; } diff --git a/Manual/ProgrammableModuleSettingTab.cs b/Manual/ProgrammableModuleSettingTab.cs index f985db0..495120a 100644 --- a/Manual/ProgrammableModuleSettingTab.cs +++ b/Manual/ProgrammableModuleSettingTab.cs @@ -1,11 +1,12 @@ using Enigmos.Modules.ProgrammableModules; using Godot; +using Nocturnis; using Nocturnis.Enigmos.ModuleManuals; using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Manual; -public partial class ProgrammableModuleSettingTab : Panel, IModuleManualTab +public abstract partial class ProgrammableModuleSettingTab : Panel, IModuleManualTab, ISceneConcept { private ProgrammableModule? Module { get; set; } @@ -29,4 +30,5 @@ public partial class ProgrammableModuleSettingTab : Panel, IModuleManualTab { GlobalProvider.SceneProvider!.RootScene.ChangeScene(Module!.UnderlyingBoard); } + } \ No newline at end of file diff --git a/Modules/BaseModule.cs b/Modules/BaseModule.cs index 3de2063..efa660d 100644 --- a/Modules/BaseModule.cs +++ b/Modules/BaseModule.cs @@ -19,17 +19,18 @@ public abstract partial class BaseModule : TextureRect, IBaseModule [Export] protected bool UsingPreset { get; set; } [Export] public IPresetModuleConnection[] PresetConnections { get; set; } = Array.Empty(); [Export] public string LabelString { get; set; } = ""; - + public virtual Vector2 PositionToBoard => Position; protected virtual bool Draggable => true; protected virtual bool HasManual => true; public bool HasLabel => HasManual; - public virtual IEnumerable Ports => Array.Empty(); - + public virtual IEnumerable Ports => GetChildren().OfType(); + public IBaseBoard? Board { get; set; } private ModuleManual? Manual { get; set; } - public ISimpleLabel? Label { get; set; } + public Label? Label { get; set; } public Node AsNode => this; + public virtual void PresetValueInit() { foreach (IBasePort port in Ports) @@ -38,19 +39,18 @@ public abstract partial class BaseModule : TextureRect, IBaseModule port.Quality = PresetPortQuality; } } - - + + public virtual void Init() { if (HasLabel) { - Label = GlobalProvider.SceneProvider! - .AssetMapper() - .Instantiate(); + Label = new Label(); + Label.AddThemeFontOverride("font", GlobalProvider.Font); Label.Position = new Vector2(0, -25); Label.Text = LabelString; - AddChild(Label.AsNode); + AddChild(Label); } } @@ -70,7 +70,7 @@ public abstract partial class BaseModule : TextureRect, IBaseModule { foreach (IBasePort port in Ports) { - if(!Board!.CablePairing.ContainsKey(port)) + if (!Board!.CablePairing.ContainsKey(port)) continue; Board.CablePairing[port].LineUpdate(); } @@ -80,7 +80,7 @@ public abstract partial class BaseModule : TextureRect, IBaseModule { foreach (IBasePort port in Ports) port.Module = this; - if(UsingPreset) + if (UsingPreset) PresetValueInit(); } @@ -92,7 +92,7 @@ public abstract partial class BaseModule : TextureRect, IBaseModule } protected virtual void TimeoutHandler(ModuleExecutionTimeout timeout) => throw timeout; - + public override Variant _GetDragData(Vector2 atPosition) { if (!Draggable) @@ -102,20 +102,12 @@ public abstract partial class BaseModule : TextureRect, IBaseModule return GlobalProvider.DataStructureProvider!.NewVariantWithType("Module", this); } - - /*protected T GetPort(string path) where T : BasePort - { - T res = GetNode(path); - res.Init(); - return res; - }*/ - public override void _Input(InputEvent @event) { if (@event is InputEventMouseButton eventMouseButton) { Vector2 mousePosition = GetLocalMousePosition(); - if(mousePosition.X > 0 && mousePosition.X < Size.X && mousePosition.Y > 0 && mousePosition.Y < Size.Y) + if (mousePosition.X > 0 && mousePosition.X < Size.X && mousePosition.Y > 0 && mousePosition.Y < Size.Y) { if (eventMouseButton.ButtonIndex == MouseButton.Right && eventMouseButton.Pressed) { @@ -125,8 +117,8 @@ public abstract partial class BaseModule : TextureRect, IBaseModule return; if (Manual == null) { - Manual = GlobalProvider.SceneProvider! - .AssetMapper() + Manual = GlobalProvider + .AssetMapper.Scene .Instantiate(); Manual.Init(this); } @@ -148,7 +140,8 @@ public abstract partial class BaseModule : TextureRect, IBaseModule .Select(p => Board.CablePairing[p]) .ToHashSet(); if (this is ICompositeModule thisCompositeModule) - foreach (IBasePort port in thisCompositeModule.SubModules.SelectMany(module => module.Ports).Where(Board.CablePairing.ContainsKey)) + foreach (IBasePort port in thisCompositeModule.SubModules.SelectMany(module => module.Ports) + .Where(Board.CablePairing.ContainsKey)) Board.FocusedCables.Add(Board.CablePairing[port]); foreach (IBaseCable cable in Board.FocusedCables) cable.Modulate = Color.Color8(255, 255, 255, 255); @@ -159,4 +152,7 @@ public abstract partial class BaseModule : TextureRect, IBaseModule base._Input(@event); } + + public Texture2D PreviewTexture => GlobalProvider.TextureProvider.ModuleTextureMapper(this); + } diff --git a/Modules/CompositeModule.cs b/Modules/CompositeModule.cs new file mode 100644 index 0000000..e32f5a9 --- /dev/null +++ b/Modules/CompositeModule.cs @@ -0,0 +1,41 @@ +using Enigmos.Modules.SubModules; +using Nocturnis.Enigmos.Modules; +using Nocturnis.Enigmos.Ports; + +namespace Enigmos.Modules; + +public partial class CompositeModule : BaseModule, ICompositeModule +{ + public IBaseModule[] SubModules => GetChildren().OfType().ToArray(); + + public override IEnumerable Ports + { + get + { + IEnumerable res = base.Ports; + foreach (IBaseModule bm in SubModules) + res = res.Union(bm.Ports); + return res; + } + } + protected T GetModule(string path) where T : SubModule + { + T res = GetNode(path); + res.Init(); + res.ParentModule = this; + res.Board = Board; + return res; + } + + protected T[] GetModules() where T : SubModule + { + T[] res = SubModules.OfType().OrderBy(x => x.Name).ToArray(); + foreach (T m in res) + { + m.Init(); + m.ParentModule = this; + m.Board = Board; + } + return res; + } +} diff --git a/Modules/ComputationalModules/Binary/AdditionModule.cs b/Modules/ComputationalModules/Binary/AdditionModule.cs index e19b2d6..a20da60 100644 --- a/Modules/ComputationalModules/Binary/AdditionModule.cs +++ b/Modules/ComputationalModules/Binary/AdditionModule.cs @@ -13,8 +13,7 @@ public partial class AdditionModule : BinaryComputationalModule, IPolymorphismMo { private IDataInGroup? InputGroup { get; set; } private IDataOutGroup? OutputGroup { get; set; } - - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); + public override double MaintenanceAlpha => 0.19572021d; public override double MaintenanceBeta => 0.20151779d; public HashSet ConfigurablePortGroups { get; set; } = new(); diff --git a/Modules/ComputationalModules/Binary/BinaryLogicModule.cs b/Modules/ComputationalModules/Binary/BinaryLogicModule.cs index 80f5031..ecba73c 100644 --- a/Modules/ComputationalModules/Binary/BinaryLogicModule.cs +++ b/Modules/ComputationalModules/Binary/BinaryLogicModule.cs @@ -4,9 +4,9 @@ using Nocturnis.Enigmos.Ports; namespace Enigmos.Modules.ComputationalModules.Binary; -public abstract partial class BinaryLogicModule:BinaryComputationalModule,ILogicModule, IDuplicateOutputModule +public abstract partial class BinaryLogicModule : BinaryComputationalModule, ILogicModule, IDuplicateOutputModule { - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); + public override void Init() { base.Init(); diff --git a/Modules/ComputationalModules/Binary/ComparisionModule.cs b/Modules/ComputationalModules/Binary/ComparisionModule.cs index 04485b4..0309408 100644 --- a/Modules/ComputationalModules/Binary/ComparisionModule.cs +++ b/Modules/ComputationalModules/Binary/ComparisionModule.cs @@ -13,7 +13,6 @@ public partial class ComparisionModule : BinaryComputationalModule, IOperationModule { private IBoolParameter? Greater { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public HashSet ConfigurableParameters { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/Binary/ControlledOutputModule.cs b/Modules/ComputationalModules/Binary/ControlledOutputModule.cs index a1d47fd..ccc3778 100644 --- a/Modules/ComputationalModules/Binary/ControlledOutputModule.cs +++ b/Modules/ComputationalModules/Binary/ControlledOutputModule.cs @@ -14,7 +14,6 @@ public partial class ControlledOutputModule : BinaryComputationalModule, IPolymo [Export] private StringName? PresetDataType { get; set; } private IDataOutGroup? OutputGroup { get; set; } public HashSet ConfigurablePortGroups { get; set; } = new(); - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public void Inference() => DataInPorts[1].SetDataType(OutputGroup!.SelectedType); public override void Init() { diff --git a/Modules/ComputationalModules/Binary/DivisionModule.cs b/Modules/ComputationalModules/Binary/DivisionModule.cs index 23d2ff3..fc86ed4 100644 --- a/Modules/ComputationalModules/Binary/DivisionModule.cs +++ b/Modules/ComputationalModules/Binary/DivisionModule.cs @@ -15,7 +15,6 @@ public partial class DivisionModule : BinaryComputationalModule, { private IDataInGroup? InputGroup { get; set; } private IDataOutGroup? OutputGroup { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/Binary/DotProductModule.cs b/Modules/ComputationalModules/Binary/DotProductModule.cs index c628ac8..9aee267 100644 --- a/Modules/ComputationalModules/Binary/DotProductModule.cs +++ b/Modules/ComputationalModules/Binary/DotProductModule.cs @@ -13,8 +13,6 @@ public partial class DotProductModule : BinaryComputationalModule, IPolymorphism { private IDataInGroup? VectorInputGroup { get; set; } private IDataOutGroup? OutputGroup { get; set; } - - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/Binary/MaxModule.cs b/Modules/ComputationalModules/Binary/MaxModule.cs index c34495c..49324e8 100644 --- a/Modules/ComputationalModules/Binary/MaxModule.cs +++ b/Modules/ComputationalModules/Binary/MaxModule.cs @@ -8,7 +8,6 @@ namespace Enigmos.Modules.ComputationalModules.Binary; public partial class MaxModule : BinaryComputationalModule, IOperationModule, IDuplicateOutputModule { - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public override void Init() { base.Init(); diff --git a/Modules/ComputationalModules/Binary/MinModule.cs b/Modules/ComputationalModules/Binary/MinModule.cs index 0ce954c..604fa71 100644 --- a/Modules/ComputationalModules/Binary/MinModule.cs +++ b/Modules/ComputationalModules/Binary/MinModule.cs @@ -8,7 +8,6 @@ namespace Enigmos.Modules.ComputationalModules.Binary; public partial class MinModule : BinaryComputationalModule, IDuplicateOutputModule, IOperationModule { - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public override void Init() { base.Init(); diff --git a/Modules/ComputationalModules/Binary/MultiplicationModule.cs b/Modules/ComputationalModules/Binary/MultiplicationModule.cs index e1e6250..64b7b8a 100644 --- a/Modules/ComputationalModules/Binary/MultiplicationModule.cs +++ b/Modules/ComputationalModules/Binary/MultiplicationModule.cs @@ -13,8 +13,6 @@ public partial class MultiplicationModule : BinaryComputationalModule, IPolymorp { private IDataPortGroup? InputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } - - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/Binary/PowerModule.cs b/Modules/ComputationalModules/Binary/PowerModule.cs index e8e691d..f11a401 100644 --- a/Modules/ComputationalModules/Binary/PowerModule.cs +++ b/Modules/ComputationalModules/Binary/PowerModule.cs @@ -14,7 +14,6 @@ public partial class PowerModule : BinaryComputationalModule, IPolymorphismModul { private IDataPortGroup? TensorInputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/Binary/ScalarDivisionModule.cs b/Modules/ComputationalModules/Binary/ScalarDivisionModule.cs index 420390d..5bb61a9 100644 --- a/Modules/ComputationalModules/Binary/ScalarDivisionModule.cs +++ b/Modules/ComputationalModules/Binary/ScalarDivisionModule.cs @@ -17,7 +17,6 @@ public partial class ScalarDivisionModule : BinaryComputationalModule, private IDataPortGroup? ScalarInputGroup { get; set; } private IDataPortGroup? TensorInputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public override double MaintenanceAlpha => 0.77852142d; public override double MaintenanceBeta => 0.9544432d; public HashSet ConfigurablePortGroups { get; set; } = new(); diff --git a/Modules/ComputationalModules/Binary/ScalarMultiplicationModule.cs b/Modules/ComputationalModules/Binary/ScalarMultiplicationModule.cs index ed730e2..21cb18e 100644 --- a/Modules/ComputationalModules/Binary/ScalarMultiplicationModule.cs +++ b/Modules/ComputationalModules/Binary/ScalarMultiplicationModule.cs @@ -18,7 +18,6 @@ public partial class ScalarMultiplicationModule : private IDataPortGroup? ScalarInputGroup { get; set; } private IDataPortGroup? TensorInputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/Binary/SubtractionModule.cs b/Modules/ComputationalModules/Binary/SubtractionModule.cs index 72056ce..2714f19 100644 --- a/Modules/ComputationalModules/Binary/SubtractionModule.cs +++ b/Modules/ComputationalModules/Binary/SubtractionModule.cs @@ -15,8 +15,6 @@ public partial class SubtractionModule : BinaryComputationalModule, { private IDataPortGroup? InputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); - public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/Binary/V2Module.cs b/Modules/ComputationalModules/Binary/V2Module.cs index 62d1077..d09be34 100644 --- a/Modules/ComputationalModules/Binary/V2Module.cs +++ b/Modules/ComputationalModules/Binary/V2Module.cs @@ -19,11 +19,7 @@ public partial class V2Module : BinaryComputationalModule, { private IDataPortGroup? ScalarInputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } - private DataOutPort? Output1 { get; set; } - private DataOutPort? Output2 { get; set; } - private DataOutPort? Output3 { get; set; } - private DataOutPort? Output4 { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); + public override double MaintenanceAlpha => 0.77852142d; public override double MaintenanceBeta => 0.9544432d; public HashSet ConfigurablePortGroups { get; set; } = new(); diff --git a/Modules/ComputationalModules/BinaryComputationalModule.cs b/Modules/ComputationalModules/BinaryComputationalModule.cs index 4ff8a03..ef1af85 100644 --- a/Modules/ComputationalModules/BinaryComputationalModule.cs +++ b/Modules/ComputationalModules/BinaryComputationalModule.cs @@ -6,9 +6,7 @@ namespace Enigmos.Modules.ComputationalModules; public abstract partial class BinaryComputationalModule : ComputationalModule, IBinaryComputationalModule { - public override IEnumerable Ports => DataInPorts; public IDataInPort[] DataInPorts { get; set; } = new IDataInPort[2]; - public override void Init() { base.Init(); diff --git a/Modules/ComputationalModules/Nullary/ConstantModule.cs b/Modules/ComputationalModules/Nullary/ConstantModule.cs index 23e869f..7f21a89 100644 --- a/Modules/ComputationalModules/Nullary/ConstantModule.cs +++ b/Modules/ComputationalModules/Nullary/ConstantModule.cs @@ -12,7 +12,6 @@ public partial class ConstantModule : NullaryComputationalModule, IParameterized { [Export] private double PresetConstantValue { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); private IDoubleParameter? ConstValue { get; set; } public override void Init() { diff --git a/Modules/ComputationalModules/Nullary/KeyListenerModule.cs b/Modules/ComputationalModules/Nullary/KeyListenerModule.cs index 543ff1a..a5ba93b 100644 --- a/Modules/ComputationalModules/Nullary/KeyListenerModule.cs +++ b/Modules/ComputationalModules/Nullary/KeyListenerModule.cs @@ -21,7 +21,6 @@ public partial class KeyListenerModule : NullaryComputationalModule, public IKeyParameter? ListeningKey { get; set; } public bool Pressed { get; set; } public HashSet ConfigurableParameters { get; set; } = new(); - public override IEnumerable Ports => new[] { Output1, Output2, Output3 }!; public override void Init() { base.Init(); diff --git a/Modules/ComputationalModules/Nullary/NormalDistributionModule.cs b/Modules/ComputationalModules/Nullary/NormalDistributionModule.cs index ef8fbc1..18f4be1 100644 --- a/Modules/ComputationalModules/Nullary/NormalDistributionModule.cs +++ b/Modules/ComputationalModules/Nullary/NormalDistributionModule.cs @@ -20,7 +20,6 @@ public partial class NormalDistributionModule : NullaryComputationalModule, private DataOutPort? Output2 { get; set; } private DataOutPort? Output3 { get; set; } private DataOutPort? Output4 { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); private IDoubleParameter? Mu { get; set; } private IDoubleParameter? Sigma { get; set; } diff --git a/Modules/ComputationalModules/NullaryComputationalModule.cs b/Modules/ComputationalModules/NullaryComputationalModule.cs index 21ad412..c964772 100644 --- a/Modules/ComputationalModules/NullaryComputationalModule.cs +++ b/Modules/ComputationalModules/NullaryComputationalModule.cs @@ -6,5 +6,5 @@ namespace Enigmos.Modules.ComputationalModules; public abstract partial class NullaryComputationalModule : ComputationalModule, ISourceModule { - public override IEnumerable Ports => Array.Empty(); + } \ No newline at end of file diff --git a/Modules/ComputationalModules/Ternary/SelectorModule.cs b/Modules/ComputationalModules/Ternary/SelectorModule.cs index 1e64585..063cbfd 100644 --- a/Modules/ComputationalModules/Ternary/SelectorModule.cs +++ b/Modules/ComputationalModules/Ternary/SelectorModule.cs @@ -17,7 +17,6 @@ public partial class SelectorModule : TernaryComputationalModule, { private IDataPortGroup? DataTypeGroup { get; set; } public HashSet ConfigurablePortGroups { get; set; } = new(); - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public override void Init() { base.Init(); diff --git a/Modules/ComputationalModules/TernaryComputationalModule.cs b/Modules/ComputationalModules/TernaryComputationalModule.cs index 928fd26..eabdb05 100644 --- a/Modules/ComputationalModules/TernaryComputationalModule.cs +++ b/Modules/ComputationalModules/TernaryComputationalModule.cs @@ -7,7 +7,6 @@ namespace Enigmos.Modules.ComputationalModules; public abstract partial class TernaryComputationalModule : ComputationalModule, IParameterModule { public IDataInPort[] DataInPorts { get; set; } = new IDataInPort[3]; - public override IEnumerable Ports => DataInPorts; public override void Init() { base.Init(); diff --git a/Modules/ComputationalModules/Unary/CopyModule.cs b/Modules/ComputationalModules/Unary/CopyModule.cs index eb8e44d..dfd39a1 100644 --- a/Modules/ComputationalModules/Unary/CopyModule.cs +++ b/Modules/ComputationalModules/Unary/CopyModule.cs @@ -14,7 +14,6 @@ public partial class CopyModule : UnaryComputationalModule, { private IDataPortGroup? InputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() { diff --git a/Modules/ComputationalModules/Unary/LogicalNegationModule.cs b/Modules/ComputationalModules/Unary/LogicalNegationModule.cs index 8e0dbe7..1bbd303 100644 --- a/Modules/ComputationalModules/Unary/LogicalNegationModule.cs +++ b/Modules/ComputationalModules/Unary/LogicalNegationModule.cs @@ -8,7 +8,6 @@ namespace Enigmos.Modules.ComputationalModules.Unary; public partial class LogicalNegationModule : UnaryComputationalModule, IDuplicateOutputModule { - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public override void Init() { base.Init(); diff --git a/Modules/ComputationalModules/Unary/NegationModule.cs b/Modules/ComputationalModules/Unary/NegationModule.cs index 5c9348f..153c3c7 100644 --- a/Modules/ComputationalModules/Unary/NegationModule.cs +++ b/Modules/ComputationalModules/Unary/NegationModule.cs @@ -12,13 +12,9 @@ namespace Enigmos.Modules.ComputationalModules.Unary; public partial class NegationModule : UnaryComputationalModule, IPolymorphismModule, IDuplicateOutputModule { - private DataOutPort? Output1 { get; set; } - private DataOutPort? Output2 { get; set; } - private DataOutPort? Output3 { get; set; } - private DataOutPort? Output4 { get; set; } + private IDataInGroup? InputGroup { get; set; } private IDataOutGroup? OutputGroup { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts)!; public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/Unary/SquareModule.cs b/Modules/ComputationalModules/Unary/SquareModule.cs index b655fe5..4823126 100644 --- a/Modules/ComputationalModules/Unary/SquareModule.cs +++ b/Modules/ComputationalModules/Unary/SquareModule.cs @@ -13,7 +13,6 @@ public partial class SquareModule : UnaryComputationalModule, IPolymorphismModul { private IDataPortGroup? InputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/Unary/V2ComponentModule.cs b/Modules/ComputationalModules/Unary/V2ComponentModule.cs index 750514a..cb4cdaa 100644 --- a/Modules/ComputationalModules/Unary/V2ComponentModule.cs +++ b/Modules/ComputationalModules/Unary/V2ComponentModule.cs @@ -15,8 +15,7 @@ public partial class V2ComponentModule : UnaryComputationalModule, IPolymorphism { private IDataPortGroup? VectorInputGroup { get; set; } private IDataPortGroup? ScalarOutputGroup { get; set; } - - public override IEnumerable Ports => base.Ports.Union(DataOutPorts); + public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() diff --git a/Modules/ComputationalModules/UnaryComputationalModule.cs b/Modules/ComputationalModules/UnaryComputationalModule.cs index fa00d58..e1407e1 100644 --- a/Modules/ComputationalModules/UnaryComputationalModule.cs +++ b/Modules/ComputationalModules/UnaryComputationalModule.cs @@ -8,7 +8,6 @@ namespace Enigmos.Modules.ComputationalModules; public abstract partial class UnaryComputationalModule : ComputationalModule, IUnaryComputationalModule { public IDataInPort[] DataInPorts { get; set; } = new IDataInPort[1]; - public override IEnumerable Ports => DataInPorts; public override void Init() { base.Init(); diff --git a/Modules/ControllingModules/ActionModules/AttackActionModule.cs b/Modules/ControllingModules/ActionModules/AttackActionModule.cs index 48ad514..92b1790 100644 --- a/Modules/ControllingModules/ActionModules/AttackActionModule.cs +++ b/Modules/ControllingModules/ActionModules/AttackActionModule.cs @@ -15,7 +15,7 @@ public partial class AttackActionModule : ActionModule, ITerminalModule _ = ip.GetData.Get; } - public override IEnumerable Ports => SignalInPorts.Union(DataInPorts.Cast()).ToArray(); + public bool Finished { get; set; } public override void Init() { diff --git a/Modules/ControllingModules/ActionModules/MoveActionModule.cs b/Modules/ControllingModules/ActionModules/MoveActionModule.cs index afaae37..294842c 100644 --- a/Modules/ControllingModules/ActionModules/MoveActionModule.cs +++ b/Modules/ControllingModules/ActionModules/MoveActionModule.cs @@ -18,7 +18,7 @@ public partial class MoveActionModule : ActionModule, ITerminalModule _ = ip.GetData.Get; } - public override IEnumerable Ports => DataInPorts.Union(SignalInPorts.Cast()); + public bool Finished { get; set; } public override void Init() { diff --git a/Modules/ControllingModules/RootModule.cs b/Modules/ControllingModules/RootModule.cs index 68e7b9d..20b623d 100644 --- a/Modules/ControllingModules/RootModule.cs +++ b/Modules/ControllingModules/RootModule.cs @@ -16,7 +16,6 @@ public partial class RootModule : BaseModule, IRootModule protected override bool Draggable => false; public ISignalOutPort[] SignalOutPorts { get; set; } = Array.Empty(); - public override IEnumerable Ports => SignalOutPorts; public Stopwatch? Timer { get; set; } public bool Visited { get; set; } diff --git a/Modules/ControllingModules/SinglePoleDoubleThrowSwitchModule.cs b/Modules/ControllingModules/SinglePoleDoubleThrowSwitchModule.cs index ca33e23..96f39af 100644 --- a/Modules/ControllingModules/SinglePoleDoubleThrowSwitchModule.cs +++ b/Modules/ControllingModules/SinglePoleDoubleThrowSwitchModule.cs @@ -13,8 +13,6 @@ public partial class SinglePoleDoubleThrowSwitchModule : PiplineModule, IParamet { public HashSet ConfigurableParameters { get; set; } = new(); private IBoolParameter? LeftPortForTrue { get; set; } - public override IEnumerable Ports => - SignalInPorts.Union(SignalOutPorts.Cast()).Union(DataInPorts).ToArray(); public IDataInPort[] DataInPorts { get; set; } = Array.Empty(); public void Drain() { @@ -22,6 +20,8 @@ public partial class SinglePoleDoubleThrowSwitchModule : PiplineModule, IParamet _ = ip.GetData.Get; } + public bool Finished { get; set; } + public override void Init() { base.Init(); diff --git a/Modules/ControllingModules/SinglePoleSingleThrowSwitchModule.cs b/Modules/ControllingModules/SinglePoleSingleThrowSwitchModule.cs index 076a421..a504784 100644 --- a/Modules/ControllingModules/SinglePoleSingleThrowSwitchModule.cs +++ b/Modules/ControllingModules/SinglePoleSingleThrowSwitchModule.cs @@ -8,8 +8,6 @@ namespace Enigmos.Modules.ControllingModules; public partial class SinglePoleSingleThrowSwitchModule : PiplineModule, ITerminalModule { - public override IEnumerable Ports => - SignalInPorts.Union(SignalOutPorts.Cast()).Union(DataInPorts); public IDataInPort[] DataInPorts { get; set; } = Array.Empty(); public void Drain() @@ -19,6 +17,8 @@ public partial class SinglePoleSingleThrowSwitchModule : PiplineModule, ITermina } + public bool Finished { get; set; } + public override void Init() { base.Init(); diff --git a/Modules/InterlayerModules/InterlayerDataInModule.cs b/Modules/InterlayerModules/InterlayerDataInModule.cs index 2fd8a84..99d9b44 100644 --- a/Modules/InterlayerModules/InterlayerDataInModule.cs +++ b/Modules/InterlayerModules/InterlayerDataInModule.cs @@ -1,3 +1,4 @@ +using Enigmos.Modules.SubModules; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.InterlayerModules; using Nocturnis.Enigmos.Ports; @@ -15,7 +16,6 @@ public partial class InterlayerDataInModule : SubModule, IInterlayerDataInModule } public IInterlayerDataOutModule? DualModule { get; set; } public IDataInPort? DataIn { get; set; } - public override IEnumerable Ports => new[] { DataIn }!; public IDataInPort[] DataInPorts { get; set; } = Array.Empty(); diff --git a/Modules/InterlayerModules/InterlayerDataOutModule.cs b/Modules/InterlayerModules/InterlayerDataOutModule.cs index 64efa7a..56df6df 100644 --- a/Modules/InterlayerModules/InterlayerDataOutModule.cs +++ b/Modules/InterlayerModules/InterlayerDataOutModule.cs @@ -1,4 +1,5 @@ using Enigmos.Modules.ComputationalModules; +using Enigmos.Modules.SubModules; using Godot; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.ComputationalModules; @@ -20,7 +21,7 @@ public partial class InterlayerDataOutModule : SubModule, IComputationalModule, public IBasePort UnderlyingPort => DataOut!; public IInterlayerDataInModule? DualModule { get; set; } public IDataOutPort? DataOut { get; set; } - public override IEnumerable Ports => new[] { DataOut }!; + public override void Init() { diff --git a/Modules/InterlayerModules/InterlayerSignalInModule.cs b/Modules/InterlayerModules/InterlayerSignalInModule.cs index 090432a..097b5ba 100644 --- a/Modules/InterlayerModules/InterlayerSignalInModule.cs +++ b/Modules/InterlayerModules/InterlayerSignalInModule.cs @@ -1,3 +1,4 @@ +using Enigmos.Modules.SubModules; using Godot; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.InterlayerModules; @@ -16,7 +17,6 @@ public partial class InterlayerSignalInModule : SubModule, IInterlayerSignalInMo public IBasePort UnderlyingPort => SignalIn!; public IInterlayerSignalOutModule? DualModule { get; set; } public ISignalInPort? SignalIn { get; set; } - public override IEnumerable Ports => new[] { SignalIn }!; public ISignalInPort[] SignalInPorts { get; set; } = Array.Empty(); public override void Init() diff --git a/Modules/InterlayerModules/InterlayerSignalOutModule.cs b/Modules/InterlayerModules/InterlayerSignalOutModule.cs index bea502e..b944f7f 100644 --- a/Modules/InterlayerModules/InterlayerSignalOutModule.cs +++ b/Modules/InterlayerModules/InterlayerSignalOutModule.cs @@ -1,3 +1,4 @@ +using Enigmos.Modules.SubModules; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.InterlayerModules; using Nocturnis.Enigmos.Ports; @@ -15,7 +16,6 @@ public partial class InterlayerSignalOutModule : SubModule, IInterlayerSignalOut public IBasePort UnderlyingPort => SignalOut!; public IInterlayerSignalInModule? DualModule { get; set; } public ISignalOutPort? SignalOut { get; set; } - public override IEnumerable Ports => new[] { SignalOut }!; public ISignalOutPort[] SignalOutPorts { get; set; } = Array.Empty(); diff --git a/Modules/Other/OutputSubModule.cs b/Modules/Other/OutputSubModule.cs deleted file mode 100644 index 4f73879..0000000 --- a/Modules/Other/OutputSubModule.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Enigmos.Modules.ComputationalModules; -using Godot; -using Nocturnis.Enigmos.Modules; -using Nocturnis.Enigmos.Modules.ComputationalModules; -using Nocturnis.Enigmos.Ports; -using Nocturnis.Enigmos.Ports.DataPorts.Directions; -using Nocturnis.GlobalManagement.Constants; - -namespace Enigmos.Modules.Other; - -public partial class OutputSubModule : NullaryComputationalModule -{ - public override Vector2 PositionToBoard => - base.PositionToBoard + (ParentModule?.PositionToBoard ?? Vector2.Zero); - protected override bool Draggable => false; - protected override bool HasManual => false; - public override IEnumerable Ports => new[] { DataOut }; - public IComputationalCompositeModule? ParentModule { get; set; } - public IDataOutPort? DataOut { get; set; } - - public override void Define() - { - //DataOut = ParentModule - } - - //protected override void Compute(IRootModule root) => ParentModule.Compute(root); - public override void Init() - { - base.Init(); - this.DataOutInit("DataOut", 1); - DataOut = DataOutPorts[0]; - DataOut.SetDataType(EnigmosConstant.DataPortTypes.Real); - PostInit(); - } -} diff --git a/Modules/ProgrammableModules/FilterModule/FilterIndicateModule.cs b/Modules/ProgrammableModules/FilterModule/FilterIndicateModule.cs index f6e1bf9..1470965 100644 --- a/Modules/ProgrammableModules/FilterModule/FilterIndicateModule.cs +++ b/Modules/ProgrammableModules/FilterModule/FilterIndicateModule.cs @@ -1,3 +1,4 @@ +using Enigmos.Modules.SubModules; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Ports.DataPorts.Directions; diff --git a/Modules/ProgrammableModules/FilterModule/FilterInputProviderModule.cs b/Modules/ProgrammableModules/FilterModule/FilterInputProviderModule.cs index 43dbd58..e705b4b 100644 --- a/Modules/ProgrammableModules/FilterModule/FilterInputProviderModule.cs +++ b/Modules/ProgrammableModules/FilterModule/FilterInputProviderModule.cs @@ -1,4 +1,5 @@ using Enigmos.Boards; +using Enigmos.Modules.SubModules; using Godot; using Nocturnis.DataStructures; using Nocturnis.Enigmos.Modules.ComputationalModules; @@ -11,7 +12,6 @@ namespace Enigmos.Modules.ProgrammableModules.FilterModule; public partial class FilterInputProviderModule : SubModule, IComputationalModule { public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty(); - public override IEnumerable Ports => DataOutPorts; public IDataOutPort? Output { get; set; } public FilterModuleBoard? ParentBoard { get; set; } diff --git a/Modules/ProgrammableModules/FilterModule/FilterModule.cs b/Modules/ProgrammableModules/FilterModule/FilterModule.cs index fefafe9..b405565 100644 --- a/Modules/ProgrammableModules/FilterModule/FilterModule.cs +++ b/Modules/ProgrammableModules/FilterModule/FilterModule.cs @@ -1,5 +1,6 @@ using Enigmos.Boards; using Enigmos.Modules.InterlayerModules; +using Enigmos.Modules.SubModules; using Nocturnis.DataStructures; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.Enigmos.Modules; @@ -12,18 +13,21 @@ using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Modules.ProgrammableModules.FilterModule; -public partial class FilterModule : ProgrammableModule, IPolymorphismModule, IFilterModule +public partial class FilterModule : ProgrammableModule, + IPolymorphismModule, + IInternalComputationalModule, + IEnumerableProcessingModule { public IDataInPort? InputArray { get; set; } - public FilterOutputModule? OutputArrayModule { get; set; } + public OutputSubModule? OutputArrayModule { get; set; } private IInterlayerDataInModule[] ExplicitInputs { get; set; } = Array.Empty(); private IDataPortGroup[] InterLayerGroups { get; set; } = Array.Empty(); private IDataPortGroup? ArrayGroup { get; set; } public IData[] CachedInputArray { get; set; } = Array.Empty(); - public IData[] CachedResult { get; set; } = Array.Empty(); - public bool FilterFinished { get; set; } - public bool FilterStarted { get; set; } + public IData? CachedResult { get; set; } + public bool ComputationFinished { get; set; } + public bool ComputationStarted { get; set; } private List CachedListResult { get; set; } = new(); public int ProcessingIndex { get; set; } @@ -33,18 +37,14 @@ public partial class FilterModule : ProgrammableModule, IPolymorphismModule, IFi get => (base.UnderlyingBoard as FilterModuleBoard)!; set => base.UnderlyingBoard = value; } - - public override IEnumerable Ports => new IBasePort[] { InputArray!, OutputArrayModule!.Output! }; - - public override IBaseModule[] SubModules => ExplicitInputs; public override IEnumerable ExplicitPorts => - new IBasePort[] { InputArray!, OutputArrayModule!.Output! } + new IBasePort[] { InputArray!, OutputArrayModule!.Out! } .Union(ExplicitInputs.Select(c => c.DataIn))! .ToArray(); public override IEnumerable ImplicitPorts => - new IBasePort[] { OutputArrayModule!.Output!, InputArray! } + new IBasePort[] { OutputArrayModule!.Out!, InputArray! } .Union(UnderlyingBoard.FilterInputProxy.Select(c => c.DataOut)) .ToArray()!; @@ -54,14 +54,14 @@ public partial class FilterModule : ProgrammableModule, IPolymorphismModule, IFi { } - public void Filter() + public void Compute() { - if (!FilterStarted) + if (!ComputationStarted) { CachedInputArray = InputArray!.GetData.Get!.Array; ProcessingIndex = 0; CachedListResult = new List(); - FilterStarted = true; + ComputationStarted = true; } while (ProcessingIndex < CachedInputArray.Length) @@ -74,9 +74,10 @@ public partial class FilterModule : ProgrammableModule, IPolymorphismModule, IFi ProcessingIndex += 1; } - CachedResult = CachedListResult.ToArray(); - FilterFinished = true; - FilterStarted = false; + CachedResult.Data = CachedListResult.ToArray(); + //TODO CachedResult.Type + ComputationFinished = true; + ComputationStarted = false; } @@ -86,18 +87,18 @@ public partial class FilterModule : ProgrammableModule, IPolymorphismModule, IFi { base.Init(); InputArray = this.GetPort("InputArray"); - OutputArrayModule = GetModule("OutputArray"); - UnderlyingBoard = GlobalProvider.SceneProvider! - .AssetMapper() + OutputArrayModule = GetModule("OutputArray"); + UnderlyingBoard = GlobalProvider + .AssetMapper.Scene .Instantiate(); ExplicitInputs = new IInterlayerDataInModule[3]; for (int i = 0; i < 3; i++) ExplicitInputs[i] = GetModule($"EI{i + 1}"); - OutputArrayModule.Init(this); + OutputArrayModule.Init(); UnderlyingBoard.Init(this); - FilterFinished = false; - FilterStarted = false; + ComputationFinished = false; + ComputationStarted = false; for (int i = 0; i < 3; i++) { @@ -113,7 +114,7 @@ public partial class FilterModule : ProgrammableModule, IPolymorphismModule, IFi ArrayGroup = GlobalProvider.DataStructureProvider!.NewDataPortGroup( this, - new IDataPort[] { InputArray, OutputArrayModule.Output! }, + new IDataPort[] { InputArray, OutputArrayModule.Out! }, "Array Type", EnigmosConstant.DataPortTypes.RealArray, EnigmosConstant.DataPortTypes.AnyArray diff --git a/Modules/ProgrammableModules/FilterModule/FilterOutputModule.cs b/Modules/ProgrammableModules/FilterModule/FilterOutputModule.cs deleted file mode 100644 index 750f144..0000000 --- a/Modules/ProgrammableModules/FilterModule/FilterOutputModule.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Godot; -using Nocturnis.Enigmos.Modules; -using Nocturnis.Enigmos.Modules.ComputationalModules; -using Nocturnis.Enigmos.Ports; -using Nocturnis.Enigmos.Ports.DataPorts.Directions; -using Nocturnis.GlobalManagement.Constants; -using Skeleton.DataStructure; - -namespace Enigmos.Modules.ProgrammableModules.FilterModule; - -public partial class FilterOutputModule : SubModule, IComputationalModule -{ - public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty(); - public IDataOutPort? Output { get; set; } - public override IEnumerable Ports => DataOutPorts; - public new IFilterModule? ParentModule { - get => base.ParentModule as IFilterModule; - set => base.ParentModule = value; - } - - public void Init(IFilterModule parent) - { - base.Init(); - this.DataOutInit("Output", 1); - Output = DataOutPorts[0]; - ParentModule = parent; - PostInit(); - } - - public void Define() - { - (object, StringName) Func(CacheItem c) - { - if (!ParentModule!.FilterFinished) - ParentModule!.Filter(); - return (ParentModule!.CachedResult, EnigmosConstant.DataPortTypes.AnyArrayType); - } - Output!.OutData.UpdateCalculation(Func); - } -} - diff --git a/Modules/ProgrammableModules/FunctionModule/FunctionModule.cs b/Modules/ProgrammableModules/FunctionModule/FunctionModule.cs index 6285fde..f9d2163 100644 --- a/Modules/ProgrammableModules/FunctionModule/FunctionModule.cs +++ b/Modules/ProgrammableModules/FunctionModule/FunctionModule.cs @@ -3,6 +3,7 @@ using Enigmos.Modules.InterlayerModules; using Godot; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.Enigmos.Modules; +using Nocturnis.Enigmos.Modules.InterlayerModules; using Nocturnis.Enigmos.Ports; using Nocturnis.Enigmos.Ports.DataPorts; using Nocturnis.GlobalManagement.Constants; @@ -31,20 +32,11 @@ public partial class FunctionModule : ProgrammableModule, IPolymorphismModule .Union(UnderlyingBoard.SignalOuts.SelectMany(module => module.Ports)); - private static readonly PackedScene FunctionModuleBoardScene = GlobalProvider.SceneProvider! - .AssetMapper(); - public override BaseModule[] SubModules => - ExplicitDataInModules - .Union(ExplicitDataOutModules) - .Union(ExplicitSignalInModules) - .Union(ExplicitSignalOutModules) - .ToArray(); private InterlayerDataInModule[] ExplicitDataInModules { get; set; } = Array.Empty(); private InterlayerDataOutModule[] ExplicitDataOutModules { get; set; } = Array.Empty(); private InterlayerSignalInModule[] ExplicitSignalInModules { get; set; } = Array.Empty(); - private InterlayerSignalOutModule[] ExplicitSignalOutModules { get; set; } = Array.Empty(); @@ -56,14 +48,28 @@ public partial class FunctionModule : ProgrammableModule, IPolymorphismModule public override void Init() { - UnderlyingBoard = FunctionModuleBoardScene.Instantiate(); + UnderlyingBoard = GlobalProvider + .AssetMapper.Scene + .Instantiate(); UnderlyingBoard.Init(); ExteriorToInterior = new IDataPortGroup[4]; InteriorToExterior = new IDataPortGroup[4]; - ExplicitDataInModules = new InterlayerDataInModule[4]; - ExplicitDataOutModules = new InterlayerDataOutModule[4]; - ExplicitSignalInModules = new InterlayerSignalInModule[4]; - ExplicitSignalOutModules = new InterlayerSignalOutModule[4]; + ExplicitDataInModules = GetChildren() + .OfType() + .OrderBy(x => x.AsNode.Name) + .ToArray(); + ExplicitDataOutModules = GetChildren() + .OfType() + .OrderBy(x => x.AsNode.Name) + .ToArray(); + ExplicitSignalInModules = GetChildren() + .OfType() + .OrderBy(x => x.AsNode.Name) + .ToArray(); + ExplicitSignalOutModules = GetChildren() + .OfType() + .OrderBy(x => x.AsNode.Name) + .ToArray(); for (int i = 0; i < 4; i++) { diff --git a/Modules/ProgrammableModules/OptimizationModule/OptimizationInputProviderModule.cs b/Modules/ProgrammableModules/OptimizationModule/OptimizationInputProviderModule.cs index ed15926..ff309df 100644 --- a/Modules/ProgrammableModules/OptimizationModule/OptimizationInputProviderModule.cs +++ b/Modules/ProgrammableModules/OptimizationModule/OptimizationInputProviderModule.cs @@ -1,4 +1,5 @@ using Enigmos.Boards; +using Enigmos.Modules.SubModules; using Godot; using Nocturnis.DataStructures; using Nocturnis.Enigmos.Modules.ComputationalModules; @@ -11,7 +12,6 @@ namespace Enigmos.Modules.ProgrammableModules.OptimizationModule; public partial class OptimizationInputProviderModule : SubModule, IComputationalModule { public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty(); - public override IEnumerable Ports => DataOutPorts; public IDataOutPort? Output { get; set; } public OptimizationModuleBoard? ParentBoard { get; set; } @@ -28,7 +28,7 @@ public partial class OptimizationInputProviderModule : SubModule, IComputational { (object, StringName) Func(CacheItem c) { - IData w = ParentBoard!.OptimizationModule!.CachedInput[ParentBoard.OptimizationModule.ProcessingIndex]; + IData w = ParentBoard!.OptimizationModule!.CachedInputArray[ParentBoard.OptimizationModule.ProcessingIndex]; return (w.Data, w.Type)!; } Output!.OutData.UpdateCalculation(Func); diff --git a/Modules/ProgrammableModules/OptimizationModule/OptimizationModule.cs b/Modules/ProgrammableModules/OptimizationModule/OptimizationModule.cs index e0b6bb2..212cd69 100644 --- a/Modules/ProgrammableModules/OptimizationModule/OptimizationModule.cs +++ b/Modules/ProgrammableModules/OptimizationModule/OptimizationModule.cs @@ -1,12 +1,12 @@ using Enigmos.Boards; using Enigmos.Modules.InterlayerModules; +using Enigmos.Modules.SubModules; using Enigmos.Ports.DataPorts; using Godot; using Nocturnis.DataStructures; using Nocturnis.DataStructures.ConfigurableParameters; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.Enigmos.Modules; -using Nocturnis.Enigmos.Modules.InterlayerModules; using Nocturnis.Enigmos.Ports; using Nocturnis.Enigmos.Ports.DataPorts; using Nocturnis.Enigmos.Ports.DataPorts.Directions; @@ -18,15 +18,14 @@ namespace Enigmos.Modules.ProgrammableModules.OptimizationModule; public partial class OptimizationModule : ProgrammableModule, IPolymorphismModule, IParameterizedModule, - IOptimizationModule + IInternalComputationalModule, + IEnumerableProcessingModule { - public bool OptimizationFinished { get; set; } - public bool OptimizationStarted { get; set; } + public bool ComputationFinished { get; set; } + public bool ComputationStarted { get; set; } private double? CachedOptimizeValue { get; set; } public IDataInPort? ArrayInput { get; set; } - public IInterlayerDataInModule[] ExplicitOutputs { get; set; } = Array.Empty(); - public IInterlayerDataOutModule[] ImplicitInputs { get; set; } = Array.Empty(); - public IData[] CachedInput { get; set; } = Array.Empty(); + public IData[] CachedInputArray { get; set; } = Array.Empty(); public int ProcessingIndex { get; set; } private IBoolParameter? UsingMax { get; set; } public IData CachedResult { get; set; } = @@ -41,8 +40,8 @@ public partial class OptimizationModule : ProgrammableModule, private InterlayerDataInModule[] ExplicitInputs { get; set; } = Array.Empty(); private OptimizationSelectorModule? Selector { get; set; } - private OptimizationOutputModule? Output { get; set; } - public override IEnumerable Ports => new[] { ArrayInput! }; + private OutputSubModule? Output { get; set; } + public new OptimizationModuleBoard UnderlyingBoard { @@ -54,14 +53,9 @@ public partial class OptimizationModule : ProgrammableModule, public HashSet ConfigurablePortGroups { get; set; } = new(); public override IEnumerable ExplicitPorts => - new IBasePort[] { ArrayInput!, Output!.Output! } + new IBasePort[] { ArrayInput!, Output!.Out! } .Union(ExplicitInputs.Select(c => c.DataIn)!); - - public override BaseModule[] SubModules => - ExplicitInputs - .Union(new BaseModule[] { Output! }) - .ToArray(); - + public override IEnumerable ImplicitPorts => new IBasePort[] { UnderlyingBoard.InputProvider!.Output!, UnderlyingBoard.Selector!.Selector! } .Union(UnderlyingBoard.ImplicitDataOuts.Select(c => c.DataOut))!; @@ -69,14 +63,14 @@ public partial class OptimizationModule : ProgrammableModule, public override void Init() { base.Init(); - UnderlyingBoard = GlobalProvider.SceneProvider! - .AssetMapper() + UnderlyingBoard = GlobalProvider + .AssetMapper.Scene .Instantiate(); UnderlyingBoard.Init(); InterlayerGroups = new IDataPortGroup[3]; ExplicitInputs = new InterlayerDataInModule[3]; InternalIterOut = this.GetPort("InternalIterOut"); - Output = GetModule("Output"); + Output = GetModule("Output"); Output.Init(); for (int i = 0; i < 3; i++) { @@ -85,8 +79,8 @@ public partial class OptimizationModule : ProgrammableModule, UnderlyingBoard.ImplicitDataOuts[i].DualModule = ExplicitInputs[i]; } - OptimizationFinished = true; - CachedInput = Array.Empty(); + ComputationFinished = true; + CachedInputArray = Array.Empty(); //CachedArray = Array.Empty(); ProcessingIndex = 0; CachedResult = GlobalProvider.DataStructureProvider!.NullData; @@ -119,7 +113,7 @@ public partial class OptimizationModule : ProgrammableModule, "Min", true ); - Output.Output!.SetDataType(EnigmosConstant.DataPortTypes.Real); + Output.Out!.SetDataType(EnigmosConstant.DataPortTypes.Real); Selector!.Selector!.SetDataType(EnigmosConstant.DataPortTypes.Real); ConfigurableParameters = new HashSet { UsingMax }; ConfigurablePortGroups = @@ -132,28 +126,28 @@ public partial class OptimizationModule : ProgrammableModule, public void Inference() { StringName elementType = GlobalProvider.DataPackageTypeProvider!.ToElement(OptimizationGroup!.SelectedType); - Output!.Output!.SetDataType(elementType); + Output!.Out!.SetDataType(elementType); UnderlyingBoard.InputProvider!.Output!.SetDataType(elementType); } private void SoftReset() => UnderlyingBoard.Reset(); - public void Optimize() + public void Compute() { - if (OptimizationFinished) + if (ComputationFinished) { CachedOptimizeValue = null; - CachedInput = InternalArrayIn!.OutData.Get!.Array; + CachedInputArray = InternalArrayIn!.OutData.Get!.Array; CachedResult = GlobalProvider.DataStructureProvider!.NewData(0, EnigmosConstant.DataPortTypes.Null); ProcessingIndex = 0; } - while (ProcessingIndex < CachedInput.Length) + while (ProcessingIndex < CachedInputArray.Length) { SoftReset(); UnderlyingBoard.InputProvider!.Output!.OutData.UpdateCalculation( cache => - (CachedInput[ProcessingIndex].Data, CachedInput[ProcessingIndex].Type)! + (CachedInputArray[ProcessingIndex].Data, CachedInputArray[ProcessingIndex].Type)! ); UnderlyingBoard.InputProvider.Output.OutData.Expire(); double currentValue = UnderlyingBoard.Selector!.Selector!.GetData.Get!.Double; @@ -178,9 +172,7 @@ public partial class OptimizationModule : ProgrammableModule, } Output!.Define(); - OptimizationFinished = true; + ComputationFinished = true; } - - public bool Calculated { get; set; } } diff --git a/Modules/ProgrammableModules/OptimizationModule/OptimizationOutputModule.cs b/Modules/ProgrammableModules/OptimizationModule/OptimizationOutputModule.cs deleted file mode 100644 index cfa0282..0000000 --- a/Modules/ProgrammableModules/OptimizationModule/OptimizationOutputModule.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Nocturnis.Enigmos.Modules; -using Nocturnis.Enigmos.Modules.ComputationalModules; -using Nocturnis.Enigmos.Ports; -using Nocturnis.Enigmos.Ports.DataPorts.Directions; - -namespace Enigmos.Modules.ProgrammableModules.OptimizationModule; - -public partial class OptimizationOutputModule : SubModule, IComputationalModule -{ - public IDataOutPort? Output { get; set; } - public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty(); - public override IEnumerable Ports => DataOutPorts; - - public override void Init() - { - this.DataOutInit("DataOut", 1); - Output = DataOutPorts[0]; - - } - - public void Define() - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/Modules/ProgrammableModules/OptimizationModule/OptimizationSelectorModule.cs b/Modules/ProgrammableModules/OptimizationModule/OptimizationSelectorModule.cs index 9dcaadb..93597b2 100644 --- a/Modules/ProgrammableModules/OptimizationModule/OptimizationSelectorModule.cs +++ b/Modules/ProgrammableModules/OptimizationModule/OptimizationSelectorModule.cs @@ -1,3 +1,4 @@ +using Enigmos.Modules.SubModules; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Ports.DataPorts.Directions; diff --git a/Modules/ProgrammableModules/ProgrammableModule.cs b/Modules/ProgrammableModules/ProgrammableModule.cs index 238c6eb..8b3d9e1 100644 --- a/Modules/ProgrammableModules/ProgrammableModule.cs +++ b/Modules/ProgrammableModules/ProgrammableModule.cs @@ -1,15 +1,15 @@ using Enigmos.Boards; +using Enigmos.Modules.InterlayerModules; +using Enigmos.Modules.SubModules; using Nocturnis.Enigmos.Modules; -using Nocturnis.Enigmos.Modules.InterlayerModules; using Nocturnis.Enigmos.Ports; using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Modules.ProgrammableModules; -public abstract partial class ProgrammableModule : BaseModule, ICompositeModule, IProgrammableModule +public abstract partial class ProgrammableModule : CompositeModule, IProgrammableModule { public BaseBoard? UnderlyingBoard { get; set; } - public abstract IBaseModule[] SubModules { get; } public void EnterProgrammableBoard() => GlobalProvider.SceneProvider!.RootScene.ChangeScene(UnderlyingBoard!); public abstract IEnumerable ExplicitPorts { get; } public abstract IEnumerable ImplicitPorts { get; } @@ -24,12 +24,18 @@ public abstract partial class ProgrammableModule : BaseModule, ICompositeModule, base.UpdateCables(); } - protected T GetModule(string path) where T : SubModule + public override void Init() { - T res = GetNode(path); - res.Init(); - res.ParentModule = this; - res.Board = Board; - return res; + base.Init(); + InterlayerDataInModule[] explicitDataInModules = GetModules(); + InterlayerDataOutModule[] explicitDataOutModules = GetModules(); + InterlayerSignalInModule[] explicitSignalInModules = GetModules(); + InterlayerSignalOutModule[] explicitSignalOutModules = GetModules(); + + for (int i = 0; i <= explicitDataInModules.Length; i++) + { + + } + } } diff --git a/Modules/SubModules/EnumerableArrayInputModule.cs b/Modules/SubModules/EnumerableArrayInputModule.cs new file mode 100644 index 0000000..d9ca573 --- /dev/null +++ b/Modules/SubModules/EnumerableArrayInputModule.cs @@ -0,0 +1,32 @@ +using Nocturnis.Enigmos.Modules; +using Nocturnis.Enigmos.Ports.DataPorts.Directions; + +namespace Enigmos.Modules.SubModules; + +public partial class EnumerableArrayInputModule : SubModule, ITerminalModule +{ + public new IEnumerableProcessingModule ParentModule + { + get => (base.ParentModule as IEnumerableProcessingModule)!; + set => base.ParentModule = value; + } + public IDataInPort? Input { get; set; } + public IDataInPort[] DataInPorts { get; set; } = Array.Empty(); + public void Init(IEnumerableProcessingModule module) + { + base.Init(); + this.DataInInit("Input", 1); + Input = DataInPorts[0]; + ParentModule = module; + } + + public void Drain() + { + if(Finished) + return; + ParentModule.CachedInputArray = Input!.GetData.Get!.Array; + } + + public bool Finished { get; set; } +} + diff --git a/Modules/SubModules/EnumerableElementOutputModule.cs b/Modules/SubModules/EnumerableElementOutputModule.cs new file mode 100644 index 0000000..0a4e102 --- /dev/null +++ b/Modules/SubModules/EnumerableElementOutputModule.cs @@ -0,0 +1,9 @@ +using Nocturnis.Enigmos.Ports.DataPorts.Directions; + +namespace Enigmos.Modules.SubModules; + +public partial class EnumerableElementOutputModule : SubModule +{ + private IDataOutPort? Output { get; set; } + +} \ No newline at end of file diff --git a/Modules/SubModules/OutputSubModule.cs b/Modules/SubModules/OutputSubModule.cs new file mode 100644 index 0000000..8a6926e --- /dev/null +++ b/Modules/SubModules/OutputSubModule.cs @@ -0,0 +1,35 @@ +using Godot; +using Nocturnis.Enigmos.Modules; +using Nocturnis.Enigmos.Ports.DataPorts.Directions; +using Skeleton.DataStructure; + +namespace Enigmos.Modules.SubModules; + +public partial class OutputSubModule : SubModule, ISourceModule +{ + public IDataOutPort? Out { get; set; } + public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty(); + + public new IInternalComputationalModule? ParentModule + { + get => base.ParentModule as IInternalComputationalModule; + set => base.ParentModule = value; + } + + public override void Init() + { + base.Init(); + Out = this.GetPort("Out"); + } + + public void Define() + { + (object, StringName) Func(CacheItem c) + { + if (!ParentModule!.ComputationFinished) + ParentModule!.Compute(); + return (ParentModule!.CachedResult.Data, ParentModule!.CachedResult.Type)!; + } + Out!.OutData.UpdateCalculation(Func); + } +} diff --git a/Modules/SubModule.cs b/Modules/SubModules/SubModule.cs similarity index 77% rename from Modules/SubModule.cs rename to Modules/SubModules/SubModule.cs index 5aa0e7b..3858e88 100644 --- a/Modules/SubModule.cs +++ b/Modules/SubModules/SubModule.cs @@ -1,11 +1,11 @@ using Godot; using Nocturnis.Enigmos.Modules; -namespace Enigmos.Modules; +namespace Enigmos.Modules.SubModules; public class SubModule : BaseModule { - public IBaseModule? ParentModule { get; set; } + public ICompositeModule? ParentModule { get; set; } public sealed override Vector2 PositionToBoard => base.PositionToBoard + (ParentModule?.PositionToBoard ?? Vector2.Zero); protected sealed override bool Draggable => false; diff --git a/Modules/TerminalModules/MemoryModule.cs b/Modules/TerminalModules/MemoryModule.cs index 972a155..3c7e0fe 100644 --- a/Modules/TerminalModules/MemoryModule.cs +++ b/Modules/TerminalModules/MemoryModule.cs @@ -18,7 +18,6 @@ public partial class MemoryModule : BaseModule, ITerminalModule, ISourceModule, public IDataInPort[] DataInPorts { get; set; } = Array.Empty(); public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty(); - public override IEnumerable Ports => DataInPorts.Union(DataOutPorts); public override void Init() { @@ -67,4 +66,5 @@ public partial class MemoryModule : BaseModule, ITerminalModule, ISourceModule, } + public bool Finished { get; set; } } \ No newline at end of file diff --git a/Modules/TerminalModules/SRLatchModule.cs b/Modules/TerminalModules/SRLatchModule.cs index bf2327b..de15b7f 100644 --- a/Modules/TerminalModules/SRLatchModule.cs +++ b/Modules/TerminalModules/SRLatchModule.cs @@ -14,7 +14,6 @@ public partial class SRLatchModule : BaseModule, { public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty(); public IDataInPort[] DataInPorts { get; set; } = Array.Empty(); - public override IEnumerable Ports => DataInPorts.Union(DataOutPorts); private bool State { get; set; } @@ -29,6 +28,9 @@ public partial class SRLatchModule : BaseModule, else if (reset) State = false; } + + public bool Finished { get; set; } + public override void Init() { base.Init(); diff --git a/Modules/TerminalModules/TestingModules/LightEmittingDiodeModule.cs b/Modules/TerminalModules/TestingModules/LightEmittingDiodeModule.cs index 70bce18..4a8504e 100644 --- a/Modules/TerminalModules/TestingModules/LightEmittingDiodeModule.cs +++ b/Modules/TerminalModules/TestingModules/LightEmittingDiodeModule.cs @@ -12,7 +12,6 @@ public partial class LightEmittingDiodeModule : TerminalModule { private Sprite2D? LightEmittingDiode { get; set; } private IDataInPort? Input { get; set; } - public override IEnumerable Ports => new[] { Input! }; private static readonly Texture2D TrueTexture = ResourceLoader.Load("res://Resources/Circuits/Modules/Terminal/Testing/LEDBubble-T.png"); diff --git a/Modules/TerminalModules/TestingModules/R2ReaderModule.cs b/Modules/TerminalModules/TestingModules/R2ReaderModule.cs index fb9af44..82e4db7 100644 --- a/Modules/TerminalModules/TestingModules/R2ReaderModule.cs +++ b/Modules/TerminalModules/TestingModules/R2ReaderModule.cs @@ -11,8 +11,6 @@ public partial class R2ReaderModule : TerminalModule private DataInPort? DataIn { get; set; } private R2Reader? R2Reader { get; set; } - public override IEnumerable Ports => new[] { DataIn! }; - public override void Init() { base.Init(); diff --git a/Modules/TerminalModules/TestingModules/RealReaderModule.cs b/Modules/TerminalModules/TestingModules/RealReaderModule.cs index db62ddb..37f1409 100644 --- a/Modules/TerminalModules/TestingModules/RealReaderModule.cs +++ b/Modules/TerminalModules/TestingModules/RealReaderModule.cs @@ -12,7 +12,6 @@ public partial class RealReaderModule : BaseModule, ITerminalModule, IOperationM { private AnimatedSprite2D? RealReader { get; set; } public IDataInPort[] DataInPorts { get; set; } = Array.Empty(); - public override IEnumerable Ports => DataInPorts; public override void Init() { @@ -35,4 +34,6 @@ public partial class RealReaderModule : BaseModule, ITerminalModule, IOperationM int frame = Mathf.FloorToInt(percentage * 122); RealReader!.SpeedScale = (frame - RealReader.Frame) / 60f; } + + public bool Finished { get; set; } } \ No newline at end of file