#include "core/application.h" #include // every asset path is relative to the repo root, but a double-clicked exe (or a // ./bin//donut from elsewhere) starts wherever the launcher put it. walk up // from `start` until assets/shaders shows up and run from there. static auto chdir_to_project_root(std::filesystem::path start) -> bool { namespace fs = std::filesystem; std::error_code ec; for (fs::path p = start; !p.empty(); p = p.parent_path()) { if (fs::exists(p / "assets" / "shaders", ec)) { fs::current_path(p, ec); return !ec; } if (p == p.root_path()) break; } return false; } int main(int /*argc*/, char** argv) { // the cwd first (the normal case), then wherever the exe itself lives. if both // miss, the loaders complain with the cwd in the message. std::error_code ec; if (!chdir_to_project_root(std::filesystem::current_path(ec)) && argv && argv[0]) chdir_to_project_root(std::filesystem::absolute(argv[0], ec).parent_path()); Donut::Application* app = new Donut::Application("Donut Engine - Black Hole Simulation", 1280, 720); app->run(); delete app; }