Skip to content

Commit

Permalink
asset saver example
Browse files Browse the repository at this point in the history
  • Loading branch information
NiklasEi committed Dec 30, 2024
1 parent 4f19a7a commit 836fad4
Show file tree
Hide file tree
Showing 9 changed files with 154 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
target/
Cargo.lock
.idea/

imported_assets/
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Changelog

- new example `asset_savers`

## v0.12.0 - 29.11.2024
- Update to Bevy 0.15

Expand Down
5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,8 @@ required-features = ["csv"]
name = "multiple_formats"
path = "examples/multiple_formats.rs"
required-features = ["ron", "json"]

[[example]]
name = "asset_savers"
path = "examples/asset_savers/asset_savers.rs"
required-features = ["ron", "json", "postcard", "bevy/file_watcher", "bevy/asset_processor"]
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ ron files ending on `.level.ron` and so on...

See the [examples](./examples) for working Bevy apps using the different formats.

## Asset savers / using the loaders in .meta files

The more involved [example `asset_savers`](./examples/asset_savers) demonstrates how you can convert a json
asset into a processed postcard asset using the `JsonAssetLoader` and `PostcardAssetSaver`.

## Compatible Bevy versions

The main branch is compatible with the latest Bevy release.
Expand Down
83 changes: 83 additions & 0 deletions examples/asset_savers/asset_savers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
use bevy::asset::processor::LoadTransformAndSave;
use bevy::asset::transformer::IdentityAssetTransformer;
use bevy::prelude::*;
use bevy_common_assets::json::{JsonAssetLoader, JsonAssetPlugin};
use bevy_common_assets::postcard::{PostcardAssetPlugin, PostcardAssetSaver};
use serde::{Deserialize, Serialize};

/// This example processes a json level asset into a postcard asset (binary format)
/// which is then loaded and rendered. If you run the example, the directory
/// `examples/asset_savers/imported_assets` is created and populated.
///
/// Take a look at `examples/asset_savers/assets/trees.level.meta` to see the configuration
/// that tells Bevy which processor to use to convert the json asset into the postcard format.
fn main() {
App::new()
.add_plugins((
DefaultPlugins.set(AssetPlugin {
mode: AssetMode::Processed,
file_path: "examples/asset_savers/assets".to_string(),
processed_file_path: "examples/asset_savers/imported_assets/Default".to_string(),
..default()
}),
PostcardAssetPlugin::<Level>::new(&["level"]),
JsonAssetPlugin::<Level>::new(&[]),
))
.register_asset_processor::<LoadTransformAndSave<
JsonAssetLoader<Level>,
IdentityAssetTransformer<Level>,
PostcardAssetSaver<Level>,
>>(LoadTransformAndSave::new(
IdentityAssetTransformer::<Level>::default(),
PostcardAssetSaver::<Level>::default(),
))
.init_state::<AppState>()
.add_systems(Startup, setup)
.add_systems(Update, spawn_level.run_if(in_state(AppState::Loading)))
.run();
}

fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
let level = LevelHandle(asset_server.load("trees.level"));
commands.insert_resource(level);
let tree = ImageHandle(asset_server.load("tree.png"));
commands.insert_resource(tree);
commands.spawn((Camera2d, Msaa::Off));
}

fn spawn_level(
mut commands: Commands,
level: Res<LevelHandle>,
tree: Res<ImageHandle>,
mut levels: ResMut<Assets<Level>>,
mut state: ResMut<NextState<AppState>>,
) {
if let Some(level) = levels.remove(level.0.id()) {
for position in level.positions {
commands.spawn((
Sprite::from_image(tree.0.clone()),
Transform::from_translation(position.into()),
));
}
state.set(AppState::Level);
}
}

#[derive(Debug, Clone, Copy, Default, Eq, PartialEq, Hash, States)]
enum AppState {
#[default]
Loading,
Level,
}

#[derive(Resource)]
struct ImageHandle(Handle<Image>);

#[derive(Resource)]
struct LevelHandle(Handle<Level>);

#[derive(Deserialize, Serialize, Asset, TypePath)]
struct Level {
positions: Vec<[f32; 3]>,
}
Binary file added examples/asset_savers/assets/tree.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions examples/asset_savers/assets/tree.png.meta
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
(
meta_format_version: "1.0",
asset: Load(
loader: "bevy_image::image_loader::ImageLoader",
settings: (
format: FromExtension,
is_srgb: true,
sampler: Default,
asset_usage: ("MAIN_WORLD | RENDER_WORLD"),
),
),
)
34 changes: 34 additions & 0 deletions examples/asset_savers/assets/trees.level
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"positions": [
[
42.0,
42.0,
0.0
],
[
4.0,
32.0,
0.0
],
[
54.0,
7.0,
0.0
],
[
-61.0,
4.0,
0.0
],
[
-6.0,
-72.0,
0.0
],
[
6.0,
-89.0,
0.0
]
]
}
11 changes: 11 additions & 0 deletions examples/asset_savers/assets/trees.level.meta
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
(
meta_format_version: "1.0",
asset: Process(
processor: "bevy_asset::processor::process::LoadTransformAndSave<bevy_common_assets::json::JsonAssetLoader<asset_savers::Level>, bevy_asset::transformer::IdentityAssetTransformer<asset_savers::Level>, bevy_common_assets::postcard::PostcardAssetSaver<asset_savers::Level>>",
settings: (
loader_settings: (),
transformer_settings: (),
saver_settings: (),
),
),
)

0 comments on commit 836fad4

Please sign in to comment.