using Godot; using Nocturnis.DataStructures; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.ComputationalModules; using Nocturnis.Enigmos.Ports; using Nocturnis.GlobalManagement.Constants; using Nocturnis.GlobalManagement.Providers; using Skeleton.DataStructure; namespace Enigmos.Modules.ComputationalModules.Unary; public abstract partial class V2ComponentModule : UnaryComputationalModule, IPolymorphismModule, IDuplicateOutputModule { private IDataPortGroup? VectorInputGroup { get; set; } private IDataPortGroup? ScalarOutputGroup { get; set; } public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() { base.Init(); this.DataOutInit("Output", 2); VectorInputGroup = GlobalProvider.DataStructureProvider!.NewDataInGroup( this, DataInPorts, "Vector Input Type", EnigmosConstant.DataPortTypes.R2, EnigmosConstant.DataPortTypes.VectorTypes ); ScalarOutputGroup = GlobalProvider.DataStructureProvider.NewDataOutGroup( this, DataOutPorts, "", EnigmosConstant.DataPortTypes.Real, Array.Empty() ); ConfigurablePortGroups = new HashSet { VectorInputGroup }; PostInit(); } public override void Define() { (object, StringName) Func1(CacheItem c) { IData v = this.X(c); if (v.Type == EnigmosConstant.DataPortTypes.R2) return (v.R2[1], EnigmosConstant.DataPortTypes.Real); return (v.C2[1], EnigmosConstant.DataPortTypes.Complex); } (object, StringName) Func2(CacheItem c) { IData v = this.X(c); if (v.Type == EnigmosConstant.DataPortTypes.R2) return (v.R2[2], EnigmosConstant.DataPortTypes.Real); return (v.C2[2], EnigmosConstant.DataPortTypes.Complex); } DataOutPorts[0].OutData.UpdateCalculation(Func1); DataOutPorts[1].OutData.UpdateCalculation(Func2); } public void Inference() => ScalarOutputGroup!.SelectedType = GlobalProvider.DataTypeProvider! .GetBaseField(VectorInputGroup!.SelectedType); }