extern "C" { #include #include } #include #include "assets.h" #include "context.h" #include "engine.h" #include "log.h" #include "objects/scene.h" using namespace Mauri; #define HELP_TEXT "\ Usage: mauri (-p, --package [path_to_scene.pkg]|-d, --directory [path_to_wallpaper]) [OPTIONS]\n\ -a, --assets search path for common assets\n\ -w, --width window width (default: 640)\n\ -h, --height window height (default: 480)\n\ -o, --offset offset of the scene camera (default: 0,0)\n\ -s, --scale scale the window to the scene\n\ -m, --monitor set as the background of this monitor (by name)\n\ -t, --target dump the scene tree into this directory and exit\ " auto window_system_main(u32 argc, str *argv, void *extra) -> s32 { (void)argc; (void)argv; janus::ArgParser *args = (janus::ArgParser *)extra; if (!(args->found("package") ^ args->found("directory"))) { al_printf("%s\n", args->helptext.c_str()); return EXIT_FAILURE; } s32 width = 720; s32 height = 480; if (args->found("width")) width = args->getInt("width"); if (args->found("height")) height = args->getInt("height"); if (width == 0 || height == 0) { error("invalid width and/or height in arguments"); return EXIT_FAILURE; } s32 xoffset; s32 yoffset; if (sscanf(args->getString("offset").c_str(), "%d,%d", &xoffset, &yoffset) != 2) { error("invalid offset in arguments"); return EXIT_FAILURE; } bool gifscene = false; if (args->found("package")) { std::string package_path = args->getString("package"); size_t slash = package_path.rfind("/"); std::string filename; if (slash != std::string::npos) filename = package_path.substr(slash + 1); else filename = package_path; gifscene = filename == "gifscene.pkg"; if (!asset_manager()->arm_package(package_path, args->found("target"))) { return EXIT_FAILURE; } } if (args->found("directory")) { asset_manager()->prepare_output = args->found("target"); asset_manager()->add_search_directory(args->getString("directory")); } if (args->found("assets")) { asset_manager()->add_search_directory(args->getString("assets")); } Scene *scene = Scene::parse(gifscene ? "gifscene.json" : "scene.json"); if (!scene) return EXIT_FAILURE; if (width <= 0 || height <= 0) { width = scene->width; height = scene->height; } if (args->getFlag("scale")) { f32 ratio = scene->width / (f32)scene->height; if (ratio > 1.f) height = width / ratio; else width = height * ratio; } Context *new_context = new Context(); if (!new_context->create_window(width, height, "mauri", args->getString("monitor"))) { return EXIT_FAILURE; } set_context(new_context); scene->offset_camera(xoffset, yoffset); context()->resize_window(width, height); Engine *engine = new Engine(scene, 1.f, true); u64 begin = nn_get_timestamp(); scene->load(engine); u64 duration = nn_get_timestamp() - begin; info("scene loaded in %.2fs", duration / 1000000.f); if (asset_manager()->prepare_output) asset_manager()->dump(args->getString("target")); else engine->run(); delete scene; delete engine; unload_shaders(); if (args->found("package")) asset_manager()->unload_package(); context()->close_window(); set_context(nullptr); return EXIT_SUCCESS; } #ifndef _WIN32 #include #include static void sigint_handler(s32 signum) { (void)signum; log_info("recieved SIGINT, pid is %d, expecting to be killed by daemon", getpid()); } auto main(s32 argc, char *argv[]) -> s32 #else auto wmain(s32 argc, wchar_t **argv) -> s32 #endif { if (!nn_common_init(NULL)) return EXIT_FAILURE; janus::ArgParser args(HELP_TEXT, "0.13"); args.newString("package p", ""); args.newString("directory d", ""); args.newString("assets a", ""); args.newInt("width w", 0); args.newInt("height h", 0); args.newString("offset o", "0,0"); args.newFlag("scale s"); args.newString("monitor m", ""); args.newString("target t", ""); #ifndef _WIN32 args.parse(argc, argv); #else args.wparse(argc, argv); #endif #ifndef _WIN32 if (args.found("monitor")) signal(SIGINT, sigint_handler); #endif if (!stl_global_init(false)) return EXIT_FAILURE; s32 ret = stl_swallow_main(0, NULL, window_system_main, &args); stl_global_close(); return ret; }