public InputFrameState UpdateAndGetInputFrameStates(float dt) { this.time += dt; this.currentIndex++; if (this.currentIndex < this.demo.records.Count) { var record = this.demo.records[this.currentIndex]; var result = record.BuildInputFrameState(); LatestFrameState = result; return(result); } else { // Unpress any pressed buttons (this doesn't work because it doesn't work that way, we need to discover pressed keys some other way) var result = new InputFrameState( new KeyboardFrameState(Array.Empty <Keys>(), LatestFrameState.keyboardFrameState.Pressed, ModifierKeys.NoModifiers) , new MouseFrameState( new MouseButtonList(), new MouseButtonList(LatestFrameState.mouseFrameState.ButtonsPressedThisFrame .EncodedInt), LatestFrameState.mouseFrameState.RawWindowPosition, Vector2.Zero, 0)); LatestFrameState = result; return(result); } }
public void PollHumanInput(InputFrameState inputFrameState) { // InputFrameState is such an inconvenient structure :( foreach (var pressedButton in inputFrameState.keyboardFrameState.Pressed) { if (pressedButton == Keys.Escape) { SkipToEnd(); } } }
public DemoSerializableEntry(float time, InputFrameState inputState) { this.time = time; this.mouseX = inputState.mouseFrameState.RawWindowPosition.X; this.mouseY = inputState.mouseFrameState.RawWindowPosition.Y; this.mouseButtonsPressedAsInt = inputState.mouseFrameState.ButtonsPressedThisFrame.EncodedInt; this.mouseButtonsReleasedAsInt = inputState.mouseFrameState.ButtonsReleasedThisFrame.EncodedInt; this.scrollDelta = inputState.mouseFrameState.ScrollDelta; this.mouseDeltaX = inputState.mouseFrameState.PositionDelta.X; this.mouseDeltaY = inputState.mouseFrameState.PositionDelta.Y; this.pressedKeys = inputState.keyboardFrameState.Pressed ?? Array.Empty <Keys>(); this.releasedKeys = inputState.keyboardFrameState.Released ?? Array.Empty <Keys>(); this.keyboardModifiersAsInt = inputState.keyboardFrameState.Modifiers.EncodedInt; }
public void Update(float dt, Matrix mouseTransformMatrix, InputFrameState inputFrameState, bool allowMouseUpdate = true, bool allowKeyboardEvents = true) { #if DEBUG #else try { #endif if (!this.hasDoneFirstUpdate) { DoFirstUpdate(); this.hasDoneFirstUpdate = true; } CurrentInputFrameState = inputFrameState; var scenes = AllScenes(); var rawMousePos = Vector2.Transform(inputFrameState.mouseFrameState.RawWindowPosition.ToVector2(), mouseTransformMatrix); foreach (var scene in scenes) { scene.FlushBuffers(); if (!scene.IsFrozen) { if (allowKeyboardEvents) { if (this.pendingTextInput.HasValue) { scene.OnTextInput(this.pendingTextInput.Value); } foreach (var key in inputFrameState.keyboardFrameState.Released) { scene.OnKey(key, ButtonState.Released, inputFrameState.keyboardFrameState.Modifiers); } foreach (var key in inputFrameState.keyboardFrameState.Pressed) { scene.OnKey(key, ButtonState.Pressed, inputFrameState.keyboardFrameState.Modifiers); } } if (allowMouseUpdate) { if (inputFrameState.mouseFrameState.ScrollDelta != 0) { scene.OnScroll(inputFrameState.mouseFrameState.ScrollDelta); } // Pressed if (inputFrameState.mouseFrameState.ButtonsPressedThisFrame.left) { scene.OnMouseButton(MouseButton.Left, rawMousePos, ButtonState.Pressed); } if (inputFrameState.mouseFrameState.ButtonsPressedThisFrame.middle) { scene.OnMouseButton(MouseButton.Middle, rawMousePos, ButtonState.Pressed); } if (inputFrameState.mouseFrameState.ButtonsPressedThisFrame.right) { scene.OnMouseButton(MouseButton.Right, rawMousePos, ButtonState.Pressed); } // Released if (inputFrameState.mouseFrameState.ButtonsReleasedThisFrame.left) { scene.OnMouseButton(MouseButton.Left, rawMousePos, ButtonState.Released); } if (inputFrameState.mouseFrameState.ButtonsReleasedThisFrame.middle) { scene.OnMouseButton(MouseButton.Middle, rawMousePos, ButtonState.Released); } if (inputFrameState.mouseFrameState.ButtonsReleasedThisFrame.right) { scene.OnMouseButton(MouseButton.Right, rawMousePos, ButtonState.Released); } // At this point the raw and processed deltas are equal, downstream (Scene and below) they will differ scene.OnMouseUpdate(rawMousePos, inputFrameState.mouseFrameState.PositionDelta, inputFrameState.mouseFrameState.PositionDelta); } } } this.pendingTextInput = null; foreach (var scene in scenes) { if (!scene.frameStep.IsPaused && !scene.IsFrozen) { scene.Update(dt); } } HitTestResult.ApproveTopCandidate(scenes); #if DEBUG #else } catch (System.Exception exception) { MachinaClient.Print("caught exception"); OnError?.Invoke(exception); } #endif }
public void Update(float dt, InputFrameState input) { Update(dt, Matrix.Identity, input); }
public void AddEntry(float dt, InputFrameState inputState) { this.totalTime += dt; this.demo.Append(new DemoSerializableEntry(this.totalTime, inputState)); }