
# Objective - `MeshPickingBackend` and `SpritePickingBackend` do not have the `Plugin` suffix - `DefaultPickingPlugins` is masquerading as a `Plugin` when in reality it should be a `PluginGroup` - Fixes #16081. ## Solution - Rename some structures: |Original Name|New Name| |-|-| |`MeshPickingBackend`|`MeshPickingPlugin`| |`MeshPickingBackendSettings`|`MeshPickingSettings`| |`SpritePickingBackend`|`SpritePickingPlugin`| |`UiPickingBackendPlugin`|`UiPickingPlugin`| - Make `DefaultPickingPlugins` a `PluginGroup`. - Because `DefaultPickingPlugins` is within the `DefaultPlugins` plugin group, I also added support for nested plugin groups to the `plugin_group!` macro. ## Testing - I used ripgrep to ensure all references were properly renamed. - For the `plugin_group!` macro, I used `cargo expand` to manually inspect the expansion of `DefaultPlugins`. --- ## Migration Guide > [!NOTE] > > All 3 of the changed structures were added after 0.14, so this does not need to be included in the 0.14 to 0.15 migration guide. - `MeshPickingBackend` is now named `MeshPickingPlugin`. - `MeshPickingBackendSettings` is now named `MeshPickingSettings`. - `SpritePickingBackend` is now named `SpritePickingPlugin`. - `UiPickingBackendPlugin` is now named `UiPickingPlugin`. - `DefaultPickingPlugins` is now a a `PluginGroup` instead of a `Plugin`.
172 lines
7.5 KiB
Rust
172 lines
7.5 KiB
Rust
use bevy_app::{plugin_group, Plugin};
|
||
|
||
plugin_group! {
|
||
/// This plugin group will add all the default plugins for a *Bevy* application:
|
||
pub struct DefaultPlugins {
|
||
bevy_app:::PanicHandlerPlugin,
|
||
bevy_log:::LogPlugin,
|
||
bevy_core:::TaskPoolPlugin,
|
||
bevy_core:::TypeRegistrationPlugin,
|
||
bevy_core:::FrameCountPlugin,
|
||
bevy_time:::TimePlugin,
|
||
bevy_transform:::TransformPlugin,
|
||
bevy_hierarchy:::HierarchyPlugin,
|
||
bevy_diagnostic:::DiagnosticsPlugin,
|
||
bevy_input:::InputPlugin,
|
||
bevy_window:::WindowPlugin,
|
||
bevy_a11y:::AccessibilityPlugin,
|
||
#[custom(cfg(not(target_arch = "wasm32")))]
|
||
bevy_app:::TerminalCtrlCHandlerPlugin,
|
||
#[cfg(feature = "bevy_asset")]
|
||
bevy_asset:::AssetPlugin,
|
||
#[cfg(feature = "bevy_scene")]
|
||
bevy_scene:::ScenePlugin,
|
||
#[cfg(feature = "bevy_winit")]
|
||
bevy_winit:::WinitPlugin,
|
||
#[cfg(feature = "bevy_render")]
|
||
bevy_render:::RenderPlugin,
|
||
// NOTE: Load this after renderer initialization so that it knows about the supported
|
||
// compressed texture formats.
|
||
#[cfg(feature = "bevy_render")]
|
||
bevy_render::texture:::ImagePlugin,
|
||
#[cfg(feature = "bevy_render")]
|
||
#[custom(cfg(all(not(target_arch = "wasm32"), feature = "multi_threaded")))]
|
||
bevy_render::pipelined_rendering:::PipelinedRenderingPlugin,
|
||
#[cfg(feature = "bevy_core_pipeline")]
|
||
bevy_core_pipeline:::CorePipelinePlugin,
|
||
#[cfg(feature = "bevy_sprite")]
|
||
bevy_sprite:::SpritePlugin,
|
||
#[cfg(feature = "bevy_text")]
|
||
bevy_text:::TextPlugin,
|
||
#[cfg(feature = "bevy_ui")]
|
||
bevy_ui:::UiPlugin,
|
||
#[cfg(feature = "bevy_pbr")]
|
||
bevy_pbr:::PbrPlugin,
|
||
// NOTE: Load this after renderer initialization so that it knows about the supported
|
||
// compressed texture formats.
|
||
#[cfg(feature = "bevy_gltf")]
|
||
bevy_gltf:::GltfPlugin,
|
||
#[cfg(feature = "bevy_audio")]
|
||
bevy_audio:::AudioPlugin,
|
||
#[cfg(feature = "bevy_gilrs")]
|
||
bevy_gilrs:::GilrsPlugin,
|
||
#[cfg(feature = "bevy_animation")]
|
||
bevy_animation:::AnimationPlugin,
|
||
#[cfg(feature = "bevy_gizmos")]
|
||
bevy_gizmos:::GizmoPlugin,
|
||
#[cfg(feature = "bevy_state")]
|
||
bevy_state::app:::StatesPlugin,
|
||
#[cfg(feature = "bevy_dev_tools")]
|
||
bevy_dev_tools:::DevToolsPlugin,
|
||
#[cfg(feature = "bevy_ci_testing")]
|
||
bevy_dev_tools::ci_testing:::CiTestingPlugin,
|
||
#[plugin_group]
|
||
#[cfg(feature = "bevy_picking")]
|
||
bevy_picking:::DefaultPickingPlugins,
|
||
#[doc(hidden)]
|
||
:IgnoreAmbiguitiesPlugin,
|
||
}
|
||
/// [`DefaultPlugins`] obeys *Cargo* *feature* flags. Users may exert control over this plugin group
|
||
/// by disabling `default-features` in their `Cargo.toml` and enabling only those features
|
||
/// that they wish to use.
|
||
///
|
||
/// [`DefaultPlugins`] contains all the plugins typically required to build
|
||
/// a *Bevy* application which includes a *window* and presentation components.
|
||
/// For *headless* cases – without a *window* or presentation, see [`HeadlessPlugins`].
|
||
/// For the absolute minimum number of plugins needed to run a Bevy application, see [`MinimalPlugins`].
|
||
}
|
||
|
||
plugin_group! {
|
||
/// This plugin group will add all the default plugins for a headless (no *window* or rendering) *Bevy* application:
|
||
pub struct HeadlessPlugins {
|
||
bevy_app:::PanicHandlerPlugin,
|
||
bevy_log:::LogPlugin,
|
||
bevy_core:::TaskPoolPlugin,
|
||
bevy_core:::TypeRegistrationPlugin,
|
||
bevy_core:::FrameCountPlugin,
|
||
bevy_time:::TimePlugin,
|
||
bevy_transform:::TransformPlugin,
|
||
bevy_hierarchy:::HierarchyPlugin,
|
||
bevy_diagnostic:::DiagnosticsPlugin,
|
||
bevy_app:::ScheduleRunnerPlugin,
|
||
#[custom(cfg(not(target_arch = "wasm32")))]
|
||
bevy_app:::TerminalCtrlCHandlerPlugin,
|
||
#[cfg(feature = "bevy_asset")]
|
||
bevy_asset:::AssetPlugin,
|
||
#[cfg(feature = "bevy_scene")]
|
||
bevy_scene:::ScenePlugin,
|
||
#[cfg(feature = "bevy_animation")]
|
||
bevy_animation:::AnimationPlugin,
|
||
#[cfg(feature = "bevy_state")]
|
||
bevy_state::app:::StatesPlugin,
|
||
#[cfg(feature = "bevy_ci_testing")]
|
||
bevy_dev_tools::ci_testing:::CiTestingPlugin,
|
||
#[doc(hidden)]
|
||
:IgnoreAmbiguitiesPlugin,
|
||
}
|
||
/// This group of plugins is intended for use for *headless* programs, for example: dedicated game servers.
|
||
/// See the [*Bevy* *headless* example](https://github.com/bevyengine/bevy/blob/main/examples/app/headless.rs)
|
||
///
|
||
/// [`HeadlessPlugins`] obeys *Cargo* *feature* flags. Users may exert control over this plugin group
|
||
/// by disabling `default-features` in their `Cargo.toml` and enabling only those features
|
||
/// that they wish to use.
|
||
///
|
||
/// [`HeadlessPlugins`] contains all the plugins typically required to build
|
||
/// a *Bevy* application. In contrast with [`DefaultPlugins`], it leaves out *window* and presentation components.
|
||
/// This allows applications built using this plugin group to run on devices that do not have a screen or rendering
|
||
/// capabilities.
|
||
/// It includes a [schedule runner (`ScheduleRunnerPlugin`)](crate::app::ScheduleRunnerPlugin)
|
||
/// to provide functionality that would otherwise be driven by a windowed application's
|
||
/// *event loop* or *message loop*.
|
||
///
|
||
/// Windowed applications that wish to use a reduced set of plugins should consider the
|
||
/// [`DefaultPlugins`] plugin group which can be controlled with *Cargo* *feature* flags.
|
||
/// For the absolute minimum number of plugins needed to run a Bevy application, see [`MinimalPlugins`].
|
||
}
|
||
|
||
#[derive(Default)]
|
||
struct IgnoreAmbiguitiesPlugin;
|
||
|
||
impl Plugin for IgnoreAmbiguitiesPlugin {
|
||
#[allow(unused_variables)] // Variables are used depending on enabled features
|
||
fn build(&self, app: &mut bevy_app::App) {
|
||
// bevy_ui owns the Transform and cannot be animated
|
||
#[cfg(all(feature = "bevy_animation", feature = "bevy_ui"))]
|
||
if app.is_plugin_added::<bevy_animation::AnimationPlugin>()
|
||
&& app.is_plugin_added::<bevy_ui::UiPlugin>()
|
||
{
|
||
app.ignore_ambiguity(
|
||
bevy_app::PostUpdate,
|
||
bevy_animation::advance_animations,
|
||
bevy_ui::ui_layout_system,
|
||
);
|
||
app.ignore_ambiguity(
|
||
bevy_app::PostUpdate,
|
||
bevy_animation::animate_targets,
|
||
bevy_ui::ui_layout_system,
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
plugin_group! {
|
||
/// This plugin group will add the minimal plugins for a *Bevy* application:
|
||
pub struct MinimalPlugins {
|
||
bevy_core:::TaskPoolPlugin,
|
||
bevy_core:::TypeRegistrationPlugin,
|
||
bevy_core:::FrameCountPlugin,
|
||
bevy_time:::TimePlugin,
|
||
bevy_app:::ScheduleRunnerPlugin,
|
||
#[cfg(feature = "bevy_ci_testing")]
|
||
bevy_dev_tools::ci_testing:::CiTestingPlugin,
|
||
}
|
||
/// This plugin group represents the absolute minimum, bare-bones, bevy application.
|
||
/// Use this if you want to have absolute control over the plugins used.
|
||
/// If you are looking to make a *headless* application - without a *window* or rendering,
|
||
/// it is usually best to use [`HeadlessPlugins`].
|
||
///
|
||
/// It includes a [schedule runner (`ScheduleRunnerPlugin`)](crate::app::ScheduleRunnerPlugin)
|
||
/// to provide functionality that would otherwise be driven by a windowed application's
|
||
/// *event loop* or *message loop*.
|
||
}
|