mirror of
https://github.com/bevyengine/bevy
synced 2025-02-16 14:08:32 +00:00
# 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>
292 lines
9.9 KiB
TOML
292 lines
9.9 KiB
TOML
[package]
|
|
name = "bevy_internal"
|
|
version = "0.15.0-dev"
|
|
edition = "2021"
|
|
description = "An internal Bevy crate used to facilitate optional dynamic linking via the 'dynamic_linking' feature"
|
|
homepage = "https://bevyengine.org"
|
|
repository = "https://github.com/bevyengine/bevy"
|
|
license = "MIT OR Apache-2.0"
|
|
keywords = ["game", "engine", "gamedev", "graphics", "bevy"]
|
|
categories = ["game-engines", "graphics", "gui", "rendering"]
|
|
|
|
[features]
|
|
trace = [
|
|
"bevy_app/trace",
|
|
"bevy_asset?/trace",
|
|
"bevy_core_pipeline?/trace",
|
|
"bevy_ecs/trace",
|
|
"bevy_log/trace",
|
|
"bevy_pbr?/trace",
|
|
"bevy_render?/trace",
|
|
"bevy_hierarchy/trace",
|
|
"bevy_winit?/trace",
|
|
]
|
|
trace_chrome = ["bevy_log/tracing-chrome"]
|
|
trace_tracy = ["bevy_render?/tracing-tracy", "bevy_log/tracing-tracy"]
|
|
trace_tracy_memory = ["bevy_log/trace_tracy_memory"]
|
|
detailed_trace = ["bevy_utils/detailed_trace"]
|
|
|
|
sysinfo_plugin = ["bevy_diagnostic/sysinfo_plugin"]
|
|
|
|
# Texture formats that have specific rendering support (HDR enabled by default)
|
|
basis-universal = ["bevy_image/basis-universal", "bevy_render/basis-universal"]
|
|
dds = [
|
|
"bevy_image/dds",
|
|
"bevy_render/dds",
|
|
"bevy_core_pipeline/dds",
|
|
"bevy_gltf/dds",
|
|
]
|
|
exr = ["bevy_image/exr", "bevy_render/exr"]
|
|
hdr = ["bevy_image/hdr", "bevy_render/hdr"]
|
|
ktx2 = ["bevy_image/ktx2", "bevy_render/ktx2"]
|
|
|
|
# For ktx2 supercompression
|
|
zlib = ["bevy_image/zlib"]
|
|
zstd = ["bevy_image/zstd"]
|
|
|
|
# Image format support (PNG enabled by default)
|
|
avif = ["bevy_image/avif"]
|
|
bmp = ["bevy_image/bmp"]
|
|
ff = ["bevy_image/ff"]
|
|
gif = ["bevy_image/gif"]
|
|
ico = ["bevy_image/ico"]
|
|
jpeg = ["bevy_image/jpeg"]
|
|
png = ["bevy_image/png"]
|
|
pnm = ["bevy_image/pnm"]
|
|
qoi = ["bevy_image/qoi"]
|
|
tga = ["bevy_image/tga"]
|
|
tiff = ["bevy_image/tiff"]
|
|
webp = ["bevy_image/webp"]
|
|
|
|
# Enable SPIR-V passthrough
|
|
spirv_shader_passthrough = ["bevy_render/spirv_shader_passthrough"]
|
|
|
|
# Include tonemapping LUT KTX2 files.
|
|
tonemapping_luts = ["bevy_core_pipeline/tonemapping_luts"]
|
|
|
|
# Include SMAA LUT KTX2 Files
|
|
smaa_luts = ["bevy_core_pipeline/smaa_luts"]
|
|
|
|
# Audio format support (vorbis is enabled by default)
|
|
flac = ["bevy_audio/flac"]
|
|
mp3 = ["bevy_audio/mp3"]
|
|
vorbis = ["bevy_audio/vorbis"]
|
|
wav = ["bevy_audio/wav"]
|
|
minimp3 = ["bevy_audio/minimp3"]
|
|
symphonia-aac = ["bevy_audio/symphonia-aac"]
|
|
symphonia-all = ["bevy_audio/symphonia-all"]
|
|
symphonia-flac = ["bevy_audio/symphonia-flac"]
|
|
symphonia-isomp4 = ["bevy_audio/symphonia-isomp4"]
|
|
symphonia-vorbis = ["bevy_audio/symphonia-vorbis"]
|
|
symphonia-wav = ["bevy_audio/symphonia-wav"]
|
|
|
|
# Shader formats
|
|
shader_format_glsl = [
|
|
"bevy_render/shader_format_glsl",
|
|
"bevy_pbr?/shader_format_glsl",
|
|
]
|
|
shader_format_spirv = ["bevy_render/shader_format_spirv"]
|
|
|
|
serialize = [
|
|
"bevy_color?/serialize",
|
|
"bevy_core/serialize",
|
|
"bevy_ecs/serialize",
|
|
"bevy_input/serialize",
|
|
"bevy_math/serialize",
|
|
"bevy_scene?/serialize",
|
|
"bevy_sprite?/serialize",
|
|
"bevy_time/serialize",
|
|
"bevy_transform/serialize",
|
|
"bevy_ui?/serialize",
|
|
"bevy_window/serialize",
|
|
"bevy_winit?/serialize",
|
|
]
|
|
multi_threaded = [
|
|
"bevy_asset?/multi_threaded",
|
|
"bevy_ecs/multi_threaded",
|
|
"bevy_render?/multi_threaded",
|
|
"bevy_tasks/multi_threaded",
|
|
]
|
|
async-io = ["bevy_tasks/async-io"]
|
|
|
|
# Display server protocol support (X11 is enabled by default)
|
|
wayland = ["bevy_winit/wayland"]
|
|
x11 = ["bevy_winit/x11"]
|
|
|
|
# Android activity support (choose one)
|
|
android-native-activity = ["bevy_winit/android-native-activity"]
|
|
android-game-activity = ["bevy_winit/android-game-activity"]
|
|
|
|
# Transmission textures in `StandardMaterial`:
|
|
pbr_transmission_textures = [
|
|
"bevy_pbr?/pbr_transmission_textures",
|
|
"bevy_gltf?/pbr_transmission_textures",
|
|
]
|
|
|
|
# Multi-layer material textures in `StandardMaterial`:
|
|
pbr_multi_layer_material_textures = [
|
|
"bevy_pbr?/pbr_multi_layer_material_textures",
|
|
"bevy_gltf?/pbr_multi_layer_material_textures",
|
|
]
|
|
|
|
# Anisotropy texture in `StandardMaterial`:
|
|
pbr_anisotropy_texture = [
|
|
"bevy_pbr?/pbr_anisotropy_texture",
|
|
"bevy_gltf?/pbr_anisotropy_texture",
|
|
]
|
|
|
|
# Optimise for WebGL2
|
|
webgl = [
|
|
"bevy_core_pipeline?/webgl",
|
|
"bevy_pbr?/webgl",
|
|
"bevy_render?/webgl",
|
|
"bevy_gizmos?/webgl",
|
|
"bevy_sprite?/webgl",
|
|
]
|
|
|
|
webgpu = [
|
|
"bevy_core_pipeline?/webgpu",
|
|
"bevy_pbr?/webgpu",
|
|
"bevy_render?/webgpu",
|
|
"bevy_gizmos?/webgpu",
|
|
"bevy_sprite?/webgpu",
|
|
]
|
|
|
|
# enable systems that allow for automated testing on CI
|
|
bevy_ci_testing = ["bevy_dev_tools/bevy_ci_testing", "bevy_render?/ci_limits"]
|
|
|
|
# Enable animation support, and glTF animation loading
|
|
animation = ["bevy_animation", "bevy_gltf?/bevy_animation"]
|
|
|
|
bevy_sprite = ["dep:bevy_sprite", "bevy_gizmos?/bevy_sprite"]
|
|
bevy_pbr = ["dep:bevy_pbr", "bevy_gizmos?/bevy_pbr"]
|
|
|
|
# Used to disable code that is unsupported when Bevy is dynamically linked
|
|
dynamic_linking = ["bevy_diagnostic/dynamic_linking"]
|
|
|
|
# Enable using a shared stdlib for cxx on Android.
|
|
android_shared_stdcxx = ["bevy_audio/android_shared_stdcxx"]
|
|
|
|
# Enable AccessKit on Unix backends (currently only works with experimental
|
|
# screen readers and forks.)
|
|
accesskit_unix = ["bevy_winit/accesskit_unix"]
|
|
|
|
bevy_text = ["dep:bevy_text", "bevy_ui?/bevy_text"]
|
|
|
|
bevy_render = [
|
|
"dep:bevy_render",
|
|
"bevy_scene?/bevy_render",
|
|
"bevy_gizmos?/bevy_render",
|
|
]
|
|
|
|
# Enable assertions to check the validity of parameters passed to glam
|
|
glam_assert = ["bevy_math/glam_assert"]
|
|
|
|
# Enable assertions in debug builds to check the validity of parameters passed to glam
|
|
debug_glam_assert = ["bevy_math/debug_glam_assert"]
|
|
|
|
default_font = ["bevy_text?/default_font"]
|
|
|
|
# Enables the built-in asset processor for processed assets.
|
|
asset_processor = ["bevy_asset?/asset_processor"]
|
|
|
|
# Enables watching the filesystem for Bevy Asset hot-reloading
|
|
file_watcher = ["bevy_asset?/file_watcher"]
|
|
|
|
# Enables watching embedded files for Bevy Asset hot-reloading
|
|
embedded_watcher = ["bevy_asset?/embedded_watcher"]
|
|
|
|
# Enable system stepping support
|
|
bevy_debug_stepping = [
|
|
"bevy_ecs/bevy_debug_stepping",
|
|
"bevy_app/bevy_debug_stepping",
|
|
]
|
|
|
|
# Enables the meshlet renderer for dense high-poly scenes (experimental)
|
|
meshlet = ["bevy_pbr?/meshlet"]
|
|
|
|
# Enables processing meshes into meshlet meshes for bevy_pbr
|
|
meshlet_processor = ["bevy_pbr?/meshlet_processor"]
|
|
|
|
# Provides a collection of developer tools
|
|
bevy_dev_tools = ["dep:bevy_dev_tools"]
|
|
|
|
# Enable support for the Bevy Remote Protocol
|
|
bevy_remote = ["dep:bevy_remote"]
|
|
|
|
# Provides picking functionality
|
|
bevy_picking = [
|
|
"dep:bevy_picking",
|
|
"bevy_picking/bevy_mesh",
|
|
"bevy_ui?/bevy_picking",
|
|
"bevy_sprite?/bevy_picking",
|
|
]
|
|
|
|
# Enable support for the ios_simulator by downgrading some rendering capabilities
|
|
ios_simulator = ["bevy_pbr?/ios_simulator", "bevy_render?/ios_simulator"]
|
|
|
|
# Enable built in global state machines
|
|
bevy_state = ["dep:bevy_state"]
|
|
|
|
# Enables source location tracking for change detection, which can assist with debugging
|
|
track_change_detection = ["bevy_ecs/track_change_detection"]
|
|
|
|
# Enable function reflection
|
|
reflect_functions = [
|
|
"bevy_reflect/functions",
|
|
"bevy_app/reflect_functions",
|
|
"bevy_ecs/reflect_functions",
|
|
]
|
|
|
|
# Enable winit custom cursor support
|
|
custom_cursor = ["bevy_winit/custom_cursor"]
|
|
|
|
[dependencies]
|
|
# bevy
|
|
bevy_a11y = { path = "../bevy_a11y", version = "0.15.0-dev" }
|
|
bevy_app = { path = "../bevy_app", version = "0.15.0-dev" }
|
|
bevy_core = { path = "../bevy_core", version = "0.15.0-dev" }
|
|
bevy_derive = { path = "../bevy_derive", version = "0.15.0-dev" }
|
|
bevy_diagnostic = { path = "../bevy_diagnostic", version = "0.15.0-dev" }
|
|
bevy_ecs = { path = "../bevy_ecs", version = "0.15.0-dev" }
|
|
bevy_state = { path = "../bevy_state", optional = true, version = "0.15.0-dev" }
|
|
bevy_hierarchy = { path = "../bevy_hierarchy", version = "0.15.0-dev" }
|
|
bevy_input = { path = "../bevy_input", version = "0.15.0-dev" }
|
|
bevy_log = { path = "../bevy_log", version = "0.15.0-dev" }
|
|
bevy_math = { path = "../bevy_math", version = "0.15.0-dev" }
|
|
bevy_ptr = { path = "../bevy_ptr", version = "0.15.0-dev" }
|
|
bevy_reflect = { path = "../bevy_reflect", version = "0.15.0-dev", features = [
|
|
"bevy",
|
|
] }
|
|
bevy_time = { path = "../bevy_time", version = "0.15.0-dev" }
|
|
bevy_transform = { path = "../bevy_transform", version = "0.15.0-dev" }
|
|
bevy_utils = { path = "../bevy_utils", version = "0.15.0-dev" }
|
|
bevy_window = { path = "../bevy_window", version = "0.15.0-dev" }
|
|
bevy_tasks = { path = "../bevy_tasks", version = "0.15.0-dev" }
|
|
# bevy (optional)
|
|
bevy_animation = { path = "../bevy_animation", optional = true, version = "0.15.0-dev" }
|
|
bevy_asset = { path = "../bevy_asset", optional = true, version = "0.15.0-dev" }
|
|
bevy_audio = { path = "../bevy_audio", optional = true, version = "0.15.0-dev" }
|
|
bevy_color = { path = "../bevy_color", optional = true, version = "0.15.0-dev" }
|
|
bevy_core_pipeline = { path = "../bevy_core_pipeline", optional = true, version = "0.15.0-dev" }
|
|
bevy_dev_tools = { path = "../bevy_dev_tools", optional = true, version = "0.15.0-dev" }
|
|
bevy_gilrs = { path = "../bevy_gilrs", optional = true, version = "0.15.0-dev" }
|
|
bevy_gizmos = { path = "../bevy_gizmos", optional = true, version = "0.15.0-dev", default-features = false }
|
|
bevy_gltf = { path = "../bevy_gltf", optional = true, version = "0.15.0-dev" }
|
|
bevy_image = { path = "../bevy_image", optional = true, version = "0.15.0-dev" }
|
|
bevy_pbr = { path = "../bevy_pbr", optional = true, version = "0.15.0-dev" }
|
|
bevy_picking = { path = "../bevy_picking", optional = true, version = "0.15.0-dev" }
|
|
bevy_remote = { path = "../bevy_remote", optional = true, version = "0.15.0-dev" }
|
|
bevy_render = { path = "../bevy_render", optional = true, version = "0.15.0-dev" }
|
|
bevy_scene = { path = "../bevy_scene", optional = true, version = "0.15.0-dev" }
|
|
bevy_sprite = { path = "../bevy_sprite", optional = true, version = "0.15.0-dev" }
|
|
bevy_text = { path = "../bevy_text", optional = true, version = "0.15.0-dev" }
|
|
bevy_ui = { path = "../bevy_ui", optional = true, version = "0.15.0-dev" }
|
|
bevy_winit = { path = "../bevy_winit", optional = true, version = "0.15.0-dev" }
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[package.metadata.docs.rs]
|
|
rustdoc-args = ["-Zunstable-options", "--generate-link-to-definition"]
|
|
all-features = true
|