oh
oh
This commit is contained in:
parent
a836e54ccb
commit
ca32c2ce76
23
source/game/hash.c
Normal file
23
source/game/hash.c
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#include <iso646.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "fumotris.h"
|
||||||
|
|
||||||
|
typedef u32 hashtype;
|
||||||
|
|
||||||
|
hashtype Hash(void *item, size_t size)
|
||||||
|
{
|
||||||
|
u8 *data = (u8 *)item;
|
||||||
|
|
||||||
|
u32 h = 98317;
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
h ^= data[i];
|
||||||
|
h *= 0x5bd1e995;
|
||||||
|
h ^= h >> 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
12
source/game/hash.h
Normal file
12
source/game/hash.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#pragma once
|
||||||
|
#include <iso646.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "fumotris.h"
|
||||||
|
|
||||||
|
typedef u32 hashtype;
|
||||||
|
|
||||||
|
hashtype Hash(void *item, size_t size);
|
|
@ -8,6 +8,7 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "fumotris.h"
|
#include "fumotris.h"
|
||||||
|
#include "hash.h"
|
||||||
|
|
||||||
#define IO_BUF_SIZE 16
|
#define IO_BUF_SIZE 16
|
||||||
|
|
||||||
|
@ -19,24 +20,23 @@ enum InputType {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Button {
|
struct Button {
|
||||||
u32 value;
|
u64 value;
|
||||||
bool is_down;
|
} but;
|
||||||
bool is_held;
|
|
||||||
bool is_up;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Axis {
|
struct Axis {
|
||||||
i64 value;
|
i64 value;
|
||||||
};
|
} axis;
|
||||||
|
|
||||||
struct Joystick {
|
struct Joystick {
|
||||||
i32 x;
|
i32 x;
|
||||||
i32 y;
|
i32 y;
|
||||||
};
|
} js;
|
||||||
|
|
||||||
struct InputRecord {
|
struct InputRecord {
|
||||||
u16 bind;
|
u16f bind;
|
||||||
|
|
||||||
u8 type;
|
u8 type;
|
||||||
|
u8 is_down;
|
||||||
|
u8 is_held;
|
||||||
|
u8 is_up;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
struct Button but;
|
struct Button but;
|
||||||
|
@ -48,39 +48,12 @@ struct InputRecord {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InputAxis {
|
struct InputAxis {
|
||||||
u8 type;
|
struct input;
|
||||||
|
|
||||||
union {
|
|
||||||
struct Button but;
|
|
||||||
struct Axis axis;
|
|
||||||
struct Joystick js;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct timespec last_pressed;
|
struct timespec last_pressed;
|
||||||
struct timespec last_released;
|
struct timespec last_released;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef u32 hashtype;
|
|
||||||
hashtype Hash(void *item, size_t size)
|
|
||||||
{
|
|
||||||
u8 *data = (u8 *)item;
|
|
||||||
|
|
||||||
u32 h = 98317;
|
|
||||||
for (size_t i = 0; i < size; i++) {
|
|
||||||
h ^= data[i];
|
|
||||||
h *= 0x5bd1e995;
|
|
||||||
h ^= h >> 15;
|
|
||||||
}
|
|
||||||
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
hashtype hash_id(u16f value, u8f type)
|
|
||||||
{
|
|
||||||
struct { u16 id; u8 type; } id = { value, type };
|
|
||||||
return Hash(&id, sizeof(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ctrl_dict {
|
struct ctrl_dict {
|
||||||
size_t capacity;
|
size_t capacity;
|
||||||
size_t filled;
|
size_t filled;
|
||||||
|
@ -99,9 +72,10 @@ struct Controller {
|
||||||
struct ctrl_dict binds;
|
struct ctrl_dict binds;
|
||||||
struct InputAxis *axes;
|
struct InputAxis *axes;
|
||||||
|
|
||||||
struct {
|
struct InputBuffer {
|
||||||
struct InputRecord records[IO_BUF_SIZE];
|
struct InputRecord records[IO_BUF_SIZE];
|
||||||
size_t len;
|
size_t len;
|
||||||
|
size_t start;
|
||||||
} input_buf;
|
} input_buf;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
@ -138,6 +112,7 @@ bool NewCtrl(struct Controller *ctrl, size_t code_cap, size_t bind_cap)
|
||||||
|
|
||||||
.input_buf = {
|
.input_buf = {
|
||||||
.len = 0,
|
.len = 0,
|
||||||
|
.start = 0,
|
||||||
},
|
},
|
||||||
.pending_buf = {
|
.pending_buf = {
|
||||||
.len = 0,
|
.len = 0,
|
||||||
|
@ -170,6 +145,12 @@ size_t wrap_index(size_t i, size_t max)
|
||||||
return i % (SIZE_MAX - max + 1);
|
return i % (SIZE_MAX - max + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hashtype hash_id(u16f value, u8f type)
|
||||||
|
{
|
||||||
|
struct { u16 id; u8 type; } id = { value, type };
|
||||||
|
return Hash(&id, sizeof(id));
|
||||||
|
}
|
||||||
|
|
||||||
bool find_or_set(struct ctrl_dict *dict, struct ctrl_bkt **out, u16f value, u8f type)
|
bool find_or_set(struct ctrl_dict *dict, struct ctrl_bkt **out, u16f value, u8f type)
|
||||||
{
|
{
|
||||||
hashtype hash = hash_id(value, type);
|
hashtype hash = hash_id(value, type);
|
||||||
|
|
|
@ -94,9 +94,10 @@ struct Controller {
|
||||||
struct ctrl_dict binds;
|
struct ctrl_dict binds;
|
||||||
struct InputAxis *axes;
|
struct InputAxis *axes;
|
||||||
|
|
||||||
struct {
|
struct InputBuffer {
|
||||||
struct InputRecord records[IO_BUF_SIZE];
|
struct InputRecord records[IO_BUF_SIZE];
|
||||||
size_t len;
|
size_t len;
|
||||||
|
size_t start;
|
||||||
} input_buf;
|
} input_buf;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
|
@ -12,32 +12,45 @@
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct Input {
|
||||||
|
struct Controller ctrl;
|
||||||
|
|
||||||
|
pthread_t thread;
|
||||||
|
pthread_mutex_t access_mutex;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InputRecord *get_at(struct InputBuffer *buf, size_t i)
|
||||||
|
{
|
||||||
|
return &buf->records[(buf->start + i) % IO_BUF_SIZE];
|
||||||
|
}
|
||||||
|
|
||||||
void *block_input(void *args_ptr)
|
void *block_input(void *args_ptr)
|
||||||
{
|
{
|
||||||
struct RecordBuffer *rec_buf = args_ptr;
|
struct Input *in = args_ptr;
|
||||||
|
struct InputBuffer tmp_buf = { .len = 0 };
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
bool success;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
success = WindowsBlockInput(rec_buf);
|
if (!WindowsReadInputBuffer(&tmp_buf))
|
||||||
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!success) {
|
pthread_mutex_lock(&in->access_mutex);
|
||||||
printf("winfail");
|
for (size_t i = 0; i < tmp_buf.len; i++) {
|
||||||
exit(1);
|
*get_at(&in->ctrl.input_buf, i) = *get_at();
|
||||||
}
|
}
|
||||||
|
pthread_mutex_unlock(&in->access_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartInput(struct Controller *ctrl)
|
bool StartInput(struct Input *in)
|
||||||
{
|
{
|
||||||
pthread_create(&ctrl->thread, nullptr, block_input, &ctrl->buf);
|
return pthread_create(&in->thread, nullptr, block_input, in) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JoinInput(struct Controller *ctrl)
|
bool JoinInput(struct Input *in)
|
||||||
{
|
{
|
||||||
pthread_join(ctrl->thread, nullptr);
|
return pthread_join(in->thread, nullptr) == 0;
|
||||||
}
|
}
|
|
@ -8,6 +8,13 @@
|
||||||
#include "ctrl.h"
|
#include "ctrl.h"
|
||||||
#include "fumotris.h"
|
#include "fumotris.h"
|
||||||
|
|
||||||
void StartInput(struct Controller *ctrl);
|
struct Input {
|
||||||
|
struct Controller ctrl;
|
||||||
|
|
||||||
void JoinInput(struct Controller *ctrl);
|
pthread_t thread;
|
||||||
|
pthread_mutex_t access_mutex;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool StartInput(struct Input *in);
|
||||||
|
|
||||||
|
bool JoinInput(struct Input *in);
|
|
@ -67,8 +67,8 @@ void set_key_record(struct InputRecord *rec, KEY_EVENT_RECORD win_key)
|
||||||
rec->type = KEY;
|
rec->type = KEY;
|
||||||
rec->bind = win_key.wVirtualKeyCode;
|
rec->bind = win_key.wVirtualKeyCode;
|
||||||
|
|
||||||
rec->button.is_down = win_key.bKeyDown;
|
rec->but.is_down = win_key.bKeyDown;
|
||||||
rec->button.is_up = !win_key.bKeyDown;
|
rec->but.is_up = !win_key.bKeyDown;
|
||||||
|
|
||||||
if (win_key.wVirtualKeyCode == VK_ESCAPE)
|
if (win_key.wVirtualKeyCode == VK_ESCAPE)
|
||||||
rec->type = ESCAPE;
|
rec->type = ESCAPE;
|
||||||
|
@ -90,8 +90,8 @@ bool set_mouse_record(struct InputRecord *rec, MOUSE_EVENT_RECORD win_mouse)
|
||||||
case MOUSE_MOVED:
|
case MOUSE_MOVED:
|
||||||
rec->type = JOYSTICK;
|
rec->type = JOYSTICK;
|
||||||
rec->bind = 0;
|
rec->bind = 0;
|
||||||
rec->joystick.x = win_mouse.dwMousePosition.X;
|
rec->js.x = win_mouse.dwMousePosition.X;
|
||||||
rec->joystick.y = win_mouse.dwMousePosition.Y;
|
rec->js.y = win_mouse.dwMousePosition.Y;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@ -116,9 +116,9 @@ bool dispatch_record(struct InputRecord *rec, INPUT_RECORD win_rec)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WinBlockInput(struct RecordBuffer *buf)
|
bool WinBlockInput(struct Controller *ctrl)
|
||||||
{
|
{
|
||||||
size_t win_size = IO_BUF_SIZE - buf->count;
|
size_t win_size = IO_BUF_SIZE - ctrl->input_buf.len;
|
||||||
INPUT_RECORD win_buf[win_size];
|
INPUT_RECORD win_buf[win_size];
|
||||||
DWORD count;
|
DWORD count;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue