#define COOK_ON_DEMAND 1 #define MAX_CACHED_FILES 0 #define VFS_ALWAYS_PACK 1 #include "v4k.c" #include "pluginapi.h" array(editor_t) editors = 0; array(asset_t) assets = 0; #define PLUGINS\ X(shader_editor) #define X(name) extern editor_vtable_t name##__procs; PLUGINS #undef X void load_editor(char *pname, editor_vtable_t f) { editor_t ed = {0}; ed.f = f; ed.name = file_base(STRDUP(pname)); // @leak PRINTF("loaded plugin: '%s'\n", ed.name); array_push(editors, ed); } void load_editors() { #define X(name) load_editor(#name, name##__procs); PLUGINS #undef X } map(char*, editor_t*) assocs; void register_extensions() { map_init(assocs, less_str, hash_str); for (int i=0; if.init((struct asset_t*)array_back(assets))) { FREE(asset.name); array_pop(assets); PRINTF("fallback exec %s\n", fname); edit_asset(fname); } } int main() { window_create(75.0, WINDOW_MSAA8); window_fps_unlock(); camera_t cam = camera(); camera_enable(&cam); load_editors(); register_extensions(); #if 0 load_asset("demos/art/shadertoys/!default.fs"); load_asset("demos/art/fx/fxDithering.fs"); #endif while( window_swap() && !input(KEY_ESC) ) { if (ui_panel("Workbench", PANEL_OPEN)) { static const char *file; static bool show_browser = 1; if( ui_browse(&file, &show_browser) ) { load_asset(file); show_browser = 1; } ui_panel_end(); } for (int i=0; iname, &f->opened)) { f->ed->f.tick(f); // was the asset modified? bool modified = f->last_modified != file_stamp(f->name); ui_separator(); if (ui_button("reload asset") || modified) { f->last_modified = file_stamp(f->name); f->ed->f.quit(f); f->ed->f.init(f); } if (ui_button("edit asset")) { edit_asset(assets[i].name); } if (ui_button("close asset") || !f->opened) { f->ed->f.quit(f); FREE(assets[i].name); array_erase(assets, i); --i; } ui_window_end(); } } } return 0; }