nishbox/engine/nb_core.c
2025-04-04 00:49:08 +09:00

92 lines
2.0 KiB
C

#define NB_EXPOSE_CORE
#include <nb_pre.h>
/* External library */
#ifdef _WIN32
#include <winsock.h>
#endif
/* Interface */
#include <nb_core.h>
/* NishBox */
#include <nb_draw.h>
#include <nb_physics.h>
#include <nb_log.h>
#include <nb_version.h>
/* Standard */
#include <stdlib.h>
#include <string.h>
void nb_engine_begin(void) {
nb_version_t ver;
#ifdef _WIN32
WSADATA wsa;
#endif
nb_get_version(&ver);
nb_function_log("NishBox engine %s", ver.full);
nb_function_log("Lua %s", ver.lua);
nb_function_log("zlib %s", ver.zlib);
nb_function_log("OpenGL backend: %s", ver.opengl);
#ifdef _WIN32
WSAStartup(MAKEWORD(1, 1), &wsa);
nb_function_log("Winsock ready", "");
#endif
nb_draw_begin();
nb_physics_begin();
}
void nb_engine_end(void) {
nb_physics_end();
nb_draw_end();
}
nb_engine_t* nb_engine_create(int nogui) {
nb_engine_t* engine = malloc(sizeof(*engine));
memset(engine, 0, sizeof(*engine));
if(nogui) {
nb_function_log("No GUI mode", "");
engine->draw = NULL;
} else {
nb_function_log("GUI mode", "");
engine->draw = nb_draw_create();
if(engine->draw == NULL) {
nb_function_log("Failed to create drawing interface", "");
free(engine);
return NULL;
}
}
engine->physics = nb_physics_create();
return engine;
}
/**
* Writing this so I don't forget
*
* 1. Calls nb_draw_step
* 2. nb_draw_step calls _nb_draw_step (Platform-dependent)
* 3. _nb_draw_step processes platform-dependent stuffs (e.g. events)
* 4. _nb_draw_step calls nb_draw_driver_before
* 4. _nb_draw_step calls nb_draw_frame
* 5. nb_draw_frame draws frame
* 4. _nb_draw_step calls nb_draw_driver_after
* 6. _nb_draw_step swaps buffers
* 7. Comes back here
*/
void nb_engine_loop(nb_engine_t* engine) {
while(1) {
if(engine->draw != NULL) {
if(nb_draw_step(engine->draw) != 0) break;
}
}
}
void nb_engine_destroy(nb_engine_t* engine) {
if(engine->physics != NULL) nb_physics_destroy(engine->physics);
if(engine->draw != NULL) nb_draw_destroy(engine->draw);
free(engine);
nb_function_log("Destroyed engine", "");
}