#pragma once #include #include #include #include #include #include #include namespace extra2d { class AssetAsyncLoader { public: enum class Priority { Low = 0, Normal = 1, High = 2 }; struct Task { Priority priority = Priority::Normal; std::function work; std::function onComplete; }; ~AssetAsyncLoader(); void init(uint32_t threadCount = 0); void shutdown(); bool isRunning() const; void submit(const Task &task); void processCallbacks(); private: void workerThreadLoop(); std::vector queue_; std::vector workers_; std::mutex queueMutex_; std::condition_variable queueCV_; std::atomic running_{false}; std::vector> completedCallbacks_; std::mutex callbackMutex_; }; } // namespace extra2d