prosperon/source/engine/yugine.c

245 lines
4.9 KiB
C
Raw Normal View History

2023-01-04 18:09:42 -06:00
#include "yugine.h"
2022-02-06 10:14:57 -06:00
#include "render.h"
2022-02-04 11:36:24 -06:00
#include "camera.h"
#include "window.h"
2022-01-19 16:43:21 -06:00
#include "engine.h"
2022-02-04 11:36:24 -06:00
#include "input.h"
#include "openglrender.h"
2022-08-14 18:10:29 -05:00
#include "script.h"
2022-12-23 13:48:29 -06:00
#include "log.h"
#include <stdio.h>
#include <stdlib.h>
2022-12-23 13:48:29 -06:00
2023-01-04 18:09:42 -06:00
#include "2dphysics.h"
2022-12-23 13:48:29 -06:00
#if ED
#include "editor.h"
#endif
#ifdef __linux__
#include <execinfo.h>
#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"
2022-02-04 11:36:24 -06:00
int physOn = 0;
2022-02-06 10:14:57 -06:00
double renderlag = 0;
2022-08-12 14:03:56 -05:00
double physlag = 0;
double updatelag = 0;
2022-12-20 08:16:26 -06:00
double renderMS = 1/165.f;
2022-08-12 14:03:56 -05:00
double physMS = 1/120.f;
double updateMS = 1/60.f;
2022-02-04 11:36:24 -06:00
2022-08-14 14:19:36 -05:00
static int ed = 1;
static int sim_play = 0;
static double lastTick;
2022-08-14 14:19:36 -05:00
2022-12-22 16:58:06 -06:00
static float timescale = 1.f;
2022-12-29 04:26:21 -06:00
#define FPSBUF 10
static double framems[FPSBUF];
int framei = 0;
int fps;
2022-12-27 17:54:39 -06:00
void seghandle(int sig) {
#ifdef __linux__
void *ents[512];
size_t size;
size = backtrace(ents, 512);
if (strsignal(sig)) {
YughCritical("CRASH! Signal: %s.", strsignal(sig));
}
else {
YughCritical("CRASH! Signal: %d.", sig);
}
YughCritical("====================BACKTRACE====================");
char **stackstr = backtrace_symbols(ents, size);
for (int i = 0; i < size; i++) {
YughCritical(stackstr[i]);
}
exit(1);
#endif
}
2022-02-04 11:36:24 -06:00
2022-08-07 01:43:45 -05:00
int main(int argc, char **args) {
int logout = 1;
2022-08-14 14:19:36 -05:00
for (int i = 1; i < argc; i++) {
if (args[i][0] == '-') {
switch(args[i][1]) {
case 'p':
if (strncmp(&args[i][2], "lay", 3))
continue;
ed = 0;
break;
case 'l':
if (i+1 < argc && args[i+1][0] != '-') {
log_setfile(args[i+1]);
i++;
continue;
}
else {
YughError("Expected a file for command line arg '-l'.");
exit(1);
}
case 'v':
printf("Yugine version %s, %s build.\n", VER, INFO);
printf("Copyright 2022 odplot productions LLC.\n");
exit(1);
break;
case 'h':
printf("-l Set log file\n");
printf("-play Launch engine in play mode instead of editor mode\n");
printf("-v Display engine info\n");
exit(0);
break;
case 'c':
logout = 0;
break;
2022-08-14 14:19:36 -05:00
}
}
}
2022-12-23 13:48:29 -06:00
#if DBG
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);
}
2022-08-14 14:19:36 -05:00
2022-12-23 13:48:29 -06:00
signal(SIGSEGV, seghandle);
#endif
FILE *gameinfo = NULL;
gameinfo = fopen("game.info", "w");
fprintf(gameinfo, "Yugine v. %s, sys %s.", VER, INFO);
fclose(gameinfo);
2022-01-19 16:43:21 -06:00
engine_init();
2022-08-15 16:38:21 -05:00
const GLFWvidmode *vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
YughInfo("Refresh rate is %d", vidmode->refreshRate);
2022-08-15 16:38:21 -05:00
renderMS = 1.0/vidmode->refreshRate;
2022-08-07 01:43:45 -05:00
window_set_icon("icon.png");
2022-08-14 14:19:36 -05:00
if (ed) {
editor_init(MakeSDLWindow("Editor", 600, 600, 0));
} else {
script_dofile("game.scm");
2022-08-14 14:19:36 -05:00
}
2022-01-19 16:43:21 -06:00
2022-02-04 11:36:24 -06:00
openglInit();
sim_stop();
while (!want_quit()) {
2022-12-20 08:16:26 -06:00
double elapsed = glfwGetTime() - lastTick;
deltaT = elapsed;
2022-08-12 14:03:56 -05:00
lastTick = glfwGetTime();
2022-12-29 04:26:21 -06:00
double wait = fmax(0, renderMS-elapsed);
input_poll(wait);
window_all_handle_events();
2022-01-19 16:43:21 -06:00
2022-12-29 04:26:21 -06:00
framems[framei++] = elapsed;
if (framei == FPSBUF) framei = 0;
2022-12-20 08:16:26 -06:00
2022-12-28 16:50:54 -06:00
timer_update(elapsed);
2022-08-22 08:55:54 -05:00
if (sim_play) {
physlag += elapsed;
2022-12-22 16:58:06 -06:00
call_updates(elapsed * timescale);
while (physlag >= physMS) {
physlag -= physMS;
2022-12-22 16:58:06 -06:00
phys2d_update(physMS * timescale);
call_physics(physMS * timescale);
if (sim_play == 2) sim_pause();
}
}
renderlag += elapsed;
2022-08-07 01:43:45 -05:00
if (renderlag >= renderMS) {
renderlag -= renderMS;
2022-12-20 08:16:26 -06:00
window_renderall();
2022-08-07 01:43:45 -05:00
}
2022-01-19 16:43:21 -06:00
}
return 0;
2022-01-19 16:43:21 -06:00
}
2022-12-29 04:26:21 -06:00
int frame_fps()
{
double fpsms = 0;
for (int i = 0; i < FPSBUF; i++) {
fpsms += framems[i];
}
return floor((float)FPSBUF / fpsms);
}
int sim_playing() { return sim_play; }
2022-12-22 16:58:06 -06:00
int sim_paused() { return (!sim_play && gameobjects_saved()); }
void sim_start() {
/* Save starting state of everything */
2022-12-22 16:58:06 -06:00
if (!gameobjects_saved())
gameobject_saveall();
sim_play = 1;
}
void sim_pause() {
sim_play = 0;
}
void sim_stop() {
/* Revert starting state of everything from sim_start */
sim_play = 0;
2022-12-22 16:58:06 -06:00
gameobject_loadall();
}
void sim_step() {
2022-12-22 16:58:06 -06:00
if (sim_paused()) {
sim_play = 2;
}
}
2022-12-22 16:58:06 -06:00
void set_timescale(float val) {
timescale = val;
}