From 2fe23438b0703ba4b2fd17d99272347117ac7ce8 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Fri, 9 Jan 2026 03:38:29 +0900 Subject: [PATCH] math and things --- .gitignore | 1 + client/CMakeLists.txt | 2 +- client/main.c | 52 +++++++++++++++++++++-- engine/CMakeLists.txt | 10 +++-- engine/external/glad/CMakeLists.txt | 14 ------ engine/include/GearBox/Client.h | 1 + engine/include/GearBox/Core.h | 7 ++- engine/include/GearBox/Foundation.h | 1 + engine/include/GearBox/MachDep.h | 7 ++- engine/include/GearBox/Math.h | 19 +++++++++ engine/include/GearBox/Server.h | 1 + engine/include/GearBox/TypeDefs.h | 22 ++++++++-- engine/src/client.c | 9 +++- engine/src/core.c | 66 ++++++++++++++++++++++++++++- engine/src/math.c | 54 +++++++++++++++++++++++ engine/src/server.c | 10 ++++- external/milsko | 2 +- 17 files changed, 243 insertions(+), 35 deletions(-) delete mode 100644 engine/external/glad/CMakeLists.txt create mode 100644 engine/include/GearBox/Math.h create mode 100644 engine/src/math.c diff --git a/.gitignore b/.gitignore index 796b96d..b5da578 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /build +*.swp diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index d0df00c..074abfc 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -3,6 +3,6 @@ project(af_client) file(GLOB af_client_SRC *.c) add_executable(af_client ${af_client_SRC}) -target_link_libraries(af_client PRIVATE GearBox) +target_link_libraries(af_client PRIVATE GearBox Mw) install_target(af_client) diff --git a/client/main.c b/client/main.c index 0f10de0..cabacc4 100644 --- a/client/main.c +++ b/client/main.c @@ -1,14 +1,58 @@ +#define MW_OPENGL_NO_INCLUDE +#define _MILSKO + #include +#include +#include + +MwWidget window, opengl; + +static void* gl_getprocaddress(const char* name){ + return MwOpenGLGetProcAddress(opengl, name); +} + +static void gl_swapbuffer(void){ + MwOpenGLSwapBuffer(opengl); +} + +static void ready(int width, int height){ + MwSizeHints sh; + + sh.min_width = sh.max_width = width; + sh.min_height = sh.max_height = height; + + MwLibraryInit(); + + window = MwVaCreateWidget(MwWindowClass, "main", NULL, MwDEFAULT, MwDEFAULT, width, height, + MwNtitle, "AssaultFish", + MwNsizeHints, &sh, + NULL); + opengl = MwCreateWidget(MwOpenGLClass, "opengl", window, 0, 0, width, height); + + MwOpenGLMakeCurrent(opengl); +} + +static void tick(void){ + while(!window->close && MwPending(window)) MwStep(window); +} + int main(int argc, char** argv){ GBEngineParam param; GBEngine engine; - param.server = 0; - param.client = 1; + GBEngineParamInit(¶m); + param.ready = ready; + param.tick = tick; + param.get_tick = MwTimeGetTick; + param.sleep = MwTimeSleep; + param.gl_getprocaddress = gl_getprocaddress; + param.gl_swapbuffer = gl_swapbuffer; GBInit(); - engine = GBEngineCreate(¶m); - GBEngineLoop(engine); + if((engine = GBEngineCreate(¶m)) != NULL){ + GBEngineLoop(engine); + GBEngineDestroy(engine); + } } diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 412a5c6..61818db 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -14,15 +14,17 @@ macro(install_target name) ) endmacro() -add_subdirectory(external/glad) - add_subdirectory(net) file(GLOB GearBox_SRC src/*.c) -add_library(GearBox SHARED ${GearBox_SRC}) -target_include_directories(GearBox PUBLIC include) +add_library(GearBox SHARED ${GearBox_SRC} external/glad/src/glad.c) +target_include_directories(GearBox PUBLIC include external/glad/include) target_compile_definitions(GearBox PRIVATE _GEARBOX) +target_link_libraries(GearBox PRIVATE gbnet) +if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") +target_link_libraries(GearBox PRIVATE m) +endif() install_target(GearBox) diff --git a/engine/external/glad/CMakeLists.txt b/engine/external/glad/CMakeLists.txt deleted file mode 100644 index 06e8411..0000000 --- a/engine/external/glad/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -cmake_minimum_required(VERSION 3.11) -project(glad) - -add_library( - glad - STATIC - src/glad.c -) - -target_include_directories( - glad - PUBLIC - include -) diff --git a/engine/include/GearBox/Client.h b/engine/include/GearBox/Client.h index e32373d..31ba011 100644 --- a/engine/include/GearBox/Client.h +++ b/engine/include/GearBox/Client.h @@ -10,6 +10,7 @@ extern "C" { GBDECL GBClient GBClientCreate(GBEngine engine); GBDECL void GBClientDestroy(GBClient client); +GBDECL void GBClientStep(GBClient client); #ifdef __cplusplus } diff --git a/engine/include/GearBox/Core.h b/engine/include/GearBox/Core.h index d6f4505..8a992e2 100644 --- a/engine/include/GearBox/Core.h +++ b/engine/include/GearBox/Core.h @@ -8,11 +8,14 @@ extern "C" { #endif -GBDECL void GBInit(void); +GBDECL void GBInit(void); + GBDECL GBEngine GBEngineCreate(GBEngineParam* param); GBDECL void GBEngineDestroy(GBEngine engine); -GBDECL void GBEngineStart(GBEngine engine); +GBDECL void GBEngineParamInit(GBEngineParam* param); GBDECL void GBEngineLoop(GBEngine engine); +GBDECL GBClient GBEngineGetClient(GBEngine engine); +GBDECL GBServer GBEngineGetServer(GBEngine engine); #ifdef __cplusplus } diff --git a/engine/include/GearBox/Foundation.h b/engine/include/GearBox/Foundation.h index 7deb366..5e9c1f9 100644 --- a/engine/include/GearBox/Foundation.h +++ b/engine/include/GearBox/Foundation.h @@ -9,5 +9,6 @@ #include #include #include +#include #endif diff --git a/engine/include/GearBox/MachDep.h b/engine/include/GearBox/MachDep.h index d6780b2..c448031 100644 --- a/engine/include/GearBox/MachDep.h +++ b/engine/include/GearBox/MachDep.h @@ -5,8 +5,13 @@ #include #include #include +#include -#if defined(_MILSKO) && defined(_WIN32) +#ifdef _GEARBOX +#include +#endif + +#if defined(_GEARBOX) && defined(_WIN32) #define GBDECL extern __declspec(dllexport) #elif defined(_WIN32) #define GBDECL extern __declspec(dllimport) diff --git a/engine/include/GearBox/Math.h b/engine/include/GearBox/Math.h new file mode 100644 index 0000000..70243e6 --- /dev/null +++ b/engine/include/GearBox/Math.h @@ -0,0 +1,19 @@ +#ifndef __GEARBOX_MATH_H__ +#define __GEARBOX_MATH_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +GBDECL void GBMathCross(double* out, double v00, double v01, double v02, double v10, double v11, double v12); +GBDECL void GBMathNormal3(double* out, double v00, double v01, double v02, double v10, double v11, double v12, double v20, double v21, double v22); +GBDECL void GBMathNormal4(double* out, double v00, double v01, double v02, double v10, double v11, double v12, double v20, double v21, double v22, double v30, double v31, double v32); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/engine/include/GearBox/Server.h b/engine/include/GearBox/Server.h index 36edacb..723ff6c 100644 --- a/engine/include/GearBox/Server.h +++ b/engine/include/GearBox/Server.h @@ -10,6 +10,7 @@ extern "C" { GBDECL GBServer GBServerCreate(GBEngine engine); GBDECL void GBServerDestroy(GBServer server); +GBDECL void GBServerStep(GBServer server); #ifdef __cplusplus } diff --git a/engine/include/GearBox/TypeDefs.h b/engine/include/GearBox/TypeDefs.h index b5e70ca..509d360 100644 --- a/engine/include/GearBox/TypeDefs.h +++ b/engine/include/GearBox/TypeDefs.h @@ -13,6 +13,13 @@ typedef void* GBServer; typedef void* GBEngine; #endif +typedef void* (*GBGLGetProcAddressCallback)(const char* name); +typedef void (*GBGLSwapBufferCallback)(void); +typedef void (*GBReadyCallback)(int width, int height); +typedef void (*GBTickCallback)(void); +typedef long (*GBGetTickCallback)(void); +typedef void (*GBSleepCallback)(int ms); + #ifdef _GEARBOX struct _GBClient { }; @@ -21,8 +28,9 @@ struct _GBServer { }; struct _GBEngine { - GBClient client; - GBServer server; + GBEngineParam* param; + GBClient client; + GBServer server; }; #endif @@ -34,8 +42,14 @@ struct _GBVersion { }; struct _GBEngineParam { - int client; - int server; + int client; + int server; + GBGLGetProcAddressCallback gl_getprocaddress; + GBGLSwapBufferCallback gl_swapbuffer; + GBReadyCallback ready; + GBTickCallback tick; + GBGetTickCallback get_tick; + GBSleepCallback sleep; }; #endif diff --git a/engine/src/client.c b/engine/src/client.c index 738a676..510a04a 100644 --- a/engine/src/client.c +++ b/engine/src/client.c @@ -3,11 +3,18 @@ #include GBClient GBClientCreate(GBEngine engine) { + GBClient client = malloc(sizeof(*client)); + + memset(client, 0, sizeof(*client)); + GBLog(GBLogInfo, "Creating client"); - return NULL; + return client; } void GBClientDestroy(GBClient client) { free(client); } + +void GBClientStep(GBClient client) { +} diff --git a/engine/src/core.c b/engine/src/core.c index c10c662..c7779d6 100644 --- a/engine/src/core.c +++ b/engine/src/core.c @@ -5,6 +5,8 @@ #include #include +#include + void GBInit(void) { GBVersion version; @@ -18,6 +20,17 @@ GBEngine GBEngineCreate(GBEngineParam* param) { memset(engine, 0, sizeof(*engine)); + engine->param = malloc(sizeof(*engine->param)); + memcpy(engine->param, param, sizeof(*param)); + + if(param->ready != NULL) { + param->ready(1024, 768); + } + + if(param->gl_getprocaddress != NULL) { + gladLoadGLLoader(param->gl_getprocaddress); + } + if(engine != NULL && param->client && (engine->client = GBClientCreate(engine)) == NULL) { GBLog(GBLogError, "Failed to create client"); @@ -44,12 +57,63 @@ GBEngine GBEngineCreate(GBEngineParam* param) { void GBEngineDestroy(GBEngine engine) { if(engine->server != NULL) GBServerDestroy(engine->server); if(engine->client != NULL) GBClientDestroy(engine->client); + if(engine->param != NULL) free(engine->param); free(engine); } -void GBEngineStart(GBEngine engine) { +void GBEngineParamInit(GBEngineParam* param) { + memset(param, 0, sizeof(*param)); + + param->server = 0; + param->client = 1; + param->gl_getprocaddress = NULL; + param->gl_swapbuffer = NULL; + param->ready = NULL; + param->sleep = NULL; + param->get_tick = NULL; } void GBEngineLoop(GBEngine engine) { + long t = 0; + int wait_actually = 0; + int more = 0; + long wait = 1000 / 50.0; + + if(engine->param->sleep == NULL || engine->param->get_tick == NULL) { + GBLog(GBLogWarn, "sleep and/or get_tick parameter are missing!"); + GBLog(GBLogWarn, "This will result game to be crazy fast!!!"); + } else { + t = engine->param->get_tick(); + + wait_actually = 1; + } + + while(1) { + GBClientStep(engine->client); + GBServerStep(engine->server); + + if(engine->param->tick != NULL) engine->param->tick(); + + if(wait_actually) { + int diff = (wait - more) - (engine->param->get_tick() - t); + + if(diff > 0) { + engine->param->sleep(diff); + } + + more -= diff; + if(more < 0) more = 0; + + t = engine->param->get_tick(); + } + } +} + +GBClient GBEngineGetClient(GBEngine engine) { + return engine->client; +} + +GBServer GBEngineGetServer(GBEngine engine) { + return engine->server; } diff --git a/engine/src/math.c b/engine/src/math.c new file mode 100644 index 0000000..8bc73c1 --- /dev/null +++ b/engine/src/math.c @@ -0,0 +1,54 @@ +#include + +void GBMathCross(double* out, double v00, double v01, double v02, double v10, double v11, double v12) { + out[0] = v01 * v12 - v02 * v11; + out[1] = v02 * v10 - v00 * v12; + out[2] = v00 * v11 - v01 * v10; +} + +/* + * v0-v2 + * | / + * v1/ + */ +void GBMathNormal3(double* out, double v00, double v01, double v02, double v10, double v11, double v12, double v20, double v21, double v22) { + double v[3]; + double l = 0; + int i; + + GBMathCross(&v[0], /**/ + v10 - v00, v11 - v01, v12 - v02, /**/ + v20 - v00, v21 - v01, v22 - v02 /**/ + ); + + l = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + + for(i = 0; i < 3; i++) { + out[i] = v[i] / l; + } +} + +/* + * v0-v3 + * | | + * v1-v2 + */ +void GBMathNormal4(double* out, double v00, double v01, double v02, double v10, double v11, double v12, double v20, double v21, double v22, double v30, double v31, double v32) { + double v0[3]; + double v1[3]; + int i; + double l = 0; + + GBMathNormal3(&v0[0], v00, v01, v02, v10, v11, v12, v30, v31, v32); + GBMathNormal3(&v1[0], v10, v11, v12, v20, v21, v22, v30, v31, v32); + + for(i = 0; i < 3; i++) { + out[i] = v0[i] + v1[i]; + } + + l = sqrt(out[0] * out[0] + out[1] * out[1] + out[2] * out[2]); + + for(i = 0; i < 3; i++) { + out[i] = out[i] / l; + } +} diff --git a/engine/src/server.c b/engine/src/server.c index c5f5de9..c3a0e6b 100644 --- a/engine/src/server.c +++ b/engine/src/server.c @@ -3,12 +3,18 @@ #include GBServer GBServerCreate(GBEngine engine) { + GBServer server = malloc(sizeof(*server)); + + memset(server, 0, sizeof(*server)); + GBLog(GBLogInfo, "Creating server"); - return NULL; + return server; } void GBServerDestroy(GBServer server) { - free(server); } + +void GBServerStep(GBServer server) { +} diff --git a/external/milsko b/external/milsko index a67a0c1..debdaf9 160000 --- a/external/milsko +++ b/external/milsko @@ -1 +1 @@ -Subproject commit a67a0c11f8e42033d246ae284e51ebd97c8e9672 +Subproject commit debdaf998e0b5edfe42214934d8fcf4dfea3e7bd