示例#1
0
        //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;
            }
        }
示例#2
0
        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);
        }
示例#4
0
        //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]);
            }
        }
示例#5
0
        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;
            }
        }
示例#6
0
        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());
        }
示例#7
0
        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));
     });
 }
示例#9
0
        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);
                //}
            }
        }
示例#10
0
        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);
        }
示例#11
0
 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));
     }
         );
 }
示例#12
0
        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]);
            }
        }
示例#13
0
        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);
                    }
                }
            }
        }
示例#14
0
        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);
            }
        }
示例#16
0
        //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();
        }
示例#17
0
        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();
        }
示例#18
0
 public void Dispose()
 {
     FSubjects.ResizeAndDispose(0);
 }
示例#19
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());
        }
示例#20
0
        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;
                    }
                }
            }
        }
示例#21
0
        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]);
            }
        }
示例#22
0
        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]);
            }
        }
示例#23
0
 public void Resize(int sliceCount)
 {
     KeyMatches.ResizeAndDispose(sliceCount, slice => new KeyMatch(IOContainer.IOObject, KeyCode, slice, FScheduler));
     IOContainer.IOObject.SliceCount = sliceCount;
 }
示例#24
0
        //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;
            }
        }
示例#25
0
        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;
            }
        }
示例#26
0
        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]);
            }
        }
示例#27
0
        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();
                    }
                }
            }
        }
示例#28
0
 public void Dispose()
 {
     FPorts.ResizeAndDispose(0);
 }
示例#29
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;
                }
            }
        }