//here we go, thats the method called by vvvv each frame //all data handling should be in here public void Evaluate(int spreadMax) { FTypeWriters.ResizeAndDispose(spreadMax); FOutput.SliceCount = spreadMax; FCursorPosition.SliceCount = spreadMax; for (int i = 0; i < spreadMax; i++) { var typeWriter = FTypeWriters[i]; typeWriter.IgnoreNavigationKeys = FIgnoreNavigationKeys[i]; typeWriter.MaxLength = FMaxLength[i]; typeWriter.Keyboard = FKeyboardIn[i]; if (FSetCursorPosition[i]) { typeWriter.CursorPosition = FNewCursorPosition[i]; } if (FInitialize[i]) { typeWriter.Initialize(FInitialText[i]); } if (FInsertText[i]) { typeWriter.InsertText(FInputText[i]); } FOutput[i] = typeWriter.Output; FCursorPosition[i] = typeWriter.CursorPosition; } }
public void Evaluate(int SpreadMax) { try { if (FInput.PluginIO.IsConnected) { if (this.RenderRequest != null) { this.RenderRequest(this, this.FHost); } if (this.AssignedContext == null) { return; } var device = this.AssignedContext.Device; var context = this.AssignedContext; FInstances.ResizeAndDispose(SpreadMax); FOutput.SliceCount = SpreadMax; for (int i = 0; i < SpreadMax; i++) { FInstances[i].Process(this.FInput[i], this.AssignedContext); FOutput[i] = FInstances[i].Output; } } } catch (Exception e) { FLogger.Log(e); } }
private void PropertyNamesInChanged(IDiffSpread <string> sender) { FPropertyNames = FPropertyNamesIn[0].Split(' '); int spreadCount = FPropertyNames.Length; ValueIn.ResizeAndDispose(0, Factory); ValueIn.ResizeAndDispose(spreadCount, Factory); }
//called when data for any output pin is requested public void Evaluate(int spreadMax) { FSubscriptions.ResizeAndDispose( spreadMax, slice => { return(new Subscription <Keyboard, KeyNotification>( keyboard => keyboard.KeyNotifications, (keyboard, n) => { switch (n.Kind) { case KeyNotificationKind.KeyPress: var keyPress = n as KeyPressNotification; Output[slice] = new string(keyPress.KeyChar, 1); break; case KeyNotificationKind.KeyUp: case KeyNotificationKind.DeviceLost: Output[slice] = string.Empty; break; } } )); } ); for (int i = 0; i < spreadMax; i++) { FSubscriptions[i].Update(Input[i]); } }
public void Evaluate(int spreadMax) { if (!FKeyIn.IsChanged && !FCapsIn.IsChanged && !FTimeIn.IsChanged) { return; } spreadMax = SpreadUtils.SpreadMax(FKeyIn, FCapsIn, FTimeIn); FSubjects.ResizeAndDispose(spreadMax, slice => new Subject <KeyNotification>()); FOutput.ResizeAndDismiss(spreadMax, slice => new Keyboard(FSubjects[slice], true)); FKeyboardStates.ResizeAndDismiss(spreadMax, () => KeyboardState.Empty); for (int i = 0; i < spreadMax; i++) { var keyboard = FOutput[i]; var keyboardState = new KeyboardState(FKeyIn[i].Cast <Keys>(), FCapsIn[0], FTimeIn[i]); var previousKeyboardState = FKeyboardStates[i]; if (keyboardState != previousKeyboardState) { var subject = FSubjects[i]; var keyDowns = keyboardState.KeyCodes.Except(previousKeyboardState.KeyCodes); foreach (var keyDown in keyDowns) { subject.OnNext(new KeyDownNotification(keyDown, this)); } var keyUps = previousKeyboardState.KeyCodes.Except(keyboardState.KeyCodes); foreach (var keyUp in keyUps) { subject.OnNext(new KeyUpNotification(keyUp, this)); } } FKeyboardStates[i] = keyboardState; } }
public override bool Sync() { var nodeConnectionChanged = FAutoValidate ? FNodeIn.PinIsChanged : FNodeIn.Validate(); if (nodeConnectionChanged) { Length = FNodeIn.SliceCount; FSubscriptions.ResizeAndDispose( Length, slice => { return(new Subscription <Keyboard, KeyNotification>( keyboard => keyboard.KeyNotifications, (keyboard, n) => { var keyboardState = this.Buffer[slice]; IEnumerable <Keys> keys; switch (n.Kind) { case KeyNotificationKind.KeyDown: var downNotification = n as KeyDownNotification; keys = keyboardState.KeyCodes.Concat(new [] { downNotification.KeyCode }); keyboardState = new KeyboardState(keys, keyboard.CapsLock, keyboardState.Time + 1); break; case KeyNotificationKind.KeyUp: var upNotification = n as KeyUpNotification; keys = keyboardState.KeyCodes.Except(new[] { upNotification.KeyCode }); keyboardState = new KeyboardState(keys, keyboardState.CapsLock, keyboardState.Time + 1); break; } SetKeyboardState(slice, keyboardState); } )); } ); object usI; FNodeIn.GetUpstreamInterface(out usI); var stream = usI as MemoryIOStream <Keyboard>; for (int i = 0; i < Length; i++) { int usS; var keyboard = Keyboard.Empty; if (stream != null) { FNodeIn.GetUpsreamSlice(i, out usS); keyboard = stream[usS]; } if (FSubscriptions[i].Update(keyboard)) { SetKeyboardState(i, KeyboardState.Empty); } } } return(base.Sync()); }
public override bool Sync() { IsChanged = FAutoValidate ? FNodeIn.PinIsChanged : FNodeIn.Validate(); if (IsChanged) { Length = FNodeIn.SliceCount; FSubscriptions.ResizeAndDispose( Length, slice => { return(new Subscription <Keyboard, KeyNotification>( keyboard => keyboard.KeyNotifications, (keyboard, n) => { var keyboardState = this.Buffer[slice]; IEnumerable <Keys> keys; switch (n.Kind) { case KeyNotificationKind.KeyDown: var downNotification = n as KeyDownNotification; keys = keyboardState.KeyCodes.Concat(new [] { downNotification.KeyCode }); keyboardState = new KeyboardState(keys, keyboard.CapsLock, keyboardState.Time + 1); break; case KeyNotificationKind.KeyUp: var upNotification = n as KeyUpNotification; keys = keyboardState.KeyCodes.Except(new[] { upNotification.KeyCode }); keyboardState = new KeyboardState(keys, keyboardState.CapsLock, keyboardState.Time + 1); break; } this.Buffer[slice] = keyboardState; } )); } ); using (var writer = GetWriter()) { object usI; FNodeIn.GetUpstreamInterface(out usI); var upstreamInterface = usI as IGenericIO; for (int i = 0; i < Length; i++) { int usS; var keyboard = Keyboard.Empty; if (upstreamInterface != null) { FNodeIn.GetUpsreamSlice(i, out usS); keyboard = (Keyboard)upstreamInterface.GetSlice(usS); } writer.Write(KeyboardState.Empty); FSubscriptions[i].Update(keyboard); } } } return(base.Sync()); }
private void HandlePinCountChanged <T>(ISpread <int> countSpread, Spread <IIOContainer <T> > pinSpread, Func <int, IOAttribute> ioAttributeFactory) where T : class { pinSpread.ResizeAndDispose(countSpread[0], i => { var ioAttribute = ioAttributeFactory(i + 1); return(FIOFactory.CreateIOContainer <T>(ioAttribute)); }); }
public void Evaluate(int spreadMax) { Subscriptions.ResizeAndDispose( spreadMax, () => new Subscription2 <Mouse, MouseNotification>(mouse => mouse.MouseNotifications)); DetectedOut.SliceCount = spreadMax; PositionOut.SliceCount = spreadMax; for (int i = 0; i < spreadMax; i++) { var detectedNotification = Subscriptions[i].ConsumeAll(MouseIn[i]) .Where(n => n.Kind == EventTypeIn[i]) .FirstOrDefault(n => { switch (EventTypeIn[i]) { case MouseNotificationKind.MouseClick: var mouseClick = n as MouseClickNotification; return(mouseClick.Buttons == ButtonIn[i] && mouseClick.ClickCount == ClickCountIn[i]); case MouseNotificationKind.MouseDown: case MouseNotificationKind.MouseUp: var mouseButton = n as MouseButtonNotification; return(mouseButton.Buttons == ButtonIn[i]); case MouseNotificationKind.MouseWheel: var mouseWheel = n as MouseWheelNotification; return(mouseWheel.WheelDelta == WheelDeltaIn[i]); } // Mouse move return(true); }); if (detectedNotification != null) { DetectedOut[i] = true; PositionOut[i] = detectedNotification.Position.FromMousePoint(detectedNotification.ClientArea); } else { DetectedOut[i] = false; PositionOut[i] = Vector2D.Zero; } //For debugging only //foreach (var n in Subscriptions[i].ConsumeAll(MouseIn[i]).OfType<MouseClickNotification>()) //{ // var s = string.Empty; // if (n.ClickCount == 2) // s = " double"; // else if (n.ClickCount == 3) // s = " triple"; // else if (n.ClickCount == 4) // s = " quadtruple"; // FLogger.Log(LogType.Message, "{0}{1} click at position {2}.", n.Buttons, s, n.Position); //} } }
public void Evaluate(int spreadMax) { FSubscriptions.ResizeAndDispose( spreadMax, slice => { return(new Subscription <Keyboard, KeyCodeNotification>( keyboard => keyboard.KeyNotifications.OfType <KeyCodeNotification>(), (keyboard, notification) => { var keyCodeOut = FKeyCodeOut[slice]; var keyCodeValue = (int)notification.KeyCode; switch (notification.Kind) { case KeyNotificationKind.KeyDown: if (!keyCodeOut.Contains(keyCodeValue)) { keyCodeOut.Add(keyCodeValue); } break; case KeyNotificationKind.KeyUp: keyCodeOut.Remove(keyCodeValue); break; } FCapsOut[slice] = keyboard.CapsLock; FTimeOut[slice] = FTimeOut[slice] + 1; } )); } ); FKeyCodeOut.SliceCount = spreadMax; FCapsOut.SliceCount = spreadMax; FTimeOut.SliceCount = spreadMax; for (int i = 0; i < spreadMax; i++) { FSubscriptions[i].Update(FInput[i]); } //KeyOut returns the keycodes symbolic names //it is a spread parallel to the keycodes //didn't want to create an extra binsize output, so... var keys = new List <string>(); foreach (var bin in FKeyCodeOut) { foreach (var slice in bin) { var key = (Keys)slice; keys.Add(key.ToString()); } } FKeyOut.AssignFrom(keys); }
private void ResizePinGroups <TSpread>(int count, Spread <IIOContainer <TSpread> > pinSpread, Func <int, IOAttribute> ioAttributeFactory) where TSpread : class { pinSpread.ResizeAndDispose( count, (i) => { var ioAttribute = ioAttributeFactory(i + 1); return(FIOFactory.CreateIOContainer <TSpread>(ioAttribute)); } ); }
public void Evaluate(int spreadMax) { FSubscriptions.ResizeAndDispose( spreadMax, i => { return(new Subscription <Keyboard, KeyNotification>( k => k.KeyNotifications, (k, n) => { switch (n.Kind) { case KeyNotificationKind.KeyDown: if (SendKeyCodesIn[i]) { InputSimulator.Keyboard.KeyDown((VirtualKeyCode)((KeyDownNotification)n).KeyCode); } break; case KeyNotificationKind.KeyPress: if (SendKeyCharsIn[i]) { InputSimulator.Keyboard.TextEntry(((KeyPressNotification)n).KeyChar); } break; case KeyNotificationKind.KeyUp: if (SendKeyCodesIn[i]) { InputSimulator.Keyboard.KeyUp((VirtualKeyCode)((KeyUpNotification)n).KeyCode); } break; case KeyNotificationKind.DeviceLost: break; default: break; } } )); } ); for (int i = 0; i < spreadMax; i++) { // Resubsribe if necessary FSubscriptions[i].Update(KeyboardIn[i]); } }
public void Evaluate(int spreadMax) { var binCount = BinSizePin.IOObject.Length; FSubjects.ResizeAndDispose(binCount); MouseOut.ResizeAndDismiss(binCount, slice => new Mouse(FSubjects[slice])); for (int bin = 0; bin < binCount; bin++) { var subject = FSubjects[bin]; var notificationCount = EventTypeIn[bin].SliceCount; for (int i = 0; i < notificationCount; i++) { var position = PositionIn[bin][i].ToMousePoint(); MouseNotification notification; switch (EventTypeIn[bin][i]) { case MouseNotificationKind.MouseDown: notification = new MouseDownNotification(position, MouseExtensions.ClientArea, GetMouseButtons(bin, i)); break; case MouseNotificationKind.MouseUp: notification = new MouseUpNotification(position, MouseExtensions.ClientArea, GetMouseButtons(bin, i)); break; case MouseNotificationKind.MouseMove: notification = new MouseMoveNotification(position, MouseExtensions.ClientArea); break; case MouseNotificationKind.MouseWheel: notification = new MouseWheelNotification(position, MouseExtensions.ClientArea, MouseWheelIn[bin][i]); break; case MouseNotificationKind.MouseClick: notification = new MouseClickNotification(position, MouseExtensions.ClientArea, GetMouseButtons(bin, i), Math.Max(ClickCountIn[bin][i], 1)); break; default: throw new NotImplementedException(); } if (notification != null) { subject.OnNext(notification); } } } }
public void Evaluate(int spreadMax) { var binCount = BinSizePin.IOObject.Length; FSubjects.ResizeAndDispose(binCount); KeyboardOut.ResizeAndDismiss(binCount, slice => new Keyboard(FSubjects[slice])); for (int bin = 0; bin < binCount; bin++) { var subject = FSubjects[bin]; var notificationCount = EventTypeIn[bin].SliceCount; for (int i = 0; i < notificationCount; i++) { KeyNotification notification; switch (EventTypeIn[bin][i]) { case KeyNotificationKind.KeyDown: notification = new KeyDownNotification((Keys)KeyCodeIn[bin][i], this); break; case KeyNotificationKind.KeyPress: var s = KeyCharIn[bin][i]; notification = s.Length > 0 ? new KeyPressNotification(s[0], this) : null; break; case KeyNotificationKind.KeyUp: notification = new KeyUpNotification((Keys)KeyCodeIn[bin][i], this); break; case KeyNotificationKind.DeviceLost: notification = new KeyboardLostNotification(this); break; default: throw new NotImplementedException(); } if (notification != null) { subject.OnNext(notification); } } } }
//called when data for any output pin is requested public void Evaluate(int spreadMax) { spreadMax = FDirectory.SliceCount .CombineWith(FFileMask) .CombineWith(FReload) .CombineWith(FBufferSize) .CombineSpreads(FPreloadFrames.SliceCount) .CombineSpreads(FVisibleFrameId.SliceCount); FPlayers.ResizeAndDispose(spreadMax, (int slice) => new Player(FDirectory[slice], FFileMask[slice], FMemoryPool, FLogger)); FFrameCount.SliceCount = spreadMax; FPreloaded.SliceCount = spreadMax; int texSliceCount = spreadMax.CombineSpreads(SpreadUtils.SpreadMax(FVisibleFrameId as System.Collections.Generic.IEnumerable <ISpread <int> >)); FTextureOutput.Resize(texSliceCount, () => new DX11Resource <DX11ResourceTexture2D>(), (t) => t.Dispose()); FWidth.SliceCount = texSliceCount; FHeight.SliceCount = texSliceCount; FLoaded.SliceCount = texSliceCount; FReadTime.SliceCount = texSliceCount; FDecodeTime.SliceCount = texSliceCount; FGPUTime.SliceCount = texSliceCount; for (int i = 0; i < spreadMax; i++) { if (FPlayers[i].DirectoryName != FDirectory[i] || FPlayers[i].FileMask != FFileMask[i] || FReload[i]) { FPlayers[i].Dispose(); FPlayers[i] = new Player(FDirectory[i], FFileMask[i], FMemoryPool, FLogger); } FPlayers[i].BufferSize = FBufferSize[i]; if (FPlayers[i].FrameCount > 0) { FPlayers[i].Preload(FPreloadFrames[i]); } FFrameCount[i] = FPlayers[i].FrameCount; FPreloaded[i].AssignFrom(FPlayers[i].Loaded); } }
//called when data for any output pin is requested public void Evaluate(int spreadMax) { spreadMax = SpreadUtils.SpreadMax(KeyboardIn, KeyMatchesIn); FSubscriptions.ResizeAndDispose( spreadMax, slice => { return(new Subscription <Keyboard, KeyDownNotification>( keyboard => keyboard.KeyNotifications.OfType <KeyDownNotification>(), (keyboard, n) => { var pressedKeyCode = n.KeyCode; var keyMatches = KeyMatchesIn[slice]; var output = Outputs[slice]; for (int i = 0; i < output.SliceCount; i++) { var keyCodes = keyMatches[i].ToKeyCodes(); var index = keyCodes.IndexOf(pressedKeyCode); if (index >= 0) { output[i] = index; } } }, FScheduler )); } ); Outputs.SliceCount = spreadMax; for (int i = 0; i < spreadMax; i++) { Outputs[i].SliceCount = KeyMatchesIn[i].SliceCount; FSubscriptions[i].Update(KeyboardIn[i]); } //process events FScheduler.Run(); }
public void Evaluate(int spreadMax) { FWebRenderers.ResizeAndDispose(spreadMax, (i) => new HTMLTextureRenderer(FLogger, FFrameRateIn[i])); FTextureOut.SliceCount = spreadMax; FRootElementOut.SliceCount = spreadMax; FDomOut.SliceCount = spreadMax; FDocumentWidthOut.SliceCount = spreadMax; FDocumentHeightOut.SliceCount = spreadMax; FIsLoadingOut.SliceCount = spreadMax; FLoadedOut.SliceCount = spreadMax; FErrorTextOut.SliceCount = spreadMax; FCurrentUrlOut.SliceCount = spreadMax; for (int i = 0; i < spreadMax; i++) { var webRenderer = FWebRenderers[i]; var frameRate = VMath.Clamp(FFrameRateIn[i], HTMLTextureRenderer.MIN_FRAME_RATE, HTMLTextureRenderer.MAX_FRAME_RATE); if (frameRate != webRenderer.FrameRate) { webRenderer.Dispose(); webRenderer = new HTMLTextureRenderer(FLogger, frameRate); FWebRenderers[i] = webRenderer; } // Check enabled state webRenderer.Enabled = FEnabledIn[i]; if (!webRenderer.Enabled) { continue; } // LoadUrl or LoadString LoadContent(webRenderer, new Size(FWidthIn[i], FHeightIn[i]), i); // Assign inputs webRenderer.ZoomLevel = FZoomLevelIn[i]; webRenderer.Mouse = FMouseIn[i]; webRenderer.Keyboard = FKeyboardIn[i]; webRenderer.ScrollTo = FScrollToIn[i]; if (FExecuteIn[i]) { webRenderer.ExecuteJavaScript(FJavaScriptIn[i]); } if (FUpdateDomIn[i]) { webRenderer.UpdateDom(); } if (FReloadIn[i]) { webRenderer.Reload(); } // Set outputs FErrorTextOut[i] = webRenderer.CurrentError; FIsLoadingOut[i] = webRenderer.IsLoading; FLoadedOut[i] = webRenderer.Loaded; // As long as the renderer is in the loading state stick to the old values if (!webRenderer.IsLoading) { if (FDomOut[i] != webRenderer.CurrentDom) { FDomOut[i] = webRenderer.CurrentDom; } var rootElement = webRenderer.CurrentDom != null ? webRenderer.CurrentDom.Root : null; if (FRootElementOut[i] != rootElement) { FRootElementOut[i] = rootElement; } var documentSize = webRenderer.DocumentSize; FDocumentWidthOut[i] = documentSize.Width; FDocumentHeightOut[i] = documentSize.Height; FCurrentUrlOut[i] = webRenderer.CurrentUrl; } } FTextureOut.MarkPinAsChanged(); }
public void Dispose() { FSubjects.ResizeAndDispose(0); }
public override bool Sync() { var nodeConnectionChanged = FAutoValidate ? FNodeIn.PinIsChanged : FNodeIn.Validate(); if (nodeConnectionChanged) { Length = FNodeIn.SliceCount; FRawMouseWheels.SliceCount = Length; FSubscriptions.ResizeAndDispose( Length, slice => { return(new Subscription <Mouse, MouseNotification>( mouse => mouse.MouseNotifications, (mouse, n) => { var position = new Vector2D(n.Position.X, n.Position.Y); var clientArea = new Vector2D(n.ClientArea.Width - 1, n.ClientArea.Height - 1); var normalizedPosition = VMath.Map(position, Vector2D.Zero, clientArea, new Vector2D(-1, 1), new Vector2D(1, -1), TMapMode.Float); var mouseState = this.Buffer[slice]; switch (n.Kind) { case MouseNotificationKind.MouseDown: var downNotification = n as MouseButtonNotification; mouseState = new MouseState(normalizedPosition.x, normalizedPosition.y, mouseState.Buttons | downNotification.Buttons, mouseState.MouseWheel); break; case MouseNotificationKind.MouseUp: var upNotification = n as MouseButtonNotification; mouseState = new MouseState(normalizedPosition.x, normalizedPosition.y, mouseState.Buttons & ~upNotification.Buttons, mouseState.MouseWheel); break; case MouseNotificationKind.MouseMove: mouseState = new MouseState(normalizedPosition.x, normalizedPosition.y, mouseState.Buttons, mouseState.MouseWheel); break; case MouseNotificationKind.MouseWheel: var wheelNotification = n as MouseWheelNotification; FRawMouseWheels[slice] += wheelNotification.WheelDelta; var wheel = (int)Math.Round((float)FRawMouseWheels[slice] / Const.WHEEL_DELTA); mouseState = new MouseState(normalizedPosition.x, normalizedPosition.y, mouseState.Buttons, wheel); break; } SetMouseState(slice, ref mouseState); } )); } ); object usI; FNodeIn.GetUpstreamInterface(out usI); var upstreamInterface = usI as IGenericIO; var emptyMouseState = new MouseState(); for (int i = 0; i < Length; i++) { int usS; var mouse = Mouse.Empty; if (upstreamInterface != null) { FNodeIn.GetUpsreamSlice(i, out usS); mouse = (Mouse)upstreamInterface.GetSlice(usS); } SetMouseState(i, ref emptyMouseState); FSubscriptions[i].Update(mouse); } } return(base.Sync()); }
public void Evaluate(int spreadMax) { PositionOut.SliceCount = spreadMax; MouseWheelOut.SliceCount = spreadMax; FRawMouseWheel.SliceCount = spreadMax; LeftButtonOut.SliceCount = spreadMax; MiddleButtonOut.SliceCount = spreadMax; RightButtonOut.SliceCount = spreadMax; X1ButtonOut.SliceCount = spreadMax; X2ButtonOut.SliceCount = spreadMax; FSubscriptions.ResizeAndDispose( spreadMax, slice => { // Reset states PositionOut[slice] = Vector2D.Zero; MouseWheelOut[slice] = 0; FRawMouseWheel[slice] = 0; LeftButtonOut[slice] = false; MiddleButtonOut[slice] = false; RightButtonOut[slice] = false; X1ButtonOut[slice] = false; X2ButtonOut[slice] = false; return(new Subscription2 <Mouse, MouseNotification>(m => m.MouseNotifications)); } ); for (int i = 0; i < spreadMax; i++) { var notifications = QueueModeIn[i] == QueueMode.Discard ? FSubscriptions[i].ConsumeAll(MouseIn[i]) : FSubscriptions[i].ConsumeNext(MouseIn[i]); foreach (var n in notifications) { switch (n.Kind) { case MouseNotificationKind.MouseDown: case MouseNotificationKind.MouseUp: var mouseButton = n as MouseButtonNotification; var isDown = n.Kind == MouseNotificationKind.MouseDown; if ((mouseButton.Buttons & MouseButtons.Left) > 0) { LeftButtonOut[i] = isDown; } if ((mouseButton.Buttons & MouseButtons.Middle) > 0) { MiddleButtonOut[i] = isDown; } if ((mouseButton.Buttons & MouseButtons.Right) > 0) { RightButtonOut[i] = isDown; } if ((mouseButton.Buttons & MouseButtons.XButton1) > 0) { X1ButtonOut[i] = isDown; } if ((mouseButton.Buttons & MouseButtons.XButton2) > 0) { X2ButtonOut[i] = isDown; } break; case MouseNotificationKind.MouseMove: PositionOut[i] = n.Position.FromMousePoint(n.ClientArea); break; case MouseNotificationKind.MouseWheel: var mouseWheel = n as MouseWheelNotification; FRawMouseWheel[i] += mouseWheel.WheelDelta; MouseWheelOut[i] = (int)Math.Round((float)FRawMouseWheel[i] / Const.WHEEL_DELTA); break; default: break; } } } }
public void Evaluate(int spreadMax) { FSubscriptions.ResizeAndDispose( spreadMax, i => { return(new Subscription <Mouse, MouseNotification>( k => k.MouseNotifications, (k, n) => { switch (n.Kind) { case MouseNotificationKind.MouseDown: var downNotification = n as MouseDownNotification; switch (downNotification.Buttons) { case System.Windows.Forms.MouseButtons.Left: InputSimulator.Mouse.LeftButtonDown(); break; case System.Windows.Forms.MouseButtons.Middle: // Function missing break; case System.Windows.Forms.MouseButtons.Right: InputSimulator.Mouse.RightButtonDown(); break; case System.Windows.Forms.MouseButtons.XButton1: InputSimulator.Mouse.XButtonDown(1); break; case System.Windows.Forms.MouseButtons.XButton2: InputSimulator.Mouse.XButtonDown(2); break; default: break; } break; case MouseNotificationKind.MouseUp: var upNotification = n as MouseUpNotification; switch (upNotification.Buttons) { case System.Windows.Forms.MouseButtons.Left: InputSimulator.Mouse.LeftButtonUp(); break; case System.Windows.Forms.MouseButtons.Middle: // Function missing break; case System.Windows.Forms.MouseButtons.Right: InputSimulator.Mouse.RightButtonUp(); break; case System.Windows.Forms.MouseButtons.XButton1: InputSimulator.Mouse.XButtonUp(1); break; case System.Windows.Forms.MouseButtons.XButton2: InputSimulator.Mouse.XButtonUp(2); break; default: break; } break; case MouseNotificationKind.MouseMove: double x = ((double)n.Position.X / n.ClientArea.Width) * ushort.MaxValue; double y = ((double)n.Position.Y / n.ClientArea.Height) * ushort.MaxValue; InputSimulator.Mouse.MoveMouseToPositionOnVirtualDesktop(x, y); break; case MouseNotificationKind.MouseWheel: var wheelNotification = n as MouseWheelNotification; InputSimulator.Mouse.VerticalScroll(wheelNotification.WheelDelta); break; default: break; } } )); } ); for (int i = 0; i < spreadMax; i++) { // Resubsribe if necessary FSubscriptions[i].Update(MouseIn[i]); } }
public void Evaluate(int spreadMax) { KeyNameOut.SliceCount = spreadMax; KeyCodeOut.SliceCount = spreadMax; KeyCharOut.SliceCount = spreadMax; FSchedulers.ResizeAndDismiss(spreadMax, () => new FrameBasedScheduler()); FSubscriptions.ResizeAndDispose( spreadMax, slice => { return(new Subscription <Keyboard, KeyNotification>( keyboard => { return keyboard.KeyNotifications .DistinctUntilChanged(new KeyNotificationComparer()); }, (keyboard, n) => { var keyCodeOut = KeyCodeOut[slice]; var keyNameOut = KeyNameOut[slice]; switch (n.Kind) { case KeyNotificationKind.KeyDown: var keyDown = n as KeyDownNotification; if (!keyCodeOut.Contains((int)keyDown.KeyCode)) { keyCodeOut.Add((int)keyDown.KeyCode); keyNameOut.Add(keyDown.KeyCode.ToString()); } break; case KeyNotificationKind.KeyPress: var keyPress = n as KeyPressNotification; KeyCharOut[slice] = new string(keyPress.KeyChar, 1); break; case KeyNotificationKind.KeyUp: var keyUp = n as KeyUpNotification; keyCodeOut.RemoveAll(k => k == (int)keyUp.KeyCode); keyNameOut.RemoveAll(k => k == keyUp.KeyCode.ToString()); KeyCharOut[slice] = string.Empty; break; default: throw new NotImplementedException(); } }, FSchedulers[slice] )); } ); for (int i = 0; i < spreadMax; i++) { //resubsribe if necessary FSubscriptions[i].Update(KeyboardIn[i]); //process events FSchedulers[i].Run(QueueModeIn[i]); } }
public void Resize(int sliceCount) { KeyMatches.ResizeAndDispose(sliceCount, slice => new KeyMatch(IOContainer.IOObject, KeyCode, slice, FScheduler)); IOContainer.IOObject.SliceCount = sliceCount; }
//called when data for any output pin is requested public void Evaluate(int SpreadMax) { FTextureOut.ResizeAndDispose(SpreadMax, CreateTextureResource); FBmpBuffer.ResizeAndDispose(SpreadMax, (t) => new Bitmap(FTextureOut[t].Metadata.Width, FTextureOut[t].Metadata.Height, PixelFormat.Format32bppArgb)); FScaleOutput.SliceCount = SpreadMax; FSizeOutput.SliceCount = SpreadMax; for (int i = 0; i < SpreadMax; i++) { var textureResource = FTextureOut[i]; textureResource.NeedsUpdate = false; var info = textureResource.Metadata; if (info.Width != FWidthIn[i] || info.Height != FHeightIn[i]) { textureResource.Dispose(); textureResource = CreateTextureResource(i); textureResource.NeedsUpdate = true; info = textureResource.Metadata; FBmpBuffer[i].Dispose(); FBmpBuffer[i] = new Bitmap(info.Width, info.Height, PixelFormat.Format32bppArgb); info.PropertiesChanged = true; } info.Text = FTextInput[i]; info.Font = FFontInput[i].Name; info.Italic = FItalicInput[i]; info.Bold = FBoldInput[i]; info.Size = FSizeInput[i]; info.Color = FColorInput[i]; info.Brush = FBrushColor[i]; info.ShowBrush = FShowBrush[i]; info.HAlign = FHorizontalAlignInput[i].Index; info.VAlign = FVerticalAlignInput[i].Index; info.RenderMode = FTextRenderingModeInput[i].Index; info.Normalize = FNormalizeInput[i].Index; if (info.PropertiesChanged) { info.PropertiesChanged = false; textureResource.NeedsUpdate = true; Graphics g = Graphics.FromImage(FBmpBuffer[i]); FontStyle style = FontStyle.Regular; if (info.Italic) { style |= FontStyle.Italic; } if (info.Bold) { style |= FontStyle.Bold; } System.Drawing.Font objFont = new System.Drawing.Font(info.Font, info.Size, style, GraphicsUnit.Pixel); string text = info.Text; int renderingMode = info.RenderMode; RectangleF layout = new RectangleF(0, 0, 0, 0); StringFormat format = new StringFormat(); if (!string.IsNullOrEmpty(text)) { switch (renderingMode) { case 0: text = text.Replace("\n", " ").Replace("\n", string.Empty); break; case 1: break; case 2: layout.Size = new SizeF(info.Width, info.Height); break; } format.LineAlignment = StringAlignment.Near; switch (info.HAlign) { case 0: format.Alignment = StringAlignment.Near; break; case 1: format.Alignment = StringAlignment.Center; layout.X = info.Width / 2; break; case 2: format.Alignment = StringAlignment.Far; layout.X = info.Width; break; } switch (info.VAlign) { case 0: format.LineAlignment = StringAlignment.Near; break; case 1: format.LineAlignment = StringAlignment.Center; layout.Y = info.Height / 2; break; case 2: format.LineAlignment = StringAlignment.Far; layout.Y = info.Height; break; } SizeF size = g.MeasureString(text, objFont, layout.Size, format); FSizeOutput[i] = new Vector2D(info.Width / size.Width, info.Height / size.Height); float scx = 1; float scy = 1; switch (info.Normalize) { case 0: break; case 1: scx = info.Width / size.Width; break; case 2: scy = info.Height / size.Height; break; case 3: scx = info.Width / size.Width; scy = info.Height / size.Height; break; } FScaleOutput[i] = new Vector2D(scx, scy); g.TranslateTransform(layout.X, layout.Y); g.ScaleTransform(scx, scy); g.TranslateTransform(-layout.X, -layout.Y); if (renderingMode == 2) { layout.Location = new PointF(0, 0); } } else { FScaleOutput[i] = new Vector2D(0, 0); } RGBAColor tmpBrush = info.Color; tmpBrush.A = 0; Color brush = tmpBrush.Color; if (info.ShowBrush) { brush = info.Brush.Color; } g.Clear(brush); g.SmoothingMode = SmoothingMode.AntiAlias; g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; g.DrawString(text, objFont, new SolidBrush(info.Color.Color), layout, format); g.Dispose(); } FTextureOut[i] = textureResource; } }
public void Evaluate(int spreadMax) { FWebRenderers.ResizeAndDispose(spreadMax, () => new HTMLTextureRenderer(FLogger)); FTextureOut.SliceCount = spreadMax; FRootElementOut.SliceCount = spreadMax; FDomOut.SliceCount = spreadMax; FIsLoadingOut.SliceCount = spreadMax; FErrorTextOut.SliceCount = spreadMax; FCurrentUrlOut.SliceCount = spreadMax; for (int i = 0; i < spreadMax; i++) { var webRenderer = FWebRenderers[i]; // Check enabled state webRenderer.Enabled = FEnabledIn[i]; if (!webRenderer.Enabled) { continue; } // LoadUrl or LoadString LoadContent(webRenderer, i); // Assign inputs webRenderer.Size = new Size(FWidthIn[i], FHeightIn[i]); webRenderer.ZoomLevel = FZoomLevelIn[i]; webRenderer.Mouse = FMouseIn[i]; webRenderer.Keyboard = FKeyboardIn[i]; webRenderer.ScrollTo = FScrollToIn[i]; if (FExecuteIn[i]) { webRenderer.ExecuteJavaScript(FJavaScriptIn[i]); } if (FUpdateDomIn[i]) { webRenderer.UpdateDom(); } if (FReloadIn[i]) { webRenderer.Reload(); } // Set outputs FTextureOut[i] = webRenderer.TextureResource; if (FDomOut[i] != webRenderer.CurrentDom) { FDomOut[i] = webRenderer.CurrentDom; } var rootElement = webRenderer.CurrentDom != null ? webRenderer.CurrentDom.Root : null; if (FRootElementOut[i] != rootElement) { FRootElementOut[i] = rootElement; } FIsLoadingOut[i] = webRenderer.IsLoading; FCurrentUrlOut[i] = webRenderer.CurrentUrl; FErrorTextOut[i] = webRenderer.CurrentError; } }
public void Evaluate(int spreadMax) { XOut.SliceCount = spreadMax; YOut.SliceCount = spreadMax; MouseWheelOut.SliceCount = spreadMax; FRawMouseWheel.SliceCount = spreadMax; LeftButtonOut.SliceCount = spreadMax; MiddleButtonOut.SliceCount = spreadMax; RightButtonOut.SliceCount = spreadMax; X1ButtonOut.SliceCount = spreadMax; X2ButtonOut.SliceCount = spreadMax; FSubscriptions.ResizeAndDispose( spreadMax, slice => { return(new Subscription <Mouse, MouseNotification>( mouse => mouse.MouseNotifications, (mouse, n) => { switch (n.Kind) { case MouseNotificationKind.MouseDown: case MouseNotificationKind.MouseUp: var mouseButton = n as MouseButtonNotification; var isDown = n.Kind == MouseNotificationKind.MouseDown; if ((mouseButton.Buttons & MouseButtons.Left) > 0) { LeftButtonOut[slice] = isDown; } if ((mouseButton.Buttons & MouseButtons.Middle) > 0) { MiddleButtonOut[slice] = isDown; } if ((mouseButton.Buttons & MouseButtons.Right) > 0) { RightButtonOut[slice] = isDown; } if ((mouseButton.Buttons & MouseButtons.XButton1) > 0) { X1ButtonOut[slice] = isDown; } if ((mouseButton.Buttons & MouseButtons.XButton2) > 0) { X2ButtonOut[slice] = isDown; } break; case MouseNotificationKind.MouseMove: var position = new Vector2D(n.Position.X, n.Position.Y); var clientArea = new Vector2D(n.ClientArea.Width - 1, n.ClientArea.Height - 1); var normalizedPosition = VMath.Map(position, Vector2D.Zero, clientArea, new Vector2D(-1, 1), new Vector2D(1, -1), TMapMode.Float); XOut[slice] = normalizedPosition.x; YOut[slice] = normalizedPosition.y; break; case MouseNotificationKind.MouseWheel: var mouseWheel = n as MouseWheelNotification; FRawMouseWheel[slice] += mouseWheel.WheelDelta; MouseWheelOut[slice] = (int)Math.Round((float)FRawMouseWheel[slice] / Const.WHEEL_DELTA); break; default: break; } } )); } ); for (int i = 0; i < spreadMax; i++) { FSubscriptions[i].Update(MouseIn[i]); } }
public void Evaluate(int spreadMax) { KeyNameOut.SliceCount = spreadMax; KeyCodeOut.SliceCount = spreadMax; KeyCharOut.SliceCount = spreadMax; FSubscriptions.ResizeAndDispose( spreadMax, slice => { return(new Subscription2 <Keyboard, KeyNotification>( keyboard => { return keyboard.KeyNotifications .DistinctUntilChanged(new KeyNotificationComparer()); } )); } ); for (int i = 0; i < spreadMax; i++) { var notifications = QueueModeIn[i] == QueueMode.Discard ? FSubscriptions[i].ConsumeAll(KeyboardIn[i]) : FSubscriptions[i].ConsumeNext(KeyboardIn[i]); foreach (var n in notifications) { var keyCodeOut = KeyCodeOut[i]; var keyNameOut = KeyNameOut[i]; switch (n.Kind) { case KeyNotificationKind.KeyDown: var keyDown = n as KeyDownNotification; if (!keyCodeOut.Contains((int)keyDown.KeyCode)) { keyCodeOut.Add((int)keyDown.KeyCode); keyNameOut.Add(keyDown.KeyCode.ToString()); } break; case KeyNotificationKind.KeyPress: var keyPress = n as KeyPressNotification; KeyCharOut[i] = new string(keyPress.KeyChar, 1); break; case KeyNotificationKind.KeyUp: var keyUp = n as KeyUpNotification; keyCodeOut.RemoveAll(k => k == (int)keyUp.KeyCode); keyNameOut.RemoveAll(k => k == keyUp.KeyCode.ToString()); KeyCharOut[i] = string.Empty; break; case KeyNotificationKind.DeviceLost: keyCodeOut.SliceCount = 0; keyNameOut.SliceCount = 0; KeyCharOut[i] = string.Empty; break; default: throw new NotImplementedException(); } } } }
public void Dispose() { FPorts.ResizeAndDispose(0); }
public void Evaluate(int spreadMax) { FWebRenderers.ResizeAndDispose(spreadMax, () => new HTMLTextureRenderer(FLogger)); FOutput.SliceCount = spreadMax; FRootElementOut.SliceCount = spreadMax; FDomOut.SliceCount = spreadMax; FIsLoadingOut.SliceCount = spreadMax; FErrorTextOut.SliceCount = spreadMax; FCurrentUrlOut.SliceCount = spreadMax; for (int i = 0; i < spreadMax; i++) { var webRenderer = FWebRenderers[i]; var reload = FReloadIn[i]; var width = FWidthIn[i]; var height = FHeightIn[i]; var zoomLevel = FZoomLevelIn[i]; var mouseEvent = FMouseEventIn[i]; var keyEvent = FKeyEventIn[i]; var scrollTo = FScrollToIn[i]; var javaScript = FJavaScriptIn[i]; var execute = FExecuteIn[i]; var enabled = FEnabledIn[i]; XDocument dom; XElement rootElement; bool isLoading; string currentUrl, errorText; var output = DoRenderCall( webRenderer, i, out dom, out rootElement, out isLoading, out currentUrl, out errorText, reload, width, height, zoomLevel, mouseEvent, keyEvent, scrollTo, javaScript, execute, enabled); if (FOutput[i] != output) { FOutput[i] = output; } if (FDomOut[i] != dom) { FDomOut[i] = dom; } if (FRootElementOut[i] != rootElement) { FRootElementOut[i] = rootElement; } FIsLoadingOut[i] = isLoading; if (FCurrentUrlOut[i] != currentUrl) { FCurrentUrlOut[i] = currentUrl; } if (FErrorTextOut[i] != errorText) { FErrorTextOut[i] = errorText; } } }