// // Created by sebastian on 30.07.26. // #ifndef COLORRACE_ASSETLOADER_H #define COLORRACE_ASSETLOADER_H #include #include #include #include #include #include #include #include #include "assets/AssetRequests.h" #include "assets/LoadedAssets.h" #include "assets/RawAssetData.h" namespace engine { struct LoadingProgress { int total; int loaded; float fraction() const { return total > 0 ? static_cast(loaded) / total : 1.f; } bool isDone() const { return loaded >= total; } }; template inline constexpr bool always_false = false; class AssetLoader { public: void scheduleAsset(const AssetRequest& request); void start(); void stop(); std::vector processUploadQueue(int maxPerFrame); LoadingProgress getProgress() const; private: void loadingThreadFunc(); static RawTextureData processTextureRequest(const TextureRequest& request); static RawModelBundle processModelRequest(const ModelRequest& request); static RawSoundData processSoundRequest(const SoundRequest& request); std::vector determineUploadQueue(int maxPerFrame); std::queue pendingQueue; std::mutex pendingMutex; std::condition_variable pendingCondition; std::queue readyQueue; std::mutex readyMutex; std::atomic total{0}; std::atomic loaded{0}; std::thread loadingThread; std::atomic running{false}; }; } #endif //COLORRACE_ASSETLOADER_H