コード例 #1
0
ファイル: MessageEditNode.cs プロジェクト: mrvux/vvvv-Message
        public override void Evaluate(int SpreadMax)
        {
            if (FInput.IsAnyInvalid())
            {
                FOutput.FlushNil();
                return;
            }

            bool doFlush = false;

            // is any Update slice checked?
            var anyUpdate = FUpdate.Any();

            // Flush upstream changes through the plugin
            if (FInput.IsChanged)
            {
                FOutput.SliceCount = 0;
                FOutput.AssignFrom(FInput); // push change from upstream if valid
                doFlush = true;
            }
            else if (!anyUpdate)
            {
                return;                                                               // if no update and no change, no need to flush!
            }
            bool newData = FPins.Any(pinName => pinName.Value.ToISpread().IsChanged); // changed pins

            newData |= !FAutoSense[0];                                                // assume newData, if AutoSense is off.

            if (anyUpdate && newData)
            {
                int messageIndex = 0;
                foreach (var message in FInput)
                {
                    if (FUpdate[messageIndex])
                    {
                        doFlush |= CopyFromPins(message, messageIndex, FAutoSense[0]);
                    }

                    messageIndex++;
                }
            }

            if (doFlush)
            {
                FOutput.Flush();
            }


            if (RemovePinsFirst)
            {
                RetryConfig();
            }
        }
コード例 #2
0
        public void Evaluate(int SpreadMax)
        {
            if (!FInput.IsChanged &&
                !FTopic.IsChanged &&
                !(FUpdate.IsChanged && FUpdate.Any())
                )
            {
                return;
            }

            SpreadMax = FInput.IsAnyInvalid() ? 0 : FInput.SliceCount;
            for (int i = 0; i < SpreadMax; i++)
            {
                // double check if topic change needs to occur, because setting it will mark the message as dirty
                if (FUpdate[i] && !FInput[i].Topic.Equals(FTopic[i]))
                {
                    FInput[i].Topic = FTopic[i];
                }
            }

            FOutput.FlushResult(FInput);
        }
コード例 #3
0
ファイル: Store.cs プロジェクト: vnmone/vvvv-sdk
 public virtual bool PinChanged()
 {
     return(FSet.Any(x => x == true) || FRemove.Any(x => x == true) || FInsert.Any(x => x == true));
     //return FSet.IsChanged || FRemove.IsChanged || FInsert.IsChanged;
 }
コード例 #4
0
 public override bool PinChanged()
 {
     return(base.PinChanged() || FIncrement.Any(x => x == true));
 }
コード例 #5
0
        public override void Evaluate(int SpreadMax)
        {
            if (RemovePinsFirst)
            {
                RetryConfig();
            }

            SpreadMax = FSpreadCount.IsAnyInvalid() || FTopic.IsAnyInvalid() ? 0 : FSpreadCount[0];
            SpreadMax = Math.Max(SpreadMax, 0); // safeguard against negative binsizes

//          Reset?
            var anyUpdate = ResetNecessary;

            var forceUpdate = !FAutoSense[0] || FAutoSense.IsChanged;

            var newData = FPins.Any(x => x.Value.ToISpread().IsChanged); // changed pins

            newData |= forceUpdate;                                      // if update is forced, then predent it is new Data

            var newTopic = FTopic.IsChanged;

            newTopic |= forceUpdate; // if update is forced, then pretend it is a new Topic

//          remove superfluous entries
            if (SpreadMax < Keep.Count)
            {
                anyUpdate = true;
                Keep.RemoveRange(SpreadMax, Keep.Count - SpreadMax);
            }

//          add new entries
            for (int i = Keep.Count; i < SpreadMax; i++)
            {
                anyUpdate = true; // new entry in Keep will require data

                newData  = true;
                newTopic = true;

                var message = new Message(Formular);
                message.Topic = FTopic[i];
                Keep.Add(message);
            }

//          check update pin
            anyUpdate |= FUpdate.Any();

            if (anyUpdate && (newData || newTopic))
            {
                // ...and start filling messages
                int messageIndex = 0;
                foreach (var message in Keep)
                {
                    // only copy, when Update is true for this message
                    if (newData && FUpdate[messageIndex] && CopyFromPins(message, messageIndex, !forceUpdate))
                    {
                        anyUpdate = true;
                    }

                    if (newTopic && FUpdate[messageIndex] && message.Topic != FTopic[messageIndex])
                    {
                        message.Topic = FTopic[messageIndex];
                        anyUpdate     = true;
                    }
                    messageIndex++;
                }
            }

            if (Keep.IsChanged)
            {
                UpKeep(anyUpdate);
            }
            else  // no change, so make sure, none is reported
            {
                if (FChangeOut.SliceCount > 0)
                {
                    FChangeOut.SliceCount      = 0;
                    FChangeIndexOut.SliceCount = 0;
                }
            }
        }
コード例 #6
0
        public override void Evaluate(int SpreadMax)
        {
            InitDX11Graph();

            bool warnPinSafety = false;

            if (RemovePinsFirst)
            {
                warnPinSafety = !RetryConfig();                  // defer PinConnectionException until end of method, if not successful
            }
            SpreadMax = FSpreadCount.IsAnyInvalid() || FTopic.IsAnyInvalid() ? 0 : FSpreadCount[0];
            SpreadMax = Math.Max(SpreadMax, 0); // safeguard against negative binsizes

//          Reset?
            var anyUpdate   = FResetNecessary;
            var forceUpdate = FForce[0] || FForce.IsChanged;

            var newData = FPins.Any(x => x.Value.ToISpread().IsChanged); // changed pins

            newData |= forceUpdate;                                      // if update is forced, then predent it is new Data
            var newTopic = FTopic.IsChanged;

            newTopic |= forceUpdate; // if update is forced, then pretend it is a new Topic

//          remove superfluous entries
            if (SpreadMax < Keep.Count)
            {
                anyUpdate = true;
                Keep.RemoveRange(SpreadMax, Keep.Count - SpreadMax);
            }

//          add new entries
            for (int i = Keep.Count; i < SpreadMax; i++)
            {
                anyUpdate = true; // new entry in Keep will require data

                newData  = true;
                newTopic = true;

                var message = new Message(Formular);
                message.Topic = FTopic[i];
                Keep.Add(message);
            }

//          check update pin
            anyUpdate |= FUpdate.Any();

            if (anyUpdate && (newData || newTopic))
            {
                // ...and start filling messages
                int messageIndex = 0;
                foreach (var message in Keep)
                {
                    // only copy, when Update is true for this message
                    if (newData && FUpdate[messageIndex] && CopyFromPins(message, messageIndex, !forceUpdate))
                    {
                        anyUpdate = true;
                    }

                    if (newTopic && FUpdate[messageIndex] && message.Topic != FTopic[messageIndex])
                    {
                        message.Topic = FTopic[messageIndex];
                        anyUpdate     = true;
                    }
                    messageIndex++;
                }
            }

            if (Keep.IsChanged || Keep.Any(m => m.HasRecentCommit(Keep)))
            {
                UpKeep(anyUpdate);
            }
            else  // no change, so make sure, none is reported
            {
                if (FChangeOut.SliceCount > 0)
                {
                    FChangeOut.FlushNil();
                    FChangeIndexOut.FlushNil();
                }
            }

            if (warnPinSafety)
            {
                throw new PinConnectionException("Manually remove unneeded links first! [ConfigKeep]. ID = [" + PluginHost.GetNodePath(false) + "]");
            }
        }
コード例 #7
0
        public override void Evaluate(int SpreadMax)
        {
            if (FInput.IsAnyInvalid())
            {
                FOutput.FlushNil();
                return; // if no input, no further calculation.
            }

            bool doFlush = false;

            // any of the update slices is true -> update the plugin.
            var anyUpdate = FUpdate.Any();

            // Flush upstream changes through the plugin
            if (FInput.IsChanged)
            {
                FOutput.SliceCount = 0;
                FOutput.AssignFrom(FInput);
                doFlush = true;
            }
            else if (!anyUpdate)
            {
                return;
            }

            var keyCount    = FKey.SliceCount;
            var ValueSpread = FValue.ToISpread();

            bool newData = ValueSpread.IsChanged; // changed pin

            newData |= !FAutoSense[0];            // assume newData, if AutoSense is off.

            if (anyUpdate && newData)
            {
                SpreadMax = FInput.SliceCount;
                doFlush   = true;

                for (int i = 0; i < SpreadMax; i++)
                {
                    Message message = FInput[i];

                    var keyIndex = 0;
                    foreach (var key in FKey)
                    {
                        var fieldIndex = i * keyCount + keyIndex;
                        keyIndex++;

                        if (!FUpdate[fieldIndex])
                        {
                            continue;
                        }

                        if (!message.Fields.Contains(key))
                        {
                            message[key] = BinFactory.New(TargetDynamicType);
                        }
                        var value = ValueSpread[fieldIndex] as ISpread;

                        if (value.SliceCount > 0)
                        {
                            if (message[key].GetInnerType().IsAssignableFrom(TargetDynamicType))
                            {
                                // check if any relevant change occurred
                                if (!message[key].Equals(value as IEnumerable))
                                {
                                    message.AssignFrom(key, value);
                                }
                            }
                            else
                            {
                                var casted = from slice in value as IEnumerable <object>
                                             let targetType = message[key].GetInnerType()
                                                              select Convert.ChangeType(slice, targetType);

                                if (!message[key].Equals(casted))
                                {
                                    message.AssignFrom(key, casted);
                                }
                            }
                        }
                        else
                        {
                            message[key].Clear();
                        }
                    }
                }
            }

            if (doFlush)
            {
                FOutput.Flush();
            }
        }
コード例 #8
0
        public override void Evaluate(int SpreadMax)
        {
            InitDX11Graph();

            bool warnPinSafety = false;

            if (RemovePinsFirst)
            {
                warnPinSafety = RetryConfig();
            }

            if (FInput.IsAnyInvalid())
            {
                FOutput.FlushNil();

                if (warnPinSafety)
                {
                    throw new PinConnectionException("Manually remove unneeded links first! [Edit]. ID = [" + PluginHost.GetNodePath(false) + "]");
                }
                return;
            }

            bool doFlush = false;

            // is any Update slice checked?
            var anyUpdate = FUpdate.Any();

            // Flush upstream changes through the plugin
            if (FInput.IsChanged)
            {
                FOutput.SliceCount = 0;
                FOutput.AssignFrom(FInput); // push change from upstream if valid
                doFlush = true;
            }
            else if (!anyUpdate)
            {
                if (warnPinSafety)
                {
                    throw new PinConnectionException("Manually remove unneeded links first! [Edit]. ID = [" + PluginHost.GetNodePath(false) + "]");
                }

                return; // if no update and no change, no need to flush!
            }

            bool newData = FPins.Any(pinName => pinName.Value.ToISpread().IsChanged); // changed pins

            newData |= FForce[0];                                                     // assume newData, if AutoSense is off.

            if (anyUpdate && newData)
            {
                int messageIndex = 0;
                foreach (var message in FInput)
                {
                    if (FUpdate[messageIndex])
                    {
                        doFlush |= CopyFromPins(message, messageIndex, !FForce[0]);
                    }

                    messageIndex++;
                }
            }

            if (doFlush)
            {
                FOutput.Flush();
            }

            if (warnPinSafety)
            {
                throw new PinConnectionException("Manually remove unneeded links first! [Edit]. ID = [" + PluginHost.GetNodePath(false) + "]");
            }
        }
コード例 #9
0
        public override void Evaluate(int SpreadMax)
        {
            InitDX11Graph();

            if (FInput.IsAnyInvalid())
            {
                FOutput.FlushNil();
                return; // if no input, no further calculation.
            }

            bool doFlush = false;

            // any of the update slices is true -> update the plugin.
            var anyUpdate = FUpdate.Any();

            // Flush upstream changes through the plugin
            if (FInput.IsChanged)
            {
                FOutput.SliceCount = 0;
                FOutput.AssignFrom(FInput);
                doFlush = true;
            }
            else if (!anyUpdate)
            {
                return;
            }

            var dataSpread = FValue.ToISpread();

            bool newData = dataSpread.IsChanged; // changed pin

            newData |= FForce[0];                // assume newData, if AutoSense is off.

            if (anyUpdate && newData)
            {
                // Update and Force not included in spreading.
                SpreadMax = dataSpread.SliceCount.CombineWith(FKey).CombineWith(FInput);
                if (FUpdate.IsAnyInvalid() || FForce.IsAnyInvalid())
                {
                    SpreadMax = 0;
                }

                FIterations[0] = SpreadMax;

                doFlush = true;

                var fieldIndex = 0;
                for (int i = 0; i < SpreadMax; i++) // iterate spreaded (except update, which gets cut short)
                {
                    Message message = FInput[i];

                    for (int j = 0; j < FKey[i].SliceCount; j++, fieldIndex++) // iterate all relevant fields for each message
                    {
                        if (!FUpdate[fieldIndex])
                        {
                            continue;                       // update is per-field
                        }
                        var key    = FKey[i][j];
                        var spread = dataSpread[fieldIndex] as ISpread;

                        LazyInsert(message, key, spread);
                    }
                }
            }

            if (doFlush)
            {
                FOutput.Flush();
            }
        }
コード例 #10
0
 private void InputPinChanged(object _)
 {
     if (HandleIn != null && FEnabledIn != null && ModeIn != null)
     {
         int spreadMax = HandleIn.CombineWith(FEnabledIn).CombineWith(ModeIn);
         if (spreadMax > 0)
         {
             if (HandleIn.Any(i => i < 0)) //handle any window
             {
                 if (FEnabledIn[0])
                 {
                     foreach (var s in FWMService.Subclasses)
                     {
                         if (TryRegisterTouch(s, ModeIn[0]))
                         {
                             TouchEnabledWindows.Add(s);
                         }
                     }
                 }
                 else
                 {
                     var disabled = new List <Subclass>();
                     foreach (var s in TouchEnabledWindows)
                     {
                         if (TryUnregisterTouch(s))
                         {
                             disabled.Add(s);
                         }
                     }
                     foreach (var s in disabled)
                     {
                         TouchEnabledWindows.Remove(s);
                     }
                 }
             }
             else
             {
                 var former = new HashSet <Subclass>(TouchEnabledWindows);
                 TouchEnabledWindows.Clear();
                 for (int i = 0; i < spreadMax; i++)
                 {
                     var selected = FWMService.Subclasses.Where(s => s.HWnd.ToInt32() == HandleIn[i]).FirstOrDefault();
                     if (selected != null)
                     {
                         if (FEnabledIn[i])
                         {
                             if (TryRegisterTouch(selected, ModeIn[i]))
                             {
                                 TouchEnabledWindows.Add(selected);
                                 former.Remove(selected);
                             }
                         }
                     }
                 }
                 foreach (var s in former)
                 {
                     if (!TryUnregisterTouch(s))
                     {
                         TouchEnabledWindows.Add(s);
                     }
                 }
             }
         }
     }
 }