Example #1
0
        public void Evaluate(int SpreadMax)
        {
            if (IsFirstFrame || FInit[0])
            {
                FOutput.AssignFrom(FDefault);
                IsFirstFrame = false;
            }
            else
            {
                FOutput.AssignFrom(LastFrameAgents);
            }

            FOutput.Flush();
        }
Example #2
0
            public override void Evaluate(int SpreadMax)
            {
                SpreadMax = FInput.SliceCount;

                if (!FInput.IsChanged)
                {
                    //				FLogger.Log(LogType.Debug, "skip set");
                    return;
                }


                if (FInput.SliceCount == 0 || FInput[0] == null)
                {
                    FOutput.SliceCount = 0;
                    return;
                }

                for (int i = 0; i < SpreadMax; i++)
                {
                    Message message = FInput[i];
                    foreach (string name in FPins.Keys)
                    {
                        var pin = (IEnumerable)ToISpread(FPins[name])[i];
                        message.AssignFrom(name, pin);
                    }
                }

                FOutput.AssignFrom(FInput);
                FOutput.Flush();
            }
Example #3
0
        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();
            }
        }
Example #4
0
        public void Evaluate(int SpreadMax)
        {
            SpreadMax = FInput.SliceCount;

            if (FInput.IsAnyInvalid())
            {
                SpreadMax = 0;
            }
            FKill.Sync();

            for (int i = 0; i < SpreadMax; i++)
            {
                var agent = FInput[i];
                agent.Killed = FKill[i];
            }
            FOutput.AssignFrom(FInput);
            FOutput.Flush();
        }
Example #5
0
        public void Evaluate(int SpreadMax)
        {
            SpreadMax = FInput.SliceCount;

            if (FInput.IsAnyInvalid())
            {
                SpreadMax = 0;
            }

            FHistoryCount.Sync();

            FTransform.SliceCount = SpreadMax;
            FPosition.SliceCount  = SpreadMax;
            FVelocity.SliceCount  = SpreadMax;
            FForceSum.SliceCount  = SpreadMax;

            for (int i = 0; i < SpreadMax; i++)
            {
                IAgent agent = FInput[i];
                agent["HistoryCount"].First = FHistoryCount[i];

                FPosition[i].AssignFrom(agent.PositionHistory());
                FVelocity[i].AssignFrom(agent.VelocityHistory());
                FForceSum[i].AssignFrom(agent.ForceSumHistory());

                var rot       = VMath.PolarVVVV(agent.VelocityHistory(0));
                var transform = VMath.RotateY(VMath.Pi / 2) * VMath.Rotate(rot) * VMath.Translate(agent.PositionHistory(0));


                FTransform[i] = transform;
            }
            FOutput.AssignFrom(FInput);


            FTransform.Flush();
            FPosition.Flush();
            FVelocity.Flush();
            FForceSum.Flush();

            FOutput.Flush();
        }
Example #6
0
        public void Evaluate(int SpreadMax)
        {
            SpreadMax        = FInput.SliceCount;
            FLink.SliceCount = 1;
            Link.RemotePin   = FInput;
            FLink[0]         = Link;

            if (FClone[0])
            {
                FOutput.SliceCount = SpreadMax;
                for (int i = 0; i < SpreadMax; i++)
                {
                    FOutput[i] = (T)FInput[i].Clone();
                }
            }
            else
            {
                FOutput.AssignFrom(FInput);
            }

            FOutput.Flush();
        }
Example #7
0
            public override void Evaluate(int SpreadMax)
            {
                SpreadMax = FInput.SliceCount;
                bool isChanged = false;

                foreach (string name in Pins.Keys)
                {
                    var pin = ToIDiffSpread(Pins[name]);
                    if (pin.IsChanged)
                    {
                        isChanged = true;
                    }
                }

                if (!isChanged && !FInput.IsChanged)
                {
                    //				FLogger.Log(LogType.Debug, "skip set");
                    return;
                }


                if (FInput.SliceCount == 0 || FInput[0] == null)
                {
                    FOutput.SliceCount = 0;
                    return;
                }
                for (int i = 0; i < SpreadMax; i++)
                {
                    Message message = FInput[i];
                    foreach (string name in Pins.Keys)
                    {
                        var pin = GetISpreadData(Pins[name], i);
                        message.AssignFrom(name, pin);
                    }
                }
                FOutput.AssignFrom(FInput);
                FOutput.Flush();
            }
Example #8
0
        protected virtual bool UpKeep(bool force = false)
        {
            if (!force && !Keep.IsChanged)
            {
                if (!Keep.QuickMode && FChangeOut.SliceCount != 0)
                {
                    FChangeOut.SliceCount = 0;
                    FChangeOut.Flush();
                    FChangeIndexOut.SliceCount = 0;
                    FChangeIndexOut.Flush();
                }

                return(false);
            }

            if (Keep.QuickMode)
            {
                Keep.Sync();
            }
            else
            {
                IEnumerable <int> indexes;
                var changes = Keep.Sync(out indexes);

                FChangeIndexOut.SliceCount = 0;
                FChangeIndexOut.AssignFrom(indexes);
                FChangeIndexOut.Flush();

                FChangeOut.SliceCount = 0;
                FChangeOut.AssignFrom(changes);
                FChangeOut.Flush();
            }

            FOutput.FlushResult(Keep);
            FCountOut.FlushInt(Keep.Count);

            return(true);
        }
Example #9
0
        public void Evaluate(int SpreadMax)
        {
            FKilled.SliceCount = 0;
            if (FClear[0])
            {
                FKilled.AssignFrom(FAgents);
                FAgents.Clear();
            }

            if (FDeleteNow[0])
            {
                var del = FDeleteIndex.ToList();

                int size = FAgents.Count();

                for (int i = 0; i < del.Count; i++)
                {
                    del[i] = VMath.Zmod(del[i], size);
                }
                del.Sort();

                for (int i = 0; i < del.Count; i++)
                {
//                    if (FAgents.Count > i)
                    FAgents.RemoveAt(del[i] - i);
                }
            }

            var killed = from a in FAgents
                         where a.Killed
                         select a;

            FKilled.AddRange(killed);
            FAgents.RemoveAll(IsKilled);

            if (!FAdd.IsAnyInvalid())
            {
                var count = FAgents.Count;
                foreach (var agent in FAdd)
                {
                    if (agent != null && !Limited(count))
                    {
                        FAgents.Add(agent);
                        count++;
                    }
                }
                FAgents.Sort();
            }

            FTick.Sync();
            if (!FInput.IsAnyInvalid() && FInput.PluginIO.IsConnected && FTick[0])
            {
                FInput[0].Agents.Clear();
                FInput[0].Agents.AddRange(FAgents);

                foreach (var agent in FInput[0].Agents)
                {
                    agent.ReturnCode = ReturnCodeEnum.Success;
                }

                FInput.Sync();

                FOutput.SliceCount = 0;
                FOutput.AssignFrom(FInput[0].Agents);
            }
            else
            {
                FOutput.SliceCount = 0;
                FOutput.AssignFrom(FAgents);
            }
            FOutput.Flush();
            FKilled.Flush();
        }
        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) + "]");
            }
        }