RectLight panic if Transform scale is 0
- Dominant language
- Rust
- Stars
- 48.2k
- Forks
- 4.8k
- Avg merge
- 3d 16h
- Merged PRs (30d)
- 171
Description
## Bevy version and features
version: 0.19.0
features: area_light_luts, debug
## What you did
I've been playing around with `RectLight` for a project of mine and found out that it generates a panic if any axis of its `Transform` scale is set to zero.
Here's the minimal required code to reproduce it:
```rust
use bevy::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup_scene)
.run();
}
fn setup_scene(mut commands: Commands) {
commands.spawn((
Camera3d::default(),
Transform::from_translation(Vec3::new(0., 0., 10.)).looking_at(Vec3::ZERO, Vec3::Y),
));
commands.spawn((
RectLight::default(),
Transform::from_scale(Vec3::new(1., 0., 1.)),
));
}
```
## What went wrong
The code above generates a panic, with the following error:
```
thread 'Compute Task Pool (3)' (94093) panicked at /home/luca/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy_math-0.19.0/src/direction.rs:66:9:
Error: The vector given to `Dir3::new_unchecked` is not normalized. The length is NaN.
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Encountered a panic in system `bevy_pbr::render::light::prepare_lights`!
Encountered a panic in system `bevy_render::run_render_schedule`!
```
## Additional information
I've already tried using `f32::MIN` instead of `0.` as the scale value, the issue remains the same.
Here is the backtrace for the error above:
```
thread 'Compute Task Pool (5)' (97228) panicked at /home/luca/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy_math-0.19.0/src/direction.rs:66:9:
Error: The vector given to `Dir3::new_unchecked` is not normalized. The length is 0.
stack backtrace:
0: __rustc::rust_begin_unwind
at /rustc/1ed2df61a19042f231709eb05d032ae9e2cb2084/library/std/src/panicking.rs:679:5
1: core::panicking::panic_fmt
at /rustc/1ed2df61a19042f231709eb05d032ae9e2cb2084/library/core/src/panicking.rs:80:14
2: bevy_math::direction::assert_is_normalized
at /home/luca/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy_math-0.19.0/src/direction.rs:66:9
3: ::new_unchecked
at /home/luca/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy_math-0.19.0/src/direction.rs:574:9
4: ::up
at /home/luca/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy_transform-0.19.0/src/components/global_transform.rs:67:13
5: bevy_pbr::render::light::prepare_lights
at /home/luca/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy_pbr-0.19.0/src/render/light.rs:1945:43
6: , (bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res), bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, bevy_render::sync_world::MainEntity, &bevy_render::view::ExtractedView, &bevy_pbr::cluster::ExtractedClusterConfig, core::option::Option<&bevy_camera::visibility::render_layers::RenderLayers>, bevy_ecs::query::fetch::Has, core::option::Option<&bevy_light::ambient_light::AmbientLight>), bevy_ecs::query::filter::With>, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::ResMut>, (bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local>), (bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedPointLight, &mut bevy_pbr::render::light::PointAndSpotLightViewEntities, bevy_ecs::query::fetch::AnyOf<(&bevy_camera::primitives::CubemapFrusta, &bevy_camera::primitives::Frustum)>)>, bevy_ecs::system::query::Query<(), bevy_ecs::query::filter::Or<(bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed)>>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedDirectionalLight)>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedRectLight)>, bevy_ecs::system::query::Query<&mut bevy_pbr::render::light::DirectionalLightViewEntities>), bevy_ecs::change_detection::params::Res, (bevy_ecs::change_detection::params::Res, core::option::Option>), (bevy_ecs::system::query::Query<&bevy_pbr::render::light::ShadowView>, bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut))>>::call_mut
at /nix/store/3r7y1dsha6y2q9sp758g63fh52jx86q7-rust-mixed/lib/rustlib/src/rust/library/core/src/ops/function.rs:166:5
7: <&mut bevy_pbr::render::light::prepare_lights as core::ops::function::FnMut<(bevy_ecs::system::commands::Commands, bevy_ecs::change_detection::params::ResMut, (bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res), bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, bevy_render::sync_world::MainEntity, &bevy_render::view::ExtractedView, &bevy_pbr::cluster::ExtractedClusterConfig, core::option::Option<&bevy_camera::visibility::render_layers::RenderLayers>, bevy_ecs::query::fetch::Has, core::option::Option<&bevy_light::ambient_light::AmbientLight>), bevy_ecs::query::filter::With>, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::ResMut>, (bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local>), (bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedPointLight, &mut bevy_pbr::render::light::PointAndSpotLightViewEntities, bevy_ecs::query::fetch::AnyOf<(&bevy_camera::primitives::CubemapFrusta, &bevy_camera::primitives::Frustum)>)>, bevy_ecs::system::query::Query<(), bevy_ecs::query::filter::Or<(bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed)>>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedDirectionalLight)>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedRectLight)>, bevy_ecs::system::query::Query<&mut bevy_pbr::render::light::DirectionalLightViewEntities>), bevy_ecs::change_detection::params::Res, (bevy_ecs::change_detection::params::Res, core::option::Option>), (bevy_ecs::system::query::Query<&bevy_pbr::render::light::ShadowView>, bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut))>>::call_mut
at /nix/store/3r7y1dsha6y2q9sp758g63fh52jx86q7-rust-mixed/lib/rustlib/src/rust/library/core/src/ops/function.rs:298:21
8: <_ as bevy_ecs::system::function_system::SystemParamFunction _>>::run::call_inner::<(), bevy_ecs::system::commands::Commands, bevy_ecs::change_detection::params::ResMut, (bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res), bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, bevy_render::sync_world::MainEntity, &bevy_render::view::ExtractedView, &bevy_pbr::cluster::ExtractedClusterConfig, core::option::Option<&bevy_camera::visibility::render_layers::RenderLayers>, bevy_ecs::query::fetch::Has, core::option::Option<&bevy_light::ambient_light::AmbientLight>), bevy_ecs::query::filter::With>, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::ResMut>, (bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local>), (bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedPointLight, &mut bevy_pbr::render::light::PointAndSpotLightViewEntities, bevy_ecs::query::fetch::AnyOf<(&bevy_camera::primitives::CubemapFrusta, &bevy_camera::primitives::Frustum)>)>, bevy_ecs::system::query::Query<(), bevy_ecs::query::filter::Or<(bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed)>>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedDirectionalLight)>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedRectLight)>, bevy_ecs::system::query::Query<&mut bevy_pbr::render::light::DirectionalLightViewEntities>), bevy_ecs::change_detection::params::Res, (bevy_ecs::change_detection::params::Res, core::option::Option>), (bevy_ecs::system::query::Query<&bevy_pbr::render::light::ShadowView>, bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut), &mut bevy_pbr::render::light::prepare_lights>
at /home/luca/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy_ecs-0.19.0/src/system/function_system.rs:904:21
9: , (bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res), bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, bevy_render::sync_world::MainEntity, &bevy_render::view::ExtractedView, &bevy_pbr::cluster::ExtractedClusterConfig, core::option::Option<&bevy_camera::visibility::render_layers::RenderLayers>, bevy_ecs::query::fetch::Has, core::option::Option<&bevy_light::ambient_light::AmbientLight>), bevy_ecs::query::filter::With>, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::ResMut>, (bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local>), (bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedPointLight, &mut bevy_pbr::render::light::PointAndSpotLightViewEntities, bevy_ecs::query::fetch::AnyOf<(&bevy_camera::primitives::CubemapFrusta, &bevy_camera::primitives::Frustum)>)>, bevy_ecs::system::query::Query<(), bevy_ecs::query::filter::Or<(bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed)>>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedDirectionalLight)>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedRectLight)>, bevy_ecs::system::query::Query<&mut bevy_pbr::render::light::DirectionalLightViewEntities>), bevy_ecs::change_detection::params::Res, (bevy_ecs::change_detection::params::Res, core::option::Option>), (bevy_ecs::system::query::Query<&bevy_pbr::render::light::ShadowView>, bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut))>>::run
at /home/luca/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy_ecs-0.19.0/src/system/function_system.rs:907:17
10: , (bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res), bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, bevy_render::sync_world::MainEntity, &bevy_render::view::ExtractedView, &bevy_pbr::cluster::ExtractedClusterConfig, core::option::Option<&bevy_camera::visibility::render_layers::RenderLayers>, bevy_ecs::query::fetch::Has, core::option::Option<&bevy_light::ambient_light::AmbientLight>), bevy_ecs::query::filter::With>, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::Res, bevy_ecs::change_detection::params::ResMut>, (bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local, bevy_ecs::system::system_param::Local>), (bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedPointLight, &mut bevy_pbr::render::light::PointAndSpotLightViewEntities, bevy_ecs::query::fetch::AnyOf<(&bevy_camera::primitives::CubemapFrusta, &bevy_camera::primitives::Frustum)>)>, bevy_ecs::system::query::Query<(), bevy_ecs::query::filter::Or<(bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed, bevy_ecs::query::filter::Changed)>>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedDirectionalLight)>, bevy_ecs::system::query::Query<(bevy_ecs::entity::Entity, &bevy_render::sync_world::MainEntity, &bevy_pbr::render::light::ExtractedRectLight)>, bevy_ecs::system::query::Query<&mut bevy_pbr::render::light::DirectionalLightViewEntities>), bevy_ecs::change_detection::params::Res, (bevy_ecs::change_detection::params::Res, core::option::Option>), (bevy_ecs::system::query::Query<&bevy_pbr::render::light::ShadowView>, bevy_ecs::change_detection::params::ResMut, bevy_ecs::change_detection::params::ResMut)), (), (), bevy_pbr::render::light::prepare_lights> as bevy_ecs::system::system::System>::run_unsafe
at /home/luca/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bevy_ecs-0.19.0/src/system/function_system.rs:696:29
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
Encountered a panic in system `bevy_pbr::render::light::prepare_lights`!
Encountered a panic in system `bevy_render::run_render_schedule`!
```
Contributor guide
Research direction
Start with bevy_pbr::render::light::prepare_lights in bevy_pbr-0.19.0/src/render/light.rs, where the backtrace shows the panic, and trace its call to GlobalTransform::up in bevy_transform. Run the minimal RectLight example with a zero scale axis to reproduce it. Done means the example no longer panics for zero-scale RectLight transforms.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- computer-graphics, game-dev
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 66/100