From 1dcea1a2cfdbcd6c328dd845e56964a3d17d69af Mon Sep 17 00:00:00 2001 From: Julia <145168563+julia-aph@users.noreply.github.com> Date: Tue, 30 Apr 2024 16:41:31 -0500 Subject: [PATCH] jjdjd a --- .vscode/c_cpp_properties.json | 3 +- Fumofumotris.code-workspace | 3 +- .../gametime.c => fumoengine/fumocommon.c} | 8 ++- .../{fumotris.h => fumoengine/fumocommon.h} | 47 +++--------------- source/{main.c => fumoengine/fumoengine.c} | 45 ++++++----------- source/{game => fumoengine/include}/event.c | 0 source/{game => fumoengine/include}/event.h | 4 +- source/{misc => fumoengine/include}/hash.c | 3 +- source/{misc => fumoengine/include}/hash.h | 3 +- .../include}/ringbuffer.c | 6 ++- .../include}/ringbuffer.h | 5 +- source/{io => fumoengine/input}/ctrl.c | 15 ++---- source/{io => fumoengine/input}/ctrl.h | 11 ++-- source/{io => fumoengine/input}/input.c | 7 +++ source/{io => fumoengine/input}/input.h | 41 ++++++++------- .../input}/platforms/parseinput.c | 1 + .../input}/platforms/parseinput.h | 3 +- .../input}/platforms/platform.h | 4 +- .../{io => fumoengine/input}/platforms/win.c | 3 -- .../{io => fumoengine/input}/platforms/win.h | 2 +- source/{term => fumoengine/terminal}/term.c | 5 +- source/{term => fumoengine/terminal}/term.h | 4 +- source/fumotris.c | 47 ++++++++++++++++-- source/{fumo => fumotris}/tetr.c | 3 +- source/{fumo => fumotris}/tetr.h | 3 +- source/game/gametime.h | 11 ---- test.exe | Bin 85681 -> 84906 bytes 27 files changed, 139 insertions(+), 148 deletions(-) rename source/{game/gametime.c => fumoengine/fumocommon.c} (75%) rename source/{fumotris.h => fumoengine/fumocommon.h} (52%) rename source/{main.c => fumoengine/fumoengine.c} (51%) rename source/{game => fumoengine/include}/event.c (100%) rename source/{game => fumoengine/include}/event.h (81%) rename source/{misc => fumoengine/include}/hash.c (92%) rename source/{misc => fumoengine/include}/hash.h (68%) rename source/{datastructures => fumoengine/include}/ringbuffer.c (93%) rename source/{datastructures => fumoengine/include}/ringbuffer.h (92%) rename source/{io => fumoengine/input}/ctrl.c (92%) rename source/{io => fumoengine/input}/ctrl.h (88%) rename source/{io => fumoengine/input}/input.c (95%) rename source/{io => fumoengine/input}/input.h (76%) rename source/{io => fumoengine/input}/platforms/parseinput.c (99%) rename source/{io => fumoengine/input}/platforms/parseinput.h (83%) rename source/{io => fumoengine/input}/platforms/platform.h (80%) rename source/{io => fumoengine/input}/platforms/win.c (98%) rename source/{io => fumoengine/input}/platforms/win.h (83%) rename source/{term => fumoengine/terminal}/term.c (98%) rename source/{term => fumoengine/terminal}/term.h (87%) rename source/{fumo => fumotris}/tetr.c (98%) rename source/{fumo => fumotris}/tetr.h (90%) delete mode 100644 source/game/gametime.h diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 4fa3689..ae83481 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -3,7 +3,8 @@ { "name": "Win32", "includePath": [ - "${workspaceFolder}/**" + "${workspaceFolder}/**", + "${workspaceFolder}/source/fumoengine/input" ], "defines": [ "_DEBUG", diff --git a/Fumofumotris.code-workspace b/Fumofumotris.code-workspace index 8400082..76dc364 100644 --- a/Fumofumotris.code-workspace +++ b/Fumofumotris.code-workspace @@ -57,7 +57,8 @@ "streambuf": "cpp", "typeinfo": "cpp", "execution": "cpp", - "stdbool.h": "c" + "stdbool.h": "c", + "fumoengine.h": "c" } } } \ No newline at end of file diff --git a/source/game/gametime.c b/source/fumoengine/fumocommon.c similarity index 75% rename from source/game/gametime.c rename to source/fumoengine/fumocommon.c index 50d9b43..fd256b3 100644 --- a/source/game/gametime.c +++ b/source/fumoengine/fumocommon.c @@ -1,7 +1,11 @@ -#include "gametime.h" +#include "fumocommon.h" #include -#define ONE_E_9 1000000000 + +size_t MinSize(size_t a, size_t b) +{ + return a < b ? a : b; +} Time TimeNow() { diff --git a/source/fumotris.h b/source/fumoengine/fumocommon.h similarity index 52% rename from source/fumotris.h rename to source/fumoengine/fumocommon.h index 4fb5281..80603da 100644 --- a/source/fumotris.h +++ b/source/fumoengine/fumocommon.h @@ -1,9 +1,10 @@ #pragma once -#include #include #define nullptr ((void *)0) +#define ONE_E_9 1000000000 + typedef uint8_t u8; typedef uint_fast8_t u8f; @@ -31,47 +32,11 @@ typedef int64_t i64; typedef int_fast64_t i64f; -size_t min_size(size_t a, size_t b); +typedef u64 Time; -/*const u8 I[16] = { - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 1, - 0, 0, 0, 0 -}; +size_t MinSize(size_t a, size_t b); -const u8 O[4] = { - 1, 1, - 1, 1 -}; +Time TimeNow(); -const u8 T[9] = { - 0, 1, 0, - 1, 1, 1, - 0, 0, 0 -}; - -const u8 S[9] = { - 0, 1, 1, - 1, 1, 0, - 0, 0, 0 -}; - -const u8 Z[9] = { - 1, 1, 0, - 0, 1, 1, - 0, 0, 0 -}; - -const u8 J[9] = { - 1, 0, 0, - 1, 1, 1, - 0, 0, 0 -}; - -const u8 L[9] = { - 0, 0, 1, - 1, 1, 1, - 0, 0, 0 -};*/ \ No newline at end of file +double TimeNowD(); \ No newline at end of file diff --git a/source/main.c b/source/fumoengine/fumoengine.c similarity index 51% rename from source/main.c rename to source/fumoengine/fumoengine.c index 56c9fb5..be46ffb 100644 --- a/source/main.c +++ b/source/fumoengine/fumoengine.c @@ -1,17 +1,8 @@ -#include -#include -#include -#include -#include -#include -#include - #include "ctrl.h" -#include "input.h" -#include "fumotris.h" -#include "term.h" + #include "event.h" -#include "platform.h" +#include "fumocommon.h" + void ErrorExit(char *message) { @@ -19,32 +10,30 @@ void ErrorExit(char *message) exit(1); } -struct Game { - struct Event Start; - struct Event Draw; - struct Event Update; +struct FumoGame { + struct Controller ctrl; + struct InputHandle input_hand; + + struct Event start; + struct Event draw; + struct Event update; Time time; }; -struct Event hi; - -int main() +bool FumoEngineInit(struct FumoGame *game) { if (!PlatformInit()) ErrorExit("Platform failed to initialize"); - struct Controller ctrl; - if (!CreateCtrl(&ctrl)) + if (!CreateCtrl(&game->ctrl)) ErrorExit("Out of memory"); - CtrlMap(&ctrl, 0, BUTTON, 'A'); + //CtrlMap(&ctrl, 0, BUTTON, 'A'); - struct Game game; - CreateEvent(&game.Update); + CreateEvent(&game->update); - struct InputHandle input_hand; - if (!BeginInputThread(&input_hand, &ctrl.recs, &ctrl.str)) + if (!BeginInputThread(&game->input_hand, &game->input_hand.recs, &ctrl.str)) ErrorExit("Input handle failed to initialize"); while (true) { @@ -56,9 +45,7 @@ int main() if (!InputRelease(&input_hand)) ErrorExit("Release failed"); - _sleep(100); - - EventInvokeUpdate(&game.Update, 0); + EventInvokeUpdate(&game.update, 0); } return 0; diff --git a/source/game/event.c b/source/fumoengine/include/event.c similarity index 100% rename from source/game/event.c rename to source/fumoengine/include/event.c diff --git a/source/game/event.h b/source/fumoengine/include/event.h similarity index 81% rename from source/game/event.h rename to source/fumoengine/include/event.h index 5e4182a..2145d1a 100644 --- a/source/game/event.h +++ b/source/fumoengine/include/event.h @@ -5,8 +5,8 @@ #include #include -#include "fumotris.h" -#include "gametime.h" +#include "fumocommon.h" + union func { void (*generic)(void *arg); diff --git a/source/misc/hash.c b/source/fumoengine/include/hash.c similarity index 92% rename from source/misc/hash.c rename to source/fumoengine/include/hash.c index 5c5ee3b..dd37526 100644 --- a/source/misc/hash.c +++ b/source/fumoengine/include/hash.c @@ -4,7 +4,8 @@ #include #include -#include "fumotris.h" +#include "fumocommon.h" + typedef u32 hashtype; diff --git a/source/misc/hash.h b/source/fumoengine/include/hash.h similarity index 68% rename from source/misc/hash.h rename to source/fumoengine/include/hash.h index 3db0175..3e3b328 100644 --- a/source/misc/hash.h +++ b/source/fumoengine/include/hash.h @@ -5,7 +5,8 @@ #include #include -#include "fumotris.h" +#include "fumocommon.h" + typedef u32 hashtype; diff --git a/source/datastructures/ringbuffer.c b/source/fumoengine/include/ringbuffer.c similarity index 93% rename from source/datastructures/ringbuffer.c rename to source/fumoengine/include/ringbuffer.c index de2e8a3..19c9496 100644 --- a/source/datastructures/ringbuffer.c +++ b/source/fumoengine/include/ringbuffer.c @@ -1,6 +1,8 @@ #include "ringbuffer.h" + #include + void *get_ptr(RingBufferT T, struct RingBufferHead *head, size_t i) { u8 *bytes = (u8 *)head; @@ -35,7 +37,7 @@ void RingBufferTransfer( struct RingBufferHead *dest, struct RingBufferHead *tmp ) { - size_t copy_max = min_size(T->LEN - dest->len, tmp->len); + size_t copy_max = MinSize(T->LEN - dest->len, tmp->len); for (size_t i = 0; i < copy_max; i++) { void *to = RingBufferGet(T, dest, dest->len + i); @@ -53,7 +55,7 @@ size_t RingBufferOut( void *dest, struct RingBufferHead *src ) { - size_t copy_max = min_size(n, src->len); + size_t copy_max = MinSize(n, src->len); for (size_t i = 0; i < copy_max; i++) { void *to = (u8 *)dest + i * T->SIZE; diff --git a/source/datastructures/ringbuffer.h b/source/fumoengine/include/ringbuffer.h similarity index 92% rename from source/datastructures/ringbuffer.h rename to source/fumoengine/include/ringbuffer.h index 267aa3f..67627fa 100644 --- a/source/datastructures/ringbuffer.h +++ b/source/fumoengine/include/ringbuffer.h @@ -2,10 +2,9 @@ #include #include #include -#include -#include -#include "fumotris.h" +#include "fumocommon.h" + typedef const struct RingBufferT { size_t OFFSET; diff --git a/source/io/ctrl.c b/source/fumoengine/input/ctrl.c similarity index 92% rename from source/io/ctrl.c rename to source/fumoengine/input/ctrl.c index e99ce18..5eea0b9 100644 --- a/source/io/ctrl.c +++ b/source/fumoengine/input/ctrl.c @@ -4,6 +4,7 @@ #define INIT_SIZE 16 + bool CreateCtrl(struct Controller *ctrl) { struct ctrl_bkt *code_bkts = calloc(INIT_SIZE, sizeof(struct ctrl_bkt)); @@ -14,7 +15,6 @@ bool CreateCtrl(struct Controller *ctrl) return false; *ctrl = (struct Controller) { - .recs.head = RINGBUF_HEAD_INIT, .pending_buf.len = 0, .axis_vec = (struct ctrl_axis_vec) { @@ -144,7 +144,7 @@ void dispatch_update(struct InputAxis *axis, struct InputRecord *rec) axis->data = rec->data; } -void CtrlPoll(struct Controller *ctrl) +void CtrlPoll(struct Controller *ctrl, struct InputRecordBuf *recs) { for (size_t i = 0; i < ctrl->pending_buf.len; i++) { struct InputAxis *axis = ctrl->pending_buf.axes[i]; @@ -154,8 +154,8 @@ void CtrlPoll(struct Controller *ctrl) } ctrl->pending_buf.len = 0; - for (size_t i = 0; i < ctrl->recs.head.len; i++) { - struct InputRecord *rec = &ctrl->recs.buf[i]; + for (size_t i = 0; i < recs->head.len; i++) { + struct InputRecord *rec = &recs->buf[i]; struct InputAxis *axis = find_axis(&ctrl->binds, rec->id); if (axis == nullptr) @@ -165,12 +165,7 @@ void CtrlPoll(struct Controller *ctrl) ctrl->pending_buf.axes[ctrl->pending_buf.len++] = axis; } - ctrl->recs.head.len = 0; -} - -size_t CtrlInputString(struct Controller *ctrl, size_t n, char *buf) -{ - return RingBufferOut(&STR_BUF_T, n, buf, &ctrl->str.head); + recs->head.len = 0; } /*int main() diff --git a/source/io/ctrl.h b/source/fumoengine/input/ctrl.h similarity index 88% rename from source/io/ctrl.h rename to source/fumoengine/input/ctrl.h index 875475a..595085d 100644 --- a/source/io/ctrl.h +++ b/source/fumoengine/input/ctrl.h @@ -5,10 +5,10 @@ #include #include -#include "fumotris.h" -#include "gametime.h" +#include "fumocommon.h" #include "input.h" + struct InputAxis { Time last_pressed; Time last_released; @@ -47,9 +47,6 @@ struct ctrl_axis_vec { }; struct Controller { - struct InputRecordBuf recs; - struct InputStringBuf str; - struct { struct InputAxis *axes[IO_BUF_SIZE]; u8f len; @@ -68,9 +65,7 @@ bool CtrlMap(struct Controller *ctrl, u16f code, u16f type, u16f bind); struct InputAxis *CtrlGet(struct Controller *ctrl, u16f code, u16f type); -void CtrlPoll(struct Controller *ctrl); - -size_t CtrlInputString(struct Controller *ctrl, size_t n, char *buf); +void CtrlPoll(struct Controller *ctrl, struct InputRecordBuf *recs); enum ControlCode { LEFT, diff --git a/source/io/input.c b/source/fumoengine/input/input.c similarity index 95% rename from source/io/input.c rename to source/fumoengine/input/input.c index 24906c8..7882318 100644 --- a/source/io/input.c +++ b/source/fumoengine/input/input.c @@ -3,6 +3,7 @@ #include "platform.h" + const struct RingBufferT IO_BUF_T = { .OFFSET = offsetof(struct InputRecordBuf, buf), .SIZE = sizeof(struct InputRecord), @@ -15,6 +16,7 @@ const struct RingBufferT STR_BUF_T = { .LEN = STR_BUF_SIZE }; + void *input_worker(void *arg) { struct InputHandle *hand = arg; @@ -110,4 +112,9 @@ bool InputRelease(struct InputHandle *hand) return false; return true; +} + +size_t InputString(struct InputStringBuf *str, size_t n, char *buf) +{ + return RingBufferOut(&STR_BUF_T, n, buf, &str->head); } \ No newline at end of file diff --git a/source/io/input.h b/source/fumoengine/input/input.h similarity index 76% rename from source/io/input.h rename to source/fumoengine/input/input.h index d21d391..76ec18d 100644 --- a/source/io/input.h +++ b/source/fumoengine/input/input.h @@ -6,13 +6,17 @@ #include #include -#include "fumotris.h" -#include "gametime.h" +#include "fumocommon.h" #include "ringbuffer.h" #define IO_BUF_SIZE 16 #define STR_BUF_SIZE (IO_BUF_SIZE * 4) + +extern const struct RingBufferT IO_BUF_T; +extern const struct RingBufferT STR_BUF_T; + + enum InputType { BUTTON, AXIS, @@ -32,12 +36,15 @@ union InputID { u32 hash; }; + struct Button { u64 value; }; + struct Axis { i64 value; }; + struct Joystick { i32 x; i32 y; @@ -49,6 +56,7 @@ union InputData { struct Joystick input_js; }; + struct InputRecord { Time time; @@ -68,22 +76,20 @@ struct InputRecord { }; }; -extern const struct RingBufferT IO_BUF_T; -extern const struct RingBufferT STR_BUF_T; +struct InputBuffer { + struct { + struct RingBufferHead head; + struct InputRecord buf[IO_BUF_SIZE]; + } recs; -struct InputRecordBuf { - struct RingBufferHead head; - struct InputRecord buf[IO_BUF_SIZE]; -}; - -struct InputStringBuf { - struct RingBufferHead head; - char buf[STR_BUF_SIZE]; + struct { + struct RingBufferHead head; + char buf[STR_BUF_SIZE]; + } str; }; struct InputHandle { - struct InputRecordBuf *recs; - struct InputStringBuf *str; + struct InputBuffer in; pthread_t thread; pthread_mutex_t mutex; @@ -95,12 +101,13 @@ struct InputHandle { bool BeginInputThread( struct InputHandle *hand, - struct InputRecordBuf *in, - struct InputStringBuf *str + struct InputBuffer *in, ); bool EndInputThread(struct InputHandle *hand); bool InputAquire(struct InputHandle *hand); -bool InputRelease(struct InputHandle *hand); \ No newline at end of file +bool InputRelease(struct InputHandle *hand); + +size_t InputString(struct Controller *ctrl, size_t n, char *buf); \ No newline at end of file diff --git a/source/io/platforms/parseinput.c b/source/fumoengine/input/platforms/parseinput.c similarity index 99% rename from source/io/platforms/parseinput.c rename to source/fumoengine/input/platforms/parseinput.c index a627478..089fb02 100644 --- a/source/io/platforms/parseinput.c +++ b/source/fumoengine/input/platforms/parseinput.c @@ -1,5 +1,6 @@ #include "parseinput.h" + void ReadButton(struct InputRecord *rec, u16f bind, bool is_down) { rec->id = (union InputID) { .bind = bind, .type = BUTTON }; diff --git a/source/io/platforms/parseinput.h b/source/fumoengine/input/platforms/parseinput.h similarity index 83% rename from source/io/platforms/parseinput.h rename to source/fumoengine/input/platforms/parseinput.h index cb14119..48edcb4 100644 --- a/source/io/platforms/parseinput.h +++ b/source/fumoengine/input/platforms/parseinput.h @@ -4,9 +4,10 @@ #include #include -#include "fumotris.h" +#include "fumocommon.h" #include "input.h" + void ReadButton(struct InputRecord *rec, u16f bind, bool is_down); void ReadAxis(struct InputRecord *rec, u16f bind, u64 value); diff --git a/source/io/platforms/platform.h b/source/fumoengine/input/platforms/platform.h similarity index 80% rename from source/io/platforms/platform.h rename to source/fumoengine/input/platforms/platform.h index 0938bf1..291d9e0 100644 --- a/source/io/platforms/platform.h +++ b/source/fumoengine/input/platforms/platform.h @@ -5,13 +5,13 @@ #include #include -#include "fumotris.h" -#include "gametime.h" +#include "fumocommon.h" #ifdef _WIN32 #include "win.h" #endif + bool PlatformInit(); bool PlatformGetRefreshRate(u16f *out); diff --git a/source/io/platforms/win.c b/source/fumoengine/input/platforms/win.c similarity index 98% rename from source/io/platforms/win.c rename to source/fumoengine/input/platforms/win.c index 66efe67..57837d7 100644 --- a/source/io/platforms/win.c +++ b/source/fumoengine/input/platforms/win.c @@ -1,9 +1,6 @@ #include "win.h" - #include -#include "gametime.h" -#include "input.h" #include "parseinput.h" #include "ringbuffer.h" diff --git a/source/io/platforms/win.h b/source/fumoengine/input/platforms/win.h similarity index 83% rename from source/io/platforms/win.h rename to source/fumoengine/input/platforms/win.h index f8e9eb7..8625da5 100644 --- a/source/io/platforms/win.h +++ b/source/fumoengine/input/platforms/win.h @@ -5,4 +5,4 @@ #include #include -#include "fumotris.h" \ No newline at end of file +#include "fumocommon.h" \ No newline at end of file diff --git a/source/term/term.c b/source/fumoengine/terminal/term.c similarity index 98% rename from source/term/term.c rename to source/fumoengine/terminal/term.c index c829669..682e24a 100644 --- a/source/term/term.c +++ b/source/fumoengine/terminal/term.c @@ -1,13 +1,12 @@ #include -#include #include #include #include #include #include -#include -#include "fumotris.h" +#include "fumocommon.h" + struct TChar4 { char ch; diff --git a/source/term/term.h b/source/fumoengine/terminal/term.h similarity index 87% rename from source/term/term.h rename to source/fumoengine/terminal/term.h index 7d27978..eb1b345 100644 --- a/source/term/term.h +++ b/source/fumoengine/terminal/term.h @@ -6,9 +6,9 @@ #include #include #include -#include -#include "fumotris.h" +#include "fumocommon.h" + struct TChar4 { char ch; diff --git a/source/fumotris.c b/source/fumotris.c index ac5853f..cad8a4e 100644 --- a/source/fumotris.c +++ b/source/fumotris.c @@ -1,6 +1,43 @@ -#include "fumotris.h" -size_t min_size(size_t a, size_t b) -{ - return a < b ? a : b; -} \ No newline at end of file + +/*const u8 I[16] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 1, 1, + 0, 0, 0, 0 +}; + +const u8 O[4] = { + 1, 1, + 1, 1 +}; + +const u8 T[9] = { + 0, 1, 0, + 1, 1, 1, + 0, 0, 0 +}; + +const u8 S[9] = { + 0, 1, 1, + 1, 1, 0, + 0, 0, 0 +}; + +const u8 Z[9] = { + 1, 1, 0, + 0, 1, 1, + 0, 0, 0 +}; + +const u8 J[9] = { + 1, 0, 0, + 1, 1, 1, + 0, 0, 0 +}; + +const u8 L[9] = { + 0, 0, 1, + 1, 1, 1, + 0, 0, 0 +};*/ \ No newline at end of file diff --git a/source/fumo/tetr.c b/source/fumotris/tetr.c similarity index 98% rename from source/fumo/tetr.c rename to source/fumotris/tetr.c index c579f0d..5681afa 100644 --- a/source/fumo/tetr.c +++ b/source/fumotris/tetr.c @@ -6,9 +6,10 @@ #include #include -#include "fumotris.h" +#include "fumocommon.h" #include "term.h" + struct TetrMap { size_t wid; size_t hgt; diff --git a/source/fumo/tetr.h b/source/fumotris/tetr.h similarity index 90% rename from source/fumo/tetr.h rename to source/fumotris/tetr.h index 896e510..57b7eb4 100644 --- a/source/fumo/tetr.h +++ b/source/fumotris/tetr.h @@ -6,9 +6,10 @@ #include #include -#include "fumotris.h" +#include "fumocommon.h" #include "term.h" + struct TetrMap { size_t wid; size_t hgt; diff --git a/source/game/gametime.h b/source/game/gametime.h deleted file mode 100644 index 630a436..0000000 --- a/source/game/gametime.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -#include -#include - -#include "fumotris.h" - -typedef u64 Time; - -Time TimeNow(); - -double TimeNowD(); diff --git a/test.exe b/test.exe index c3eb1ceaa6ca97331e5f5b58d190cadb3cb4e068..a855f5e09e004fa0e118c883c164c3a89f51e6d5 100644 GIT binary patch delta 18332 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 delta 18757 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 V