public void Events_EventBuffer_CanIterateEvents() { var gamepad = InputSystem.AddDevice <Gamepad>(); unsafe { InputEventPtr eventPtr; using (StateEvent.From(gamepad, out eventPtr)) using (var buffer = new InputEventBuffer(eventPtr, 1)) { Assert.That(buffer.eventCount, Is.EqualTo(1)); Assert.That(buffer.sizeInBytes, Is.EqualTo(InputEventBuffer.kBufferSizeUnknown)); Assert.That(buffer.capacityInBytes, Is.Zero); Assert.That(buffer.bufferPtr, Is.EqualTo(eventPtr)); var events = buffer.ToArray(); Assert.That(events, Has.Length.EqualTo(1)); Assert.That(events[0], Is.EqualTo(eventPtr)); } } }
public void Events_EventBuffer_CanAddEvents() { var gamepad = InputSystem.AddDevice <Gamepad>(); unsafe { using (StateEvent.From(gamepad, out var eventPtr)) using (var buffer = new InputEventBuffer()) { // Write two events into buffer. gamepad.leftStick.WriteValueIntoEvent(Vector2.one, eventPtr); eventPtr.id = 111; eventPtr.time = 123; eventPtr.handled = false; buffer.AppendEvent(eventPtr); gamepad.leftStick.WriteValueIntoEvent(Vector2.zero, eventPtr); eventPtr.id = 222; eventPtr.time = 234; eventPtr.handled = true; buffer.AppendEvent(eventPtr); Assert.That(buffer.eventCount, Is.EqualTo(2)); var events = buffer.ToArray(); Assert.That(events, Has.Length.EqualTo(2)); Assert.That(events[0].type, Is.EqualTo(new FourCC(StateEvent.Type))); Assert.That(events[1].type, Is.EqualTo(new FourCC(StateEvent.Type))); Assert.That(events[0].time, Is.EqualTo(123).Within(0.00001)); Assert.That(events[1].time, Is.EqualTo(234).Within(0.00001)); Assert.That(events[0].id, Is.EqualTo(111)); Assert.That(events[1].id, Is.EqualTo(222)); Assert.That(events[0].handled, Is.False); Assert.That(events[1].handled, Is.True); Assert.That(events[0].deviceId, Is.EqualTo(gamepad.id)); Assert.That(events[1].deviceId, Is.EqualTo(gamepad.id)); Assert.That(InputControlExtensions.ReadUnprocessedValueFromEvent(gamepad.leftStick, events[0]), Is.EqualTo(Vector2.one)); Assert.That(InputControlExtensions.ReadUnprocessedValueFromEvent(gamepad.leftStick, events[1]), Is.EqualTo(Vector2.zero)); } } }
public unsafe void Update(InputUpdateType type) { if (!onShouldRunUpdate.Invoke(type)) { return; } lock (m_Lock) { if (m_NewDeviceDiscoveries != null && m_NewDeviceDiscoveries.Count > 0) { if (onDeviceDiscovered != null) { foreach (var entry in m_NewDeviceDiscoveries) { onDeviceDiscovered(entry.Key, entry.Value); } } m_NewDeviceDiscoveries.Clear(); } onBeforeUpdate?.Invoke(type); // Advance time *after* onBeforeUpdate so that events generated from onBeforeUpdate // don't get bumped into the following update. if (type == InputUpdateType.Dynamic) { currentTime += advanceTimeEachDynamicUpdate; } if (onUpdate != null) { var buffer = new InputEventBuffer( (InputEvent *)NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(m_EventBuffer), m_EventCount, m_EventWritePosition, m_EventBuffer.Length); onUpdate(type, ref buffer); #if UNITY_2019_1_OR_NEWER m_EventCount = buffer.eventCount; m_EventWritePosition = (int)buffer.sizeInBytes; if (NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(buffer.data) != NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(m_EventBuffer)) { m_EventBuffer = buffer.data; } #else if (type != InputUpdateType.BeforeRender) { m_EventCount = 0; m_EventWritePosition = 0; } #endif } else { m_EventCount = 0; m_EventWritePosition = 0; } ++frameCount; } }
public unsafe void Update(InputUpdateType type) { if (!onShouldRunUpdate.Invoke(type)) { return; } lock (m_Lock) { if (type == InputUpdateType.Dynamic && !dontAdvanceUnscaledGameTimeNextDynamicUpdate) { unscaledGameTime += 1 / 30f; dontAdvanceUnscaledGameTimeNextDynamicUpdate = false; } if (m_NewDeviceDiscoveries != null && m_NewDeviceDiscoveries.Count > 0) { if (onDeviceDiscovered != null) { foreach (var entry in m_NewDeviceDiscoveries) { onDeviceDiscovered(entry.Key, entry.Value); } } m_NewDeviceDiscoveries.Clear(); } onBeforeUpdate?.Invoke(type); // Advance time *after* onBeforeUpdate so that events generated from onBeforeUpdate // don't get bumped into the following update. if (type == InputUpdateType.Dynamic && !dontAdvanceTimeNextDynamicUpdate) { currentTime += advanceTimeEachDynamicUpdate; dontAdvanceTimeNextDynamicUpdate = false; } if (onUpdate != null) { var buffer = new InputEventBuffer( (InputEvent *)NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(m_EventBuffer), m_EventCount, m_EventWritePosition, m_EventBuffer.Length); try { onUpdate(type, ref buffer); } catch (Exception e) { // Same order as in NativeInputRuntime Debug.LogException(e); Debug.LogError($"{e.GetType().Name} during event processing of {type} update; resetting event buffer"); // Rethrow exception for test runtime to enable us to assert against it in tests. m_EventCount = 0; m_EventWritePosition = 0; throw; } m_EventCount = buffer.eventCount; m_EventWritePosition = (int)buffer.sizeInBytes; if (NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(buffer.data) != NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(m_EventBuffer)) { m_EventBuffer = buffer.data; } } else { m_EventCount = 0; m_EventWritePosition = 0; } } }