File InputContext.h
File List > engine > include > InputContext.h
Go to the documentation of this file
#ifndef INPUTCONTEXT_H
#define INPUTCONTEXT_H
#include "DynArray.h"
#include <stdbool.h>
#include "HandleDefs.h"
#define KEYSTROKE_LEFT 263
#define KEYSTROKE_RIGHT 262
#define KEYSTROKE_UP 265
#define KEYSTROKE_DOWN 264
#define KEYSTROKE_BACKSPACE 259
#define KEYSTROKE_ENTER 257
typedef enum
{
Axis,
Button
}InputMappingType;
typedef enum
{
MouseButton,
KeyboardButton,
GamepadButton,
MouseScrollButton,
UnknownButton
}ButtonSubType;
typedef enum
{
MouseAxis,
GamePadAxis,
MouseScrollAxis,
UnknownAxis
}AxisSubType;
typedef enum
{
gpAxis_LStick,
gpAxis_RStick,
gpAxis_LT,
gpAxis_RT
}ControllerAxisType;
typedef enum
{
Axis_X,
Axis_Y
} WhichAxis;
typedef enum
{
Axis_Pos,
Axis_Neg
} WhichDirection;
typedef struct InputMapping
{
InputMappingType type;
char* name;
union
{
struct
{
ButtonSubType type;
bool bCurrent;
bool bPressThisFrame;
bool bReleaseThisFrame;
union
{
struct
{
int keyboadCode;
}keyboard;
struct
{
int button;
}mouseBtn;
struct
{
int button;
}gamepadBtn;
struct
{
WhichAxis axis;
WhichDirection dir;
}mouseScrollButton;
}data;
// in future, game pad for example
}ButtonMapping;
struct
{
AxisSubType type;
double fCurrent;
union
{
struct
{
WhichAxis axis;
}mouse;
struct
{
ControllerAxisType type;
WhichAxis axis;
}controller;
struct
{
WhichAxis axis;
}mouseScroll;
}data;
}axisMapping;
}data;
}InputMapping;
#define MAX_MAPPINGS 64
typedef struct
{
InputMapping arr[MAX_MAPPINGS];
int size;
u64 ActiveMask;
}InputMappingArray;
#define MAX_KEYS_DOWN_PER_FRAME 256
struct TextInputState
{
int keystrokes[MAX_KEYS_DOWN_PER_FRAME];
int nKeystrokesThisFrame;
bool capslockModifier;
bool shiftModifier;
};
typedef struct InputContext
{
/*InputMapping AxisMappings[MAX_MAPPINGS];
InputMapping ButtonMapping[MAX_MAPPINGS];*/
struct
{
InputMappingArray MouseButtonMappings;
InputMappingArray KeyboardButtonMappings;
InputMappingArray GamepadMappings;
InputMappingArray MouseScrollButtonMappings;
}buttonMappings;
struct
{
InputMappingArray Mouse;
InputMappingArray Controller;
InputMappingArray MouseScroll;
}axisMappings;
struct TextInputState textInput;
int screenW, screenH;
}InputContext;
/*
Called by the glfw callbacks
*/
void In_RecieveKeyboardKey(InputContext* context, int key, int scancode, int action, int mods);
void In_RecieveMouseMove(InputContext* context, double xposIn, double yposIn);
void In_RecieveMouseButton(InputContext* context, int button, int action, int mods);
void In_FramebufferResize(InputContext* context, int width, int height);
void In_RecieveScroll(InputContext* context, double xoffset, double yoffset);
void In_SetControllerPresent(int controllerNo);
/*
Called by the game framework
*/
void In_EndFrame(InputContext* context);
InputContext In_InitInputContext();
/*
Called by game code and/or "game layer" level code
*/
struct AxisBinding
{
AxisSubType type;
int index;
};
struct ButtonBinding
{
ButtonSubType type;
int index;
};
struct AxisBinding In_FindAxisMapping(InputContext* context, const char* name);
struct ButtonBinding In_FindButtonMapping(InputContext* context, const char* name);
float In_GetAxisValue(InputContext* context, struct AxisBinding binding);
bool In_GetButtonValue(InputContext* context, struct ButtonBinding binding);
bool In_GetButtonPressThisFrame(InputContext* context, struct ButtonBinding binding);
bool In_GetButtonReleaseThisFrame(InputContext* context, struct ButtonBinding binding);
struct ActiveInputBindingsMask
{
u64 MouseButtonMappings;
u64 KeyboardButtonMappings;
u64 GamepadButtonMappings;
u64 MouseScrollButtonMappings;
u64 MouseAxisMappings;
u64 ControllerAxisMappings;
u64 MouseScrollAxisMappings;
};
void In_GetMask(struct ActiveInputBindingsMask* pOutMask, InputContext* pCtx);
void In_SetMask(struct ActiveInputBindingsMask* mask, InputContext* pCtx);
void In_ActivateButtonBinding(struct ButtonBinding binding, struct ActiveInputBindingsMask* pMask);
void In_ActivateAxisBinding(struct AxisBinding binding, struct ActiveInputBindingsMask* pMask);
void In_DeactivateButtonBinding(struct ButtonBinding binding, struct ActiveInputBindingsMask* pMask);
void In_DeactivateAxisBinding(struct AxisBinding binding, struct ActiveInputBindingsMask* pMask);
#endif // !INPUTCONTEXT_H