From 5feb20b352499437648caa21efd7aecfef2a0b58 Mon Sep 17 00:00:00 2001
From: Julia <145168563+julia-aph@users.noreply.github.com>
Date: Thu, 18 Apr 2024 16:20:44 -0500
Subject: [PATCH] time, c things
just learned you don't need to include everything all the damn time
---
Fumofumotris.code-workspace | 63 +++++++++++
hi.exe | Bin 66475 -> 65675 bytes
source/game/gametime.c | 10 +-
source/game/gametime.h | 7 +-
source/io/ctrl.c | 204 ++++++++++++++----------------------
source/io/ctrl.h | 65 ++++++------
source/io/input.c | 59 +----------
source/io/input.h | 30 ++++--
source/main.c | 4 +-
9 files changed, 213 insertions(+), 229 deletions(-)
create mode 100644 Fumofumotris.code-workspace
diff --git a/Fumofumotris.code-workspace b/Fumofumotris.code-workspace
new file mode 100644
index 0000000..8400082
--- /dev/null
+++ b/Fumofumotris.code-workspace
@@ -0,0 +1,63 @@
+{
+ "folders": [
+ {
+ "path": "."
+ }
+ ],
+ "settings": {
+ "files.associations": {
+ "pthread.h": "c",
+ "fumotris.h": "c",
+ "string.h": "c",
+ "input.h": "c",
+ "stdint.h": "c",
+ "iso646.h": "c",
+ "win.h": "c",
+ "array": "cpp",
+ "deque": "cpp",
+ "string": "cpp",
+ "unordered_map": "cpp",
+ "vector": "cpp",
+ "string_view": "cpp",
+ "atomic": "cpp",
+ "bit": "cpp",
+ "*.tcc": "cpp",
+ "cctype": "cpp",
+ "clocale": "cpp",
+ "cmath": "cpp",
+ "compare": "cpp",
+ "concepts": "cpp",
+ "cstdarg": "cpp",
+ "cstddef": "cpp",
+ "cstdint": "cpp",
+ "cstdio": "cpp",
+ "cstdlib": "cpp",
+ "cwchar": "cpp",
+ "cwctype": "cpp",
+ "exception": "cpp",
+ "algorithm": "cpp",
+ "functional": "cpp",
+ "iterator": "cpp",
+ "memory": "cpp",
+ "memory_resource": "cpp",
+ "numeric": "cpp",
+ "optional": "cpp",
+ "random": "cpp",
+ "system_error": "cpp",
+ "tuple": "cpp",
+ "type_traits": "cpp",
+ "utility": "cpp",
+ "initializer_list": "cpp",
+ "iosfwd": "cpp",
+ "limits": "cpp",
+ "new": "cpp",
+ "numbers": "cpp",
+ "ostream": "cpp",
+ "stdexcept": "cpp",
+ "streambuf": "cpp",
+ "typeinfo": "cpp",
+ "execution": "cpp",
+ "stdbool.h": "c"
+ }
+ }
+}
\ No newline at end of file
diff --git a/hi.exe b/hi.exe
index e4ef518335611d168b2d6647f1718d82dd6f9ed6..0799adada267a0015f48dc8b384e328022597846 100644
GIT binary patch
delta 11362
zcmc&)d0bTG`akEuAPgWQgNOslFlRsn(s2P%OUDv8n&!B5wMB6OH6=;W>n(LaG8rcn
zeB3IlL96SUqm+9&kcqaUnOQEOw&1l}v|cN3-0yqNoPn|E{(irIe)IXf=h>h4d7t-r
zmvdmpia=*cU`3f>O@2Z?_bA6*)o@%Bm&An%LJF70aomK;%^5;|W928qd5IGFR6dtR
z^MkdGsgUW=(&%ZvYlf8vYDE*!dZV@aSvk(rW8U;BMN`0xK(nDS)4udI->v&lV6A>u
zrd_CLO92oRq6MO5(;&gnejH;Jds)LNUl_&TL;Hko`~
u@>>wLPqdkS=
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
U+Wk6nN{dibB-426%Z9}N15C<5p#T5?
diff --git a/source/game/gametime.c b/source/game/gametime.c
index 3c6fbcc..635a645 100644
--- a/source/game/gametime.c
+++ b/source/game/gametime.c
@@ -5,11 +5,17 @@
#include "win.h"
#endif
-struct timespec TimeNow()
+struct Time {
+ u32 sec;
+ u32 nsec;
+};
+
+struct Time TimeNow()
{
struct timespec ts;
+ // Need to check for failiure
timespec_get(&ts, TIME_UTC);
- return ts;
+ return (struct Time) { ts.tv_sec, ts.tv_nsec };
}
double TimeNowDouble()
diff --git a/source/game/gametime.h b/source/game/gametime.h
index 4f227e7..61c8dd6 100644
--- a/source/game/gametime.h
+++ b/source/game/gametime.h
@@ -1,6 +1,11 @@
#pragma once
#include
-struct timespec TimeNow();
+struct Time {
+ u32 sec;
+ u32 nsec;
+};
+
+struct Time TimeNow();
double TimeNowDouble();
diff --git a/source/io/ctrl.c b/source/io/ctrl.c
index 0bea90e..142eaca 100644
--- a/source/io/ctrl.c
+++ b/source/io/ctrl.c
@@ -1,89 +1,49 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
+#include "ctrl.h"
-#include "fumotris.h"
-#include "hash.h"
-#include "input.h"
-
-struct CtrlAxis {
- struct timespec last_pressed;
- struct timespec last_released;
-
- u8 type;
- u8 is_down;
- u8 is_held;
- u8 is_up;
-
- union {
- struct Button but;
- struct Axis axis;
- struct Joystick js;
- union InputData data;
- };
+struct ctrl_bkt {
+ union InputID id;
+ struct InputAxis *axis;
};
struct ctrl_dict {
- size_t capacity;
- size_t filled;
+ struct ctrl_bkt *bkts;
- struct ctrl_bkt {
- hashtype hash;
- u16 value;
- u8 type;
-
- struct CtrlAxis *axis;
- } *bkts;
+ u16f capacity;
+ u16f filled;
};
-struct Controller {
- struct ctrl_dict codes;
- struct ctrl_dict binds;
- struct CtrlAxis *axes;
-
- struct InputBuffer input_buf;
-
- struct {
- size_t len;
- struct CtrlAxis *axes[IO_BUF_SIZE];
- } pending_buf;
+struct axis_vec {
+ struct InputAxis *axes;
+ u16f size;
+ u16f len;
};
-bool NewCtrl(struct Controller *ctrl, size_t code_cap, size_t bind_cap)
+size_t a = sizeof(struct ctrl_dict);
+
+bool NewCtrl(struct Controller *ctrl, size_t init_axes)
{
- struct ctrl_bkt *code_bkts = calloc(code_cap, sizeof(struct ctrl_bkt));
- struct ctrl_bkt *bind_bkts = calloc(bind_cap, sizeof(struct ctrl_bkt));
- struct CtrlAxis *axes = calloc(code_cap, sizeof(struct CtrlAxis));
+ struct ctrl_bkt *code_bkts = calloc(init_axes, sizeof(struct ctrl_bkt));
+ struct ctrl_bkt *bind_bkts = calloc(init_axes, sizeof(struct ctrl_bkt));
+ struct InputAxis *axes = calloc(init_axes, sizeof(struct InputAxis));
if (code_bkts == nullptr or bind_bkts == nullptr or axes == nullptr)
return false;
- for (size_t i = 0; i < code_cap; i++) {
- code_bkts[i].axis = axes + i;
- }
-
*ctrl = (struct Controller) {
+ .buf.len = 0,
+ .pending_buf.len = 0,
+
+ .axis_vec.axes = axes,
.codes = (struct ctrl_dict) {
- .capacity = code_cap,
- .filled = 0,
.bkts = code_bkts,
+ .capacity = init_axes,
+ .filled = 0,
},
.binds = (struct ctrl_dict) {
- .capacity = bind_cap,
- .filled = 0,
.bkts = bind_bkts,
+ .capacity = init_axes,
+ .filled = 0,
},
- .axes = axes,
-
- .input_buf = (struct InputBuffer) {
- .len = 0,
- },
- .pending_buf.len = 0,
};
return true;
}
@@ -92,7 +52,7 @@ void FreeCtrl(struct Controller *ctrl)
{
free(ctrl->codes.bkts);
free(ctrl->binds.bkts);
- free(ctrl->axes);
+ free(ctrl->axis_vec.axes);
}
struct ctrl_bkt *get_bkt(struct ctrl_dict *dict, size_t i)
@@ -100,122 +60,101 @@ struct ctrl_bkt *get_bkt(struct ctrl_dict *dict, size_t i)
return &dict->bkts[i];
}
-void set_bkt(struct ctrl_bkt *bkt, hashtype hash, u16f value, u8f type)
-{
- bkt->hash = hash;
- bkt->value = value;
- bkt->type = type;
-}
-
size_t wrap_index(size_t i, size_t max)
{
return i % (SIZE_MAX - max + 1);
}
-hashtype hash_id(u16f value, u8f type)
+struct ctrl_bkt *find_or_set(struct ctrl_dict *dict, union InputID id)
{
- 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)
-{
- hashtype hash = hash_id(value, type);
- const size_t index = hash % dict->capacity;
+ const size_t index = id.hash % dict->capacity;
size_t i = index;
while (i != wrap_index(index - 1, dict->capacity)) {
struct ctrl_bkt *bkt = get_bkt(dict, i);
- if (bkt->hash == 0) {
- set_bkt(bkt, hash, value, type);
+ if (bkt->axis == nullptr) {
+ bkt->id.hash = id.hash;
dict->filled += 1;
- *out = bkt;
- return false;
+
+ return bkt;
}
- if (bkt->value == value and bkt->type == type) {
- *out = bkt;
- return true;
+ if (bkt->id.hash == id.hash) {
+ return bkt;
}
i = (i + 1) % dict->capacity;
}
- *out = nullptr;
- return false;
+ return nullptr;
}
-struct ctrl_bkt *find(struct ctrl_dict *dict, u16f value, u8f type)
+struct ctrl_bkt *find(struct ctrl_dict *dict, union InputID id)
{
- hashtype hash = hash_id(value, type);
- const size_t index = hash % dict->capacity;
+ const size_t index = id.hash % dict->capacity;
size_t i = index;
while (i != wrap_index(index - 1, dict->capacity)) {
struct ctrl_bkt *bkt = get_bkt(dict, i);
- if (bkt->hash == 0)
- goto next;
- if (bkt->value == value and bkt->type == type)
+ if (bkt->id.hash == id.hash)
return bkt;
-next:
i = (i + 1) % dict->capacity;
};
return nullptr;
}
-struct CtrlAxis *find_axis(struct ctrl_dict *dict, u16f value, u8f type)
+struct InputAxis *find_axis(struct ctrl_dict *dict, union InputID id)
{
- struct ctrl_bkt *bkt = find(dict, value, type);
+ struct ctrl_bkt *bkt = find(dict, id);
if (bkt == nullptr)
return nullptr;
return bkt->axis;
}
-bool CtrlMap(struct Controller *ctrl, u16f code, u16f bind, u8f type)
+union InputID to_id(u16f value, u16f type)
{
- if (ctrl->codes.filled >= ctrl->codes.capacity or ctrl->binds.filled >= ctrl->binds.capacity) {
- printf("fatal error");
- exit(1);
- }
+ return (union InputID) { .value = value, .type = type };
+}
- struct ctrl_bkt *code_bkt;
- find_or_set(&ctrl->codes, &code_bkt, code, type);
-
- struct ctrl_bkt *bind_bkt;
- bool bind_existed = find_or_set(&ctrl->binds, &bind_bkt, bind, type);
+bool CtrlMap(struct Controller *ctrl, u16f code, u16f type, u16f bind)
+{
+ struct ctrl_bkt *code_bkt = find_or_set(&ctrl->codes, to_id(code, type));
+ struct ctrl_bkt *bind_bkt = find_or_set(&ctrl->binds, to_id(bind, type));
- if(bind_existed and bind_bkt->axis == code_bkt->axis)
+ if (code_bkt->axis == nullptr)
+ code_bkt->axis = &ctrl->axis_vec.axes[ctrl->axis_vec.len++];
+ else if (code_bkt->axis == bind_bkt->axis)
return false;
bind_bkt->axis = code_bkt->axis;
- code_bkt->axis->type = type;
+ code_bkt->axis->id.type = type;
return true;
}
-struct CtrlAxis *CtrlGet(struct Controller *ctrl, u16f code, u8f type)
+struct InputAxis *CtrlGet(struct Controller *ctrl, u16f code, u16f type)
{
- struct ctrl_bkt *code_bkt = find(&ctrl->codes, code, type);
+ struct ctrl_bkt *code_bkt = find(&ctrl->codes, to_id(code, type));
if (code_bkt == nullptr)
return nullptr;
return code_bkt->axis;
}
-void dispatch_update(struct CtrlAxis *axis, struct InputRecord *rec)
+void dispatch_update(struct InputAxis *axis, struct InputRecord *rec)
{
if (rec->is_down and !axis->is_held) {
axis->is_down = true;
axis->is_held = true;
- axis->last_pressed = rec->timestamp;
+ axis->last_pressed = rec->time;
} else if (rec->is_up) {
axis->is_up = true;
axis->is_held = false;
- axis->last_released = rec->timestamp;
+ axis->last_released = rec->time;
}
axis->data = rec->data;
@@ -224,17 +163,18 @@ void dispatch_update(struct CtrlAxis *axis, struct InputRecord *rec)
bool CtrlPoll(struct Controller *ctrl)
{
for (size_t i = 0; i < ctrl->pending_buf.len; i++) {
- struct CtrlAxis *axis = ctrl->pending_buf.axes[i];
+ struct InputAxis *axis = ctrl->pending_buf.axes[i];
axis->is_up = false;
axis->is_down = false;
}
- ctrl->pending_buf.len = ctrl->input_buf.len;
+ ctrl->pending_buf.len = ctrl->buf.len;
- for (size_t i = 0; i < ctrl->input_buf.len; i++) {
- struct InputRecord *rec = &ctrl->input_buf.records[i];
- struct CtrlAxis *axis = find_axis(&ctrl->binds, rec->bind, rec->type);
+ for (size_t i = 0; i < ctrl->buf.len; i++) {
+ struct InputRecord *rec = &ctrl->buf.recs[i];
+ union InputID rec_id = to_id(rec->bind, rec->type);
+ struct InputAxis *axis = find_axis(&ctrl->binds, rec_id);
if (axis == nullptr)
continue;
@@ -242,7 +182,7 @@ bool CtrlPoll(struct Controller *ctrl)
ctrl->pending_buf.axes[i] = axis;
}
- ctrl->input_buf.len = 0;
+ ctrl->buf.len = 0;
return true;
}
@@ -250,22 +190,32 @@ bool CtrlPoll(struct Controller *ctrl)
int main()
{
struct Controller ctrl;
- if (!NewCtrl(&ctrl, 3, 3))
+ if (!NewCtrl(&ctrl, 3))
return 1;
- CtrlMap(&ctrl, 123, 111, BUTTON);
+ CtrlMap(&ctrl, 123, BUTTON, 111);
+ CtrlMap(&ctrl, 0, BUTTON, 8);
- ctrl.input_buf.records[ctrl.input_buf.len++] = (struct InputRecord) {
+ ctrl.buf.recs[ctrl.buf.len++] = (struct InputRecord) {
.bind = 111,
.type = BUTTON,
.is_down = true,
.but.value = 69
};
+ ctrl.buf.recs[ctrl.buf.len++] = (struct InputRecord) {
+ .bind = 8,
+ .type = BUTTON,
+ .is_down = true,
+ .but.value = 1000
+ };
CtrlPoll(&ctrl);
- struct CtrlAxis *a = CtrlGet(&ctrl, 123, BUTTON);
+ struct InputAxis *a = CtrlGet(&ctrl, 123, BUTTON);
printf("%u\n", a->but.value);
+
+ struct InputAxis *b = CtrlGet(&ctrl, 0, BUTTON);
+ printf("%u\n", b->but.value);
printf("success");
return 0;
diff --git a/source/io/ctrl.h b/source/io/ctrl.h
index 60d48c4..1661bfc 100644
--- a/source/io/ctrl.h
+++ b/source/io/ctrl.h
@@ -5,21 +5,14 @@
#include
#include
#include
-#include
-#include
#include "fumotris.h"
-#include "hash.h"
+#include "gametime.h"
#include "input.h"
-struct CtrlAxis {
- struct timespec last_pressed;
- struct timespec last_released;
-
- u8 type;
- u8 is_down;
- u8 is_held;
- u8 is_up;
+struct InputAxis {
+ struct Time last_pressed;
+ struct Time last_released;
union {
struct Button but;
@@ -27,40 +20,50 @@ struct CtrlAxis {
struct Joystick js;
union InputData data;
};
+
+ union InputID id;
+ u8 is_down;
+ u8 is_held;
+ u8 is_up;
};
-struct ctrl_dict {
- size_t capacity;
- size_t filled;
+static struct ctrl_bkt {
+ union InputID id;
+ struct InputAxis *axis;
+};
- struct ctrl_bkt {
- hashtype hash;
- u16 value;
- u8 type;
+static struct ctrl_dict {
+ struct ctrl_bkt *bkts;
- struct CtrlAxis *axis;
- } *bkts;
+ u16f capacity;
+ u16f filled;
+};
+
+static struct axis_vec {
+ struct InputAxis *axes;
+
+ u16f size;
+ u16f len;
};
struct Controller {
+ struct InputBuffer buf;
+ struct {
+ struct InputAxis *axes[IO_BUF_SIZE];
+ u16f len;
+ } pending_buf;
+
+ struct axis_vec axis_vec;
struct ctrl_dict codes;
struct ctrl_dict binds;
- struct CtrlAxis *axes;
-
- struct InputBuffer input_buf;
-
- struct {
- size_t len;
- struct CtrlAxis *axes[IO_BUF_SIZE];
- } pending_buf;
};
-bool NewCtrl(struct Controller *ctrl, size_t code_cap, size_t bind_cap);
+bool NewCtrl(struct Controller *ctrl, size_t init_axes);
void FreeCtrl(struct Controller *ctrl);
-bool CtrlMap(struct Controller *ctrl, u16f code, u16f bind, u8f type);
+bool CtrlMap(struct Controller *ctrl, u16f code, u16f type, u16f bind);
-struct CtrlAxis *CtrlGet(struct Controller *ctrl, u16f code, u8f type);
+struct InputAxis *CtrlGet(struct Controller *ctrl, u16f code, u16f type);
bool CtrlPoll(struct Controller *ctrl);
\ No newline at end of file
diff --git a/source/io/input.c b/source/io/input.c
index 63f0037..a5dd882 100644
--- a/source/io/input.c
+++ b/source/io/input.c
@@ -1,64 +1,11 @@
-#include
+#include "input.h"
#include
-#include
-#include
-#include
-#include
-#include "fumotris.h"
#include "platform.h"
-#define IO_BUF_SIZE 16
-
-enum InputType {
- BUTTON,
- AXIS,
- JOYSTICK,
- ESCAPE
-};
-
-struct Button {
- u64 value;
-};
-struct Axis {
- i64 value;
-};
-struct Joystick {
- i32 x;
- i32 y;
-};
-union InputData {
- struct Button input_but;
- struct Axis input_axis;
- struct Joystick input_js;
-};
-
-struct InputRecord {
- u16f bind;
- struct timespec timestamp;
-
- u8 type;
- u8 is_down;
- u8 is_held;
- u8 is_up;
-
- union {
- struct Button but;
- struct Axis axis;
- struct Joystick js;
- union InputData data;
- };
-};
-
-struct InputBuffer {
- size_t len;
- size_t start;
- struct InputRecord records[IO_BUF_SIZE];
-};
-
struct InputRecord *in_buf_get(struct InputBuffer *buf, size_t i)
{
- return buf->records + (buf->start + 1) % IO_BUF_SIZE;
+ return buf->recs + (buf->start + 1) % IO_BUF_SIZE;
}
void InputBufferTransfer(struct InputBuffer *tmp, struct InputBuffer *dest)
@@ -78,7 +25,7 @@ void InputBufferTransfer(struct InputBuffer *tmp, struct InputBuffer *dest)
void InputBufferCopy(struct InputBuffer *buf, struct InputRecord *src)
{
- buf->records[(buf->start + buf->len) % IO_BUF_SIZE] = *src;
+ buf->recs[(buf->start + buf->len) % IO_BUF_SIZE] = *src;
buf->len += 1;
}
diff --git a/source/io/input.h b/source/io/input.h
index 5fb1397..cc6c417 100644
--- a/source/io/input.h
+++ b/source/io/input.h
@@ -6,6 +6,7 @@
#include
#include "fumotris.h"
+#include "gametime.h"
#define IO_BUF_SIZE 16
@@ -16,6 +17,14 @@ enum InputType {
ESCAPE
};
+union InputID {
+ struct {
+ union { u16 code; u16 bind; u16 value };
+ u16 type;
+ };
+ u32 hash;
+};
+
struct Button {
u64 value;
};
@@ -33,13 +42,7 @@ union InputData {
};
struct InputRecord {
- u16f bind;
- struct timespec timestamp;
-
- u8 type;
- u8 is_down;
- u8 is_held;
- u8 is_up;
+ struct Time time;
union {
struct Button but;
@@ -47,12 +50,19 @@ struct InputRecord {
struct Joystick js;
union InputData data;
};
+
+ u16f bind;
+
+ u8 type;
+ u8 is_down;
+ u8 is_held;
+ u8 is_up;
};
struct InputBuffer {
- size_t len;
- size_t start;
- struct InputRecord records[IO_BUF_SIZE];
+ struct InputRecord recs[IO_BUF_SIZE];
+ u8f len;
+ u8f start;
};
void InputBufferTransfer(struct InputBuffer *tmp, struct InputBuffer *dest);
diff --git a/source/main.c b/source/main.c
index f6a6e09..0a0308d 100644
--- a/source/main.c
+++ b/source/main.c
@@ -114,7 +114,7 @@ void Loop(struct Instance *game)
bool Start(struct Instance *game)
{
- if (!NewCtrl(&game->ctrl, code_count, code_count))
+ if (!NewCtrl(&game->ctrl))
return false;
for (size_t i = 0; i < code_count; i++) {
@@ -144,7 +144,7 @@ int main()
if(!PlatformInit())
exit(1);
- InputStart(&game.ctrl.input_buf, );
+ InputStart(&game.ctrl.buf, );
Loop(&game);
return 0;