bevyengine / bevyengine/bevy

RectLight panic if Transform scale is 0

Open
#25,308 1 comment 0 reactions 0 assignees View on GitHub
A-Rendering A-Transform C-Bug I-Crash S-Needs-Investigation
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.