aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
blob: c813278ea93155c8e7d332d7ccccaf793ff333bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "core/application.h"

#include <filesystem>

// every asset path is relative to the repo root, but a double-clicked exe (or a
// ./bin/<cfg>/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;
}