@@ -2,7 +2,10 @@ use super::{
2
2
CachedComputePipelineId , CachedRenderPipelineId , ComputePipeline , ComputePipelineDescriptor ,
3
3
PipelineCache , RenderPipeline , RenderPipelineDescriptor ,
4
4
} ;
5
- use bevy_ecs:: system:: Resource ;
5
+ use bevy_ecs:: {
6
+ system:: Resource ,
7
+ world:: { FromWorld , World } ,
8
+ } ;
6
9
use bevy_utils:: hashbrown:: HashMap ;
7
10
use core:: hash:: Hash ;
8
11
@@ -38,8 +41,9 @@ pub trait Specialize<T: SpecializeTarget>: Send + Sync + 'static {
38
41
fn specialize ( & self , key : Self :: Key , descriptor : & mut T :: Descriptor ) ;
39
42
}
40
43
41
- pub type RenderPipelineSpecializer < S > = Specializer < RenderPipeline , S > ;
42
- pub type ComputePipelineSpecializer < S > = Specializer < ComputePipeline , S > ;
44
+ pub trait HasBaseDescriptor < T : SpecializeTarget > : Specialize < T > {
45
+ fn base_descriptor ( & self ) -> T :: Descriptor ;
46
+ }
43
47
44
48
#[ derive( Resource ) ]
45
49
pub struct Specializer < T : SpecializeTarget , S : Specialize < T > > {
@@ -77,3 +81,11 @@ impl<T: SpecializeTarget, S: Specialize<T>> Specializer<T, S> {
77
81
. clone ( )
78
82
}
79
83
}
84
+
85
+ impl < T : SpecializeTarget , S : FromWorld + HasBaseDescriptor < T > > FromWorld for Specializer < T , S > {
86
+ fn from_world ( world : & mut World ) -> Self {
87
+ let specializer = S :: from_world ( world) ;
88
+ let base_descriptor = specializer. base_descriptor ( ) ;
89
+ Self :: new ( specializer, None , base_descriptor)
90
+ }
91
+ }
0 commit comments