#pragma once #if defined(VIRTUAL_GAMEPAD) && !defined(USE_SDL1) #include #include "controls/controller_buttons.h" #include "engine/circle.hpp" #include "engine/point.hpp" #include "engine/rectangle.hpp" namespace devilution { struct VirtualDirectionPad { Circle area; Point position; bool isUpPressed; bool isDownPressed; bool isLeftPressed; bool isRightPressed; VirtualDirectionPad() : area({ { 0, 0 }, 0 }) , position({ 0, 0 }) , isUpPressed(false) , isDownPressed(false) , isLeftPressed(false) , isRightPressed(false) { } void UpdatePosition(Point touchCoordinates); }; struct VirtualButton { bool isHeld; bool didStateChange; std::function isUsable; VirtualButton() : isHeld(false) , didStateChange(false) , isUsable([]() { return true; }) { } virtual bool Contains(Point point) = 0; }; struct VirtualMenuButton : VirtualButton { Rectangle area; VirtualMenuButton() : area({ { 0, 0 }, { 0, 0 } }) { } bool Contains(Point point) override { return area.Contains(point); } }; struct VirtualPadButton : VirtualButton { Circle area; VirtualPadButton() : area({ { 0, 0 }, 0 }) { } bool Contains(Point point) override { return area.Contains(point); } }; struct VirtualMenuPanel { VirtualMenuButton charButton; VirtualMenuButton questsButton; VirtualMenuButton inventoryButton; VirtualMenuButton mapButton; Rectangle area; VirtualMenuPanel() : area({ { 0, 0 }, { 0, 0 } }) { } }; struct VirtualGamepad { VirtualMenuPanel menuPanel; VirtualDirectionPad directionPad; VirtualPadButton standButton; VirtualPadButton primaryActionButton; VirtualPadButton secondaryActionButton; VirtualPadButton spellActionButton; VirtualPadButton cancelButton; VirtualPadButton healthButton; VirtualPadButton manaButton; VirtualGamepad() { } }; void InitializeVirtualGamepad(); extern VirtualGamepad VirtualGamepadState; } // namespace devilution #endif