diff --git a/Cargo.toml b/Cargo.toml index fab9d6c7f955a..aa6b6cd67180d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -154,8 +154,9 @@ ui = [ # COLLECTION: Enable this feature during development to improve the development experience. This adds features like asset hot-reloading and debugging tools. This should not be enabled for published apps! dev = [ - "debug", # TODO: rename this to something more specific ... this is a "debug ECS names" feature + "debug", # TODO: rename this to something more specific ... this is a "debug ECS names" feature "bevy_dev_tools", + "render_dev_tools", "file_watcher", ] @@ -570,6 +571,9 @@ android-game-activity = ["bevy_internal/android-game-activity"] # Enable systems that allow for automated testing on CI bevy_ci_testing = ["bevy_internal/bevy_ci_testing"] +# Enable systems that allow for renderable dev tools +render_dev_tools = ["bevy_internal/render_dev_tools"] + # Enable glTF animation loading gltf_animation = ["bevy_internal/gltf_animation"] diff --git a/crates/bevy_dev_tools/Cargo.toml b/crates/bevy_dev_tools/Cargo.toml index 373ff0878be4c..e48ceece977f2 100644 --- a/crates/bevy_dev_tools/Cargo.toml +++ b/crates/bevy_dev_tools/Cargo.toml @@ -11,8 +11,14 @@ keywords = ["bevy"] [features] bevy_ci_testing = ["dep:serde", "dep:ron"] screenrecording = ["dep:x264"] -webgl = ["bevy_render/webgl"] -webgpu = ["bevy_render/webgpu"] +render = [ + "dep:bevy_render", + "dep:bevy_core_pipeline", + "dep:bevy_pbr", + "dep:bevy_ui_render", +] +webgl = ["dep:bevy_render", "bevy_render?/webgl"] +webgpu = ["dep:bevy_render", "bevy_render?/webgpu"] schedule_data = ["dep:serde", "dep:ron", "dep:bevy_utils", "dep:thiserror"] serialize = ["dep:serde"] @@ -24,7 +30,7 @@ bevy_audio = { path = "../bevy_audio", version = "0.20.0-dev" } bevy_asset = { path = "../bevy_asset", version = "0.20.0-dev" } bevy_camera = { path = "../bevy_camera", version = "0.20.0-dev" } bevy_color = { path = "../bevy_color", version = "0.20.0-dev" } -bevy_core_pipeline = { path = "../bevy_core_pipeline", version = "0.20.0-dev" } +bevy_core_pipeline = { path = "../bevy_core_pipeline", version = "0.20.0-dev", optional = true } bevy_diagnostic = { path = "../bevy_diagnostic", version = "0.20.0-dev" } bevy_ecs = { path = "../bevy_ecs", version = "0.20.0-dev" } bevy_extract = { path = "../bevy_extract", version = "0.20.0-dev" } @@ -33,9 +39,9 @@ bevy_input = { path = "../bevy_input", version = "0.20.0-dev" } bevy_light = { path = "../bevy_light", version = "0.20.0-dev" } bevy_log = { path = "../bevy_log", version = "0.20.0-dev" } bevy_math = { path = "../bevy_math", version = "0.20.0-dev" } -bevy_pbr = { path = "../bevy_pbr", version = "0.20.0-dev" } +bevy_pbr = { path = "../bevy_pbr", version = "0.20.0-dev", optional = true } bevy_picking = { path = "../bevy_picking", version = "0.20.0-dev" } -bevy_render = { path = "../bevy_render", version = "0.20.0-dev" } +bevy_render = { path = "../bevy_render", version = "0.20.0-dev", optional = true } bevy_reflect = { path = "../bevy_reflect", version = "0.20.0-dev" } bevy_time = { path = "../bevy_time", version = "0.20.0-dev" } bevy_text = { path = "../bevy_text", version = "0.20.0-dev" } @@ -43,7 +49,7 @@ bevy_transform = { path = "../bevy_transform", version = "0.20.0-dev" } bevy_shader = { path = "../bevy_shader", version = "0.20.0-dev" } bevy_sprite = { path = "../bevy_sprite", version = "0.20.0-dev" } bevy_ui = { path = "../bevy_ui", version = "0.20.0-dev" } -bevy_ui_render = { path = "../bevy_ui_render", version = "0.20.0-dev" } +bevy_ui_render = { path = "../bevy_ui_render", version = "0.20.0-dev", optional = true } bevy_ui_widgets = { path = "../bevy_ui_widgets", version = "0.20.0-dev" } bevy_utils = { path = "../bevy_utils", version = "0.20.0-dev", optional = true } bevy_window = { path = "../bevy_window", version = "0.20.0-dev" } diff --git a/crates/bevy_dev_tools/src/easy_camera.rs b/crates/bevy_dev_tools/src/easy_camera.rs new file mode 100644 index 0000000000000..98ead93a4d917 --- /dev/null +++ b/crates/bevy_dev_tools/src/easy_camera.rs @@ -0,0 +1,55 @@ +use bevy_app::{App, Plugin, PostUpdate}; +use bevy_camera::Camera; +use bevy_ecs::prelude::*; +use bevy_math::{Quat, StableInterpolate, Vec3}; +use bevy_time::Time; +use bevy_transform::{components::Transform, TransformSystems}; + +/// Plugin to move the camera smoothly according to the current time +pub struct EasyCameraMovementPlugin { + /// Decay rate for the camera movement + pub decay_rate: f32, +} + +impl Default for EasyCameraMovementPlugin { + fn default() -> Self { + Self { decay_rate: 1.0 } + } +} + +/// Move the camera to the given position +#[derive(Component)] +pub struct CameraMovement { + /// Target position for the camera movement + pub translation: Vec3, + /// Target rotation for the camera movement + pub rotation: Quat, +} + +impl Plugin for EasyCameraMovementPlugin { + fn build(&self, app: &mut App) { + let decay_rate = self.decay_rate; + app.add_systems( + PostUpdate, + (move |mut query: Single<(&mut Transform, &CameraMovement), With>, + time: Res