add renderable to render related queries
This commit is contained in:
		
							parent
							
								
									d58c5e7f5c
								
							
						
					
					
						commit
						f24a274a2a
					
				| @ -1,7 +1,4 @@ | |||||||
| use bevy::{ | use bevy::{prelude::*, render::render_graph_2::StandardMaterial}; | ||||||
|     prelude::*, |  | ||||||
|     render::render_graph_2::{StandardMaterial}, |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| fn main() { | fn main() { | ||||||
|     AppBuilder::new().add_defaults().setup_world(setup).run(); |     AppBuilder::new().add_defaults().setup_world(setup).run(); | ||||||
|  | |||||||
| @ -1,7 +1,4 @@ | |||||||
| use bevy::{ | use bevy::{prelude::*, render::render_graph_2::StandardMaterial}; | ||||||
|     prelude::*, |  | ||||||
|     render::render_graph_2::{ShaderUniforms, StandardMaterial}, |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| fn main() { | fn main() { | ||||||
|     AppBuilder::new().add_defaults().setup_world(setup).run(); |     AppBuilder::new().add_defaults().setup_world(setup).run(); | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| use crate::{ | use crate::{ | ||||||
|     prelude::*, |     prelude::*, | ||||||
|     render::render_graph_2::{ShaderUniforms, StandardMaterial, Renderable}, |     render::render_graph_2::{Renderable, ShaderUniforms, StandardMaterial}, | ||||||
| }; | }; | ||||||
| use bevy_derive::EntityArchetype; | use bevy_derive::EntityArchetype; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -22,10 +22,16 @@ impl ForwardPipeline { | |||||||
| 
 | 
 | ||||||
| impl Pipeline for ForwardPipeline { | impl Pipeline for ForwardPipeline { | ||||||
|     fn initialize(&mut self, render_graph: &mut RenderGraphData, _: &mut World) { |     fn initialize(&mut self, render_graph: &mut RenderGraphData, _: &mut World) { | ||||||
|         let vs_bytes = |         let vs_bytes = shader::glsl_to_spirv( | ||||||
|             shader::glsl_to_spirv(include_str!("forward.vert"), shader::ShaderStage::Vertex, None); |             include_str!("forward.vert"), | ||||||
|         let fs_bytes = |             shader::ShaderStage::Vertex, | ||||||
|             shader::glsl_to_spirv(include_str!("forward.frag"), shader::ShaderStage::Fragment, None); |             None, | ||||||
|  |         ); | ||||||
|  |         let fs_bytes = shader::glsl_to_spirv( | ||||||
|  |             include_str!("forward.frag"), | ||||||
|  |             shader::ShaderStage::Fragment, | ||||||
|  |             None, | ||||||
|  |         ); | ||||||
| 
 | 
 | ||||||
|         let bind_group_layout = |         let bind_group_layout = | ||||||
|             render_graph |             render_graph | ||||||
|  | |||||||
| @ -102,10 +102,16 @@ impl Pipeline for ShadowPipeline { | |||||||
|         let vertex_buffer_descriptor = get_vertex_buffer_descriptor(); |         let vertex_buffer_descriptor = get_vertex_buffer_descriptor(); | ||||||
| 
 | 
 | ||||||
|         // Create the render pipeline
 |         // Create the render pipeline
 | ||||||
|         let vs_bytes = |         let vs_bytes = shader::glsl_to_spirv( | ||||||
|             shader::glsl_to_spirv(include_str!("shadow.vert"), shader::ShaderStage::Vertex, None); |             include_str!("shadow.vert"), | ||||||
|         let fs_bytes = |             shader::ShaderStage::Vertex, | ||||||
|             shader::glsl_to_spirv(include_str!("shadow.frag"), shader::ShaderStage::Fragment, None); |             None, | ||||||
|  |         ); | ||||||
|  |         let fs_bytes = shader::glsl_to_spirv( | ||||||
|  |             include_str!("shadow.frag"), | ||||||
|  |             shader::ShaderStage::Fragment, | ||||||
|  |             None, | ||||||
|  |         ); | ||||||
|         let vs_module = render_graph.device.create_shader_module(&vs_bytes); |         let vs_module = render_graph.device.create_shader_module(&vs_bytes); | ||||||
|         let fs_module = render_graph.device.create_shader_module(&fs_bytes); |         let fs_module = render_graph.device.create_shader_module(&fs_bytes); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -95,7 +95,8 @@ impl UiPipeline { | |||||||
| 
 | 
 | ||||||
| impl Pipeline for UiPipeline { | impl Pipeline for UiPipeline { | ||||||
|     fn initialize(&mut self, render_graph: &mut RenderGraphData, world: &mut World) { |     fn initialize(&mut self, render_graph: &mut RenderGraphData, world: &mut World) { | ||||||
|         let vs_bytes = shader::glsl_to_spirv(include_str!("ui.vert"), shader::ShaderStage::Vertex, None); |         let vs_bytes = | ||||||
|  |             shader::glsl_to_spirv(include_str!("ui.vert"), shader::ShaderStage::Vertex, None); | ||||||
|         let fs_bytes = |         let fs_bytes = | ||||||
|             shader::glsl_to_spirv(include_str!("ui.frag"), shader::ShaderStage::Fragment, None); |             shader::glsl_to_spirv(include_str!("ui.frag"), shader::ShaderStage::Fragment, None); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ use crate::{ | |||||||
|     asset::{AssetStorage, Handle, Mesh}, |     asset::{AssetStorage, Handle, Mesh}, | ||||||
|     legion::prelude::*, |     legion::prelude::*, | ||||||
|     render::{ |     render::{ | ||||||
|         render_graph_2::{resource_name, RenderPass, ShaderUniforms}, |         render_graph_2::{resource_name, RenderPass, Renderable, ShaderUniforms}, | ||||||
|         Instanced, |         Instanced, | ||||||
|     }, |     }, | ||||||
| }; | }; | ||||||
| @ -13,9 +13,13 @@ pub fn mesh_draw_target(world: &World, render_pass: &mut dyn RenderPass) { | |||||||
|     let mut mesh_storage = world.resources.get_mut::<AssetStorage<Mesh>>().unwrap(); |     let mut mesh_storage = world.resources.get_mut::<AssetStorage<Mesh>>().unwrap(); | ||||||
|     let mut current_mesh_id = None; |     let mut current_mesh_id = None; | ||||||
|     let mut current_mesh_index_length = 0; |     let mut current_mesh_index_length = 0; | ||||||
|     let mesh_query = |     let mesh_query = <(Read<ShaderUniforms>, Read<Handle<Mesh>>, Read<Renderable>)>::query() | ||||||
|         <(Read<ShaderUniforms>, Read<Handle<Mesh>>)>::query().filter(!component::<Instanced>()); |         .filter(!component::<Instanced>()); | ||||||
|     for (entity, (_shader_uniforms, mesh)) in mesh_query.iter_entities(world) { |     for (entity, (_shader_uniforms, mesh, renderable)) in mesh_query.iter_entities(world) { | ||||||
|  |         if !renderable.is_visible { | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         let mut should_load_mesh = current_mesh_id == None; |         let mut should_load_mesh = current_mesh_id == None; | ||||||
|         if let Some(current) = current_mesh_id { |         if let Some(current) = current_mesh_id { | ||||||
|             should_load_mesh = current != mesh.id; |             should_load_mesh = current != mesh.id; | ||||||
|  | |||||||
| @ -6,24 +6,24 @@ mod pipeline; | |||||||
| mod pipeline_layout; | mod pipeline_layout; | ||||||
| pub mod pipelines; | pub mod pipelines; | ||||||
| mod render_graph; | mod render_graph; | ||||||
|  | mod renderable; | ||||||
| mod renderer; | mod renderer; | ||||||
| pub mod renderers; | pub mod renderers; | ||||||
| mod resource; | mod resource; | ||||||
| pub mod resource_name; | pub mod resource_name; | ||||||
| pub mod resource_provider; | pub mod resource_provider; | ||||||
| pub mod resource_providers; | pub mod resource_providers; | ||||||
| mod uniforms; |  | ||||||
| mod uniform; | mod uniform; | ||||||
| mod renderable; | mod uniforms; | ||||||
| 
 | 
 | ||||||
| pub use draw_target::*; | pub use draw_target::*; | ||||||
| pub use pass::*; | pub use pass::*; | ||||||
| pub use pipeline::*; | pub use pipeline::*; | ||||||
| pub use pipeline_layout::*; | pub use pipeline_layout::*; | ||||||
| pub use render_graph::*; | pub use render_graph::*; | ||||||
|  | pub use renderable::*; | ||||||
| pub use renderer::*; | pub use renderer::*; | ||||||
| pub use resource::*; | pub use resource::*; | ||||||
| pub use resource_provider::*; | pub use resource_provider::*; | ||||||
| pub use uniforms::*; |  | ||||||
| pub use uniform::*; | pub use uniform::*; | ||||||
| pub use renderable::*; | pub use uniforms::*; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| use crate::{ | use crate::{ | ||||||
|     legion::prelude::World, |     legion::prelude::World, | ||||||
|     render::render_graph_2::{ |     render::render_graph_2::{ | ||||||
|         resource::DynamicUniformBufferInfo, AsUniforms, Renderer, ResourceProvider, |         resource::DynamicUniformBufferInfo, AsUniforms, Renderable, Renderer, ResourceProvider, | ||||||
|     }, |     }, | ||||||
| }; | }; | ||||||
| use legion::prelude::*; | use legion::prelude::*; | ||||||
| @ -13,7 +13,6 @@ where | |||||||
| { | { | ||||||
|     _marker: PhantomData<T>, |     _marker: PhantomData<T>, | ||||||
|     uniform_buffer_info_names: Vec<String>, |     uniform_buffer_info_names: Vec<String>, | ||||||
|     // dynamic_uniform_buffer_infos: HashMap<String, DynamicUniformBufferInfo>,
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<T> UniformResourceProvider<T> | impl<T> UniformResourceProvider<T> | ||||||
| @ -22,7 +21,6 @@ where | |||||||
| { | { | ||||||
|     pub fn new() -> Self { |     pub fn new() -> Self { | ||||||
|         UniformResourceProvider { |         UniformResourceProvider { | ||||||
|             // dynamic_uniform_buffer_infos: HashMap::new(),
 |  | ||||||
|             uniform_buffer_info_names: Vec::new(), |             uniform_buffer_info_names: Vec::new(), | ||||||
|             _marker: PhantomData, |             _marker: PhantomData, | ||||||
|         } |         } | ||||||
| @ -36,7 +34,7 @@ where | |||||||
|     fn initialize(&mut self, _renderer: &mut dyn Renderer, _world: &mut World) {} |     fn initialize(&mut self, _renderer: &mut dyn Renderer, _world: &mut World) {} | ||||||
| 
 | 
 | ||||||
|     fn update(&mut self, renderer: &mut dyn Renderer, world: &mut World) { |     fn update(&mut self, renderer: &mut dyn Renderer, world: &mut World) { | ||||||
|         let query = <Read<T>>::query(); |         let query = <(Read<T>, Read<Renderable>)>::query(); | ||||||
|         // retrieve all uniforms buffers that aren't aleady set. these are "dynamic" uniforms, which are set by the user in ShaderUniforms
 |         // retrieve all uniforms buffers that aren't aleady set. these are "dynamic" uniforms, which are set by the user in ShaderUniforms
 | ||||||
|         // TODO: this breaks down in multiple ways:
 |         // TODO: this breaks down in multiple ways:
 | ||||||
|         // (SOLVED 1) resource_info will be set after the first run so this won't update.
 |         // (SOLVED 1) resource_info will be set after the first run so this won't update.
 | ||||||
| @ -52,7 +50,7 @@ where | |||||||
| 
 | 
 | ||||||
|         let mut sizes = Vec::new(); |         let mut sizes = Vec::new(); | ||||||
|         let mut counts = Vec::new(); |         let mut counts = Vec::new(); | ||||||
|         for uniforms in query.iter(world) { |         for (uniforms, _renderable) in query.iter(world) { | ||||||
|             let uniform_layouts = uniforms.get_uniform_layouts(); |             let uniform_layouts = uniforms.get_uniform_layouts(); | ||||||
|             for (i, uniform_info) in uniforms.get_uniform_infos().iter().enumerate() { |             for (i, uniform_info) in uniforms.get_uniform_infos().iter().enumerate() { | ||||||
|                 // only add the first time a uniform info is processed
 |                 // only add the first time a uniform info is processed
 | ||||||
| @ -117,7 +115,7 @@ where | |||||||
|             let alignment = wgpu::BIND_BUFFER_ALIGNMENT as usize; |             let alignment = wgpu::BIND_BUFFER_ALIGNMENT as usize; | ||||||
|             let mut offset = 0usize; |             let mut offset = 0usize; | ||||||
|             let info = renderer.get_dynamic_uniform_buffer_info_mut(name).unwrap(); |             let info = renderer.get_dynamic_uniform_buffer_info_mut(name).unwrap(); | ||||||
|             for (i, (entity, _uniforms)) in query.iter_entities(world).enumerate() { |             for (i, (entity, _)) in query.iter_entities(world).enumerate() { | ||||||
|                 // TODO: check if index has changed. if it has, then entity should be updated
 |                 // TODO: check if index has changed. if it has, then entity should be updated
 | ||||||
|                 // TODO: only mem-map entities if their data has changed
 |                 // TODO: only mem-map entities if their data has changed
 | ||||||
|                 // PERF: These hashmap inserts are pretty expensive (10 fps for 10000 entities)
 |                 // PERF: These hashmap inserts are pretty expensive (10 fps for 10000 entities)
 | ||||||
| @ -135,7 +133,7 @@ where | |||||||
|                 &mut |mapped| { |                 &mut |mapped| { | ||||||
|                     let alignment = wgpu::BIND_BUFFER_ALIGNMENT as usize; |                     let alignment = wgpu::BIND_BUFFER_ALIGNMENT as usize; | ||||||
|                     let mut offset = 0usize; |                     let mut offset = 0usize; | ||||||
|                     for uniforms in query.iter(world) { |                     for (uniforms, _renderable) in query.iter(world) { | ||||||
|                         // TODO: check if index has changed. if it has, then entity should be updated
 |                         // TODO: check if index has changed. if it has, then entity should be updated
 | ||||||
|                         // TODO: only mem-map entities if their data has changed
 |                         // TODO: only mem-map entities if their data has changed
 | ||||||
|                         // TODO: try getting ref first
 |                         // TODO: try getting ref first
 | ||||||
|  | |||||||
| @ -44,7 +44,6 @@ pub trait AsUniforms { | |||||||
|     fn get_shader_defs(&self) -> Option<Vec<String>>; |     fn get_shader_defs(&self) -> Option<Vec<String>>; | ||||||
|     // TODO: support zero-copy uniforms
 |     // TODO: support zero-copy uniforms
 | ||||||
|     // fn get_uniform_bytes_ref(&self, name: &str) -> Option<&[u8]>;
 |     // fn get_uniform_bytes_ref(&self, name: &str) -> Option<&[u8]>;
 | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub trait ShaderDefSuffixProvider { | pub trait ShaderDefSuffixProvider { | ||||||
|  | |||||||
| @ -1,8 +1,6 @@ | |||||||
| use crate::{ | use crate::render::render_graph_2::{ | ||||||
|     render::render_graph_2::{ |  | ||||||
|     uniform::{AsUniforms, UniformInfo}, |     uniform::{AsUniforms, UniformInfo}, | ||||||
|     BindType, UniformPropertyType, |     BindType, UniformPropertyType, | ||||||
|     }, |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use zerocopy::AsBytes; | use zerocopy::AsBytes; | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| mod standard_material; |  | ||||||
| mod local_to_world; | mod local_to_world; | ||||||
|  | mod standard_material; | ||||||
| 
 | 
 | ||||||
| pub use standard_material::*; |  | ||||||
| pub use local_to_world::*; | pub use local_to_world::*; | ||||||
|  | pub use standard_material::*; | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ use crate::{ | |||||||
|     math::Vec4, |     math::Vec4, | ||||||
|     render::render_graph_2::{ |     render::render_graph_2::{ | ||||||
|         uniform::{AsUniforms, GetBytes, UniformInfo}, |         uniform::{AsUniforms, GetBytes, UniformInfo}, | ||||||
|         BindType, UniformPropertyType, ShaderDefSuffixProvider |         BindType, ShaderDefSuffixProvider, UniformPropertyType, | ||||||
|     }, |     }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -12,7 +12,7 @@ use bevy_derive::Uniforms; | |||||||
| #[derive(Uniforms)] | #[derive(Uniforms)] | ||||||
| pub struct StandardMaterial { | pub struct StandardMaterial { | ||||||
|     pub albedo: Vec4, |     pub albedo: Vec4, | ||||||
|     #[uniform(ignore,shader_def)] |     #[uniform(ignore, shader_def)] | ||||||
|     pub everything_is_red: bool, |     pub everything_is_red: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,7 +17,11 @@ impl Into<shaderc::ShaderKind> for ShaderStage { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn glsl_to_spirv(glsl_source: &str, stage: ShaderStage, shader_defs: Option<&Vec<String>>) -> Vec<u32> { | pub fn glsl_to_spirv( | ||||||
|  |     glsl_source: &str, | ||||||
|  |     stage: ShaderStage, | ||||||
|  |     shader_defs: Option<&Vec<String>>, | ||||||
|  | ) -> Vec<u32> { | ||||||
|     let shader_kind: shaderc::ShaderKind = stage.into(); |     let shader_kind: shaderc::ShaderKind = stage.into(); | ||||||
|     let mut compiler = shaderc::Compiler::new().unwrap(); |     let mut compiler = shaderc::Compiler::new().unwrap(); | ||||||
|     let mut options = shaderc::CompileOptions::new().unwrap(); |     let mut options = shaderc::CompileOptions::new().unwrap(); | ||||||
| @ -64,7 +68,9 @@ impl Shader { | |||||||
|     pub fn get_spirv(&self) -> Vec<u32> { |     pub fn get_spirv(&self) -> Vec<u32> { | ||||||
|         match self.source { |         match self.source { | ||||||
|             ShaderSource::Spirv(ref bytes) => bytes.clone(), |             ShaderSource::Spirv(ref bytes) => bytes.clone(), | ||||||
|             ShaderSource::Glsl(ref source) => glsl_to_spirv(&source, self.stage, self.macros.as_ref()), |             ShaderSource::Glsl(ref source) => { | ||||||
|  |                 glsl_to_spirv(&source, self.stage, self.macros.as_ref()) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Carter Anderson
						Carter Anderson