#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 static const int DISPLAY_WIDTH = 1280; static const int DISPLAY_HEIGHT = 1024; class SDL_Application : public GameState { public: SDL_Application() { SDL_Init(SDL_INIT_EVERYTHING); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); } ~SDL_Application() { SDL_Quit(); } NO_COPY(SDL_Application); NO_MOVE(SDL_Application); using Windows = Collection; int run() { Windows windows; windows.create(DISPLAY_WIDTH, DISPLAY_HEIGHT); world.create(); { 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); std::shared_ptr train = world.create(l3); auto b47 = std::make_shared("brush47"); 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 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, this); t_start = t_end; } 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(); }