├── .gitignore ├── About.cs ├── AbstractBehaviorNode.cs ├── AbstractElementNode.cs ├── AttachedValuesNodes.cs ├── AuxDX11ResourceWrapperNodes.cs ├── AuxObjectWrapperNodes.cs ├── BasicBehaviors.cs ├── BasicElementNodes.cs ├── ContextNode.cs ├── EditElementTransformationNodes.cs ├── ElementInfoNode.cs ├── EventsSplit.cs ├── Filters ├── ContextElementFilterNode.cs └── ElementFilterNode.cs ├── Generic ├── GenericAuxiliaryObjectNodes.cs ├── GenericBehaviorNodes.cs ├── GenericContextSpreadNodes.cs ├── GenericElementInstanceNodes.cs ├── GenericElementPrototypeNodes.cs └── GenericElementTransformationNodes.cs ├── LICENSE.md ├── ModularPrototypeNodes ├── BaseNode.cs └── OperationBase.cs ├── NotuiUtils.cs ├── Notuiv.csproj ├── Notuiv.csproj.DotSettings ├── Notuiv.sln ├── Properties └── AssemblyInfo.cs ├── README.md ├── SubContextNodes.cs ├── deploy └── Notuiv │ ├── girlpower │ ├── AppStructure │ │ ├── Buttons.v4p │ │ ├── Output.v4p │ │ ├── RenderUI.v4p │ │ ├── StateFulUIBehavior.v4p │ │ ├── StructureUI.v4p │ │ ├── UIStructure.v4p │ │ ├── View.v4p │ │ └── _root.v4p │ ├── Nodes.v4p │ ├── Staggering.v4p │ └── gugelmeps.v4p │ └── nodes │ └── plugins │ ├── Box (Notui.ElementPrototype Join) help.v4p │ ├── Circle (Notui.ElementPrototype Join) help.v4p │ ├── Context (Notui Split) help.v4p │ ├── Context (Notui) help.v4p │ ├── Events (Notui.Element) help.v4p │ ├── GetAttachedValues (Notui.Element Split) help.v4p │ ├── GetAuxiliary (Notui.Element) help.v4p │ ├── InstanceInfo (Notui.Element Split) help.v4p │ ├── IntersectionPoint (Notui Split) help.v4p │ ├── MouseEvents (Notui.Element) help.v4p │ ├── MouseSplit (Mouse Accumulated) help.v4p │ ├── MouseWheelScroll (Notui.Behavior Join) help.v4p │ ├── Plane (Notui.ElementPrototype Join) help.v4p │ ├── Polygon2D (Notui.ElementPrototype Join) help.v4p │ ├── PrototypeInfo (Notui.ElementPrototype Split) help.v4p │ ├── Rectangle (Notui.ElementPrototype Join) help.v4p │ ├── Segment (Notui.ElementPrototype Join) help.v4p │ ├── SetAttachedValues (Notui.Element Join) help.v4p │ ├── SetAuxiliary (Notui.Element Join) help.v4p │ ├── SetTransformation (Notui.Element) help.v4p │ ├── Sift (Notui.Context Opaq) help.v4p │ ├── Sift (Notui.Context String) help.v4p │ ├── Sift (Notui.Context Type) help.v4p │ ├── Sift (Notui.Element Opaq) help.v4p │ ├── Sift (Notui.Element String) help.v4p │ ├── Sift (Notui.Element Type) help.v4p │ ├── Sliding (Notui.Behavior Join) help.v4p │ ├── Sphere (Notui.ElementPrototype Join) help.v4p │ ├── SubContext (Notui Split) help.v4p │ ├── Touch (Notui Split) help.v4p │ ├── Unwrap (Notui.Auxiliary) help.v4p │ ├── ValueSlider2D (Notui.Behavior Join) help.v4p │ ├── Void (Notui.ElementPrototype Join) help.v4p │ ├── Wrap (Notui.Auxiliary) help.v4p │ └── WrapResource (Notui.Auxiliary.DX11) help.v4p ├── dlls ├── FeralTic.dll ├── SharpDX.DXGI.dll ├── SharpDX.Direct3D11.dll ├── SharpDX.dll ├── VVVV.DX11.Core.dll ├── VVVV.DX11.Lib.dll └── VVVV.DX11.Nodes.dll └── packages.config /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # .v4p backup files 3 | *~.xml 4 | 5 | # Dynamic plugins .dll 6 | bin/ 7 | 8 | ## Ignore Visual Studio temporary files, build results, and 9 | ## files generated by popular Visual Studio add-ons. 10 | 11 | # User-specific files 12 | *.suo 13 | *.user 14 | *.userosscache 15 | *.sln.docstates 16 | 17 | # User-specific files (MonoDevelop/Xamarin Studio) 18 | *.userprefs 19 | 20 | # Build results 21 | [Dd]ebug/ 22 | [Dd]ebugPublic/ 23 | [Rr]elease/ 24 | [Rr]eleases/ 25 | build/ 26 | bld/ 27 | [Bb]in/ 28 | [Oo]bj/ 29 | 30 | # Visual Studio 2015 cache/options directory 31 | .vs/ 32 | 33 | # MSTest test Results 34 | [Tt]est[Rr]esult*/ 35 | [Bb]uild[Ll]og.* 36 | 37 | # NUNIT 38 | *.VisualState.xml 39 | TestResult.xml 40 | 41 | # Build Results of an ATL Project 42 | [Dd]ebugPS/ 43 | [Rr]eleasePS/ 44 | dlldata.c 45 | 46 | # DNX 47 | project.lock.json 48 | artifacts/ 49 | 50 | *_i.c 51 | *_p.c 52 | *_i.h 53 | *.ilk 54 | *.meta 55 | *.obj 56 | *.pch 57 | *.pdb 58 | *.pgc 59 | *.pgd 60 | *.rsp 61 | *.sbr 62 | *.tlb 63 | *.tli 64 | *.tlh 65 | *.tmp 66 | *.tmp_proj 67 | *.log 68 | *.vspscc 69 | *.vssscc 70 | .builds 71 | *.pidb 72 | *.svclog 73 | *.scc 74 | 75 | # Chutzpah Test files 76 | _Chutzpah* 77 | 78 | # Visual C++ cache files 79 | ipch/ 80 | *.aps 81 | *.ncb 82 | *.opensdf 83 | *.sdf 84 | *.cachefile 85 | 86 | # Visual Studio profiler 87 | *.psess 88 | *.vsp 89 | *.vspx 90 | 91 | # TFS 2012 Local Workspace 92 | $tf/ 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | *.DotSettings.user 101 | 102 | # JustCode is a .NET coding add-in 103 | .JustCode 104 | 105 | # TeamCity is a build add-in 106 | _TeamCity* 107 | 108 | # DotCover is a Code Coverage Tool 109 | *.dotCover 110 | 111 | # NCrunch 112 | _NCrunch_* 113 | .*crunch*.local.xml 114 | nCrunchTemp_* 115 | 116 | # MightyMoose 117 | *.mm.* 118 | AutoTest.Net/ 119 | 120 | # Web workbench (sass) 121 | .sass-cache/ 122 | 123 | # Installshield output folder 124 | [Ee]xpress/ 125 | 126 | # DocProject is a documentation generator add-in 127 | DocProject/buildhelp/ 128 | DocProject/Help/*.HxT 129 | DocProject/Help/*.HxC 130 | DocProject/Help/*.hhc 131 | DocProject/Help/*.hhk 132 | DocProject/Help/*.hhp 133 | DocProject/Help/Html2 134 | DocProject/Help/html 135 | 136 | # Click-Once directory 137 | publish/ 138 | 139 | # Publish Web Output 140 | *.[Pp]ublish.xml 141 | *.azurePubxml 142 | # TODO: Comment the next line if you want to checkin your web deploy settings 143 | # but database connection strings (with potential passwords) will be unencrypted 144 | *.pubxml 145 | *.publishproj 146 | 147 | # NuGet Packages 148 | *.nupkg 149 | # The packages folder can be ignored because of Package Restore 150 | **/packages/* 151 | # except build/, which is used as an MSBuild target. 152 | !**/packages/build/ 153 | # Uncomment if necessary however generally it will be regenerated when needed 154 | #!**/packages/repositories.config 155 | 156 | # Windows Azure Build Output 157 | csx/ 158 | *.build.csdef 159 | 160 | # Windows Store app package directory 161 | AppPackages/ 162 | 163 | # Visual Studio cache files 164 | # files ending in .cache can be ignored 165 | *.[Cc]ache 166 | # but keep track of directories ending in .cache 167 | !*.[Cc]ache/ 168 | 169 | # Others 170 | ClientBin/ 171 | [Ss]tyle[Cc]op.* 172 | ~$* 173 | *~ 174 | *.dbmdl 175 | *.dbproj.schemaview 176 | *.pfx 177 | *.publishsettings 178 | node_modules/ 179 | orleans.codegen.cs 180 | 181 | # RIA/Silverlight projects 182 | Generated_Code/ 183 | 184 | # Backup & report files from converting an old project file 185 | # to a newer Visual Studio version. Backup files are not needed, 186 | # because we have git ;-) 187 | _UpgradeReport_Files/ 188 | Backup*/ 189 | UpgradeLog*.XML 190 | UpgradeLog*.htm 191 | 192 | # SQL Server files 193 | *.mdf 194 | *.ldf 195 | 196 | # Business Intelligence projects 197 | *.rdl.data 198 | *.bim.layout 199 | *.bim_*.settings 200 | 201 | # Microsoft Fakes 202 | FakesAssemblies/ 203 | 204 | # Node.js Tools for Visual Studio 205 | .ntvs_analysis.dat 206 | 207 | # Visual Studio 6 build log 208 | *.plg 209 | 210 | # Visual Studio 6 workspace options file 211 | *.opt 212 | 213 | deploy/*/nodes/plugins/*.dll 214 | deploy/*/nodes/plugins/*.xml -------------------------------------------------------------------------------- /About.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.Composition; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Reflection; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using md.stdl.Interfaces; 10 | using mp.pddn; 11 | using Notui; 12 | using VVVV.PluginInterfaces.V2; 13 | 14 | namespace Notuiv 15 | { 16 | [Startable] 17 | public class VersionWriter : IStartable 18 | { 19 | public static string VersionPath { get; private set; } 20 | public static string VvvvDir { get; private set; } 21 | 22 | public void Start() 23 | { 24 | var ver = typeof(VersionWriter).Assembly.GetName().Version.ToString(); 25 | VvvvDir = Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); 26 | if (VvvvDir != null) 27 | { 28 | VersionPath = Path.Combine(VvvvDir, "packs", "Notuiv", "version.info"); 29 | File.WriteAllText(VersionPath, ver); 30 | } 31 | else 32 | { 33 | VersionPath = "null"; 34 | } 35 | } 36 | 37 | public void Shutdown() { Start(); } 38 | } 39 | 40 | [PluginInfo( 41 | Name = "About", 42 | Category = "Notuiv", 43 | Author = "microdee" 44 | )] 45 | public class AboutNode : IPluginEvaluate, IPartImportsSatisfiedNotification 46 | { 47 | [Output("Notuiv Version")] public ISpread FVer; 48 | [Output("Notui Version")] public ISpread FNotuiVer; 49 | [Output("md.stdl Version")] public ISpread FMdStdlVer; 50 | [Output("mp.pddn Version")] public ISpread FMpPddnVer; 51 | 52 | [Output("Version File Path")] public ISpread FVerPath; 53 | [Output("VVVV Dir")] public ISpread FVDir; 54 | 55 | public void Evaluate(int SpreadMax) { } 56 | public void OnImportsSatisfied() 57 | { 58 | FVer[0] = typeof(AboutNode).Assembly.GetName().Version.ToString(); 59 | FNotuiVer[0] = typeof(NotuiContext).Assembly.GetName().Version.ToString(); 60 | FMdStdlVer[0] = typeof(IMainlooping).Assembly.GetName().Version.ToString(); 61 | FMpPddnVer[0] = typeof(SpreadWrapper).Assembly.GetName().Version.ToString(); 62 | 63 | FVDir[0] = VersionWriter.VvvvDir; 64 | FVerPath[0] = VersionWriter.VersionPath; 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /AttachedValuesNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using Notui; 4 | using VVVV.PluginInterfaces.V2; 5 | 6 | namespace Notuiv 7 | { 8 | [PluginInfo( 9 | Name = "GetAttachedValues", 10 | Category = "Notui.Element", 11 | Version = "Split", 12 | Author = "microdee" 13 | )] 14 | public class GetAttachedValuesNode : IPluginEvaluate 15 | { 16 | 17 | [Input("Element")] public Pin FElement; 18 | 19 | [Output("Values")] public ISpread> FVals; 20 | [Output("Texts")] public ISpread> FTexts; 21 | [Output("Auxiliary Keys")] public ISpread> FAuxKeys; 22 | [Output("Auxiliary Values")] public ISpread> FAuxVals; 23 | 24 | public void Evaluate(int SpreadMax) 25 | { 26 | if(!FElement.IsConnected) return; 27 | FVals.SliceCount = FTexts.SliceCount = FAuxKeys.SliceCount = FAuxVals.SliceCount = FElement.SliceCount; 28 | for (int i = 0; i < FElement.SliceCount; i++) 29 | { 30 | var element = FElement[i]; 31 | if (element == null) continue; 32 | if (element.Value == null) 33 | { 34 | FVals[i].SliceCount = FTexts[i].SliceCount = FAuxKeys[i].SliceCount = FAuxVals[i].SliceCount = 0; 35 | } 36 | else 37 | { 38 | FVals[i].AssignFrom(element.Value.Values); 39 | FTexts[i].AssignFrom(element.Value.Texts); 40 | if (FAuxKeys.SliceCount == 0) FAuxKeys.SliceCount = FElement.SliceCount; 41 | FAuxKeys[i] = element.Value.Auxiliary.Keys.ToSpread(); 42 | if (FAuxVals.SliceCount == 0) FAuxVals.SliceCount = FElement.SliceCount; 43 | FAuxVals[i] = element.Value.Auxiliary.Values.ToSpread(); 44 | } 45 | } 46 | } 47 | } 48 | 49 | [PluginInfo( 50 | Name = "SetAttachedValues", 51 | Category = "Notui.Element", 52 | Version = "Join", 53 | Author = "microdee", 54 | AutoEvaluate = true 55 | )] 56 | public class SetAttachedValuesNode : IPluginEvaluate 57 | { 58 | 59 | [Input("Element")] public Pin FElement; 60 | 61 | [Input("Values")] public ISpread> FVals; 62 | [Input("Set Values", IsBang = true)] public ISpread FSetVals; 63 | [Input("Texts")] public ISpread> FTexts; 64 | [Input("Set Texts", IsBang = true)] public ISpread FSetTexts; 65 | 66 | [Output("Element Out")] public ISpread FElementOut; 67 | 68 | public void Evaluate(int SpreadMax) 69 | { 70 | if (!FElement.IsConnected) return; 71 | FElementOut.SliceCount = FElement.SliceCount; 72 | 73 | for (int i = 0; i < FElement.SliceCount; i++) 74 | { 75 | var element = FElement[i]; 76 | if (element == null) continue; 77 | if (element.Value == null) 78 | { 79 | element.Value = new AttachedValues(); 80 | } 81 | 82 | if (FSetVals[i]) 83 | element.Value.Values = FVals[i].ToArray(); 84 | if (FSetTexts[i]) 85 | element.Value.Texts = FTexts[i].ToArray(); 86 | FElementOut[i] = element; 87 | } 88 | } 89 | } 90 | 91 | [PluginInfo( 92 | Name = "SetAuxiliary", 93 | Category = "Notui.Element", 94 | Version = "Join", 95 | Author = "microdee", 96 | AutoEvaluate = true 97 | )] 98 | public class SetAuxiliaryNode : IPluginEvaluate 99 | { 100 | 101 | [Input("Element")] public Pin FElement; 102 | 103 | [Input("Keys")] public ISpread> FAuxKeys; 104 | [Input("Values")] public ISpread> FAuxVals; 105 | [Input("Set", IsBang = true)] public ISpread FSetAux; 106 | [Input("Remove", IsBang = true)] public ISpread FRemoveAux; 107 | [Input("Toggle", IsBang = true)] public ISpread FTogAux; 108 | 109 | [Output("Element Out")] public ISpread FElementOut; 110 | 111 | public void Evaluate(int SpreadMax) 112 | { 113 | if (!FElement.IsConnected) return; 114 | FElementOut.SliceCount = FElement.SliceCount; 115 | 116 | for (int i = 0; i < FElement.SliceCount; i++) 117 | { 118 | var element = FElement[i]; 119 | if(element == null) continue; 120 | if (element.Value == null) 121 | { 122 | element.Value = new AttachedValues(); 123 | } 124 | if (FSetAux[i]) 125 | { 126 | for (int j = 0; j < FAuxKeys[i].SliceCount; j++) 127 | { 128 | if (element.Value.Auxiliary.ContainsKey(FAuxKeys[i][j])) 129 | element.Value.Auxiliary[FAuxKeys[i][j]] = FAuxVals[i][j]; 130 | else element.Value.Auxiliary.Add(FAuxKeys[i][j], FAuxVals[i][j]); 131 | } 132 | } 133 | if (FRemoveAux[i]) 134 | { 135 | for (int j = 0; j < FAuxKeys[i].SliceCount; j++) 136 | { 137 | if (element.Value.Auxiliary.ContainsKey(FAuxKeys[i][j])) 138 | element.Value.Auxiliary.Remove(FAuxKeys[i][j]); 139 | } 140 | } 141 | if (FTogAux[i]) 142 | { 143 | for (int j = 0; j < FAuxKeys[i].SliceCount; j++) 144 | { 145 | if (element.Value.Auxiliary.ContainsKey(FAuxKeys[i][j])) 146 | element.Value.Auxiliary.Remove(FAuxKeys[i][j]); 147 | else element.Value.Auxiliary.Add(FAuxKeys[i][j], FAuxVals[i][j]); 148 | } 149 | } 150 | FElementOut[i] = element; 151 | } 152 | } 153 | } 154 | 155 | [PluginInfo( 156 | Name = "GetAuxiliary", 157 | Category = "Notui.Element", 158 | Author = "microdee" 159 | )] 160 | public class GetAuxiliaryNode : IPluginEvaluate 161 | { 162 | 163 | [Input("Element")] public Pin FElement; 164 | [Input("Keys")] public ISpread> FAuxKeys; 165 | 166 | [Output("Keys Out")] public ISpread> FAuxKeysOut; 167 | [Output("Values")] public ISpread> FAuxVals; 168 | [Output("Found")] public ISpread> FFound; 169 | 170 | private bool _prevconn = false; 171 | 172 | public void Evaluate(int SpreadMax) 173 | { 174 | var connframe = _prevconn != FElement.IsConnected; 175 | _prevconn = FElement.IsConnected; 176 | if (!FElement.IsConnected) return; 177 | if (FElement.SliceCount == 0 || FAuxKeys.SliceCount == 0) 178 | { 179 | FAuxKeysOut.SliceCount = FAuxVals.SliceCount = FFound.SliceCount = 0; 180 | return; 181 | } 182 | 183 | FAuxKeysOut.SliceCount = FAuxVals.SliceCount = FFound.SliceCount = FElement.SliceCount; 184 | 185 | for (int i = 0; i < FElement.SliceCount; i++) 186 | { 187 | if (FElement[i] == null) continue; 188 | if (FElement[i].Value != null) 189 | { 190 | if(FElement[i].Value.Auxiliary.Count > 0) 191 | { 192 | var auxdir = FElement[i].Value.Auxiliary; 193 | FAuxKeysOut[i].SliceCount = FFound[i].SliceCount = FAuxVals[i].SliceCount = FAuxKeys[i].SliceCount; 194 | int jj = 0; 195 | for (int j = 0; j < FAuxKeys[i].SliceCount; j++) 196 | { 197 | var contains = auxdir.ContainsKey(FAuxKeys[i][j]); 198 | FFound[i][j] = contains; 199 | if (contains) 200 | { 201 | FAuxKeysOut[i][jj] = FAuxKeys[i][j]; 202 | FAuxVals[i][jj] = auxdir[FAuxKeys[i][j]]; 203 | } 204 | else 205 | { 206 | FAuxKeysOut[i].SliceCount = FAuxVals[i].SliceCount = FAuxVals[i].SliceCount - 1; 207 | jj--; 208 | } 209 | jj++; 210 | } 211 | } 212 | else 213 | { 214 | FAuxKeysOut[i].SliceCount = FFound[i].SliceCount = FAuxVals[i].SliceCount = 0; 215 | } 216 | } 217 | else 218 | { 219 | FAuxKeysOut[i].SliceCount = FFound[i].SliceCount = FAuxVals[i].SliceCount = 0; 220 | } 221 | } 222 | } 223 | } 224 | } 225 | -------------------------------------------------------------------------------- /AuxDX11ResourceWrapperNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.Composition; 4 | using System.Linq; 5 | using System.Text; 6 | using FeralTic.DX11; 7 | using FeralTic.DX11.Resources; 8 | using md.stdl.Coding; 9 | using mp.pddn; 10 | using Notui; 11 | using VVVV.DX11; 12 | using VVVV.Hosting.Graph; 13 | using VVVV.PluginInterfaces.V2; 14 | using VVVV.PluginInterfaces.V2.NonGeneric; 15 | 16 | namespace Notuiv 17 | { 18 | public static class ConfigTypePinGroupDX11Extensions 19 | { 20 | public static void ConfigDX11TypeShortcuts(this ConfigurableTypePinGroup cpg) 21 | { 22 | var pgtd = cpg.SimplifiedTypeMapping; 23 | pgtd.Add("Texture1D", typeof(DX11Resource)); 24 | pgtd.Add("Texture2D", typeof(DX11Resource)); 25 | pgtd.Add("Texture3D", typeof(DX11Resource)); 26 | pgtd.Add("TextureCube", typeof(DX11Resource)); 27 | pgtd.Add("tex1", typeof(DX11Resource)); 28 | pgtd.Add("tex2", typeof(DX11Resource)); 29 | pgtd.Add("tex3", typeof(DX11Resource)); 30 | pgtd.Add("texcube", typeof(DX11Resource)); 31 | pgtd.Add("StructuredBuffer", typeof(DX11Resource)); 32 | pgtd.Add("structbuf", typeof(DX11Resource)); 33 | pgtd.Add("RawBuffer", typeof(DX11Resource)); 34 | pgtd.Add("ByteAddressBuffer", typeof(DX11Resource)); 35 | pgtd.Add("rawbuf", typeof(DX11Resource)); 36 | pgtd.Add("Geometry", typeof(DX11Resource)); 37 | pgtd.Add("geom", typeof(DX11Resource)); 38 | pgtd.Add("RenderSemantic", typeof(DX11Resource)); 39 | pgtd.Add("semantic", typeof(DX11Resource)); 40 | cpg.OnlyAllowMappedTypes = true; 41 | } 42 | } 43 | 44 | [PluginInfo( 45 | Name = "WrapResource", 46 | Category = "Notui.Auxiliary.DX11", 47 | Author = "microdee", 48 | AutoEvaluate = true 49 | )] 50 | public class AuxDX11ResourceWrapNode : IPluginEvaluate, IPartImportsSatisfiedNotification, IDX11ResourceDataRetriever 51 | { 52 | [Import] protected IPluginHost2 FPluginHost; 53 | [Import] protected IIOFactory FIOFactory; 54 | [Import] protected IHDEHost Hde; 55 | 56 | private ConfigurableTypePinGroup PinGroup; 57 | private bool _typeChanged; 58 | private bool _init = true; 59 | private DiffSpreadPin _input; 60 | private bool _prevvalid = false; 61 | 62 | [Input("Flag Changed", IsBang = true)] public ISpread FFlagChanged; 63 | [Output("Output")] public ISpread FOut; 64 | 65 | public void OnImportsSatisfied() 66 | { 67 | PinGroup = new ConfigurableTypePinGroup(FPluginHost, FIOFactory, Hde.MainLoop, "Input"); 68 | PinGroup.ConfigDX11TypeShortcuts(); 69 | 70 | PinGroup.OnTypeChangeEnd += (sender, args) => 71 | { 72 | _typeChanged = true; 73 | if (!_init) return; 74 | PinGroup.AddInput(new InputAttribute("Input")); 75 | _input = PinGroup.Pd.InputPins["Input"]; 76 | _init = false; 77 | }; 78 | } 79 | 80 | public void Evaluate(int SpreadMax) 81 | { 82 | FOut.Stream.IsChanged = false; 83 | var valid = _input != null; 84 | if (valid) valid = _input.Spread.SliceCount > 0; 85 | if (valid) valid = _input[0] != null; 86 | if (valid) 87 | { 88 | RenderRequest?.Invoke(this, FPluginHost); 89 | if (!_input.Spread.IsChanged && !_typeChanged && !FFlagChanged[0]) return; 90 | 91 | FOut.ResizeAndDismiss(_input.Spread.SliceCount, i => null); 92 | for (int i = 0; i < _input.Spread.SliceCount; i++) 93 | { 94 | if (FOut[i] == null) FOut[i] = new VAuxObject {Object = _input[i]}; 95 | var vaux = (VAuxObject) FOut[i]; 96 | vaux.Object = _input[i]; 97 | } 98 | 99 | _typeChanged = false; 100 | FOut.Stream.IsChanged = FFlagChanged[0]; 101 | } 102 | else 103 | { 104 | FOut.Stream.IsChanged = _prevvalid; 105 | FOut.SliceCount = 0; 106 | } 107 | _prevvalid = valid; 108 | } 109 | 110 | public DX11RenderContext AssignedContext { get; set; } 111 | public event DX11RenderRequestDelegate RenderRequest; 112 | } 113 | 114 | [PluginInfo( 115 | Name = "UnwrapResource", 116 | Category = "Notui.Auxiliary.DX11", 117 | Author = "microdee", 118 | AutoEvaluate = true 119 | )] 120 | public class AuxDX11ResourceUnwrapNode : IPluginEvaluate, IPartImportsSatisfiedNotification, IDX11ResourceHost 121 | { 122 | [Import] protected IPluginHost2 FPluginHost; 123 | [Import] protected IIOFactory FIOFactory; 124 | [Import] protected IHDEHost Hde; 125 | 126 | private ConfigurableTypePinGroup PinGroup; 127 | private bool _typeChanged; 128 | private bool _init = true; 129 | private SpreadPin _output; 130 | 131 | [Input("Input")] public Pin FIn; 132 | 133 | public void OnImportsSatisfied() 134 | { 135 | PinGroup = new ConfigurableTypePinGroup(FPluginHost, FIOFactory, Hde.MainLoop, "Output"); 136 | PinGroup.ConfigDX11TypeShortcuts(); 137 | 138 | PinGroup.OnTypeChangeEnd += (sender, args) => 139 | { 140 | _typeChanged = true; 141 | if (!_init) return; 142 | PinGroup.AddOutputBinSized(new OutputAttribute("Output")); 143 | _output = PinGroup.Pd.OutputPins["Output"]; 144 | _init = false; 145 | }; 146 | } 147 | 148 | public void Evaluate(int SpreadMax) 149 | { 150 | var valid = FIn.IsConnected; 151 | if (valid) valid = _output != null; 152 | if (valid) valid = FIn.SliceCount > 0; 153 | if (valid) 154 | { 155 | if(!FIn.IsChanged && !_typeChanged) return; 156 | _output.Spread.SliceCount = FIn.SliceCount; 157 | for (int i = 0; i < FIn.SliceCount; i++) 158 | { 159 | var cspread = (ISpread)_output[i]; 160 | if (FIn[i] is VAuxObject vaux) 161 | { 162 | if (vaux.Object.GetType().Is(PinGroup.GroupType)) 163 | { 164 | cspread.SliceCount = 1; 165 | cspread[0] = vaux.Object; 166 | } 167 | else cspread.SliceCount = 0; 168 | } 169 | else cspread.SliceCount = 0; 170 | } 171 | _typeChanged = false; 172 | } 173 | else 174 | { 175 | if(_output != null) _output.Spread.SliceCount = 0; 176 | } 177 | } 178 | 179 | public Dictionary Data { get; } 180 | public void Update(DX11RenderContext context) 181 | { } 182 | 183 | public void Destroy(DX11RenderContext context, bool force) 184 | { 185 | //TODO: check if resource really have to be destroyed when they're only fetched from class 186 | } 187 | } 188 | } 189 | -------------------------------------------------------------------------------- /AuxObjectWrapperNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.Composition; 4 | using System.Linq; 5 | using System.Text; 6 | using md.stdl.Coding; 7 | using mp.pddn; 8 | using Notui; 9 | using VVVV.Hosting.Graph; 10 | using VVVV.PluginInterfaces.V2; 11 | using VVVV.PluginInterfaces.V2.NonGeneric; 12 | 13 | namespace Notuiv 14 | { 15 | public class VAuxObject : AuxiliaryObject 16 | { 17 | public object Object { get; set; } 18 | 19 | public override IAuxiliaryObject Copy() 20 | { 21 | return new VAuxObject { Object = Object }; 22 | } 23 | 24 | public override void UpdateFrom(IAuxiliaryObject other) 25 | { 26 | if (other is VAuxObject vaux) 27 | Object = vaux.Object; 28 | } 29 | } 30 | 31 | [PluginInfo( 32 | Name = "Wrap", 33 | Category = "Notui.Auxiliary", 34 | Author = "microdee", 35 | AutoEvaluate = true 36 | )] 37 | public class AuxObjectWrapNode : IPluginEvaluate, IPartImportsSatisfiedNotification 38 | { 39 | [Import] protected IPluginHost2 FPluginHost; 40 | [Import] protected IIOFactory FIOFactory; 41 | [Import] protected IHDEHost Hde; 42 | 43 | private ConfigurableTypePinGroup PinGroup; 44 | private bool _typeChanged; 45 | private bool _init = true; 46 | private DiffSpreadPin _input; 47 | private bool _prevvalid = false; 48 | 49 | [Output("Output")] public ISpread FOut; 50 | 51 | public void OnImportsSatisfied() 52 | { 53 | PinGroup = new ConfigurableTypePinGroup(FPluginHost, FIOFactory, Hde.MainLoop, "Input"); 54 | PinGroup.OnTypeChangeEnd += (sender, args) => 55 | { 56 | _typeChanged = true; 57 | if (!_init) return; 58 | PinGroup.AddInput(new InputAttribute("Input")); 59 | _input = PinGroup.Pd.InputPins["Input"]; 60 | _init = false; 61 | }; 62 | } 63 | 64 | public void Evaluate(int SpreadMax) 65 | { 66 | FOut.Stream.IsChanged = false; 67 | var valid = _input != null; 68 | if (valid) valid = _input.Spread.SliceCount > 0; 69 | if (valid) valid = _input[0] != null; 70 | if (valid) 71 | { 72 | if (!_input.Spread.IsChanged && !_typeChanged) return; 73 | 74 | FOut.ResizeAndDismiss(_input.Spread.SliceCount, i => null); 75 | for (int i = 0; i < _input.Spread.SliceCount; i++) 76 | { 77 | if (FOut[i] == null) FOut[i] = new VAuxObject {Object = _input[i]}; 78 | var vaux = (VAuxObject) FOut[i]; 79 | vaux.Object = _input[i]; 80 | } 81 | 82 | _typeChanged = false; 83 | FOut.Stream.IsChanged = true; 84 | } 85 | else 86 | { 87 | FOut.Stream.IsChanged = _prevvalid; 88 | FOut.SliceCount = 0; 89 | } 90 | _prevvalid = valid; 91 | } 92 | } 93 | 94 | [PluginInfo( 95 | Name = "Unwrap", 96 | Category = "Notui.Auxiliary", 97 | Author = "microdee", 98 | AutoEvaluate = true 99 | )] 100 | public class AuxObjectUnwrapNode : IPluginEvaluate, IPartImportsSatisfiedNotification 101 | { 102 | [Import] protected IPluginHost2 FPluginHost; 103 | [Import] protected IIOFactory FIOFactory; 104 | [Import] protected IHDEHost Hde; 105 | 106 | private ConfigurableTypePinGroup PinGroup; 107 | private bool _typeChanged; 108 | private bool _init = true; 109 | private SpreadPin _output; 110 | 111 | [Input("Input")] public Pin Input; 112 | 113 | public void OnImportsSatisfied() 114 | { 115 | PinGroup = new ConfigurableTypePinGroup(FPluginHost, FIOFactory, Hde.MainLoop, "Output"); 116 | PinGroup.OnTypeChangeEnd += (sender, args) => 117 | { 118 | _typeChanged = true; 119 | if (!_init) return; 120 | PinGroup.AddOutputBinSized(new OutputAttribute("Output")); 121 | _output = PinGroup.Pd.OutputPins["Output"]; 122 | _init = false; 123 | }; 124 | } 125 | 126 | public void Evaluate(int SpreadMax) 127 | { 128 | var valid = Input.IsConnected; 129 | if (valid) valid = _output != null; 130 | if (valid) valid = Input.SliceCount > 0; 131 | if (valid) 132 | { 133 | if(!Input.IsChanged && !_typeChanged) return; 134 | _output.Spread.SliceCount = Input.SliceCount; 135 | for (int i = 0; i < Input.SliceCount; i++) 136 | { 137 | var cspread = (ISpread)_output[i]; 138 | if (Input[i] is VAuxObject vaux) 139 | { 140 | if(PinGroup.GroupType.IsInstanceOfType(vaux.Object)) 141 | { 142 | cspread.SliceCount = 1; 143 | cspread[0] = vaux.Object; 144 | } 145 | else cspread.SliceCount = 0; 146 | } 147 | else cspread.SliceCount = 0; 148 | } 149 | _typeChanged = false; 150 | } 151 | else 152 | { 153 | if(_output != null) _output.Spread.SliceCount = 0; 154 | } 155 | } 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /BasicBehaviors.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Reflection; 4 | using mp.pddn; 5 | using Notui; 6 | using Notui.Behaviors; 7 | using VVVV.PluginInterfaces.V2; 8 | 9 | namespace Notuiv 10 | { 11 | [PluginInfo( 12 | Name = "ValueSlider2D", 13 | Category = "Notui.Behavior", 14 | Version = "Join", 15 | Author = "microdee" 16 | )] 17 | public class ValueSliderBehaviorNode : AbstractBehaviorNode { } 18 | 19 | [PluginInfo( 20 | Name = "Sliding", 21 | Category = "Notui.Behavior", 22 | Version = "Join", 23 | Author = "microdee" 24 | )] 25 | public class SlidingBehaviorNode : AbstractBehaviorNode { } 26 | 27 | [PluginInfo( 28 | Name = "SlidingInfo", 29 | Category = "Notui.Behavior", 30 | Version = "Split", 31 | Author = "microdee" 32 | )] 33 | public class SlidingBehaviorInfoNode : BehaviorInstanceInfoNode { } 34 | 35 | [PluginInfo( 36 | Name = "MouseWheelScroll", 37 | Category = "Notui.Behavior", 38 | Version = "Join", 39 | Author = "microdee" 40 | )] 41 | public class MouseWheelScrollBehaviorNode : AbstractBehaviorNode { } 42 | 43 | [PluginInfo( 44 | Name = "MouseWheelScrollInfo", 45 | Category = "Notui.Behavior", 46 | Version = "Split", 47 | Author = "microdee" 48 | )] 49 | public class MouseWheelScrollBehaviorInfoNode : BehaviorInstanceInfoNode { } 50 | 51 | [PluginInfo( 52 | Name = "MoveToTopOnTouch", 53 | Category = "Notui.Behavior", 54 | Version = "Join", 55 | Author = "microdee" 56 | )] 57 | public class MoveToTopOnTouchBehaviorNode : AbstractBehaviorNode { } 58 | } 59 | -------------------------------------------------------------------------------- /BasicElementNodes.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using System.Numerics; 3 | using md.stdl.Mathematics; 4 | using Notui; 5 | using Notui.Elements; 6 | using VVVV.PluginInterfaces.V2; 7 | using VVVV.Utils.VMath; 8 | 9 | namespace Notuiv 10 | { 11 | 12 | [PluginInfo( 13 | Name = "Void", 14 | Category = "Notui.ElementPrototype", 15 | Version = "Join", 16 | Author = "microdee" 17 | )] 18 | public class VoidElementNode : AbstractElementNode 19 | { 20 | protected override VoidElementPrototype ConstructPrototype(int i, string id) 21 | { 22 | return new VoidElementPrototype(string.IsNullOrWhiteSpace(id) ? null : id); 23 | } 24 | } 25 | 26 | [PluginInfo( 27 | Name = "Plane", 28 | Category = "Notui.ElementPrototype", 29 | Version = "Join", 30 | Author = "microdee" 31 | )] 32 | public class PlaneElementNode : AbstractElementNode 33 | { 34 | protected override InfinitePlaneElementPrototype ConstructPrototype(int i, string id) 35 | { 36 | return new InfinitePlaneElementPrototype(string.IsNullOrWhiteSpace(id) ? null : id); 37 | } 38 | } 39 | 40 | [PluginInfo( 41 | Name = "Rectangle", 42 | Category = "Notui.ElementPrototype", 43 | Version = "Join", 44 | Author = "microdee" 45 | )] 46 | public class RectangleElementNode : AbstractElementNode 47 | { 48 | protected override RectangleElementPrototype ConstructPrototype(int i, string id) 49 | { 50 | return new RectangleElementPrototype(string.IsNullOrWhiteSpace(id) ? null : id); 51 | } 52 | } 53 | 54 | [PluginInfo( 55 | Name = "Circle", 56 | Category = "Notui.ElementPrototype", 57 | Version = "Join", 58 | Author = "microdee" 59 | )] 60 | public class CircleElementNode : AbstractElementNode 61 | { 62 | protected override CircleElementPrototype ConstructPrototype(int i, string id) 63 | { 64 | return new CircleElementPrototype(string.IsNullOrWhiteSpace(id) ? null : id); 65 | } 66 | } 67 | 68 | [PluginInfo( 69 | Name = "Segment", 70 | Category = "Notui.ElementPrototype", 71 | Version = "Join", 72 | Author = "microdee" 73 | )] 74 | public class SegmentElementNode : AbstractElementNode 75 | { 76 | [Input("Inner Radius")] 77 | public IDiffSpread FInnerRadius; 78 | 79 | [Input("Cycles")] 80 | public IDiffSpread FCycles; 81 | 82 | [Input("Phase")] 83 | public IDiffSpread FPhase; 84 | 85 | protected override SegmentElementPrototype ConstructPrototype(int i, string id) 86 | { 87 | return new SegmentElementPrototype(string.IsNullOrWhiteSpace(id) ? null : id) 88 | { 89 | HoleRadius = FInnerRadius[i], 90 | Cycles = FCycles[i], 91 | Phase = FPhase[i] 92 | }; 93 | } 94 | 95 | protected override void FillElementAuxData(SegmentElementPrototype el, int i) 96 | { 97 | el.Cycles = FCycles[i]; 98 | el.HoleRadius = FInnerRadius[i]; 99 | el.Phase = FPhase[i]; 100 | } 101 | 102 | protected override bool AuxDataChanged() 103 | { 104 | return FInnerRadius.IsChanged || FCycles.IsChanged || FPhase.IsChanged; 105 | } 106 | } 107 | 108 | [PluginInfo( 109 | Name = "GetSegmentParams", 110 | Category = "Notui.Element", 111 | Version = "Split", 112 | Author = "microdee" 113 | )] 114 | public class GetSegmentParamsNode : GetExtraParamsNodeBase 115 | { 116 | [Output("Inner Radius")] 117 | public ISpread FInnerRad; 118 | 119 | [Output("Cycles")] 120 | public ISpread FCycles; 121 | 122 | [Output("Phase")] 123 | public ISpread FPhase; 124 | 125 | public override void GetExtraInstParameters(int i, SegmentElement element) 126 | { 127 | FInnerRad[i] = element.HoleRadius; 128 | FCycles[i] = element.Cycles; 129 | FPhase[i] = element.Phase; 130 | } 131 | public override void GetExtraProtParameters(int i, SegmentElementPrototype element) 132 | { 133 | FInnerRad[i] = element.HoleRadius; 134 | FCycles[i] = element.Cycles; 135 | FPhase[i] = element.Phase; 136 | } 137 | 138 | public override void SetSliceCounts() 139 | { 140 | FCycles.SliceCount = FInnerRad.SliceCount = FPhase.SliceCount = In.SliceCount; 141 | } 142 | 143 | public override void EmptySpreads() 144 | { 145 | FCycles.SliceCount = FInnerRad.SliceCount = FPhase.SliceCount = 0; 146 | } 147 | } 148 | 149 | [PluginInfo( 150 | Name = "SetSegmentParams", 151 | Category = "Notui.Element", 152 | Version = "Split", 153 | Author = "microdee", 154 | AutoEvaluate = true 155 | )] 156 | public class SetSegmentParamsNode : SetExtraParamsNodeBase 157 | { 158 | [Input("Inner Radius")] 159 | public IDiffSpread FInnerRad; 160 | 161 | [Input("Cycles")] 162 | public IDiffSpread FCycles; 163 | 164 | [Input("Phase")] 165 | public IDiffSpread FPhase; 166 | 167 | public override void SetExtraParameters(int i, SegmentElement element) 168 | { 169 | element.HoleRadius = FInnerRad[i]; 170 | element.Cycles = FCycles[i]; 171 | element.Phase = FPhase[i]; 172 | } 173 | } 174 | 175 | [PluginInfo( 176 | Name = "Polygon2D", 177 | Category = "Notui.ElementPrototype", 178 | Version = "Join", 179 | Author = "microdee" 180 | )] 181 | public class PolygonElementNode : AbstractElementNode 182 | { 183 | [Input("Vertices")] 184 | public IDiffSpread> FVerts; 185 | 186 | protected override PolygonElementPrototype ConstructPrototype(int i, string id) 187 | { 188 | var res = new PolygonElementPrototype(string.IsNullOrWhiteSpace(id) ? null : id); 189 | res.Vertices.Clear(); 190 | res.Vertices.AddRange(FVerts[i].Select(v => v.AsSystemVector())); 191 | return res; 192 | } 193 | 194 | protected override void FillElementAuxData(PolygonElementPrototype el, int i) 195 | { 196 | el.Vertices.Clear(); 197 | el.Vertices.AddRange(FVerts[i].Select(v => v.AsSystemVector())); 198 | } 199 | 200 | protected override bool AuxDataChanged() 201 | { 202 | return FVerts.IsChanged; 203 | } 204 | } 205 | 206 | [PluginInfo( 207 | Name = "GetPolygon2DParams", 208 | Category = "Notui.Element", 209 | Version = "Split", 210 | Author = "microdee" 211 | )] 212 | public class GetPolygon2DParamsNode : GetExtraParamsNodeBase 213 | { 214 | [Output("Vertices")] 215 | public ISpread> FVerts; 216 | 217 | public override void GetExtraInstParameters(int i, PolygonElement element) 218 | { 219 | FVerts[i].AssignFrom(element.Vertices.Select(v => v.AsVVector())); 220 | } 221 | public override void GetExtraProtParameters(int i, PolygonElementPrototype element) 222 | { 223 | FVerts[i].AssignFrom(element.Vertices.Select(v => v.AsVVector())); 224 | } 225 | 226 | public override void SetSliceCounts() 227 | { 228 | FVerts.SliceCount = In.SliceCount; 229 | } 230 | 231 | public override void EmptySpreads() 232 | { 233 | FVerts.SliceCount = 0; 234 | } 235 | } 236 | 237 | [PluginInfo( 238 | Name = "SetPolygon2DParams", 239 | Category = "Notui.Element", 240 | Version = "Split", 241 | Author = "microdee", 242 | AutoEvaluate = true 243 | )] 244 | public class SetPolygon2DParamsNode : SetExtraParamsNodeBase 245 | { 246 | [Input("Vertices")] 247 | public IDiffSpread> FVerts; 248 | 249 | public override void SetExtraParameters(int i, PolygonElement element) 250 | { 251 | element.Vertices.Clear(); 252 | element.Vertices.AddRange(FVerts[i].Select(v => v.AsSystemVector())); 253 | } 254 | } 255 | 256 | [PluginInfo( 257 | Name = "Sphere", 258 | Category = "Notui.ElementPrototype", 259 | Version = "Join", 260 | Author = "microdee" 261 | )] 262 | public class SphereElementNode : AbstractElementNode 263 | { 264 | protected override SphereElementPrototype ConstructPrototype(int i, string id) 265 | { 266 | return new SphereElementPrototype(string.IsNullOrWhiteSpace(id) ? null : id); 267 | } 268 | } 269 | 270 | [PluginInfo( 271 | Name = "Box", 272 | Category = "Notui.ElementPrototype", 273 | Version = "Join", 274 | Author = "microdee" 275 | )] 276 | public class BoxElementNode : AbstractElementNode 277 | { 278 | [Input("Size", DefaultValues = new [] {1.0, 1.0, 1.0})] 279 | public IDiffSpread FSize; 280 | 281 | protected override BoxElementPrototype ConstructPrototype(int i, string id) 282 | { 283 | return new BoxElementPrototype(string.IsNullOrWhiteSpace(id) ? null : id) 284 | { 285 | Size = FSize[i].AsSystemVector() 286 | }; 287 | } 288 | 289 | protected override void FillElementAuxData(BoxElementPrototype el, int i) 290 | { 291 | el.Size = FSize[i].AsSystemVector(); 292 | } 293 | 294 | protected override bool AuxDataChanged() 295 | { 296 | return FSize.IsChanged; 297 | } 298 | } 299 | 300 | [PluginInfo( 301 | Name = "GetBoxParams", 302 | Category = "Notui.Element", 303 | Version = "Split", 304 | Author = "microdee" 305 | )] 306 | public class GetBoxParamsNode : GetExtraParamsNodeBase 307 | { 308 | [Output("Size")] 309 | public ISpread FSize; 310 | 311 | public override void GetExtraInstParameters(int i, BoxElement element) 312 | { 313 | FSize[i] = element.Size.AsVVector(); 314 | } 315 | public override void GetExtraProtParameters(int i, BoxElementPrototype element) 316 | { 317 | FSize[i] = element.Size.AsVVector(); 318 | } 319 | 320 | public override void SetSliceCounts() 321 | { 322 | FSize.SliceCount = In.SliceCount; 323 | } 324 | 325 | public override void EmptySpreads() 326 | { 327 | FSize.SliceCount = 0; 328 | } 329 | } 330 | 331 | [PluginInfo( 332 | Name = "SetBoxParams", 333 | Category = "Notui.Element", 334 | Version = "Split", 335 | Author = "microdee", 336 | AutoEvaluate = true 337 | )] 338 | public class SetBoxParamsNode : SetExtraParamsNodeBase 339 | { 340 | [Input("Size", DefaultValues = new[] { 1.0, 1.0, 1.0 })] 341 | public IDiffSpread FSize; 342 | 343 | public override void SetExtraParameters(int i, BoxElement element) 344 | { 345 | element.Size = FSize[i].AsSystemVector(); 346 | } 347 | } 348 | } 349 | -------------------------------------------------------------------------------- /ContextNode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.Composition; 4 | using System.Linq; 5 | using System.Numerics; 6 | using System.Reflection; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using md.stdl.Boolean; 10 | using md.stdl.Interaction; 11 | using Notui; 12 | using md.stdl.Mathematics; 13 | using mp.pddn; 14 | using VVVV.DX11.Nodes.Renderers.Graphics.Touch; 15 | using VVVV.PluginInterfaces.V1; 16 | using VVVV.PluginInterfaces.V2; 17 | using VVVV.Utils.IO; 18 | using VVVV.Utils.VMath; 19 | using VMatrix = VVVV.Utils.VMath.Matrix4x4; 20 | using SMatrix = System.Numerics.Matrix4x4; 21 | 22 | 23 | namespace Notuiv 24 | { 25 | [PluginInfo( 26 | Name = "Context", 27 | Category = "Notui", 28 | Author = "microdee", 29 | AutoEvaluate = true 30 | )] 31 | public class ContextNode : IPluginEvaluate, IPartImportsSatisfiedNotification, IPluginFeedbackLoop 32 | { 33 | [Import] public IPluginHost2 PluginHost; 34 | [Import] public IHDEHost Host; 35 | 36 | [Config("Thread Count", DefaultValue = 4, IsSingle = true)] 37 | public IDiffSpread ThreadsIn; 38 | 39 | [Input("Element Prototypes")] 40 | public Pin ElementsIn; 41 | [Input("Force Update Elements", IsSingle = true, IsBang = true)] 42 | public ISpread ForceUpdateIn; 43 | 44 | private Spread _prevElements = new Spread(); 45 | 46 | [Input("Mouse", IsSingle = true)] 47 | public Pin MouseIn; 48 | [Input("Mouse Touch ID", DefaultValue = -1, IsSingle = true)] 49 | public ISpread MouseIdIn; 50 | [Input("Mouse Always Present", IsSingle = true)] 51 | public ISpread AlwaysPresentIn; 52 | [Input("Mouse Pressed Force", DefaultValue = 1.0, IsSingle = true)] 53 | public ISpread MouseForceIn; 54 | 55 | [Input("DX11 Touches")] 56 | public Pin Dx11TouchesIn; 57 | [Input("DX11 Touch Force", DefaultValue = 1.0, IsSingle = true)] 58 | public ISpread Dx11TouchForceIn; 59 | [Input("Aux Touches ", DimensionNames = new []{"X", "Y", "F", "Id"})] 60 | public IDiffSpread AuxTouchesIn; 61 | 62 | [Input("Minimum Force for Interaction", DefaultValue = 0.5, IsSingle = true)] 63 | public IDiffSpread MinForceIn; 64 | [Input("Consider Touch New Before", DefaultValue = 1, IsSingle = true)] 65 | public ISpread ConsiderNewIn; 66 | [Input("Consider Touch Released After", DefaultValue = 1, IsSingle = true)] 67 | public ISpread ConsiderReleasedIn; 68 | 69 | [Input("View", IsSingle = true)] 70 | public Pin ViewTrIn; 71 | [Input("Projection", IsSingle = true)] 72 | public Pin ProjTrIn; 73 | [Input("Aspect Ratio", IsSingle = true)] 74 | public Pin AspTrIn; 75 | 76 | [Output("Context")] 77 | public ISpread ContextOut; 78 | [Output("Hierarchical Elements")] 79 | public ISpread ElementsOut; 80 | [Output("Flat Elements")] 81 | public ISpread FlatElementsOut; 82 | 83 | [Output("Touches")] 84 | public ISpread TouchesOut; 85 | 86 | public NotuiContext Context = new NotuiContext 87 | { 88 | UpdateOnlyChangeFlagged = true 89 | }; 90 | 91 | private double _prevFrameTime = 0; 92 | private bool _initMo = true; 93 | private int _areElementsChanged = 0; 94 | 95 | public bool IsTouchDefault() 96 | { 97 | bool def = AuxTouchesIn.SliceCount == 1; 98 | def = def && AuxTouchesIn[0].xy.Length < 0.00001; 99 | def = def && Math.Abs(AuxTouchesIn[0].w) < 0.00001; 100 | def = def && Math.Abs(AuxTouchesIn[0].z) < 0.00001; 101 | return def; 102 | } 103 | 104 | public void OnImportsSatisfied() 105 | { 106 | //FElements.Disconnected += (sender, args) => 107 | //{ 108 | // Context.AddOrUpdateElements(true); // this is basically asking all elements to request their deletion 109 | //}; 110 | } 111 | 112 | /* Button order in rawinput apparently: 113 | * Right, Left, X1, X2, Middle 114 | * 2, 0, 3, 4, 1 115 | * 1, 4, 0, 2, 3 116 | */ 117 | 118 | public void Evaluate(int SpreadMax) 119 | { 120 | 121 | Context.ConsiderNewBefore = ConsiderNewIn.TryGetSlice(0); 122 | Context.ConsiderReleasedAfter = ConsiderReleasedIn.TryGetSlice(0); 123 | Context.MinimumForce = MinForceIn.TryGetSlice(0); 124 | 125 | if (ThreadsIn.IsChanged) Context.ParallelThreads = ThreadsIn.TryGetSlice(0); 126 | 127 | var touchcount = AuxTouchesIn.SliceCount; 128 | var touches = Enumerable.Empty<(Vector2, int, float)>(); 129 | 130 | touches = touches.Concat(Enumerable.Range(0, Dx11TouchesIn.SliceCount).Where(i => Dx11TouchesIn[i] != null).Select(i => 131 | { 132 | var touch = Dx11TouchesIn[i]; 133 | var pos = new Vector2(touch.Pos.X, touch.Pos.Y); 134 | return (pos, touch.Id, Dx11TouchForceIn[i]); 135 | })); 136 | 137 | if (!IsTouchDefault()) 138 | { 139 | touches = touches.Concat(Enumerable.Range(0, touchcount).Select(i => 140 | (AuxTouchesIn[i].xy.AsSystemVector(), (int)AuxTouchesIn[i].w, (float)AuxTouchesIn[i].z))); 141 | } 142 | 143 | Context.MouseAlwaysPresent = AlwaysPresentIn.TryGetSlice(0); 144 | Context.MouseTouchForce = MouseForceIn.TryGetSlice(0); 145 | Context.MouseTouchId = MouseIdIn.TryGetSlice(0); 146 | 147 | if (MouseIn.IsConnected && MouseIn.SliceCount > 0) 148 | { 149 | if (MouseIn[0] != null) 150 | { 151 | if (_initMo) 152 | { 153 | Context.SubmitMouse(MouseIn[0]); 154 | _initMo = false; 155 | } 156 | } 157 | else 158 | { 159 | if (!_initMo) 160 | { 161 | Context.DetachMouse(); 162 | _initMo = true; 163 | } 164 | } 165 | } 166 | else 167 | { 168 | if (!_initMo) 169 | { 170 | Context.DetachMouse(); 171 | _initMo = true; 172 | } 173 | } 174 | 175 | Context.SubmitTouches(touches); 176 | 177 | var dt = Host.FrameTime - _prevFrameTime; 178 | if (_prevFrameTime <= 0.00001) dt = 0; 179 | 180 | if(ViewTrIn.IsConnected && ViewTrIn.SliceCount > 0) 181 | Context.View = ViewTrIn[0].AsSystemMatrix4X4(); 182 | else Context.View = SMatrix.Identity; 183 | 184 | if (ProjTrIn.IsConnected && ProjTrIn.SliceCount > 0) 185 | Context.Projection = ProjTrIn[0].AsSystemMatrix4X4(); 186 | else Context.Projection = SMatrix.Identity; 187 | 188 | if (AspTrIn.IsConnected && AspTrIn.SliceCount > 0) 189 | Context.AspectRatio = AspTrIn[0].AsSystemMatrix4X4(); 190 | else Context.AspectRatio = SMatrix.Identity; 191 | 192 | if (ElementsIn.IsChanged) 193 | { 194 | for (int i = 0; i < ElementsIn.SliceCount; i++) 195 | { 196 | if (ElementsIn[i] == null) continue; 197 | if (_prevElements.Contains(ElementsIn[i])) continue; 198 | ElementsIn[i].IsChanged = ElementNodeUtils.ChangedFrames; 199 | } 200 | 201 | _prevElements.AssignFrom(ElementsIn); 202 | _areElementsChanged = 2; 203 | } 204 | 205 | if (_areElementsChanged > 0 || ForceUpdateIn.TryGetSlice(0)) 206 | { 207 | Context.AddOrUpdateElements(true, ElementsIn.Where(el => el != null).ToArray()); 208 | _areElementsChanged--; 209 | } 210 | 211 | Context.Mainloop((float)dt); 212 | 213 | ContextOut[0] = Context; 214 | 215 | FlatElementsOut.SliceCount = Context.FlatElements.Count; 216 | 217 | for (int i = 0; i < Context.FlatElements.Count; i++) 218 | { 219 | var element = Context.FlatElements[i]; 220 | FlatElementsOut[i] = element; 221 | switch (element.EnvironmentObject) 222 | { 223 | case null: 224 | element.EnvironmentObject = new VEnvironmentData(element); 225 | break; 226 | case VEnvironmentData venvdat: 227 | if (venvdat.FlattenedEvents != null) continue; 228 | venvdat.FlattenedEvents = new ElementEventFlattener(Host); 229 | venvdat.FlattenedEvents.Subscribe(element); 230 | break; 231 | } 232 | } 233 | 234 | ElementsOut.AssignFrom(Context.RootElements.Values); 235 | TouchesOut.AssignFrom(Context.Touches.Values); 236 | 237 | _prevFrameTime = Host.FrameTime; 238 | } 239 | 240 | public bool OutputRequiresInputEvaluation(IPluginIO inputPin, IPluginIO outputPin) 241 | { 242 | return false; 243 | } 244 | } 245 | 246 | [PluginInfo( 247 | Name = "Context", 248 | Category = "Notui", 249 | Version = "Split", 250 | Author = "microdee" 251 | )] 252 | public class ContextSplitNode : ObjectSplitNode 253 | { 254 | public override Type TransformType(Type original, MemberInfo member) 255 | { 256 | return MiscExtensions.MapSystemNumericsTypeToVVVV(original); 257 | } 258 | 259 | public override object TransformOutput(object obj, MemberInfo member, int i) 260 | { 261 | return MiscExtensions.MapSystemNumericsValueToVVVV(obj); 262 | } 263 | } 264 | 265 | [PluginInfo( 266 | Name = "Touch", 267 | Category = "Notui", 268 | Version = "Split", 269 | Author = "microdee" 270 | )] 271 | public class TouchSplitNode : ObjectSplitNode 272 | { 273 | public override Type TransformType(Type original, MemberInfo member) 274 | { 275 | return MiscExtensions.MapSystemNumericsTypeToVVVV(original); 276 | } 277 | 278 | public override object TransformOutput(object obj, MemberInfo member, int i) 279 | { 280 | return MiscExtensions.MapSystemNumericsValueToVVVV(obj); 281 | } 282 | } 283 | } 284 | -------------------------------------------------------------------------------- /EditElementTransformationNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Reflection; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using md.stdl.Mathematics; 8 | using mp.pddn; 9 | using Notui; 10 | using VVVV.PluginInterfaces.V2; 11 | using VVVV.Utils.VMath; 12 | 13 | namespace Notuiv 14 | { 15 | [PluginInfo( 16 | Name = "ElementTransformation", 17 | Category = "Notui", 18 | Version = "Split", 19 | Author = "microdee" 20 | )] 21 | public class ElementTransformationSplitNodes : ObjectSplitNode 22 | { 23 | public override Type TransformType(Type original, MemberInfo member) 24 | { 25 | return MiscExtensions.MapSystemNumericsTypeToVVVV(original); 26 | } 27 | public override object TransformOutput(object obj, MemberInfo member, int i) 28 | { 29 | return MiscExtensions.MapSystemNumericsValueToVVVV(obj); 30 | } 31 | } 32 | 33 | [PluginInfo( 34 | Name = "ElementTransformation", 35 | Category = "Notui", 36 | Version = "Join", 37 | Author = "microdee" 38 | )] 39 | public class JoinElementTransformationNode : IPluginEvaluate 40 | { 41 | [Input("Translate")] 42 | public IDiffSpread FTrans; 43 | 44 | [Input("Quaternion", DefaultValues = new[] { 0.0, 0.0, 0.0, 1.0 })] 45 | public IDiffSpread FRot; 46 | 47 | [Input("Scale", DefaultValues = new [] {1.0, 1.0, 1.0})] 48 | public IDiffSpread FScale; 49 | 50 | [Output("Element Transform", AutoFlush = false)] 51 | public ISpread FTransform; 52 | 53 | public void Evaluate(int SpreadMax) 54 | { 55 | FTransform.Stream.IsChanged = false; 56 | if (FTrans.IsChanged || FRot.IsChanged || FScale.IsChanged) 57 | { 58 | FTransform.SliceCount = SpreadMax; 59 | for (int i = SpreadMax - 1; i >=0; i--) 60 | { 61 | if(FTransform[i] == null) 62 | FTransform[i] = new ElementTransformation(); 63 | else if(i > 0) 64 | { 65 | for (int j = i - 1; j >= 0; j--) 66 | { 67 | if (FTransform[i] != FTransform[j]) continue; 68 | FTransform[i] = new ElementTransformation(); 69 | break; 70 | } 71 | } 72 | 73 | FTransform[i].Position = FTrans[i].AsSystemVector(); 74 | FTransform[i].Rotation = FRot[i].AsSystemQuaternion(); 75 | FTransform[i].Scale = FScale[i].AsSystemVector(); 76 | } 77 | FTransform.Flush(true); 78 | FTransform.Stream.IsChanged = true; 79 | } 80 | } 81 | } 82 | 83 | [PluginInfo( 84 | Name = "SetTransformation", 85 | Category = "Notui.Element", 86 | Author = "microdee", 87 | AutoEvaluate = true 88 | )] 89 | public class SetElementTransformation : IPluginEvaluate 90 | { 91 | [Input("Element")] public Pin FElement; 92 | [Input("Display")] public Pin FDisp; 93 | [Input("Set Display")] public ISpread FSetDisp; 94 | [Input("Target")] public Pin FTarget; 95 | [Input("Set Target")] public ISpread FSetTarget; 96 | 97 | [Input("Transformation Update Mode", DefaultEnumEntry = "All")] 98 | public ISpread> FTrUpdateMode; 99 | 100 | [Output("Element Out")] public ISpread FElementOut; 101 | 102 | public void Evaluate(int SpreadMax) 103 | { 104 | if (FElement.IsConnected) 105 | { 106 | FElementOut.SliceCount = FElement.SliceCount; 107 | for (int i = 0; i < FElement.SliceCount; i++) 108 | { 109 | var trupdmode = FTrUpdateMode[i].Aggregate(ApplyTransformMode.None, (current, mode) => current | mode); 110 | FElementOut[i] = FElement[i]; 111 | if (FSetDisp[i] && FDisp.IsConnected && FDisp.SliceCount > 0) 112 | { 113 | if(FDisp[i] != null) 114 | FElement[i].DisplayTransformation.UpdateFrom(FDisp[i], trupdmode); 115 | } 116 | if (FSetTarget[i] && FTarget.IsConnected && FTarget.SliceCount > 0) 117 | { 118 | if (FTarget[i] != null) 119 | FElement[i].TargetTransformation.UpdateFrom(FTarget[i], trupdmode); 120 | } 121 | } 122 | } 123 | else 124 | { 125 | FElementOut.SliceCount = 0; 126 | } 127 | } 128 | } 129 | 130 | [PluginInfo( 131 | Name = "SetTransformation", 132 | Category = "Notui.Element", 133 | Version = "Matrix", 134 | Author = "microdee", 135 | AutoEvaluate = true 136 | )] 137 | public class SetElementTransformationFromMatrix : IPluginEvaluate 138 | { 139 | [Input("Element")] public Pin FElement; 140 | [Input("Display")] public ISpread FDisp; 141 | [Input("Set Display")] public ISpread FSetDisp; 142 | [Input("Target")] public ISpread FTarget; 143 | [Input("Set Target")] public ISpread FSetTarget; 144 | 145 | [Output("Element Out")] public ISpread FElementOut; 146 | 147 | public void Evaluate(int SpreadMax) 148 | { 149 | if (FElement.IsConnected) 150 | { 151 | FElementOut.SliceCount = FElement.SliceCount; 152 | for (int i = 0; i < FElement.SliceCount; i++) 153 | { 154 | if (FSetDisp[i] && FDisp.SliceCount > 0) 155 | { 156 | FDisp[i].Decompose(out var scale, out Vector4D rotation, out var pos); 157 | var tr = FElement[i].DisplayTransformation; 158 | tr.Position = pos.AsSystemVector(); 159 | tr.Rotation = rotation.AsSystemQuaternion(); 160 | tr.Scale = scale.AsSystemVector(); 161 | } 162 | if (FSetTarget[i] && FTarget.SliceCount > 0) 163 | { 164 | FTarget[i].Decompose(out var scale, out Vector4D rotation, out var pos); 165 | var tr = FElement[i].TargetTransformation; 166 | tr.Position = pos.AsSystemVector(); 167 | tr.Rotation = rotation.AsSystemQuaternion(); 168 | tr.Scale = scale.AsSystemVector(); 169 | } 170 | FElementOut[i] = FElement[i]; 171 | } 172 | } 173 | else 174 | { 175 | FElementOut.SliceCount = 0; 176 | } 177 | } 178 | } 179 | 180 | } 181 | -------------------------------------------------------------------------------- /ElementInfoNode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.Composition; 4 | using System.ComponentModel.Composition.Hosting; 5 | using System.Diagnostics; 6 | using System.Reflection; 7 | using System.Runtime.CompilerServices; 8 | using System.Runtime.InteropServices; 9 | using md.stdl.Coding; 10 | using md.stdl.Interaction; 11 | using Notui; 12 | using mp.pddn; 13 | using VVVV.PluginInterfaces.V2; 14 | using VVVV.Utils.IO; 15 | using VVVV.Utils.VMath; 16 | 17 | namespace Notuiv 18 | { 19 | [PluginInfo( 20 | Name = "AttachedValues", 21 | Category = "Notui", 22 | Version = "Split", 23 | Author = "microdee" 24 | )] 25 | public class AttachedValuesSplitNodes : ObjectSplitNode { } 26 | 27 | [PluginInfo( 28 | Name = "IntersectionPoint", 29 | Category = "Notui", 30 | Version = "Split", 31 | Author = "microdee" 32 | )] 33 | public class IntersectionPointSplitNodes : ObjectSplitNode 34 | { 35 | [ImportingConstructor] 36 | public IntersectionPointSplitNodes() 37 | { 38 | UseObjectCache = false; 39 | } 40 | } 41 | 42 | [PluginInfo( 43 | Name = "PrototypeInfo", 44 | Category = "Notui.ElementPrototype", 45 | Version = "Split", 46 | Author = "microdee" 47 | )] 48 | public class PrototypeInfoSplitNodes : ObjectSplitNode 49 | { 50 | public override bool StopWatchToSeconds => true; 51 | } 52 | 53 | [PluginInfo( 54 | Name = "MouseSplit", 55 | Category = "Mouse", 56 | Version = "Accumulated", 57 | Author = "microdee" 58 | )] 59 | public class AccumulatedMouseSplitNodes : ObjectSplitNode 60 | { 61 | public override bool StopWatchToSeconds => true; 62 | } 63 | 64 | [PluginInfo( 65 | Name = "ElementSplitter", 66 | Category = "Notui.Element", 67 | Version = "Split", 68 | Author = "microdee", 69 | Ignore = true 70 | )] 71 | public class ElementSplitterNode : ObjectSplitNode 72 | { 73 | public override bool StopWatchToSeconds => true; 74 | public override bool ManualInit => true; 75 | 76 | [ImportingConstructor] 77 | public ElementSplitterNode() { } 78 | } 79 | 80 | [PluginInfo( 81 | Name = "InstanceInfo", 82 | Category = "Notui.Element", 83 | Version = "Split", 84 | Author = "microdee" 85 | )] 86 | public class GuiElementInfoNode : IPluginEvaluate 87 | { 88 | [Input("Element")] public Pin ElementIn; 89 | 90 | [Output("Element", Order = 0)] 91 | public ISpread ElementOut; 92 | 93 | [Output( 94 | "Type", 95 | Visibility = PinVisibility.OnlyInspector, 96 | Order = 101 97 | )] 98 | public ISpread TypeOut; 99 | 100 | [Output("Display Transformation Out", Order = 2)] 101 | public ISpread DisplayTrOut; 102 | [Output("Local Display Transformation", Visibility = PinVisibility.Hidden, Order = 2)] 103 | public ISpread LocDisplayOut; 104 | 105 | [Output("Name Out", Order = 3)] 106 | public ISpread NameOut; 107 | [Output("ID", Visibility = PinVisibility.Hidden, Order = 4)] 108 | public ISpread IdOut; 109 | [Output("Active Out", Visibility = PinVisibility.Hidden, Order = 5)] 110 | public ISpread ActiveOut; 111 | 112 | [Output( 113 | "Transparent Out", 114 | Visibility = PinVisibility.OnlyInspector, 115 | Order = 106 116 | )] 117 | public ISpread TransparentOut; 118 | [Output("Hit", Order = 7)] 119 | public ISpread HitOut; 120 | [Output("Touched", Order = 8)] 121 | public ISpread TouchedOut; 122 | [Output("Dying", Order = 9)] 123 | public ISpread DyingOut; 124 | [Output("Fading State", Visibility = PinVisibility.Hidden, Order = 10)] 125 | public ISpread FadeStateOut; 126 | [Output("Fade Progress", Order = 11)] 127 | public ISpread ElementFadeOut; 128 | 129 | [Output( 130 | "Age", 131 | Order = 112, 132 | Visibility = PinVisibility.OnlyInspector 133 | )] 134 | public ISpread AgeOut; 135 | 136 | [Output("Interacting Touches", Order = 13, BinOrder = 14)] 137 | public ISpread> TouchesOut; 138 | 139 | [Output( 140 | "Are Interacting Touches Hitting", 141 | Visibility = PinVisibility.OnlyInspector, 142 | BinVisibility = PinVisibility.OnlyInspector, 143 | Order = 115, 144 | BinOrder = 116 145 | )] 146 | public ISpread> TouchesHittingOut; 147 | 148 | [Output( 149 | "Touching Intersections", 150 | Visibility = PinVisibility.Hidden, 151 | BinVisibility = PinVisibility.Hidden, 152 | Order = 17, 153 | BinOrder = 18 154 | )] 155 | public ISpread> TouchingIntersectionsOut; 156 | 157 | [Output( 158 | "Hitting Touches", 159 | Visibility = PinVisibility.OnlyInspector, 160 | BinVisibility = PinVisibility.OnlyInspector, 161 | Order = 119, 162 | BinOrder = 120 163 | )] 164 | public ISpread> HittingTouchesOut; 165 | 166 | [Output( 167 | "Hitting Intersections", 168 | Visibility = PinVisibility.OnlyInspector, 169 | BinVisibility = PinVisibility.OnlyInspector, 170 | Order = 121, 171 | BinOrder = 122 172 | )] 173 | public ISpread> HittingIntersectionsOut; 174 | 175 | [Output( 176 | "Mice", 177 | Visibility = PinVisibility.OnlyInspector, 178 | BinVisibility = PinVisibility.OnlyInspector, 179 | Order = 123, 180 | BinOrder = 124 181 | )] 182 | public ISpread> MiceOut; 183 | 184 | [Output("Children Out", Order = 25, BinOrder = 26)] 185 | public ISpread> ChildrenOut; 186 | 187 | [Output( 188 | "Behaviors Out", 189 | Visibility = PinVisibility.OnlyInspector, 190 | BinVisibility = PinVisibility.OnlyInspector, 191 | Order = 127, 192 | BinOrder = 128 193 | )] 194 | public ISpread> BehavsOut; 195 | 196 | [Output( 197 | "Parent", 198 | Visibility = PinVisibility.Hidden, 199 | BinVisibility = PinVisibility.Hidden, 200 | Order = 29, 201 | BinOrder = 30 202 | )] 203 | public ISpread> ParentOut; 204 | 205 | [Output("Prototype", Visibility = PinVisibility.Hidden, Order = 31)] 206 | public ISpread PrototypeOut; 207 | 208 | [Output("Context", Visibility = PinVisibility.OnlyInspector, Order = 132)] 209 | public ISpread ContextOut; 210 | 211 | protected void AssignElementOutputs(NotuiElement element, int i) 212 | { 213 | if (element == null) return; 214 | if (element.EnvironmentObject is VEnvironmentData venvdat) 215 | { 216 | TouchesOut[i] = venvdat.Touches; 217 | TouchesHittingOut[i] = venvdat.TouchesHitting; 218 | TouchingIntersectionsOut[i] = venvdat.TouchingIntersections; 219 | HittingTouchesOut[i] = venvdat.HittingTouches; 220 | HittingIntersectionsOut[i] = venvdat.HittingIntersections; 221 | MiceOut[i] = venvdat.Mice; 222 | ChildrenOut[i] = venvdat.Children; 223 | BehavsOut[i] = venvdat.Behaviors; 224 | ParentOut[i] = venvdat.Parent; 225 | DisplayTrOut[i] = venvdat.VDispTr; 226 | TypeOut[i] = venvdat.TypeCSharpName; 227 | } 228 | ElementOut[i] = element; 229 | NameOut[i] = element.Name; 230 | PrototypeOut[i] = element.Prototype; 231 | 232 | IdOut[i] = element.Id; 233 | HitOut[i] = element.Hit; 234 | TouchedOut[i] = element.Touched; 235 | ActiveOut[i] = element.Active; 236 | TransparentOut[i] = element.Transparent; 237 | FadeStateOut[i] = element.FadingState; 238 | ElementFadeOut[i] = element.ElementFade; 239 | AgeOut[i] = element.Age.Elapsed.TotalSeconds; 240 | DyingOut[i] = element.Dying; 241 | LocDisplayOut[i] = element.DisplayTransformation; 242 | ContextOut[i] = element.Context; 243 | } 244 | 245 | protected int _prevSliceCount = -1; 246 | 247 | public void Evaluate(int SpreadMax) 248 | { 249 | if (ElementIn.IsConnected && ElementIn.SliceCount > 0 && ElementIn[0] != null) 250 | { 251 | if (_prevSliceCount != ElementIn.SliceCount) 252 | { 253 | this.SetSliceCountForAllOutput(ElementIn.SliceCount); 254 | } 255 | _prevSliceCount = ElementIn.SliceCount; 256 | 257 | for (int i = 0; i < ElementIn.SliceCount; i++) 258 | { 259 | AssignElementOutputs(ElementIn[i], i); 260 | } 261 | } 262 | else 263 | { 264 | if(_prevSliceCount != 0) 265 | this.SetSliceCountForAllOutput(0); 266 | _prevSliceCount = 0; 267 | } 268 | } 269 | } 270 | } 271 | -------------------------------------------------------------------------------- /EventsSplit.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Forms; 2 | using Notui; 3 | using VVVV.PluginInterfaces.V2; 4 | 5 | namespace Notuiv 6 | { 7 | [PluginInfo( 8 | Name = "Events", 9 | Category = "Notui.Element", 10 | Author = "microdee" 11 | )] 12 | public class GuiElementEventsSplitNodePart : IPluginEvaluate 13 | { 14 | [Input("Element")] public Pin FElement; 15 | [Input("Previous Frame")] public ISpread FPrevFrame; 16 | 17 | [Output("On Interaction Begin", IsBang = true)] public ISpread FOnInteractionBegin; 18 | [Output("On Interaction End", IsBang = true)] public ISpread FOnInteractionEnd; 19 | [Output("On Touch Begin", IsBang = true)] public ISpread FOnTouchBegin; 20 | [Output("Touched")] public ISpread FTouched; 21 | [Output("On Touch End", IsBang = true)] public ISpread FOnTouchEnd; 22 | [Output("On Hit Begin", IsBang = true)] public ISpread FOnHitBegin; 23 | [Output("Hit")] public ISpread FHit; 24 | [Output("On Hit End", IsBang = true)] public ISpread FOnHitEnd; 25 | [Output("Interacting")] public ISpread FOnInteracting; 26 | [Output("On Children Added", IsBang = true)] public ISpread FOnChildrenUpdated; 27 | [Output("On Deletion Started", IsBang = true)] public ISpread FOnDeletionStarted; 28 | [Output("Deleting", IsBang = true)] public ISpread FOnDeleting; 29 | [Output("Faded In", IsBang = true)] public ISpread FOnFadedIn; 30 | 31 | public void Evaluate(int SpreadMax) 32 | { 33 | if (FElement.IsConnected && FElement.SliceCount > 0 && FElement[0] != null) 34 | { 35 | 36 | FOnInteractionBegin.SliceCount = 37 | FOnInteractionEnd.SliceCount = 38 | FOnTouchBegin.SliceCount = 39 | FOnTouchEnd.SliceCount = 40 | FOnHitBegin.SliceCount = 41 | FOnHitEnd.SliceCount = 42 | FOnInteracting.SliceCount = 43 | FOnChildrenUpdated.SliceCount = 44 | FOnDeleting.SliceCount = 45 | FOnDeletionStarted.SliceCount = 46 | FTouched.SliceCount = 47 | FHit.SliceCount = 48 | FOnFadedIn.SliceCount = FElement.SliceCount; 49 | 50 | for (int i = 0; i < FElement.SliceCount; i++) 51 | { 52 | var element = FElement[i]; 53 | FHit[i] = element.Hit; 54 | FTouched[i] = element.Touched; 55 | switch (element.EnvironmentObject) 56 | { 57 | case null: 58 | continue; 59 | case VEnvironmentData venvdat: 60 | if(venvdat.FlattenedEvents == null) continue; 61 | 62 | var events = FPrevFrame[0] 63 | ? venvdat.FlattenedEvents.PreviousFrame 64 | : venvdat.FlattenedEvents.CurrentFrame; 65 | 66 | FOnInteractionBegin[i] = events.OnInteractionBegin; 67 | FOnInteractionEnd[i] = events.OnInteractionEnd; 68 | FOnTouchBegin[i] = events.OnTouchBegin; 69 | FOnTouchEnd[i] = events.OnTouchEnd; 70 | FOnHitBegin[i] = events.OnHitBegin; 71 | FOnHitEnd[i] = events.OnHitEnd; 72 | FOnInteracting[i] = events.OnInteracting; 73 | FOnChildrenUpdated[i] = events.OnChildrenUpdated; 74 | FOnDeleting[i] = events.OnDeleting; 75 | FOnDeletionStarted[i] = events.OnDeletionStarted; 76 | FOnFadedIn[i] = events.OnFadedIn; 77 | break; 78 | } 79 | } 80 | } 81 | else 82 | { 83 | FOnInteractionBegin.SliceCount = 84 | FOnInteractionEnd.SliceCount = 85 | FOnTouchBegin.SliceCount = 86 | FOnTouchEnd.SliceCount = 87 | FOnHitBegin.SliceCount = 88 | FOnHitEnd.SliceCount = 89 | FOnInteracting.SliceCount = 90 | FOnChildrenUpdated.SliceCount = 91 | FOnDeleting.SliceCount = 92 | FOnDeletionStarted.SliceCount = 93 | FTouched.SliceCount = 94 | FHit.SliceCount = 95 | FOnFadedIn.SliceCount = 0; 96 | } 97 | } 98 | } 99 | 100 | [PluginInfo( 101 | Name = "MouseEvents", 102 | Category = "Notui.Element", 103 | Author = "microdee" 104 | )] 105 | public class GuiElementMouseEventsSplitNodePart : IPluginEvaluate 106 | { 107 | [Input("Element")] public Pin FElement; 108 | [Input("Previous Frame")] public ISpread FPrevFrame; 109 | 110 | [Output("Left Button")] public ISpread FLmb; 111 | [Output("Middle Button")] public ISpread FMmb; 112 | [Output("Right Button")] public ISpread FRmb; 113 | [Output("X1 Button")] public ISpread FX1mb; 114 | [Output("X2 Button")] public ISpread FX2mb; 115 | [Output("Buttons")] public ISpread FButtons; 116 | 117 | [Output("Vertical Wheel")] public ISpread FVScroll; 118 | [Output("Horizontal Wheel")] public ISpread FHScroll; 119 | 120 | public void Evaluate(int SpreadMax) 121 | { 122 | if (FElement.IsConnected) 123 | { 124 | 125 | FLmb.SliceCount = 126 | FMmb.SliceCount = 127 | FRmb.SliceCount = 128 | FX2mb.SliceCount = 129 | FButtons.SliceCount = 130 | FVScroll.SliceCount = 131 | FHScroll.SliceCount = 132 | FX1mb.SliceCount = FElement.SliceCount; 133 | 134 | for (int i = 0; i < FElement.SliceCount; i++) 135 | { 136 | var element = FElement[i]; 137 | switch (element.EnvironmentObject) 138 | { 139 | case null: 140 | continue; 141 | case VEnvironmentData venvdat: 142 | 143 | if (venvdat.FlattenedEvents == null) continue; 144 | var events = FPrevFrame[0] 145 | ? venvdat.FlattenedEvents.PreviousFrame 146 | : venvdat.FlattenedEvents.CurrentFrame; 147 | 148 | FLmb[i] = (events.MouseButtonsPressed & (uint) MouseButtons.Left) > 0; 149 | FMmb[i] = (events.MouseButtonsPressed & (uint)MouseButtons.Middle) > 0; 150 | FRmb[i] = (events.MouseButtonsPressed & (uint)MouseButtons.Right) > 0; 151 | FX1mb[i] = (events.MouseButtonsPressed & (uint)MouseButtons.XButton1) > 0; 152 | FX2mb[i] = (events.MouseButtonsPressed & (uint)MouseButtons.XButton2) > 0; 153 | FButtons[i] = events.MouseButtonsPressed; 154 | FVScroll[i] = events.VerticalWheel; 155 | FHScroll[i] = events.HorizontalWheel; 156 | break; 157 | } 158 | } 159 | } 160 | else 161 | { 162 | FLmb.SliceCount = 163 | FMmb.SliceCount = 164 | FRmb.SliceCount = 165 | FX2mb.SliceCount = 166 | FButtons.SliceCount = 167 | FVScroll.SliceCount = 168 | FHScroll.SliceCount = 169 | FX1mb.SliceCount = 0; 170 | } 171 | } 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /Filters/ContextElementFilterNode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.Composition; 4 | using System.Linq; 5 | using System.Linq.Expressions; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using md.stdl.Coding; 9 | using Notui; 10 | using VVVV.PluginInterfaces.V2; 11 | using VVVV.Utils.Reflection; 12 | 13 | namespace Notuiv.Filters 14 | { 15 | public abstract class ContextElementFilterNode : IPluginEvaluate 16 | { 17 | [Input("Context")] 18 | public Pin FContext; 19 | 20 | private int _prevContextHash = 0; 21 | private NotuiContext _prevContext; 22 | 23 | [Input("Query")] 24 | public IDiffSpread FQuery; 25 | 26 | [Output("Output")] 27 | public ISpread> FOut; 28 | 29 | protected abstract void Filter(int i); 30 | 31 | private int _elementsChanged = 0; 32 | 33 | public void Evaluate(int SpreadMax) 34 | { 35 | FOut.Stream.IsChanged = false; 36 | if (FContext.IsConnected && FContext.SliceCount > 0 && FContext[0] != null && FQuery.SliceCount > 0) 37 | { 38 | var currContextHash = FContext[0].GetHashCode(); 39 | FOut.SliceCount = FQuery.SliceCount; 40 | if (currContextHash != _prevContextHash) 41 | { 42 | if (_prevContext != null) 43 | { 44 | _prevContext.OnElementsDeleted -= HandleElementChange; 45 | _prevContext.OnElementsUpdated -= HandleElementChange; 46 | } 47 | FContext[0].OnElementsDeleted += HandleElementChange; 48 | FContext[0].OnElementsUpdated += HandleElementChange; 49 | } 50 | if(FQuery.IsChanged) HandleElementChange(this, EventArgs.Empty); 51 | _prevContext = FContext[0]; 52 | _prevContextHash = currContextHash; 53 | } 54 | else 55 | { 56 | FOut.SliceCount = 0; 57 | _prevContextHash = 0; 58 | if (_prevContext != null) 59 | { 60 | _prevContext.OnElementsDeleted -= HandleElementChange; 61 | _prevContext.OnElementsUpdated -= HandleElementChange; 62 | } 63 | _prevContext = null; 64 | } 65 | 66 | if (FContext.IsChanged && FContext.IsConnected && FContext.SliceCount > 0) 67 | { 68 | _elementsChanged = 2; 69 | } 70 | 71 | if (_elementsChanged > 0) 72 | { 73 | if(FContext.SliceCount > 0 && FContext[0] != null) 74 | { 75 | for (int i = 0; i < FQuery.SliceCount; i++) 76 | Filter(i); 77 | } 78 | FOut.Stream.IsChanged = true; 79 | _elementsChanged--; 80 | } 81 | } 82 | 83 | protected void HandleElementChange(object sender, EventArgs args) 84 | { 85 | _elementsChanged = 2; 86 | } 87 | } 88 | 89 | [PluginInfo( 90 | Name = "Sift", 91 | Category = "Notui.Context", 92 | Version = "String", 93 | Author = "microdee" 94 | )] 95 | public class StringContextElementFilterNode : ContextElementFilterNode, IPartImportsSatisfiedNotification 96 | { 97 | [Input("Query Flattened", Order = 100)] 98 | public IDiffSpread FQueryFlattened; 99 | [Input("Contains", Order = 101)] 100 | public IDiffSpread FContains; 101 | [Input("Use Name", Order = 102, DefaultBoolean = true)] 102 | public IDiffSpread FUseName; 103 | 104 | public void OnImportsSatisfied() 105 | { 106 | FQueryFlattened.Changed += spread => HandleElementChange(this, EventArgs.Empty); 107 | FContains.Changed += spread => HandleElementChange(this, EventArgs.Empty); 108 | FUseName.Changed += spread => HandleElementChange(this, EventArgs.Empty); 109 | } 110 | 111 | protected override void Filter(int i) 112 | { 113 | bool CompareType(NotuiElement el) 114 | { 115 | if (FUseName[i]) 116 | return FContains[i] ? el.Name.Contains(FQuery[i]) : el.Name == FQuery[i]; 117 | return FContains[i] ? el.Id.Contains(FQuery[i]) : el.Id == FQuery[i]; 118 | } 119 | 120 | if (string.IsNullOrWhiteSpace(FQuery[i]) || FQueryFlattened.SliceCount == 0 || FContains.SliceCount == 0 || FUseName.SliceCount == 0) 121 | FOut[i].SliceCount = 0; 122 | else 123 | { 124 | if(FOut.SliceCount == 0) return; 125 | FOut[i].AssignFrom(FQueryFlattened[i] 126 | ? FContext[0].FlatElements.Where(CompareType) 127 | : FContext[0].RootElements.Values.Where(CompareType)); 128 | } 129 | } 130 | } 131 | 132 | [PluginInfo( 133 | Name = "Sift", 134 | Category = "Notui.Context", 135 | Version = "Type", 136 | Author = "microdee" 137 | )] 138 | public class TypeContextElementFilterNode : ContextElementFilterNode, IPartImportsSatisfiedNotification 139 | { 140 | [Input("Query Flattened", Order = 100)] 141 | public IDiffSpread FQueryFlattened; 142 | [Input("Contains", Order = 101)] 143 | public IDiffSpread FContains; 144 | 145 | public void OnImportsSatisfied() 146 | { 147 | FQueryFlattened.Changed += spread => HandleElementChange(this, EventArgs.Empty); 148 | FContains.Changed += spread => HandleElementChange(this, EventArgs.Empty); 149 | } 150 | 151 | protected override void Filter(int i) 152 | { 153 | bool CompareType(NotuiElement el) 154 | { 155 | if (el.EnvironmentObject is VEnvironmentData venvdat) 156 | return FContains[i] ? venvdat.TypeCSharpName.Contains(FQuery[i]) : venvdat.TypeCSharpName == FQuery[i]; 157 | return FContains[i] ? el.GetType().GetCSharpName().Contains(FQuery[i]) : el.GetType().GetCSharpName() == FQuery[i]; 158 | } 159 | 160 | if (string.IsNullOrWhiteSpace(FQuery[i]) || FQueryFlattened.SliceCount == 0 || FContains.SliceCount == 0) 161 | FOut[i].SliceCount = 0; 162 | else 163 | { 164 | if (FOut.SliceCount == 0) return; 165 | FOut[i].AssignFrom(FQueryFlattened[i] 166 | ? FContext[0].FlatElements.Where(CompareType) 167 | : FContext[0].RootElements.Values.Where(CompareType)); 168 | } 169 | } 170 | } 171 | 172 | [PluginInfo( 173 | Name = "Sift", 174 | Category = "Notui.Context", 175 | Version = "Opaq", 176 | Author = "microdee" 177 | )] 178 | public class OpaqContextElementFilterNode : ContextElementFilterNode, IPartImportsSatisfiedNotification 179 | { 180 | [Input("Separator", Order = 100, DefaultString = "/")] 181 | public IDiffSpread FSeparator; 182 | 183 | [Input("Use Name", Order = 101, DefaultBoolean = true)] 184 | public IDiffSpread FUseName; 185 | 186 | public void OnImportsSatisfied() 187 | { 188 | FSeparator.Changed += spread => HandleElementChange(this, EventArgs.Empty); 189 | FUseName.Changed += spread => HandleElementChange(this, EventArgs.Empty); 190 | } 191 | 192 | protected override void Filter(int i) 193 | { 194 | if (string.IsNullOrWhiteSpace(FQuery[i]) || FUseName.SliceCount == 0 || FSeparator.SliceCount == 0) 195 | FOut[i].SliceCount = 0; 196 | else 197 | { 198 | if (FOut.SliceCount == 0) return; 199 | FOut[i].AssignFrom(FContext[i].Opaq(FQuery[i], FSeparator[i], FUseName[i])); 200 | } 201 | } 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /Filters/ElementFilterNode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.Composition; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using Notui; 8 | using VVVV.PluginInterfaces.V2; 9 | using VVVV.Utils.Reflection; 10 | 11 | namespace Notuiv.Filters 12 | { 13 | public abstract class ElementFilterNode : IPluginEvaluate 14 | { 15 | [Input("Element")] 16 | public Pin FElement; 17 | 18 | private Spread _prevElements = new Spread(); 19 | 20 | [Input("Query")] 21 | public IDiffSpread> FQuery; 22 | 23 | [Output("Output")] 24 | public ISpread> FOut; 25 | 26 | protected abstract void Filter(int ei, NotuiElement element, ISpread filter); 27 | 28 | private int _elementsChanged = 0; 29 | 30 | public void Evaluate(int SpreadMax) 31 | { 32 | //FOut.Stream.IsChanged = false; 33 | if (FQuery.IsChanged) HandleElementChange(this, EventArgs.Empty); 34 | if (FElement.IsConnected && FElement.SliceCount > 0 && FElement[0] != null && FQuery.SliceCount > 0) 35 | { 36 | FOut.SliceCount = FElement.SliceCount; 37 | int ii = 0; 38 | if(FElement.SliceCount != _prevElements.SliceCount) HandleElementChange(this, EventArgs.Empty); 39 | for (int i = 0; i < FElement.SliceCount; i++) 40 | { 41 | ii = i; 42 | var prevValid = i < _prevElements.SliceCount; 43 | if(FElement[i] == null) 44 | { 45 | if (prevValid && _prevElements[i] != null) 46 | { 47 | _prevElements[i].OnChildrenUpdated -= HandleElementChange; 48 | } 49 | continue; 50 | } 51 | if (!prevValid) 52 | { 53 | FElement[i].OnChildrenUpdated += HandleElementChange; 54 | continue; 55 | } 56 | 57 | if (_prevElements[i] == null || FElement[i].GetHashCode() != _prevElements[i]?.GetHashCode()) 58 | { 59 | if (_prevElements[i] != null) 60 | { 61 | _prevElements[i].OnChildrenUpdated -= HandleElementChange; 62 | } 63 | FElement[i].OnChildrenUpdated += HandleElementChange; 64 | } 65 | } 66 | 67 | if(FElement.SliceCount < _prevElements.SliceCount) 68 | { 69 | for (int i = ii; i < _prevElements.SliceCount; i++) 70 | { 71 | if (_prevElements[i] != null) 72 | { 73 | _prevElements[i].OnChildrenUpdated -= HandleElementChange; 74 | } 75 | } 76 | } 77 | _prevElements.AssignFrom(FElement); 78 | } 79 | else 80 | { 81 | FOut.SliceCount = 0; 82 | for (int i = 0; i < _prevElements.SliceCount; i++) 83 | { 84 | if (_prevElements[i] != null) 85 | { 86 | _prevElements[i].OnChildrenUpdated -= HandleElementChange; 87 | } 88 | } 89 | } 90 | 91 | if (_elementsChanged > 0) 92 | { 93 | FOut.SliceCount = FElement.SliceCount; 94 | for (int i = 0; i < FElement.SliceCount; i++) 95 | { 96 | FOut[i].SliceCount = 0; 97 | Filter(i, FElement[i], FQuery[i]); 98 | } 99 | //FOut.Stream.IsChanged = true; 100 | _elementsChanged--; 101 | } 102 | } 103 | 104 | protected void HandleElementChange(object sender, EventArgs args) 105 | { 106 | _elementsChanged = 2; 107 | } 108 | } 109 | 110 | [PluginInfo( 111 | Name = "Sift", 112 | Category = "Notui.Element", 113 | Version = "String", 114 | Author = "microdee" 115 | )] 116 | public class StringElementFilterNode : ElementFilterNode, IPartImportsSatisfiedNotification 117 | { 118 | [Input("Contains", Order = 101)] 119 | public IDiffSpread FContains; 120 | [Input("Use Name", Order = 102, DefaultBoolean = true)] 121 | public IDiffSpread FUseName; 122 | [Input("Exclude", Order = 103)] 123 | public IDiffSpread FExclude; 124 | 125 | public void OnImportsSatisfied() 126 | { 127 | FContains.Changed += spread => HandleElementChange(this, EventArgs.Empty); 128 | FUseName.Changed += spread => HandleElementChange(this, EventArgs.Empty); 129 | FExclude.Changed += spread => HandleElementChange(this, EventArgs.Empty); 130 | } 131 | 132 | protected override void Filter(int ei, NotuiElement element, ISpread filter) 133 | { 134 | bool NameCompare(NotuiElement el) 135 | { 136 | var res = false; 137 | foreach (var f in filter) 138 | { 139 | if(string.IsNullOrWhiteSpace(f)) continue; 140 | res = FContains[ei] 141 | ? el.Name.Contains(f) 142 | : el.Name.Equals(f, StringComparison.InvariantCulture); 143 | 144 | if (!res) continue; 145 | break; 146 | } 147 | return FExclude[ei] ? !res : res; 148 | }; 149 | bool IdCompare(NotuiElement el) 150 | { 151 | var res = false; 152 | foreach (var f in filter) 153 | { 154 | if (string.IsNullOrWhiteSpace(f)) continue; 155 | res = FContains[ei] 156 | ? el.Id.Contains(f) 157 | : el.Id.Equals(f, StringComparison.InvariantCulture); 158 | 159 | if (!res) continue; 160 | break; 161 | } 162 | return FExclude[ei] ? !res : res; 163 | }; 164 | 165 | if (FContains.SliceCount == 0 || FUseName.SliceCount == 0 || FExclude.SliceCount == 0) 166 | return; 167 | else 168 | { 169 | if (FOut.SliceCount == 0) return; 170 | FOut[ei].AddRange(FUseName[ei] 171 | ? element.Children.Values.Where(NameCompare) 172 | : element.Children.Values.Where(IdCompare)); 173 | } 174 | } 175 | } 176 | 177 | [PluginInfo( 178 | Name = "Sift", 179 | Category = "Notui.Element", 180 | Version = "Type", 181 | Author = "microdee" 182 | )] 183 | public class TypeElementFilterNode : ElementFilterNode, IPartImportsSatisfiedNotification 184 | { 185 | [Input("Contains", Order = 101)] 186 | public IDiffSpread FContains; 187 | [Input("Exclude", Order = 103)] 188 | public IDiffSpread FExclude; 189 | 190 | public void OnImportsSatisfied() 191 | { 192 | FContains.Changed += spread => HandleElementChange(this, EventArgs.Empty); 193 | FExclude.Changed += spread => HandleElementChange(this, EventArgs.Empty); 194 | } 195 | 196 | protected override void Filter(int ei, NotuiElement element, ISpread filter) 197 | { 198 | bool CompareType(NotuiElement el) 199 | { 200 | var res = false; 201 | foreach (var f in filter) 202 | { 203 | if (string.IsNullOrWhiteSpace(f)) continue; 204 | if (el.EnvironmentObject is VEnvironmentData venvdat) 205 | res = FContains[ei] ? venvdat.TypeCSharpName.Contains(f) : venvdat.TypeCSharpName == f; 206 | else 207 | { 208 | res = FContains[ei] 209 | ? el.GetType().GetCSharpName().Contains(f) 210 | : el.GetType().GetCSharpName() == f; 211 | } 212 | 213 | if (!res) continue; 214 | break; 215 | } 216 | return FExclude[ei] ? !res : res; 217 | }; 218 | 219 | if (FContains.SliceCount == 0 || FExclude.SliceCount == 0) 220 | return; 221 | else 222 | { 223 | if (FOut.SliceCount == 0) return; 224 | FOut[ei].AddRange(element.Children.Values.Where(CompareType)); 225 | } 226 | } 227 | } 228 | 229 | [PluginInfo( 230 | Name = "Sift", 231 | Category = "Notui.Element", 232 | Version = "Opaq", 233 | Author = "microdee" 234 | )] 235 | public class OpaqElementFilterNode : ElementFilterNode, IPartImportsSatisfiedNotification 236 | { 237 | [Input("Separator", Order = 100, DefaultString = "/")] 238 | public IDiffSpread FSeparator; 239 | 240 | [Input("Use Name", Order = 101, DefaultBoolean = true)] 241 | public IDiffSpread FUseName; 242 | 243 | public void OnImportsSatisfied() 244 | { 245 | FSeparator.Changed += spread => HandleElementChange(this, EventArgs.Empty); 246 | FUseName.Changed += spread => HandleElementChange(this, EventArgs.Empty); 247 | } 248 | 249 | protected override void Filter(int ei, NotuiElement element, ISpread filter) 250 | { 251 | if(FUseName.SliceCount == 0 || FSeparator.SliceCount == 0) return; 252 | foreach (var f in filter) 253 | { 254 | if (string.IsNullOrWhiteSpace(f)) continue; 255 | if (FOut.SliceCount == 0) return; 256 | FOut[ei].AddRange(element.Opaq(f, FSeparator[ei], FUseName[ei])); 257 | } 258 | } 259 | } 260 | } 261 | -------------------------------------------------------------------------------- /Generic/GenericAuxiliaryObjectNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Notui; 7 | using VVVV.Nodes.Generic; 8 | using VVVV.PluginInterfaces.V2; 9 | using VVVV.Utils.Streams; 10 | 11 | namespace Notuiv.Generic 12 | { 13 | [PluginInfo(Name = "Cons", 14 | Category = "Notui.Auxiliary", 15 | Help = "Concatenates all Input spreads.", 16 | Tags = "generic, spreadop" 17 | )] 18 | public class AuxiliaryObjectConsNode : Cons { } 19 | 20 | [PluginInfo(Name = "CAR", 21 | Category = "Notui.Auxiliary", 22 | Version = "Bin", 23 | Help = "Splits a given spread into first slice and remainder.", 24 | Tags = "split, generic, spreadop", 25 | Author = "woei" 26 | )] 27 | public class AuxiliaryObjectCARBinNode : CARBin { } 28 | 29 | [PluginInfo(Name = "CDR", 30 | Category = "Notui.Auxiliary", 31 | Version = "Bin", 32 | Help = "Splits a given spread into remainder and last slice.", 33 | Tags = "split, generic, spreadop", 34 | Author = "woei" 35 | )] 36 | public class AuxiliaryObjectCDRBinNode : CDRBin { } 37 | 38 | [PluginInfo(Name = "Reverse", 39 | Category = "Notui.Auxiliary", 40 | Version = "Bin", 41 | Help = "Reverses the order of the slices in the Spread.", 42 | Tags = "invert, generic, spreadop", 43 | Author = "woei" 44 | )] 45 | public class AuxiliaryObjectReverseBinNode : ReverseBin { } 46 | 47 | [PluginInfo(Name = "Shift", 48 | Category = "Notui.Auxiliary", 49 | Version = "Bin", 50 | Help = "Shifts the slices in the Spread by the given Phase.", 51 | Tags = "generic, spreadop", 52 | Author = "woei" 53 | )] 54 | public class AuxiliaryObjectShiftBinNode : ShiftBin { } 55 | 56 | [PluginInfo(Name = "SetSlice", 57 | Category = "Notui.Auxiliary", 58 | Version = "Bin", 59 | Help = "Replaces individual slices of a spread with the given input", 60 | Tags = "generic, spreadop", 61 | Author = "woei" 62 | )] 63 | public class AuxiliaryObjectSetSliceNode : SetSlice { } 64 | 65 | [PluginInfo(Name = "DeleteSlice", 66 | Category = "Notui.Auxiliary", 67 | Help = "Removes slices from the Spread at the positions addressed by the Index pin.", 68 | Tags = "remove, generic, spreadop", 69 | Author = "woei" 70 | )] 71 | public class AuxiliaryObjectDeleteSliceNode : DeleteSlice { } 72 | 73 | [PluginInfo(Name = "Select", 74 | Category = "Notui.Auxiliary", 75 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 76 | Tags = "repeat, resample, duplicate, spreadop" 77 | )] 78 | public class AuxiliaryObjectSelectNode : Select { } 79 | 80 | [PluginInfo(Name = "Select", 81 | Category = "Notui.Auxiliary", 82 | Version = "Bin", 83 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 84 | Tags = "repeat, resample, duplicate, spreadop", 85 | Author = "woei" 86 | )] 87 | public class AuxiliaryObjectSelectBinNode : SelectBin { } 88 | 89 | [PluginInfo(Name = "Unzip", 90 | Category = "Notui.Auxiliary", 91 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it.", 92 | Tags = "split, generic, spreadop" 93 | )] 94 | public class AuxiliaryObjectUnzipNode : Unzip { } 95 | 96 | [PluginInfo(Name = "Unzip", 97 | Category = "Notui.Auxiliary", 98 | Version = "Bin", 99 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it. With Bin Size.", 100 | Tags = "split, generic, spreadop" 101 | )] 102 | public class AuxiliaryObjectUnzipBinNode : Unzip> { } 103 | 104 | [PluginInfo(Name = "Zip", 105 | Category = "Notui.Auxiliary", 106 | Help = "Interleaves all Input spreads.", 107 | Tags = "interleave, join, generic, spreadop" 108 | )] 109 | public class AuxiliaryObjectZipNode : Zip { } 110 | 111 | [PluginInfo(Name = "Zip", 112 | Category = "Notui.Auxiliary", 113 | Version = "Bin", 114 | Help = "Interleaves all Input spreads.", 115 | Tags = "interleave, join, generic, spreadop" 116 | )] 117 | public class AuxiliaryObjectZipBinNode : Zip> { } 118 | 119 | [PluginInfo(Name = "GetSpread", 120 | Category = "Notui.Auxiliary", 121 | Version = "Bin", 122 | Help = "Returns sub-spreads from the input specified via offset and count", 123 | Tags = "generic, spreadop", 124 | Author = "woei")] 125 | public class AuxiliaryObjectGetSpreadNode : GetSpreadAdvanced { } 126 | 127 | [PluginInfo(Name = "SetSpread", 128 | Category = "Notui.Auxiliary", 129 | Version = "Bin", 130 | Help = "Allows to set sub-spreads into a given spread.", 131 | Tags = "generic, spreadop", 132 | Author = "woei" 133 | )] 134 | public class AuxiliaryObjectSetSpreadNode : SetSpread { } 135 | 136 | [PluginInfo(Name = "SplitAt", 137 | Category = "Notui.Auxiliary", 138 | Help = "Splits the Input spread in two at the specified Index.", 139 | Tags = "generic, spreadop" 140 | )] 141 | public class AuxiliaryObjectSplitAtNode : SplitAtNode { } 142 | } 143 | -------------------------------------------------------------------------------- /Generic/GenericBehaviorNodes.cs: -------------------------------------------------------------------------------- 1 | using Notui; 2 | using VVVV.Nodes.Generic; 3 | using VVVV.PluginInterfaces.V2; 4 | using VVVV.Utils.Streams; 5 | 6 | namespace Notuiv.Generic 7 | { 8 | #region SingleValue 9 | 10 | [PluginInfo(Name = "Cast", 11 | Category = "Notui.Behavior", 12 | Help = "Casts any type to a type of this category, so be sure the input is of the required type", 13 | Tags = "convert, as, generic" 14 | )] 15 | public class InteractionBehaviorCastNode : Cons { } 16 | 17 | #endregion SingleValue 18 | 19 | #region SpreadOps 20 | 21 | [PluginInfo(Name = "Cons", 22 | Category = "Notui.Behavior", 23 | Help = "Concatenates all Input spreads.", 24 | Tags = "generic, spreadop" 25 | )] 26 | public class InteractionBehaviorConsNode : Cons { } 27 | 28 | [PluginInfo(Name = "CAR", 29 | Category = "Notui.Behavior", 30 | Version = "Bin", 31 | Help = "Splits a given spread into first slice and remainder.", 32 | Tags = "split, generic, spreadop", 33 | Author = "woei" 34 | )] 35 | public class InteractionBehaviorCARBinNode : CARBin { } 36 | 37 | [PluginInfo(Name = "CDR", 38 | Category = "Notui.Behavior", 39 | Version = "Bin", 40 | Help = "Splits a given spread into remainder and last slice.", 41 | Tags = "split, generic, spreadop", 42 | Author = "woei" 43 | )] 44 | public class InteractionBehaviorCDRBinNode : CDRBin { } 45 | 46 | [PluginInfo(Name = "Reverse", 47 | Category = "Notui.Behavior", 48 | Version = "Bin", 49 | Help = "Reverses the order of the slices in the Spread.", 50 | Tags = "invert, generic, spreadop", 51 | Author = "woei" 52 | )] 53 | public class InteractionBehaviorReverseBinNode : ReverseBin { } 54 | 55 | [PluginInfo(Name = "Shift", 56 | Category = "Notui.Behavior", 57 | Version = "Bin", 58 | Help = "Shifts the slices in the Spread by the given Phase.", 59 | Tags = "generic, spreadop", 60 | Author = "woei" 61 | )] 62 | public class InteractionBehaviorShiftBinNode : ShiftBin { } 63 | 64 | [PluginInfo(Name = "SetSlice", 65 | Category = "Notui.Behavior", 66 | Version = "Bin", 67 | Help = "Replaces individual slices of a spread with the given input", 68 | Tags = "generic, spreadop", 69 | Author = "woei" 70 | )] 71 | public class InteractionBehaviorSetSliceNode : SetSlice { } 72 | 73 | [PluginInfo(Name = "DeleteSlice", 74 | Category = "Notui.Behavior", 75 | Help = "Removes slices from the Spread at the positions addressed by the Index pin.", 76 | Tags = "remove, generic, spreadop", 77 | Author = "woei" 78 | )] 79 | public class InteractionBehaviorDeleteSliceNode : DeleteSlice { } 80 | 81 | [PluginInfo(Name = "Select", 82 | Category = "Notui.Behavior", 83 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 84 | Tags = "repeat, resample, duplicate, spreadop" 85 | )] 86 | public class InteractionBehaviorSelectNode : Select { } 87 | 88 | [PluginInfo(Name = "Select", 89 | Category = "Notui.Behavior", 90 | Version = "Bin", 91 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 92 | Tags = "repeat, resample, duplicate, spreadop", 93 | Author = "woei" 94 | )] 95 | public class InteractionBehaviorSelectBinNode : SelectBin { } 96 | 97 | [PluginInfo(Name = "Unzip", 98 | Category = "Notui.Behavior", 99 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it.", 100 | Tags = "split, generic, spreadop" 101 | )] 102 | public class InteractionBehaviorUnzipNode : Unzip { } 103 | 104 | [PluginInfo(Name = "Unzip", 105 | Category = "Notui.Behavior", 106 | Version = "Bin", 107 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it. With Bin Size.", 108 | Tags = "split, generic, spreadop" 109 | )] 110 | public class InteractionBehaviorUnzipBinNode : Unzip> { } 111 | 112 | [PluginInfo(Name = "Zip", 113 | Category = "Notui.Behavior", 114 | Help = "Interleaves all Input spreads.", 115 | Tags = "interleave, join, generic, spreadop" 116 | )] 117 | public class InteractionBehaviorZipNode : Zip { } 118 | 119 | [PluginInfo(Name = "Zip", 120 | Category = "Notui.Behavior", 121 | Version = "Bin", 122 | Help = "Interleaves all Input spreads.", 123 | Tags = "interleave, join, generic, spreadop" 124 | )] 125 | public class InteractionBehaviorZipBinNode : Zip> { } 126 | 127 | [PluginInfo(Name = "GetSpread", 128 | Category = "Notui.Behavior", 129 | Version = "Bin", 130 | Help = "Returns sub-spreads from the input specified via offset and count", 131 | Tags = "generic, spreadop", 132 | Author = "woei")] 133 | public class InteractionBehaviorGetSpreadNode : GetSpreadAdvanced { } 134 | 135 | [PluginInfo(Name = "SetSpread", 136 | Category = "Notui.Behavior", 137 | Version = "Bin", 138 | Help = "Allows to set sub-spreads into a given spread.", 139 | Tags = "generic, spreadop", 140 | Author = "woei" 141 | )] 142 | public class InteractionBehaviorSetSpreadNode : SetSpread { } 143 | 144 | [PluginInfo(Name = "SplitAt", 145 | Category = "Notui.Behavior", 146 | Help = "Splits the Input spread in two at the specified Index.", 147 | Tags = "generic, spreadop" 148 | )] 149 | public class InteractionBehaviorSplitAtNode : SplitAtNode { } 150 | 151 | #endregion SpreadOps 152 | 153 | #region Collections 154 | /* 155 | public class BehaviorCopier : Copier 156 | { 157 | public override InteractionBehavior Copy(InteractionBehavior value) 158 | { 159 | return value.Copy(); 160 | } 161 | } 162 | 163 | [PluginInfo(Name = "Buffer", 164 | Category = "Notui.Behavior", 165 | Help = "Inserts the input at the given index.", 166 | Tags = "generic, spreadop, collection", 167 | AutoEvaluate = true 168 | )] 169 | public class InteractionBehaviorBufferNode : BufferNode 170 | { 171 | public InteractionBehaviorBufferNode() : base(new BehaviorCopier()) { } 172 | } 173 | 174 | [PluginInfo(Name = "Queue", 175 | Category = "Notui.Behavior", 176 | Help = "Inserts the input at index 0 and drops the oldest slice in a FIFO (First In First Out) fashion.", 177 | Tags = "generic, spreadop, collection", 178 | AutoEvaluate = true 179 | )] 180 | public class InteractionBehaviorQueueNode : QueueNode 181 | { 182 | public InteractionBehaviorQueueNode() : base(new BehaviorCopier()) { } 183 | } 184 | 185 | [PluginInfo(Name = "RingBuffer", 186 | Category = "Notui.Behavior", 187 | Help = "Inserts the input at the ringbuffer position.", 188 | Tags = "generic, spreadop, collection", 189 | AutoEvaluate = true 190 | )] 191 | public class InteractionBehaviorRingBufferNode : RingBufferNode 192 | { 193 | public InteractionBehaviorRingBufferNode() : base(new BehaviorCopier()) { } 194 | } 195 | 196 | [PluginInfo(Name = "Store", 197 | Category = "Notui.Behavior", 198 | Help = "Stores a spread and sets/removes/inserts slices.", 199 | Tags = "add, insert, remove, generic, spreadop, collection", 200 | Author = "woei", 201 | AutoEvaluate = true 202 | )] 203 | public class InteractionBehaviorStoreNode : Store { } 204 | 205 | [PluginInfo(Name = "Stack", 206 | Category = "Notui.Behavior", 207 | Help = "Stack data structure implementation using the LIFO (Last In First Out) paradigm.", 208 | Tags = "generic, spreadop, collection", 209 | Author = "vux" 210 | )] 211 | public class InteractionBehaviorStackNode : StackNode { } 212 | 213 | [PluginInfo( 214 | Name = "QueueStore", 215 | Category = "Notui.Behavior", 216 | Help = "Stores a series of queues", 217 | Tags = "append, remove, generic, spreadop, collection", 218 | Author = "motzi" 219 | )] 220 | public class InteractionBehaviorQueueStoreNodes : QueueStore 221 | { 222 | public InteractionBehaviorQueueStoreNodes() : base(new BehaviorCopier()) { } 223 | } 224 | */ 225 | #endregion Collections 226 | 227 | } 228 | 229 | -------------------------------------------------------------------------------- /Generic/GenericContextSpreadNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Notui; 7 | using VVVV.Nodes.Generic; 8 | using VVVV.PluginInterfaces.V2; 9 | using VVVV.Utils.Streams; 10 | 11 | namespace Notuiv.Generic 12 | { 13 | [PluginInfo(Name = "Cons", 14 | Category = "Notui.Context", 15 | Help = "Concatenates all Input spreads.", 16 | Tags = "generic, spreadop" 17 | )] 18 | public class NotuiContextConsNode : Cons { } 19 | 20 | [PluginInfo(Name = "CAR", 21 | Category = "Notui.Context", 22 | Version = "Bin", 23 | Help = "Splits a given spread into first slice and remainder.", 24 | Tags = "split, generic, spreadop", 25 | Author = "woei" 26 | )] 27 | public class NotuiContextCARBinNode : CARBin { } 28 | 29 | [PluginInfo(Name = "CDR", 30 | Category = "Notui.Context", 31 | Version = "Bin", 32 | Help = "Splits a given spread into remainder and last slice.", 33 | Tags = "split, generic, spreadop", 34 | Author = "woei" 35 | )] 36 | public class NotuiContextCDRBinNode : CDRBin { } 37 | 38 | [PluginInfo(Name = "Reverse", 39 | Category = "Notui.Context", 40 | Version = "Bin", 41 | Help = "Reverses the order of the slices in the Spread.", 42 | Tags = "invert, generic, spreadop", 43 | Author = "woei" 44 | )] 45 | public class NotuiContextReverseBinNode : ReverseBin { } 46 | 47 | [PluginInfo(Name = "Select", 48 | Category = "Notui.Context", 49 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 50 | Tags = "repeat, resample, duplicate, spreadop" 51 | )] 52 | public class NotuiContextSelectNode : Select { } 53 | 54 | [PluginInfo(Name = "Select", 55 | Category = "Notui.Context", 56 | Version = "Bin", 57 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 58 | Tags = "repeat, resample, duplicate, spreadop", 59 | Author = "woei" 60 | )] 61 | public class NotuiContextSelectBinNode : SelectBin { } 62 | 63 | [PluginInfo(Name = "Unzip", 64 | Category = "Notui.Context", 65 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it.", 66 | Tags = "split, generic, spreadop" 67 | )] 68 | public class NotuiContextUnzipNode : Unzip { } 69 | 70 | [PluginInfo(Name = "Unzip", 71 | Category = "Notui.Context", 72 | Version = "Bin", 73 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it. With Bin Size.", 74 | Tags = "split, generic, spreadop" 75 | )] 76 | public class NotuiContextUnzipBinNode : Unzip> { } 77 | 78 | [PluginInfo(Name = "Zip", 79 | Category = "Notui.Context", 80 | Help = "Interleaves all Input spreads.", 81 | Tags = "interleave, join, generic, spreadop" 82 | )] 83 | public class NotuiContextZipNode : Zip { } 84 | 85 | [PluginInfo(Name = "Zip", 86 | Category = "Notui.Context", 87 | Version = "Bin", 88 | Help = "Interleaves all Input spreads.", 89 | Tags = "interleave, join, generic, spreadop" 90 | )] 91 | public class NotuiContextZipBinNode : Zip> { } 92 | 93 | [PluginInfo(Name = "GetSpread", 94 | Category = "Notui.Context", 95 | Version = "Bin", 96 | Help = "Returns sub-spreads from the input specified via offset and count", 97 | Tags = "generic, spreadop", 98 | Author = "woei")] 99 | public class NotuiContextGetSpreadNode : GetSpreadAdvanced { } 100 | } 101 | -------------------------------------------------------------------------------- /Generic/GenericElementInstanceNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Notui; 3 | using VVVV.Nodes.Generic; 4 | using VVVV.PluginInterfaces.V2; 5 | using VVVV.Utils.Streams; 6 | 7 | namespace Notuiv.Generic 8 | { 9 | #region SingleValue 10 | 11 | [PluginInfo(Name = "Cast", 12 | Category = "Notui.Element", 13 | Help = "Casts any type to a type of this category, so be sure the input is of the required type", 14 | Tags = "convert, as, generic" 15 | )] 16 | public class NotuiElementCastNode : Cons { } 17 | 18 | #endregion SingleValue 19 | 20 | #region SpreadOps 21 | 22 | [PluginInfo(Name = "Cons", 23 | Category = "Notui.Element", 24 | Help = "Concatenates all Input spreads.", 25 | Tags = "generic, spreadop" 26 | )] 27 | public class NotuiElementConsNode : Cons { } 28 | 29 | [PluginInfo(Name = "CAR", 30 | Category = "Notui.Element", 31 | Version = "Bin", 32 | Help = "Splits a given spread into first slice and remainder.", 33 | Tags = "split, generic, spreadop", 34 | Author = "woei" 35 | )] 36 | public class NotuiElementCARBinNode : CARBin { } 37 | 38 | [PluginInfo(Name = "CDR", 39 | Category = "Notui.Element", 40 | Version = "Bin", 41 | Help = "Splits a given spread into remainder and last slice.", 42 | Tags = "split, generic, spreadop", 43 | Author = "woei" 44 | )] 45 | public class NotuiElementCDRBinNode : CDRBin { } 46 | 47 | [PluginInfo(Name = "Reverse", 48 | Category = "Notui.Element", 49 | Version = "Bin", 50 | Help = "Reverses the order of the slices in the Spread.", 51 | Tags = "invert, generic, spreadop", 52 | Author = "woei" 53 | )] 54 | public class NotuiElementReverseBinNode : ReverseBin { } 55 | 56 | [PluginInfo(Name = "Shift", 57 | Category = "Notui.Element", 58 | Version = "Bin", 59 | Help = "Shifts the slices in the Spread by the given Phase.", 60 | Tags = "generic, spreadop", 61 | Author = "woei" 62 | )] 63 | public class NotuiElementShiftBinNode : ShiftBin { } 64 | 65 | [PluginInfo(Name = "SetSlice", 66 | Category = "Notui.Element", 67 | Version = "Bin", 68 | Help = "Replaces individual slices of a spread with the given input", 69 | Tags = "generic, spreadop", 70 | Author = "woei" 71 | )] 72 | public class NotuiElementSetSliceNode : SetSlice { } 73 | 74 | [PluginInfo(Name = "DeleteSlice", 75 | Category = "Notui.Element", 76 | Help = "Removes slices from the Spread at the positions addressed by the Index pin.", 77 | Tags = "remove, generic, spreadop", 78 | Author = "woei" 79 | )] 80 | public class NotuiElementDeleteSliceNode : DeleteSlice { } 81 | 82 | [PluginInfo(Name = "Select", 83 | Category = "Notui.Element", 84 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 85 | Tags = "repeat, resample, duplicate, spreadop" 86 | )] 87 | public class NotuiElementSelectNode : Select { } 88 | 89 | [PluginInfo(Name = "Select", 90 | Category = "Notui.Element", 91 | Version = "Bin", 92 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 93 | Tags = "repeat, resample, duplicate, spreadop", 94 | Author = "woei" 95 | )] 96 | public class NotuiElementSelectBinNode : SelectBin { } 97 | 98 | [PluginInfo(Name = "Unzip", 99 | Category = "Notui.Element", 100 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it.", 101 | Tags = "split, generic, spreadop" 102 | )] 103 | public class NotuiElementUnzipNode : Unzip { } 104 | 105 | [PluginInfo(Name = "Unzip", 106 | Category = "Notui.Element", 107 | Version = "Bin", 108 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it. With Bin Size.", 109 | Tags = "split, generic, spreadop" 110 | )] 111 | public class NotuiElementUnzipBinNode : Unzip> { } 112 | 113 | [PluginInfo(Name = "Zip", 114 | Category = "Notui.Element", 115 | Help = "Interleaves all Input spreads.", 116 | Tags = "interleave, join, generic, spreadop" 117 | )] 118 | public class NotuiElementZipNode : Zip { } 119 | 120 | [PluginInfo(Name = "Zip", 121 | Category = "Notui.Element", 122 | Version = "Bin", 123 | Help = "Interleaves all Input spreads.", 124 | Tags = "interleave, join, generic, spreadop" 125 | )] 126 | public class NotuiElementZipBinNode : Zip> { } 127 | 128 | [PluginInfo(Name = "GetSpread", 129 | Category = "Notui.Element", 130 | Version = "Bin", 131 | Help = "Returns sub-spreads from the input specified via offset and count", 132 | Tags = "generic, spreadop", 133 | Author = "woei")] 134 | public class NotuiElementGetSpreadNode : GetSpreadAdvanced { } 135 | 136 | [PluginInfo(Name = "SetSpread", 137 | Category = "Notui.Element", 138 | Version = "Bin", 139 | Help = "Allows to set sub-spreads into a given spread.", 140 | Tags = "generic, spreadop", 141 | Author = "woei" 142 | )] 143 | public class NotuiElementSetSpreadNode : SetSpread { } 144 | 145 | [PluginInfo(Name = "Pairwise", 146 | Category = "Notui.Element", 147 | Help = "Returns all combinations of pairs of successive slices. From an input ABCD returns AB, BC, CD.", 148 | Tags = "generic, spreadop" 149 | )] 150 | public class NotuiElementPairwiseNode : Pairwise { } 151 | 152 | [PluginInfo(Name = "SplitAt", 153 | Category = "Notui.Element", 154 | Help = "Splits the Input spread in two at the specified Index.", 155 | Tags = "generic, spreadop" 156 | )] 157 | public class NotuiElementSplitAtNode : SplitAtNode { } 158 | 159 | #endregion SpreadOps 160 | } 161 | 162 | -------------------------------------------------------------------------------- /Generic/GenericElementPrototypeNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Notui; 3 | using VVVV.Nodes.Generic; 4 | using VVVV.PluginInterfaces.V2; 5 | using VVVV.Utils.Streams; 6 | 7 | namespace Notuiv.Generic 8 | { 9 | #region SingleValue 10 | 11 | [PluginInfo(Name = "Cast", 12 | Category = "Notui.ElementPrototype", 13 | Help = "Casts any type to a type of this category, so be sure the input is of the required type", 14 | Tags = "convert, as, generic" 15 | )] 16 | public class ElementPrototypeCastNode : Cons { } 17 | 18 | #endregion SingleValue 19 | 20 | #region SpreadOps 21 | 22 | [PluginInfo(Name = "Cons", 23 | Category = "Notui.ElementPrototype", 24 | Help = "Concatenates all Input spreads.", 25 | Tags = "generic, spreadop" 26 | )] 27 | public class ElementPrototypeConsNode : Cons { } 28 | 29 | [PluginInfo(Name = "CAR", 30 | Category = "Notui.ElementPrototype", 31 | Version = "Bin", 32 | Help = "Splits a given spread into first slice and remainder.", 33 | Tags = "split, generic, spreadop", 34 | Author = "woei" 35 | )] 36 | public class ElementPrototypeCARBinNode : CARBin { } 37 | 38 | [PluginInfo(Name = "CDR", 39 | Category = "Notui.ElementPrototype", 40 | Version = "Bin", 41 | Help = "Splits a given spread into remainder and last slice.", 42 | Tags = "split, generic, spreadop", 43 | Author = "woei" 44 | )] 45 | public class ElementPrototypeCDRBinNode : CDRBin { } 46 | 47 | [PluginInfo(Name = "Reverse", 48 | Category = "Notui.ElementPrototype", 49 | Version = "Bin", 50 | Help = "Reverses the order of the slices in the Spread.", 51 | Tags = "invert, generic, spreadop", 52 | Author = "woei" 53 | )] 54 | public class ElementPrototypeReverseBinNode : ReverseBin { } 55 | 56 | [PluginInfo(Name = "Shift", 57 | Category = "Notui.ElementPrototype", 58 | Version = "Bin", 59 | Help = "Shifts the slices in the Spread by the given Phase.", 60 | Tags = "generic, spreadop", 61 | Author = "woei" 62 | )] 63 | public class ElementPrototypeShiftBinNode : ShiftBin { } 64 | 65 | [PluginInfo(Name = "SetSlice", 66 | Category = "Notui.ElementPrototype", 67 | Version = "Bin", 68 | Help = "Replaces individual slices of a spread with the given input", 69 | Tags = "generic, spreadop", 70 | Author = "woei" 71 | )] 72 | public class ElementPrototypeSetSliceNode : SetSlice { } 73 | 74 | [PluginInfo(Name = "DeleteSlice", 75 | Category = "Notui.ElementPrototype", 76 | Help = "Removes slices from the Spread at the positions addressed by the Index pin.", 77 | Tags = "remove, generic, spreadop", 78 | Author = "woei" 79 | )] 80 | public class ElementPrototypeDeleteSliceNode : DeleteSlice { } 81 | 82 | [PluginInfo(Name = "Select", 83 | Category = "Notui.ElementPrototype", 84 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 85 | Tags = "repeat, resample, duplicate, spreadop" 86 | )] 87 | public class ElementPrototypeSelectNode : Select { } 88 | 89 | [PluginInfo(Name = "Select", 90 | Category = "Notui.ElementPrototype", 91 | Version = "Bin", 92 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 93 | Tags = "repeat, resample, duplicate, spreadop", 94 | Author = "woei" 95 | )] 96 | public class ElementPrototypeSelectBinNode : SelectBin { } 97 | 98 | [PluginInfo(Name = "Unzip", 99 | Category = "Notui.ElementPrototype", 100 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it.", 101 | Tags = "split, generic, spreadop" 102 | )] 103 | public class ElementPrototypeUnzipNode : Unzip { } 104 | 105 | [PluginInfo(Name = "Unzip", 106 | Category = "Notui.ElementPrototype", 107 | Version = "Bin", 108 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it. With Bin Size.", 109 | Tags = "split, generic, spreadop" 110 | )] 111 | public class ElementPrototypeUnzipBinNode : Unzip> { } 112 | 113 | [PluginInfo(Name = "Zip", 114 | Category = "Notui.ElementPrototype", 115 | Help = "Interleaves all Input spreads.", 116 | Tags = "interleave, join, generic, spreadop" 117 | )] 118 | public class ElementPrototypeZipNode : Zip { } 119 | 120 | [PluginInfo(Name = "Zip", 121 | Category = "Notui.ElementPrototype", 122 | Version = "Bin", 123 | Help = "Interleaves all Input spreads.", 124 | Tags = "interleave, join, generic, spreadop" 125 | )] 126 | public class ElementPrototypeZipBinNode : Zip> { } 127 | 128 | [PluginInfo(Name = "GetSpread", 129 | Category = "Notui.ElementPrototype", 130 | Version = "Bin", 131 | Help = "Returns sub-spreads from the input specified via offset and count", 132 | Tags = "generic, spreadop", 133 | Author = "woei")] 134 | public class ElementPrototypeGetSpreadNode : GetSpreadAdvanced { } 135 | 136 | [PluginInfo(Name = "SetSpread", 137 | Category = "Notui.ElementPrototype", 138 | Version = "Bin", 139 | Help = "Allows to set sub-spreads into a given spread.", 140 | Tags = "generic, spreadop", 141 | Author = "woei" 142 | )] 143 | public class ElementPrototypeSetSpreadNode : SetSpread { } 144 | 145 | [PluginInfo(Name = "Pairwise", 146 | Category = "Notui.ElementPrototype", 147 | Help = "Returns all combinations of pairs of successive slices. From an input ABCD returns AB, BC, CD.", 148 | Tags = "generic, spreadop" 149 | )] 150 | public class ElementPrototypePairwiseNode : Pairwise { } 151 | 152 | [PluginInfo(Name = "SplitAt", 153 | Category = "Notui.ElementPrototype", 154 | Help = "Splits the Input spread in two at the specified Index.", 155 | Tags = "generic, spreadop" 156 | )] 157 | public class ElementPrototypeSplitAtNode : SplitAtNode { } 158 | 159 | #endregion SpreadOps 160 | 161 | #region Collections 162 | 163 | public class ElementCopier : Copier 164 | { 165 | public override ElementPrototype Copy(ElementPrototype value) 166 | { 167 | var res = value.Copy(); 168 | res.Id = Guid.NewGuid().ToString(); 169 | return res; 170 | } 171 | } 172 | 173 | [PluginInfo(Name = "Buffer", 174 | Category = "Notui.ElementPrototype", 175 | Help = "Inserts the input at the given index.", 176 | Tags = "generic, spreadop, collection", 177 | AutoEvaluate = true 178 | )] 179 | public class ElementPrototypeBufferNode : BufferNode 180 | { 181 | public ElementPrototypeBufferNode() : base(new ElementCopier()) { } 182 | } 183 | 184 | [PluginInfo(Name = "Queue", 185 | Category = "Notui.ElementPrototype", 186 | Help = "Inserts the input at index 0 and drops the oldest slice in a FIFO (First In First Out) fashion.", 187 | Tags = "generic, spreadop, collection", 188 | AutoEvaluate = true 189 | )] 190 | public class ElementPrototypeQueueNode : QueueNode 191 | { 192 | public ElementPrototypeQueueNode() : base(new ElementCopier()) { } 193 | } 194 | 195 | [PluginInfo(Name = "RingBuffer", 196 | Category = "Notui.ElementPrototype", 197 | Help = "Inserts the input at the ringbuffer position.", 198 | Tags = "generic, spreadop, collection", 199 | AutoEvaluate = true 200 | )] 201 | public class ElementPrototypeRingBufferNode : RingBufferNode 202 | { 203 | public ElementPrototypeRingBufferNode() : base(new ElementCopier()) { } 204 | } 205 | 206 | [PluginInfo(Name = "Store", 207 | Category = "Notui.ElementPrototype", 208 | Help = "Stores a spread and sets/removes/inserts slices.", 209 | Tags = "add, insert, remove, generic, spreadop, collection", 210 | Author = "woei", 211 | AutoEvaluate = true 212 | )] 213 | public class ElementPrototypeStoreNode : Store { } 214 | 215 | [PluginInfo(Name = "Stack", 216 | Category = "Notui.ElementPrototype", 217 | Help = "Stack data structure implementation using the LIFO (Last In First Out) paradigm.", 218 | Tags = "generic, spreadop, collection", 219 | Author = "vux" 220 | )] 221 | public class ElementPrototypeStackNode : StackNode { } 222 | 223 | [PluginInfo( 224 | Name = "QueueStore", 225 | Category = "Notui.ElementPrototype", 226 | Help = "Stores a series of queues", 227 | Tags = "append, remove, generic, spreadop, collection", 228 | Author = "motzi" 229 | )] 230 | public class ElementPrototypeQueueStoreNodes : QueueStore 231 | { 232 | public ElementPrototypeQueueStoreNodes() : base(new ElementCopier()) { } 233 | } 234 | 235 | #endregion Collections 236 | 237 | } 238 | 239 | -------------------------------------------------------------------------------- /Generic/GenericElementTransformationNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Notui; 7 | using VVVV.Nodes.Generic; 8 | using VVVV.PluginInterfaces.V2; 9 | using VVVV.Utils.Streams; 10 | 11 | namespace Notuiv.Generic 12 | { 13 | [PluginInfo(Name = "Cons", 14 | Category = "Notui.Transformation", 15 | Help = "Concatenates all Input spreads.", 16 | Tags = "generic, spreadop" 17 | )] 18 | public class ElementTransformationConsNode : Cons { } 19 | 20 | [PluginInfo(Name = "CAR", 21 | Category = "Notui.Transformation", 22 | Version = "Bin", 23 | Help = "Splits a given spread into first slice and remainder.", 24 | Tags = "split, generic, spreadop", 25 | Author = "woei" 26 | )] 27 | public class ElementTransformationCARBinNode : CARBin { } 28 | 29 | [PluginInfo(Name = "CDR", 30 | Category = "Notui.Transformation", 31 | Version = "Bin", 32 | Help = "Splits a given spread into remainder and last slice.", 33 | Tags = "split, generic, spreadop", 34 | Author = "woei" 35 | )] 36 | public class ElementTransformationCDRBinNode : CDRBin { } 37 | 38 | [PluginInfo(Name = "Reverse", 39 | Category = "Notui.Transformation", 40 | Version = "Bin", 41 | Help = "Reverses the order of the slices in the Spread.", 42 | Tags = "invert, generic, spreadop", 43 | Author = "woei" 44 | )] 45 | public class ElementTransformationReverseBinNode : ReverseBin { } 46 | 47 | [PluginInfo(Name = "Shift", 48 | Category = "Notui.Transformation", 49 | Version = "Bin", 50 | Help = "Shifts the slices in the Spread by the given Phase.", 51 | Tags = "generic, spreadop", 52 | Author = "woei" 53 | )] 54 | public class ElementTransformationShiftBinNode : ShiftBin { } 55 | 56 | [PluginInfo(Name = "SetSlice", 57 | Category = "Notui.Transformation", 58 | Version = "Bin", 59 | Help = "Replaces individual slices of a spread with the given input", 60 | Tags = "generic, spreadop", 61 | Author = "woei" 62 | )] 63 | public class ElementTransformationSetSliceNode : SetSlice { } 64 | 65 | [PluginInfo(Name = "DeleteSlice", 66 | Category = "Notui.Transformation", 67 | Help = "Removes slices from the Spread at the positions addressed by the Index pin.", 68 | Tags = "remove, generic, spreadop", 69 | Author = "woei" 70 | )] 71 | public class ElementTransformationDeleteSliceNode : DeleteSlice { } 72 | 73 | [PluginInfo(Name = "Select", 74 | Category = "Notui.Transformation", 75 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 76 | Tags = "repeat, resample, duplicate, spreadop" 77 | )] 78 | public class ElementTransformationSelectNode : Select { } 79 | 80 | [PluginInfo(Name = "Select", 81 | Category = "Notui.Transformation", 82 | Version = "Bin", 83 | Help = "Returns each slice of the Input spread as often as specified by the corresponding Select slice. 0 meaning the slice will be omitted. ", 84 | Tags = "repeat, resample, duplicate, spreadop", 85 | Author = "woei" 86 | )] 87 | public class ElementTransformationSelectBinNode : SelectBin { } 88 | 89 | [PluginInfo(Name = "Unzip", 90 | Category = "Notui.Transformation", 91 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it.", 92 | Tags = "split, generic, spreadop" 93 | )] 94 | public class ElementTransformationUnzipNode : Unzip { } 95 | 96 | [PluginInfo(Name = "Unzip", 97 | Category = "Notui.Transformation", 98 | Version = "Bin", 99 | Help = "The inverse of Zip. Interprets the Input spread as being interleaved and untangles it. With Bin Size.", 100 | Tags = "split, generic, spreadop" 101 | )] 102 | public class ElementTransformationUnzipBinNode : Unzip> { } 103 | 104 | [PluginInfo(Name = "Zip", 105 | Category = "Notui.Transformation", 106 | Help = "Interleaves all Input spreads.", 107 | Tags = "interleave, join, generic, spreadop" 108 | )] 109 | public class ElementTransformationZipNode : Zip { } 110 | 111 | [PluginInfo(Name = "Zip", 112 | Category = "Notui.Transformation", 113 | Version = "Bin", 114 | Help = "Interleaves all Input spreads.", 115 | Tags = "interleave, join, generic, spreadop" 116 | )] 117 | public class ElementTransformationZipBinNode : Zip> { } 118 | 119 | [PluginInfo(Name = "GetSpread", 120 | Category = "Notui.Transformation", 121 | Version = "Bin", 122 | Help = "Returns sub-spreads from the input specified via offset and count", 123 | Tags = "generic, spreadop", 124 | Author = "woei")] 125 | public class ElementTransformationGetSpreadNode : GetSpreadAdvanced { } 126 | 127 | [PluginInfo(Name = "SetSpread", 128 | Category = "Notui.Transformation", 129 | Version = "Bin", 130 | Help = "Allows to set sub-spreads into a given spread.", 131 | Tags = "generic, spreadop", 132 | Author = "woei" 133 | )] 134 | public class ElementTransformationSetSpreadNode : SetSpread { } 135 | 136 | [PluginInfo(Name = "SplitAt", 137 | Category = "Notui.Transformation", 138 | Help = "Splits the Input spread in two at the specified Index.", 139 | Tags = "generic, spreadop" 140 | )] 141 | public class ElementTransformationSplitAtNode : SplitAtNode { } 142 | } 143 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Modified BSD License 2 | ==================== 3 | 4 | _Copyright © 2018, **MESO Digital Interiors GmbH**_ 5 | _All rights reserved._ 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions are met: 9 | 10 | 1. Redistributions of source code must retain the above copyright 11 | notice, this list of conditions and the following disclaimer. 12 | 2. Redistributions in binary form must reproduce the above copyright 13 | notice, this list of conditions and the following disclaimer in the 14 | documentation and/or other materials provided with the distribution. 15 | 3. Neither the name of the **MESO** nor the 16 | names of its contributors may be used to endorse or promote products 17 | derived from this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND 20 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 | DISCLAIMED. IN NO EVENT SHALL **MESO Digital Interiors GmbH** BE LIABLE FOR ANY 23 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 26 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /ModularPrototypeNodes/BaseNode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace Notuiv.ModularPrototypeNodes 8 | { 9 | class BaseNode 10 | { 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /ModularPrototypeNodes/OperationBase.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace Notuiv.ModularPrototypeNodes 8 | { 9 | public class OperationBase 10 | { 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /NotuiUtils.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using md.stdl.Interaction; 5 | using md.stdl.Interfaces; 6 | using Notui; 7 | using md.stdl.Mathematics; 8 | using VVVV.PluginInterfaces.V2; 9 | using VVVV.Utils.IO; 10 | using VVVV.Utils.Reflection; 11 | using VVVV.Utils.VMath; 12 | 13 | namespace Notuiv 14 | { 15 | public class EventBangs : IUpdateable 16 | { 17 | public bool OnInteractionBegin { get; set; } 18 | public bool OnInteractionEnd { get; set; } 19 | public bool OnTouchBegin { get; set; } 20 | public bool OnTouchEnd { get; set; } 21 | public bool OnHitBegin { get; set; } 22 | public bool OnHitEnd { get; set; } 23 | public bool OnInteracting { get; set; } 24 | public bool OnChildrenUpdated { get; set; } 25 | public bool OnDeletionStarted { get; set; } 26 | public bool OnDeleting { get; set; } 27 | public bool OnFadedIn { get; set; } 28 | public uint MouseButtonsPressed { get; set; } 29 | public int HorizontalWheel { get; set; } 30 | public int VerticalWheel { get; set; } 31 | 32 | public void UpdateFrom(EventBangs other) 33 | { 34 | OnInteractionBegin = other.OnInteractionBegin; 35 | OnInteractionEnd = other.OnInteractionEnd; 36 | OnTouchBegin = other.OnTouchBegin; 37 | OnTouchEnd = other.OnTouchEnd; 38 | OnHitBegin = other.OnHitBegin; 39 | OnHitEnd = other.OnHitEnd; 40 | OnInteracting = other.OnInteracting; 41 | OnChildrenUpdated = other.OnChildrenUpdated; 42 | OnDeletionStarted = other.OnDeletionStarted; 43 | OnDeleting = other.OnDeleting; 44 | OnFadedIn = other.OnFadedIn; 45 | 46 | MouseButtonsPressed = other.MouseButtonsPressed; 47 | HorizontalWheel = other.HorizontalWheel; 48 | VerticalWheel = other.VerticalWheel; 49 | } 50 | } 51 | public class ElementEventFlattener 52 | { 53 | public EventBangs CurrentFrame { get; } = new EventBangs(); 54 | public EventBangs PreviousFrame { get; } = new EventBangs(); 55 | 56 | private void _OnInteractionBeginHandler(object sender, TouchInteractionEventArgs e) => CurrentFrame.OnInteractionBegin = true; 57 | private void _OnInteractionEndHandler(object sender, TouchInteractionEventArgs e) => CurrentFrame.OnInteractionEnd = true; 58 | private void _OnTouchBeginHandler(object sender, TouchInteractionEventArgs e) => CurrentFrame.OnTouchBegin = true; 59 | private void _OnTouchEndHandler(object sender, TouchInteractionEventArgs e) => CurrentFrame.OnTouchEnd = true; 60 | private void _OnHitBeginHandler(object sender, TouchInteractionEventArgs e) => CurrentFrame.OnHitBegin = true; 61 | private void _OnHitEndHandler(object sender, TouchInteractionEventArgs e) => CurrentFrame.OnHitEnd = true; 62 | private void _OnInteractingHandler(object sender, EventArgs e) => CurrentFrame.OnInteracting = true; 63 | private void _OnChildrenUpdatedHandler(object sender, ChildrenUpdatedEventArgs e) => CurrentFrame.OnChildrenUpdated = true; 64 | private void _OnDeletionStartedHandler(object sender, EventArgs e) => CurrentFrame.OnDeletionStarted = true; 65 | private void _OnDeletingHandler(object sender, EventArgs e) => CurrentFrame.OnDeleting = true; 66 | private void _OnFadedInHandler(object sender, EventArgs e) => CurrentFrame.OnFadedIn = true; 67 | 68 | private void _OnMouseButtonPressed(object sender, MouseInteractionEventArgs e) 69 | { 70 | CurrentFrame.MouseButtonsPressed = CurrentFrame.MouseButtonsPressed | (uint)e.Buttons; 71 | } 72 | private void _OnMouseButtonReleased(object sender, MouseInteractionEventArgs e) 73 | { 74 | CurrentFrame.MouseButtonsPressed = CurrentFrame.MouseButtonsPressed & ~(uint)e.Buttons; 75 | } 76 | private void _OnHorizontalMouseWheelChange(object sender, MouseInteractionEventArgs e) 77 | { 78 | CurrentFrame.HorizontalWheel = e.Touch.MouseDelta.AccumulatedHorizontalWheelDelta; 79 | } 80 | private void _OnVerticalMouseWheelChange(object sender, MouseInteractionEventArgs e) 81 | { 82 | CurrentFrame.VerticalWheel = e.Touch.MouseDelta.AccumulatedWheelDelta; 83 | } 84 | 85 | public void Subscribe(NotuiElement element) 86 | { 87 | try 88 | { 89 | element.OnInteractionBegin -= _OnInteractionBeginHandler; 90 | element.OnInteractionEnd -= _OnInteractionEndHandler; 91 | element.OnTouchBegin -= _OnTouchBeginHandler; 92 | element.OnTouchEnd -= _OnTouchEndHandler; 93 | element.OnHitBegin -= _OnHitBeginHandler; 94 | element.OnHitEnd -= _OnHitEndHandler; 95 | element.OnInteracting -= _OnInteractingHandler; 96 | element.OnChildrenUpdated -= _OnChildrenUpdatedHandler; 97 | element.OnDeletionStarted -= _OnDeletionStartedHandler; 98 | element.OnDeleting -= _OnDeletingHandler; 99 | element.OnFadedIn -= _OnFadedInHandler; 100 | 101 | element.OnMouseButtonPressed -= _OnMouseButtonPressed; 102 | element.OnMouseButtonReleased -= _OnMouseButtonReleased; 103 | element.OnHorizontalMouseWheelChange -= _OnHorizontalMouseWheelChange; 104 | element.OnVerticalMouseWheelChange -= _OnVerticalMouseWheelChange; 105 | } 106 | catch { } 107 | 108 | element.OnInteractionBegin += _OnInteractionBeginHandler; 109 | element.OnInteractionEnd += _OnInteractionEndHandler; 110 | element.OnTouchBegin += _OnTouchBeginHandler; 111 | element.OnTouchEnd += _OnTouchEndHandler; 112 | element.OnHitBegin += _OnHitBeginHandler; 113 | element.OnHitEnd += _OnHitEndHandler; 114 | element.OnInteracting += _OnInteractingHandler; 115 | element.OnChildrenUpdated += _OnChildrenUpdatedHandler; 116 | element.OnDeletionStarted += _OnDeletionStartedHandler; 117 | element.OnDeleting += _OnDeletingHandler; 118 | element.OnFadedIn += _OnFadedInHandler; 119 | 120 | element.OnMouseButtonPressed += _OnMouseButtonPressed; 121 | element.OnMouseButtonReleased += _OnMouseButtonReleased; 122 | element.OnHorizontalMouseWheelChange += _OnHorizontalMouseWheelChange; 123 | element.OnVerticalMouseWheelChange += _OnVerticalMouseWheelChange; 124 | } 125 | 126 | public void Reset() 127 | { 128 | PreviousFrame.UpdateFrom(CurrentFrame); 129 | 130 | CurrentFrame.OnInteractionBegin = false; 131 | CurrentFrame.OnInteractionEnd = false; 132 | CurrentFrame.OnTouchBegin = false; 133 | CurrentFrame.OnTouchEnd = false; 134 | CurrentFrame.OnHitBegin = false; 135 | CurrentFrame.OnHitEnd = false; 136 | CurrentFrame.OnInteracting = false; 137 | CurrentFrame.OnChildrenUpdated = false; 138 | CurrentFrame.OnDeletionStarted = false; 139 | CurrentFrame.OnDeleting = false; 140 | CurrentFrame.OnFadedIn = false; 141 | 142 | CurrentFrame.HorizontalWheel = 0; 143 | CurrentFrame.VerticalWheel = 0; 144 | } 145 | 146 | private IHDEHost _hdeHost; 147 | 148 | public ElementEventFlattener(IHDEHost host) 149 | { 150 | _hdeHost = host; 151 | _hdeHost.MainLoop.OnPrepareGraph += (sender, args) => Reset(); 152 | } 153 | } 154 | 155 | public class VEnvironmentData : AuxiliaryObject 156 | { 157 | public Dictionary NodeSpecific { get; set; } = new Dictionary(); 158 | public ElementEventFlattener FlattenedEvents; 159 | 160 | public string TypeCSharpName { get; } 161 | public Spread Touches { get; } = new Spread(); 162 | public Spread TouchesHitting { get; } = new Spread(); 163 | public Spread TouchingIntersections { get; } = new Spread(); 164 | public Spread HittingTouches { get; } = new Spread(); 165 | public Spread HittingIntersections { get; } = new Spread(); 166 | public Spread Mice { get; } = new Spread(); 167 | public Spread Children { get; } = new Spread(); 168 | public Spread Behaviors { get; } = new Spread(); 169 | public Spread Parent { get; } = new Spread(); 170 | public Matrix4x4 VDispTr { get; private set; } 171 | 172 | private readonly NotuiElement _element; 173 | 174 | public VEnvironmentData(NotuiElement element) 175 | { 176 | _element = element; 177 | TypeCSharpName = element.GetType().GetCSharpName(); 178 | element.OnMainLoopEnd += (sender, args) => 179 | { 180 | Touches.AssignFrom(_element.Touching.Keys); 181 | TouchesHitting.AssignFrom(_element.Touching.Values.Select(t => t != null)); 182 | TouchingIntersections.AssignFrom(_element.Touching.Values.Where(t => t != null)); 183 | HittingTouches.AssignFrom(_element.Hitting.Keys); 184 | HittingIntersections.AssignFrom(_element.Hitting.Values); 185 | Mice.AssignFrom(_element.Mice.Select(t => t.AttachadMouse)); 186 | Children.AssignFrom(_element.Children.Values); 187 | Behaviors.AssignFrom(_element.Behaviors); 188 | 189 | if (_element.Parent == null) 190 | Parent.SliceCount = 0; 191 | else 192 | { 193 | Parent.SliceCount = 1; 194 | Parent[0] = element.Parent; 195 | } 196 | 197 | VDispTr = _element.DisplayMatrix.AsVMatrix4X4(); 198 | }; 199 | } 200 | 201 | public override IAuxiliaryObject Copy() 202 | { 203 | return new VEnvironmentData(_element); 204 | } 205 | 206 | public override void UpdateFrom(IAuxiliaryObject other) 207 | { 208 | if (other is VEnvironmentData venvdat) 209 | { 210 | NodeSpecific = venvdat.NodeSpecific; 211 | } 212 | } 213 | } 214 | 215 | public static class NotuiUtils 216 | { 217 | public static void AttachManagementObject(this NotuiElement element, string nodepath, object obj) 218 | { 219 | if (element.EnvironmentObject == null) 220 | element.EnvironmentObject = new VEnvironmentData(element); 221 | if (element.EnvironmentObject is VEnvironmentData venvdat) 222 | { 223 | if (venvdat.NodeSpecific.ContainsKey(nodepath)) 224 | { 225 | venvdat.NodeSpecific[nodepath] = obj; 226 | } 227 | else 228 | { 229 | venvdat.NodeSpecific.Add(nodepath, obj); 230 | } 231 | } 232 | } 233 | 234 | public static void AttachSliceId(this NotuiElement element, string nodepath, int id) 235 | { 236 | element.AttachManagementObject(nodepath, id); 237 | } 238 | } 239 | } 240 | -------------------------------------------------------------------------------- /Notuiv.csproj.DotSettings: -------------------------------------------------------------------------------- 1 |  2 | True -------------------------------------------------------------------------------- /Notuiv.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29001.49 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Notuiv", "Notuiv.csproj", "{54A1E163-CFBF-4578-8D67-AC76C201ADC5}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {54A1E163-CFBF-4578-8D67-AC76C201ADC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {54A1E163-CFBF-4578-8D67-AC76C201ADC5}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {54A1E163-CFBF-4578-8D67-AC76C201ADC5}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {54A1E163-CFBF-4578-8D67-AC76C201ADC5}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {22095E08-3F09-4F5A-A84E-E614358F952C} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Notuiv")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Notuiv")] 13 | [assembly: AssemblyCopyright("Copyright © 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("54a1e163-cfbf-4578-8d67-ac76c201adc5")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Notuiv 2 | [![Build status](https://ci.appveyor.com/api/projects/status/nt6bpup3e76p7m64?svg=true)](https://ci.appveyor.com/project/microdee/notuiv) 3 | 4 | Notuiv is a vvvv implementation of, you guessed it, Notui found here: https://github.com/microdee/Notui 5 | 6 | See the help patch of Context (Notui) node to see how to use it in vvvv. 7 | You can download it with either from the releases or through vpm. 8 | 9 | ## About Notui: 10 | 11 | Notui is a renderless UI framework which is focusing on arbitrary elements and the user's interaction with them. Designed for but not exclusive to large scale media applications. 12 | 13 | Notui operates with stateless prototype records (ElementPrototype) which carry only user updated information. These prototypes then used to instantiate state-ful elements per-context (NotuiElement). These element instances can be used for getting interaction states, transformations and reacting to user input events. This behavior allows to be Dataflow friendly and have a single source of truth. This means the developer can change the hierarchy structure of prototypes and let the context handle any special behavior regarding that change (like fading in/out for instance) 14 | 15 | Its first implementation is done in vvvv where this implies that UI definition, interaction behavior and UI animation/rendering can be nicely separated into their own subpatches without resulting in useless cobwebs. 16 | 17 | An element can be transformed in 3D space (position, scale and quaternion rotation) and it can have any hittesting function. In Notui interactions usually dubbed touches because the main targets are touchscreens but any pointing device works such as pen or plain mice. 18 | 19 | An element has 2 types of transformation, one for display and one for interaction. When a touch starts to interact with an element first its Display Transformation is used while hittesting but during further interaction, the Interaction Transformation is used. This allows behaviors to have smoothing or other visual effects which would slide the element out from below the touch, but it should keep the interacting state. 20 | 21 | Elements can have other elements as children so they form a hierarchy. Child elements are inheriting their parent's Display Transformation and if their parents are deleted they'd also get deleted. 22 | 23 | The default interaction behavior is: 24 | - An element can be Active or not. While not active it won't receive touches but it will execute its behaviors 25 | - A user starts interacting with the element when a touch is created on that element. 26 | - That touch will interact with the element until released. 27 | - Elements closer to the viewer are blocking touches and hits from elements beyond it, unless Transparent is turned on. All transparent elements which has a touch above them receive hitting touches until the closest non transparent element finally blocks it from elements beyond it. 28 | - Elements also report raw but blocked hitting touches. So if a touch slides onto the element it will be "Hit" but not "Touched". 29 | - Also Elements where touches were slided off from them will be "Touched" but not "Hit". 30 | - Elements have 2 assigned timers an Age started from its creation and a funnily named Dethklok which is started when its deletion is requested. 31 | - This means elements can inherently fade in to life and fade out to deletion. 32 | - This also means in vvvv newly created element slices can fade in and deleted or gone slices are kept in the Context while they're fading out. 33 | 34 | Each element can also have separate list of optional behaviors which either override or augment the above ones, introducing user driven animations and interaction schemes for example. 35 | -------------------------------------------------------------------------------- /SubContextNodes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.Composition; 4 | using System.Linq; 5 | using System.Numerics; 6 | using System.Reflection; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using md.stdl.Boolean; 10 | using md.stdl.Interaction; 11 | using Notui; 12 | using md.stdl.Mathematics; 13 | using mp.pddn; 14 | using VVVV.DX11.Nodes.Renderers.Graphics.Touch; 15 | using VVVV.PluginInterfaces.V1; 16 | using VVVV.PluginInterfaces.V2; 17 | using VVVV.Utils.IO; 18 | using VVVV.Utils.VMath; 19 | using VMatrix = VVVV.Utils.VMath.Matrix4x4; 20 | using SMatrix = System.Numerics.Matrix4x4; 21 | 22 | 23 | namespace Notuiv 24 | { 25 | [PluginInfo( 26 | Name = "SubContextOptions", 27 | Category = "Notui", 28 | Author = "microdee", 29 | Version = "Join", 30 | AutoEvaluate = true 31 | )] 32 | public class SubContextOptionsNode : IPluginEvaluate 33 | { 34 | [Input("Include Hitting Touches Too")] 35 | public IDiffSpread FIncludeHitting; 36 | [Input("Touch Coordinate Source")] 37 | public IDiffSpread FTouchCoordSrc; 38 | 39 | [Output("Output")] 40 | public ISpread FOut; 41 | 42 | public void Evaluate(int SpreadMax) 43 | { 44 | FOut.Stream.IsChanged = false; 45 | if (FIncludeHitting.IsChanged || FTouchCoordSrc.IsChanged) 46 | { 47 | FOut.SliceCount = SpreadMax; 48 | for (int i = 0; i < SpreadMax; i++) 49 | { 50 | if (FOut[i] == null) 51 | FOut[i] = new SubContextOptions(); 52 | FOut[i].IncludeHitting = FIncludeHitting[i]; 53 | FOut[i].TouchSpaceSource = FTouchCoordSrc[i]; 54 | FOut[i].UpdateOnlyChangeFlagged = true; 55 | } 56 | FOut.Stream.IsChanged = true; 57 | } 58 | } 59 | } 60 | 61 | [PluginInfo( 62 | Name = "SubContext", 63 | Category = "Notui", 64 | Author = "microdee", 65 | Version = "Split", 66 | AutoEvaluate = true 67 | )] 68 | public class SubContextNode : IPluginEvaluate, IPluginFeedbackLoop 69 | { 70 | [Import] public IPluginHost2 PluginHost; 71 | [Import] public IHDEHost Host; 72 | 73 | [Input("Hosting Element")] 74 | public Pin FHostElements; 75 | [Input("Element Prototypes")] 76 | public IDiffSpread> FElements; 77 | 78 | private Spread> _prevElements = new Spread>(); 79 | 80 | [Input("Force Update Elements", IsBang = true, Visibility = PinVisibility.Hidden)] 81 | public ISpread FUpdateElements; 82 | [Input("Auto Update Elements", DefaultBoolean = true, Visibility = PinVisibility.Hidden)] 83 | public ISpread FAutoUpdateElements; 84 | 85 | [Input("Minimum Force for Interaction", DefaultValue = 0.5)] 86 | public IDiffSpread FMinForce; 87 | [Input("Consider Touch New Before", DefaultValue = 1)] 88 | public ISpread FConsiderNew; 89 | [Input("Consider Touch Released After", DefaultValue = 1)] 90 | public ISpread FConsiderReleased; 91 | 92 | [Input("View")] 93 | public Pin FViewTr; 94 | [Input("Projection")] 95 | public Pin FProjTr; 96 | [Input("Aspect Ratio")] 97 | public Pin FAspTr; 98 | 99 | [Output("Context")] 100 | public ISpread> FContext; 101 | [Output("Hierarchical Elements")] 102 | public ISpread> FElementsOut; 103 | [Output("Flat Elements")] 104 | public ISpread> FFlatElements; 105 | 106 | [Output("Touches")] 107 | public ISpread> FTouches; 108 | 109 | private int _areElementsChanged = 0; 110 | 111 | public void Evaluate(int SpreadMax) 112 | { 113 | if (FHostElements.IsConnected && FHostElements.SliceCount > 0 && FHostElements[0] != null) 114 | { 115 | if (FElements.IsChanged) _areElementsChanged = 2; 116 | _prevElements.SliceCount = FHostElements.SliceCount; 117 | FContext.SliceCount = FHostElements.SliceCount; 118 | FElementsOut.SliceCount = FHostElements.SliceCount; 119 | FFlatElements.SliceCount = FHostElements.SliceCount; 120 | FTouches.SliceCount = FHostElements.SliceCount; 121 | 122 | for (int i = 0; i < FHostElements.SliceCount; i++) 123 | { 124 | var hostel = FHostElements[i]; 125 | if (hostel.SubContext == null) 126 | { 127 | FContext[i].SliceCount = 0; 128 | FElementsOut[i].SliceCount = 0; 129 | FFlatElements[i].SliceCount = 0; 130 | FTouches[i].SliceCount = 0; 131 | continue; 132 | } 133 | 134 | var context = hostel.SubContext.Context; 135 | context.View = FViewTr[i].AsSystemMatrix4X4(); 136 | context.Projection = FProjTr[i].AsSystemMatrix4X4(); 137 | context.AspectRatio = FAspTr[i].AsSystemMatrix4X4(); 138 | 139 | 140 | for (int j = 0; j < FElements[i].SliceCount; j++) 141 | { 142 | if (FElements[i][j] == null) continue; 143 | if (_prevElements[i]?.Contains(FElements[i][j]) ?? true) continue; 144 | FElements[i][j].IsChanged = ElementNodeUtils.ChangedFrames; 145 | } 146 | 147 | if(_prevElements[i] == null) _prevElements[i] = new Spread(); 148 | _prevElements[i].AssignFrom(FElements[i]); 149 | 150 | if (_areElementsChanged > 0 && FAutoUpdateElements[i] || FUpdateElements[i]) 151 | { 152 | context.AddOrUpdateElements(true, FElements[i].Where(el => el != null).ToArray()); 153 | } 154 | 155 | FContext[i].SliceCount = 1; 156 | FContext[i][0] = context; 157 | 158 | FFlatElements[i].SliceCount = context.FlatElements.Count; 159 | for (int j = 0; j < context.FlatElements.Count; j++) 160 | { 161 | var element = context.FlatElements[j]; 162 | FFlatElements[i][j] = element; 163 | switch (element.EnvironmentObject) 164 | { 165 | case null: 166 | element.EnvironmentObject = new VEnvironmentData(element); 167 | break; 168 | case VEnvironmentData venvdat: 169 | if (venvdat.FlattenedEvents != null) continue; 170 | venvdat.FlattenedEvents = new ElementEventFlattener(Host); 171 | venvdat.FlattenedEvents.Subscribe(element); 172 | break; 173 | } 174 | } 175 | 176 | FElementsOut[i].AssignFrom(context.RootElements.Values); 177 | FTouches[i].AssignFrom(context.Touches.Values); 178 | } 179 | } 180 | else 181 | { 182 | 183 | FContext.SliceCount = 0; 184 | FElementsOut.SliceCount = 0; 185 | FFlatElements.SliceCount = 0; 186 | FTouches.SliceCount = 0; 187 | } 188 | 189 | if(_areElementsChanged > 0) _areElementsChanged--; 190 | } 191 | 192 | public bool OutputRequiresInputEvaluation(IPluginIO inputPin, IPluginIO outputPin) 193 | { 194 | return false; 195 | } 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /deploy/Notuiv/girlpower/AppStructure/Output.v4p: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | -------------------------------------------------------------------------------- /deploy/Notuiv/girlpower/AppStructure/UIStructure.v4p: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | -------------------------------------------------------------------------------- /deploy/Notuiv/girlpower/AppStructure/View.v4p: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /deploy/Notuiv/girlpower/AppStructure/_root.v4p: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | -------------------------------------------------------------------------------- /deploy/Notuiv/nodes/plugins/MouseSplit (Mouse Accumulated) help.v4p: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /deploy/Notuiv/nodes/plugins/PrototypeInfo (Notui.ElementPrototype Split) help.v4p: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /deploy/Notuiv/nodes/plugins/Void (Notui.ElementPrototype Join) help.v4p: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /dlls/FeralTic.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meso-unimpressed/Notuiv/780d1c40b9b80f965197572f2b7aca459cdf2073/dlls/FeralTic.dll -------------------------------------------------------------------------------- /dlls/SharpDX.DXGI.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meso-unimpressed/Notuiv/780d1c40b9b80f965197572f2b7aca459cdf2073/dlls/SharpDX.DXGI.dll -------------------------------------------------------------------------------- /dlls/SharpDX.Direct3D11.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meso-unimpressed/Notuiv/780d1c40b9b80f965197572f2b7aca459cdf2073/dlls/SharpDX.Direct3D11.dll -------------------------------------------------------------------------------- /dlls/SharpDX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meso-unimpressed/Notuiv/780d1c40b9b80f965197572f2b7aca459cdf2073/dlls/SharpDX.dll -------------------------------------------------------------------------------- /dlls/VVVV.DX11.Core.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meso-unimpressed/Notuiv/780d1c40b9b80f965197572f2b7aca459cdf2073/dlls/VVVV.DX11.Core.dll -------------------------------------------------------------------------------- /dlls/VVVV.DX11.Lib.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meso-unimpressed/Notuiv/780d1c40b9b80f965197572f2b7aca459cdf2073/dlls/VVVV.DX11.Lib.dll -------------------------------------------------------------------------------- /dlls/VVVV.DX11.Nodes.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meso-unimpressed/Notuiv/780d1c40b9b80f965197572f2b7aca459cdf2073/dlls/VVVV.DX11.Nodes.dll -------------------------------------------------------------------------------- /packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | --------------------------------------------------------------------------------