@@ -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} ;
1516use serde:: { Deserialize , Serialize } ;
16- use std:: convert:: Infallible ;
17+ use std:: { convert:: Infallible , io :: BufRead , path :: Path } ;
1718use thiserror:: Error ;
1819
1920fn 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 ) ]
229263struct 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
237275fn 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 ( ) ;
0 commit comments