[in-app console]
- splitting input state from app structures in milepost, so that it can be used from another thread than main event thread. - Adding a collapsable debug overlay to orca window (wip)
This commit is contained in:
parent
47722e99ca
commit
81ead1ba91
2
milepost
2
milepost
|
@ -1 +1 @@
|
||||||
Subproject commit f1d6e0f15cfa27ef3670c23ea4f372904aac109d
|
Subproject commit ab150f94f2a9232d47f8a34213dc92dc23438c7f
|
Binary file not shown.
|
@ -76,7 +76,9 @@ if args.res_dirs != None:
|
||||||
for res in args.res_dirs:
|
for res in args.res_dirs:
|
||||||
shutil.copytree(res, res_dir)
|
shutil.copytree(res, res_dir)
|
||||||
|
|
||||||
|
# default fonts
|
||||||
shutil.copy(args.orca_dir + '/resources/OpenSansLatinSubset.ttf', res_dir)
|
shutil.copy(args.orca_dir + '/resources/OpenSansLatinSubset.ttf', res_dir)
|
||||||
|
shutil.copy(args.orca_dir + '/resources/Andale Mono.ttf', res_dir)
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
#NOTE make icon
|
#NOTE make icon
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
163
src/main.c
163
src/main.c
|
@ -72,10 +72,10 @@ int orca_assert(const char* file, const char* function, int line, const char* sr
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
mg_font mg_font_create_default()
|
mg_font orca_font_create(const char* resourcePath)
|
||||||
{
|
{
|
||||||
//NOTE(martin): create default font
|
//NOTE(martin): create default font
|
||||||
str8 fontPath = mp_app_get_resource_path(mem_scratch(), "../resources/OpenSansLatinSubset.ttf");
|
str8 fontPath = mp_app_get_resource_path(mem_scratch(), resourcePath);
|
||||||
char* fontPathCString = str8_to_cstring(mem_scratch(), fontPath);
|
char* fontPathCString = str8_to_cstring(mem_scratch(), fontPath);
|
||||||
|
|
||||||
FILE* fontFile = fopen(fontPathCString, "r");
|
FILE* fontFile = fopen(fontPathCString, "r");
|
||||||
|
@ -105,20 +105,43 @@ mg_font mg_font_create_default()
|
||||||
return(font);
|
return(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mg_font mg_font_create_default()
|
||||||
|
{
|
||||||
|
return(orca_font_create("../resources/OpenSansLatinSubset.ttf"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#include"bindgen_core_api.c"
|
#include"bindgen_core_api.c"
|
||||||
#include"canvas_api_bind.c"
|
#include"canvas_api_bind.c"
|
||||||
#include"bindgen_gles_api.c"
|
#include"bindgen_gles_api.c"
|
||||||
#include"manual_gles_api.c"
|
#include"manual_gles_api.c"
|
||||||
|
|
||||||
|
typedef struct orca_debug_overlay
|
||||||
|
{
|
||||||
|
bool show;
|
||||||
|
mg_surface surface;
|
||||||
|
mg_canvas canvas;
|
||||||
|
mg_font font;
|
||||||
|
ui_context ui;
|
||||||
|
|
||||||
|
} orca_debug_overlay;
|
||||||
|
|
||||||
|
void debug_overlay_toogle(orca_debug_overlay* overlay)
|
||||||
|
{
|
||||||
|
overlay->show = !overlay->show;
|
||||||
|
mg_surface_set_hidden(overlay->surface, !overlay->show);
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct orca_app
|
typedef struct orca_app
|
||||||
{
|
{
|
||||||
mp_window window;
|
mp_window window;
|
||||||
mg_surface surface;
|
mg_surface surface;
|
||||||
mg_surface mtlSurface;
|
|
||||||
mg_canvas canvas;
|
mg_canvas canvas;
|
||||||
|
|
||||||
orca_runtime runtime;
|
orca_runtime runtime;
|
||||||
|
|
||||||
|
orca_debug_overlay debugOverlay;
|
||||||
|
|
||||||
} orca_app;
|
} orca_app;
|
||||||
|
|
||||||
char m3_type_to_tag(M3ValueType type)
|
char m3_type_to_tag(M3ValueType type)
|
||||||
|
@ -299,7 +322,7 @@ void* orca_runloop(void* user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//mg_canvas_prepare(app->canvas);
|
//NOTE: setup ui context
|
||||||
|
|
||||||
//NOTE: prepare GL surface
|
//NOTE: prepare GL surface
|
||||||
mg_surface_prepare(app->surface);
|
mg_surface_prepare(app->surface);
|
||||||
|
@ -321,11 +344,18 @@ void* orca_runloop(void* user)
|
||||||
m3_Call(eventHandlers[G_EVENT_FRAME_RESIZE], 2, args);
|
m3_Call(eventHandlers[G_EVENT_FRAME_RESIZE], 2, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ui_set_context(&app->debugOverlay.ui);
|
||||||
|
|
||||||
while(!mp_should_quit())
|
while(!mp_should_quit())
|
||||||
{
|
{
|
||||||
mp_event event = {0};
|
mp_event event = {0};
|
||||||
while(mp_next_event(&event))
|
while(mp_next_event(&event))
|
||||||
{
|
{
|
||||||
|
if(app->debugOverlay.show)
|
||||||
|
{
|
||||||
|
ui_process_event(event);
|
||||||
|
}
|
||||||
|
|
||||||
switch(event.type)
|
switch(event.type)
|
||||||
{
|
{
|
||||||
case MP_EVENT_WINDOW_CLOSE:
|
case MP_EVENT_WINDOW_CLOSE:
|
||||||
|
@ -336,7 +366,7 @@ void* orca_runloop(void* user)
|
||||||
case MP_EVENT_WINDOW_RESIZE:
|
case MP_EVENT_WINDOW_RESIZE:
|
||||||
{
|
{
|
||||||
mp_rect frame = {0, 0, event.frame.rect.w, event.frame.rect.h};
|
mp_rect frame = {0, 0, event.frame.rect.w, event.frame.rect.h};
|
||||||
mg_surface_set_frame(app->mtlSurface, frame);
|
mg_surface_set_frame(app->surface, frame);
|
||||||
|
|
||||||
if(eventHandlers[G_EVENT_FRAME_RESIZE])
|
if(eventHandlers[G_EVENT_FRAME_RESIZE])
|
||||||
{
|
{
|
||||||
|
@ -382,6 +412,11 @@ void* orca_runloop(void* user)
|
||||||
{
|
{
|
||||||
if(event.key.action == MP_KEY_PRESS)
|
if(event.key.action == MP_KEY_PRESS)
|
||||||
{
|
{
|
||||||
|
if(event.key.code == MP_KEY_D && (event.key.mods & (MP_KEYMOD_SHIFT | MP_KEYMOD_CMD)))
|
||||||
|
{
|
||||||
|
debug_overlay_toogle(&app->debugOverlay);
|
||||||
|
}
|
||||||
|
|
||||||
if(eventHandlers[G_EVENT_KEY_DOWN])
|
if(eventHandlers[G_EVENT_KEY_DOWN])
|
||||||
{
|
{
|
||||||
const void* args[1] = {&event.key.code};
|
const void* args[1] = {&event.key.code};
|
||||||
|
@ -412,7 +447,72 @@ void* orca_runloop(void* user)
|
||||||
|
|
||||||
mg_present();
|
mg_present();
|
||||||
|
|
||||||
//TODO: update and render
|
if(app->debugOverlay.show)
|
||||||
|
{
|
||||||
|
ui_style debugUIDefaultStyle = {.bgColor = {0},
|
||||||
|
.color = {1, 1, 1, 1},
|
||||||
|
.font = app->debugOverlay.font,
|
||||||
|
.fontSize = 16,
|
||||||
|
.borderColor = {1, 0, 0, 1},
|
||||||
|
.borderSize = 2};
|
||||||
|
|
||||||
|
ui_style_mask debugUIDefaultMask = UI_STYLE_BG_COLOR
|
||||||
|
| UI_STYLE_COLOR
|
||||||
|
| UI_STYLE_BORDER_COLOR
|
||||||
|
| UI_STYLE_BORDER_SIZE
|
||||||
|
| UI_STYLE_FONT
|
||||||
|
| UI_STYLE_FONT_SIZE;
|
||||||
|
|
||||||
|
ui_frame(&debugUIDefaultStyle, debugUIDefaultMask)
|
||||||
|
{
|
||||||
|
ui_style_next(&(ui_style){.size.width = {UI_SIZE_PARENT, 1},
|
||||||
|
.size.height = {UI_SIZE_PARENT, 1, 1}},
|
||||||
|
UI_STYLE_SIZE);
|
||||||
|
|
||||||
|
ui_container("overlay area", 0)
|
||||||
|
{
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
|
||||||
|
ui_style_next(&(ui_style){.size.width = {UI_SIZE_PARENT, 1},
|
||||||
|
.size.height = {UI_SIZE_PARENT, 0.4},
|
||||||
|
.bgColor = {0, 0, 0, 0.5}},
|
||||||
|
UI_STYLE_SIZE
|
||||||
|
|UI_STYLE_BG_COLOR);
|
||||||
|
|
||||||
|
ui_container("log console", UI_FLAG_DRAW_BACKGROUND)
|
||||||
|
{
|
||||||
|
ui_style_next(&(ui_style){.size.width = {UI_SIZE_PARENT, 1},
|
||||||
|
.size.height = {UI_SIZE_PARENT, 1}},
|
||||||
|
UI_STYLE_SIZE);
|
||||||
|
|
||||||
|
ui_panel("log console", UI_FLAG_CLICKABLE)
|
||||||
|
{
|
||||||
|
ui_style_next(&(ui_style){.size.width = {UI_SIZE_PARENT, 1},
|
||||||
|
.size.height = {UI_SIZE_PIXELS, 800}},
|
||||||
|
UI_STYLE_SIZE);
|
||||||
|
|
||||||
|
ui_container("contents", 0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mg_canvas_prepare(app->debugOverlay.canvas);
|
||||||
|
|
||||||
|
ui_draw();
|
||||||
|
/*
|
||||||
|
mg_set_font(app->debugOverlay.font);
|
||||||
|
mg_set_font_size(32);
|
||||||
|
mg_set_color_rgba(0.2, 0.2, 0.2, 1);
|
||||||
|
mg_move_to(30, 30);
|
||||||
|
mg_text_outlines(STR8("Debug Overlay"));
|
||||||
|
mg_fill();
|
||||||
|
*/
|
||||||
|
mg_present();
|
||||||
|
}
|
||||||
|
|
||||||
mem_scratch_clear();
|
mem_scratch_clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,32 +526,37 @@ int main(int argc, char** argv)
|
||||||
mp_init();
|
mp_init();
|
||||||
mp_clock_init();
|
mp_clock_init();
|
||||||
|
|
||||||
|
orca_app* orca = &__orcaApp;
|
||||||
|
|
||||||
mp_rect windowRect = {.x = 100, .y = 100, .w = 810, .h = 610};
|
mp_rect windowRect = {.x = 100, .y = 100, .w = 810, .h = 610};
|
||||||
mp_window window = mp_window_create(windowRect, "orca", 0);
|
orca->window = mp_window_create(windowRect, "orca", 0);
|
||||||
|
orca->surface = mg_surface_create_for_window(orca->window, MG_BACKEND_DEFAULT);
|
||||||
|
orca->canvas = mg_canvas_create(orca->surface);
|
||||||
|
|
||||||
//NOTE: create surface and canvas
|
mg_surface_swap_interval(orca->surface, 1);
|
||||||
mg_surface surface = mg_surface_create_for_window(window, MG_BACKEND_GLES);
|
|
||||||
mg_surface_swap_interval(surface, 1);
|
|
||||||
/* mg_canvas canvas = mg_canvas_create(surface);
|
|
||||||
|
|
||||||
if(mg_canvas_is_nil(canvas))
|
orca->debugOverlay.show = false;
|
||||||
|
orca->debugOverlay.surface = mg_surface_create_for_window(orca->window, MG_BACKEND_DEFAULT);
|
||||||
|
orca->debugOverlay.canvas = mg_canvas_create(orca->debugOverlay.surface);
|
||||||
|
orca->debugOverlay.font = orca_font_create("../resources/Andale Mono.ttf");
|
||||||
|
|
||||||
|
mg_surface_set_hidden(orca->debugOverlay.surface, true);
|
||||||
|
|
||||||
|
//WARN: this is a workaround to avoid stalling the first few times we acquire drawables from
|
||||||
|
// the surfaces... This should probably be fixed in the implementation of mtl_surface!
|
||||||
|
for(int i=0; i<4; i++)
|
||||||
{
|
{
|
||||||
printf("Error: couldn't create canvas\n");
|
mg_canvas_prepare(orca->canvas);
|
||||||
return(-1);
|
mg_present();
|
||||||
|
mg_canvas_prepare(orca->debugOverlay.canvas);
|
||||||
|
mg_present();
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
ui_init(&orca->debugOverlay.ui);
|
||||||
|
|
||||||
//NOTE: show window and start runloop
|
//NOTE: show window and start runloop
|
||||||
mp_window_bring_to_front(window);
|
mp_window_bring_to_front(orca->window);
|
||||||
mp_window_focus(window);
|
mp_window_focus(orca->window);
|
||||||
|
|
||||||
mg_surface mtlSurface = mg_surface_create_for_window(window, MG_BACKEND_DEFAULT);
|
|
||||||
mg_surface_swap_interval(mtlSurface, 1);
|
|
||||||
mg_canvas canvas = mg_canvas_create(mtlSurface);
|
|
||||||
|
|
||||||
__orcaApp = (orca_app){.window = window,
|
|
||||||
.surface = surface,
|
|
||||||
.mtlSurface = mtlSurface,
|
|
||||||
.canvas = canvas};
|
|
||||||
|
|
||||||
pthread_t runloopThread;
|
pthread_t runloopThread;
|
||||||
pthread_create(&runloopThread, 0, orca_runloop, 0);
|
pthread_create(&runloopThread, 0, orca_runloop, 0);
|
||||||
|
@ -465,9 +570,9 @@ int main(int argc, char** argv)
|
||||||
void* res;
|
void* res;
|
||||||
pthread_join(runloopThread, &res);
|
pthread_join(runloopThread, &res);
|
||||||
|
|
||||||
// mg_canvas_destroy(canvas);
|
mg_canvas_destroy(orca->canvas);
|
||||||
// mg_surface_destroy(surface);
|
mg_surface_destroy(orca->surface);
|
||||||
mp_window_destroy(window);
|
mp_window_destroy(orca->window);
|
||||||
|
|
||||||
mp_terminate();
|
mp_terminate();
|
||||||
return(0);
|
return(0);
|
||||||
|
|
Loading…
Reference in New Issue