@@ -39,7 +39,7 @@ use std::marker::PhantomData;
39
39
/// way to render [`Mesh`] entities with custom shader logic. For materials that can specialize their [`RenderPipelineDescriptor`]
40
40
/// based on specific material values, see [`SpecializedMaterial`]. [`Material`] automatically implements [`SpecializedMaterial`]
41
41
/// and can be used anywhere that type is used (such as [`MaterialPlugin`]).
42
- pub trait Material : Asset + RenderAsset {
42
+ pub trait Material : Asset + RenderAsset + Sized {
43
43
/// Returns this material's [`BindGroup`]. This should match the layout returned by [`Material::bind_group_layout`].
44
44
fn bind_group ( material : & <Self as RenderAsset >:: PreparedAsset ) -> & BindGroup ;
45
45
@@ -78,6 +78,7 @@ pub trait Material: Asset + RenderAsset {
78
78
#[ allow( unused_variables) ]
79
79
#[ inline]
80
80
fn specialize (
81
+ pipeline : & MaterialPipeline < Self > ,
81
82
descriptor : & mut RenderPipelineDescriptor ,
82
83
layout : & MeshVertexBufferLayout ,
83
84
) -> Result < ( ) , SpecializedMeshPipelineError > {
@@ -89,19 +90,16 @@ impl<M: Material> SpecializedMaterial for M {
89
90
type Key = ( ) ;
90
91
91
92
#[ inline]
92
- fn key (
93
- _render_device : & RenderDevice ,
94
- _material : & <Self as RenderAsset >:: PreparedAsset ,
95
- ) -> Self :: Key {
96
- }
93
+ fn key ( _material : & <Self as RenderAsset >:: PreparedAsset ) -> Self :: Key { }
97
94
98
95
#[ inline]
99
96
fn specialize (
97
+ pipeline : & MaterialPipeline < Self > ,
100
98
descriptor : & mut RenderPipelineDescriptor ,
101
99
_key : Self :: Key ,
102
100
layout : & MeshVertexBufferLayout ,
103
101
) -> Result < ( ) , SpecializedMeshPipelineError > {
104
- <M as Material >:: specialize ( descriptor, layout)
102
+ <M as Material >:: specialize ( pipeline , descriptor, layout)
105
103
}
106
104
107
105
#[ inline]
@@ -141,20 +139,18 @@ impl<M: Material> SpecializedMaterial for M {
141
139
/// way to render [`Mesh`] entities with custom shader logic. [`SpecializedMaterials`](SpecializedMaterial) use their [`SpecializedMaterial::Key`]
142
140
/// to customize their [`RenderPipelineDescriptor`] based on specific material values. The slightly simpler [`Material`] trait
143
141
/// should be used for materials that do not need specialization. [`Material`] types automatically implement [`SpecializedMaterial`].
144
- pub trait SpecializedMaterial : Asset + RenderAsset {
142
+ pub trait SpecializedMaterial : Asset + RenderAsset + Sized {
145
143
/// The key used to specialize this material's [`RenderPipelineDescriptor`].
146
144
type Key : PartialEq + Eq + Hash + Clone + Send + Sync ;
147
145
148
146
/// Extract the [`SpecializedMaterial::Key`] for the "prepared" version of this material. This key will be
149
147
/// passed in to the [`SpecializedMaterial::specialize`] function when compiling the [`RenderPipeline`](bevy_render::render_resource::RenderPipeline)
150
148
/// for a given entity's material.
151
- fn key (
152
- render_device : & RenderDevice ,
153
- material : & <Self as RenderAsset >:: PreparedAsset ,
154
- ) -> Self :: Key ;
149
+ fn key ( material : & <Self as RenderAsset >:: PreparedAsset ) -> Self :: Key ;
155
150
156
151
/// Specializes the given `descriptor` according to the given `key`.
157
152
fn specialize (
153
+ pipeline : & MaterialPipeline < Self > ,
158
154
descriptor : & mut RenderPipelineDescriptor ,
159
155
key : Self :: Key ,
160
156
layout : & MeshVertexBufferLayout ,
@@ -258,7 +254,7 @@ impl<M: SpecializedMaterial> SpecializedMeshPipeline for MaterialPipeline<M> {
258
254
let descriptor_layout = descriptor. layout . as_mut ( ) . unwrap ( ) ;
259
255
descriptor_layout. insert ( 1 , self . material_layout . clone ( ) ) ;
260
256
261
- M :: specialize ( & mut descriptor, key. material_key , layout) ?;
257
+ M :: specialize ( self , & mut descriptor, key. material_key , layout) ?;
262
258
Ok ( descriptor)
263
259
}
264
260
}
@@ -315,7 +311,6 @@ pub fn queue_material_meshes<M: SpecializedMaterial>(
315
311
material_pipeline : Res < MaterialPipeline < M > > ,
316
312
mut pipelines : ResMut < SpecializedMeshPipelines < MaterialPipeline < M > > > ,
317
313
mut pipeline_cache : ResMut < PipelineCache > ,
318
- render_device : Res < RenderDevice > ,
319
314
msaa : Res < Msaa > ,
320
315
render_meshes : Res < RenderAssets < Mesh > > ,
321
316
render_materials : Res < RenderAssets < M > > ,
@@ -328,7 +323,6 @@ pub fn queue_material_meshes<M: SpecializedMaterial>(
328
323
& mut RenderPhase < Transparent3d > ,
329
324
) > ,
330
325
) {
331
- let render_device = render_device. into_inner ( ) ;
332
326
for ( view, visible_entities, mut opaque_phase, mut alpha_mask_phase, mut transparent_phase) in
333
327
views. iter_mut ( )
334
328
{
@@ -363,7 +357,7 @@ pub fn queue_material_meshes<M: SpecializedMaterial>(
363
357
mesh_key |= MeshPipelineKey :: TRANSPARENT_MAIN_PASS ;
364
358
}
365
359
366
- let material_key = M :: key ( render_device , material) ;
360
+ let material_key = M :: key ( material) ;
367
361
368
362
let pipeline_id = pipelines. specialize (
369
363
& mut pipeline_cache,
0 commit comments