Remove input dependency on GLFW in game code
Create own platform abstraction for keyboard input for use in game code.
This commit is contained in:
parent
523fe0f2b1
commit
aa505ed0b3
Binary file not shown.
@ -432,6 +432,7 @@ void debug_drawUi(GameState *state, f32 dt)
|
|||||||
DEBUG_PUSH_VAR("FreeEntityIndex: %d", world->freeEntityIndex, "i32");
|
DEBUG_PUSH_VAR("FreeEntityIndex: %d", world->freeEntityIndex, "i32");
|
||||||
DEBUG_PUSH_VAR("glDrawArray Calls: %d",
|
DEBUG_PUSH_VAR("glDrawArray Calls: %d",
|
||||||
GLOBAL_debug.callCount[debugcallcount_drawArrays], "i32");
|
GLOBAL_debug.callCount[debugcallcount_drawArrays], "i32");
|
||||||
|
DEBUG_PUSH_VAR("Mouse Pos: %06.2f, %06.2f", state->input.mouse, "v2");
|
||||||
|
|
||||||
i32 debug_bAllocated = state->arena.bytesAllocated;
|
i32 debug_bAllocated = state->arena.bytesAllocated;
|
||||||
DEBUG_PUSH_VAR("TotalMemoryAllocated: %db", debug_bAllocated, "i32");
|
DEBUG_PUSH_VAR("TotalMemoryAllocated: %db", debug_bAllocated, "i32");
|
||||||
|
@ -34,7 +34,6 @@ typedef struct EventQueue
|
|||||||
i32 numEvents;
|
i32 numEvents;
|
||||||
} EventQueue;
|
} EventQueue;
|
||||||
|
|
||||||
|
|
||||||
INTERNAL Entity *getHeroEntity(World *world)
|
INTERNAL Entity *getHeroEntity(World *world)
|
||||||
{
|
{
|
||||||
Entity *result = &world->entities[entity_getIndex(world, world->heroId)];
|
Entity *result = &world->entities[entity_getIndex(world, world->heroId)];
|
||||||
@ -376,24 +375,24 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
|
|||||||
// if a button ended down
|
// if a button ended down
|
||||||
LOCAL_PERSIST b32 spaceBarWasDown = FALSE;
|
LOCAL_PERSIST b32 spaceBarWasDown = FALSE;
|
||||||
|
|
||||||
if (state->keys[GLFW_KEY_RIGHT])
|
if (state->input.right)
|
||||||
{
|
{
|
||||||
ddPos.x = 1.0f;
|
ddPos.x = 1.0f;
|
||||||
hero->direction = direction_east;
|
hero->direction = direction_east;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state->keys[GLFW_KEY_LEFT])
|
if (state->input.left)
|
||||||
{
|
{
|
||||||
ddPos.x = -1.0f;
|
ddPos.x = -1.0f;
|
||||||
hero->direction = direction_west;
|
hero->direction = direction_west;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state->keys[GLFW_KEY_UP])
|
if (state->input.up)
|
||||||
{
|
{
|
||||||
ddPos.y = 1.0f;
|
ddPos.y = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state->keys[GLFW_KEY_DOWN])
|
if (state->input.down)
|
||||||
{
|
{
|
||||||
ddPos.y = -1.0f;
|
ddPos.y = -1.0f;
|
||||||
}
|
}
|
||||||
@ -409,7 +408,7 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
|
|||||||
|
|
||||||
LOCAL_PERSIST b32 toggleFlag = TRUE;
|
LOCAL_PERSIST b32 toggleFlag = TRUE;
|
||||||
// TODO(doyle): Revisit key input with state checking for last ended down
|
// TODO(doyle): Revisit key input with state checking for last ended down
|
||||||
if (state->keys[GLFW_KEY_SPACE] && spaceBarWasDown == FALSE)
|
if (state->input.space && spaceBarWasDown == FALSE)
|
||||||
{
|
{
|
||||||
Renderer *renderer = &state->renderer;
|
Renderer *renderer = &state->renderer;
|
||||||
f32 yPos = CAST(f32)(rand() % CAST(i32)renderer->size.h);
|
f32 yPos = CAST(f32)(rand() % CAST(i32)renderer->size.h);
|
||||||
@ -420,7 +419,7 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
|
|||||||
pos);
|
pos);
|
||||||
spaceBarWasDown = TRUE;
|
spaceBarWasDown = TRUE;
|
||||||
}
|
}
|
||||||
else if (!state->keys[GLFW_KEY_SPACE])
|
else if (!state->input.space)
|
||||||
{
|
{
|
||||||
spaceBarWasDown = FALSE;
|
spaceBarWasDown = FALSE;
|
||||||
}
|
}
|
||||||
@ -445,7 +444,7 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
f32 heroSpeed = 6.2f * METERS_TO_PIXEL;
|
f32 heroSpeed = 6.2f * METERS_TO_PIXEL;
|
||||||
if (state->keys[GLFW_KEY_LEFT_SHIFT])
|
if (state->input.leftShift)
|
||||||
heroSpeed = CAST(f32)(22.0f * 10.0f * METERS_TO_PIXEL);
|
heroSpeed = CAST(f32)(22.0f * 10.0f * METERS_TO_PIXEL);
|
||||||
|
|
||||||
ddPos = v2_scale(ddPos, heroSpeed);
|
ddPos = v2_scale(ddPos, heroSpeed);
|
||||||
@ -877,6 +876,7 @@ INTERNAL void sortWorldEntityList(World *world, i32 numDeadEntities)
|
|||||||
world->freeEntityIndex -= numDeadEntities;
|
world->freeEntityIndex -= numDeadEntities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UiState uiState = {0};
|
||||||
void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
|
void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
|
||||||
{
|
{
|
||||||
if (dt >= 1.0f) dt = 1.0f;
|
if (dt >= 1.0f) dt = 1.0f;
|
||||||
|
@ -5,7 +5,14 @@
|
|||||||
#include "Dengine/OpenGL.h"
|
#include "Dengine/OpenGL.h"
|
||||||
#include "Dengine/WorldTraveller.h"
|
#include "Dengine/WorldTraveller.h"
|
||||||
|
|
||||||
void key_callback(GLFWwindow *window, int key, int scancode, int action, int mode)
|
INTERNAL inline void processKey(b32 *currState, int key, int action)
|
||||||
|
{
|
||||||
|
if (action == GLFW_PRESS) *currState = TRUE;
|
||||||
|
else if (action == GLFW_RELEASE) *currState = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL void keyCallback(GLFWwindow *window, int key, int scancode, int action,
|
||||||
|
int mode)
|
||||||
{
|
{
|
||||||
GameState *game = CAST(GameState *)(glfwGetWindowUserPointer(window));
|
GameState *game = CAST(GameState *)(glfwGetWindowUserPointer(window));
|
||||||
|
|
||||||
@ -14,20 +21,61 @@ void key_callback(GLFWwindow *window, int key, int scancode, int action, int mod
|
|||||||
glfwSetWindowShouldClose(window, GL_TRUE);
|
glfwSetWindowShouldClose(window, GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key >= 0 && key < NUM_KEYS)
|
switch (key)
|
||||||
{
|
{
|
||||||
if (action == GLFW_PRESS)
|
case GLFW_KEY_UP:
|
||||||
game->keys[key] = TRUE;
|
processKey(&game->input.up, key, action);
|
||||||
else if (action == GLFW_RELEASE)
|
break;
|
||||||
game->keys[key] = FALSE;
|
case GLFW_KEY_DOWN:
|
||||||
|
processKey(&game->input.down, key, action);
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_LEFT:
|
||||||
|
processKey(&game->input.left, key, action);
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_RIGHT:
|
||||||
|
processKey(&game->input.right, key, action);
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_SPACE:
|
||||||
|
processKey(&game->input.space, key, action);
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_LEFT_SHIFT:
|
||||||
|
processKey(&game->input.leftShift, key, action);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mouse_callback(GLFWwindow *window, double xPos, double yPos) {}
|
INTERNAL void mouseCallback(GLFWwindow *window, double xPos, double yPos)
|
||||||
|
{
|
||||||
|
GameState *game = CAST(GameState *)(glfwGetWindowUserPointer(window));
|
||||||
|
|
||||||
void scroll_callback(GLFWwindow *window, double xOffset, double yOffset) {}
|
// NOTE(doyle): x(0), y(0) of mouse starts from the top left of window
|
||||||
|
v2 windowSize = game->renderer.size;
|
||||||
|
f32 flipYPos = windowSize.h - CAST(f32) yPos;
|
||||||
|
game->input.mouse = V2(CAST(f32) xPos, flipYPos);
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
INTERNAL void mouseButtonCallback(GLFWwindow *window, int button, int action,
|
||||||
|
int mods)
|
||||||
|
{
|
||||||
|
GameState *game = CAST(GameState *)(glfwGetWindowUserPointer(window));
|
||||||
|
|
||||||
|
switch(button)
|
||||||
|
{
|
||||||
|
case GLFW_MOUSE_BUTTON_LEFT:
|
||||||
|
processKey(&game->input.mouseLeft, button, action);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL void scrollCallback(GLFWwindow *window, double xOffset, double yOffset)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
i32 main(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
**************************
|
**************************
|
||||||
@ -75,11 +123,12 @@ int main()
|
|||||||
glfwGetFramebufferSize(window, &frameBufferWidth, &frameBufferHeight);
|
glfwGetFramebufferSize(window, &frameBufferWidth, &frameBufferHeight);
|
||||||
glViewport(0, 0, frameBufferWidth, frameBufferHeight);
|
glViewport(0, 0, frameBufferWidth, frameBufferHeight);
|
||||||
|
|
||||||
glfwSetKeyCallback(window, key_callback);
|
glfwSetKeyCallback(window, keyCallback);
|
||||||
glfwSetCursorPosCallback(window, mouse_callback);
|
glfwSetCursorPosCallback(window, mouseCallback);
|
||||||
glfwSetScrollCallback(window, scroll_callback);
|
glfwSetMouseButtonCallback(window, mouseButtonCallback);
|
||||||
|
glfwSetScrollCallback(window, scrollCallback);
|
||||||
|
|
||||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
|
@ -2,10 +2,41 @@
|
|||||||
#define DENGINE_PLATFORM_H
|
#define DENGINE_PLATFORM_H
|
||||||
|
|
||||||
#include "Dengine/Common.h"
|
#include "Dengine/Common.h"
|
||||||
|
#include "Dengine/Math.h"
|
||||||
|
|
||||||
/* Forward Declaration */
|
/* Forward Declaration */
|
||||||
typedef struct MemoryArena MemoryArena;
|
typedef struct MemoryArena MemoryArena;
|
||||||
|
|
||||||
|
enum KeyCodes
|
||||||
|
{
|
||||||
|
keycode_up,
|
||||||
|
keycode_down,
|
||||||
|
keycode_left,
|
||||||
|
keycode_right,
|
||||||
|
keycode_space,
|
||||||
|
keycode_mouseLeft,
|
||||||
|
keycode_count,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct KeyInput
|
||||||
|
{
|
||||||
|
v2 mouse;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
b32 keys[keycode_count - 1];
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
b32 up;
|
||||||
|
b32 down;
|
||||||
|
b32 left;
|
||||||
|
b32 right;
|
||||||
|
b32 space;
|
||||||
|
b32 leftShift;
|
||||||
|
b32 mouseLeft;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} KeyInput;
|
||||||
|
|
||||||
typedef struct PlatformFileRead
|
typedef struct PlatformFileRead
|
||||||
{
|
{
|
||||||
void *buffer;
|
void *buffer;
|
||||||
|
@ -7,11 +7,18 @@
|
|||||||
#include "Dengine/Entity.h"
|
#include "Dengine/Entity.h"
|
||||||
#include "Dengine/Math.h"
|
#include "Dengine/Math.h"
|
||||||
#include "Dengine/MemoryArena.h"
|
#include "Dengine/MemoryArena.h"
|
||||||
|
#include "Dengine/Platform.h"
|
||||||
#include "Dengine/Renderer.h"
|
#include "Dengine/Renderer.h"
|
||||||
|
|
||||||
#define NUM_KEYS 1024
|
#define NUM_KEYS 1024
|
||||||
#define METERS_TO_PIXEL 240
|
#define METERS_TO_PIXEL 240
|
||||||
|
|
||||||
|
typedef struct UiState
|
||||||
|
{
|
||||||
|
i32 hotItem;
|
||||||
|
i32 activeItem;
|
||||||
|
} UiState;
|
||||||
|
|
||||||
typedef struct World
|
typedef struct World
|
||||||
{
|
{
|
||||||
Entity *entities;
|
Entity *entities;
|
||||||
@ -34,7 +41,8 @@ typedef struct World
|
|||||||
typedef struct GameState
|
typedef struct GameState
|
||||||
{
|
{
|
||||||
enum State state;
|
enum State state;
|
||||||
b32 keys[NUM_KEYS];
|
KeyInput input;
|
||||||
|
v2 mouse;
|
||||||
|
|
||||||
Renderer renderer;
|
Renderer renderer;
|
||||||
|
|
||||||
@ -45,6 +53,7 @@ typedef struct GameState
|
|||||||
AssetManager assetManager;
|
AssetManager assetManager;
|
||||||
AudioManager audioManager;
|
AudioManager audioManager;
|
||||||
MemoryArena arena;
|
MemoryArena arena;
|
||||||
|
UiState uiState;
|
||||||
} GameState;
|
} GameState;
|
||||||
|
|
||||||
void worldTraveller_gameInit(GameState *state, v2 windowSize);
|
void worldTraveller_gameInit(GameState *state, v2 windowSize);
|
||||||
|
Loading…
Reference in New Issue
Block a user