#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // IWYU pragma: keep #include #include #include #include #include #include static const int DISPLAY_WIDTH = 1280; static const int DISPLAY_HEIGHT = 1024; class MainApplication : public GameState, public ApplicationBase { public: using Windows = Collection; int run() { geoData = std::make_shared(GeoData::Limits {{-120, -120}, {120, 120}}, 10.F); geoData->generateRandom(); Windows windows; windows.create(DISPLAY_WIDTH, DISPLAY_HEIGHT); world.create(geoData); assets = AssetFactory::loadAll("res"); { auto rl = world.create(); const glm::vec3 j {-1120, -1100, 3}, k {-1100, -1000, 15}, l {-1000, -800, 20}, m {-900, -600, 30}, n {-600, -500, 32}, o {-500, -800, 30}, p {-600, -900, 25}, q {-1025, -1175, 10}, r {-925, -1075, 10}; const glm::vec3 s {-1100, -500, 15}, t {-1100, -450, 15}, u {-1000, -400, 15}; auto l3 = rl->addLinksBetween(j, k); rl->addLinksBetween(k, l); rl->addLinksBetween(l, m); rl->addLinksBetween(m, n); rl->addLinksBetween(n, o); rl->addLinksBetween(o, p); // branch 1 rl->addLinksBetween(p, q); rl->addLinksBetween(q, j); // branch 2 rl->addLinksBetween(p, r); rl->addLinksBetween(r, j); // early loop rl->addLinksBetween(s, t); rl->addLinksBetween(l, s); rl->addLinksBetween(t, u); rl->addLinksBetween(u, m); const std::shared_ptr train = world.create(l3); auto b47 = std::dynamic_pointer_cast(assets.at("brush-47")); for (int N = 0; N < 6; N++) { train->create(b47); } train->orders.removeAll(); train->orders.create(&train->orders, l3->ends[1], l3->length, rl->findNodeAt({-1100, -450, 15})); train->currentActivity = train->orders.current()->createActivity(); auto foliage = std::dynamic_pointer_cast(assets.at("Tree-01-1")); for (float x = 900; x < 1100; x += 3) { for (float y = 900; y < 1100; y += 3) { world.create(foliage, Location {geoData->positionAt({-x, -y})}); } } } auto t_start = std::chrono::high_resolution_clock::now(); while (isRunning) { processInputs(windows); const auto t_end = std::chrono::high_resolution_clock::now(); const auto t_passed = std::chrono::duration_cast(t_end - t_start); world.apply(&WorldObject::tick, t_passed); windows.apply(&Window::tick, t_passed); windows.apply(&Window::refresh); t_start = t_end; } world.objects.clear(); return 0; } private: void processInputs(const Windows & windows) { for (SDL_Event e; SDL_PollEvent(&e);) { if (e.type == SDL_QUIT) { isRunning = false; return; } windows.applyOne(&Window::handleInput, e); } } bool isRunning {true}; }; int main(int, char **) { return std::make_shared()->run(); }