editor fixes

This commit is contained in:
2023-04-28 17:49:18 +00:00
parent 02707a9ada
commit 8ca1ab4384
16 changed files with 190 additions and 97 deletions

View File

@@ -35,14 +35,14 @@ struct model *MakeModel(const char *path) {
if (!result == cgltf_result_success) {
YughError("Could not read file %s.", path);
return;
return NULL;
}
result = cgltf_load_buffers(&options, data, path);
if (!result == cgltf_result_success) {
YughError("Could not load buffers for file %s.", path);
return;
return NULL;
}
struct model *model = malloc(sizeof(struct model));

View File

@@ -30,6 +30,7 @@ char consolelog[CONSOLE_BUF] = {'\0'};
void mYughLog(int category, int priority, int line, const char *file, const char *message, ...)
{
if (priority >= logLevel) {
time_t now = time(0);
char *dt = ctime(&now);
@@ -45,6 +46,9 @@ void mYughLog(int category, int priority, int line, const char *file, const char
snprintf(buffer, ERROR_BUFFER, "%s:%d: %s, %s: %s\n", file, line, logstr[priority], catstr[category], msgbuffer);
log_print(buffer);
if (priority >= 2)
js_stacktrace();
}
}

View File

@@ -988,6 +988,10 @@ JSValue duk_register(JSContext *js, JSValueConst this, int argc, JSValueConst *a
case 8:
register_gamepad(c);
break;
case 9:
stacktrace_callee = c;
break;
}
return JS_NULL;
@@ -1455,8 +1459,8 @@ JSValue duk_make_timer(JSContext *js, JSValueConst this, int argc, JSValueConst
{
double secs = js2number(argv[1]);
struct callee *c = malloc(sizeof(*c));
c->fn = argv[0];
c->obj = argv[2];
c->fn = JS_DupValue(js,argv[0]);
c->obj = JS_GetGlobalObject(js);
int id = timer_make(secs, call_callee, c, 1);
return JS_NewInt64(js, id);

View File

@@ -6,6 +6,7 @@
#include "log.h"
#include "ffi.h"
#include "time.h"
#include "font.h"
int32_t mouseWheelX = 0;
int32_t mouseWheelY = 0;
@@ -27,6 +28,27 @@ static int mquit = 0;
static struct callee pawn_callee;
static struct callee gamepad_callee;
const char *gamepad2str(int btn)
{
switch(btn) {
case GLFW_GAMEPAD_BUTTON_CROSS: return "cross";
case GLFW_GAMEPAD_BUTTON_CIRCLE: return "circle";
case GLFW_GAMEPAD_BUTTON_SQUARE: return "square";
case GLFW_GAMEPAD_BUTTON_TRIANGLE: return "triangle";
case GLFW_GAMEPAD_BUTTON_START: return "start";
case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER: return "lbump";
case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER: return "rbump";
case GLFW_GAMEPAD_BUTTON_GUIDE: return "guide";
case GLFW_GAMEPAD_BUTTON_BACK: return "back";
case GLFW_GAMEPAD_BUTTON_DPAD_UP: return "dup";
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN: return "ddown";
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT: return "dleft";
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT: return "dright";
case GLFW_GAMEPAD_BUTTON_LEFT_THUMB: return "lthumb";
case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB: return "rthumb";
}
}
void register_pawn(struct callee c)
{
pawn_callee = c;
@@ -163,6 +185,9 @@ void joystick_cb(int jid, int event)
}
}
JSValue jsgamepadstr[15];
JSValue jsaxesstr[4];
void input_init()
{
glfwSetCursorPosCallback(mainwin->window, cursor_pos_cb);
@@ -175,6 +200,14 @@ void input_init()
glfwUpdateGamepadMappings(paddb);
free(paddb);
for (int b = 0; b < 15; b++)
jsgamepadstr[b] = str2js(gamepad2str(b));
jsaxesstr[0] = str2js("axis_ljoy");
jsaxesstr[1] = str2js("axis_rjoy");
jsaxesstr[2] = str2js("axis_ltrigger");
jsaxesstr[3] = str2js("axis_rtrigger");
/* Grab all joysticks initially present */
for (int i = 0; i < 16; i++)
if (glfwJoystickPresent(i)) joystick_add(i);
@@ -327,26 +360,6 @@ void call_input_down(int *key) {
call_input_signal(keystr);
}
const char *gamepad2str(int btn)
{
switch(btn) {
case GLFW_GAMEPAD_BUTTON_CROSS: return "cross";
case GLFW_GAMEPAD_BUTTON_CIRCLE: return "circle";
case GLFW_GAMEPAD_BUTTON_SQUARE: return "square";
case GLFW_GAMEPAD_BUTTON_TRIANGLE: return "triangle";
case GLFW_GAMEPAD_BUTTON_START: return "start";
case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER: return "lbump";
case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER: return "rbump";
case GLFW_GAMEPAD_BUTTON_GUIDE: return "guide";
case GLFW_GAMEPAD_BUTTON_BACK: return "back";
case GLFW_GAMEPAD_BUTTON_DPAD_UP: return "dup";
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN: return "ddown";
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT: return "dleft";
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT: return "dright";
case GLFW_GAMEPAD_BUTTON_LEFT_THUMB: return "lthumb";
case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB: return "rthumb";
}
}
const char *axis2str(int axis)
{
@@ -380,46 +393,50 @@ void input_poll(double wait)
if (!glfwGetGamepadState(joysticks[i].id, &state)) continue;
JSValue argv[3];
argv[0] = int2js(joysticks[i].id);
argv[0] = num_cache[joysticks[i].id];
char inputstr[50];
for (int b = 0; b < 15; b++) {
argv[1] = str2js(gamepad2str(b));
argv[1] = jsgamepadstr[b];
if (state.buttons[b]) {
argv[2] = int2js(0);
argv[2] = num_cache[0];
script_callee(gamepad_callee,3,argv);
if (!joysticks[i].state.buttons[b]) {
argv[2] = int2js(1);
argv[2] = num_cache[1];
script_callee(gamepad_callee,3,argv);
}
}
else if (!state.buttons[b] && joysticks[i].state.buttons[b]) {
argv[2] = int2js(2);
argv[2] = num_cache[2];
script_callee(gamepad_callee,3,argv);
}
}
argv[1] = str2js("axis_ljoy");
argv[1] = jsaxesstr[0];
cpVect v;
v.x = state.axes[0];
v.y = -state.axes[1];
argv[2] = vec2js(v);
script_callee(gamepad_callee,3,argv);
JS_FreeValue(js, argv[2]);
argv[1] = str2js("axis_rjoy");
argv[1] = jsaxesstr[1];
v.x = state.axes[2];
v.y = -state.axes[3];
argv[2] = vec2js(v);
script_callee(gamepad_callee,3,argv);
JS_FreeValue(js, argv[2]);
argv[1] = str2js("axis_ltrigger");
argv[1] = jsaxesstr[2];
argv[2] = num2js((state.axes[4]+1)/2);
script_callee(gamepad_callee,3,argv);
JS_FreeValue(js, argv[2]);
argv[1] = str2js("axis_rtrigger");
argv[1] = jsaxesstr[3];
argv[2] = num2js((state.axes[5]+1)/2);
script_callee(gamepad_callee,3,argv);
script_callee(gamepad_callee,3,argv);
JS_FreeValue(js, argv[2]);
joysticks[i].state = state;
}

View File

@@ -30,20 +30,27 @@ static int load_prefab(const char *fpath, const struct stat *sb, int typeflag) {
void script_startup()
{
rt = JS_NewRuntime();
JS_SetMaxStackSize(rt,0);
js = JS_NewContext(rt);
ffi_load();
}
JSValue num_cache[100] = {0};
void script_init() {
/* Load all prefabs into memory */
script_dofile("scripts/engine.js");
script_dofile("config.js");
for (int i = 0; i < 100; i++)
num_cache[i] = int2js(i);
}
void script_run(const char *script) {
JS_FreeValue(js, JS_Eval(js, script, strlen(script), "script", 0));
}
struct callee stacktrace_callee;
time_t file_mod_secs(const char *file) {
struct stat attr;
stat(file, &attr);
@@ -52,23 +59,15 @@ time_t file_mod_secs(const char *file) {
void js_stacktrace()
{
YughWarn("Dumping stack ...");
JSValue error = JS_NewError(js);
JSValue stack = JS_GetPropertyStr(js, error, "stack");
if (JS_IsNull(stack)) return;
const char *stackstr = JS_ToCString(js,stack);
log_print(stackstr);
JS_FreeCString(js,stackstr);
JS_FreeValue(js,stack);
JS_FreeValue(js, error);
call_callee(&stacktrace_callee);
return;
}
void js_dump_stack()
{
js_stacktrace();
return;
JSValue exception = JS_GetException(js);
if (JS_IsNull(exception)) return;
JSValue val = JS_GetPropertyStr(js, exception, "stack");
@@ -94,7 +93,7 @@ int js_print_exception(JSValue v)
const char *name = JS_ToCString(js, JS_GetPropertyStr(js, exception, "name"));
const char *msg = JS_ToCString(js, JS_GetPropertyStr(js, exception, "message"));
const char *stack = JS_ToCString(js, val);
YughError("%s :: %s\n%s", name, msg, stack);
YughWarn("%s :: %s\n%s", name, msg, stack);
JS_FreeCString(js, name);
JS_FreeCString(js, msg);

View File

@@ -12,6 +12,9 @@ struct callee {
JSValue obj;
};
extern struct callee stacktrace_callee;
extern JSValue num_cache[100];
void script_startup();
void script_init();
void script_run(const char *script);

View File

@@ -24,7 +24,7 @@ int make_sprite(int go)
struct sprite sprite = {
.color = {1.f, 1.f, 1.f},
.size = {1.f, 1.f},
.tex = texture_loadfromfile("ph.png"),
.tex = texture_loadfromfile(NULL),
.go = go,
.next = -1,
.layer = 0,

View File

@@ -17,9 +17,17 @@ static struct {
} *texhash = NULL;
struct Texture *tex_default;
struct Texture *texture_notex()
{
return texture_pullfromfile("./icons/no_tex.png");
}
/* If an empty string or null is put for path, loads default texture */
struct Texture *texture_pullfromfile(const char *path)
{
if (!path) return texture_notex();
int index = shgeti(texhash, path);
if (index != -1)
return texhash[index].value;
@@ -48,8 +56,7 @@ struct Texture *texture_pullfromfile(const char *path)
if (data == NULL) {
YughError("STBI failed to load file %s with message: %s\nOpening default instead.", path, stbi_failure_reason());
print_stacktrace();
return texture_pullfromfile("./icons/no_tex.png");
return texture_notex();
}
tex->data = data;

View File

@@ -21,7 +21,7 @@ void check_timer(struct timer *t, double dt)
return;
}
t->on = 0;
timer_pause(t);
return;
}
}

View File

@@ -28,6 +28,7 @@
#include <signal.h>
#include <time.h>
#include <execinfo.h>
#include "string.h"
@@ -73,8 +74,7 @@ void print_stacktrace()
for (int i = 0; i < size; i++)
YughCritical(stackstr[i]);
js_dump_stack();
js_stacktrace();
}
void seghandle(int sig) {