#pragma once #include #include #include #include struct GLFWwindow; namespace hex::init { using TaskFunction = std::function; enum FrameResult{ success, failure, wait }; struct Highlight { ImVec2 start; size_t count; ImColor color; }; class WindowSplash { public: WindowSplash(); ~WindowSplash(); bool loop(); FrameResult fullFrame(); void startStartupTasks(); void addStartupTask(const std::string &taskName, const TaskFunction &task, bool async) { this->m_tasks.emplace_back(taskName, task, async); } private: GLFWwindow *m_window; std::mutex m_progressMutex; std::atomic m_progress = 0; std::list m_currTaskNames; void initGLFW(); void initImGui(); void initMyself(); void exitGLFW(); void exitImGui(); std::future processTasksAsync(); std::vector> m_tasks; std::string m_gpuVendor; ImGui::Texture splashBackgroundTexture; ImGui::Texture splashTextTexture; std::future tasksSucceeded; std::array highlights; float progressLerp = 0.0F; }; }