diff --git a/crates/bevy_pbr/src/entity.rs b/crates/bevy_pbr/src/entity.rs index d03b0d89cf988..b0b0388761687 100644 --- a/crates/bevy_pbr/src/entity.rs +++ b/crates/bevy_pbr/src/entity.rs @@ -2,40 +2,29 @@ use crate::{light::Light, material::StandardMaterial, render_graph::FORWARD_PIPE use bevy_asset::Handle; use bevy_ecs::bundle::Bundle; use bevy_render::{ - draw::Draw, - mesh::Mesh, pipeline::{RenderPipeline, RenderPipelines}, - prelude::Visible, - render_graph::base::MainPass, + prelude::MeshBundle, }; use bevy_transform::prelude::{GlobalTransform, Transform}; /// A component bundle for "pbr mesh" entities #[derive(Bundle)] pub struct PbrBundle { - pub mesh: Handle, pub material: Handle, - pub main_pass: MainPass, - pub draw: Draw, - pub visible: Visible, - pub render_pipelines: RenderPipelines, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub mesh: MeshBundle, } impl Default for PbrBundle { fn default() -> Self { Self { - render_pipelines: RenderPipelines::from_pipelines(vec![RenderPipeline::new( - FORWARD_PIPELINE_HANDLE.typed(), - )]), - mesh: Default::default(), - visible: Default::default(), + mesh: MeshBundle { + render_pipelines: RenderPipelines::from_pipelines(vec![RenderPipeline::new( + FORWARD_PIPELINE_HANDLE.typed(), + )]), + ..Default::default() + }, material: Default::default(), - main_pass: Default::default(), - draw: Default::default(), - transform: Default::default(), - global_transform: Default::default(), } } } diff --git a/crates/bevy_render/src/entity.rs b/crates/bevy_render/src/entity.rs index 7c6d4df1a93f0..c22509416b5e6 100644 --- a/crates/bevy_render/src/entity.rs +++ b/crates/bevy_render/src/entity.rs @@ -11,18 +11,18 @@ use crate::{ use base::MainPass; use bevy_asset::Handle; use bevy_ecs::bundle::Bundle; -use bevy_transform::components::{GlobalTransform, Transform}; +use bevy_transform::{components::Transform, TransformBundle}; /// A component bundle for "mesh" entities -#[derive(Bundle, Default)] +#[derive(Bundle, Default, Clone)] pub struct MeshBundle { pub mesh: Handle, pub draw: Draw, pub visible: Visible, pub render_pipelines: RenderPipelines, pub main_pass: MainPass, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub game_object: TransformBundle, } /// Component bundle for camera entities with perspective projection @@ -33,8 +33,8 @@ pub struct PerspectiveCameraBundle { pub camera: Camera, pub perspective_projection: PerspectiveProjection, pub visible_entities: VisibleEntities, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub game_object: TransformBundle, } impl PerspectiveCameraBundle { @@ -50,8 +50,7 @@ impl PerspectiveCameraBundle { }, perspective_projection: Default::default(), visible_entities: Default::default(), - transform: Default::default(), - global_transform: Default::default(), + game_object: Default::default(), } } } @@ -65,8 +64,7 @@ impl Default for PerspectiveCameraBundle { }, perspective_projection: Default::default(), visible_entities: Default::default(), - transform: Default::default(), - global_transform: Default::default(), + game_object: Default::default(), } } } @@ -79,8 +77,8 @@ pub struct OrthographicCameraBundle { pub camera: Camera, pub orthographic_projection: OrthographicProjection, pub visible_entities: VisibleEntities, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub transforms: TransformBundle, } impl OrthographicCameraBundle { @@ -99,8 +97,10 @@ impl OrthographicCameraBundle { ..Default::default() }, visible_entities: Default::default(), - transform: Transform::from_xyz(0.0, 0.0, far - 0.1), - global_transform: Default::default(), + transforms: TransformBundle { + transform: Transform::from_xyz(0.0, 0.0, far - 0.1), + global_transform: Default::default(), + }, } } @@ -116,8 +116,7 @@ impl OrthographicCameraBundle { ..Default::default() }, visible_entities: Default::default(), - transform: Default::default(), - global_transform: Default::default(), + transforms: Default::default(), } } @@ -129,8 +128,7 @@ impl OrthographicCameraBundle { }, orthographic_projection: Default::default(), visible_entities: Default::default(), - transform: Default::default(), - global_transform: Default::default(), + transforms: Default::default(), } } } diff --git a/crates/bevy_sprite/src/entity.rs b/crates/bevy_sprite/src/entity.rs index 70fd8d5699640..f6f6c77aef6eb 100644 --- a/crates/bevy_sprite/src/entity.rs +++ b/crates/bevy_sprite/src/entity.rs @@ -5,43 +5,34 @@ use crate::{ use bevy_asset::Handle; use bevy_ecs::bundle::Bundle; use bevy_render::{ - mesh::Mesh, pipeline::{RenderPipeline, RenderPipelines}, - prelude::{Draw, Visible}, - render_graph::base::MainPass, + prelude::{MeshBundle, Visible}, }; -use bevy_transform::prelude::{GlobalTransform, Transform}; #[derive(Bundle, Clone)] pub struct SpriteBundle { pub sprite: Sprite, - pub mesh: Handle, // TODO: maybe abstract this out pub material: Handle, - pub main_pass: MainPass, - pub draw: Draw, - pub visible: Visible, - pub render_pipelines: RenderPipelines, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub mesh: MeshBundle, } impl Default for SpriteBundle { fn default() -> Self { Self { - mesh: QUAD_HANDLE.typed(), - render_pipelines: RenderPipelines::from_pipelines(vec![RenderPipeline::new( - SPRITE_PIPELINE_HANDLE.typed(), - )]), - visible: Visible { - is_transparent: true, + mesh: MeshBundle { + mesh: QUAD_HANDLE.typed(), + render_pipelines: RenderPipelines::from_pipelines(vec![RenderPipeline::new( + SPRITE_PIPELINE_HANDLE.typed(), + )]), + visible: Visible { + is_transparent: true, + ..Default::default() + }, ..Default::default() }, - main_pass: MainPass, - draw: Default::default(), sprite: Default::default(), material: Default::default(), - transform: Default::default(), - global_transform: Default::default(), } } } @@ -54,33 +45,26 @@ pub struct SpriteSheetBundle { pub sprite: TextureAtlasSprite, /// A handle to the texture atlas that holds the sprite images pub texture_atlas: Handle, - /// Data pertaining to how the sprite is drawn on the screen - pub draw: Draw, - pub visible: Visible, - pub render_pipelines: RenderPipelines, - pub main_pass: MainPass, - pub mesh: Handle, // TODO: maybe abstract this out - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub mesh: MeshBundle, } impl Default for SpriteSheetBundle { fn default() -> Self { Self { - render_pipelines: RenderPipelines::from_pipelines(vec![RenderPipeline::new( - SPRITE_SHEET_PIPELINE_HANDLE.typed(), - )]), - visible: Visible { - is_transparent: true, + mesh: MeshBundle { + mesh: QUAD_HANDLE.typed(), + render_pipelines: RenderPipelines::from_pipelines(vec![RenderPipeline::new( + SPRITE_SHEET_PIPELINE_HANDLE.typed(), + )]), + visible: Visible { + is_transparent: true, + ..Default::default() + }, ..Default::default() }, - main_pass: MainPass, - mesh: QUAD_HANDLE.typed(), - draw: Default::default(), sprite: Default::default(), texture_atlas: Default::default(), - transform: Default::default(), - global_transform: Default::default(), } } } diff --git a/crates/bevy_text/src/text2d.rs b/crates/bevy_text/src/text2d.rs index bfa5a3efbae5e..d269d74c0cbf8 100644 --- a/crates/bevy_text/src/text2d.rs +++ b/crates/bevy_text/src/text2d.rs @@ -14,7 +14,7 @@ use bevy_render::{ renderer::RenderResourceBindings, }; use bevy_sprite::{TextureAtlas, QUAD_HANDLE}; -use bevy_transform::prelude::{GlobalTransform, Transform}; +use bevy_transform::{components::GlobalTransform, TransformBundle}; use bevy_window::Windows; use glyph_brush_layout::{HorizontalAlign, VerticalAlign}; @@ -28,8 +28,8 @@ pub struct Text2dBundle { pub draw: Draw, pub visible: Visible, pub text: Text, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub transforms: TransformBundle, pub main_pass: MainPass, pub calculated_size: CalculatedSize, } @@ -45,8 +45,7 @@ impl Default for Text2dBundle { ..Default::default() }, text: Default::default(), - transform: Default::default(), - global_transform: Default::default(), + transforms: Default::default(), main_pass: MainPass {}, calculated_size: CalculatedSize { size: Size::default(), diff --git a/crates/bevy_transform/src/lib.rs b/crates/bevy_transform/src/lib.rs index 3efc6d0a20eea..f088a91cb9fb6 100644 --- a/crates/bevy_transform/src/lib.rs +++ b/crates/bevy_transform/src/lib.rs @@ -3,11 +3,12 @@ pub mod hierarchy; pub mod transform_propagate_system; pub mod prelude { - pub use crate::{components::*, hierarchy::*, TransformPlugin}; + pub use crate::{components::*, hierarchy::*, TransformBundle, TransformPlugin}; } use bevy_app::prelude::*; use bevy_ecs::{ + bundle::Bundle, schedule::{ParallelSystemDescriptorCoercion, SystemLabel}, system::IntoSystem, }; @@ -22,6 +23,13 @@ pub enum TransformSystem { ParentUpdate, } +// TODO: Bikeshed this name +#[derive(Default, Bundle, Clone, Debug)] +pub struct TransformBundle { + pub transform: Transform, + pub global_transform: GlobalTransform, +} + impl Plugin for TransformPlugin { fn build(&self, app: &mut AppBuilder) { app.register_type::() diff --git a/crates/bevy_ui/src/entity.rs b/crates/bevy_ui/src/entity.rs index e5a45118fd77c..2f475dce8ee98 100644 --- a/crates/bevy_ui/src/entity.rs +++ b/crates/bevy_ui/src/entity.rs @@ -15,7 +15,7 @@ use bevy_render::{ }; use bevy_sprite::{ColorMaterial, QUAD_HANDLE}; use bevy_text::{CalculatedSize, Text}; -use bevy_transform::prelude::{GlobalTransform, Transform}; +use bevy_transform::{prelude::Transform, TransformBundle}; #[derive(Bundle, Clone, Debug)] pub struct NodeBundle { @@ -26,8 +26,8 @@ pub struct NodeBundle { pub draw: Draw, pub visible: Visible, pub render_pipelines: RenderPipelines, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub transforms: TransformBundle, } impl Default for NodeBundle { @@ -45,46 +45,25 @@ impl Default for NodeBundle { style: Default::default(), material: Default::default(), draw: Default::default(), - transform: Default::default(), - global_transform: Default::default(), + transforms: Default::default(), } } } #[derive(Bundle, Clone, Debug)] pub struct ImageBundle { - pub node: Node, - pub style: Style, pub image: Image, pub calculated_size: CalculatedSize, - pub mesh: Handle, // TODO: maybe abstract this out - pub material: Handle, - pub draw: Draw, - pub visible: Visible, - pub render_pipelines: RenderPipelines, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub node: NodeBundle, } impl Default for ImageBundle { fn default() -> Self { ImageBundle { - mesh: QUAD_HANDLE.typed(), - render_pipelines: RenderPipelines::from_pipelines(vec![RenderPipeline::new( - UI_PIPELINE_HANDLE.typed(), - )]), node: Default::default(), image: Default::default(), calculated_size: Default::default(), - style: Default::default(), - material: Default::default(), - draw: Default::default(), - visible: Visible { - is_transparent: true, - ..Default::default() - }, - transform: Default::default(), - global_transform: Default::default(), } } } @@ -98,8 +77,8 @@ pub struct TextBundle { pub text: Text, pub calculated_size: CalculatedSize, pub focus_policy: FocusPolicy, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub transforms: TransformBundle, } impl Default for TextBundle { @@ -117,48 +96,27 @@ impl Default for TextBundle { node: Default::default(), calculated_size: Default::default(), style: Default::default(), - transform: Default::default(), - global_transform: Default::default(), + transforms: Default::default(), } } } #[derive(Bundle, Clone, Debug)] pub struct ButtonBundle { - pub node: Node, pub button: Button, - pub style: Style, pub interaction: Interaction, pub focus_policy: FocusPolicy, - pub mesh: Handle, // TODO: maybe abstract this out - pub material: Handle, - pub draw: Draw, - pub visible: Visible, - pub render_pipelines: RenderPipelines, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub node: NodeBundle, } impl Default for ButtonBundle { fn default() -> Self { ButtonBundle { button: Button, - mesh: QUAD_HANDLE.typed(), - render_pipelines: RenderPipelines::from_pipelines(vec![RenderPipeline::new( - UI_PIPELINE_HANDLE.typed(), - )]), interaction: Default::default(), focus_policy: Default::default(), node: Default::default(), - style: Default::default(), - material: Default::default(), - draw: Default::default(), - visible: Visible { - is_transparent: true, - ..Default::default() - }, - transform: Default::default(), - global_transform: Default::default(), } } } @@ -168,8 +126,8 @@ pub struct UiCameraBundle { pub camera: Camera, pub orthographic_projection: OrthographicProjection, pub visible_entities: VisibleEntities, - pub transform: Transform, - pub global_transform: GlobalTransform, + #[bundle] + pub transforms: TransformBundle, } impl Default for UiCameraBundle { @@ -189,8 +147,10 @@ impl Default for UiCameraBundle { ..Default::default() }, visible_entities: Default::default(), - transform: Transform::from_xyz(0.0, 0.0, far - 0.1), - global_transform: Default::default(), + transforms: TransformBundle { + transform: Transform::from_xyz(0.0, 0.0, far - 0.1), + global_transform: Default::default(), + }, } } }