diff --git a/bevy_asset/src/lib.rs b/bevy_asset/src/lib.rs index 775c610068..894a748f50 100644 --- a/bevy_asset/src/lib.rs +++ b/bevy_asset/src/lib.rs @@ -11,6 +11,7 @@ use std::{any::TypeId, collections::HashMap, marker::PhantomData}; // TODO: move these types to their own files pub type HandleId = usize; +pub const DEFAULT_HANDLE_ID: HandleId = 0; pub struct Handle { pub id: HandleId, @@ -58,11 +59,10 @@ impl Debug for Handle { } } -// TODO: somehow handle this gracefully in asset managers. or alternatively remove Default impl Default for Handle { fn default() -> Self { Handle { - id: std::usize::MAX, + id: DEFAULT_HANDLE_ID, marker: PhantomData, } } @@ -121,7 +121,7 @@ impl AssetStorage { AssetStorage { assets: HashMap::new(), names: HashMap::new(), - current_index: 0, + current_index: 1, } } @@ -139,6 +139,11 @@ impl AssetStorage { } } + pub fn add_default(&mut self, asset: T) -> Handle { + self.assets.insert(DEFAULT_HANDLE_ID, asset); + Handle::default() + } + pub fn set_name(&mut self, name: &str, handle: Handle) { self.names.insert(name.to_string(), handle); } diff --git a/bevy_render/src/pipeline/pipelines/forward/mod.rs b/bevy_render/src/pipeline/pipelines/forward/mod.rs index 21e07f1a43..2290a36b45 100644 --- a/bevy_render/src/pipeline/pipelines/forward/mod.rs +++ b/bevy_render/src/pipeline/pipelines/forward/mod.rs @@ -15,7 +15,7 @@ pub trait ForwardPipelineBuilder { impl<'a, 'b, 'c> ForwardPipelineBuilder for RenderGraphBuilder<'a, 'b, 'c> { fn add_forward_pipeline(&mut self) -> &mut Self { - self.add_pipeline(resource_name::pipeline::FORWARD, |builder| { + self.add_default_pipeline(resource_name::pipeline::FORWARD, |builder| { builder .with_vertex_shader(Shader::from_glsl( ShaderStage::Vertex, diff --git a/bevy_render/src/render_graph/render_graph_builder.rs b/bevy_render/src/render_graph/render_graph_builder.rs index cc8b843f50..43f6381fdd 100644 --- a/bevy_render/src/render_graph/render_graph_builder.rs +++ b/bevy_render/src/render_graph/render_graph_builder.rs @@ -40,6 +40,20 @@ impl<'a, 'b, 'c> RenderGraphBuilder<'a, 'b, 'c> { self } + pub fn add_default_pipeline(&mut self, name: &str, build: impl Fn(&mut PipelineBuilder)) -> &mut Self { + if let Some(ref pass) = self.current_pass { + let mut builder = PipelineBuilder::new(name, &mut self.shaders); + build(&mut builder); + let pipeline = builder.finish(); + let pipeline_descriptor_handle = self.pipelines.add_default(pipeline); + self.pipelines.set_name(name, pipeline_descriptor_handle); + self.render_graph + .add_pipeline(&pass, pipeline_descriptor_handle); + } + + self + } + pub fn add_pipeline_to_pass( &mut self, pass: &str, @@ -59,6 +73,25 @@ impl<'a, 'b, 'c> RenderGraphBuilder<'a, 'b, 'c> { self } + pub fn add_default_pipeline_to_pass( + &mut self, + pass: &str, + name: &str, + build: impl Fn(&mut PipelineBuilder), + ) -> &mut Self { + { + let mut builder = PipelineBuilder::new(name, &mut self.shaders); + build(&mut builder); + let pipeline = builder.finish(); + let pipeline_descriptor_handle = self.pipelines.add_default(pipeline); + self.pipelines.set_name(name, pipeline_descriptor_handle); + self.render_graph + .add_pipeline(pass, pipeline_descriptor_handle); + } + + self + } + pub fn add_resource_provider(&mut self, resource_provider: T) -> &mut Self where T: ResourceProvider + Send + Sync + 'static, diff --git a/bevy_render/src/renderable.rs b/bevy_render/src/renderable.rs index eebecc21ad..33f8c6e52d 100644 --- a/bevy_render/src/renderable.rs +++ b/bevy_render/src/renderable.rs @@ -24,7 +24,7 @@ impl Default for Renderable { Renderable { is_visible: true, pipelines: vec![ - Handle::new(0), // TODO: this could be better + Handle::default(), ], render_resource_assignments: RenderResourceAssignments::default(), is_instanced: false,