bevy/errors/B0004.md
Joona Aalto 0166db33f7
Deprecate shapes in bevy_render::mesh::shape (#11773)
# Objective

#11431 and #11688 implemented meshing support for Bevy's new geometric
primitives. The next step is to deprecate the shapes in
`bevy_render::mesh::shape` and to later remove them completely for 0.14.

## Solution

Deprecate the shapes and reduce code duplication by utilizing the
primitive meshing API for the old shapes where possible.

Note that some shapes have behavior that can't be exactly reproduced
with the new primitives yet:

- `Box` is more of an AABB with min/max extents
- `Plane` supports a subdivision count
- `Quad` has a `flipped` property

These types have not been changed to utilize the new primitives yet.

---

## Changelog

- Deprecated all shapes in `bevy_render::mesh::shape`
- Changed all examples to use new primitives for meshing

## Migration Guide

Bevy has previously used rendering-specific types like `UVSphere` and
`Quad` for primitive mesh shapes. These have now been deprecated to use
the geometric primitives newly introduced in version 0.13.

Some examples:

```rust
let before = meshes.add(shape::Box::new(5.0, 0.15, 5.0));
let after = meshes.add(Cuboid::new(5.0, 0.15, 5.0));

let before = meshes.add(shape::Quad::default());
let after = meshes.add(Rectangle::default());

let before = meshes.add(shape::Plane::from_size(5.0));
// The surface normal can now also be specified when using `new`
let after = meshes.add(Plane3d::default().mesh().size(5.0, 5.0));

let before = meshes.add(
    Mesh::try_from(shape::Icosphere {
        radius: 0.5,
        subdivisions: 5,
    })
    .unwrap(),
);
let after = meshes.add(Sphere::new(0.5).mesh().ico(5).unwrap());
```
2024-02-08 18:01:34 +00:00

3.9 KiB

B0004

A runtime warning.

An Entity with a hierarchy-inherited component has a Parent without the hierarchy-inherited component in question.

The hierarchy-inherited components defined in bevy include:

Third party plugins may also define their own hierarchy components, so read the warning message carefully and pay attention to the exact type of the missing component.

To fix this warning, add the missing hierarchy component to all ancestors of entities with the hierarchy component you wish to use.

The following code will cause a warning to be emitted:

use bevy::prelude::*;

// WARNING: this code is buggy
fn setup_cube(
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {
    commands
        .spawn(TransformBundle::default())
        .with_children(|parent| {
            // cube
            parent.spawn(PbrBundle {
                mesh: meshes.add(Cuboid::default()),
                material: materials.add(Color::rgb(0.8, 0.7, 0.6)),
                transform: Transform::from_xyz(0.0, 0.5, 0.0),
                ..default()
            });
        });

    // camera
    commands.spawn(Camera3dBundle {
        transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
        ..default()
    });
}

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Startup, setup_cube)
        .run();
}

This code will not show a cube on screen. This is because the entity spawned with commands.spawn(…) doesn't have a ViewVisibility or InheritedVisibility component. Since the cube is spawned as a child of an entity without the visibility components, it will not be visible at all.

To fix this, you must use SpatialBundle over TransformBundle, as follows:

use bevy::prelude::*;

fn setup_cube(
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {
    commands
        // We use SpatialBundle instead of TransformBundle, it contains the
        // visibility components needed to display the cube,
        // In addition to the Transform and GlobalTransform components.
        .spawn(SpatialBundle::default())
        .with_children(|parent| {
            // cube
            parent.spawn(PbrBundle {
                mesh: meshes.add(Cuboid::default()),
                material: materials.add(Color::rgb(0.8, 0.7, 0.6)),
                transform: Transform::from_xyz(0.0, 0.5, 0.0),
                ..default()
            });
        });

    // camera
    commands.spawn(Camera3dBundle {
        transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
        ..default()
    });
}

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Startup, setup_cube)
        .run();
}

A similar problem occurs when the GlobalTransform component is missing. However, when a parent GlobalTransform is missing, it will simply prevent all transform propagation, including when updating the Transform component of the child.

You will most likely encounter this warning when loading a scene as a child of a pre-existing Entity that does not have the proper components.