@@ -388,8 +388,10 @@ impl AssetInfos {
388
388
loaded_asset. value . insert ( loaded_asset_id, world) ;
389
389
let mut loading_deps = loaded_asset. dependencies ;
390
390
let mut failed_deps = HashSet :: new ( ) ;
391
+ let mut dep_error = None ;
391
392
let mut loading_rec_deps = loading_deps. clone ( ) ;
392
393
let mut failed_rec_deps = HashSet :: new ( ) ;
394
+ let mut rec_dep_error = None ;
393
395
loading_deps. retain ( |dep_id| {
394
396
if let Some ( dep_info) = self . get_mut ( * dep_id) {
395
397
match dep_info. rec_dep_load_state {
@@ -404,7 +406,10 @@ impl AssetInfos {
404
406
// If dependency is loaded, reduce our count by one
405
407
loading_rec_deps. remove ( dep_id) ;
406
408
}
407
- RecursiveDependencyLoadState :: Failed => {
409
+ RecursiveDependencyLoadState :: Failed ( ref error) => {
410
+ if rec_dep_error. is_none ( ) {
411
+ rec_dep_error = Some ( error. clone ( ) ) ;
412
+ }
408
413
failed_rec_deps. insert ( * dep_id) ;
409
414
loading_rec_deps. remove ( dep_id) ;
410
415
}
@@ -419,7 +424,10 @@ impl AssetInfos {
419
424
// If dependency is loaded, reduce our count by one
420
425
false
421
426
}
422
- LoadState :: Failed ( _) => {
427
+ LoadState :: Failed ( ref error) => {
428
+ if dep_error. is_none ( ) {
429
+ dep_error = Some ( error. clone ( ) ) ;
430
+ }
423
431
failed_deps. insert ( * dep_id) ;
424
432
false
425
433
}
@@ -437,7 +445,7 @@ impl AssetInfos {
437
445
let dep_load_state = match ( loading_deps. len ( ) , failed_deps. len ( ) ) {
438
446
( 0 , 0 ) => DependencyLoadState :: Loaded ,
439
447
( _loading, 0 ) => DependencyLoadState :: Loading ,
440
- ( _loading, _failed) => DependencyLoadState :: Failed ,
448
+ ( _loading, _failed) => DependencyLoadState :: Failed ( dep_error . unwrap ( ) ) ,
441
449
} ;
442
450
443
451
let rec_dep_load_state = match ( loading_rec_deps. len ( ) , failed_rec_deps. len ( ) ) {
@@ -450,7 +458,7 @@ impl AssetInfos {
450
458
RecursiveDependencyLoadState :: Loaded
451
459
}
452
460
( _loading, 0 ) => RecursiveDependencyLoadState :: Loading ,
453
- ( _loading, _failed) => RecursiveDependencyLoadState :: Failed ,
461
+ ( _loading, _failed) => RecursiveDependencyLoadState :: Failed ( rec_dep_error . unwrap ( ) ) ,
454
462
} ;
455
463
456
464
let ( dependants_waiting_on_load, dependants_waiting_on_rec_load) = {
@@ -480,14 +488,14 @@ impl AssetInfos {
480
488
info. failed_rec_dependencies = failed_rec_deps;
481
489
info. load_state = LoadState :: Loaded ;
482
490
info. dep_load_state = dep_load_state;
483
- info. rec_dep_load_state = rec_dep_load_state;
491
+ info. rec_dep_load_state = rec_dep_load_state. clone ( ) ;
484
492
if watching_for_changes {
485
493
info. loader_dependencies = loaded_asset. loader_dependencies ;
486
494
}
487
495
488
496
let dependants_waiting_on_rec_load = if matches ! (
489
497
rec_dep_load_state,
490
- RecursiveDependencyLoadState :: Loaded | RecursiveDependencyLoadState :: Failed
498
+ RecursiveDependencyLoadState :: Loaded | RecursiveDependencyLoadState :: Failed ( _ )
491
499
) {
492
500
Some ( std:: mem:: take (
493
501
& mut info. dependants_waiting_on_recursive_dep_load ,
@@ -505,7 +513,9 @@ impl AssetInfos {
505
513
for id in dependants_waiting_on_load {
506
514
if let Some ( info) = self . get_mut ( id) {
507
515
info. loading_dependencies . remove ( & loaded_asset_id) ;
508
- if info. loading_dependencies . is_empty ( ) {
516
+ if info. loading_dependencies . is_empty ( )
517
+ && !matches ! ( info. dep_load_state, DependencyLoadState :: Failed ( _) )
518
+ {
509
519
// send dependencies loaded event
510
520
info. dep_load_state = DependencyLoadState :: Loaded ;
511
521
}
@@ -519,9 +529,9 @@ impl AssetInfos {
519
529
Self :: propagate_loaded_state ( self , loaded_asset_id, dep_id, sender) ;
520
530
}
521
531
}
522
- RecursiveDependencyLoadState :: Failed => {
532
+ RecursiveDependencyLoadState :: Failed ( ref error ) => {
523
533
for dep_id in dependants_waiting_on_rec_load {
524
- Self :: propagate_failed_state ( self , loaded_asset_id, dep_id) ;
534
+ Self :: propagate_failed_state ( self , loaded_asset_id, dep_id, error ) ;
525
535
}
526
536
}
527
537
RecursiveDependencyLoadState :: Loading | RecursiveDependencyLoadState :: NotLoaded => {
@@ -570,11 +580,12 @@ impl AssetInfos {
570
580
infos : & mut AssetInfos ,
571
581
failed_id : UntypedAssetId ,
572
582
waiting_id : UntypedAssetId ,
583
+ error : & Arc < AssetLoadError > ,
573
584
) {
574
585
let dependants_waiting_on_rec_load = if let Some ( info) = infos. get_mut ( waiting_id) {
575
586
info. loading_rec_dependencies . remove ( & failed_id) ;
576
587
info. failed_rec_dependencies . insert ( failed_id) ;
577
- info. rec_dep_load_state = RecursiveDependencyLoadState :: Failed ;
588
+ info. rec_dep_load_state = RecursiveDependencyLoadState :: Failed ( error . clone ( ) ) ;
578
589
Some ( std:: mem:: take (
579
590
& mut info. dependants_waiting_on_recursive_dep_load ,
580
591
) )
@@ -584,7 +595,7 @@ impl AssetInfos {
584
595
585
596
if let Some ( dependants_waiting_on_rec_load) = dependants_waiting_on_rec_load {
586
597
for dep_id in dependants_waiting_on_rec_load {
587
- Self :: propagate_failed_state ( infos, waiting_id, dep_id) ;
598
+ Self :: propagate_failed_state ( infos, waiting_id, dep_id, error ) ;
588
599
}
589
600
}
590
601
}
@@ -595,14 +606,15 @@ impl AssetInfos {
595
606
return ;
596
607
}
597
608
609
+ let error = Arc :: new ( error) ;
598
610
let ( dependants_waiting_on_load, dependants_waiting_on_rec_load) = {
599
611
let Some ( info) = self . get_mut ( failed_id) else {
600
612
// The asset was already dropped.
601
613
return ;
602
614
} ;
603
- info. load_state = LoadState :: Failed ( Box :: new ( error) ) ;
604
- info. dep_load_state = DependencyLoadState :: Failed ;
605
- info. rec_dep_load_state = RecursiveDependencyLoadState :: Failed ;
615
+ info. load_state = LoadState :: Failed ( error. clone ( ) ) ;
616
+ info. dep_load_state = DependencyLoadState :: Failed ( error . clone ( ) ) ;
617
+ info. rec_dep_load_state = RecursiveDependencyLoadState :: Failed ( error . clone ( ) ) ;
606
618
(
607
619
std:: mem:: take ( & mut info. dependants_waiting_on_load ) ,
608
620
std:: mem:: take ( & mut info. dependants_waiting_on_recursive_dep_load ) ,
@@ -613,12 +625,15 @@ impl AssetInfos {
613
625
if let Some ( info) = self . get_mut ( waiting_id) {
614
626
info. loading_dependencies . remove ( & failed_id) ;
615
627
info. failed_dependencies . insert ( failed_id) ;
616
- info. dep_load_state = DependencyLoadState :: Failed ;
628
+ // don't overwrite DependencyLoadState if already failed to preserve first error
629
+ if !( matches ! ( info. dep_load_state, DependencyLoadState :: Failed ( _) ) ) {
630
+ info. dep_load_state = DependencyLoadState :: Failed ( error. clone ( ) ) ;
631
+ }
617
632
}
618
633
}
619
634
620
635
for waiting_id in dependants_waiting_on_rec_load {
621
- Self :: propagate_failed_state ( self , failed_id, waiting_id) ;
636
+ Self :: propagate_failed_state ( self , failed_id, waiting_id, & error ) ;
622
637
}
623
638
}
624
639
0 commit comments