carb/input/IInput.h
File members: carb/input/IInput.h
// Copyright (c) 2018-2024, NVIDIA CORPORATION. All rights reserved.
//
// NVIDIA CORPORATION and its licensors retain all intellectual property
// and proprietary rights in and to this software, related documentation
// and any modifications thereto. Any use, reproduction, disclosure or
// distribution of this software and related documentation without an express
// license agreement from NVIDIA CORPORATION is strictly prohibited.
//
#pragma once
#include "../Interface.h"
#include "InputTypes.h"
namespace carb
{
namespace input
{
struct InputProvider;
class ActionMappingSet DOXYGEN_EMPTY_CLASS;
using ActionMappingSetHandle = ActionMappingSet*;
#ifndef DOXYGEN_BUILD
enum class LockType : uint8_t
{
eRead,
eUnlockRead,
eWrite,
eUnlockWrite,
};
#endif
struct IInput
{
CARB_PLUGIN_INTERFACE("carb::input::IInput", 1, 2)
InputProvider*(CARB_ABI* getInputProvider)();
void(CARB_ABI* startup)();
void(CARB_ABI* shutdown)();
const char*(CARB_ABI* getKeyboardName)(Keyboard* keyboard);
SubscriptionId(CARB_ABI* subscribeToKeyboardEvents)(Keyboard* keyboard, OnKeyboardEventFn fn, void* userData);
void(CARB_ABI* unsubscribeToKeyboardEvents)(Keyboard* keyboard, SubscriptionId id);
float(CARB_ABI* getKeyboardValue)(Keyboard* keyboard, KeyboardInput input);
ButtonFlags(CARB_ABI* getKeyboardButtonFlags)(Keyboard* keyboard, KeyboardInput input);
const char*(CARB_ABI* getMouseName)(Mouse* mouse);
float(CARB_ABI* getMouseValue)(Mouse* mouse, MouseInput input);
ButtonFlags(CARB_ABI* getMouseButtonFlags)(Mouse* mouse, MouseInput input);
Float2(CARB_ABI* getMouseCoordsNormalized)(Mouse* mouse);
Float2(CARB_ABI* getMouseCoordsPixel)(Mouse* mouse);
SubscriptionId(CARB_ABI* subscribeToMouseEvents)(Mouse* mouse, OnMouseEventFn fn, void* userData);
void(CARB_ABI* unsubscribeToMouseEvents)(Mouse* mouse, SubscriptionId id);
const char*(CARB_ABI* getGamepadName)(Gamepad* gamepad);
const char*(CARB_ABI* getGamepadGuid)(Gamepad* gamepad);
float(CARB_ABI* getGamepadValue)(Gamepad* gamepad, GamepadInput input);
ButtonFlags(CARB_ABI* getGamepadButtonFlags)(Gamepad* gamepad, GamepadInput input);
SubscriptionId(CARB_ABI* subscribeToGamepadEvents)(Gamepad* gamepad, OnGamepadEventFn fn, void* userData);
void(CARB_ABI* unsubscribeToGamepadEvents)(Gamepad* gamepad, SubscriptionId id);
SubscriptionId(CARB_ABI* subscribeToGamepadConnectionEvents)(OnGamepadConnectionEventFn fn, void* userData);
void(CARB_ABI* unsubscribeToGamepadConnectionEvents)(SubscriptionId id);
void(CARB_ABI* distributeBufferedEvents)();
ActionMappingSetHandle(CARB_ABI* createActionMappingSet)(const char* settingsPath);
ActionMappingSetHandle(CARB_ABI* getActionMappingSetByPath)(const char* settingsPath);
void(CARB_ABI* destroyActionMappingSet)(ActionMappingSetHandle actionMappingSet);
size_t(CARB_ABI* getActionCount)(const ActionMappingSetHandle actionMappingSet);
const char* const*(CARB_ABI* getActions)(const ActionMappingSetHandle actionMappingSet);
size_t(CARB_ABI* addActionMapping)(ActionMappingSetHandle actionMappingSet,
const char* actionName,
const ActionMappingDesc& desc);
void(CARB_ABI* setActionMapping)(ActionMappingSetHandle actionMappingSet,
const char* actionName,
size_t index,
const ActionMappingDesc& desc);
void(CARB_ABI* removeActionMapping)(ActionMappingSetHandle actionMappingSet, const char* actionName, size_t index);
void(CARB_ABI* clearActionMappings)(ActionMappingSetHandle actionMappingSet, const char* actionName);
size_t(CARB_ABI* getActionMappingCount)(const ActionMappingSetHandle actionMappingSet, const char* actionName);
const ActionMappingDesc*(CARB_ABI* getActionMappings)(const ActionMappingSetHandle actionMappingSet,
const char* actionName);
float(CARB_ABI* getActionValue)(const ActionMappingSetHandle actionMappingSet, const char* actionName);
ButtonFlags(CARB_ABI* getActionButtonFlags)(const ActionMappingSetHandle actionMappingSet, const char* actionName);
SubscriptionId(CARB_ABI* subscribeToActionEvents)(ActionMappingSetHandle actionMappingSet,
const char* actionName,
OnActionEventFn fn,
void* userData);
void(CARB_ABI* unsubscribeToActionEvents)(SubscriptionId id);
void(CARB_ABI* filterBufferedEvents)(InputEventFilterFn fn, void* userData);
const char*(CARB_ABI* getDeviceName)(InputDevice* device);
DeviceType(CARB_ABI* getDeviceType)(InputDevice* device);
SubscriptionId(CARB_ABI* internalSubscribeToInputEvents)(
InputDevice* device, EventTypeMask events, OnInputEventFn fn, void* userData, SubscriptionOrder order);
SubscriptionId subscribeToInputEvents(InputDevice* device,
EventTypeMask events,
OnInputEventFn fn,
void* userData,
SubscriptionOrder order = kSubscriptionOrderDefault)
{
return internalSubscribeToInputEvents(device, events, fn, userData, order);
}
void(CARB_ABI* unsubscribeToInputEvents)(SubscriptionId id);
KeyboardModifierFlags(CARB_ABI* getModifierFlags)(KeyboardModifierFlags modifierFlags,
const InputDevice* const* devices,
size_t nDevices,
const DeviceType* const deviceTypes,
size_t nDeviceTypes,
const MouseInput* mouseButtons,
size_t numMouseButtons);
KeyboardModifierFlags(CARB_ABI* getGlobalModifierFlags)(KeyboardModifierFlags modifierFlags,
const MouseInput* mouseButtons,
size_t numMouseButtons);
void(CARB_ABI* internalLock)(ActionMappingSetHandle, LockType type);
};
class ScopedRead
{
public:
ScopedRead(IInput* iface, const ActionMappingSetHandle set)
: m_iface(iface), m_set(const_cast<ActionMappingSetHandle>(set))
{
m_iface->internalLock(m_set, LockType::eRead);
}
~ScopedRead()
{
m_iface->internalLock(m_set, LockType::eUnlockRead);
}
ScopedRead(ScopedRead&& other) : m_iface(other.m_iface), m_set(std::exchange(other.m_set, nullptr))
{
}
ScopedRead& operator=(ScopedRead&& other)
{
std::swap(m_iface, other.m_iface);
std::swap(m_set, other.m_set);
return *this;
}
CARB_PREVENT_COPY(ScopedRead);
private:
IInput* m_iface;
ActionMappingSetHandle m_set;
};
class ScopedWrite
{
public:
ScopedWrite(IInput* iface, ActionMappingSetHandle set) : m_iface(iface), m_set(set)
{
m_iface->internalLock(m_set, LockType::eRead);
}
~ScopedWrite()
{
m_iface->internalLock(m_set, LockType::eUnlockRead);
}
ScopedWrite(ScopedWrite&& other) : m_iface(other.m_iface), m_set(std::exchange(other.m_set, nullptr))
{
}
ScopedWrite& operator=(ScopedWrite&& other)
{
std::swap(m_iface, other.m_iface);
std::swap(m_set, other.m_set);
return *this;
}
CARB_PREVENT_COPY(ScopedWrite);
private:
IInput* m_iface;
ActionMappingSetHandle m_set;
};
} // namespace input
} // namespace carb