editor fixes
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ void check_timer(struct timer *t, double dt)
|
||||
return;
|
||||
}
|
||||
|
||||
t->on = 0;
|
||||
timer_pause(t);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user