Files
OpenVulkano/openVulkanoCpp/Input/Touch/InputDeviceTouch.hpp
2024-11-04 22:52:05 +02:00

90 lines
3.2 KiB
C++

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#pragma once
#include "Touch.hpp"
#include "GestureProcessor.hpp"
#include "Input/InputDevice.hpp"
#include "Base/Event.hpp"
#include "GestureInfos.hpp"
#include <mutex>
#include <vector>
namespace OpenVulkano::Input
{
class InputDeviceTouch final : public InputDevice
{
GestureProcessor m_gestureProcessor;
std::vector<Touch> m_touches;
TouchId m_nextId = 0;
bool m_multiTouch = false;
uint8_t m_pressedButtons = 0, m_lastPressedButtons = 0, m_toBePressedButtons = 0;
float m_axes[InputKey::Touch::Axis::AXIS_LAST + 1] = { 0 };
Math::Vector2f m_lastTap{}, m_nextTap{};
PinchInfo m_lastPinchInfo, m_nextPinchInfo;
PanInfo m_lastPanInfo, m_nextPanInfo, m_last2FPanInfo, m_next2FPanInfo;
decltype(m_touches)::iterator FindTouch(TouchId id);
[[nodiscard]] bool GetLastButton(InputKey::Touch::Button button) const
{
return m_lastPressedButtons & (1 << button);
}
public:
InputDeviceTouch() = default;
void Init();
void Tick() final;
TouchId AddTouch(const Math::Vector2f& position);
void TouchDown(TouchId id);
void TouchUp(TouchId id);
void TouchMoved(TouchId id, const Math::Vector2f& position);
void RemoveTouch(TouchId id);
void UpdatePinchStarted(const Gesture* pinch, const PinchInfo &info);
void UpdatePinchMoved(const Gesture* pinch, const PinchInfo &info);
void UpdatePanStarted(const Gesture* pan, const PanInfo &info);
void UpdatePanMoved(const Gesture* pan, const PanInfo &info);
void UpdatePanTwoFingersStarted(const Gesture* pan, const PanInfo &info);
void UpdatePanTwoFingersMoved(const Gesture* pan, const PanInfo &info);
void UpdateTap(const Gesture* tap, const TapInfo &info);
[[nodiscard]] float ReadAxis(int16_t key) const override {return GetAxis( static_cast<InputKey::Touch::Axis>(key)); }
[[nodiscard]] bool ReadButton(int16_t key) const override { return GetButton(static_cast<InputKey::Touch::Button>(key)); }
[[nodiscard]] bool ReadButtonUp(int16_t key) const override { return GetButtonUp(static_cast<InputKey::Touch::Button>(key)); }
[[nodiscard]] bool ReadButtonDown(int16_t key) const override { return GetButtonDown(static_cast<InputKey::Touch::Button>(key)); }
[[nodiscard]] const Math::Vector2f& GetTapPosition() const { return m_nextTap; }
[[nodiscard]] float GetAxis(const InputKey::Touch::Axis axis) const { return m_axes[axis]; }
[[nodiscard]] bool GetButton(const InputKey::Touch::Button button) const
{
return m_pressedButtons & (1 << button);
}
[[nodiscard]] bool GetButtonUp(const InputKey::Touch::Button button) const
{
return !GetButton(button) && GetLastButton(button);
}
[[nodiscard]] bool GetButtonDown(const InputKey::Touch::Button button) const
{
return GetButton(button) && !GetLastButton(button);
}
[[nodiscard]] bool HasTouch() const { return !m_touches.empty(); }
[[nodiscard]] bool IsMultiTouch() const { return m_multiTouch; }
Event<Touch&> OnTouchAdded, OnTouchDown, OnTouchUp, OnTouchMoved, OnTouchRemoved;
Event<Math::Vector2i> OnTap;
};
}