From 6c4e2cce208e00252e6c94d1a7b5121605f85702 Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Thu, 20 Jan 2022 23:04:31 +0100 Subject: [PATCH 1/5] add #[reflect(Default)] --- crates/bevy_reflect/src/std_traits.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 crates/bevy_reflect/src/std_traits.rs diff --git a/crates/bevy_reflect/src/std_traits.rs b/crates/bevy_reflect/src/std_traits.rs new file mode 100644 index 0000000000000..a784e14df5bb6 --- /dev/null +++ b/crates/bevy_reflect/src/std_traits.rs @@ -0,0 +1,20 @@ +use crate::{FromType, Reflect}; + +#[derive(Clone)] +pub struct ReflectDefault { + default: fn() -> Box, +} + +impl ReflectDefault { + pub fn default(&self) -> Box { + (self.default)() + } +} + +impl FromType for ReflectDefault { + fn from_type() -> Self { + ReflectDefault { + default: || Box::new(T::default()), + } + } +} From 8f9ef0271ca1fa88eb148be7c46cea65cdac021d Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Thu, 20 Jan 2022 23:13:40 +0100 Subject: [PATCH 2/5] add #[reflect(Default)] to components that implement Default and are user-facing --- crates/bevy_core/src/name.rs | 3 ++- crates/bevy_core/src/time/stopwatch.rs | 3 ++- crates/bevy_core/src/time/timer.rs | 3 ++- crates/bevy_pbr/src/alpha.rs | 3 ++- crates/bevy_pbr/src/light.rs | 5 +++-- crates/bevy_pbr/src/wireframe.rs | 3 ++- crates/bevy_reflect/src/lib.rs | 2 ++ crates/bevy_render/src/camera/camera.rs | 3 ++- crates/bevy_render/src/camera/projection.rs | 5 +++-- crates/bevy_render/src/view/visibility/mod.rs | 3 ++- crates/bevy_render/src/view/visibility/render_layers.rs | 3 ++- crates/bevy_text/src/text.rs | 5 +++-- crates/bevy_transform/src/components/global_transform.rs | 3 ++- crates/bevy_transform/src/components/transform.rs | 3 ++- crates/bevy_ui/src/ui_node.rs | 9 +++++---- crates/bevy_ui/src/widget/button.rs | 3 ++- 16 files changed, 38 insertions(+), 21 deletions(-) diff --git a/crates/bevy_core/src/name.rs b/crates/bevy_core/src/name.rs index f7d992e9c12a2..ab1133e7bce10 100644 --- a/crates/bevy_core/src/name.rs +++ b/crates/bevy_core/src/name.rs @@ -1,4 +1,5 @@ use bevy_ecs::{component::Component, reflect::ReflectComponent}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; use bevy_utils::AHasher; use std::{ @@ -14,7 +15,7 @@ use std::{ /// as multiple entities can have the same name. [`bevy_ecs::entity::Entity`] should be /// used instead as the default unique identifier. #[derive(Component, Debug, Clone, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct Name { hash: u64, // TODO: Shouldn't be serialized name: Cow<'static, str>, diff --git a/crates/bevy_core/src/time/stopwatch.rs b/crates/bevy_core/src/time/stopwatch.rs index 9fa84cba07a6b..b504d2500a90e 100644 --- a/crates/bevy_core/src/time/stopwatch.rs +++ b/crates/bevy_core/src/time/stopwatch.rs @@ -1,4 +1,5 @@ use bevy_ecs::{component::Component, reflect::ReflectComponent}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; use bevy_utils::Duration; @@ -24,7 +25,7 @@ use bevy_utils::Duration; /// assert_eq!(stopwatch.elapsed_secs(), 0.0); /// ``` #[derive(Component, Clone, Debug, Default, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct Stopwatch { elapsed: Duration, paused: bool, diff --git a/crates/bevy_core/src/time/timer.rs b/crates/bevy_core/src/time/timer.rs index b9bd0800de38e..7d64dfe568731 100644 --- a/crates/bevy_core/src/time/timer.rs +++ b/crates/bevy_core/src/time/timer.rs @@ -1,5 +1,6 @@ use crate::Stopwatch; use bevy_ecs::{component::Component, reflect::ReflectComponent}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; use bevy_utils::Duration; @@ -11,7 +12,7 @@ use bevy_utils::Duration; /// /// Paused timers will not have elapsed time increased. #[derive(Component, Clone, Debug, Default, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct Timer { stopwatch: Stopwatch, duration: Duration, diff --git a/crates/bevy_pbr/src/alpha.rs b/crates/bevy_pbr/src/alpha.rs index 9af73fc764011..ec65a5d113c2d 100644 --- a/crates/bevy_pbr/src/alpha.rs +++ b/crates/bevy_pbr/src/alpha.rs @@ -1,10 +1,11 @@ use bevy_ecs::{component::Component, reflect::ReflectComponent}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; // FIXME: This should probably be part of bevy_render2! /// Alpha mode #[derive(Component, Debug, Reflect, Copy, Clone, PartialEq)] -#[reflect(Component)] +#[reflect(Component, Default)] pub enum AlphaMode { Opaque, /// An alpha cutoff must be supplied where alpha values >= the cutoff diff --git a/crates/bevy_pbr/src/light.rs b/crates/bevy_pbr/src/light.rs index a0380e1d6aeab..97714ccc3f723 100644 --- a/crates/bevy_pbr/src/light.rs +++ b/crates/bevy_pbr/src/light.rs @@ -2,6 +2,7 @@ use std::collections::HashSet; use bevy_ecs::prelude::*; use bevy_math::{Mat4, UVec2, UVec3, Vec2, Vec3, Vec3Swizzles, Vec4, Vec4Swizzles}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; use bevy_render::{ camera::{Camera, CameraProjection, OrthographicProjection}, @@ -35,7 +36,7 @@ use crate::{ /// /// Source: [Wikipedia](https://en.wikipedia.org/wiki/Lumen_(unit)#Lighting) #[derive(Component, Debug, Clone, Copy, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct PointLight { pub color: Color, pub intensity: f32, @@ -107,7 +108,7 @@ impl Default for PointLightShadowMap { /// /// Source: [Wikipedia](https://en.wikipedia.org/wiki/Lux) #[derive(Component, Debug, Clone, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct DirectionalLight { pub color: Color, /// Illuminance in lux diff --git a/crates/bevy_pbr/src/wireframe.rs b/crates/bevy_pbr/src/wireframe.rs index 9f1308179e518..1674241bcb65a 100644 --- a/crates/bevy_pbr/src/wireframe.rs +++ b/crates/bevy_pbr/src/wireframe.rs @@ -4,6 +4,7 @@ use bevy_app::Plugin; use bevy_asset::{Assets, Handle, HandleUntyped}; use bevy_core_pipeline::Opaque3d; use bevy_ecs::{prelude::*, reflect::ReflectComponent}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::{Reflect, TypeUuid}; use bevy_render::render_resource::PolygonMode; use bevy_render::{ @@ -57,7 +58,7 @@ fn extract_wireframes(mut commands: Commands, query: Query, diff --git a/crates/bevy_render/src/camera/projection.rs b/crates/bevy_render/src/camera/projection.rs index b0ea170c75f6e..3f983fa8b3330 100644 --- a/crates/bevy_render/src/camera/projection.rs +++ b/crates/bevy_render/src/camera/projection.rs @@ -1,6 +1,7 @@ use super::DepthCalculation; use bevy_ecs::{component::Component, reflect::ReflectComponent}; use bevy_math::Mat4; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::{Reflect, ReflectDeserialize}; use serde::{Deserialize, Serialize}; @@ -12,7 +13,7 @@ pub trait CameraProjection { } #[derive(Component, Debug, Clone, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct PerspectiveProjection { pub fov: f32, pub aspect_ratio: f32, @@ -72,7 +73,7 @@ pub enum ScalingMode { } #[derive(Component, Debug, Clone, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct OrthographicProjection { pub left: f32, pub right: f32, diff --git a/crates/bevy_render/src/view/visibility/mod.rs b/crates/bevy_render/src/view/visibility/mod.rs index cec6525d1acf2..dcffb2e30c85e 100644 --- a/crates/bevy_render/src/view/visibility/mod.rs +++ b/crates/bevy_render/src/view/visibility/mod.rs @@ -5,6 +5,7 @@ pub use render_layers::*; use bevy_app::{CoreStage, Plugin}; use bevy_asset::{Assets, Handle}; use bevy_ecs::prelude::*; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; use bevy_transform::{components::GlobalTransform, TransformSystem}; @@ -16,7 +17,7 @@ use crate::{ /// User indication of whether an entity is visible #[derive(Component, Clone, Reflect, Debug)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct Visibility { pub is_visible: bool, } diff --git a/crates/bevy_render/src/view/visibility/render_layers.rs b/crates/bevy_render/src/view/visibility/render_layers.rs index 59cc40e41cd0e..b76b969412275 100644 --- a/crates/bevy_render/src/view/visibility/render_layers.rs +++ b/crates/bevy_render/src/view/visibility/render_layers.rs @@ -1,4 +1,5 @@ use bevy_ecs::prelude::{Component, ReflectComponent}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; type LayerMask = u32; @@ -20,7 +21,7 @@ pub type Layer = u8; /// /// Entities without this component belong to layer `0`. #[derive(Component, Copy, Clone, Reflect, PartialEq, Eq, PartialOrd, Ord)] -#[reflect(Component, PartialEq)] +#[reflect(Component, Default, PartialEq)] pub struct RenderLayers(LayerMask); impl std::fmt::Debug for RenderLayers { diff --git a/crates/bevy_text/src/text.rs b/crates/bevy_text/src/text.rs index 2f2b37ab9a19e..345aa53c4db16 100644 --- a/crates/bevy_text/src/text.rs +++ b/crates/bevy_text/src/text.rs @@ -1,6 +1,7 @@ use bevy_asset::Handle; use bevy_ecs::{prelude::Component, reflect::ReflectComponent}; use bevy_math::Size; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::{FromReflect, Reflect, ReflectDeserialize}; use bevy_render::color::Color; use serde::{Deserialize, Serialize}; @@ -8,7 +9,7 @@ use serde::{Deserialize, Serialize}; use crate::Font; #[derive(Component, Debug, Default, Clone, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct Text { pub sections: Vec, pub alignment: TextAlignment, @@ -152,7 +153,7 @@ impl Default for TextStyle { } #[derive(Component, Default, Copy, Clone, Debug, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct Text2dSize { pub size: Size, } diff --git a/crates/bevy_transform/src/components/global_transform.rs b/crates/bevy_transform/src/components/global_transform.rs index 7540fd90dff6e..c73c477de4539 100644 --- a/crates/bevy_transform/src/components/global_transform.rs +++ b/crates/bevy_transform/src/components/global_transform.rs @@ -1,6 +1,7 @@ use super::Transform; use bevy_ecs::{component::Component, reflect::ReflectComponent}; use bevy_math::{Mat3, Mat4, Quat, Vec3}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; use std::ops::Mul; @@ -34,7 +35,7 @@ use std::ops::Mul; /// update the[`Transform`] of an entity in this stage or after, you will notice a 1 frame lag /// before the [`GlobalTransform`] is updated. #[derive(Component, Debug, PartialEq, Clone, Copy, Reflect)] -#[reflect(Component, PartialEq)] +#[reflect(Component, Default, PartialEq)] pub struct GlobalTransform { /// The position of the global transform pub translation: Vec3, diff --git a/crates/bevy_transform/src/components/transform.rs b/crates/bevy_transform/src/components/transform.rs index dcf5d8ba2516f..d99375b247d9e 100644 --- a/crates/bevy_transform/src/components/transform.rs +++ b/crates/bevy_transform/src/components/transform.rs @@ -1,6 +1,7 @@ use super::GlobalTransform; use bevy_ecs::{component::Component, reflect::ReflectComponent}; use bevy_math::{Mat3, Mat4, Quat, Vec3}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; use std::ops::Mul; @@ -35,7 +36,7 @@ use std::ops::Mul; /// update the[`Transform`] of an entity in this stage or after, you will notice a 1 frame lag /// before the [`GlobalTransform`] is updated. #[derive(Component, Debug, PartialEq, Clone, Copy, Reflect)] -#[reflect(Component, PartialEq)] +#[reflect(Component, Default, PartialEq)] pub struct Transform { /// Position of the entity. In 2d, the last value of the `Vec3` is used for z-ordering. pub translation: Vec3, diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index f29e087c825bc..28983a5861981 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -1,6 +1,7 @@ use bevy_asset::Handle; use bevy_ecs::{prelude::Component, reflect::ReflectComponent}; use bevy_math::{Rect, Size, Vec2}; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::{Reflect, ReflectDeserialize}; use bevy_render::{ color::Color, @@ -11,7 +12,7 @@ use std::ops::{Add, AddAssign}; /// Describes the size of a UI node #[derive(Component, Debug, Clone, Default, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct Node { /// The size of the node as width and height in pixels pub size: Vec2, @@ -67,7 +68,7 @@ impl AddAssign for Val { /// **Note:** Bevy's UI is upside down compared to how Flexbox normally works, to stay consistent with engine paradigms about layouting from /// the upper left corner of the display #[derive(Component, Clone, PartialEq, Debug, Reflect)] -#[reflect(Component, PartialEq)] +#[reflect(Component, Default, PartialEq)] pub struct Style { /// Whether to arrange this node and its children with flexbox layout pub display: Display, @@ -358,7 +359,7 @@ pub struct CalculatedSize { /// The color of the node #[derive(Component, Default, Copy, Clone, Debug, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct UiColor(pub Color); impl From for UiColor { @@ -369,7 +370,7 @@ impl From for UiColor { /// The image of the node #[derive(Component, Clone, Debug, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct UiImage(pub Handle); impl Default for UiImage { diff --git a/crates/bevy_ui/src/widget/button.rs b/crates/bevy_ui/src/widget/button.rs index 9b3c665d4255e..6c7dced0f3bb0 100644 --- a/crates/bevy_ui/src/widget/button.rs +++ b/crates/bevy_ui/src/widget/button.rs @@ -1,8 +1,9 @@ use bevy_ecs::prelude::Component; use bevy_ecs::reflect::ReflectComponent; +use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; /// Marker struct for buttons #[derive(Component, Debug, Default, Clone, Copy, Reflect)] -#[reflect(Component)] +#[reflect(Component, Default)] pub struct Button; From 11b293deb8dcdb16590d88090200714e086b31f1 Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Fri, 21 Jan 2022 10:55:51 +0100 Subject: [PATCH 3/5] Reflect for NotShadow{Caster,Receiver} --- crates/bevy_pbr/src/light.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/bevy_pbr/src/light.rs b/crates/bevy_pbr/src/light.rs index 97714ccc3f723..5150704fcc94a 100644 --- a/crates/bevy_pbr/src/light.rs +++ b/crates/bevy_pbr/src/light.rs @@ -180,10 +180,12 @@ impl Default for AmbientLight { } /// Add this component to make a [`Mesh`](bevy_render::mesh::Mesh) not cast shadows. -#[derive(Component)] +#[derive(Component, Reflect, Default)] +#[reflect(Component, Default)] pub struct NotShadowCaster; /// Add this component to make a [`Mesh`](bevy_render::mesh::Mesh) not receive shadows. -#[derive(Component)] +#[derive(Component, Reflect, Default)] +#[reflect(Component, Default)] pub struct NotShadowReceiver; #[derive(Debug, Hash, PartialEq, Eq, Clone, SystemLabel)] From 091e41fc3cca5005012963897dcc084649944e41 Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Tue, 3 May 2022 10:09:56 +0200 Subject: [PATCH 4/5] add std_traits to prelude --- crates/bevy_reflect/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_reflect/src/lib.rs b/crates/bevy_reflect/src/lib.rs index 1bbb21094e1f7..abfd47360ba21 100644 --- a/crates/bevy_reflect/src/lib.rs +++ b/crates/bevy_reflect/src/lib.rs @@ -27,6 +27,7 @@ pub mod serde; pub mod std_traits; pub mod prelude { + pub use crate::std_traits::*; #[doc(hidden)] pub use crate::{ reflect_trait, GetField, GetTupleStructField, Reflect, ReflectDeserialize, Struct, From 7ca88019ede0aba177a82bebcf1f14d6bcd33407 Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Tue, 3 May 2022 10:54:38 +0200 Subject: [PATCH 5/5] add doc comment --- crates/bevy_reflect/src/std_traits.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/bevy_reflect/src/std_traits.rs b/crates/bevy_reflect/src/std_traits.rs index a784e14df5bb6..2470e17fb9362 100644 --- a/crates/bevy_reflect/src/std_traits.rs +++ b/crates/bevy_reflect/src/std_traits.rs @@ -1,5 +1,8 @@ use crate::{FromType, Reflect}; +/// A struct used to provide the default value of a type. +/// +/// A [`ReflectDefault`] for type `T` can be obtained via [`FromType::from_type`]. #[derive(Clone)] pub struct ReflectDefault { default: fn() -> Box,