This commit is contained in:
John Alanbrook 2024-09-03 14:08:46 -05:00
parent 99bd0091f9
commit 5ddf3558ef
12 changed files with 117 additions and 26 deletions

View file

@ -556,9 +556,8 @@ Object.defineProperty(Object.prototype, 'obscure', {
Object.defineProperty(Object.prototype, 'mixin', { Object.defineProperty(Object.prototype, 'mixin', {
value: function(obj) { value: function(obj) {
if (typeof obj === 'string') { if (typeof obj === 'string')
obj = use(obj); obj = use(obj);
}
if (obj) if (obj)
Object.mixin(this, obj); Object.mixin(this, obj);

View file

@ -4,6 +4,8 @@ debug.urnames = false;
debug.termout = true; debug.termout = true;
debug.console = false; debug.console = false;
debug.cheat = false; debug.cheat = false;
debug.meta = false;
debug.fn_break = function(fn,obj = globalThis) { debug.fn_break = function(fn,obj = globalThis) {
if (typeof fn !== 'function') return; if (typeof fn !== 'function') return;

View file

@ -205,6 +205,7 @@ game.tex_hotreload = function()
} }
game.texture = function (path) { game.texture = function (path) {
if (!path) return game.texture("icons/no_text.gif");
path = Resources.find_image(path); path = Resources.find_image(path);
if (!io.exists(path)) { if (!io.exists(path)) {

View file

@ -975,6 +975,76 @@ prosperon.make_camera = function()
var screencolor; var screencolor;
globalThis.imtoggle = function(name, obj, field) { obj[field] = imgui.checkbox(name, obj[field]); }
var replstr = "";
var imdebug = function()
{
imtoggle("Physics", debug, 'draw_phys');
imtoggle("Bouning boxes", debug, 'draw_bb');
imtoggle("Gizmos", debug, 'draw_gizmos');
imtoggle("Names", debug, 'draw_names');
imtoggle("Sprite nums", debug, 'sprite_nums');
imtoggle("Debug overlay", debug, 'show');
imtoggle("Show ur names", debug, 'urnames');
}
var imgui_fn = function()
{
render.imgui_new(window.size.x, window.size.y, 0.01);
if (debug.console) debug.console = imgui.window("console", _ => { imgui.text(console.transcript); replstr = imgui.textinput(undefined, replstr); imgui.button("submit", _ => { eval(replstr); replstr = ""; }); });
imgui.mainmenubar(_=>{
imgui.menu("File", _ => {
imgui.menu("Game settings", _ => {
window.title = imgui.textinput("Title", window.title);
window.icon = imgui.textinput("Icon", window.icon);
imgui.button("Refresh window", _ => {
window.set_icon(game.texture(window.icon));
});
});
imgui.button("quit", os.quit);
});
imgui.menu("Debug", imdebug);
imgui.menu("View", _ => {
imtoggle("Profiler", gamestate, 'showprofiler');
imtoggle("Terminal out", debug, 'termout');
imtoggle("Meta [f7]", debug, 'meta');
imtoggle("Cheats [f8]", debug, 'cheat');
imtoggle("Console [f9]", debug, 'console');
});
imgui.sokol_gfx();
imgui.menu("Graphics", _ => {
imtoggle("Draw sprites", render, 'draw_sprites');
imtoggle("Draw particles", render, 'draw_particles');
imtoggle("Draw HUD", render, 'draw_hud');
imtoggle("Draw GUI", render, 'draw_gui');
imtoggle("Draw gizmos", render, 'draw_gizmos');
imgui.menu("Window", _ => {
window.fullscreen = imgui.checkbox("fullscreen", window.fullscreen);
// window.vsync = imgui.checkbox("vsync", window.vsync);
imgui.menu("MSAA", _ => {
for (var msaa of gamestate.msaa)
imgui.button(msaa + "x", _ => window.sample_count = msaa);
});
imgui.menu("Resolution", _ => {
for (var res of gamestate.resolutions)
imgui.button(res, _ => window.resolution = res);
});
});
});
prosperon.menu_hook?.();
});
prosperon.imgui();
render.imgui_end();
}
prosperon.render = function() prosperon.render = function()
{ {
profile.frame("world"); profile.frame("world");
@ -1039,9 +1109,8 @@ prosperon.render = function()
profile.frame("imgui"); profile.frame("imgui");
render.imgui_new(window.size.x, window.size.y, 0.01); if (debug.show)
prosperon.imgui(); imgui_fn();
render.imgui_end();
profile.endframe(); profile.endframe();

View file

@ -12,16 +12,6 @@ if (os.sys() === 'macos') {
appy.inputs['S-q'] = os.quit; appy.inputs['S-q'] = os.quit;
} }
game.op_search = function()
{
if (!game.ooop) return;
game.ooop = imgui.window("operator search", _ => {
imgui.text("test");
});
}
game.ooop = false;
//appy.inputs.f12 = function() { mum.debug = !mum.debug; } //appy.inputs.f12 = function() { mum.debug = !mum.debug; }
appy.inputs['C-space'] = function() { appy.inputs['C-space'] = function() {
game.ooop = !game.ooop; game.ooop = !game.ooop;
@ -258,7 +248,11 @@ Cmdline.register_order("play", function(argv) {
game.title = project.title; game.title = project.title;
game.size = [1280,720]; game.size = [1280,720];
window.size = game.size; window.size = game.size;
if (io.exists("config.js"))
global.mixin("config.js"); global.mixin("config.js");
else
console.warn('No config.js file found. Starting with default parameters.');
if (project.title) window.title = project.title; if (project.title) window.title = project.title;
game.engine_start(function() { game.engine_start(function() {

View file

@ -13,6 +13,9 @@ static sgimgui_t sgimgui;
#include "jsffi.h" #include "jsffi.h"
static int wantkeys = 0;
static int wantmouse = 0;
JSC_SCALL(imgui_window, JSC_SCALL(imgui_window,
bool active = true; bool active = true;
ImGui::Begin(str, &active); ImGui::Begin(str, &active);
@ -187,11 +190,12 @@ JSValue gui_init(JSContext *js)
return imgui; return imgui;
} }
int gui_input(sapp_event *e) void gui_input(sapp_event *e)
{ {
if (started) simgui_handle_event(e);
return simgui_handle_event(e); ImGuiIO io = ImGui::GetIO();
return 0; wantkeys = io.WantCaptureKeyboard;
wantmouse = io.WantCaptureMouse;
} }
void gui_newframe(int x, int y, float dt) void gui_newframe(int x, int y, float dt)
@ -213,3 +217,6 @@ void gui_exit()
{ {
sgimgui_discard(&sgimgui); sgimgui_discard(&sgimgui);
} }
int gui_wantmouse() { return wantmouse; }
int gui_wantkeys() { return wantkeys; }

View file

@ -11,10 +11,13 @@ extern "C" {
JSValue gui_init(JSContext *js); JSValue gui_init(JSContext *js);
void gui_newframe(int x, int y, float dt); void gui_newframe(int x, int y, float dt);
void gfx_gui(); void gfx_gui();
int gui_input(sapp_event *e); void gui_input(sapp_event *e);
void gui_endframe(); void gui_endframe();
void gui_exit(); void gui_exit();
int gui_wantmouse();
int gui_wantkeys();
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -2472,6 +2472,8 @@ JSC_GET(texture, width, number)
JSC_GET(texture, height, number) JSC_GET(texture, height, number)
JSC_GET(texture, frames, number) JSC_GET(texture, frames, number)
JSC_GET(texture, delays, ints) JSC_GET(texture, delays, ints)
JSC_GET(texture, size, number)
JSC_GET(texture, gpusize, number)
JSC_SCALL(texture_save, texture_save(js2texture(self), str)); JSC_SCALL(texture_save, texture_save(js2texture(self), str));
@ -2489,6 +2491,8 @@ static const JSCFunctionListEntry js_texture_funcs[] = {
MIST_GET(texture, height), MIST_GET(texture, height),
MIST_GET(texture, frames), MIST_GET(texture, frames),
MIST_GET(texture, delays), MIST_GET(texture, delays),
MIST_GET(texture, gpusize),
MIST_GET(texture, size),
MIST_FUNC_DEF(texture, save, 1), MIST_FUNC_DEF(texture, save, 1),
MIST_FUNC_DEF(texture, blit, 5), MIST_FUNC_DEF(texture, blit, 5),
MIST_FUNC_DEF(texture, getid, 0), MIST_FUNC_DEF(texture, getid, 0),
@ -2973,8 +2977,6 @@ JSC_SCALL(os_gltf_skin,
cgltf_parse_file(&options,str,&data); cgltf_parse_file(&options,str,&data);
cgltf_load_buffers(&options,data,str); cgltf_load_buffers(&options,data,str);
printf("file %s has %d skins\n", str, data->skins_count);
if (data->skins_count <= 0) { if (data->skins_count <= 0) {
ret = (JS_UNDEFINED); ret = (JS_UNDEFINED);
goto CLEANUP; goto CLEANUP;

View file

@ -117,6 +117,8 @@ struct texture *texture_from_file(const char *path) {
return NULL; return NULL;
tex->data = data; tex->data = data;
tex->size = tex->width*tex->height*4;
tex->gpusize = tex->size;
unsigned int nw = next_pow2(tex->width); unsigned int nw = next_pow2(tex->width);
unsigned int nh = next_pow2(tex->height); unsigned int nh = next_pow2(tex->height);
@ -142,6 +144,7 @@ struct texture *texture_from_file(const char *path) {
mipdata[i] = malloc(w * h * 4); mipdata[i] = malloc(w * h * 4);
stbir_resize_uint8_linear(mipdata[i-1], mipw, miph, 0, mipdata[i], w, h, 0, 4); stbir_resize_uint8_linear(mipdata[i-1], mipw, miph, 0, mipdata[i], w, h, 0, 4);
sg_img_data.subimage[0][i] = (sg_range){ .ptr = mipdata[i], .size = w*h*4 }; sg_img_data.subimage[0][i] = (sg_range){ .ptr = mipdata[i], .size = w*h*4 };
tex->gpusize += w*h*4;
mipw = w; mipw = w;
miph = h; miph = h;
@ -159,6 +162,8 @@ struct texture *texture_from_file(const char *path) {
for (int i = 1; i < mips; i++) for (int i = 1; i < mips; i++)
free(mipdata[i]); free(mipdata[i]);
return tex; return tex;
} }

View file

@ -23,6 +23,8 @@ struct texture {
int width; int width;
int height; int height;
unsigned char *data; unsigned char *data;
int size;
int gpusize;
int frames; int frames;
int *delays; int *delays;
}; };

View file

@ -13,7 +13,6 @@ timer *timer_make()
void timer_free(timer *t) void timer_free(timer *t)
{ {
printf("before free arrlen if timers is now %d\n", arrlen(timers));
for (int i = 0; i < arrlen(timers); i++) { for (int i = 0; i < arrlen(timers); i++) {
if (timers[i] == t) { if (timers[i] == t) {
arrdelswap(timers,i); arrdelswap(timers,i);
@ -22,7 +21,6 @@ void timer_free(timer *t)
} }
free(t); free(t);
printf("arrlen if timers is now %d\n", arrlen(timers));
} }
void timer_update(double dt) void timer_update(double dt)

View file

@ -110,34 +110,41 @@ void c_clean() {
void c_event(const sapp_event *e) void c_event(const sapp_event *e)
{ {
if (gui_input(e) && e->type != SAPP_EVENTTYPE_KEY_UP) return; gui_input(e);
char lcfmt[5]; char lcfmt[5];
switch (e->type) { switch (e->type) {
case SAPP_EVENTTYPE_MOUSE_MOVE: case SAPP_EVENTTYPE_MOUSE_MOVE:
if (gui_wantmouse()) return;
script_evalf("prosperon.mousemove([%g, %g], [%g, %g]);", e->mouse_x, e->mouse_y, e->mouse_dx, -e->mouse_dy); script_evalf("prosperon.mousemove([%g, %g], [%g, %g]);", e->mouse_x, e->mouse_y, e->mouse_dx, -e->mouse_dy);
break; break;
case SAPP_EVENTTYPE_MOUSE_SCROLL: case SAPP_EVENTTYPE_MOUSE_SCROLL:
if (gui_wantmouse()) return;
script_evalf("prosperon.mousescroll([%g, %g]);", e->scroll_x, e->scroll_y); script_evalf("prosperon.mousescroll([%g, %g]);", e->scroll_x, e->scroll_y);
break; break;
case SAPP_EVENTTYPE_KEY_DOWN: case SAPP_EVENTTYPE_KEY_DOWN:
if (gui_wantkeys()) return;
script_evalf("prosperon.keydown(%d, %d);", e->key_code, e->key_repeat); script_evalf("prosperon.keydown(%d, %d);", e->key_code, e->key_repeat);
break; break;
case SAPP_EVENTTYPE_KEY_UP: case SAPP_EVENTTYPE_KEY_UP:
if (gui_wantkeys()) return;
script_evalf("prosperon.keyup(%d);", e->key_code); script_evalf("prosperon.keyup(%d);", e->key_code);
break; break;
case SAPP_EVENTTYPE_MOUSE_UP: case SAPP_EVENTTYPE_MOUSE_UP:
if (gui_wantmouse()) return;
script_evalf("prosperon.mouseup(%d);", e->mouse_button); script_evalf("prosperon.mouseup(%d);", e->mouse_button);
break; break;
case SAPP_EVENTTYPE_MOUSE_DOWN: case SAPP_EVENTTYPE_MOUSE_DOWN:
if (gui_wantmouse()) return;
script_evalf("prosperon.mousedown(%d);", e->mouse_button); script_evalf("prosperon.mousedown(%d);", e->mouse_button);
break; break;
case SAPP_EVENTTYPE_CHAR: case SAPP_EVENTTYPE_CHAR:
if (gui_wantkeys()) return;
if (iswcntrl(e->char_code)) break; if (iswcntrl(e->char_code)) break;
snprintf(lcfmt, 5, "%lc", e->char_code); snprintf(lcfmt, 5, "%lc", e->char_code);
script_evalf("prosperon.textinput(`%s`);", lcfmt); script_evalf("prosperon.textinput(`%s`);", lcfmt);
@ -176,9 +183,11 @@ void c_event(const sapp_event *e)
break; break;
case SAPP_EVENTTYPE_MOUSE_ENTER: case SAPP_EVENTTYPE_MOUSE_ENTER:
if (gui_wantmouse()) return;
script_evalf("prosperon.mouseenter();"); script_evalf("prosperon.mouseenter();");
break; break;
case SAPP_EVENTTYPE_MOUSE_LEAVE: case SAPP_EVENTTYPE_MOUSE_LEAVE:
if (gui_wantmouse()) return;
script_evalf("prosperon.mouseleave();"); script_evalf("prosperon.mouseleave();");
break; break;
case SAPP_EVENTTYPE_TOUCHES_BEGAN: case SAPP_EVENTTYPE_TOUCHES_BEGAN: