split AsVertexBufferDescriptor out from Uniforms
This commit is contained in:
		
							parent
							
								
									70e9892e00
								
							
						
					
					
						commit
						d0298a4f89
					
				
							
								
								
									
										136
									
								
								crates/bevy_derive/src/as_vertex_buffer_descriptor.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								crates/bevy_derive/src/as_vertex_buffer_descriptor.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,136 @@ | |||||||
|  | use crate::modules::{get_modules, get_path}; | ||||||
|  | use darling::FromMeta; | ||||||
|  | use inflector::Inflector; | ||||||
|  | use proc_macro::TokenStream; | ||||||
|  | use quote::{format_ident, quote}; | ||||||
|  | use syn::{parse_macro_input, Data, DataStruct, DeriveInput, Field, Fields, Path}; | ||||||
|  | 
 | ||||||
|  | #[derive(FromMeta, Debug, Default)] | ||||||
|  | struct VertexAttributeArgs { | ||||||
|  |     #[darling(default)] | ||||||
|  |     pub ignore: Option<bool>, | ||||||
|  |     #[darling(default)] | ||||||
|  |     pub instance: Option<bool>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[derive(Default)] | ||||||
|  | struct VertexAttributes { | ||||||
|  |     pub ignore: bool, | ||||||
|  |     pub instance: bool, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl From<VertexAttributeArgs> for VertexAttributes { | ||||||
|  |     fn from(args: VertexAttributeArgs) -> Self { | ||||||
|  |         VertexAttributes { | ||||||
|  |             ignore: args.ignore.unwrap_or(false), | ||||||
|  |             instance: args.instance.unwrap_or(false), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static UNIFORM_ATTRIBUTE_NAME: &'static str = "uniform"; | ||||||
|  | 
 | ||||||
|  | pub fn derive_as_vertex_buffer_descriptor(input: TokenStream) -> TokenStream { | ||||||
|  |     let ast = parse_macro_input!(input as DeriveInput); | ||||||
|  |     let modules = get_modules(&ast); | ||||||
|  | 
 | ||||||
|  |     let bevy_render_path: Path = get_path(&modules.bevy_render); | ||||||
|  | 
 | ||||||
|  |     let fields = match &ast.data { | ||||||
|  |         Data::Struct(DataStruct { | ||||||
|  |             fields: Fields::Named(fields), | ||||||
|  |             .. | ||||||
|  |         }) => &fields.named, | ||||||
|  |         _ => panic!("expected a struct with named fields"), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     let field_attributes = fields | ||||||
|  |         .iter() | ||||||
|  |         .map(|f| { | ||||||
|  |             ( | ||||||
|  |                 f, | ||||||
|  |                 f.attrs | ||||||
|  |                     .iter() | ||||||
|  |                     .find(|a| { | ||||||
|  |                         a.path.get_ident().as_ref().unwrap().to_string() == UNIFORM_ATTRIBUTE_NAME | ||||||
|  |                     }) | ||||||
|  |                     .map(|a| { | ||||||
|  |                         VertexAttributes::from( | ||||||
|  |                             VertexAttributeArgs::from_meta(&a.parse_meta().unwrap()) | ||||||
|  |                                 .unwrap_or_else(|_err| VertexAttributeArgs::default()), | ||||||
|  |                         ) | ||||||
|  |                     }) | ||||||
|  |                     .unwrap_or_else(|| VertexAttributes::default()), | ||||||
|  |             ) | ||||||
|  |         }) | ||||||
|  |         .collect::<Vec<(&Field, VertexAttributes)>>(); | ||||||
|  | 
 | ||||||
|  |     let struct_name = &ast.ident; | ||||||
|  | 
 | ||||||
|  |     let mut vertex_buffer_field_names_pascal = Vec::new(); | ||||||
|  |     let mut vertex_buffer_field_types = Vec::new(); | ||||||
|  |     for (f, attrs) in field_attributes.iter() { | ||||||
|  |         if attrs.ignore { | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         vertex_buffer_field_types.push(&f.ty); | ||||||
|  |         let pascal_field = f.ident.as_ref().unwrap().to_string().to_pascal_case(); | ||||||
|  |         vertex_buffer_field_names_pascal.push(if attrs.instance { | ||||||
|  |             format!("I_{}_{}", struct_name, pascal_field) | ||||||
|  |         } else { | ||||||
|  |             format!("{}_{}", struct_name, pascal_field) | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     let struct_name_string = struct_name.to_string(); | ||||||
|  |     let struct_name_uppercase = struct_name_string.to_uppercase(); | ||||||
|  |     let vertex_buffer_descriptor_ident = | ||||||
|  |         format_ident!("{}_VERTEX_BUFFER_DESCRIPTOR", struct_name_uppercase); | ||||||
|  | 
 | ||||||
|  |     TokenStream::from(quote! { | ||||||
|  |         static #vertex_buffer_descriptor_ident: #bevy_render_path::once_cell::sync::Lazy<#bevy_render_path::pipeline::VertexBufferDescriptor> = | ||||||
|  |             #bevy_render_path::once_cell::sync::Lazy::new(|| { | ||||||
|  |                 use #bevy_render_path::pipeline::{VertexFormat, AsVertexFormats, VertexAttributeDescriptor}; | ||||||
|  | 
 | ||||||
|  |                 let mut vertex_formats: Vec<(&str,&[VertexFormat])>  = vec![ | ||||||
|  |                     #((#vertex_buffer_field_names_pascal, <#vertex_buffer_field_types>::as_vertex_formats()),)* | ||||||
|  |                 ]; | ||||||
|  | 
 | ||||||
|  |                 let mut shader_location = 0; | ||||||
|  |                 let mut offset = 0; | ||||||
|  |                 let vertex_attribute_descriptors = vertex_formats.drain(..).map(|(name, formats)| { | ||||||
|  |                     formats.iter().enumerate().map(|(i, format)| { | ||||||
|  |                         let size = format.get_size(); | ||||||
|  |                         let formatted_name = if formats.len() > 1 { | ||||||
|  |                             format!("{}_{}", name, i) | ||||||
|  |                         } else { | ||||||
|  |                             format!("{}", name) | ||||||
|  |                         }; | ||||||
|  |                         let descriptor = VertexAttributeDescriptor { | ||||||
|  |                             name: formatted_name.into(), | ||||||
|  |                             offset, | ||||||
|  |                             format: *format, | ||||||
|  |                             shader_location, | ||||||
|  |                         }; | ||||||
|  |                         offset += size; | ||||||
|  |                         shader_location += 1; | ||||||
|  |                         descriptor | ||||||
|  |                     }).collect::<Vec<VertexAttributeDescriptor>>() | ||||||
|  |                 }).flatten().collect::<Vec<VertexAttributeDescriptor>>(); | ||||||
|  | 
 | ||||||
|  |                 #bevy_render_path::pipeline::VertexBufferDescriptor { | ||||||
|  |                     attributes: vertex_attribute_descriptors, | ||||||
|  |                     name: #struct_name_string.into(), | ||||||
|  |                     step_mode: #bevy_render_path::pipeline::InputStepMode::Instance, | ||||||
|  |                     stride: offset, | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |         impl #bevy_render_path::pipeline::AsVertexBufferDescriptor for #struct_name { | ||||||
|  |             fn as_vertex_buffer_descriptor() -> &'static #bevy_render_path::pipeline::VertexBufferDescriptor { | ||||||
|  |                 &#vertex_buffer_descriptor_ident | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }) | ||||||
|  | } | ||||||
| @ -6,6 +6,7 @@ mod entity_archetype; | |||||||
| mod modules; | mod modules; | ||||||
| mod resource; | mod resource; | ||||||
| mod uniforms; | mod uniforms; | ||||||
|  | mod as_vertex_buffer_descriptor; | ||||||
| 
 | 
 | ||||||
| use proc_macro::TokenStream; | use proc_macro::TokenStream; | ||||||
| 
 | 
 | ||||||
| @ -24,16 +25,22 @@ pub fn derive_uniform(input: TokenStream) -> TokenStream { | |||||||
|     uniforms::derive_uniform(input) |     uniforms::derive_uniform(input) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[proc_macro_derive(EntityArchetype, attributes(tag, module))] |  | ||||||
| pub fn derive_entity_archetype(input: TokenStream) -> TokenStream { |  | ||||||
|     entity_archetype::derive_entity_archetype(input) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[proc_macro_derive(Uniforms, attributes(uniform, module))] | #[proc_macro_derive(Uniforms, attributes(uniform, module))] | ||||||
| pub fn derive_uniforms(input: TokenStream) -> TokenStream { | pub fn derive_uniforms(input: TokenStream) -> TokenStream { | ||||||
|     uniforms::derive_uniforms(input) |     uniforms::derive_uniforms(input) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[proc_macro_derive(AsVertexBufferDescriptor, attributes(vertex, module))] | ||||||
|  | pub fn derive_as_vertex_buffer_descriptor(input: TokenStream) -> TokenStream { | ||||||
|  |     as_vertex_buffer_descriptor::derive_as_vertex_buffer_descriptor(input) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[proc_macro_derive(EntityArchetype, attributes(tag, module))] | ||||||
|  | pub fn derive_entity_archetype(input: TokenStream) -> TokenStream { | ||||||
|  |     entity_archetype::derive_entity_archetype(input) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| #[proc_macro_derive(DynamicAppPlugin)] | #[proc_macro_derive(DynamicAppPlugin)] | ||||||
| pub fn derive_app_plugin(input: TokenStream) -> TokenStream { | pub fn derive_app_plugin(input: TokenStream) -> TokenStream { | ||||||
|     app_plugin::derive_dynamic_app_plugin(input) |     app_plugin::derive_dynamic_app_plugin(input) | ||||||
|  | |||||||
| @ -12,10 +12,6 @@ struct UniformAttributeArgs { | |||||||
|     #[darling(default)] |     #[darling(default)] | ||||||
|     pub shader_def: Option<bool>, |     pub shader_def: Option<bool>, | ||||||
|     #[darling(default)] |     #[darling(default)] | ||||||
|     pub instance: Option<bool>, |  | ||||||
|     #[darling(default)] |  | ||||||
|     pub vertex: Option<bool>, |  | ||||||
|     #[darling(default)] |  | ||||||
|     pub buffer: Option<bool>, |     pub buffer: Option<bool>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -23,8 +19,6 @@ struct UniformAttributeArgs { | |||||||
| struct UniformAttributes { | struct UniformAttributes { | ||||||
|     pub ignore: bool, |     pub ignore: bool, | ||||||
|     pub shader_def: bool, |     pub shader_def: bool, | ||||||
|     pub instance: bool, |  | ||||||
|     pub vertex: bool, |  | ||||||
|     pub buffer: bool, |     pub buffer: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -33,8 +27,6 @@ impl From<UniformAttributeArgs> for UniformAttributes { | |||||||
|         UniformAttributes { |         UniformAttributes { | ||||||
|             ignore: args.ignore.unwrap_or(false), |             ignore: args.ignore.unwrap_or(false), | ||||||
|             shader_def: args.shader_def.unwrap_or(false), |             shader_def: args.shader_def.unwrap_or(false), | ||||||
|             instance: args.instance.unwrap_or(false), |  | ||||||
|             vertex: args.vertex.unwrap_or(false), |  | ||||||
|             buffer: args.buffer.unwrap_or(false), |             buffer: args.buffer.unwrap_or(false), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -89,9 +81,6 @@ pub fn derive_uniforms(input: TokenStream) -> TokenStream { | |||||||
|     let mut field_infos = Vec::new(); |     let mut field_infos = Vec::new(); | ||||||
|     let mut get_field_bind_types = Vec::new(); |     let mut get_field_bind_types = Vec::new(); | ||||||
| 
 | 
 | ||||||
|     let mut vertex_buffer_field_names_pascal = Vec::new(); |  | ||||||
|     let mut vertex_buffer_field_types = Vec::new(); |  | ||||||
| 
 |  | ||||||
|     let mut shader_def_field_names = Vec::new(); |     let mut shader_def_field_names = Vec::new(); | ||||||
|     let mut shader_def_field_names_screaming_snake = Vec::new(); |     let mut shader_def_field_names_screaming_snake = Vec::new(); | ||||||
| 
 | 
 | ||||||
| @ -109,13 +98,11 @@ pub fn derive_uniforms(input: TokenStream) -> TokenStream { | |||||||
|             texture_and_sampler_name_strings.push(sampler.clone()); |             texture_and_sampler_name_strings.push(sampler.clone()); | ||||||
|             texture_and_sampler_name_idents.push(f.ident.clone()); |             texture_and_sampler_name_idents.push(f.ident.clone()); | ||||||
|             texture_and_sampler_name_idents.push(f.ident.clone()); |             texture_and_sampler_name_idents.push(f.ident.clone()); | ||||||
|             let is_instanceable = attrs.instance; |  | ||||||
|             field_infos.push(quote!(#bevy_render_path::shader::FieldInfo { |             field_infos.push(quote!(#bevy_render_path::shader::FieldInfo { | ||||||
|                 name: #field_name, |                 name: #field_name, | ||||||
|                 uniform_name: #uniform, |                 uniform_name: #uniform, | ||||||
|                 texture_name: #texture, |                 texture_name: #texture, | ||||||
|                 sampler_name: #sampler, |                 sampler_name: #sampler, | ||||||
|                 is_instanceable: #is_instanceable, |  | ||||||
|             })); |             })); | ||||||
| 
 | 
 | ||||||
|             if attrs.buffer { |             if attrs.buffer { | ||||||
| @ -137,67 +124,17 @@ pub fn derive_uniforms(input: TokenStream) -> TokenStream { | |||||||
|             shader_def_field_names.push(&f.ident); |             shader_def_field_names.push(&f.ident); | ||||||
|             shader_def_field_names_screaming_snake.push(field_name.to_screaming_snake_case()) |             shader_def_field_names_screaming_snake.push(field_name.to_screaming_snake_case()) | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         if attrs.instance || attrs.vertex { |  | ||||||
|             vertex_buffer_field_types.push(&f.ty); |  | ||||||
|             let pascal_field = f.ident.as_ref().unwrap().to_string().to_pascal_case(); |  | ||||||
|             vertex_buffer_field_names_pascal.push(if attrs.instance { |  | ||||||
|                 format!("I_{}_{}", struct_name, pascal_field) |  | ||||||
|             } else { |  | ||||||
|                 format!("{}_{}", struct_name, pascal_field) |  | ||||||
|             }); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let struct_name_string = struct_name.to_string(); |     let struct_name_string = struct_name.to_string(); | ||||||
|     let struct_name_uppercase = struct_name_string.to_uppercase(); |     let struct_name_uppercase = struct_name_string.to_uppercase(); | ||||||
|     let field_infos_ident = format_ident!("{}_FIELD_INFO", struct_name_uppercase); |     let field_infos_ident = format_ident!("{}_FIELD_INFO", struct_name_uppercase); | ||||||
|     let vertex_buffer_descriptor_ident = |  | ||||||
|         format_ident!("{}_VERTEX_BUFFER_DESCRIPTOR", struct_name_uppercase); |  | ||||||
| 
 | 
 | ||||||
|     TokenStream::from(quote! { |     TokenStream::from(quote! { | ||||||
|         static #field_infos_ident: &[#bevy_render_path::shader::FieldInfo] = &[ |         static #field_infos_ident: &[#bevy_render_path::shader::FieldInfo] = &[ | ||||||
|             #(#field_infos,)* |             #(#field_infos,)* | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         static #vertex_buffer_descriptor_ident: #bevy_render_path::once_cell::sync::Lazy<#bevy_render_path::pipeline::VertexBufferDescriptor> = |  | ||||||
|             #bevy_render_path::once_cell::sync::Lazy::new(|| { |  | ||||||
|                 use #bevy_render_path::pipeline::{VertexFormat, AsVertexFormats, VertexAttributeDescriptor}; |  | ||||||
| 
 |  | ||||||
|                 let mut vertex_formats: Vec<(&str,&[VertexFormat])>  = vec![ |  | ||||||
|                     #((#vertex_buffer_field_names_pascal, <#vertex_buffer_field_types>::as_vertex_formats()),)* |  | ||||||
|                 ]; |  | ||||||
| 
 |  | ||||||
|                 let mut shader_location = 0; |  | ||||||
|                 let mut offset = 0; |  | ||||||
|                 let vertex_attribute_descriptors = vertex_formats.drain(..).map(|(name, formats)| { |  | ||||||
|                     formats.iter().enumerate().map(|(i, format)| { |  | ||||||
|                         let size = format.get_size(); |  | ||||||
|                         let formatted_name = if formats.len() > 1 { |  | ||||||
|                             format!("{}_{}", name, i) |  | ||||||
|                         } else { |  | ||||||
|                             format!("{}", name) |  | ||||||
|                         }; |  | ||||||
|                         let descriptor = VertexAttributeDescriptor { |  | ||||||
|                             name: formatted_name.into(), |  | ||||||
|                             offset, |  | ||||||
|                             format: *format, |  | ||||||
|                             shader_location, |  | ||||||
|                         }; |  | ||||||
|                         offset += size; |  | ||||||
|                         shader_location += 1; |  | ||||||
|                         descriptor |  | ||||||
|                     }).collect::<Vec<VertexAttributeDescriptor>>() |  | ||||||
|                 }).flatten().collect::<Vec<VertexAttributeDescriptor>>(); |  | ||||||
| 
 |  | ||||||
|                 #bevy_render_path::pipeline::VertexBufferDescriptor { |  | ||||||
|                     attributes: vertex_attribute_descriptors, |  | ||||||
|                     name: #struct_name_string.into(), |  | ||||||
|                     step_mode: #bevy_render_path::pipeline::InputStepMode::Instance, |  | ||||||
|                     stride: offset, |  | ||||||
|                 } |  | ||||||
|             }); |  | ||||||
| 
 |  | ||||||
|         impl #bevy_render_path::shader::Uniforms for #struct_name { |         impl #bevy_render_path::shader::Uniforms for #struct_name { | ||||||
|             fn get_field_infos() -> &'static [#bevy_render_path::shader::FieldInfo] { |             fn get_field_infos() -> &'static [#bevy_render_path::shader::FieldInfo] { | ||||||
|                 #field_infos_ident |                 #field_infos_ident | ||||||
| @ -248,14 +185,6 @@ pub fn derive_uniforms(input: TokenStream) -> TokenStream { | |||||||
|                     .map(|(f, shader_def)| format!("{}_{}{}", #struct_name_uppercase, f, shader_def.unwrap())) |                     .map(|(f, shader_def)| format!("{}_{}{}", #struct_name_uppercase, f, shader_def.unwrap())) | ||||||
|                     .collect::<Vec<String>>()) |                     .collect::<Vec<String>>()) | ||||||
|             } |             } | ||||||
| 
 |  | ||||||
|             fn get_vertex_buffer_descriptor() -> Option<&'static #bevy_render_path::pipeline::VertexBufferDescriptor> { |  | ||||||
|                 if #vertex_buffer_descriptor_ident.attributes.len() == 0 { |  | ||||||
|                     None |  | ||||||
|                 } else { |  | ||||||
|                     Some(&#vertex_buffer_descriptor_ident) |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|     }) |     }) | ||||||
| } | } | ||||||
| @ -283,7 +212,6 @@ pub fn derive_uniform(input: TokenStream) -> TokenStream { | |||||||
|                        uniform_name: #struct_name_string, |                        uniform_name: #struct_name_string, | ||||||
|                        texture_name: #struct_name_string, |                        texture_name: #struct_name_string, | ||||||
|                        sampler_name: #struct_name_string, |                        sampler_name: #struct_name_string, | ||||||
|                        is_instanceable: false, |  | ||||||
|                    } |                    } | ||||||
|                 ]; |                 ]; | ||||||
|                 &FIELD_INFOS |                 &FIELD_INFOS | ||||||
| @ -322,10 +250,6 @@ pub fn derive_uniform(input: TokenStream) -> TokenStream { | |||||||
|             fn get_shader_defs(&self) -> Option<Vec<String>> { |             fn get_shader_defs(&self) -> Option<Vec<String>> { | ||||||
|                 None |                 None | ||||||
|             } |             } | ||||||
| 
 |  | ||||||
|             fn get_vertex_buffer_descriptor() -> Option<&'static #bevy_render_path::pipeline::VertexBufferDescriptor> { |  | ||||||
|                 None |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|     }) |     }) | ||||||
| } | } | ||||||
|  | |||||||
| @ -25,7 +25,6 @@ mod renderable; | |||||||
| pub mod texture; | pub mod texture; | ||||||
| 
 | 
 | ||||||
| pub use once_cell; | pub use once_cell; | ||||||
| pub use bevy_derive::{Uniform, Uniforms}; |  | ||||||
| 
 | 
 | ||||||
| use self::{ | use self::{ | ||||||
|     mesh::Mesh, |     mesh::Mesh, | ||||||
|  | |||||||
| @ -2,10 +2,10 @@ use crate::{ | |||||||
|     pipeline::{ |     pipeline::{ | ||||||
|         state_descriptors::{IndexFormat, PrimitiveTopology}, |         state_descriptors::{IndexFormat, PrimitiveTopology}, | ||||||
|         VertexBufferDescriptor, VertexBufferDescriptors, VertexFormat, |         VertexBufferDescriptor, VertexBufferDescriptors, VertexFormat, | ||||||
|  |         AsVertexBufferDescriptor, | ||||||
|     }, |     }, | ||||||
|     render_resource::{BufferInfo, BufferUsage}, |     render_resource::{BufferInfo, BufferUsage}, | ||||||
|     renderer::{RenderResourceContext, RenderResources}, |     renderer::{RenderResourceContext, RenderResources}, | ||||||
|     shader::Uniforms, |  | ||||||
|     Renderable, Vertex, |     Renderable, Vertex, | ||||||
| }; | }; | ||||||
| use bevy_app::{EventReader, Events}; | use bevy_app::{EventReader, Events}; | ||||||
| @ -339,7 +339,7 @@ pub fn mesh_resource_provider_system(resources: &mut Resources) -> Box<dyn Sched | |||||||
|     let mut vertex_buffer_descriptors = resources.get_mut::<VertexBufferDescriptors>().unwrap(); |     let mut vertex_buffer_descriptors = resources.get_mut::<VertexBufferDescriptors>().unwrap(); | ||||||
|     let mut mesh_event_reader = EventReader::<AssetEvent<Mesh>>::default(); |     let mut mesh_event_reader = EventReader::<AssetEvent<Mesh>>::default(); | ||||||
|     // TODO: allow pipelines to specialize on vertex_buffer_descriptor and index_format
 |     // TODO: allow pipelines to specialize on vertex_buffer_descriptor and index_format
 | ||||||
|     let vertex_buffer_descriptor = Vertex::get_vertex_buffer_descriptor().unwrap(); |     let vertex_buffer_descriptor = Vertex::as_vertex_buffer_descriptor(); | ||||||
|     vertex_buffer_descriptors.set(vertex_buffer_descriptor.clone()); |     vertex_buffer_descriptors.set(vertex_buffer_descriptor.clone()); | ||||||
|     (move |world: &mut SubWorld, |     (move |world: &mut SubWorld, | ||||||
|            render_resources: Res<RenderResources>, |            render_resources: Res<RenderResources>, | ||||||
| @ -479,7 +479,7 @@ mod tests { | |||||||
|             }, |             }, | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         let descriptor = Vertex::get_vertex_buffer_descriptor().unwrap(); |         let descriptor = Vertex::as_vertex_buffer_descriptor(); | ||||||
|         assert_eq!( |         assert_eq!( | ||||||
|             mesh.get_vertex_buffer_bytes(descriptor).unwrap(), |             mesh.get_vertex_buffer_bytes(descriptor).unwrap(), | ||||||
|             expected_vertices.as_bytes(), |             expected_vertices.as_bytes(), | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| use super::VertexFormat; | use super::VertexFormat; | ||||||
| use std::{borrow::Cow, collections::HashMap}; | use std::{borrow::Cow, collections::HashMap}; | ||||||
| 
 | 
 | ||||||
|  | pub use bevy_derive::AsVertexBufferDescriptor; | ||||||
|  | 
 | ||||||
| #[derive(Clone, Debug, Eq, PartialEq)] | #[derive(Clone, Debug, Eq, PartialEq)] | ||||||
| pub struct VertexBufferDescriptor { | pub struct VertexBufferDescriptor { | ||||||
|     pub name: Cow<'static, str>, |     pub name: Cow<'static, str>, | ||||||
| @ -60,3 +62,7 @@ impl VertexBufferDescriptors { | |||||||
|         self.descriptors.get(name) |         self.descriptors.get(name) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | pub trait AsVertexBufferDescriptor { | ||||||
|  |     fn as_vertex_buffer_descriptor() -> &'static VertexBufferDescriptor; | ||||||
|  | } | ||||||
| @ -1,5 +1,4 @@ | |||||||
| use crate::{ | use crate::{ | ||||||
|     pipeline::VertexBufferDescriptors, |  | ||||||
|     render_graph::{CommandQueue, Node, ResourceSlots, SystemNode}, |     render_graph::{CommandQueue, Node, ResourceSlots, SystemNode}, | ||||||
|     render_resource::{ |     render_resource::{ | ||||||
|         BufferInfo, BufferUsage, EntitiesWaitingForAssets, RenderResourceId, |         BufferInfo, BufferUsage, EntitiesWaitingForAssets, RenderResourceId, | ||||||
| @ -671,19 +670,6 @@ where | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[allow(dead_code)] |  | ||||||
| fn initialize_vertex_buffer_descriptor<T>(vertex_buffer_descriptors: &mut VertexBufferDescriptors) |  | ||||||
| where |  | ||||||
|     T: Uniforms, |  | ||||||
| { |  | ||||||
|     let vertex_buffer_descriptor = T::get_vertex_buffer_descriptor(); |  | ||||||
|     if let Some(vertex_buffer_descriptor) = vertex_buffer_descriptor { |  | ||||||
|         if let None = vertex_buffer_descriptors.get(&vertex_buffer_descriptor.name) { |  | ||||||
|             vertex_buffer_descriptors.set(vertex_buffer_descriptor.clone()); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn setup_uniform_texture_resources<T>( | fn setup_uniform_texture_resources<T>( | ||||||
|     entity: Entity, |     entity: Entity, | ||||||
|     uniforms: &T, |     uniforms: &T, | ||||||
|  | |||||||
| @ -1,14 +1,11 @@ | |||||||
| use crate::{ | use crate::{color::ColorSource, pipeline::BindType, texture::Texture, Renderable}; | ||||||
|     color::ColorSource, |  | ||||||
|     pipeline::{BindType, VertexBufferDescriptor}, |  | ||||||
|     texture::Texture, |  | ||||||
|     Renderable, |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| use bevy_asset::{Assets, Handle}; | use bevy_asset::{Assets, Handle}; | ||||||
| use bevy_core::bytes::Bytes; | use bevy_core::bytes::Bytes; | ||||||
| use legion::prelude::*; | use legion::prelude::*; | ||||||
| 
 | 
 | ||||||
|  | pub use bevy_derive::{Uniform, Uniforms}; | ||||||
|  | 
 | ||||||
| pub trait Uniforms: Send + Sync + 'static { | pub trait Uniforms: Send + Sync + 'static { | ||||||
|     fn get_field_infos() -> &'static [FieldInfo]; |     fn get_field_infos() -> &'static [FieldInfo]; | ||||||
|     fn write_uniform_bytes(&self, name: &str, buffer: &mut [u8]); |     fn write_uniform_bytes(&self, name: &str, buffer: &mut [u8]); | ||||||
| @ -16,7 +13,6 @@ pub trait Uniforms: Send + Sync + 'static { | |||||||
|     fn get_uniform_texture(&self, name: &str) -> Option<Handle<Texture>>; |     fn get_uniform_texture(&self, name: &str) -> Option<Handle<Texture>>; | ||||||
|     fn get_shader_defs(&self) -> Option<Vec<String>>; |     fn get_shader_defs(&self) -> Option<Vec<String>>; | ||||||
|     fn get_field_bind_type(&self, name: &str) -> Option<FieldBindType>; |     fn get_field_bind_type(&self, name: &str) -> Option<FieldBindType>; | ||||||
|     fn get_vertex_buffer_descriptor() -> Option<&'static VertexBufferDescriptor>; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn shader_def_system<T>(uniforms: Com<T>, mut renderable: ComMut<Renderable>) | pub fn shader_def_system<T>(uniforms: Com<T>, mut renderable: ComMut<Renderable>) | ||||||
| @ -70,7 +66,6 @@ impl ShaderDefSuffixProvider for bool { | |||||||
| 
 | 
 | ||||||
| #[derive(Clone, Debug, Eq, PartialEq)] | #[derive(Clone, Debug, Eq, PartialEq)] | ||||||
| pub enum FieldBindType { | pub enum FieldBindType { | ||||||
|     // TODO: maybe change this to Buffer
 |  | ||||||
|     Uniform { size: usize }, |     Uniform { size: usize }, | ||||||
|     Buffer { size: usize }, |     Buffer { size: usize }, | ||||||
|     Texture, |     Texture, | ||||||
| @ -81,7 +76,6 @@ pub struct FieldInfo { | |||||||
|     pub uniform_name: &'static str, |     pub uniform_name: &'static str, | ||||||
|     pub texture_name: &'static str, |     pub texture_name: &'static str, | ||||||
|     pub sampler_name: &'static str, |     pub sampler_name: &'static str, | ||||||
|     pub is_instanceable: bool, |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub trait GetFieldBindType { | pub trait GetFieldBindType { | ||||||
|  | |||||||
| @ -1,53 +1,17 @@ | |||||||
| use crate::{ | use crate::{ | ||||||
|     pipeline::{InputStepMode, VertexAttributeDescriptor, VertexBufferDescriptor, VertexFormat}, |     shader::{FieldBindType, FieldInfo, GetFieldBindType, Uniforms}, | ||||||
|     shader::{Uniforms, FieldBindType, FieldInfo, GetFieldBindType}, |  | ||||||
|     texture::Texture, |     texture::Texture, | ||||||
| }; | }; | ||||||
| use bevy_asset::Handle; | use bevy_asset::Handle; | ||||||
| use bevy_core::bytes::Bytes; | use bevy_core::bytes::Bytes; | ||||||
| use once_cell::sync::Lazy; |  | ||||||
| 
 | 
 | ||||||
| static LOCAL_TO_WORLD_FIELD_INFOS: &[FieldInfo] = &[FieldInfo { | static LOCAL_TO_WORLD_FIELD_INFOS: &[FieldInfo] = &[FieldInfo { | ||||||
|     name: "object", |     name: "object", | ||||||
|     uniform_name: "Object", |     uniform_name: "Object", | ||||||
|     texture_name: "", |     texture_name: "", | ||||||
|     sampler_name: "", |     sampler_name: "", | ||||||
|     is_instanceable: true, |  | ||||||
| }]; | }]; | ||||||
| 
 | 
 | ||||||
| static VERTEX_BUFFER_DESCRIPTOR: Lazy<VertexBufferDescriptor> = |  | ||||||
|     Lazy::new(|| VertexBufferDescriptor { |  | ||||||
|         attributes: vec![ |  | ||||||
|             VertexAttributeDescriptor { |  | ||||||
|                 name: "I_Object_Model_0".into(), |  | ||||||
|                 format: VertexFormat::Float4, |  | ||||||
|                 offset: 0, |  | ||||||
|                 shader_location: 0, |  | ||||||
|             }, |  | ||||||
|             VertexAttributeDescriptor { |  | ||||||
|                 name: "I_Object_Model_1".into(), |  | ||||||
|                 format: VertexFormat::Float4, |  | ||||||
|                 offset: 16, |  | ||||||
|                 shader_location: 1, |  | ||||||
|             }, |  | ||||||
|             VertexAttributeDescriptor { |  | ||||||
|                 name: "I_Object_Model_2".into(), |  | ||||||
|                 format: VertexFormat::Float4, |  | ||||||
|                 offset: 32, |  | ||||||
|                 shader_location: 2, |  | ||||||
|             }, |  | ||||||
|             VertexAttributeDescriptor { |  | ||||||
|                 name: "I_Object_Model_3".into(), |  | ||||||
|                 format: VertexFormat::Float4, |  | ||||||
|                 offset: 48, |  | ||||||
|                 shader_location: 3, |  | ||||||
|             }, |  | ||||||
|         ], |  | ||||||
|         name: "Object".into(), |  | ||||||
|         step_mode: InputStepMode::Instance, |  | ||||||
|         stride: 64, |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
| impl Uniforms for bevy_transform::prelude::LocalToWorld { | impl Uniforms for bevy_transform::prelude::LocalToWorld { | ||||||
|     fn get_field_infos() -> &'static [FieldInfo] { |     fn get_field_infos() -> &'static [FieldInfo] { | ||||||
|         LOCAL_TO_WORLD_FIELD_INFOS |         LOCAL_TO_WORLD_FIELD_INFOS | ||||||
| @ -66,9 +30,6 @@ impl Uniforms for bevy_transform::prelude::LocalToWorld { | |||||||
|         None |         None | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn get_vertex_buffer_descriptor() -> Option<&'static VertexBufferDescriptor> { |  | ||||||
|         Some(&VERTEX_BUFFER_DESCRIPTOR) |  | ||||||
|     } |  | ||||||
|     fn write_uniform_bytes(&self, name: &str, buffer: &mut [u8]) { |     fn write_uniform_bytes(&self, name: &str, buffer: &mut [u8]) { | ||||||
|         match name { |         match name { | ||||||
|             "Object" => self.value.write_bytes(buffer), |             "Object" => self.value.write_bytes(buffer), | ||||||
|  | |||||||
| @ -1,15 +1,12 @@ | |||||||
| use bevy_core::bytes::Byteable; | use bevy_core::bytes::Byteable; | ||||||
| use bevy_derive::Uniforms; | use crate::pipeline::AsVertexBufferDescriptor; | ||||||
| 
 | 
 | ||||||
| #[repr(C)] | #[repr(C)] | ||||||
| #[derive(Clone, Copy, Uniforms)] | #[derive(Clone, Copy, AsVertexBufferDescriptor)] | ||||||
| #[module(bevy_render = "crate")] | #[module(bevy_render = "crate")] | ||||||
| pub struct Vertex { | pub struct Vertex { | ||||||
|     #[uniform(vertex)] |  | ||||||
|     pub position: [f32; 3], |     pub position: [f32; 3], | ||||||
|     #[uniform(vertex)] |  | ||||||
|     pub normal: [f32; 3], |     pub normal: [f32; 3], | ||||||
|     #[uniform(vertex)] |  | ||||||
|     pub uv: [f32; 2], |     pub uv: [f32; 2], | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -28,7 +28,6 @@ pub use crate::{ | |||||||
|         shader::{Shader, ShaderDefSuffixProvider, ShaderStage, ShaderStages}, |         shader::{Shader, ShaderDefSuffixProvider, ShaderStage, ShaderStages}, | ||||||
|         texture::Texture, |         texture::Texture, | ||||||
|         Camera, Color, ColorSource, OrthographicProjection, PerspectiveProjection, Renderable, |         Camera, Color, ColorSource, OrthographicProjection, PerspectiveProjection, Renderable, | ||||||
|         Uniforms, Uniform, |  | ||||||
|     }, |     }, | ||||||
|     scene::{Scene, SceneSpawner}, |     scene::{Scene, SceneSpawner}, | ||||||
|     sprite::{ |     sprite::{ | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user