@@ -2,7 +2,7 @@ use crate::{
2
2
point_light_order, AmbientLight , Clusters , CubemapVisibleEntities , DirectionalLight ,
3
3
DirectionalLightShadowMap , DrawMesh , MeshPipeline , NotShadowCaster , PointLight ,
4
4
PointLightShadowMap , SetMeshBindGroup , SetSkinnedMeshBindGroup , VisiblePointLights ,
5
- SHADOW_SHADER_HANDLE ,
5
+ JOINT_BUFFER_SIZE , SHADOW_SHADER_HANDLE ,
6
6
} ;
7
7
use bevy_asset:: Handle ;
8
8
use bevy_core:: FloatOrd ;
@@ -160,6 +160,7 @@ pub const SHADOW_FORMAT: TextureFormat = TextureFormat::Depth32Float;
160
160
pub struct ShadowPipeline {
161
161
pub view_layout : BindGroupLayout ,
162
162
pub mesh_layout : BindGroupLayout ,
163
+ pub skinned_mesh_layout : BindGroupLayout ,
163
164
pub point_light_sampler : Sampler ,
164
165
pub directional_light_sampler : Sampler ,
165
166
}
@@ -189,9 +190,25 @@ impl FromWorld for ShadowPipeline {
189
190
190
191
let mesh_pipeline = world. get_resource :: < MeshPipeline > ( ) . unwrap ( ) ;
191
192
193
+ let skinned_mesh_layout =
194
+ render_device. create_bind_group_layout ( & BindGroupLayoutDescriptor {
195
+ entries : & [ BindGroupLayoutEntry {
196
+ binding : 0 ,
197
+ visibility : ShaderStages :: VERTEX ,
198
+ ty : BindingType :: Buffer {
199
+ ty : BufferBindingType :: Uniform ,
200
+ has_dynamic_offset : false ,
201
+ min_binding_size : BufferSize :: new ( JOINT_BUFFER_SIZE as u64 ) ,
202
+ } ,
203
+ count : None ,
204
+ } ] ,
205
+ label : Some ( "mesh_layout" ) ,
206
+ } ) ;
207
+
192
208
ShadowPipeline {
193
209
view_layout,
194
210
mesh_layout : mesh_pipeline. mesh_layout . clone ( ) ,
211
+ skinned_mesh_layout,
195
212
point_light_sampler : render_device. create_sampler ( & SamplerDescriptor {
196
213
address_mode_u : AddressMode :: ClampToEdge ,
197
214
address_mode_v : AddressMode :: ClampToEdge ,
@@ -257,18 +274,31 @@ impl SpecializedMeshPipeline for ShadowPipeline {
257
274
key : Self :: Key ,
258
275
layout : & MeshVertexBufferLayout ,
259
276
) -> Result < RenderPipelineDescriptor , SpecializedMeshPipelineError > {
260
- let vertex_buffer_layout =
261
- layout. get_layout ( & [ Mesh :: ATTRIBUTE_POSITION . at_shader_location ( 0 ) ] ) ?;
277
+ let mut vertex_attributes = vec ! [ Mesh :: ATTRIBUTE_POSITION . at_shader_location( 0 ) ] ;
278
+
279
+ let mut bind_group_layout = vec ! [ self . view_layout. clone( ) , self . mesh_layout. clone( ) ] ;
280
+ let mut shader_defs = Vec :: new ( ) ;
281
+
282
+ if layout. contains ( Mesh :: ATTRIBUTE_JOINT_INDEX )
283
+ && layout. contains ( Mesh :: ATTRIBUTE_JOINT_WEIGHT )
284
+ {
285
+ shader_defs. push ( String :: from ( "SKINNED" ) ) ;
286
+ vertex_attributes. push ( Mesh :: ATTRIBUTE_JOINT_INDEX . at_shader_location ( 4 ) ) ;
287
+ vertex_attributes. push ( Mesh :: ATTRIBUTE_JOINT_WEIGHT . at_shader_location ( 5 ) ) ;
288
+ bind_group_layout. push ( self . skinned_mesh_layout . clone ( ) ) ;
289
+ }
290
+
291
+ let vertex_buffer_layout = layout. get_layout ( & vertex_attributes) ?;
262
292
263
293
Ok ( RenderPipelineDescriptor {
264
294
vertex : VertexState {
265
295
shader : SHADOW_SHADER_HANDLE . typed :: < Shader > ( ) ,
266
296
entry_point : "vertex" . into ( ) ,
267
- shader_defs : vec ! [ ] ,
297
+ shader_defs,
268
298
buffers : vec ! [ vertex_buffer_layout] ,
269
299
} ,
270
300
fragment : None ,
271
- layout : Some ( vec ! [ self . view_layout . clone ( ) , self . mesh_layout . clone ( ) ] ) ,
301
+ layout : Some ( bind_group_layout ) ,
272
302
primitive : PrimitiveState {
273
303
topology : key. primitive_topology ( ) ,
274
304
strip_index_format : None ,
0 commit comments