Skip to content

Commit 0678e78

Browse files
committed
Update the asset processing example to show that we can do one-to-many asset processing.
1 parent 03e1877 commit 0678e78

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

examples/asset/processing/asset_processing.rs

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use bevy::{
44
asset::{
55
embedded_asset,
66
io::{Reader, Writer},
7-
processor::LoadTransformAndSave,
7+
meta::AssetMeta,
8+
processor::{LoadTransformAndSave, Process, ProcessContext, ProcessError, WriterContext},
89
saver::{AssetSaver, SavedAsset},
910
transformer::{AssetTransformer, TransformedAsset},
1011
AssetLoader, AsyncWriteExt, LoadContext,
@@ -13,7 +14,7 @@ use bevy::{
1314
reflect::TypePath,
1415
};
1516
use serde::{Deserialize, Serialize};
16-
use std::convert::Infallible;
17+
use std::{convert::Infallible, io::BufRead, path::Path};
1718
use thiserror::Error;
1819

1920
fn main() {
@@ -62,7 +63,9 @@ impl Plugin for TextPlugin {
6263
.register_asset_processor::<LoadTransformAndSave<CoolTextLoader, CoolTextTransformer, CoolTextSaver>>(
6364
LoadTransformAndSave::new(CoolTextTransformer, CoolTextSaver),
6465
)
65-
.set_default_asset_processor::<LoadTransformAndSave<CoolTextLoader, CoolTextTransformer, CoolTextSaver>>("cool.ron");
66+
.set_default_asset_processor::<LoadTransformAndSave<CoolTextLoader, CoolTextTransformer, CoolTextSaver>>("cool.ron")
67+
.register_asset_processor(LineSplitterProcess)
68+
.set_default_asset_processor::<LineSplitterProcess>("lines");
6669
}
6770
}
6871

@@ -225,13 +228,48 @@ impl AssetSaver for CoolTextSaver {
225228
}
226229
}
227230

231+
struct LineSplitterProcess;
232+
233+
impl Process for LineSplitterProcess {
234+
type Settings = ();
235+
236+
async fn process(
237+
&self,
238+
context: &mut ProcessContext<'_>,
239+
_meta: AssetMeta<(), Self>,
240+
writer_context: WriterContext<'_>,
241+
) -> Result<(), ProcessError> {
242+
let bytes = context.asset_bytes();
243+
if bytes.is_empty() {
244+
return Err(ProcessError::AssetTransformError("empty asset".into()));
245+
}
246+
for (i, line) in bytes.lines().map(Result::unwrap).enumerate() {
247+
let mut writer = writer_context
248+
.write_multiple(Path::new(&format!("Line{i}.line")))
249+
.await?;
250+
writer.write_all(line.as_bytes()).await.map_err(|err| {
251+
ProcessError::AssetWriterError {
252+
path: context.path().clone_owned(),
253+
err: err.into(),
254+
}
255+
})?;
256+
writer.finish::<TextLoader>(TextSettings::default()).await?;
257+
}
258+
Ok(())
259+
}
260+
}
261+
228262
#[derive(Resource)]
229263
struct TextAssets {
230264
a: Handle<Text>,
231265
b: Handle<Text>,
232266
c: Handle<Text>,
233267
d: Handle<Text>,
234268
e: Handle<Text>,
269+
multi_0: Handle<Text>,
270+
multi_1: Handle<Text>,
271+
multi_2: Handle<Text>,
272+
multi_3: Handle<Text>,
235273
}
236274

237275
fn setup(mut commands: Commands, assets: Res<AssetServer>) {
@@ -243,6 +281,10 @@ fn setup(mut commands: Commands, assets: Res<AssetServer>) {
243281
c: assets.load("foo/c.cool.ron"),
244282
d: assets.load("d.cool.ron"),
245283
e: assets.load("embedded://asset_processing/e.txt"),
284+
multi_0: assets.load("multi.lines/Line0.line"),
285+
multi_1: assets.load("multi.lines/Line1.line"),
286+
multi_2: assets.load("multi.lines/Line2.line"),
287+
multi_3: assets.load("multi.lines/Line3.line"),
246288
});
247289
}
248290

@@ -260,6 +302,10 @@ fn print_text(
260302
println!(" c: {:?}", texts.get(&handles.c));
261303
println!(" d: {:?}", texts.get(&handles.d));
262304
println!(" e: {:?}", texts.get(&handles.e));
305+
println!(" multi_0: {:?}", texts.get(&handles.multi_0));
306+
println!(" multi_1: {:?}", texts.get(&handles.multi_1));
307+
println!(" multi_2: {:?}", texts.get(&handles.multi_2));
308+
println!(" multi_3: {:?}", texts.get(&handles.multi_3));
263309
println!("(You can modify source assets and their .meta files to hot-reload changes!)");
264310
println!();
265311
asset_events.clear();
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
A line of text,
2+
this one's next!
3+
A single process,
4+
produces excess.

0 commit comments

Comments
 (0)