mitiru::resource
Resource pipeline: asset loading, caches, dependency tracking, and hot-reload plumbing.
Resource pipeline: asset loading, caches, dependency tracking, and hot-reload plumbing.
Free functions and typedefs
template <typename F, typename T> concept SizeEstimator = requires(F estimator, const T& asset)struct CacheStatistics 7
std::size_t hits = 0std::size_t misses = 0std::size_t evictions = 0std::size_t currentEntries = 0std::size_t currentBytes = 0std::size_t budgetBytes = 0[[nodiscard]] double hitRate() const noexceptclass AssetCache 16
explicit AssetCache(std::size_t budgetBytes = 0) noexceptAssetCache(const AssetCache&) = deleteAssetCache& operator=(const AssetCache&) = deleteAssetCache(AssetCache&&) = deleteAssetCache& operator=(AssetCache&&) = deletevoid setSizeEstimator(std::function<std::size_t(const T&)> estimator)void put(const std::string& key, std::shared_ptr<T> asset)[[nodiscard]] std::optional<std::shared_ptr<T>> get(const std::string& key)[[nodiscard]] bool contains(const std::string& key) constbool erase(const std::string& key)void clear()void setBudget(std::size_t bytes)[[nodiscard]] CacheStatistics statistics() const[[nodiscard]] std::size_t size() const[[nodiscard]] std::size_t currentBytes() const[[nodiscard]] std::size_t budgetBytes() const noexceptclass AssetHandle 10
AssetHandle() = defaultAssetHandle(std::string id, std::shared_ptr<T> asset)[[nodiscard]] T* get() const noexcept[[nodiscard]] T* operator->() const noexcept[[nodiscard]] T& operator*() const noexcept[[nodiscard]] bool isLoaded() const noexcept[[nodiscard]] explicit operator bool() const noexcept[[nodiscard]] const std::string& id() const noexcept[[nodiscard]] long useCount() const noexceptvoid reset() noexceptclass AssetManager 9
template <typename LoaderT> requires AssetLoader<LoaderT> void registerLoader(LoaderT loader)template <typename T> [[nodiscard]] AssetHandle<T> load(const std::string& id, std::string_view path)template <typename T> AssetHandle<T> store(const std::string& id, std::shared_ptr<T> asset)template <typename T> [[nodiscard]] AssetHandle<T> get(const std::string& id) constvoid unload(const std::string& id)[[nodiscard]] bool isLoaded(const std::string& id) const[[nodiscard]] std::vector<std::string> loadedIds() constvoid unloadAll()[[nodiscard]] std::size_t cacheSize() const noexceptclass AssetPath 6
[[nodiscard]] static std::string executableDir()[[nodiscard]] static std::string resolve(const std::string& relativePath)static void setBasePath(const std::string& path)[[nodiscard]] static std::string fromBase(const std::string& relativePath)[[nodiscard]] inline TextureData resizeImage(const TextureData& input, std::uint32_t maxWidth, std::uint32_t maxHeight)[[nodiscard]] inline std::vector<MipLevel> generateMipmaps(const TextureData& source)class AssetProcessor 3
virtual ~AssetProcessor() = default[[nodiscard]] virtual bool process(const std::string& inputPath, const std::string& outputPath) = 0[[nodiscard]] virtual std::string name() const = 0struct TextureData 4
std::uint32_t width = 0std::uint32_t height = 0std::uint32_t channels = 4std::vector<std::uint8_t> pixelsstruct MipLevel 3
std::uint32_t width = 0std::uint32_t height = 0std::vector<std::uint8_t> pixelsstruct AtlasEntry 5
std::string namestd::uint32_t x = 0std::uint32_t y = 0std::uint32_t width = 0std::uint32_t height = 0struct TextureAtlas 4
TextureData imagestd::vector<AtlasEntry> entriesstd::uint32_t atlasWidth = 0std::uint32_t atlasHeight = 0class TextureProcessor : public AssetProcessor 9
explicit TextureProcessor(std::uint32_t maxWidth = 2048, std::uint32_t maxHeight = 2048, bool generateMips = true)[[nodiscard]] bool process(const std::string& inputPath, const std::string& outputPath) override[[nodiscard]] std::string name() const override[[nodiscard]] TextureData processTexture(const TextureData& input) const[[nodiscard]] std::uint32_t maxWidth() const noexcept[[nodiscard]] std::uint32_t maxHeight() const noexcept[[nodiscard]] bool generateMipsEnabled() const noexcept[[nodiscard]] const std::string& lastInputPath() const noexcept[[nodiscard]] const std::string& lastOutputPath() const noexceptclass TextureAtlasBuilder 5
void addImage(const std::string& name, TextureData texture)[[nodiscard]] std::size_t imageCount() const noexcept[[nodiscard]] TextureAtlas build(std::uint32_t atlasWidth, std::uint32_t atlasHeight) const[[nodiscard]] static std::string generateMetadata(const TextureAtlas& atlas)void clear()struct ManifestEntry 5
std::string pathstd::string typestd::uint64_t sizeBytes = 0std::string hashstd::vector<std::string> dependenciesclass AssetManifest 9
void addEntry(ManifestEntry entry)[[nodiscard]] const ManifestEntry* getEntry(const std::string& path) const[[nodiscard]] std::vector<ManifestEntry> allEntries() const[[nodiscard]] std::size_t entryCount() const noexceptbool generateManifest(const std::string& assetsDir)[[nodiscard]] std::vector<std::string> validate(const std::string& assetsDir) const[[nodiscard]] std::string serialize() constvoid deserialize(const std::string& text)void clear()struct BundleFileEntry 3
std::string pathstd::uint64_t offset = 0std::uint64_t size = 0struct BundleHeader 4
std::uint32_t magic = 0x4D545242std::uint32_t version = 1std::uint32_t fileCount = 0std::vector<BundleFileEntry> filesstruct BundleData 2
BundleHeader headerstd::vector<std::uint8_t> payloadclass AssetBundler 5
void addFile(const std::string& path, std::vector<std::uint8_t> data)[[nodiscard]] std::size_t fileCount() const noexcept[[nodiscard]] BundleData build() const[[nodiscard]] BundleData buildFromManifest( const AssetManifest& manifest, const std::string& assetsDir) constvoid clear()class AssetBundleReader 7
void load(BundleData bundle)[[nodiscard]] bool isLoaded() const noexcept[[nodiscard]] std::uint32_t fileCount() const noexcept[[nodiscard]] std::vector<std::string> filePaths() const[[nodiscard]] std::vector<std::uint8_t> readFile(const std::string& path) const[[nodiscard]] bool hasFile(const std::string& path) const[[nodiscard]] std::uint64_t fileSize(const std::string& path) constenum AssetPriority : std::uint8_t 4
Low = 0Normal = 1High = 2Urgent = 3class CancellationToken 3
CancellationToken()void cancel() noexcept[[nodiscard]] bool isCancelled() const noexceptstruct BatchProgress 4
std::size_t completed = 0std::size_t total = 0std::size_t failed = 0[[nodiscard]] double ratio() const noexceptclass AsyncAssetLoader 9
explicit AsyncAssetLoader(AssetManager& assetManager, std::size_t threadCount = 0)AsyncAssetLoader(const AsyncAssetLoader&) = deleteAsyncAssetLoader& operator=(const AsyncAssetLoader&) = deleteAsyncAssetLoader(AsyncAssetLoader&&) = deleteAsyncAssetLoader& operator=(AsyncAssetLoader&&) = deletetemplate <typename T> [[nodiscard]] std::future<AssetHandle<T>> load( const std::string& id, std::string_view path, AssetPriority priority = AssetPriority::Normal, CancellationToken token = CancellationToken{})template <typename T> [[nodiscard]] std::vector<std::future<AssetHandle<T>>> loadBatch( const std::vector<std::pair<std::string, std::string>>& entries, std::function<void(const BatchProgress&)> progressCallback = nullptr, AssetPriority priority = AssetPriority::Normal, CancellationToken token = CancellationToken{})[[nodiscard]] std::size_t pendingCount() const[[nodiscard]] std::size_t workerCount() const noexceptenum DdsFormat : std::uint8_t 5
UnknownRgba8UnormBc1UnormBc2UnormBc3Unormstruct DdsMipLevel 4
int width = 0int height = 0std::vector<std::uint8_t> data[[nodiscard]] bool isValid() const noexceptstruct DdsTextureData 7
int width = 0int height = 0int mipCount = 0DdsFormat format = DdsFormat::Unknownstd::vector<DdsMipLevel> mipLevels[[nodiscard]] bool isValid() const noexcept[[nodiscard]] bool isCompressed() const noexceptclass DdsImageLoader 3
[[nodiscard]] std::optional<DdsTextureData> loadDds(std::string_view path) const[[nodiscard]] static std::optional<DdsTextureData> parseDds( const std::vector<std::uint8_t>& data)[[nodiscard]] bool canLoad(std::string_view extension) const noexceptstruct EmbeddedAssetData 5
const uint8_t* data = nullptrstd::size_t size = 0[[nodiscard]] bool valid() const noexcept[[nodiscard]] std::string_view asStringView() const noexcept[[nodiscard]] std::string asString() constclass EmbeddedAssets 7
[[nodiscard]] static EmbeddedAssets& instance()void registerAsset(const std::string& name, const uint8_t* data, std::size_t size)[[nodiscard]] EmbeddedAssetData get(const std::string& name) const[[nodiscard]] bool has(const std::string& name) const[[nodiscard]] std::size_t assetCount() const noexcept[[nodiscard]] std::vector<std::string> assetNames() constvoid clear()struct FontMetrics 9
int glyphWidth = 8int glyphHeight = 8int firstChar = 32int lastChar = 126std::string name[[nodiscard]] constexpr int glyphCount() const noexcept[[nodiscard]] constexpr bool contains(char ch) const noexcept[[nodiscard]] constexpr int textWidth(std::string_view text, int scale = 1) const noexcept[[nodiscard]] constexpr int textHeight(int scale = 1) const noexceptclass FontLoader 5
FontLoader() noexcept = default[[nodiscard]] std::optional<FontMetrics> loadFromFile(std::string_view path) const[[nodiscard]] static std::optional<FontMetrics> parseMetrics(std::string_view content)[[nodiscard]] static constexpr FontMetrics createDefault() noexcept[[nodiscard]] static FontMetrics createCustom( std::string_view fontName, int glyphW, int glyphH, int first = 32, int last = 126)class HotReloadManager 7
using Callback = std::function<void(const std::string&)>;void watch(const std::string& path, Callback callback)void unwatch(const std::string& path)std::vector<std::string> pollChanges()[[nodiscard]] std::size_t watchCount() const noexcept[[nodiscard]] std::vector<std::string> watchedPaths() constvoid unwatchAll()enum FileChangeType : std::uint8_t 4
ModifiedCreatedDeletedusing FileChangeCallback = std::function<void(const FileChangeEvent&)>;struct FileChangeEvent 3
std::string pathFileChangeType type = FileChangeType::Modifiedstd::chrono::steady_clock::time_point timestampclass HotReloadWatcher 17
void setDebounceDelay(std::chrono::milliseconds delay) noexcept[[nodiscard]] std::chrono::milliseconds debounceDelay() const noexceptvoid watchFile(const std::string& path, FileChangeCallback callback)void watchDirectory(const std::string& dirPath, const std::string& extension, FileChangeCallback callback)std::vector<FileChangeEvent> update()void unwatch(const std::string& path)void unwatchAll()[[nodiscard]] std::size_t watchedFileCount() const noexcept[[nodiscard]] std::size_t watchedDirectoryCount() const noexcept[[nodiscard]] std::vector<std::string> watchedFilePaths() const[[nodiscard]] std::vector<std::string> watchedDirectoryPaths() const[[nodiscard]] bool isWatching(const std::string& path) constvoid watchShaders(const std::string& dirPath, FileChangeCallback callback)void watchTextures(const std::string& dirPath, FileChangeCallback callback)void watchScripts(const std::string& dirPath, FileChangeCallback callback)void watchJsonFiles(const std::string& dirPath, FileChangeCallback callback)template <typename T> concept AssetLoader = requires(T loader, std::string_view path)class IAssetLoaderBase 3
virtual ~IAssetLoaderBase() = default[[nodiscard]] virtual bool canLoad(std::string_view path) const = 0[[nodiscard]] virtual std::any loadAny(std::string_view path) = 0class TypedAssetLoader : public IAssetLoaderBase 5
using AssetType = typename LoaderT::AssetType;explicit TypedAssetLoader(LoaderT loader)[[nodiscard]] bool canLoad(std::string_view path) const override[[nodiscard]] std::shared_ptr<AssetType> load(std::string_view path)[[nodiscard]] std::any loadAny(std::string_view path) overrideenum ImageFormat : std::uint8_t 7
UnknownBmpTgaPngJpegDdsKtxstruct ImageData 5
int width = 0int height = 0int channels = 4std::vector<std::uint8_t> pixels[[nodiscard]] bool isValid() const noexceptclass IImageLoader 3
virtual ~IImageLoader() = default[[nodiscard]] virtual std::optional<ImageData> load(std::string_view path) = 0[[nodiscard]] virtual bool canLoad(std::string_view extension) const = 0class BmpImageLoader : public IImageLoader 2
[[nodiscard]] std::optional<ImageData> load(std::string_view path) override[[nodiscard]] bool canLoad(std::string_view extension) const overrideclass TgaImageLoader : public IImageLoader 2
[[nodiscard]] std::optional<ImageData> load(std::string_view path) override[[nodiscard]] bool canLoad(std::string_view extension) const overrideclass UnifiedImageLoader : public IImageLoader 6
[[nodiscard]] std::optional<ImageData> load(std::string_view path) override[[nodiscard]] bool canLoad(std::string_view extension) const override[[nodiscard]] std::optional<ImageData> loadFromMemory( const std::uint8_t* data, std::size_t size) const[[nodiscard]] static ImageFormat detectFormatByPath(std::string_view path) noexcept[[nodiscard]] static ImageFormat detectFormatByExtension(std::string_view ext) noexcept[[nodiscard]] static ImageFormat detectFormatByMagic( const std::uint8_t* data, std::size_t size) noexceptenum KtxFormat : std::uint32_t 14
Unknown = 0Bc1Rgba = 0x8C4DBc2Rgba = 0x8C4EBc3Rgba = 0x8C4FBc7Rgba = 0x8E8CEtc2Rgb8 = 0x9274Etc2Rgba8 = 0x9278Etc2Rgb8A1 = 0x9276Astc4x4 = 0x93B0Astc5x5 = 0x93B2Astc6x6 = 0x93B4Astc8x8 = 0x93B7Rgba8 = 0x8058Rgb8 = 0x8051enum KtxVkFormat : std::uint32_t 13
Undefined = 0Bc1RgbaUnorm = 131Bc2UnormBlock = 135Bc3UnormBlock = 137Bc7UnormBlock = 145Etc2Rgb8Unorm = 147Etc2Rgba8Unorm = 151Astc4x4Unorm = 157Astc5x5Unorm = 159Astc6x6Unorm = 161Astc8x8Unorm = 165R8G8B8A8Unorm = 37R8G8B8Unorm = 23struct KtxMipLevel 4
int width = 0int height = 0std::vector<std::uint8_t> data[[nodiscard]] bool isValid() const noexceptstruct KtxTextureData 12
int width = 0int height = 0int mipCount = 0KtxFormat glFormat = KtxFormat::UnknownKtxVkFormat vkFormat = KtxVkFormat::Undefinedbool isKtx2 = falsestd::vector<KtxMipLevel> mipLevels[[nodiscard]] bool isValid() const noexcept[[nodiscard]] bool isCompressed() const noexcept[[nodiscard]] bool isAstc() const noexcept[[nodiscard]] bool isEtc2() const noexcept[[nodiscard]] bool isBc() const noexceptclass KtxImageLoader 7
[[nodiscard]] std::optional<KtxTextureData> loadKtx(std::string_view path) const[[nodiscard]] bool canLoad(std::string_view extension) const noexceptusing PackageHandle = std::uint32_t;using CommandRegistrar = std::function<void(const std::string& name, const std::string& desc)>;using AssetPathRegistrar = std::function<void(const std::string& path)>;using ScriptRunner = std::function<bool(const std::string& path)>;inline constexpr PackageHandle INVALID_PACKAGE_HANDLE = 0struct PackageCommand 2
std::string namestd::string descriptionstruct PackageInfo 8
std::string idstd::string namestd::string versionstd::string pathstd::vector<std::string> dependenciesstd::vector<std::string> headersstd::vector<PackageCommand> commandsstd::string initScriptclass PackageRuntime 16
PackageRuntime() = default~PackageRuntime() = defaultPackageRuntime(const PackageRuntime&) = deletePackageRuntime& operator=(const PackageRuntime&) = deletePackageRuntime(PackageRuntime&&) noexcept = defaultPackageRuntime& operator=(PackageRuntime&&) noexcept = defaultvoid setCommandRegistrar(CommandRegistrar r)void setAssetPathRegistrar(AssetPathRegistrar r)void setScriptRunner(ScriptRunner r)[[nodiscard]] PackageHandle loadPackage(std::string_view path)bool unloadPackage(PackageHandle handle)[[nodiscard]] std::vector<PackageInfo> listLoaded() const[[nodiscard]] bool isLoaded(std::string_view id) const[[nodiscard]] const PackageInfo& getPackageInfo(PackageHandle handle) const[[nodiscard]] std::size_t packageCount() const noexcept[[nodiscard]] const std::string& lastError() const noexceptenum TargetPlatform : uint8_t 2
Windows = 0Webstruct PackageConfig 7
std::string gameNamestd::string versionstd::string assetsDirstd::string outputDirTargetPlatform platform = TargetPlatform::Windowsstd::string iconPathbool includeDebugSymbols = falsestruct PackageFileEntry 4
std::string relativePathstd::string sourcePathuint64_t sizeBytes = 0std::string hashstruct VersionMetadata 5
std::string versionstd::string buildTimestampstd::string gitHashstd::string platformbool debugBuild = falsestruct PackageResult 6
bool success = falsestd::string outputPathstd::vector<PackageFileEntry> filesVersionMetadata metadatauint64_t totalSizeBytes = 0std::string errorMessagestruct DeltaEntry 6
enum `ChangeType : uint8_t` { Added = 0, Modified, Removed }std::string relativePathstd::string oldHashstd::string newHashuint64_t newSize = 0ChangeType changeType = ChangeType::Modifiedstruct DeltaManifest 4
std::string fromVersionstd::string toVersionstd::vector<DeltaEntry> entriesuint64_t totalDeltaSize = 0class PackagingTool 4
[[nodiscard]] PackageResult createPackage(const PackageConfig& config) const[[nodiscard]] std::string createInstaller(const PackageConfig& config) const[[nodiscard]] std::string createWebDeploy(const PackageConfig& config) const[[nodiscard]] DeltaManifest createDeltaManifest( const std::vector<PackageFileEntry>& oldFiles, const std::vector<PackageFileEntry>& newFiles, const std::string& fromVersion, const std::string& toVersion) constclass StbImageHandle 14
StbImageHandle() noexcept = defaultStbImageHandle(std::uint8_t* pixels, int width, int height, int channels) noexcept~StbImageHandle()StbImageHandle(const StbImageHandle&) = deleteStbImageHandle& operator=(const StbImageHandle&) = deleteStbImageHandle(StbImageHandle&& other) noexceptStbImageHandle& operator=(StbImageHandle&& other) noexcept[[nodiscard]] bool isValid() const noexcept[[nodiscard]] const std::uint8_t* pixels() const noexcept[[nodiscard]] int width() const noexcept[[nodiscard]] int height() const noexcept[[nodiscard]] int channels() const noexcept[[nodiscard]] std::size_t sizeBytes() const noexcept[[nodiscard]] ImageData toImageData() constclass PngImageLoader : public IImageLoader 5
[[nodiscard]] std::optional<ImageData> load(std::string_view path) override[[nodiscard]] bool canLoad(std::string_view extension) const override[[nodiscard]] static StbImageHandle decodeFromMemory( const std::uint8_t* data, std::size_t dataSize, int desiredChannels = 4)[[nodiscard]] static StbImageHandle decodeFile( std::string_view path, int desiredChannels = 4)[[nodiscard]] static std::string lastError()class ResourceCache 7
[[nodiscard]] std::shared_ptr<render::Texture> getTexture(const std::string& path)void registerTexture(const std::string& name, std::shared_ptr<render::Texture> tex)[[nodiscard]] bool hasTexture(const std::string& path) const[[nodiscard]] std::future<std::shared_ptr<render::Texture>> loadTextureAsync( const std::string& path)void clearAll()void clearTextures()[[nodiscard]] int cachedTextureCount() const noexceptenum StreamingState : std::uint8_t 5
PendingLoadingLoadedFailedEvictedstruct StreamingRequest 6
std::string idstd::string pathfloat distanceFromCamera = 0.0fstd::uint8_t desiredMipLevel = 0StreamingState state = StreamingState::Pending[[nodiscard]] float priority() const noexceptstruct StreamingStatistics 7
std::size_t totalRequests = 0std::size_t activeLoads = 0std::size_t completedLoads = 0std::size_t failedLoads = 0std::size_t pendingRequests = 0std::size_t memoryUsedBytes = 0std::size_t memoryBudgetBytes = 0class StreamingManager 18
using LoadFunction = std::function<std::shared_ptr<T>(const std::string& path, std::uint8_t mipLevel)>;using SizeFunction = std::function<std::size_t(const T& asset)>;explicit StreamingManager( std::size_t memoryBudgetBytes, std::shared_ptr<T> placeholder = nullptr, std::size_t threadCount = 0)StreamingManager(const StreamingManager&) = deleteStreamingManager& operator=(const StreamingManager&) = deleteStreamingManager(StreamingManager&&) = deleteStreamingManager& operator=(StreamingManager&&) = deletevoid setLoadFunction(LoadFunction func)void setSizeEstimator(SizeFunction func)void setPlaceholder(std::shared_ptr<T> placeholder)void requestAsset( const std::string& id, const std::string& path, float distanceFromCamera, std::uint8_t mipLevel = 0)void update(std::size_t maxDispatches = 4)[[nodiscard]] std::shared_ptr<T> getAsset(const std::string& id)[[nodiscard]] std::optional<StreamingState> getState(const std::string& id) constvoid cancelRequest(const std::string& id)void setMaxConcurrentLoads(std::size_t count) noexcept[[nodiscard]] StreamingStatistics statistics() constvoid clear()class ThreadPool 10
explicit ThreadPool(std::size_t threadCount = 0)ThreadPool(const ThreadPool&) = deleteThreadPool& operator=(const ThreadPool&) = deleteThreadPool(ThreadPool&&) = deleteThreadPool& operator=(ThreadPool&&) = delete~ThreadPool()template <typename F, typename... Args> [[nodiscard]] auto submit(F&& func, Args&&... args) -> std::future<std::invoke_result_t<F, Args...>>[[nodiscard]] std::size_t pendingCount() const[[nodiscard]] std::size_t workerCount() const noexceptvoid shutdown()Sourced from docs/API_CATALOG.md, auto-generated by tools/generate_api_catalog.py.