This commit is contained in:
John Alanbrook 2023-05-03 18:50:37 +00:00
parent d3cb9278a9
commit bbbfb97b60
7 changed files with 115 additions and 53 deletions

View file

@ -83,7 +83,7 @@ ifeq ($(OS), WIN32)
EXT = .exe EXT = .exe
else else
LINKER_FLAGS = $(QFLAGS) -L/usr/local/lib -rdynamic LINKER_FLAGS = $(QFLAGS) -L/usr/local/lib -rdynamic
ELIBS = engine pthread yughc glfw3 quickjs tcc c m dl ELIBS = engine pthread yughc glfw3 tcc quickjs c m dl
CLIBS = CLIBS =
endif endif

View file

@ -35,9 +35,13 @@ void mYughLog(int category, int priority, int line, const char *file, const char
if (priority >= logLevel) { if (priority >= logLevel) {
time_t now = time(0); time_t now = time(0);
char timestr[50];
// strftime(timestr,50,"
char *dt = ctime(&now); char *dt = ctime(&now);
dt[strlen(dt) - 1] = '\0'; // The above time conversion adds a \n; this removes it dt[strlen(dt) - 1] = '\0'; // The above time conversion adds a \n; this removes it
double ticks = (double)clock()/CLOCKS_PER_SEC;
va_list args; va_list args;
va_start(args, message); va_start(args, message);
char msgbuffer[ERROR_BUFFER] = { '\0' }; char msgbuffer[ERROR_BUFFER] = { '\0' };
@ -45,7 +49,7 @@ void mYughLog(int category, int priority, int line, const char *file, const char
va_end(args); va_end(args);
char buffer[ERROR_BUFFER] = { '\0' }; char buffer[ERROR_BUFFER] = { '\0' };
snprintf(buffer, ERROR_BUFFER, "%s:%d: %s, %s: %s\n", file, line, logstr[priority], catstr[category], msgbuffer); snprintf(buffer, ERROR_BUFFER, "%g | %s:%d: %s, %s: %s\n", ticks, file, line, logstr[priority], catstr[category], msgbuffer);
log_print(buffer); log_print(buffer);

View file

@ -52,6 +52,8 @@ void engine_init()
if (!glfwInit()) { if (!glfwInit()) {
YughError("Could not init GLFW. Exiting."); YughError("Could not init GLFW. Exiting.");
exit(1); exit(1);
} else {
YughInfo("Initted GLFW.");
} }
resources_init(); resources_init();

View file

@ -8,10 +8,22 @@
#include "time.h" #include "time.h"
#include "font.h" #include "font.h"
#inlcude "stb_ds.h"
int32_t mouseWheelX = 0; int32_t mouseWheelX = 0;
int32_t mouseWheelY = 0; int32_t mouseWheelY = 0;
float deltaT = 0; float deltaT = 0;
JSValue jsinput;
JSValue jsnum;
JSValue jsgamepadstr[15];
JSValue jsaxesstr[4];
JSValue jsinputstate[5];
JSValue jsaxis;
JSValue jsany;
JSValue jsmouse;
JSValue jspos;
cpVect mouse_pos = {0,0}; cpVect mouse_pos = {0,0};
cpVect mouse_delta = {0,0}; cpVect mouse_delta = {0,0};
@ -28,6 +40,26 @@ static int mquit = 0;
static struct callee pawn_callee; static struct callee pawn_callee;
static struct callee gamepad_callee; static struct callee gamepad_callee;
static struct {
char *key;
JSValue value;
} *jshash = NULL;
JSValue input2js(const char *input)
{
int idx = shgeti(jshash, input);
if (idx != -1)
return jshash[idx].value;
if (shlen(jshash) == 0)
sh_new_arena(jshash);
JSValue n = str2js(input);
shput(jshash, input, str2js(input));
return n;
}
const char *gamepad2str(int btn) const char *gamepad2str(int btn)
{ {
switch(btn) { switch(btn) {
@ -84,22 +116,25 @@ static void cursor_pos_cb(GLFWwindow *w, double xpos, double ypos)
mouse_pos.x = xpos; mouse_pos.x = xpos;
mouse_pos.y = ypos; mouse_pos.y = ypos;
JSValue argv[2]; JSValue argv[4];
argv[0] = JS_NewString(js, "input_mouse_pos"); argv[0] = jsinput;
argv[1] = vec2js(mouse_pos); argv[1] = jsmouse;
script_callee(pawn_callee, 2, argv); argv[2] = jspos;
JS_FreeValue(js, argv[0]); argv[3] = vec2js(mouse_pos);
JS_FreeValue(js, argv[1]); script_callee(pawn_callee, 4, argv);
JS_FreeValue(js, argv[3]);
} }
static void pawn_call_keydown(int key) static void pawn_call_keydown(int key)
{ {
JSValue argv[2]; JSValue argv[4];
argv[0] = JS_NewString(js, "input_num_pressed"); argv[0] = jsinput;
argv[1] = JS_NewInt32(js, key); argv[1] = jsnum;
script_callee(pawn_callee, 2, argv); argv[2] = jsinputstate[2];
JS_FreeValue(js, argv[0]); /* TODO: Could cache */
JS_FreeValue(js, argv[1]); argv[3] = JS_NewInt32(js, key);
script_callee(pawn_callee, 4, argv);
JS_FreeValue(js, argv[3]);
} }
static void scroll_cb(GLFWwindow *w, double xoffset, double yoffset) static void scroll_cb(GLFWwindow *w, double xoffset, double yoffset)
@ -112,33 +147,33 @@ static void mb_cb(GLFWwindow *w, int button, int action, int mods)
{ {
const char *act = NULL; const char *act = NULL;
const char *btn = NULL; const char *btn = NULL;
JSValue argv[3];
argv[0] = jsinput;
switch (action) { switch (action) {
case GLFW_PRESS: case GLFW_PRESS:
act = "pressed"; argv[3] = jsinputstate[2];
add_downkey(button); add_downkey(button);
break; break;
case GLFW_RELEASE: case GLFW_RELEASE:
act = "released";
rm_downkey(button); rm_downkey(button);
call_input_signal("input_any_released"); argv[2] = jsinputstate[0];
argv[1] = jsany;
script_callee(pawn_callee,3,argv);
break; break;
case GLFW_REPEAT: case GLFW_REPEAT:
act = "repeat"; argv[2] = jsinputstate[1];
break; break;
} }
btn = keyname_extd(button, button);
if (!act || !btn) { if (!act || !btn) {
YughError("Tried to call a mouse action that doesn't exist."); YughError("Tried to call a mouse action that doesn't exist.");
return; return;
} }
char keystr[50] = {'\0'}; argv[1] = input2js(keyname_extd(button,button));
snprintf(keystr, 50, "input_%s_%s", btn, act); script_callee(pawn_callee,3,argv);
call_input_signal(keystr);
} }
void set_mouse_mode(int mousemode) void set_mouse_mode(int mousemode)
@ -187,9 +222,6 @@ void joystick_cb(int jid, int event)
} }
} }
JSValue jsgamepadstr[15];
JSValue jsaxesstr[4];
JSValue jsaxis;
void input_init() void input_init()
{ {
@ -215,6 +247,17 @@ void input_init()
/* Grab all joysticks initially present */ /* Grab all joysticks initially present */
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
if (glfwJoystickPresent(i)) joystick_add(i); if (glfwJoystickPresent(i)) joystick_add(i);
jsinputstate[0] = str2js("released");
jsinputstate[1] = str2js("rep");
jsinputstate[2] = str2js("pressed");
jsinputstate[3] = str2js("pressrep");
jsinputstate[4] = str2js("down");
jsinput = str2js("input");
jsnum = str2js("num");
jsany = str2js("any");
jsmouse = str2js("mouse");
jspos = str2js("pos");
} }
void input_to_nuke() void input_to_nuke()
@ -360,9 +403,11 @@ const char *keyname_extd(int key, int scancode) {
} }
void call_input_down(int *key) { void call_input_down(int *key) {
char keystr[50] = {'\0'}; JSValue argv[3];
snprintf(keystr, 50, "input_%s_down", keyname_extd(*key, 0)); argv[0] = jsinput;
call_input_signal(keystr); argv[1] = input2js(keyname_extd(*key, *key));
argv[2] = jsinputstate[4];
script_callee(pawn_callee,3,argv);
} }
@ -461,37 +506,39 @@ int key_is_num(int key) {
void win_key_callback(GLFWwindow *w, int key, int scancode, int action, int mods) void win_key_callback(GLFWwindow *w, int key, int scancode, int action, int mods)
{ {
char keystr[50] = {'\0'}; JSValue argv[3];
char kkey[50] = {'\0'}; argv[0] = jsinput;
snprintf(kkey, 50, "%s", keyname_extd(key,scancode)); argv[1] = input2js(keyname_extd(key,scancode));
switch (action) { switch (action) {
case GLFW_PRESS: case GLFW_PRESS:
snprintf(keystr, 50, "input_%s_pressed", kkey); argv[2] = jsinputstate[2];
call_input_signal(keystr); script_callee(pawn_callee, 3, argv);
snprintf(keystr,50,"input_%s_pressrep", kkey); argv[2] = jsinputstate[3];
call_input_signal(keystr); script_callee(pawn_callee,3,argv);
add_downkey(key); add_downkey(key);
call_input_signal("input_any_pressed"); argv[1] = jsany;
argv[2] = jsinputstate[2];
script_callee(pawn_callee,3,argv);
if (key_is_num(key)) { if (key_is_num(key))
pawn_call_keydown(key-48); pawn_call_keydown(key-48);
}
break; break;
case GLFW_RELEASE: case GLFW_RELEASE:
snprintf(keystr, 50, "input_%s_released", kkey); argv[2] = jsinputstate[0];
call_input_signal(keystr); script_callee(pawn_callee,3,argv);
rm_downkey(key); rm_downkey(key);
call_input_signal("input_any_released"); argv[1] = jsany;
script_callee(pawn_callee,3,argv);
break; break;
case GLFW_REPEAT: case GLFW_REPEAT:
snprintf(keystr, 50, "input_%s_rep", kkey); argv[2] = jsinputstate[1];
call_input_signal(keystr); script_callee(pawn_callee,3,argv);
snprintf(keystr,50,"input_%s_pressrep", kkey); argv[2] = jsinputstate[3];
call_input_signal(keystr); script_callee(pawn_callee,3,argv);
break; break;
} }
} }

View file

@ -95,7 +95,6 @@ GLuint load_shader_from_file(const char *path, int type)
void shader_compile(struct shader *shader) void shader_compile(struct shader *shader)
{ {
YughInfo("Making shader with %s and %s.", shader->vertpath, shader->fragpath); YughInfo("Making shader with %s and %s.", shader->vertpath, shader->fragpath);
clock_t startt = clock();
GLuint vert = load_shader_from_file(shader->vertpath, GL_VERTEX_SHADER); GLuint vert = load_shader_from_file(shader->vertpath, GL_VERTEX_SHADER);
GLuint frag = load_shader_from_file(shader->fragpath, GL_FRAGMENT_SHADER); GLuint frag = load_shader_from_file(shader->fragpath, GL_FRAGMENT_SHADER);
@ -108,9 +107,6 @@ void shader_compile(struct shader *shader)
glDeleteShader(vert); glDeleteShader(vert);
glDeleteShader(frag); glDeleteShader(frag);
startt = clock() - startt;
YughInfo("Created shader in %d ticks (%f seconds).", startt, ((float)startt/CLOCKS_PER_SEC));
} }
void shader_use(struct shader *shader) void shader_use(struct shader *shader)

View file

@ -12,7 +12,6 @@
#define MINIAUDIO_IMPLEMENTATION #define MINIAUDIO_IMPLEMENTATION
#include "miniaudio.h" #include "miniaudio.h"
#include "timer.h" #include "timer.h"
#include "quickjs/quickjs.h" #include "quickjs/quickjs.h"
@ -58,7 +57,18 @@ int fps;
#define SIM_PLAY 1 #define SIM_PLAY 1
#define SIM_PAUSE 2 #define SIM_PAUSE 2
#define SIM_STEP 3 #define SIM_STEP 3
/*
int __builtin_clz(unsigned int a)
{
int to;
__asm__ __volatile__(
"bsr %edi, %eax\n\t"
"xor $31, %eax\n\t"
: "=&a"(to));
return to;
}
*/
void print_stacktrace() void print_stacktrace()
{ {
void *ents[512]; void *ents[512];
@ -195,6 +205,8 @@ int main(int argc, char **args) {
input_init(); input_init();
openglInit(); openglInit();
YughWarn("%d", __builtin_clz(500));
if (ed) if (ed)
script_dofile("scripts/editor.js"); script_dofile("scripts/editor.js");
else else

View file

@ -472,8 +472,9 @@ var Register = {
this.nk_guis.forEach(x => x[0].call(x[1])); this.nk_guis.forEach(x => x[0].call(x[1]));
}, },
kbm_input(fn, ...args) { kbm_input(src, btn, state, ...args) {
Player.players[0].input(fn, ...args); var input = `${src}_${btn}_${state}`;
Player.players[0].input(input, ...args);
}, },
gamepad_playermap: [], gamepad_playermap: [],