prosperon/source/engine/input.c

243 lines
5 KiB
C
Raw Normal View History

2021-11-30 21:29:18 -06:00
#include "input.h"
2022-08-26 09:19:17 -05:00
#include <stdio.h>
#include "script.h"
2022-08-26 09:19:17 -05:00
#include "stb_ds.h"
#include "log.h"
2021-11-30 21:29:18 -06:00
int32_t mouseWheelX = 0;
int32_t mouseWheelY = 0;
int ychange = 0;
int xchange = 0;
float deltaT = 0;
2021-11-30 21:29:18 -06:00
2022-02-06 10:14:57 -06:00
static double c_xpos;
static double c_ypos;
2022-08-26 09:19:17 -05:00
static int *downkeys = NULL;
2022-08-12 14:03:56 -05:00
static int mquit = 0;
2023-01-10 14:02:24 -06:00
static void **pawns = NULL;
2022-12-19 18:15:38 -06:00
2023-01-10 14:02:24 -06:00
void set_pawn(void *pawn) {
arrput(pawns, pawn);
}
void remove_pawn(void *pawn) {
for (int i = 0; i < arrlen(pawns); i++) {
if (pawns[i] == pawn) {
pawns[i] = NULL;
return;
}
}
2022-12-19 18:15:38 -06:00
}
2022-02-06 10:14:57 -06:00
static void cursor_pos_cb(GLFWwindow *w, double xpos, double ypos)
{
xchange = (int)xpos - c_xpos;
ychange = (int)ypos - c_ypos;
c_xpos = xpos;
c_ypos = ypos;
}
static void scroll_cb(GLFWwindow *w, double xoffset, double yoffset)
{
mouseWheelY = yoffset;
mouseWheelX = xoffset;
}
void input_init()
{
glfwSetCursorPosCallback(mainwin->window, cursor_pos_cb);
glfwSetScrollCallback(mainwin->window, scroll_cb);
2022-08-12 14:03:56 -05:00
}
2022-12-20 08:16:26 -06:00
void call_input_signal(char *signal) {
for (int i = arrlen(pawns)-1; i >= 0; i--) {
if (pawns[i] == NULL) arrdel(pawns, i);
}
for (int i = 0; i < arrlen(pawns); i++) {
2022-12-20 08:16:26 -06:00
script_eval_w_env(signal, pawns[i]);
}
2022-12-20 08:16:26 -06:00
}
2022-12-22 16:58:06 -06:00
const char *keyname_extd(int key, int scancode) {
char keybuf[50];
const char *kkey = glfwGetKeyName(key, scancode);
2022-12-22 16:58:06 -06:00
if (kkey) return kkey;
if (key > 289 && key < 302) {
sprintf(keybuf, "f%d", key-289);
2022-12-22 16:58:06 -06:00
return keybuf;
} else {
switch(key) {
case GLFW_KEY_ENTER:
kkey = "enter";
break;
case GLFW_KEY_ESCAPE:
kkey = "escape";
break;
case GLFW_KEY_TAB:
kkey = "tab";
break;
case GLFW_KEY_RIGHT:
kkey = "right";
break;
case GLFW_KEY_LEFT:
kkey = "left";
break;
case GLFW_KEY_UP:
kkey = "up";
break;
case GLFW_KEY_DOWN:
kkey = "down";
break;
case GLFW_KEY_LEFT_SHIFT:
kkey = "lshift";
break;
case GLFW_KEY_RIGHT_SHIFT:
kkey = "rshift";
break;
case GLFW_KEY_LEFT_CONTROL:
kkey = "lctrl";
break;
case GLFW_KEY_LEFT_ALT:
kkey = "lalt";
break;
case GLFW_KEY_RIGHT_CONTROL:
kkey = "rctrl";
break;
case GLFW_KEY_RIGHT_ALT:
kkey= "ralt";
break;
}
2022-12-22 16:58:06 -06:00
if (kkey) return kkey;
}
2022-12-22 16:58:06 -06:00
return "NULL";
}
2022-12-22 16:58:06 -06:00
void call_input_down(int *key) {
char keystr[50] = {'\0'};
snprintf(keystr, 50, "input_%s_down", keyname_extd(*key, 0));
call_input_signal(keystr);
}
/* This is called once every frame - or more if we want it more! */
void input_poll(double wait)
{
ychange = 0;
xchange = 0;
mouseWheelX = 0;
mouseWheelY = 0;
glfwWaitEventsTimeout(wait);
//editor_input(&e);
for (int i = 0; i < arrlen(downkeys); i++)
call_input_down(&downkeys[i]);
}
void win_key_callback(GLFWwindow *w, int key, int scancode, int action, int mods)
{
char keystr[50] = {'\0'};
const char *kkey = keyname_extd(key, scancode);
2022-08-12 14:03:56 -05:00
switch (action) {
case GLFW_PRESS:
2022-12-22 16:58:06 -06:00
snprintf(keystr, 50, "input_%s_pressed", kkey);
2022-08-26 09:19:17 -05:00
int found = 0;
for (int i = 0; i < arrlen(downkeys); i++) {
if (downkeys[i] == key)
goto SCRIPTCALL;
2022-08-12 14:03:56 -05:00
}
2022-08-26 09:19:17 -05:00
arrput(downkeys, key);
2022-08-12 14:03:56 -05:00
break;
case GLFW_RELEASE:
2022-12-22 16:58:06 -06:00
snprintf(keystr, 50, "input_%s_released", kkey);
2022-08-26 09:19:17 -05:00
for (int i = 0; i < arrlen(downkeys); i++) {
if (downkeys[i] == key) {
arrdelswap(downkeys, i);
goto SCRIPTCALL;
}
2022-08-12 14:03:56 -05:00
}
2022-08-26 09:19:17 -05:00
2022-08-12 14:03:56 -05:00
break;
case GLFW_REPEAT:
2022-12-22 16:58:06 -06:00
snprintf(keystr, 50, "input_%s_rep", kkey);
2022-08-12 14:03:56 -05:00
break;
}
2022-08-26 09:19:17 -05:00
SCRIPTCALL:
2022-12-20 08:16:26 -06:00
call_input_signal(keystr);
2022-02-06 10:14:57 -06:00
}
2021-11-30 21:29:18 -06:00
2022-02-06 10:14:57 -06:00
void cursor_hide()
{
glfwSetInputMode(mainwin->window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
2022-02-06 10:14:57 -06:00
}
2021-11-30 21:29:18 -06:00
2022-02-06 10:14:57 -06:00
void cursor_show()
{
glfwSetInputMode(mainwin->window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
}
2021-11-30 21:29:18 -06:00
2022-02-06 10:14:57 -06:00
int action_down(int scancode)
{
2022-08-26 09:19:17 -05:00
for (int i = 0; i < arrlen(downkeys); i++) {
if (downkeys[i] == scancode)
return 1;
}
return 0;
2021-11-30 21:29:18 -06:00
}
2022-08-12 14:03:56 -05:00
int action_up(int scancode)
{
2022-08-26 09:19:17 -05:00
int found = 0;
for (int i = 0; i < arrlen(downkeys); i++) {
if (downkeys[i] == scancode) {
found = 1;
break;
}
}
return !found;
}
int want_quit() {
return mquit;
}
void quit() {
YughInfo("Exiting game.");
mquit = 1;
}