Ejemplo n.º 1
0
    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));
                }
        }
    }
Ejemplo n.º 2
0
    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));
                }
        }
    }
Ejemplo n.º 3
0
        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;
            }
        }
Ejemplo n.º 4
0
        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;
                }
            }
        }