bevy/docs/cargo_features.md
Joona Aalto 0e30b68b20
Add mesh picking backend and MeshRayCast system parameter (#15800)
# Objective

Closes #15545.

`bevy_picking` supports UI and sprite picking, but not mesh picking.
Being able to pick meshes would be extremely useful for various games,
tools, and our own examples, as well as scene editors and inspectors.
So, we need a mesh picking backend!

Luckily,
[`bevy_mod_picking`](https://github.com/aevyrie/bevy_mod_picking) (which
`bevy_picking` is based on) by @aevyrie already has a [backend for
it](74f0c3c0fb/backends/bevy_picking_raycast/src/lib.rs)
using [`bevy_mod_raycast`](https://github.com/aevyrie/bevy_mod_raycast).
As a side product of adding mesh picking, we also get support for
performing ray casts on meshes!

## Solution

Upstream a large chunk of the immediate-mode ray casting functionality
from `bevy_mod_raycast`, and add a mesh picking backend based on
`bevy_mod_picking`. Huge thanks to @aevyrie who did all the hard work on
these incredible crates!

All meshes are pickable by default. Picking can be disabled for
individual entities by adding `PickingBehavior::IGNORE`, like normal.
Or, if you want mesh picking to be entirely opt-in, you can set
`MeshPickingBackendSettings::require_markers` to `true` and add a
`RayCastPickable` component to the desired camera and target entities.

You can also use the new `MeshRayCast` system parameter to cast rays
into the world manually:

```rust
fn ray_cast_system(mut ray_cast: MeshRayCast, foo_query: Query<(), With<Foo>>) {
    let ray = Ray3d::new(Vec3::ZERO, Dir3::X);

    // Only ray cast against entities with the `Foo` component.
    let filter = |entity| foo_query.contains(entity);

    // Never early-exit. Note that you can change behavior per-entity.
    let early_exit_test = |_entity| false;

    // Ignore the visibility of entities. This allows ray casting hidden entities.
    let visibility = RayCastVisibility::Any;

    let settings = RayCastSettings::default()
        .with_filter(&filter)
        .with_early_exit_test(&early_exit_test)
        .with_visibility(visibility);

    // Cast the ray with the settings, returning a list of intersections.
    let hits = ray_cast.cast_ray(ray, &settings);
}
```

This is largely a direct port, but I did make several changes to match
our APIs better, remove things we don't need or that I think are
unnecessary, and do some general improvements to code quality and
documentation.

### Changes Relative to `bevy_mod_raycast` and `bevy_mod_picking`

- Every `Raycast` and "raycast" has been renamed to `RayCast` and "ray
cast" (similar reasoning as the "Naming" section in #15724)
- `Raycast` system param has been renamed to `MeshRayCast` to avoid
naming conflicts and to be explicit that it is not for colliders
- `RaycastBackend` has been renamed to `MeshPickingBackend`
- `RayCastVisibility` variants are now `Any`, `Visible`, and
`VisibleInView` instead of `Ignore`, `MustBeVisible`, and
`MustBeVisibleAndInView`
- `NoBackfaceCulling` has been renamed to `RayCastBackfaces`, to avoid
implying that it affects the rendering of backfaces for meshes (it
doesn't)
- `SimplifiedMesh` and `RayCastBackfaces` live near other ray casting
API types, not in their own 10 LoC module
- All intersection logic and types are in the same `intersections`
module, not split across several modules
- Some intersection types have been renamed to be clearer and more
consistent
	- `IntersectionData` -> `RayMeshHit` 
	- `RayHit` -> `RayTriangleHit`
- General documentation and code quality improvements

### Removed / Not Ported

- Removed unused ray helpers and types, like `PrimitiveIntersection`
- Removed getters on intersection types, and made their properties
public
- There is no `2d` feature, and `Raycast::mesh_query` and
`Raycast::mesh2d_query` have been merged into `MeshRayCast::mesh_query`,
which handles both 2D and 3D
- I assume this existed previously because `Mesh2dHandle` used to be in
`bevy_sprite`. Now both the 2D and 3D mesh are in `bevy_render`.
- There is no `debug` feature or ray debug rendering
- There is no deferred API (`RaycastSource`)
- There is no `CursorRayPlugin` (the picking backend handles this)

### Note for Reviewers

In case it's helpful, the [first
commit](281638ef10)
here is essentially a one-to-one port. The rest of the commits are
primarily refactoring and cleaning things up in the ways listed earlier,
as well as changes to the module structure.

It may also be useful to compare the original [picking
backend](74f0c3c0fb/backends/bevy_picking_raycast/src/lib.rs)
and [`bevy_mod_raycast`](https://github.com/aevyrie/bevy_mod_raycast) to
this PR. Feel free to mention if there are any changes that I should
revert or something I should not include in this PR.

## Testing

I tested mesh picking and relevant components in some examples, for both
2D and 3D meshes, and added a new `mesh_picking` example. I also
~~stole~~ ported over the [ray-mesh intersection
benchmark](dbc5ef32fe/benches/ray_mesh_intersection.rs)
from `bevy_mod_raycast`.

---

## Showcase

Below is a version of the `2d_shapes` example modified to demonstrate 2D
mesh picking. This is not included in this PR.


https://github.com/user-attachments/assets/7742528c-8630-4c00-bacd-81576ac432bf

And below is the new `mesh_picking` example:


https://github.com/user-attachments/assets/b65c7a5a-fa3a-4c2d-8bbd-e7a2c772986e

There is also a really cool new `mesh_ray_cast` example ported over from
`bevy_mod_raycast`:


https://github.com/user-attachments/assets/3c5eb6c0-bd94-4fb0-bec6-8a85668a06c9

---------

Co-authored-by: Aevyrie <aevyrie@gmail.com>
Co-authored-by: Trent <2771466+tbillington@users.noreply.github.com>
Co-authored-by: François Mockers <mockersf@gmail.com>
2024-10-13 17:24:19 +00:00

7 KiB

Cargo Features

Bevy exposes many features to customise the engine. Enabling them add functionalities but often come at the cost of longer compilation times and extra dependencies.

Default Features

The default feature set enables most of the expected features of a game engine, like rendering in both 2D and 3D, asset loading, audio and UI. To help reduce compilation time, consider disabling default features and enabling only those you need.

feature name description
android-game-activity Android GameActivity support. Default, choose between this and android-native-activity.
android_shared_stdcxx Enable using a shared stdlib for cxx on Android
animation Enable animation support, and glTF animation loading
bevy_animation Provides animation functionality
bevy_asset Provides asset functionality
bevy_audio Provides audio functionality
bevy_color Provides shared color types and operations
bevy_core_pipeline Provides cameras and other basic render pipeline features
bevy_gilrs Adds gamepad support
bevy_gizmos Adds support for rendering gizmos
bevy_gltf glTF support
bevy_mesh_picking_backend Provides an implementation for picking meshes
bevy_pbr Adds PBR rendering
bevy_picking Provides picking functionality
bevy_remote Enable the Bevy Remote Protocol
bevy_render Provides rendering functionality
bevy_scene Provides scene functionality
bevy_sprite Provides sprite functionality
bevy_sprite_picking_backend Provides an implementation for picking sprites
bevy_state Enable built in global state machines
bevy_text Provides text functionality
bevy_ui A custom ECS-driven UI framework
bevy_ui_picking_backend Provides an implementation for picking ui
bevy_winit winit window and input backend
custom_cursor Enable winit custom cursor support
default_font Include a default font, containing only ASCII characters, at the cost of a 20kB binary size increase
hdr HDR image format support
ktx2 KTX2 compressed texture support
multi_threaded Enables multithreaded parallelism in the engine. Disabling it forces all engine tasks to run on a single thread.
png PNG image format support
smaa_luts Include SMAA Look Up Tables KTX2 Files
sysinfo_plugin Enables system information diagnostic plugin
tonemapping_luts Include tonemapping Look Up Tables KTX2 files. If everything is pink, you need to enable this feature or change the Tonemapping method for your Camera2d or Camera3d.
vorbis OGG/VORBIS audio format support
webgl2 Enable some limitations to be able to use WebGL2. Please refer to the WebGL2 and WebGPU section of the examples README for more information on how to run Wasm builds with WebGPU.
x11 X11 display server support
zstd For KTX2 supercompression

Optional Features

feature name description
accesskit_unix Enable AccessKit on Unix backends (currently only works with experimental screen readers and forks.)
android-native-activity Android NativeActivity support. Legacy, should be avoided for most new Android games.
asset_processor Enables the built-in asset processor for processed assets.
async-io Use async-io's implementation of block_on instead of futures-lite's implementation. This is preferred if your application uses async-io.
avif AVIF image format support
basis-universal Basis Universal compressed texture support
bevy_ci_testing Enable systems that allow for automated testing on CI
bevy_debug_stepping Enable stepping-based debugging of Bevy systems
bevy_dev_tools Provides a collection of developer tools
bmp BMP image format support
dds DDS compressed texture support
debug_glam_assert Enable assertions in debug builds to check the validity of parameters passed to glam
detailed_trace Enable detailed trace event logging. These trace events are expensive even when off, thus they require compile time opt-in
dynamic_linking Force dynamic linking, which improves iterative compile times
embedded_watcher Enables watching in memory asset providers for Bevy Asset hot-reloading
exr EXR image format support
ff Farbfeld image format support
file_watcher Enables watching the filesystem for Bevy Asset hot-reloading
flac FLAC audio format support
gif GIF image format support
glam_assert Enable assertions to check the validity of parameters passed to glam
ico ICO image format support
ios_simulator Enable support for the ios_simulator by downgrading some rendering capabilities
jpeg JPEG image format support
meshlet Enables the meshlet renderer for dense high-poly scenes (experimental)
meshlet_processor Enables processing meshes into meshlet meshes for bevy_pbr
minimp3 MP3 audio format support (through minimp3)
mp3 MP3 audio format support
pbr_anisotropy_texture Enable support for anisotropy texture in the StandardMaterial, at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs
pbr_multi_layer_material_textures Enable support for multi-layer material textures in the StandardMaterial, at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs
pbr_transmission_textures Enable support for transmission-related textures in the StandardMaterial, at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs
pnm PNM image format support, includes pam, pbm, pgm and ppm
qoi QOI image format support
reflect_functions Enable function reflection
serialize Enable serialization support through serde
shader_format_glsl Enable support for shaders in GLSL
shader_format_spirv Enable support for shaders in SPIR-V
spirv_shader_passthrough Enable passthrough loading for SPIR-V shaders (Only supported on Vulkan, shader capabilities and extensions must agree with the platform implementation)
symphonia-aac AAC audio format support (through symphonia)
symphonia-all AAC, FLAC, MP3, MP4, OGG/VORBIS, and WAV audio formats support (through symphonia)
symphonia-flac FLAC audio format support (through symphonia)
symphonia-isomp4 MP4 audio format support (through symphonia)
symphonia-vorbis OGG/VORBIS audio format support (through symphonia)
symphonia-wav WAV audio format support (through symphonia)
tga TGA image format support
tiff TIFF image format support
trace Tracing support
trace_chrome Tracing support, saving a file in Chrome Tracing format
trace_tracy Tracing support, exposing a port for Tracy
trace_tracy_memory Tracing support, with memory profiling, exposing a port for Tracy
track_change_detection Enables source location tracking for change detection, which can assist with debugging
wav WAV audio format support
wayland Wayland display server support
webgpu Enable support for WebGPU in Wasm. When enabled, this feature will override the webgl2 feature and you won't be able to run Wasm builds with WebGL2, only with WebGPU.
webp WebP image format support
zlib For KTX2 supercompression