@@ -434,6 +434,7 @@ impl<I, T: RenderResources> Default for RenderResourcesNodeState<I, T> {
434434
435435fn  render_resources_node_system < T :  RenderResources > ( 
436436    mut  state :  Local < RenderResourcesNodeState < Entity ,  T > > , 
437+     mut  entities_waiting_for_textures :  Local < Vec < Entity > > , 
437438    render_resource_context :  Res < Box < dyn  RenderResourceContext > > , 
438439    mut  queries :  QuerySet < ( 
439440        Query < ( Entity ,  & T ,  & Draw ,  & mut  RenderPipelines ) ,  Changed < T > > , 
@@ -453,17 +454,32 @@ fn render_resources_node_system<T: RenderResources>(
453454        uniform_buffer_arrays. remove_bindings ( * entity) ; 
454455    } 
455456
457+     // handle entities that were waiting for texture loads on the last update 
458+     for  entity in  std:: mem:: take ( & mut  * entities_waiting_for_textures)  { 
459+         for  ( entity,  uniforms,  _draw,  mut  render_pipelines)  in  queries. q1_mut ( ) . get_mut ( entity)  { 
460+             if  !setup_uniform_texture_resources :: < T > ( 
461+                 & uniforms, 
462+                 render_resource_context, 
463+                 & mut  render_pipelines. bindings , 
464+             )  { 
465+                 entities_waiting_for_textures. push ( entity) ; 
466+             } 
467+         } 
468+     } 
469+ 
456470    for  ( entity,  uniforms,  draw,  mut  render_pipelines)  in  queries. q0_mut ( ) . iter_mut ( )  { 
457471        if  !draw. is_visible  { 
458472            continue ; 
459473        } 
460474
461475        uniform_buffer_arrays. prepare_uniform_buffers ( entity,  uniforms) ; 
462-         setup_uniform_texture_resources :: < T > ( 
476+         if  ! setup_uniform_texture_resources :: < T > ( 
463477            & uniforms, 
464478            render_resource_context, 
465479            & mut  render_pipelines. bindings , 
466-         ) 
480+         )  { 
481+             entities_waiting_for_textures. push ( entity) ; 
482+         } 
467483    } 
468484
469485    let  resized = uniform_buffer_arrays. resize_buffer_arrays ( render_resource_context) ; 
@@ -584,17 +600,19 @@ where
584600
585601struct  AssetRenderNodeState < T :  Asset >  { 
586602    event_reader :  EventReader < AssetEvent < T > > , 
603+     assets_waiting_for_textures :  Vec < HandleId > , 
587604} 
588605
589606impl < T :  Asset >  Default  for  AssetRenderNodeState < T >  { 
590607    fn  default ( )  -> Self  { 
591608        Self  { 
592609            event_reader :  Default :: default ( ) , 
610+             assets_waiting_for_textures :  Default :: default ( ) , 
593611        } 
594612    } 
595613} 
596614
597- #[ allow( clippy:: clippy :: too_many_arguments) ]  
615+ #[ allow( clippy:: too_many_arguments) ]  
598616fn  asset_render_resources_node_system < T :  RenderResources  + Asset > ( 
599617    mut  state :  Local < RenderResourcesNodeState < HandleId ,  T > > , 
600618    mut  asset_state :  Local < AssetRenderNodeState < T > > , 
@@ -634,6 +652,18 @@ fn asset_render_resources_node_system<T: RenderResources + Asset>(
634652        } 
635653    } 
636654
655+     // handle assets that were waiting for texture loads on the last update 
656+     for  asset_handle in  std:: mem:: take ( & mut  asset_state. assets_waiting_for_textures )  { 
657+         if  let  Some ( asset)  = assets. get ( asset_handle)  { 
658+             let  mut  bindings =
659+                 asset_render_resource_bindings. get_or_insert_mut ( & Handle :: < T > :: weak ( asset_handle) ) ; 
660+             if  !setup_uniform_texture_resources :: < T > ( & asset,  render_resource_context,  & mut  bindings) 
661+             { 
662+                 asset_state. assets_waiting_for_textures . push ( asset_handle) ; 
663+             } 
664+         } 
665+     } 
666+ 
637667    uniform_buffer_arrays. begin_update ( ) ; 
638668    // initialize uniform buffer arrays using the first RenderResources 
639669    if  let  Some ( asset)  = changed_assets. values ( ) . next ( )  { 
@@ -644,7 +674,9 @@ fn asset_render_resources_node_system<T: RenderResources + Asset>(
644674        uniform_buffer_arrays. prepare_uniform_buffers ( * asset_handle,  asset) ; 
645675        let  mut  bindings =
646676            asset_render_resource_bindings. get_or_insert_mut ( & Handle :: < T > :: weak ( * asset_handle) ) ; 
647-         setup_uniform_texture_resources :: < T > ( & asset,  render_resource_context,  & mut  bindings) ; 
677+         if  !setup_uniform_texture_resources :: < T > ( & asset,  render_resource_context,  & mut  bindings)  { 
678+             asset_state. assets_waiting_for_textures . push ( * asset_handle) ; 
679+         } 
648680    } 
649681
650682    let  resized = uniform_buffer_arrays. resize_buffer_arrays ( render_resource_context) ; 
@@ -721,9 +753,11 @@ fn setup_uniform_texture_resources<T>(
721753    uniforms :  & T , 
722754    render_resource_context :  & dyn  RenderResourceContext , 
723755    render_resource_bindings :  & mut  RenderResourceBindings , 
724- )  where 
756+ )  -> bool 
757+ where 
725758    T :  renderer:: RenderResources , 
726759{ 
760+     let  mut  success = true ; 
727761    for  ( i,  render_resource)  in  uniforms. iter ( ) . enumerate ( )  { 
728762        if  let  Some ( RenderResourceType :: Texture )  = render_resource. resource_type ( )  { 
729763            let  render_resource_name = uniforms. get_render_resource_name ( i) . unwrap ( ) ; 
@@ -745,8 +779,12 @@ fn setup_uniform_texture_resources<T>(
745779                        RenderResourceBinding :: Sampler ( sampler_resource. get_sampler ( ) . unwrap ( ) ) , 
746780                    ) ; 
747781                    continue ; 
782+                 }  else  { 
783+                     success = false ; 
748784                } 
749785            } 
750786        } 
751787    } 
788+ 
789+     success
752790} 
0 commit comments