astrelis-assets 0.2.1

Asset management module for Astrelis game engine
Documentation

Astrelis Assets - Type-safe asset management system

This crate provides a comprehensive asset management system with:

  • Typed handles with generational IDs for O(1) access and use-after-free protection
  • Multiple asset sources (disk, memory, raw bytes)
  • Pluggable asset loaders
  • Async/background loading
  • Hot-reload support (disk and memory)
  • GPU resource integration hooks
  • Event system for change detection

Architecture Overview

┌─────────────────────────────────────────────────────────────────┐
│                        AssetServer                               │
│  - Coordinates all asset operations                             │
│  - Manages type-erased storage                                  │
│  - Dispatches to loaders                                        │
└───────────────────────────┬─────────────────────────────────────┘
                            │
         ┌──────────────────┼──────────────────┐
         ▼                  ▼                  ▼
  ┌─────────────┐   ┌─────────────┐   ┌─────────────┐
  │ Assets<Tex> │   │Assets<Shader│   │Assets<Audio>│
  │  SparseSet  │   │  SparseSet  │   │  SparseSet  │
  └──────┬──────┘   └──────┬──────┘   └──────┬──────┘
         │                 │                 │
         ▼                 ▼                 ▼
  ┌─────────────┐   ┌─────────────┐   ┌─────────────┐
  │AssetEntry<T>│   │AssetEntry<T>│   │AssetEntry<T>│
  │ - state     │   │ - state     │   │ - state     │
  │ - version   │   │ - version   │   │ - version   │
  │ - refcount  │   │ - refcount  │   │ - refcount  │
  └─────────────┘   └─────────────┘   └─────────────┘

Quick Start

use astrelis_assets::prelude::*;

// Create the asset server
let mut server = AssetServer::new();

// Register a loader for textures
server.register_loader::<Texture>(TextureLoader::new());

// Load an asset from disk
let handle: Handle<Texture> = server.load("textures/player.png");

// Check if ready and use
if let Some(texture) = server.get(&handle) {
    // Use the texture...
}

// Poll for events
for event in server.drain_events() {
    match event {
        AssetEvent::Created { handle, .. } => { /* ... */ }
        AssetEvent::Modified { handle, .. } => { /* ... */ }
        AssetEvent::Removed { handle, .. } => { /* ... */ }
    }
}