diff --git a/crates/bevy_core/src/transform/world_builder.rs b/crates/bevy_core/src/transform/world_builder.rs index 4a69ae9e50..f8b35c6efc 100644 --- a/crates/bevy_core/src/transform/world_builder.rs +++ b/crates/bevy_core/src/transform/world_builder.rs @@ -71,7 +71,7 @@ impl<'a> WorldBuilder<'a> { self } - pub fn add_children(&mut self, build_children: impl Fn(&mut Self)) -> &mut Self { + pub fn add_children(&mut self, build_children: impl Fn(&mut Self) -> &mut Self) -> &mut Self { self.parent_entity = self.current_entity; self.current_entity = None; diff --git a/crates/bevy_pbr/src/forward_pbr_render_graph.rs b/crates/bevy_pbr/src/forward_pbr_render_graph.rs index e554a2d89e..6720b34e87 100644 --- a/crates/bevy_pbr/src/forward_pbr_render_graph.rs +++ b/crates/bevy_pbr/src/forward_pbr_render_graph.rs @@ -27,15 +27,13 @@ impl ForwardPbrRenderGraphBuilder for RenderGraph { fn add_pbr_graph(&mut self, resources: &Resources) -> &mut Self { self.add_system_node_named( node::LOCAL_TO_WORLD, - UniformNode::::new(true), - resources, + UniformNode::::new(true) ); self.add_system_node_named( node::STANDARD_MATERIAL, - AssetUniformNode::::new(true), - resources, + AssetUniformNode::::new(true) ); - self.add_system_node_named(node::LIGHTS, LightsNode::new(10), resources); + self.add_system_node_named(node::LIGHTS, LightsNode::new(10)); let mut shaders = resources.get_mut::>().unwrap(); let mut pipelines = resources .get_mut::>() diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index eb13f7cf5e..16c5fbcb34 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -21,7 +21,7 @@ impl AppPlugin for PbrPlugin { fn build(&self, app: &mut AppBuilder) { app.add_asset::().add_system_to_stage( stage::POST_UPDATE, - shader::asset_handle_shader_def_system::.system(), + shader::asset_shader_def_system::.system(), ); let resources = app.resources(); let mut render_graph = resources.get_mut::().unwrap(); diff --git a/crates/bevy_pbr/src/nodes/lights_node.rs b/crates/bevy_pbr/src/nodes/lights_node.rs index 9b1d6594fd..f2ee81d140 100644 --- a/crates/bevy_pbr/src/nodes/lights_node.rs +++ b/crates/bevy_pbr/src/nodes/lights_node.rs @@ -46,7 +46,7 @@ pub struct LightCount { } impl SystemNode for LightsNode { - fn get_system(&self, _resources: &Resources) -> Box { + fn get_system(&self) -> Box { let mut light_buffer = None; let mut lights_are_dirty = true; // TODO: merge these diff --git a/crates/bevy_render/src/base_render_graph/mod.rs b/crates/bevy_render/src/base_render_graph/mod.rs index a9406ef467..827ef0c850 100644 --- a/crates/bevy_render/src/base_render_graph/mod.rs +++ b/crates/bevy_render/src/base_render_graph/mod.rs @@ -61,11 +61,11 @@ impl BaseRenderGraphBuilder for RenderGraph { config: &BaseRenderGraphConfig, ) -> &mut Self { if config.add_3d_camera { - self.add_system_node_named(node::CAMERA, CameraNode::default(), resources); + self.add_system_node_named(node::CAMERA, CameraNode::default()); } if config.add_2d_camera { - self.add_system_node_named(node::CAMERA2D, Camera2dNode::default(), resources); + self.add_system_node_named(node::CAMERA2D, Camera2dNode::default()); } if config.add_main_depth_texture { diff --git a/crates/bevy_render/src/render_graph/graph.rs b/crates/bevy_render/src/render_graph/graph.rs index 72032f20ad..eedd61170b 100644 --- a/crates/bevy_render/src/render_graph/graph.rs +++ b/crates/bevy_render/src/render_graph/graph.rs @@ -1,5 +1,5 @@ use super::{Edge, Node, NodeId, NodeLabel, NodeState, RenderGraphError, SlotLabel, SystemNode}; -use legion::prelude::{Executor, Resources, Schedulable}; +use legion::prelude::{Executor, Schedulable}; use std::{borrow::Cow, collections::HashMap, fmt::Debug}; #[derive(Default)] @@ -33,11 +33,11 @@ impl RenderGraph { id } - pub fn add_system_node(&mut self, node: T, resources: &mut Resources) -> NodeId + pub fn add_system_node(&mut self, node: T) -> NodeId where T: SystemNode + 'static, { - self.new_node_systems.push(node.get_system(resources)); + self.new_node_systems.push(node.get_system()); self.add_node(node) } @@ -45,12 +45,11 @@ impl RenderGraph { &mut self, name: impl Into>, node: T, - resources: &Resources, ) -> NodeId where T: SystemNode + 'static, { - self.new_node_systems.push(node.get_system(resources)); + self.new_node_systems.push(node.get_system()); self.add_node_named(name, node) } diff --git a/crates/bevy_render/src/render_graph/node.rs b/crates/bevy_render/src/render_graph/node.rs index f1fe7df48a..a404747d14 100644 --- a/crates/bevy_render/src/render_graph/node.rs +++ b/crates/bevy_render/src/render_graph/node.rs @@ -36,7 +36,7 @@ pub trait Node: Downcast + Send + Sync + 'static { impl_downcast!(Node); pub trait SystemNode: Node { - fn get_system(&self, resources: &Resources) -> Box; + fn get_system(&self) -> Box; } pub struct Edges { diff --git a/crates/bevy_render/src/render_graph/nodes/camera2d_node.rs b/crates/bevy_render/src/render_graph/nodes/camera2d_node.rs index c766becd6c..837aba49a8 100644 --- a/crates/bevy_render/src/render_graph/nodes/camera2d_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/camera2d_node.rs @@ -1,10 +1,12 @@ -use bevy_app::{Events, GetEventReader}; +use bevy_app::Events; use bevy_window::WindowResized; use crate::{ camera::{ActiveCamera2d, Camera}, render_graph::{CommandQueue, Node, ResourceSlots, SystemNode}, - render_resource::{resource_name, BufferInfo, BufferUsage, RenderResourceAssignments, RenderResourceAssignment}, + render_resource::{ + resource_name, BufferInfo, BufferUsage, RenderResourceAssignment, RenderResourceAssignments, + }, renderer::{RenderContext, RenderResources}, }; @@ -30,9 +32,9 @@ impl Node for Camera2dNode { } impl SystemNode for Camera2dNode { - fn get_system(&self, resources: &Resources) -> Box { + fn get_system(&self) -> Box { let mut camera_buffer = None; - let mut window_resized_event_reader = resources.get_event_reader::(); + let mut window_resized_event_reader = None; let mut command_queue = self.command_queue.clone(); SystemBuilder::new("camera_2d_resource_provider") @@ -69,7 +71,12 @@ impl SystemNode for Camera2dNode { camera_buffer = Some(buffer); } + if window_resized_event_reader.is_none() { + window_resized_event_reader = Some(window_resized_events.get_reader()); + } let primary_window_resized_event = window_resized_event_reader + .as_mut() + .unwrap() .find_latest(&window_resized_events, |event| event.is_primary); if let Some(_) = primary_window_resized_event { let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>(); diff --git a/crates/bevy_render/src/render_graph/nodes/camera_node.rs b/crates/bevy_render/src/render_graph/nodes/camera_node.rs index d0bed5ac1a..9e03e86367 100644 --- a/crates/bevy_render/src/render_graph/nodes/camera_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/camera_node.rs @@ -7,7 +7,7 @@ use crate::{ ActiveCamera, Camera, }; -use bevy_app::{Events, GetEventReader}; +use bevy_app::Events; use bevy_transform::prelude::*; use bevy_window::WindowResized; use legion::prelude::*; @@ -32,9 +32,9 @@ impl Node for CameraNode { } impl SystemNode for CameraNode { - fn get_system(&self, resources: &Resources) -> Box { + fn get_system(&self) -> Box { let mut camera_buffer = None; - let mut window_resized_event_reader = resources.get_event_reader::(); + let mut window_resized_event_reader = None; let mut command_queue = self.command_queue.clone(); SystemBuilder::new("camera_resource_provider") @@ -70,8 +70,12 @@ impl SystemNode for CameraNode { ); camera_buffer = Some(buffer); } - + if window_resized_event_reader.is_none() { + window_resized_event_reader = Some(window_resized_events.get_reader()); + } let primary_window_resized_event = window_resized_event_reader + .as_mut() + .unwrap() .find_latest(&window_resized_events, |event| event.is_primary); if let Some(_) = primary_window_resized_event { let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>(); diff --git a/crates/bevy_render/src/render_graph/nodes/uniform_node.rs b/crates/bevy_render/src/render_graph/nodes/uniform_node.rs index 81f2938783..dc8d42d6d7 100644 --- a/crates/bevy_render/src/render_graph/nodes/uniform_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/uniform_node.rs @@ -389,12 +389,10 @@ impl SystemNode for UniformNode where T: AsUniforms, { - fn get_system(&self, resources: &Resources) -> Box { + fn get_system(&self) -> Box { let mut command_queue = self.command_queue.clone(); let mut uniform_buffer_arrays = UniformBufferArrays::::new(); - let mut vertex_buffer_descriptors = resources.get_mut::().unwrap(); let dynamic_uniforms = self.dynamic_uniforms; - initialize_vertex_buffer_descriptor::(&mut vertex_buffer_descriptors); // TODO: maybe run "update" here SystemBuilder::new(format!( "uniform_resource_provider::<{}>", @@ -547,12 +545,10 @@ impl SystemNode for AssetUniformNode where T: AsUniforms, { - fn get_system(&self, resources: &Resources) -> Box { + fn get_system(&self) -> Box { let mut command_queue = self.command_queue.clone(); let mut uniform_buffer_arrays = UniformBufferArrays::::new(); - let mut vertex_buffer_descriptors = resources.get_mut::().unwrap(); let dynamic_uniforms = self.dynamic_uniforms; - initialize_vertex_buffer_descriptor::(&mut vertex_buffer_descriptors); // TODO: maybe run "update" here SystemBuilder::new("uniform_resource_provider") .read_resource::>() @@ -674,6 +670,7 @@ where } } +#[allow(dead_code)] fn initialize_vertex_buffer_descriptor(vertex_buffer_descriptors: &mut VertexBufferDescriptors) where T: AsUniforms, diff --git a/crates/bevy_render/src/shader/uniform.rs b/crates/bevy_render/src/shader/uniform.rs index a7221ceb39..3788db01fc 100644 --- a/crates/bevy_render/src/shader/uniform.rs +++ b/crates/bevy_render/src/shader/uniform.rs @@ -33,7 +33,7 @@ where } } -pub fn asset_handle_shader_def_system( +pub fn asset_shader_def_system( assets: Resource>, asset_handle: Ref>, mut renderable: RefMut, diff --git a/crates/bevy_ui/src/lib.rs b/crates/bevy_ui/src/lib.rs index e069fff132..532ae2efd2 100644 --- a/crates/bevy_ui/src/lib.rs +++ b/crates/bevy_ui/src/lib.rs @@ -22,7 +22,7 @@ use bevy_asset::{AddAsset, Assets, Handle}; use bevy_render::{ mesh::{shape::Quad, Mesh}, render_graph::RenderGraph, - shader::asset_handle_shader_def_system, + shader::asset_shader_def_system, }; use glam::Vec2; use legion::prelude::IntoSystem; @@ -38,7 +38,7 @@ impl AppPlugin for UiPlugin { app.add_asset::() .add_system_to_stage( stage::POST_UPDATE, - asset_handle_shader_def_system::.system(), + asset_shader_def_system::.system(), ) .add_system_to_stage(stage::POST_UPDATE, sprite_system()) .add_system_to_stage(stage::POST_UPDATE, ui_update_system()); diff --git a/crates/bevy_ui/src/render/mod.rs b/crates/bevy_ui/src/render/mod.rs index 91299dcf77..d450785000 100644 --- a/crates/bevy_ui/src/render/mod.rs +++ b/crates/bevy_ui/src/render/mod.rs @@ -70,11 +70,10 @@ impl UiRenderGraphBuilder for RenderGraph { self.add_system_node_named( "color_material", AssetUniformNode::::new(false), - resources, ); self.add_node_edge("color_material", base_render_graph::node::MAIN_PASS) .unwrap(); - self.add_system_node_named("rect", UniformNode::::new(false), resources); + self.add_system_node_named("rect", UniformNode::::new(false)); self.add_node_edge("rect", base_render_graph::node::MAIN_PASS) .unwrap(); let mut pipelines = resources diff --git a/examples/2d/sprite.rs b/examples/2d/sprite.rs index 7891fff09a..50c8dae1a9 100644 --- a/examples/2d/sprite.rs +++ b/examples/2d/sprite.rs @@ -3,18 +3,20 @@ use bevy::prelude::*; fn main() { App::build() .add_default_plugins() - .add_startup_system(setup) + .add_startup_system(setup.system()) .run(); } -fn setup(world: &mut World, resources: &mut Resources) { - let mut textures = resources.get_mut::>().unwrap(); +fn setup( + command_buffer: &mut CommandBuffer, + mut textures: ResourceMut>, + mut materials: ResourceMut>, +) { let texture_path = concat!(env!("CARGO_MANIFEST_DIR"), "/assets/branding/icon.png"); let texture = Texture::load(TextureType::Png(texture_path.to_string())); let texture_handle = textures.add(texture); - let mut color_materials = resources.get_mut::>().unwrap(); - world + command_buffer .build() .add_entity(Camera2dEntity::default()) .add_entity(SpriteEntity { @@ -23,7 +25,7 @@ fn setup(world: &mut World, resources: &mut Resources) { z_index: 0.5, ..Default::default() }, - material: color_materials.add(texture_handle.into()), + material: materials.add(texture_handle.into()), ..Default::default() }); } diff --git a/examples/3d/load_model.rs b/examples/3d/load_model.rs index 98c2b62f82..8a273e5882 100644 --- a/examples/3d/load_model.rs +++ b/examples/3d/load_model.rs @@ -3,28 +3,28 @@ use bevy::{gltf, prelude::*}; fn main() { App::build() .add_default_plugins() - .add_startup_system(setup) + .add_startup_system(setup.system()) .run(); } -fn setup(world: &mut World, resources: &mut Resources) { +fn setup( + command_buffer: &mut CommandBuffer, + mut meshes: ResourceMut>, + mut materials: ResourceMut>, +) { // load the mesh let model_path = concat!(env!("CARGO_MANIFEST_DIR"), "/assets/models/Monkey.gltf"); let mesh = gltf::load_gltf(&model_path).unwrap().unwrap(); - let mut meshes = resources.get_mut::>().unwrap(); let mesh_handle = meshes.add(mesh); // create a material for the mesh - let mut materials = resources - .get_mut::>() - .unwrap(); let material_handle = materials.add(StandardMaterial { albedo: Color::rgb(0.5, 0.4, 0.3), ..Default::default() }); // add entities to the world - world + command_buffer .build() // mesh .add_entity(MeshEntity { diff --git a/examples/3d/parenting.rs b/examples/3d/parenting.rs index 60ad35c068..d6c3590368 100644 --- a/examples/3d/parenting.rs +++ b/examples/3d/parenting.rs @@ -5,7 +5,7 @@ struct Rotator; fn main() { App::build() .add_default_plugins() - .add_startup_system(setup) + .add_startup_system(setup.system()) .add_system(rotator_system.system()) .run(); } @@ -16,19 +16,18 @@ fn rotator_system(time: Resource