public void Evaluate(int SpreadMax) { if (IsFirstFrame || FInit[0]) { FOutput.AssignFrom(FDefault); IsFirstFrame = false; } else { FOutput.AssignFrom(LastFrameAgents); } FOutput.Flush(); }
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(); }
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(); } }
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(); }
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(); }
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(); }
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(); }
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); }
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) + "]"); } }