prosperon/source/engine/yugine.c

384 lines
7.4 KiB
C
Raw Normal View History

2023-01-04 18:09:42 -06:00
#include "yugine.h"
2022-02-04 11:36:24 -06:00
#include "camera.h"
2023-05-12 13:22:05 -05:00
#include "font.h"
#include "gameobject.h"
2022-02-04 11:36:24 -06:00
#include "input.h"
#include "render.h"
2023-05-12 13:22:05 -05:00
#include "window.h"
#include "sound.h"
#include "resources.h"
2023-08-30 18:22:32 -05:00
#include "datastream.h"
2023-03-24 14:01:01 -05:00
#include "timer.h"
2023-04-22 14:07:37 -05:00
#include "quickjs/quickjs.h"
#include "ffi.h"
2023-05-12 13:22:05 -05:00
#include "script.h"
2022-12-23 13:48:29 -06:00
#include "log.h"
#include <stdio.h>
#include <stdlib.h>
#include "2dphysics.h"
#ifdef __GLIBC__
2023-05-12 13:22:05 -05:00
#include <execinfo.h>
2023-05-30 11:39:22 -05:00
#endif
#include <signal.h>
#include <time.h>
2022-02-04 11:36:24 -06:00
2022-08-14 14:19:36 -05:00
#include "string.h"
2023-05-04 17:07:00 -05:00
#define SOKOL_TRACE_HOOKS
#define SOKOL_IMPL
2023-08-22 22:44:09 -05:00
#include "sokol/sokol_app.h"
2023-08-31 03:10:30 -05:00
#include "sokol/sokol_audio.h"
#include "sokol/sokol_time.h"
2023-05-04 17:07:00 -05:00
#define STB_DS_IMPLEMENTATION
#include <stb_ds.h>
#define STB_TRUETYPE_IMPLEMENTATION
#include <stb_truetype.h>
#define STB_IMAGE_IMPLEMENTATION
#define STBI_FAILURE_USERMSG
#define STBI_NO_SIMD
#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
2023-09-12 00:02:57 -05:00
#define STBIR_DEFAULT_FILTER_DOWNSAMPLE STBIR_FILTER_BOX
#include "stb_image_write.h"
#define PL_MPEG_IMPLEMENTATION
#include <pl_mpeg.h>
#include "debug.h"
static struct d_prof prof_draw;
static struct d_prof prof_update;
static struct d_prof prof_input;
static struct d_prof prof_physics;
2022-08-12 14:03:56 -05:00
double physlag = 0;
int render_dirty = 0;
2022-08-12 14:03:56 -05:00
double physMS = 1 / 60.f;
2022-02-04 11:36:24 -06:00
2023-03-10 13:13:48 -06:00
static int phys_step = 0;
2022-08-14 14:19:36 -05:00
double appTime = 0;
2022-12-22 16:58:06 -06:00
static float timescale = 1.f;
2022-12-27 17:54:39 -06:00
#define SIM_PLAY 0
#define SIM_PAUSE 1
#define SIM_STEP 2
static int sim_play = SIM_PLAY;
2023-05-27 10:13:20 -05:00
#ifdef __TINYC__
int backtrace(void **buffer, int size) {
extern uint64_t *__libc_stack_end;
uint64_t **p, *bp, *frame;
asm ("mov %%rbp, %0;" : "=r" (bp));
p = (uint64_t**) bp;
int i = 0;
while (i < size) {
frame = p[0];
if (frame < bp || frame > __libc_stack_end) {
return i;
}
buffer[i++] = p[1];
p = (uint64_t**) frame;
}
return i;
}
#endif
2023-05-12 13:22:05 -05:00
void print_stacktrace() {
#ifdef __GLIBC__
2023-05-12 13:22:05 -05:00
void *ents[512];
2023-05-27 10:13:20 -05:00
size_t size = backtrace(ents, 512);
2023-05-12 13:22:05 -05:00
YughCritical("====================BACKTRACE====================");
char **stackstr = backtrace_symbols(ents, size);
2023-05-27 10:13:20 -05:00
YughCritical("Stack size is %d.", size);
2023-05-12 13:22:05 -05:00
for (int i = 0; i < size; i++)
YughCritical(stackstr[i]);
2023-05-12 13:22:05 -05:00
js_stacktrace();
2023-05-30 11:39:22 -05:00
#endif
}
void seghandle(int sig) {
#ifdef __GLIBC__
2023-05-12 13:22:05 -05:00
if (strsignal(sig))
YughCritical("CRASH! Signal: %s.", strsignal(sig));
2023-05-12 13:22:05 -05:00
print_stacktrace();
2023-05-12 13:22:05 -05:00
exit(1);
#endif
}
2022-02-04 11:36:24 -06:00
2023-06-28 11:35:41 -05:00
const char *engine_info()
{
static char str[100];
2023-06-28 11:35:41 -05:00
snprintf(str, 100, "Yugine version %s, %s build.\nCopyright 2022-2023 odplot productions LLC.\n", VER, INFO);
return str;
}
2023-04-22 14:07:37 -05:00
2023-08-31 03:10:30 -05:00
static int argc;
static char **args;
2022-08-14 14:19:36 -05:00
2023-08-22 22:44:09 -05:00
void c_init() {
render_init();
script_evalf("initialize();");
2023-08-22 22:44:09 -05:00
}
2023-05-12 13:22:05 -05:00
2023-08-22 22:44:09 -05:00
int frame_fps() {
return 1.0/sapp_frame_duration();
}
2023-05-24 20:45:50 -05:00
2023-09-11 17:09:21 -05:00
static double low_fps = 1/24.0; /* Chosen because of apple's 24 hz mode */
static double low_fps_c = 0.0;
2023-08-22 22:44:09 -05:00
void c_frame()
{
double elapsed = sapp_frame_duration();
appTime += elapsed;
2023-09-11 17:09:21 -05:00
low_fps_c += elapsed;
input_poll(0);
timer_update(elapsed, timescale);
2023-05-12 13:22:05 -05:00
if (sim_play == SIM_PLAY || sim_play == SIM_STEP) {
prof_start(&prof_update);
2023-05-12 13:22:05 -05:00
call_updates(elapsed * timescale);
prof(&prof_update);
physlag += elapsed;
while (physlag >= physMS) {
prof_start(&prof_physics);
2023-05-12 13:22:05 -05:00
phys_step = 1;
physlag -= physMS;
phys2d_update(physMS * timescale);
2023-05-27 07:01:17 -05:00
call_physics(physMS * timescale);
2023-05-12 13:22:05 -05:00
if (sim_play == SIM_STEP) sim_pause();
phys_step = 0;
prof(&prof_physics);
}
2023-05-12 13:22:05 -05:00
if (sim_play == SIM_STEP) {
sim_pause();
render_dirty = 1;
}
2023-09-11 17:09:21 -05:00
low_fps_c = 0.0f;
}
2022-01-19 16:43:21 -06:00
2023-09-11 17:09:21 -05:00
if (sim_play == SIM_PLAY || render_dirty || low_fps_c >= low_fps) {
prof_start(&prof_draw);
window_render(&mainwin);
prof(&prof_draw);
render_dirty = 0;
}
gameobjects_cleanup();
2023-08-22 22:44:09 -05:00
}
void c_clean() {
gif_rec_end("crash.gif");
};
2023-08-22 22:44:09 -05:00
void c_event(const sapp_event *e)
{
render_dirty = 1;
#ifndef NO_EDITOR
2023-09-11 15:07:36 -05:00
snk_handle_event(e);
#endif
2023-08-22 22:44:09 -05:00
switch (e->type) {
case SAPP_EVENTTYPE_MOUSE_MOVE:
input_mouse_move(e->mouse_x, e->mouse_y, e->mouse_dx, e->mouse_dy);
2023-08-22 22:44:09 -05:00
break;
case SAPP_EVENTTYPE_MOUSE_SCROLL:
input_mouse_scroll(e->scroll_x, e->scroll_y);
2023-08-22 22:44:09 -05:00
break;
case SAPP_EVENTTYPE_KEY_DOWN:
input_btn(e->key_code, e->key_repeat ? INPUT_REPEAT : INPUT_DOWN, e->modifiers);
2023-08-22 22:44:09 -05:00
break;
case SAPP_EVENTTYPE_KEY_UP:
input_btn(e->key_code, INPUT_UP, e->modifiers);
break;
case SAPP_EVENTTYPE_MOUSE_UP:
input_mouse(e->mouse_button, INPUT_UP, e->modifiers);
break;
case SAPP_EVENTTYPE_MOUSE_DOWN:
input_mouse(e->mouse_button, INPUT_DOWN, e->modifiers);
2023-08-22 22:44:09 -05:00
break;
2022-12-29 04:26:21 -06:00
2023-08-22 22:44:09 -05:00
case SAPP_EVENTTYPE_CHAR:
2023-08-31 03:10:30 -05:00
input_key(e->char_code, e->modifiers);
2023-08-22 22:44:09 -05:00
break;
case SAPP_EVENTTYPE_RESIZED:
window_resize(e->window_width, e->window_height);
break;
case SAPP_EVENTTYPE_ICONIFIED:
window_iconified(1);
break;
case SAPP_EVENTTYPE_RESTORED:
window_iconified(0);
break;
case SAPP_EVENTTYPE_FOCUSED:
window_focused(1);
break;
case SAPP_EVENTTYPE_UNFOCUSED:
window_focused(0);
break;
case SAPP_EVENTTYPE_SUSPENDED:
window_suspended(1);
break;
case SAPP_EVENTTYPE_QUIT_REQUESTED:
window_quit();
break;
2023-05-12 13:22:05 -05:00
}
2022-12-29 04:26:21 -06:00
}
int sim_playing() { return sim_play == SIM_PLAY; }
int sim_paused() { return sim_play == SIM_PAUSE; }
2022-12-22 16:58:06 -06:00
void sim_start() {
sim_play = SIM_PLAY;
}
void sim_pause() {
sim_play = SIM_PAUSE;
}
int phys_stepping() { return sim_play == SIM_STEP; }
2023-03-10 13:13:48 -06:00
void sim_step() {
sim_play = SIM_STEP;
2022-12-22 16:58:06 -06:00
}
2022-12-22 16:58:06 -06:00
void set_timescale(float val) {
2023-05-12 13:22:05 -05:00
timescale = val;
}
double get_timescale()
{
return timescale;
}
2023-08-22 22:44:09 -05:00
static sapp_desc start_desc = {
.width = 720,
.height = 1080,
.high_dpi = 0,
.sample_count = 1,
.fullscreen = 1,
.window_title = "Yugine",
.enable_clipboard = false,
.clipboard_size = 0,
.enable_dragndrop = true,
.max_dropped_files = 1,
.max_dropped_file_path_length = 2048,
.init_cb = c_init,
.frame_cb = c_frame,
.cleanup_cb = c_clean,
.event_cb = c_event,
.logger.func = sg_logging,
};
void app_name(char *name)
{
start_desc.window_title = strdup(name);
}
2023-09-05 09:38:52 -05:00
sapp_desc sokol_main(int argc, char **argv) {
#ifndef NDEBUG
log_init();
#ifdef __linux__
int logout = 0;
if (logout) {
time_t now = time(NULL);
char fname[100];
snprintf(fname, 100, "yugine-%d.log", now);
log_setfile(fname);
}
YughInfo("Starting yugine version %s.", VER);
FILE *sysinfo = NULL;
/* sysinfo = popen("uname -a", "r");
if (!sysinfo) {
YughWarn("Failed to get sys info.");
} else {
log_cat(sysinfo);
pclose(sysinfo);
}*/
signal(SIGSEGV, seghandle);
signal(SIGABRT, seghandle);
signal(SIGFPE, seghandle);
signal(SIGBUS, seghandle);
#endif
#endif
stm_setup(); /* time */
resources_init();
phys2d_init();
2023-08-31 03:10:30 -05:00
script_startup();
script_dofile("scripts/engine.js");
int argsize = 0;
for (int i = 0; i < argc; i++) {
2023-09-05 09:38:52 -05:00
argsize += strlen(argv[i]);
if (argc > i+1) argsize++;
}
char cmdstr[argsize];
cmdstr[0] = '\0';
2023-08-22 22:44:09 -05:00
for (int i = 0; i < argc; i++) {
2023-09-05 09:38:52 -05:00
strcat(cmdstr, argv[i]);
if (argc > i+1) strcat(cmdstr, " ");
}
2023-09-05 09:38:52 -05:00
script_evalf("cmd_args('%s');", cmdstr);
sound_init();
input_init();
script_dofile("warmup.js");
start_desc.width = mainwin.width;
start_desc.height = mainwin.height;
start_desc.fullscreen = 0;
return start_desc;
2023-08-22 22:44:09 -05:00
}