#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace extra2d { class ShaderLoader; class AssetSystem { public: struct Stats { size_t textureCount = 0; size_t shaderCount = 0; size_t fontCount = 0; size_t musicCount = 0; size_t materialCount = 0; size_t meshCount = 0; }; AssetSystem(AssetStorage &textures, AssetStorage &shaders, AssetStorage &fonts, AssetStorage &musics, AssetStorage &materials, AssetStorage &meshes, std::unique_ptr> &textureLoader, std::unique_ptr> &shaderLoader, std::unique_ptr> &fontLoader, std::unique_ptr> &musicLoader); Handle loadTexture(const std::string &path); Handle loadTextureFromMemory(const std::string &key, const uint8_t *data, size_t size); std::vector> loadTextureDir(const std::string &directory, bool recursive); Handle loadShader(const std::string &path); Handle loadShader(const std::string &vertPath, const std::string &fragPath); Handle loadFont(const std::string &path); Handle loadFontFromMemory(const std::string &key, const uint8_t *data, size_t size); Handle loadMusic(const std::string &path); void loadTextureAsync(const std::string &path, std::function)> callback); void loadShaderAsync(const std::string &path, std::function)> callback); void initAsync(uint32_t threadCount = 0); void shutdownAsync(); void processAsyncCallbacks(); void registerTextureLoader(std::unique_ptr> loader); void registerShaderLoader(std::unique_ptr> loader); void registerFontLoader(std::unique_ptr> loader); void registerMusicLoader(std::unique_ptr> loader); bool createDefaults(); void destroyDefaults(); Handle defaultTexture() const; Handle defaultShader() const; Handle defaultMaterial() const; Handle defaultQuad() const; void enableHotReload(bool enable); void setHotReloadInterval(float interval); void checkForChanges(); void registerDependency(Handle material, Handle texture); void registerDependency(Handle material, Handle shader); void notifyTextureReloaded(Handle texture); void notifyShaderReloaded(Handle shader); void clear(); Stats stats() const; private: void reloadTexture(const AssetHotReloader::FileWatchInfo &info); void reloadShader(const AssetHotReloader::FileWatchInfo &info); AssetStorage &textures_; AssetStorage &shaders_; AssetStorage &fonts_; AssetStorage &musics_; AssetStorage &materials_; AssetStorage &meshes_; std::unique_ptr> &textureLoader_; std::unique_ptr> &shaderLoader_; std::unique_ptr> &fontLoader_; std::unique_ptr> &musicLoader_; AssetCache textureCache_; AssetCache shaderCache_; AssetCache fontCache_; AssetCache musicCache_; AssetDependencyGraph dependencyGraph_; AssetAsyncRuntime asyncRuntime_; AssetHotReloadRuntime hotReloadRuntime_; BuiltinAssetFactory builtinFactory_; AssetFileSystem fileSystem_; }; } // namespace extra2d