Commit Graph

9342 Commits

Author SHA1 Message Date
Tim
18abe7763a
Merge 77bc7a5ec2 into 877d278785 2025-07-18 00:01:01 +02:00
Carter Anderson
877d278785
Remove unnecessary + use<> (#20180)
# Objective

Including `use<>` where it is not needed is abhorrent to my
sensibilities

## Solution

Begone foul demon!
2025-07-17 21:36:24 +00:00
Conner Petzold
ebf6bf6ea9
TilemapChunk single quad; TileData (color/visibility) (#19924)
# Objective

- Use a single quad to render a TilemapChunk
- Add support for tile color and visibility

## Testing

- Tested using example -- there doesn't appear to be any visual tile
bleeding or rounding issues. Open to ideas on further testing
2025-07-17 19:37:40 +00:00
Chris Russell
25cb339a12
Don't ignore default query filters for EntityRef or EntityMut (#20163)
# Objective

Don't ignore default query filters for `EntityRef` or `EntityMut`.

Currently, `Query<EntityRef>` will include entities with a `Disabled`
component, even though queries like `Query<()>` or `Query<Entity>` would
not. This was noticed in
https://github.com/bevyengine/bevy/pull/19711#discussion_r2205981065.

## Solution

Change `Access::contains` to completely ignore read access and just look
at filters and archetypal access. Filters covers `With`, `Without`, `&`,
and `&mut`, while archetypal covers `Has` and `Allows`.

Note that `Option<&Disabled>` will no longer count as a use of
`Disabled`, though.
2025-07-17 19:23:41 +00:00
Waridley
9e1e8bc1bc
Add angle-weighted smooth normals implementation (#18383) (#18552)
# Objective

Closes #18383 

## Solution

Given the 2 votes (me and @komadori ) for making angle-weighted normals
the default, I went ahead and did so, moving the face-weighted
implementation to the new `Mesh::compute_face_weighted_normals` method.
I factored out the common code between both into
`Mesh::compute_custom_smooth_normals`, which I went ahead and made
public to make it easier for users to add any other weighting methods
they might come up with.

If any of these decisions are undesirable for any reason, please let me
know and I will gladly make modifications.

## Testing & Showcase

I made a demo that exaggerates the difference at
[Waridley/bevy_smooth_normals_comparison](https://github.com/Waridley/bevy_smooth_normals_comparison).
Screenshots included in the readme.

Another way it could be demonstrated is via scaling a mesh along its
normals, like for generating outline meshes with inverted faces. I'd be
willing to make a demo for that as well.

I also edited and renamed the `compute_smooth_normals` tests to use
face-weighted normals, and added a new test for angle-weighted ones
which validates that all normals of a unit cube have each component
equal to `(±1 / √3) ± f32::EPSILON`.

## Migration Guide

#16050 already did not mention a migration guide, and it is not even in
a stable release yet. If this lands in a 0.16 RC, updating from RC1
would probably not require any changes in the vast majority of cases,
anyway. If someone really needs face-weighted normals, they can switch
to `.compute_face_weighted_normals()` or
`.with_computed_face_weighted_normals()`. And if for some reason they
really liked the old count-weighted implementation from 0.15, there is
an example in the docs for `compute_custom_smooth_normals`.
2025-07-17 19:23:30 +00:00
Tim
77bc7a5ec2
Merge branch 'main' into split-observer-events 2025-07-17 17:09:55 +02:00
Tim
1a0191ff75
Undo newline in lib.rs 2025-07-17 17:09:40 +02:00
Tim Blackbird
f17ecc8d89 Add observer_no_target test back 2025-07-17 16:51:34 +02:00
Tim Blackbird
21602eab7f Moar doc fixes 2025-07-17 16:51:27 +02:00
Tim Blackbird
1b1283a6f8 Revert some unnecessary changes 2025-07-17 16:24:45 +02:00
Tim Blackbird
42232dd087 missed rename 2025-07-17 16:24:26 +02:00
Tim Blackbird
e50a4d7ac4 More documentation work 2025-07-17 16:24:01 +02:00
Tim Blackbird
d7b76314d5 Fix markdown errors 2025-07-17 15:00:43 +02:00
Tim Blackbird
15ffea3884 docs! 2025-07-17 14:56:28 +02:00
Tim Blackbird
1161216938 Revert changes related mutual exclusivity + minor docs and release note changes 2025-07-17 14:02:26 +02:00
Pnoenix
f964ee1e3a
Expand MergeMeshError to include IncompatiblePrimitiveTopology variant (#18561)
# Objective

Fix #18546 by adding a variant to `MergeMeshError`, for incompatible
primitive topologies.

## Solution

Made `MergeMeshError` into an enum with two variants;
`IncompatibleVertexAttributes` and `IncompatiblePrimitiveTopology`.
Added an if statement in `Mesh::merge` to check if the
`primitive_topology` field of `self` matches `other`.
Also renamed `MergeMeshError` to `MeshMergeError` to align with the two
other `MeshSomethingError`'s.

## Testing

Didn't do any.
2025-07-16 20:37:58 +00:00
Steve Alexander
713acc2e6d
Change event to event_key where it refers to an EventKey (#20060)
# Objective

The ECS code to do with Observers was recently refactored to use an
`EventKey` newtype. On reading through the PR, I was a bit confused that
sometimes a variable called `event` refers to an `Event` and sometimes
it refers to an `EventKey`. I think the code is clearer when `event`
refers to an `Event` and `event_key` refers to an `EventKey`.

## Solution

This PR renames some uses of `event` to `event_key`.

## Testing

- Did you test these changes? If so, how?

I ran `cargo run -p ci -- tests`

- Are there any parts that need more testing?

No

- How can other people (reviewers) test your changes? Is there anything
specific they need to know?

No.

- If relevant, what platforms did you test these changes on, and are
there any important ones you can't test?

Probably not relevant, but MacOS.

---------

Co-authored-by: Steve Alexander <steve.alexander@priva.com>
2025-07-16 18:19:30 +00:00
tomaspecl
2bcd85421e
Documentation improvement system_param.rs (#20157)
# Objective
Improvement of the documentation for SystemParam derive section so that
it mentions how to use a Query<&SomeComponent> as a SystemParam for a
struct that should have #[derive(SystemParam)].

## Solution
Added the documentation

---

## Showcase
the previous documentation
```rust
Query<'w, 's, Entity>,
Res<'w, SomeResource>,
ResMut<'w, SomeOtherResource>,
Local<'s, u8>,
Commands<'w, 's>,
EventReader<'w, 's, SomeEvent>,
EventWriter<'w, SomeEvent>
```
the new documentation
```rust
Query<'w, 's, Entity>,
Query<'w, 's, &'static SomeComponent>,  <================== the new thing
Res<'w, SomeResource>,
ResMut<'w, SomeOtherResource>,
Local<'s, u8>,
Commands<'w, 's>,
EventReader<'w, 's, SomeEvent>,
EventWriter<'w, SomeEvent>
```
2025-07-16 17:58:18 +00:00
BigWingBeat
e7c14bd06b
Add EntityWorldMut::(try_)resource_scope (#20162)
# Objective

Fixes #20139

## Solution

Implement the methods, and leverage them where applicable

## Testing

Added unit tests

---

## Showcase

```rust
let id = entity_world_mut.id();
let world = entity_world_mut.into_world_mut();
world.resource_scope::<_, _>(|world, res| {
    let entity_world_mut = world.entity_mut(id);
    /* ... */
});
```

becomes

```rust
entity_world_mut.resource_scope::<_, _>(|entity, res| {
    /* ... */
});
```
2025-07-16 17:37:25 +00:00
robtfm
d28d18e2ff
fix crash in light textures example (#20161)
# Objective

scaling the point light to zero caused a crash

## Solution

clamp the scale for all the lights
2025-07-16 16:42:40 +00:00
Tyler Critchlow
3fc49f00c1
Preconvert colors before sending to shader (#20074)
# Objective

- Fixes #20008 - Preconvert colors before sending them to the UI
gradients shader for better performance

  ## Solution

- Modified `prepare_gradient` in `gradient.rs` to convert colors from
`LinearRgba` to `Srgba` on the CPU before sending to the GPU
- Updated the gradient shader to remove per-pixel color space
conversions since colors are now pre-converted
  - Added documentation to clarify that vertex colors are in sRGB space

This optimization reduces the number of power operations per pixel from
3 to 1:
- **Before**: Convert start color to sRGB, convert end color to sRGB,
mix, convert back to linear (3 pow operations per pixel)
- **After**: Colors pre-converted on CPU, mix in sRGB space, convert
back to linear (1 pow operation per pixel)

  ## Testing

- Verified that the UI gradient examples (`cargo run --example
gradients`) compile and render correctly
- The visual output should remain identical while performance improves,
especially for large gradient areas
- Changes maintain the same color interpolation behavior (mixing in sRGB
space)

  To test:
1. Run `cargo run --example gradients` or `cargo run --example
stacked_gradients`
  2. Verify gradients render correctly

---------

Co-authored-by: ickshonpe <david.curthoys@googlemail.com>
2025-07-16 16:06:45 +00:00
Lenchog
8e14d99fb9
Added finish method for timer (#20154)
# Objective

- Add an easy way to finish a Timer

## Solution

- Tick the timer by the remaining time

## Testing

I have not tested, but it should work
---

## Showcase

```rust
let mut timer = Timer::from_seconds(1.5, TimerMode::Once);
timer.finish();
assert_eq!(timer.remaining(), Duration::from_secs(0))
```

---------

Co-authored-by: Jan Hohenheim <jan@hohenheim.ch>
Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
2025-07-15 22:57:57 +00:00
Tim
779e4535d9
Update event_split.md 2025-07-15 20:51:04 +02:00
Tim Blackbird
060c183fe3 Hide associated type Kind as implementation detail 2025-07-15 20:45:46 +02:00
Tim Blackbird
8035f60e91 Temporarily disable targetless SceneInstanceReady event 2025-07-15 20:21:04 +02:00
Tim Blackbird
26235156bc Adjust release note 2025-07-15 20:19:47 +02:00
Tim Blackbird
d80e61b8a4 Adjust docs and target getters of On and ObserverTrigger 2025-07-15 20:18:58 +02:00
Tim Blackbird
bd812cd9e0 Make BroadcastEvent and EntityEvent mutually exclusive 2025-07-15 20:18:01 +02:00
Tim Blackbird
9154556d97 docs fixes 2025-07-15 20:16:43 +02:00
Tim Blackbird
4d82820e97 Split new BroadcastEvent trait from Event 2025-07-15 19:36:04 +02:00
ickshonpe
d195116426
Improved UI scrolling support and bug fixes (#20093)
# Objective

#### Goals
* Stop layout updates from overwriting `ScrollPosition`.
* Make `ScrollPosition` respect scale factor.
* Automatically allocate space for a scrollbar on an axis when
`OverflowAxis::Scroll` is set.
 
#### Non-Goals
* Overflow-auto support (I was certain Taffy had this already, but
apparently I was hallucinating).
* Implement any sort of scrollbar widgets.
* Stability (not needed because no overflow-auto support).
* Maybe in the future we could make a `ScrollbarWidth` enum to more
closely match the CSS API with its auto/narrow/none options. For now
`scrollbar_width` is just an `f32` which matches Taffy's API.

## Solution

* Layout updates no longer overwrite `ScrollPosition`'s value.
* Added the field `scrollbar_width: f32` to `Node`. This is sent to
`Taffy` which will automatically allocate space for scrollbars with this
width in the layout as needed.
* Added the fields `scrollbar_width: f32` and `scroll_position: Vec2` to
`ComputedNode`. These are updated automatically during layout.
* `ScrollPosition` now respects scale factor.
* `ScrollPosition` is no longer automatically added to every UI node
entity by `ui_layout_system`. If every node needs it, it should just be
required by (or be a field on) `Node`. Not sure if that's necessary or
not.

## Testing
For testing you can look at:
* The `scrollbars` example, which should work as before.
* The new example `drag_to_scroll`.
* The `scroll` example which automatically allocates space for
scrollbars on the left hand scrolling list. Did not implement actual
scrollbars so you'll just see a gap atm.

---------

Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
2025-07-15 17:33:04 +00:00
ickshonpe
f774d6b7ed
Text2d bounding box fix (#20148)
# Objective

`calculate_bounds_text2d` generates `Aabb`s with the wrong size and
position for `Text2d` entities with `TextBounds`, which breaks culling.

## Solution

Calculate the correct bounds.

Fixes #20145

## Testing

```
cargo run --example testbed_2d
```

#### main
<img width="661" height="469" alt="text2daabb"
src="https://github.com/user-attachments/assets/c10b64ed-6e0d-4c4e-a81d-6ae2248d752a"
/>

#### This PR

<img width="441" height="308" alt="fixed-text2d-aabbs"
src="https://github.com/user-attachments/assets/bc715bf0-b77f-4149-9c6d-a5a8c1982780"
/>
2025-07-15 17:14:49 +00:00
Tim
57086d4416
Remove the need to derive Event when deriving EntityEvent (#20104)
# Objective
Since we are planning to remove the need to derive both `Event` and
`EntityEvent` in 0.17 either way, I'm choosing to do the easy thing in
this PR so we can get the churn out of the way early.

Context from
[discord](https://discordapp.com/channels/691052431525675048/1383928409784193024/1393463673137401946).
Related to, and will conflict slightly with #20101.

## Solution

- Derive `Event` as part of the `EntityEvent` derive
- Remove any `Event` derives that were made unnecessary
- Update release notes
2025-07-15 16:45:38 +00:00
andriyDev
2bddbdfd7c
Use RenderStartup for all basic cases in bevy_core_pipeline. (#20002)
# Objective

- Progress towards #19887.

## Solution

- Convert `FromWorld` impls into systems.
- Run those systems in `RenderStartup`.

## Testing

- Ran `bloom_3d`, `auto_exposure`, `depth_of_field`, `motion_blur`,
`skybox`, `post_processing`, and `tonemapping` examples and they all
work :)
2025-07-15 07:10:43 +00:00
andriyDev
2824bd5f6e
Use RenderStartup in bevy_sprite. (#20147)
# Objective

- Progress towards #19887.

## Solution

- Convert FromWorld implementations into systems.
- Move any resource "manipulation" from `Plugin::finish` to systems.
- Add `after` dependencies to any uses of these resources (basically all
`SpritePipeline`).

## Testing

- Ran the `sprite`, and `mesh2d_manual` example and it worked.
2025-07-15 06:30:34 +00:00
Christian Hughes
2be3bc5310
Improve node encapsulation in ScheduleGraph (#20119)
# Objective

- Part of #20115

We want to encapsulate each part of `ScheduleGraph` into its own
specific struct to make parts of it easier to reuse and maintain.

## Solution

- Pulled `ScheduleGraph::systems` and `ScheduleGraph::system_conditions`
into a `Systems` struct and added a field for this new struct to
`ScheduleGraph`
- Broke up `ScheduleGraph::uninit` into `Systems::uninit` and
`SystemSets::uninit` to eliminate `ScheduleGraph`'s direct field access
of these types
- Removed node and condition accessors from `ScheduleGraph`; the same
operations are now available on `Systems` and `SystemSets` instead
(accessible via their `pub` fields on `ScheduleGraph`)
- Moved `Systems`, `SystemSets`, `SystemNode`, `SystemWithAccess`, and
`ConditionWithAccess` into a separate file.

## Testing

Added two new tests covering the API surface of `Systems` and
`SystemSets`, respectively.

---------

Co-authored-by: Chris Russell <8494645+chescock@users.noreply.github.com>
2025-07-15 06:29:52 +00:00
Christian Hughes
0747b66602
ReadOnlySystem diagnostics and type alias (#19138)
# Objective

- Improve usability of read-only systems.

## Solution

- Added `on_unimplemented` diagnostics for types/functions that aren't
read-only systems.
- Added `BoxedReadOnlySystem` type alias, similar to `BoxedSystem`.

## Testing

Can/should we test these diagnostics?
2025-07-15 00:14:06 +00:00
eugineerd
3caca428c0
allow EntityCloner to move components without Clone or Reflect (#20065)
# Objective
Fix #18079 

## Solution
- `EntityCloner` can now move components that don't have `Clone` or
`Reflect` implementation.
- Components with `ComponentCloneBehavior::Ignore` will not be moved.
- Components with `ComponentCloneBehavior::Custom` will be cloned using
their defined `ComponentCloneFn` and then removed from the source entity
to respect their `queue_deferred` logic.
- Relationships still need to be `Clone` or `Reflect` to be movable.
- Custom relationship data is now correctly preserved when cloned or
moved using `EntityCloner`.

## Testing
- Added new tests for moving components

---------

Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
2025-07-14 22:33:01 +00:00
onbjerg
554bc7b0d4
Document repeating timer tick behavior (#20137)
# Objective

Closes #20132 

## Solution

I found docs describing the behavior elsewhere in Bevy, which I pulled
in to the main `Timer` docs:
b01de70bdd/crates/bevy_time/src/common_conditions.rs (L27-L35)

I also restructured the docs a little bit.
2025-07-14 22:31:31 +00:00
ickshonpe
2cb8450fa4
Rename the InterpolationColorSpace variants to match Color. (#20142)
# Objective

The names of the variants of `InterpolationColorSpace` don't match the
corresponding `Color` variants, which could be potentially confusing.
For instance, `Color` has an `Oklaba` variant, in
`InterpolationColorSpace` it's called `OkLab`.

## Solution

Rename variants of `InterpolationColorSpace` to mirror the variants of
Color.
2025-07-14 22:30:43 +00:00
Sieluna
6edfe1d39b
Link ComponentIdFor in the ComponentId related docs (#20127)
# Objective

Fixes https://github.com/bevyengine/bevy/issues/19535. Improve
interoperability of type documentation to make it easier for users to
find related types

## Solution

- Add a reference to
[`ComponentIdFor`](crate::component::ComponentIdFor) in the
`component_id` function documentation in
`crates/bevy_ecs/src/world/mod.rs`
- Add a reference to [`ComponentIdFor`](super::ComponentIdFor) in the
`component_id` function documentation in
`crates/bevy_ecs/src/component/info.rs`

## Testing

- Verify documentation generation: `cargo doc`
- Check the validity of cross-reference links in the documentation
- Confirm that the documentation generated by rustdoc can correctly jump
to the type definition of `ComponentIdFor`
2025-07-14 21:59:08 +00:00
Nicholas Nethercote
b8072864aa
Streamline GetOwnership/FromArg/IntoReturn (#20126)
# Objective

Three impls are generated for each of these traits when the
`reflect_functions` feature is enabled.

Helps with #19873.

## Solution

Two of the three (the `&T` and `&mut T` ones) can be avoided by instead
providing blanket impls. The impl for `T` remains.

## Testing

I checked the output via `cargo expand`.

According to `-Zmacro-stats`, the size of the `Reflect` code generate
for `bevy_ui` drops by 10.4%.
2025-07-14 21:57:34 +00:00
andriyDev
2a5e9c1150
Switch most examples to use RenderStartup instead of finish and FromWorld. (#20124)
# Objective

- Progress towards #19887.
- I am avoiding dealing with the `occlusion_culling` example since it is
kinda annoying to resolve nicely (I will do so in another PR).

## Solution

- Rewrite these examples to replace FromWorld implementations with
systems and other resource changes with systems as well.

## Testing

- All the changed examples have been tested and still work.
2025-07-14 21:56:03 +00:00
coolcatcoder
c85ab89615
Allow NotShadowCaster to be used with HierarchyPropagatePlugin. (#20120)
# Objective

Allow NotShadowCaster to be used with HierarchyPropagatePlugin.

## Solution

Implements Clone and PartialEq for NotShadowCaster.
2025-07-14 21:55:12 +00:00
Emerson Coskey
7447b0ab97
Mini Blit refactor (#20118)
# Objective

- Clean up usage of BlitPipeline

## Solution

- add `create_bind_group` method
- adjust some field and variable names for clarity

## Testing

- ran 3d_scene
2025-07-14 21:50:56 +00:00
Pete Hayman
6671575eb0
feat: implement clone for IntoPipeSystem (#20108)
# Objective

Implement `Clone` for `IntoPipeSystem`, allowing for `T: IntoSystem +
Clone` patterns.


## Precedence

Same clone implementation/docs as `CombinatorSystem`
2025-07-14 21:38:51 +00:00
Tim
4e9e78c31e
Split BufferedEvent from Event (#20101)
# Objective

> I think we should axe the shared `Event` trait entirely
It doesn't serve any functional purpose, and I don't think it's useful
pedagogically
@alice-i-cecile on discord

## Solution

- Remove `Event` as a supertrait of `BufferedEvent`
- Remove any `Event` derives that were made unnecessary
- Update release notes

---------

Co-authored-by: SpecificProtagonist <vincentjunge@posteo.net>
2025-07-14 21:31:48 +00:00
ickshonpe
b47f6e8901
Constify gradients helper functions (#20098)
# Objective

Constify some of the helper functions in the UI's `gradients` module.
2025-07-14 21:27:43 +00:00
BD103
a35a9cb418
Fix link to bevy_solari logo (#20097)
# Objective

The `bevy_solari` logo doesn't load in the
[dev-docs](https://dev-docs.bevy.org/bevy/solari/index.html):

<img width="1572" height="594" alt="image"
src="https://github.com/user-attachments/assets/c662402a-a729-4982-bb7f-add072742f4c"
/>

This is because the link to the image,
<https://raw.githubusercontent.com/bevyengine/bevy/assets/branding/bevy_solari.svg>,
returns a 404 not found.

## Solution

Fix the link to point to
<https://raw.githubusercontent.com/bevyengine/bevy/refs/heads/main/assets/branding/bevy_solari.svg>!

![Solari
Logo](https://raw.githubusercontent.com/bevyengine/bevy/refs/heads/main/assets/branding/bevy_solari.svg)

## Testing

Open up the crate page for `bevy_solari` and make sure the image loads
:)

```sh
cargo doc -p bevy_solari --open --no-deps
```
2025-07-14 21:25:44 +00:00
Tim
5d6d6343b9
Add doc examples to viewport_to_world(_2d) (#20096)
# Objective

Add doc examples to `viewport_to_world` and `viewport_to_world_2d`.
With `Single` and let chains these can be very concise now :) 

## Rendered:

<img width="1427" height="581" alt="image"
src="https://github.com/user-attachments/assets/e9de79fe-545f-4dd9-b9c4-77c8cb22de74"
/>

<img width="1427" height="581" alt="image"
src="https://github.com/user-attachments/assets/8c1d52ed-3423-4827-8120-c7720a79309c"
/>

I changed my mind on how much to limit the decimal places after taking
this screenshot. Hence the `:.0` instead of the actual `:.2`
2025-07-14 21:24:28 +00:00