@@ -360,61 +360,61 @@ impl ShaderProcessor {
360
360
}
361
361
} ;
362
362
363
- let shader_defs = HashSet :: < String > :: from_iter ( shader_defs. iter ( ) . cloned ( ) ) ;
363
+ let shader_defs_unique = HashSet :: < String > :: from_iter ( shader_defs. iter ( ) . cloned ( ) ) ;
364
364
let mut scopes = vec ! [ true ] ;
365
- let mut processing = shader_str. to_string ( ) ;
366
- let final_string = loop {
367
- let mut processed = String :: new ( ) ;
368
- let mut changed = false ;
369
- for line in processing. split ( '\n' ) {
370
- if let Some ( cap) = self . ifdef_regex . captures ( line) {
371
- let def = cap. get ( 1 ) . unwrap ( ) ;
372
- scopes. push ( * scopes. last ( ) . unwrap ( ) && shader_defs. contains ( def. as_str ( ) ) ) ;
373
- changed = true ;
374
- } else if let Some ( cap) = self . ifndef_regex . captures ( line) {
375
- let def = cap. get ( 1 ) . unwrap ( ) ;
376
- scopes. push ( * scopes. last ( ) . unwrap ( ) && !shader_defs. contains ( def. as_str ( ) ) ) ;
377
- changed = true ;
378
- } else if self . else_regex . is_match ( line) {
379
- let mut is_parent_scope_truthy = true ;
380
- if scopes. len ( ) > 1 {
381
- is_parent_scope_truthy = scopes[ scopes. len ( ) - 2 ] ;
382
- }
383
- if let Some ( last) = scopes. last_mut ( ) {
384
- * last = is_parent_scope_truthy && !* last;
385
- }
386
- changed = true ;
387
- } else if self . endif_regex . is_match ( line) {
388
- scopes. pop ( ) ;
389
- if scopes. is_empty ( ) {
390
- return Err ( ProcessShaderError :: TooManyEndIfs ) ;
391
- }
392
- changed = true ;
393
- } else if let Some ( cap) = SHADER_IMPORT_PROCESSOR
394
- . import_asset_path_regex
395
- . captures ( line)
396
- {
397
- let import = ShaderImport :: AssetPath ( cap. get ( 1 ) . unwrap ( ) . as_str ( ) . to_string ( ) ) ;
398
- apply_import ( import_handles, shaders, & import, shader, & mut processed) ?;
399
- changed = true ;
400
- } else if let Some ( cap) = SHADER_IMPORT_PROCESSOR
401
- . import_custom_path_regex
402
- . captures ( line)
403
- {
404
- let import = ShaderImport :: Custom ( cap. get ( 1 ) . unwrap ( ) . as_str ( ) . to_string ( ) ) ;
405
- apply_import ( import_handles, shaders, & import, shader, & mut processed) ?;
406
- changed = true ;
407
- } else if * scopes. last ( ) . unwrap ( ) {
408
- processed. push_str ( line) ;
409
- processed. push ( '\n' ) ;
365
+ let mut final_string = String :: new ( ) ;
366
+ for line in shader_str. split ( '\n' ) {
367
+ if let Some ( cap) = self . ifdef_regex . captures ( line) {
368
+ let def = cap. get ( 1 ) . unwrap ( ) ;
369
+ scopes. push ( * scopes. last ( ) . unwrap ( ) && shader_defs_unique. contains ( def. as_str ( ) ) ) ;
370
+ } else if let Some ( cap) = self . ifndef_regex . captures ( line) {
371
+ let def = cap. get ( 1 ) . unwrap ( ) ;
372
+ scopes. push ( * scopes. last ( ) . unwrap ( ) && !shader_defs_unique. contains ( def. as_str ( ) ) ) ;
373
+ } else if self . else_regex . is_match ( line) {
374
+ let mut is_parent_scope_truthy = true ;
375
+ if scopes. len ( ) > 1 {
376
+ is_parent_scope_truthy = scopes[ scopes. len ( ) - 2 ] ;
410
377
}
378
+ if let Some ( last) = scopes. last_mut ( ) {
379
+ * last = is_parent_scope_truthy && !* last;
380
+ }
381
+ } else if self . endif_regex . is_match ( line) {
382
+ scopes. pop ( ) ;
383
+ if scopes. is_empty ( ) {
384
+ return Err ( ProcessShaderError :: TooManyEndIfs ) ;
385
+ }
386
+ } else if let Some ( cap) = SHADER_IMPORT_PROCESSOR
387
+ . import_asset_path_regex
388
+ . captures ( line)
389
+ {
390
+ let import = ShaderImport :: AssetPath ( cap. get ( 1 ) . unwrap ( ) . as_str ( ) . to_string ( ) ) ;
391
+ self . apply_import (
392
+ import_handles,
393
+ shaders,
394
+ & import,
395
+ shader,
396
+ shader_defs,
397
+ & mut final_string,
398
+ ) ?;
399
+ } else if let Some ( cap) = SHADER_IMPORT_PROCESSOR
400
+ . import_custom_path_regex
401
+ . captures ( line)
402
+ {
403
+ let import = ShaderImport :: Custom ( cap. get ( 1 ) . unwrap ( ) . as_str ( ) . to_string ( ) ) ;
404
+ self . apply_import (
405
+ import_handles,
406
+ shaders,
407
+ & import,
408
+ shader,
409
+ shader_defs,
410
+ & mut final_string,
411
+ ) ?;
412
+ } else if * scopes. last ( ) . unwrap ( ) {
413
+ final_string. push_str ( line) ;
414
+ final_string. push ( '\n' ) ;
411
415
}
412
- processed. pop ( ) ;
413
- if !changed {
414
- break processed;
415
- }
416
- processing = processed;
417
- } ;
416
+ }
417
+ final_string. pop ( ) ;
418
418
419
419
if scopes. len ( ) != 1 {
420
420
return Err ( ProcessShaderError :: NotEnoughEndIfs ) ;
@@ -430,40 +430,45 @@ impl ShaderProcessor {
430
430
}
431
431
}
432
432
}
433
- }
434
433
435
- fn apply_import (
436
- import_handles : & HashMap < ShaderImport , Handle < Shader > > ,
437
- shaders : & HashMap < Handle < Shader > , Shader > ,
438
- import : & ShaderImport ,
439
- shader : & Shader ,
440
- final_string : & mut String ,
441
- ) -> Result < ( ) , ProcessShaderError > {
442
- let imported_shader = import_handles
443
- . get ( import)
444
- . and_then ( |handle| shaders. get ( handle) )
445
- . ok_or_else ( || ProcessShaderError :: UnresolvedImport ( import. clone ( ) ) ) ?;
446
- match & shader. source {
447
- Source :: Wgsl ( _) => {
448
- if let Source :: Wgsl ( import_source) = & imported_shader. source {
449
- final_string. push_str ( import_source) ;
450
- } else {
451
- return Err ( ProcessShaderError :: MismatchedImportFormat ( import. clone ( ) ) ) ;
434
+ fn apply_import (
435
+ & self ,
436
+ import_handles : & HashMap < ShaderImport , Handle < Shader > > ,
437
+ shaders : & HashMap < Handle < Shader > , Shader > ,
438
+ import : & ShaderImport ,
439
+ shader : & Shader ,
440
+ shader_defs : & [ String ] ,
441
+ final_string : & mut String ,
442
+ ) -> Result < ( ) , ProcessShaderError > {
443
+ let imported_shader = import_handles
444
+ . get ( import)
445
+ . and_then ( |handle| shaders. get ( handle) )
446
+ . ok_or_else ( || ProcessShaderError :: UnresolvedImport ( import. clone ( ) ) ) ?;
447
+ let imported_processed =
448
+ self . process ( imported_shader, shader_defs, shaders, import_handles) ?;
449
+
450
+ match & shader. source {
451
+ Source :: Wgsl ( _) => {
452
+ if let ProcessedShader :: Wgsl ( import_source) = & imported_processed {
453
+ final_string. push_str ( import_source) ;
454
+ } else {
455
+ return Err ( ProcessShaderError :: MismatchedImportFormat ( import. clone ( ) ) ) ;
456
+ }
452
457
}
453
- }
454
- Source :: Glsl ( _, _) => {
455
- if let Source :: Glsl ( import_source, _) = & imported_shader. source {
456
- final_string. push_str ( import_source) ;
457
- } else {
458
- return Err ( ProcessShaderError :: MismatchedImportFormat ( import. clone ( ) ) ) ;
458
+ Source :: Glsl ( _, _) => {
459
+ if let ProcessedShader :: Glsl ( import_source, _) = & imported_processed {
460
+ final_string. push_str ( import_source) ;
461
+ } else {
462
+ return Err ( ProcessShaderError :: MismatchedImportFormat ( import. clone ( ) ) ) ;
463
+ }
464
+ }
465
+ Source :: SpirV ( _) => {
466
+ return Err ( ProcessShaderError :: ShaderFormatDoesNotSupportImports ) ;
459
467
}
460
468
}
461
- Source :: SpirV ( _) => {
462
- return Err ( ProcessShaderError :: ShaderFormatDoesNotSupportImports ) ;
463
- }
464
- }
465
469
466
- Ok ( ( ) )
470
+ Ok ( ( ) )
471
+ }
467
472
}
468
473
469
474
#[ cfg( test) ]
0 commit comments