Skip to main content

oxide_engine/asset/
mod.rs

1//! Compatibility facade for asset APIs plus engine-level typed asset resources.
2
3use std::path::PathBuf;
4use std::sync::Arc;
5
6use oxide_asset::{
7    AssetServer as CoreAssetServer, AssetServerError as CoreAssetServerError, Assets as CoreAssets,
8    Handle as CoreHandle,
9};
10use oxide_ecs::Resource;
11use oxide_renderer::gltf::{load_gltf, GltfScene};
12use oxide_renderer::material::MaterialPipeline;
13use wgpu::{Device, Queue};
14
15pub use oxide_asset::*;
16
17/// ECS resource wrapper for the engine asset server.
18#[derive(Resource, Default)]
19pub struct AssetServerResource {
20    pub server: CoreAssetServer,
21}
22
23/// ECS resource storing handle-indexed material pipelines.
24#[derive(Resource, Default)]
25pub struct MaterialAssets {
26    pub assets: CoreAssets<MaterialPipeline>,
27}
28
29/// ECS resource storing handle-indexed glTF scenes.
30#[derive(Resource, Default)]
31pub struct GltfSceneAssets {
32    pub assets: CoreAssets<GltfScene>,
33}
34
35/// Registers a material pipeline under a stable handle.
36pub fn register_material_asset(
37    server: &mut CoreAssetServer,
38    assets: &mut CoreAssets<MaterialPipeline>,
39    material: MaterialPipeline,
40) -> CoreHandle<MaterialPipeline> {
41    let handle = server.allocate_handle::<MaterialPipeline>();
42    assets.insert(handle, material);
43    handle
44}
45
46/// Starts async glTF loading and returns a scene handle.
47///
48/// The engine's `gltf_scene_spawn_system` consumes readiness via `AssetServer::poll_ready`.
49pub fn load_gltf_async(
50    server: &mut CoreAssetServer,
51    device: Arc<Device>,
52    queue: Arc<Queue>,
53    path: impl Into<PathBuf>,
54) -> CoreHandle<GltfScene> {
55    let path = path.into();
56    server.load_async(move || {
57        load_gltf(&device, &queue, &path)
58            .map_err(|err| CoreAssetServerError::Message(err.to_string()))
59    })
60}