use bevy_reflect::{Reflect, ReflectDeserialize, ReflectSerialize}; use serde::{Deserialize, Serialize}; bitflags::bitflags! { /// Defines where the asset will be used. /// /// If an asset is set to the `RENDER_WORLD` but not the `MAIN_WORLD`, the asset will be /// unloaded from the asset server once it's been extracted and prepared in the render world. /// /// Unloading the asset saves on memory, as for most cases it is no longer necessary to keep /// it in RAM once it's been uploaded to the GPU's VRAM. However, this means you can no longer /// access the asset from the CPU (via the `Assets` resource) once unloaded (without re-loading it). /// /// If you never need access to the asset from the CPU past the first frame it's loaded on, /// or only need very infrequent access, then set this to `RENDER_WORLD`. Otherwise, set this to /// `RENDER_WORLD | MAIN_WORLD`. /// /// If you have an asset that doesn't actually need to end up in the render world, like an Image /// that will be decoded into another Image asset, use `MAIN_WORLD` only. /// /// ## Platform-specific /// /// On Wasm, it is not possible for now to free reserved memory. To control memory usage, load assets /// in sequence and unload one before loading the next. See this /// [discussion about memory management](https://github.com/WebAssembly/design/issues/1397) for more /// details. #[repr(transparent)] #[derive(Serialize, Deserialize, Hash, Clone, Copy, PartialEq, Eq, Debug, Reflect)] #[reflect(opaque)] #[reflect(Serialize, Deserialize, Hash, PartialEq, Debug)] pub struct RenderAssetUsages: u8 { const MAIN_WORLD = 1 << 0; const RENDER_WORLD = 1 << 1; } } impl Default for RenderAssetUsages { /// Returns the default render asset usage flags: /// `RenderAssetUsages::MAIN_WORLD | RenderAssetUsages::RENDER_WORLD` /// /// This default configuration ensures the asset persists in the main world, even after being prepared for rendering. /// /// If your asset does not change, consider using `RenderAssetUsages::RENDER_WORLD` exclusively. This will cause /// the asset to be unloaded from the main world once it has been prepared for rendering. If the asset does not need /// to reach the render world at all, use `RenderAssetUsages::MAIN_WORLD` exclusively. fn default() -> Self { RenderAssetUsages::MAIN_WORLD | RenderAssetUsages::RENDER_WORLD } }