using Enigmos.Ports; using Enigmos.Ports.DataPorts; using Godot; using Nocturnis.DataStructures; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Ports; using TabulaSmaragdina; using TabulaSmaragdina.Constants; namespace Enigmos.Modules.ComputationalModules.Binary; public partial class ControlledOutputModule : BinaryComputationalModule, IPolymorphismModule { [Export] private StringName PresetDataType { get; set; } private DataOutPort Output1 { get; set; } private DataOutPort Output2 { get; set; } private DataOutPort Output3 { get; set; } private DataOutPort Output4 { get; set; } private IDataPortGroup OutputGroup { get; set; } public HashSet ConfigurablePortGroups { get; set; } public override IEnumerable Ports => base.Ports.Union(new[] { Output1, Output2, Output3, Output4 }); public void Inference() => Input2.SetDataType(OutputGroup.SelectedType); public override void Init() { base.Init(); Output1 = GetPort("Output1"); Output2 = GetPort("Output2"); Output3 = GetPort("Output3"); Output4 = GetPort("Output4"); OutputGroup = GlobalProvider.DataStructureProvider.NewDataPortGroup( this, new IDataPort[] { Output1, Output2, Output3, Output4 }, "Output Data Type", UsingPreset ? PresetDataType : EnigmosConstant.DataPortTypes.Real, EnigmosConstant.DataPortTypes.AnyType ); ConfigurablePortGroups = new HashSet { OutputGroup }; Input1.SetDataType(EnigmosConstant.DataPortTypes.Bit); Input2.SetDataType(EnigmosConstant.DataPortTypes.Real); PostInit(); } protected override void Compute(IDataPackage input1, IDataPackage input2) { if (input1.Bit) foreach (DataOutPort port in OutputGroup.OfType()) port.ResultData.Assign(input2, OutputGroup.SelectedType); else foreach (DataOutPort port in OutputGroup.OfType()) port.ResultData.Assign( GlobalProvider.DataStructureProvider.DefaultDataPackage, OutputGroup.SelectedType ); } }