blob: 77c779efbd9fde79e9e056d11c797a800547a26f [file] [log] [blame]
/*
* Copyright (C) 2021 Igalia, S.L.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* aint with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#if ENABLE(WEBXR) && USE(OPENXR)
#include "OpenXRInputMappings.h"
#include "OpenXRUtils.h"
#include <wtf/Noncopyable.h>
#include <wtf/Vector.h>
namespace PlatformXR {
class OpenXRInputSource {
WTF_MAKE_FAST_ALLOCATED;
WTF_MAKE_NONCOPYABLE(OpenXRInputSource);
public:
using SuggestedBindings = HashMap<const char*, Vector<XrActionSuggestedBinding>>;
static std::unique_ptr<OpenXRInputSource> create(XrInstance, XrSession, XRHandedness, InputSourceHandle);
~OpenXRInputSource();
XrResult suggestBindings(SuggestedBindings&) const;
std::optional<Device::FrameData::InputSource> getInputSource(XrSpace, const XrFrameState&) const;
XrActionSet actionSet() const { return m_actionSet; }
XrResult updateInteractionProfile();
private:
OpenXRInputSource(XrInstance, XrSession, XRHandedness, InputSourceHandle);
struct OpenXRButtonActions {
XrAction press { XR_NULL_HANDLE };
XrAction touch { XR_NULL_HANDLE };
XrAction value { XR_NULL_HANDLE };
};
XrResult initialize();
XrResult createSpaceAction(XrAction, XrSpace&) const;
XrResult createAction(XrActionType, const String& name, XrAction&) const;
XrResult createButtonActions(OpenXRButtonType, const String& prefix, OpenXRButtonActions&) const;
XrResult createBinding(const char* profilePath, XrAction, const String& bindingPath, SuggestedBindings&) const;
XrResult getPose(XrSpace, XrSpace, const XrFrameState&, Device::FrameData::InputSourcePose&) const;
std::optional<Device::FrameData::InputSourceButton> getButton(OpenXRButtonType) const;
std::optional<XrVector2f> getAxis(OpenXRAxisType) const;
XrResult getActionState(XrAction, bool*) const;
XrResult getActionState(XrAction, float*) const;
XrResult getActionState(XrAction, XrVector2f*) const;
XrInstance m_instance { XR_NULL_HANDLE };
XrSession m_session { XR_NULL_HANDLE };
XRHandedness m_handeness { XRHandedness::Left };
InputSourceHandle m_handle { 0 };
String m_subactionPathName;
XrPath m_subactionPath { XR_NULL_PATH };
XrActionSet m_actionSet { XR_NULL_HANDLE };
XrAction m_gripAction { XR_NULL_HANDLE };
XrSpace m_gripSpace { XR_NULL_HANDLE };
XrAction m_pointerAction { XR_NULL_HANDLE };
XrSpace m_pointerSpace { XR_NULL_HANDLE };
using OpenXRButtonActionsMap = HashMap<OpenXRButtonType, OpenXRButtonActions, IntHash<OpenXRButtonType>, WTF::StrongEnumHashTraits<OpenXRButtonType>>;
OpenXRButtonActionsMap m_buttonActions;
using OpenXRAxesMap = HashMap<OpenXRAxisType, XrAction, IntHash<OpenXRAxisType>, WTF::StrongEnumHashTraits<OpenXRAxisType>>;
OpenXRAxesMap m_axisActions;
Vector<String> m_profiles;
};
} // namespace PlatformXR
#endif // ENABLE(WEBXR) && USE(OPENXR)