Commit Graph

9237 Commits

Author SHA1 Message Date
andriyDev
2ea8f779c3
Prevent AnimationGraph from serializing AssetIds. (#19615)
# Objective

- A step towards #19024.
- `AnimationGraph` can serialize raw `AssetId`s. However for normal
handles, this is a runtime ID. This means it is unlikely that the
`AssetId` will correspond to the same asset after deserializing -
effectively breaking the graph.

## Solution

- Stop allowing `AssetId` to be serialized by `AnimationGraph`.
Serializing a handle with no path is now an error.
- Add `MigrationSerializedAnimationClip`. This is an untagged enum for
serde, meaning that it will take the first variant that deserializes. So
it will first try the "modern" version, then it will fallback to the
legacy version.
- Add some logging/error messages to explain what users should do.

Note: one limitation here is that this removes the ability to serialize
and deserialize UUIDs. In theory, someone could be using this to have a
"default" animation. If someone inserts an empty `AnimationClip` into
the `Handle::default()`, this **might** produce a T-pose. It might also
do nothing though. Unclear! I think this is worth the risk for
simplicity as it seems unlikely that people are sticking UUIDs in here
(or that you want a default animation in **any** AnimationGraph).

## Testing

- Ran `cargo r --example animation_graph -- --save` on main, then ran
`cargo r --example animation_graph` on this PR. The PR was able to load
the old data (after #19631).
2025-06-30 22:26:05 +00:00
Guillaume Wafo-Tapa
6eb6afeb2d
Spawn batch with relationship (#19519)
# Objective

Fixes #19356
Issue: Spawning a batch of entities in relationship with the same target
adds the relationship between the target and only the last entity of the
batch. `spawn_batch` flushes only after having spawned all entities.
This means each spawned entity will have run the `on_insert` hook of its
`Relationship` component. Here is the relevant part of that hook:
```Rust
            if let Some(mut relationship_target) =
                target_entity_mut.get_mut::<Self::RelationshipTarget>()
            {
                relationship_target.collection_mut_risky().add(entity);
            } else {
                let mut target = <Self::RelationshipTarget as RelationshipTarget>::with_capacity(1);
                target.collection_mut_risky().add(entity);
                world.commands().entity(target_entity).insert(target);
            }
```
Given the above snippet and since there's no flush between spawns, each
entity finds the target without a `RelationshipTarget` component and
defers the insertion of that component with the entity's id as the sole
member of its collection. When the commands are finally flushed, each
insertion after the first replaces the one before and in the process
triggers the `on_replace` hook of `RelationshipTarget` which removes the
`Relationship` component from the corresponding entity. That's how we
end up in the invalid state.

## Solution

I see two possible solutions
1. Flush after every spawn
2. Defer the whole code snippet above

I don't know enough about bevy as a whole but 2. seems much more
efficient to me. This is what I'm proposing here. I have a doubt though
because I've started to look at #19348 that 1. would fix as well.

## Testing

I added a test for the issue. I've put it in `relationship/mod.rs` but I
could see it in `world/spawn_batch.rs` or `lib.rs` because the test is
as much about `spawn_batch` as it is about relationships.
2025-06-30 22:13:38 +00:00
dependabot[bot]
5d736a525c
Bump super-linter/super-linter from 7.3.0 to 7.4.0 (#19288)
Bumps
[super-linter/super-linter](https://github.com/super-linter/super-linter)
from 7.3.0 to 7.4.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/super-linter/super-linter/releases">super-linter/super-linter's
releases</a>.</em></p>
<blockquote>
<h2>v7.4.0</h2>
<h2><a
href="https://github.com/super-linter/super-linter/compare/v7.3.0...v7.4.0">7.4.0</a>
(2025-05-13)</h2>
<h3>🚀 Features</h3>
<ul>
<li>add env var for npm-groovy-lint failon level (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6530">#6530</a>)
(<a
href="418c922120">418c922</a>)</li>
<li>check in-progress commit msg with commitlint (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6757">#6757</a>)
(<a
href="57345c5c79">57345c5</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6411">#6411</a></li>
<li>disable xmllint verbose output if debuging (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6747">#6747</a>)
(<a
href="e6c42ca463">e6c42ca</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6653">#6653</a></li>
<li>do not hide php composer output (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6637">#6637</a>)
(<a
href="1c62141194">1c62141</a>)</li>
<li>pass optional arguments to gitleaks (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6756">#6756</a>)
(<a
href="109384b3f0">109384b</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6601">#6601</a></li>
<li>set github_before_sha on pull requests (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6687">#6687</a>)
(<a
href="d7f522206a">d7f5222</a>)</li>
<li>support eslint flat config files (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6619">#6619</a>)
(<a
href="d349d57576">d349d57</a>)</li>
<li>support ktlint format fix (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6748">#6748</a>)
(<a
href="5cb5915c0d">5cb5915</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6618">#6618</a></li>
<li>warn the user on conflicting tools (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6759">#6759</a>)
(<a
href="b4aaae9add">b4aaae9</a>)</li>
</ul>
<h3>🐛 Bugfixes</h3>
<ul>
<li>check if commit count is defined before using (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6733">#6733</a>)
(<a
href="d007229c20">d007229</a>)</li>
<li>check return code and misc test improvements (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6697">#6697</a>)
(<a
href="7f46ec3f95">7f46ec3</a>)</li>
<li>configure nbqa tools (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6761">#6761</a>)
(<a
href="e31adf99f9">e31adf9</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6736">#6736</a></li>
<li>consider git dirs safe (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6675">#6675</a>)
(<a
href="101d5a6e79">101d5a6</a>)</li>
<li>do not use a pager on git log (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6765">#6765</a>)
(<a
href="f5bae0c893">f5bae0c</a>)</li>
<li>emit prettier verbose output when debugging (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6636">#6636</a>)
(<a
href="4e1eb5f5e0">4e1eb5f</a>)</li>
<li>export github_before_sha (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6714">#6714</a>)
(<a
href="6401906d78">6401906</a>)</li>
<li>fix default values for prettier fix vars (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6769">#6769</a>)
(<a
href="4230ecc9a8">4230ecc</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6768">#6768</a></li>
<li>more robust error checking and test fixes (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6693">#6693</a>)
(<a
href="1c70566ff2">1c70566</a>)</li>
<li>skip symbolic links when passing files to prettier (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6620">#6620</a>)
(<a
href="417a58a62d">417a58a</a>)</li>
<li>update editorconfig-checker config file name (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6730">#6730</a>)
(<a
href="72f02f08d9">72f02f0</a>)</li>
</ul>
<h3>⬆️ Dependency updates</h3>
<ul>
<li><strong>bundler:</strong> bump the rubocop group in /dependencies
with 10 updates (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6661">#6661</a>)
(<a
href="2757a99ca5">2757a99</a>)</li>
<li><strong>bundler:</strong> bump the rubocop group in /dependencies
with 4 updates (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6782">#6782</a>)
(<a
href="17cf93575b">17cf935</a>)</li>
<li><strong>docker:</strong> bump python in the docker-base-images group
(<a
href="https://redirect.github.com/super-linter/super-linter/issues/6723">#6723</a>)
(<a
href="960298bbeb">960298b</a>)</li>
<li><strong>docker:</strong> bump the docker group across 1 directory
with 17 updates (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6776">#6776</a>)
(<a
href="8b602a4d8b">8b602a4</a>)</li>
<li><strong>java:</strong> bump
com.google.googlejavaformat:google-java-format (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6780">#6780</a>)
(<a
href="aa3f3f8779">aa3f3f8</a>)</li>
<li><strong>java:</strong> bump com.puppycrawl.tools:checkstyle (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6639">#6639</a>)
(<a
href="59f2b6bebb">59f2b6b</a>)</li>
<li><strong>npm:</strong> bump <code>@​babel/eslint-parser</code> in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6762">#6762</a>)
(<a
href="fd53895808">fd53895</a>)</li>
<li><strong>npm:</strong> bump <code>@​babel/runtime-corejs3</code> (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6651">#6651</a>)
(<a
href="8fbf79e7cd">8fbf79e</a>)</li>
<li><strong>npm:</strong> bump <code>@​stoplight/spectral-cli</code> in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6742">#6742</a>)
(<a
href="56355b5d6e">56355b5</a>)</li>
<li><strong>npm:</strong> bump asl-validator from 3.13.0 to 3.14.0 in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6631">#6631</a>)
(<a
href="30aa4b3218">30aa4b3</a>)</li>
<li><strong>npm:</strong> bump asl-validator from 3.14.0 to 3.15.0 in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6777">#6777</a>)
(<a
href="660f7dcb41">660f7dc</a>)</li>
<li><strong>npm:</strong> bump next (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6676">#6676</a>)
(<a
href="f171ee5245">f171ee5</a>)</li>
<li><strong>npm:</strong> bump next (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6708">#6708</a>)
(<a
href="43faf9530c">43faf95</a>)</li>
<li><strong>npm:</strong> bump next (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6729">#6729</a>)
(<a
href="536538ab2d">536538a</a>)</li>
<li><strong>npm:</strong> bump npm-groovy-lint from 15.1.0 to 15.2.0 in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6779">#6779</a>)
(<a
href="c19a3da4cf">c19a3da</a>)</li>
<li><strong>npm:</strong> bump prettier from 3.5.2 to 3.5.3 in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6629">#6629</a>)
(<a
href="6864c8c0d5">6864c8c</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/super-linter/super-linter/blob/main/CHANGELOG.md">super-linter/super-linter's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/super-linter/super-linter/compare/v7.3.0...v7.4.0">7.4.0</a>
(2025-05-13)</h2>
<h3>🚀 Features</h3>
<ul>
<li>add env var for npm-groovy-lint failon level (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6530">#6530</a>)
(<a
href="418c922120">418c922</a>)</li>
<li>check in-progress commit msg with commitlint (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6757">#6757</a>)
(<a
href="57345c5c79">57345c5</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6411">#6411</a></li>
<li>disable xmllint verbose output if debuging (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6747">#6747</a>)
(<a
href="e6c42ca463">e6c42ca</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6653">#6653</a></li>
<li>do not hide php composer output (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6637">#6637</a>)
(<a
href="1c62141194">1c62141</a>)</li>
<li>pass optional arguments to gitleaks (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6756">#6756</a>)
(<a
href="109384b3f0">109384b</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6601">#6601</a></li>
<li>set github_before_sha on pull requests (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6687">#6687</a>)
(<a
href="d7f522206a">d7f5222</a>)</li>
<li>support eslint flat config files (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6619">#6619</a>)
(<a
href="d349d57576">d349d57</a>)</li>
<li>support ktlint format fix (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6748">#6748</a>)
(<a
href="5cb5915c0d">5cb5915</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6618">#6618</a></li>
<li>warn the user on conflicting tools (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6759">#6759</a>)
(<a
href="b4aaae9add">b4aaae9</a>)</li>
</ul>
<h3>🐛 Bugfixes</h3>
<ul>
<li>check if commit count is defined before using (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6733">#6733</a>)
(<a
href="d007229c20">d007229</a>)</li>
<li>check return code and misc test improvements (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6697">#6697</a>)
(<a
href="7f46ec3f95">7f46ec3</a>)</li>
<li>configure nbqa tools (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6761">#6761</a>)
(<a
href="e31adf99f9">e31adf9</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6736">#6736</a></li>
<li>consider git dirs safe (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6675">#6675</a>)
(<a
href="101d5a6e79">101d5a6</a>)</li>
<li>do not use a pager on git log (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6765">#6765</a>)
(<a
href="f5bae0c893">f5bae0c</a>)</li>
<li>emit prettier verbose output when debugging (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6636">#6636</a>)
(<a
href="4e1eb5f5e0">4e1eb5f</a>)</li>
<li>export github_before_sha (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6714">#6714</a>)
(<a
href="6401906d78">6401906</a>)</li>
<li>fix default values for prettier fix vars (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6769">#6769</a>)
(<a
href="4230ecc9a8">4230ecc</a>),
closes <a
href="https://redirect.github.com/super-linter/super-linter/issues/6768">#6768</a></li>
<li>more robust error checking and test fixes (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6693">#6693</a>)
(<a
href="1c70566ff2">1c70566</a>)</li>
<li>skip symbolic links when passing files to prettier (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6620">#6620</a>)
(<a
href="417a58a62d">417a58a</a>)</li>
<li>update editorconfig-checker config file name (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6730">#6730</a>)
(<a
href="72f02f08d9">72f02f0</a>)</li>
</ul>
<h3>⬆️ Dependency updates</h3>
<ul>
<li><strong>bundler:</strong> bump the rubocop group in /dependencies
with 10 updates (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6661">#6661</a>)
(<a
href="2757a99ca5">2757a99</a>)</li>
<li><strong>bundler:</strong> bump the rubocop group in /dependencies
with 4 updates (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6782">#6782</a>)
(<a
href="17cf93575b">17cf935</a>)</li>
<li><strong>docker:</strong> bump python in the docker-base-images group
(<a
href="https://redirect.github.com/super-linter/super-linter/issues/6723">#6723</a>)
(<a
href="960298bbeb">960298b</a>)</li>
<li><strong>docker:</strong> bump the docker group across 1 directory
with 17 updates (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6776">#6776</a>)
(<a
href="8b602a4d8b">8b602a4</a>)</li>
<li><strong>java:</strong> bump
com.google.googlejavaformat:google-java-format (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6780">#6780</a>)
(<a
href="aa3f3f8779">aa3f3f8</a>)</li>
<li><strong>java:</strong> bump com.puppycrawl.tools:checkstyle (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6639">#6639</a>)
(<a
href="59f2b6bebb">59f2b6b</a>)</li>
<li><strong>npm:</strong> bump <code>@​babel/eslint-parser</code> in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6762">#6762</a>)
(<a
href="fd53895808">fd53895</a>)</li>
<li><strong>npm:</strong> bump <code>@​babel/runtime-corejs3</code> (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6651">#6651</a>)
(<a
href="8fbf79e7cd">8fbf79e</a>)</li>
<li><strong>npm:</strong> bump <code>@​stoplight/spectral-cli</code> in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6742">#6742</a>)
(<a
href="56355b5d6e">56355b5</a>)</li>
<li><strong>npm:</strong> bump asl-validator from 3.13.0 to 3.14.0 in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6631">#6631</a>)
(<a
href="30aa4b3218">30aa4b3</a>)</li>
<li><strong>npm:</strong> bump asl-validator from 3.14.0 to 3.15.0 in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6777">#6777</a>)
(<a
href="660f7dcb41">660f7dc</a>)</li>
<li><strong>npm:</strong> bump next (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6676">#6676</a>)
(<a
href="f171ee5245">f171ee5</a>)</li>
<li><strong>npm:</strong> bump next (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6708">#6708</a>)
(<a
href="43faf9530c">43faf95</a>)</li>
<li><strong>npm:</strong> bump next (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6729">#6729</a>)
(<a
href="536538ab2d">536538a</a>)</li>
<li><strong>npm:</strong> bump npm-groovy-lint from 15.1.0 to 15.2.0 in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6779">#6779</a>)
(<a
href="c19a3da4cf">c19a3da</a>)</li>
<li><strong>npm:</strong> bump prettier from 3.5.2 to 3.5.3 in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6629">#6629</a>)
(<a
href="6864c8c0d5">6864c8c</a>)</li>
<li><strong>npm:</strong> bump renovate from 39.179.1 to 40.3.4 in
/dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6763">#6763</a>)
(<a
href="5e7e9212d8">5e7e921</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="12150456a7"><code>1215045</code></a>
chore(main): release 7.4.0 (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6634">#6634</a>)</li>
<li><a
href="8b602a4d8b"><code>8b602a4</code></a>
deps(docker): bump the docker group across 1 directory with 17 updates
(<a
href="https://redirect.github.com/super-linter/super-linter/issues/6776">#6776</a>)</li>
<li><a
href="f8df7f61c0"><code>f8df7f6</code></a>
deps(npm): bump the stylelint group across 1 directory with 3 updates
(<a
href="https://redirect.github.com/super-linter/super-linter/issues/6775">#6775</a>)</li>
<li><a
href="660f7dcb41"><code>660f7dc</code></a>
deps(npm): bump asl-validator from 3.14.0 to 3.15.0 in /dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6777">#6777</a>)</li>
<li><a
href="25d4ced079"><code>25d4ced</code></a>
deps(npm): bump renovate from 40.10.4 to 40.11.8 in /dependencies (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6778">#6778</a>)</li>
<li><a
href="c19a3da4cf"><code>c19a3da</code></a>
deps(npm): bump npm-groovy-lint from 15.1.0 to 15.2.0 in /dependencies
(<a
href="https://redirect.github.com/super-linter/super-linter/issues/6779">#6779</a>)</li>
<li><a
href="aa3f3f8779"><code>aa3f3f8</code></a>
deps(java): bump com.google.googlejavaformat:google-java-format (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6780">#6780</a>)</li>
<li><a
href="e15495758b"><code>e154957</code></a>
deps(python): bump the pip group across 1 directory with 3 updates (<a
href="https://redirect.github.com/super-linter/super-linter/issues/6781">#6781</a>)</li>
<li><a
href="17cf93575b"><code>17cf935</code></a>
deps(bundler): bump the rubocop group in /dependencies with 4 updates
(<a
href="https://redirect.github.com/super-linter/super-linter/issues/6782">#6782</a>)</li>
<li><a
href="2757a99ca5"><code>2757a99</code></a>
deps(bundler): bump the rubocop group in /dependencies with 10 updates
(<a
href="https://redirect.github.com/super-linter/super-linter/issues/6661">#6661</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/super-linter/super-linter/compare/v7.3.0...v7.4.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=super-linter/super-linter&package-manager=github_actions&previous-version=7.3.0&new-version=7.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

You can trigger a rebase of this PR by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

> **Note**
> Automatic rebases have been disabled on this pull request as it has
been open for over 30 days.

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-30 22:07:33 +00:00
robtfm
a2992fcffd
Light Textures (#18031)
# Objective

add support for light textures (also known as light cookies, light
functions, and light projectors)


![image](https://github.com/user-attachments/assets/afdb23e2-b35f-4bf0-bf92-f883cd7db771)

## Solution

- add components:

```rs
/// Add to a [`PointLight`] to add a light texture effect.
/// A texture mask is applied to the light source to modulate its intensity,  
/// simulating patterns like window shadows, gobo/cookie effects, or soft falloffs.
pub struct PointLightTexture {
    /// The texture image. Only the R channel is read.
    pub image: Handle<Image>,
    /// The cubemap layout. The image should be a packed cubemap in one of the formats described by the [`CubemapLayout`] enum.
    pub cubemap_layout: CubemapLayout,
}

/// Add to a [`SpotLight`] to add a light texture effect.
/// A texture mask is applied to the light source to modulate its intensity,  
/// simulating patterns like window shadows, gobo/cookie effects, or soft falloffs.
pub struct SpotLightTexture {
    /// The texture image. Only the R channel is read.
    /// Note the border of the image should be entirely black to avoid leaking light.
    pub image: Handle<Image>,
}

/// Add to a [`DirectionalLight`] to add a light texture effect.
/// A texture mask is applied to the light source to modulate its intensity,  
/// simulating patterns like window shadows, gobo/cookie effects, or soft falloffs.
pub struct DirectionalLightTexture {
    /// The texture image. Only the R channel is read.
    pub image: Handle<Image>,
    /// Whether to tile the image infinitely, or use only a single tile centered at the light's translation
    pub tiled: bool,
}
```

- store images to the `RenderClusteredDecals` buffer
- read the image and modulate the lights
- add `light_textures` example to showcase the new features

## Testing

see light_textures example
2025-06-30 21:56:17 +00:00
François Mockers
bcb5520742
bevy_window: fix compilation without default features (#19870)
# Objective

- bevy_window fails to compile without default features

```
error: cannot find derive macro `Reflect` in this scope
    --> crates/bevy_window/src/window.rs:1474:60
     |
1474 | #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Reflect)]
     |                                                            ^^^^^^^

warning: unused import: `format`
 --> crates/bevy_window/src/window.rs:1:30
  |
1 | use alloc::{borrow::ToOwned, format, string::String};
  |                              ^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: `bevy_window` (lib) generated 1 warning
error: could not compile `bevy_window` (lib) due to 1 previous error; 1 warning emitted
```

## Solution

- Fix them

## Testing

`cargo build -p bevy_window --no-default-features --features
bevy_math/libm`
2025-06-30 20:51:52 +00:00
Martín Maita
d7ce35234f
Update ui_test requirement from 0.29.1 to 0.30.1 (#19799)
# Objective

- Fixes #19670

## Solution

- Updated breaking code to be able to upgrade `ui_test` to the latest
version.

## Testing

- CI checks.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-30 18:19:46 +00:00
dependabot[bot]
c6a6afc60a
Update petgraph requirement from 0.7 to 0.8 (#19878)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-30 16:56:00 +00:00
François Mockers
01eff3ea93
bevy_render: fix clippy on wasm (#19872)
# Objective

- bevy_render has unfulfilled expected clippy lints in wasm

## Solution

- Don't expect them in wasm

## Testing

`cargo clippy --target wasm32-unknown-unknown -p bevy_render --no-deps
-- -D warnings`
2025-06-29 22:09:37 +00:00
atlv
a8bb208ed3
optimize ktx2 level data concatenation (#19845)
# Objective

- avoid several internal vec copies while collecting all the level data
in ktx2 load
- merge another little piece of #18411 (benchmarks there found this to
be a significant win)

## Solution

- reserve and extend

## Testing

- ran a few examples that load ktx2 images, like ssr. looks fine

## Future work

- fast path logic to skip the reading into different vecs and just read
it all in one go into the final buffer instead
- as above, but directly into gpu staging buffer perhaps
2025-06-29 21:59:56 +00:00
François Mockers
764be9199c
bevy_winit: fix compile and clippy on wasm (#19869)
# Objective

- bevy_winit has a warning when compiling without default feature on
linux
- bevy_winit has a clippy warning when compiling in wasm

## Solution

- Fix them

## Testing

```
cargo build -p bevy_winit --no-default-features --features winit/x11
cargo clippy --target wasm32-unknown-unknown -p bevy_winit --no-deps -- -D warnings
```
2025-06-29 21:30:28 +00:00
François Mockers
a98b5683ae
bevy_asset: fix clippy in wasm (#19865)
# Objective

- bevy_asset has a clippy warning in wasm:
[`clippy::io_other_error`](https://rust-lang.github.io/rust-clippy/master/index.html#io_other_error)

```
error: this can be `std::io::Error::other(_)`
  --> crates/bevy_asset/src/io/wasm.rs:50:9
   |
50 |         std::io::Error::new(std::io::ErrorKind::Other, message)
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#io_other_error
   = note: `-D clippy::io-other-error` implied by `-D warnings`
   = help: to override `-D warnings` add `#[allow(clippy::io_other_error)]`
help: use `std::io::Error::other`
   |
50 -         std::io::Error::new(std::io::ErrorKind::Other, message)
50 +         std::io::Error::other(message)
```

## Solution

- Fix it

## Testing

`cargo clippy --target wasm32-unknown-unknown -p bevy_asset --no-deps --
-D warnings`
2025-06-29 20:36:53 +00:00
JMS55
56710df934
bevy_solari ReSTIR DI (#19790)
# Objective

- Add temporal and spatial resampling to bevy_solari.

# Showcase
ReSTIR:

![image](https://github.com/user-attachments/assets/9b563713-d0cb-4f33-b402-dfa5a13ef3e2)

Previous RIS: 

![455750793-b70b968d-9c73-4983-9b6b-b60cace9b47a](https://github.com/user-attachments/assets/e62c852b-1f2c-4e86-ab35-a8058e9339d6)
2025-06-29 19:01:32 +00:00
atlv
ec1916a240
Dds transcode channel order fix (#19849)
# Objective

- Fix bug in dds channel order transcode
- taken from #18411

## Solution

- fix it
- improve docs a bit

## Testing

- example in linked pr
2025-06-29 18:19:05 +00:00
IceSentry
37aae00120
Add RenderStartup schedule to the RenderApp (#19841)
# Objective

- We sometimes want to spawn things on startup that only exist in the
RenderApp but right now there's no equivalent to the Startup schedule on
the RenderApp so we need to do all of that in the plugin build/finish
code

## Solution

- Add a RenderStartup schedule that runs on the RenderApp after the
plugins are initialized

## Testing

- I ported the custom_post_processing example to use this new schedule
and things worked as expected. I will push the change in a follow up PR
2025-06-29 18:14:10 +00:00
ickshonpe
8d70649e7d
core_widgets example slider fix (#19810)
# Objective

When dragging the slider thumb the thumb is only highlighted while the
pointer is hovering the widget. If the pointer moves off the widget
during a drag the thumb reverts to its normal unhovered colour.

## Solution

Query for `CoreSliderDragState` in the slider update systems and set the
lighter color if the thumb is dragged or hovered.
2025-06-29 17:41:41 +00:00
ickshonpe
e9daac4f11
Move TextShadow to text widget module (#19579)
# Objective

It's odd that `TextShadow` is accessible by importing `bevy::ui::*` but
`Text` isn't.

Move the `TextShadow` component to `text` widget module and move its
type registration to the `build_text_interop` function.
2025-06-29 17:37:04 +00:00
François Mockers
e6e731017d
bevy_input: build warnings without bevy_reflect (#19862)
# Objective

- bevy_input has build warnings when bevy_reflect isn't enabled

## Solution

- Fix them

## Testing

`cargo build -p bevy_input --no-default-features --features
bevy_math/libm`
2025-06-29 17:13:43 +00:00
François Mockers
c077c65ddd
bevy_utils: clippy without debug feature enabled (#19861)
# Objective

- bevy_utils has warnings with clippy

## Solution

- Fix them

## Testing

`cargo clippy -p bevy_utils  --no-deps -- -D warnings`
2025-06-29 17:13:27 +00:00
François Mockers
5f497efe90
bevy_platform: clippy without default features (#19860)
# Objective

- bevy_platform has clippy warnings when building without default
features

## Solution

- Fix them

## Testing

`cargo clippy -p bevy_platform --no-default-features --no-deps -- -D
warnings`
2025-06-29 17:12:57 +00:00
François Mockers
1fe559730c
bevy_ecs: remove use of needless_return (#19859)
# Objective

- bevy_ecs has a expected lint that is both needed and unneeded

## Solution

- Change the logic so that it's always not needed

## Testing

`cargo clippy -p bevy_ecs --no-default-features --no-deps -- -D
warnings`
2025-06-29 17:12:33 +00:00
François Mockers
8e12b1f0b2
bevy_ui compilation (#19858)
# Objective

- `bevy_ui` has errors and warnings when building independently

## Solution

- properly use the `bevy_ui_picking_backend` feature

## Testing

`cargo build -p bevy_ui`
2025-06-29 17:12:11 +00:00
Brian Reavis
795e273a9a
Don't create errors for ignored failed commands (#19718)
# Objective

1. Reduce overhead from error handling for ECS commands that
intentionally ignore errors, such as `try_despawn`. These commands
currently allocate error objects and pass them to a no-op handler
(`ignore`), which can impact performance when many operations fail.

2. Fix a hang when removing `ChildOf` components during entity
despawning. Excessive logging of these failures can cause significant
hangs (I'm noticing around 100ms).
    - Fixes https://github.com/bevyengine/bevy/issues/19777
    - Fixes https://github.com/bevyengine/bevy/issues/19753

<img width="1387" alt="image"
src="https://github.com/user-attachments/assets/5c67ab77-97bb-46e5-b287-2c502bef9358"
/>


## Solution

* Added a `ignore_error` method to the `HandleError` trait to use
instead of `handle_error_with(ignore)`. It swallows errors and does not
create error objects.
* Replaced `remove::<ChildOf>` with `try_remove::<ChildOf>` to suppress
expected (?) errors and reduce log noise.

## Testing

- I ran these changes on a local project.
2025-06-29 16:34:20 +00:00
Chris Russell
85448b767e
Make DebugName work when building with no default features (#19824)
# Objective

Let `bevy_utils` build with no default features.  

`cargo build -p bevy_utils --no-default-features` currently fails with 

```
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `alloc`
 --> crates\bevy_utils\src\debug_info.rs:1:5
  |
1 | use alloc::{borrow::Cow, fmt, string::String};
  |     ^^^^^ use of unresolved module or unlinked crate `alloc`
  |
  = help: add `extern crate alloc` to use the `alloc` crate

error[E0432]: unresolved import `alloc`
 --> crates\bevy_utils\src\debug_info.rs:1:5
  |
1 | use alloc::{borrow::Cow, fmt, string::String};
  |     ^^^^^ help: a similar path exists: `core::alloc`
```

I would have expected CI to catch this earlier, but I have not
investigated why it did not.

## Solution

Wrap the parts of `DebugName` that use `Cow` and `String` in
`cfg::alloc!`.

If the `debug` feature is enabled, then `DebugName` itself stores a
`Cow`, so make the `debug` feature require `bevy_platform/alloc`.

That is, you can use `DebugName` in no-std contexts when it's just a
ZST! (I bet it's even possible to support no-std `debug` by storing
`&'static str` instead of `Cow<'static, str>`, but that seemed like too
much complexity for now.)
2025-06-29 02:45:41 +00:00
atlv
57e58ef997
Meshlet BVH Culling (#19318)
# Objective

- Merge @SparkyPotato 's efforts to implement BVH-accelerated meshlet
culling.

## Solution

- Add hot reloading support
- Fix near-plane overculling
- Fix hzb sampling
- Fix orthographic error metric

## Testing

- Meshlet example, Nsight, hot-reloading and careful thinking

---------

Co-authored-by: SparkyPotato <noob.sparkypotato@gmail.com>
Co-authored-by: JMS55 <47158642+JMS55@users.noreply.github.com>
Co-authored-by: charlotte <charlotte.c.mcelwain@gmail.com>
2025-06-29 00:04:21 +00:00
Talin
65bddbd3e4
Bevy Feathers: an opinionated widget toolkit for building Bevy tooling (#19730)
# Objective

This PR introduces Bevy Feathers, an opinionated widget toolkit and
theming system intended for use by the Bevy Editor, World Inspector, and
other tools.

The `bevy_feathers` crate is incomplete and hidden behind an
experimental feature flag. The API is going to change significantly
before release.

---------

Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
2025-06-28 19:52:13 +00:00
jf908
fa9e303e61
Doc for X11 CursorGrabMode support (#19811)
# Objective

- Clarify that `CursorGrabMode::Locked` isn't supported on X11

Source:
https://docs.rs/winit/latest/winit/window/enum.CursorGrabMode.html#variant.Locked

## Solution

- Add it to the platform-specific docs
2025-06-28 18:54:21 +00:00
IceSentry
37bbbf753d
Use SmallVec instead of HashMap in MaterialProperties (#19846)
# Objective

- MaterialProperties uses HashMap for some data that is generally going
to be really small. This is likely using more memory than necessary

## Solution

- Use a SmallVec instead
- I used the size a StandardMaterial would need for all the backing
arrays

## Testing

- Tested the 3d_scene to confirm it still works

## Notes

I'm not sure if it made a measurable difference since I'm not sure how
to measure this. It's a bit hard to create an artificial workflow where
this would be the main bottleneck. This is very in the realm of
microoptimization.
2025-06-28 18:43:56 +00:00
Jan Hohenheim
fb2bbb043c
Nudge users into migrating to new default glTF coordinate conversion (#19816)
# Objective

*Step towards https://github.com/bevyengine/bevy/issues/19686*

We now have all the infrastructure in place to migrate Bevy's default
behavior when loading glTF files to respect their coordinate system.
Let's start migrating! For motivation, see the issue linked above

## Solution

- Introduce a feature flag called `gltf_convert_coordinates_default`
- Currently,`GltfPlugin::convert_coordinates` defaults to `false`
- If `gltf_convert_coordinates_default` is enabled,
`GltfPlugin::convert_coordinates` will default to `true`
- If `gltf_convert_coordinates_default` is not enabled *and*
`GltfPlugin::convert_coordinates` is false, we assume the user is
implicitly using the old behavior. Print a warning *once* in that case,
but only when a glTF was actually loaded
- A user can opt into the new behavior either
- Globally, by enabling `gltf_convert_coordinates_default` in their
`Cargo.toml`
  - Globally, by enabling `GltfPlugin::convert_coordinates`
  - Per asset, by enabling `GltfLoaderSettings::convert_coordinates`
- A user can explicitly opt out of the new behavior and silence the
warning by
- Enabling `gltf_convert_coordinates_default` in their `Cargo.toml` and
disabling `GltfPlugin::convert_coordinates`
- This PR also moves the existing release note into a migration guide
 
Note that I'm very open to change any features, mechanisms, warning
texts, etc. as needed :)

## Future Work

- This PR leaves all examples fully functional by not enabling this flag
internally yet. A followup PR will enable it as a `dev-dependency` and
migrate all of our examples involving glTFs to the new behavior.
- After 0.17 (and the RC before) lands, we'll gather feedback to see if
anything breaks or the suggested migration is inconvenient in some way
- If all goes well, we'll kill this flag and change the default of
`GltfPlugin::convert_coordinates` to `true` in 0.18


## Testing

- Ran examples with and without the flag

---------

Co-authored-by: Carter Anderson <mcanders1@gmail.com>
Co-authored-by: AlephCubed <76791009+AlephCubed@users.noreply.github.com>
2025-06-28 18:35:41 +00:00
charlotte 🌸
e6ba9a6d18
Type erased materials (#19667)
# Objective

Closes #18075

In order to enable a number of patterns for dynamic materials in the
engine, it's necessary to decouple the renderer from the `Material`
trait.

This opens the possibility for:
- Materials that aren't coupled to `AsBindGroup`.
- 2d using the underlying 3d bindless infrastructure.
- Dynamic materials that can change their layout at runtime.
- Materials that aren't even backed by a Rust struct at all.

## Solution

In short, remove all trait bounds from render world material systems and
resources. This means moving a bunch of stuff onto `MaterialProperties`
and engaging in some hacks to make specialization work. Rather than
storing the bind group data in `MaterialBindGroupAllocator`, right now
we're storing it in a closure on `MaterialProperties`. TBD if this has
bad performance characteristics.

## Benchmarks

- `many_cubes`:
`cargo run --example many_cubes --release --features=bevy/trace_tracy --
--vary-material-data-per-instance`:
![Screenshot 2025-06-26
235426](https://github.com/user-attachments/assets/10a0ee29-9932-4f91-ab43-33518b117ac5)

- @DGriffin91's Caldera
`cargo run --release --features=bevy/trace_tracy -- --random-materials`

![image](https://github.com/user-attachments/assets/ef91ba6a-8e88-4922-a73f-acb0af5b0dbc)


- @DGriffin91's Caldera with 20 unique material types (i.e.
`MaterialPlugin<M>`) and random materials per mesh
`cargo run --release --features=bevy/trace_tracy -- --random-materials`
![Screenshot 2025-06-27
000425](https://github.com/user-attachments/assets/9561388b-881d-46cf-8c3d-b15b3e9aedc7)


### TODO

- We almost certainly lost some parallelization from removing the type
params that could be gained back from smarter iteration.
- Test all the things that could have broken.
- ~Fix meshlets~

## Showcase

See [the
example](https://github.com/bevyengine/bevy/pull/19667/files#diff-9d768cfe1c3aa81eff365d250d3cbe5a63e8df63e81dd85f64c3c3cd993f6d94)
for a custom material implemented without the use of the `Material`
trait and thus `AsBindGroup`.


![image](https://github.com/user-attachments/assets/e3fcca7c-e04e-4a4e-9d89-39d697a9e3b8)

---------

Co-authored-by: IceSentry <IceSentry@users.noreply.github.com>
Co-authored-by: IceSentry <c.giguere42@gmail.com>
2025-06-27 22:57:24 +00:00
Talin
73a313200d
CoreRadio should require Checkable, not Checked. (#19836)
This was a mistake in my original PR #19778: a holdover from when
Checked was not a marker component.
2025-06-27 18:23:59 +00:00
ickshonpe
45a379cf2d
Opt-out for UI clipping (#19826)
# Objective

Opt-out for UI clipping, for motivation see issue #19821

## Solution

New zst component `OverrideClip`. A UI node entity with this component
will ignore any inherited clipping rect, so it will never get clipped
regardless of the `Overflow` settings of its ancestors.

#### Why use a marker component and not add a new variant to `Overflow`
instead?
A separate marker component allows users to set both `Overflow` and
`OverrideClip` on the same node.

## Testing

Run the `overflow` example with the `OverrideClip` component added to
the `ImagNode`s and you will see that clipping is disabled.
2025-06-27 17:17:09 +00:00
charlotte 🌸
a0b90cd618
Resolution override (#19817)
Co-authored-by: JMS55 <47158642+JMS55@users.noreply.github.com>
Co-authored-by: atlv <email@atlasdostal.com>
2025-06-27 16:30:54 +00:00
atlv
410ca48023
cleanup constants (#19831)
# Objective

- i think const exprs werent supported in naga when these were written,
and we've just stuck with that since then. they're supported now so lets
use them

## Solution

- do that thang

## Testing

- transparency_3d, transmission, ssr, 3d_scene, couple others. they all
look fine
2025-06-27 07:02:03 +00:00
atlv
a256d3398a
use sequential bindings in bevy_sprite (#19830)
# Objective

- Use the terser api

## Solution

- Use the terser api

## Testing

- run sprite example it works
2025-06-27 06:59:02 +00:00
atlv
5fabb5343d
use wgpu TextureDataOrder (#19829)
# Objective

- Fixes #19140

## Solution

- Use TextureDataOrder

## Testing

- ran some examples that use ktx2 textures, they look fine
2025-06-27 06:57:29 +00:00
atlv
479c93d72b
updating: very very minorly (#19827)
# Objective

- fix thing missed during rust update

## Solution

- fix thing missed during rust update

## Testing

- cargo clippy
2025-06-26 21:48:20 +00:00
atlv
30800401b4
add native zstd support (#19793)
# Objective

- add support for alternate zstd backend through `zstd` for faster
decompression

## Solution

- make existing `zstd` feature only specify that support is required,
disambiguate which backend to use via two other features `zstd_native`
and `zstd_rust`.
- Similar to the approach taken by #18411, but we keep current behavior
by defaulting to the rust implementation because its safer, and isolate
this change.

NOTE: the default feature-set may seem to not currently require `zstd`,
but it does, it is enabled transitively by the `tonemapping_luts`
feature, which is a default feature. Thus this does not add default
features.

## Testing

- Cargo clippy on both feature combinations
2025-06-26 20:53:54 +00:00
atlv
b62b14c293
Add UVec to_extents helper method (#19807)
# Objective

- Simplify common usecase

## Solution

- Helper trait
2025-06-26 20:53:49 +00:00
charlotte 🌸
96dcbc5f8c
Ugrade to wgpu version 25.0 (#19563)
# Objective

Upgrade to `wgpu` version `25.0`.

Depends on https://github.com/bevyengine/naga_oil/pull/121

## Solution

### Problem

The biggest issue we face upgrading is the following requirement:
> To facilitate this change, there was an additional validation rule put
in place: if there is a binding array in a bind group, you may not use
dynamic offset buffers or uniform buffers in that bind group. This
requirement comes from vulkan rules on UpdateAfterBind descriptors.

This is a major difficulty for us, as there are a number of binding
arrays that are used in the view bind group. Note, this requirement does
not affect merely uniform buffors that use dynamic offset but the use of
*any* uniform in a bind group that also has a binding array.

### Attempted fixes

The easiest fix would be to change uniforms to be storage buffers
whenever binding arrays are in use:
```wgsl
#ifdef BINDING_ARRAYS_ARE_USED
@group(0) @binding(0) var<uniform> view: View;
@group(0) @binding(1) var<uniform> lights: types::Lights;
#else
@group(0) @binding(0) var<storage> view: array<View>;
@group(0) @binding(1) var<storage> lights: array<types::Lights>;
#endif
```

This requires passing the view index to the shader so that we know where
to index into the buffer:

```wgsl
struct PushConstants {
    view_index: u32,
}

var<push_constant> push_constants: PushConstants;
```

Using push constants is no problem because binding arrays are only
usable on native anyway.

However, this greatly complicates the ability to access `view` in
shaders. For example:
```wgsl
#ifdef BINDING_ARRAYS_ARE_USED
mesh_view_bindings::view.view_from_world[0].z
#else
mesh_view_bindings::view[mesh_view_bindings::view_index].view_from_world[0].z
#endif
```

Using this approach would work but would have the effect of polluting
our shaders with ifdef spam basically *everywhere*.

Why not use a function? Unfortunately, the following is not valid wgsl
as it returns a binding directly from a function in the uniform path.

```wgsl
fn get_view() -> View {
#if BINDING_ARRAYS_ARE_USED
    let view_index = push_constants.view_index;
    let view = views[view_index];
#endif
    return view;
}
```

This also poses problems for things like lights where we want to return
a ptr to the light data. Returning ptrs from wgsl functions isn't
allowed even if both bindings were buffers.

The next attempt was to simply use indexed buffers everywhere, in both
the binding array and non binding array path. This would be viable if
push constants were available everywhere to pass the view index, but
unfortunately they are not available on webgpu. This means either
passing the view index in a storage buffer (not ideal for such a small
amount of state) or using push constants sometimes and uniform buffers
only on webgpu. However, this kind of conditional layout infects
absolutely everything.

Even if we were to accept just using storage buffer for the view index,
there's also the additional problem that some dynamic offsets aren't
actually per-view but per-use of a setting on a camera, which would
require passing that uniform data on *every* camera regardless of
whether that rendering feature is being used, which is also gross.

As such, although it's gross, the simplest solution just to bump binding
arrays into `@group(1)` and all other bindings up one bind group. This
should still bring us under the device limit of 4 for most users.

### Next steps / looking towards the future

I'd like to avoid needing split our view bind group into multiple parts.
In the future, if `wgpu` were to add `@builtin(draw_index)`, we could
build a list of draw state in gpu processing and avoid the need for any
kind of state change at all (see
https://github.com/gfx-rs/wgpu/issues/6823). This would also provide
significantly more flexibility to handle things like offsets into other
arrays that may not be per-view.

### Testing

Tested a number of examples, there are probably more that are still
broken.

---------

Co-authored-by: François Mockers <mockersf@gmail.com>
Co-authored-by: Elabajaba <Elabajaba@users.noreply.github.com>
2025-06-26 19:41:47 +00:00
charlotte 🌸
92e65d5eb1
Upgrade to Rust 1.88 (#19825) 2025-06-26 19:38:19 +00:00
Rob Parrett
35f1af522a
Reuse seeded rng in tilemap_chunk for more determinism (#19812)
# Objective

This example uses a seeded RNG for the initial setup, but new unseeded
RNGs during each timed update.

This is causing the example to produce different output each time in the
[example report](https://bevyengine.github.io/bevy-example-runner/).

<img width="838" alt="image"
src="https://github.com/user-attachments/assets/05d78083-97d0-4bcf-aebc-f645b570d144"
/>

## Solution

Store and reuse the RNG, following the pattern used in other examples.

## Testing

`cargo run --example tilemap_chunk`
2025-06-25 16:10:04 +00:00
Alix Bott
dd4479ed30
Fix PartialReflect::apply for maps, remove get_at/_mut from Map trait (#19802)
# Objective

- Fixes https://github.com/bevyengine/bevy/issues/14328
- `DynamicMap::drain` was broken (indices weren't cleared, causing a
panic when reading later)
- `PartialReflect::apply` was broken for maps and sets, because they
don't remove entries from the `self` map that aren't in the applied map.
- I discovered this bug when implementing MapEntities on a Component
containing a `HashMap<Entity, _>`. Because `apply` is used to reapply
the changes to the reflected map, the map ended up littered with a ton
of outdated entries.

## Solution

- Remove the separate `Vec` in `DynamicMap` and use the `HashTable`
directly, like it is in `DynamicSet`.
- Replace `MapIter` by `Box<dyn Iterator>` (like for `DynamicSet`), and
`Map::get_at` and `Map::get_at_mut` which are now unused.
- Now assume `DynamicMap` types are unordered and adjust documentation
accordingly.
- Fix documentation of `DynamicSet` (ordered -> unordered)
- Added `Map::retain` and `Set::retain`, and use them to remove excess
entries in `PartialReflect::apply` implementations.

## Testing

- Added `map::tests::apply` and `set::tests::apply` to validate
`<DynamicMap as PartialReflect>::apply` and `<DynamicSet as
PartialReflect>::apply`
2025-06-25 15:42:01 +00:00
François Mockers
97dcb279fb
CI tests can exit directly after taking a screenshot (#19806)
# Objective

- Currently, CI tests take a screenshot at frame X and exits at frame Y
with X < Y, and both number fixed
- This means tests can take longer than they actually need when taking
the screenshot is fast, and can fail to take the screenshot when it's
taking too long

## Solution

- Add a new event `ScreenshotAndExit` that exit directly after the
screenshot is saved
2025-06-24 22:44:30 +00:00
Conner Petzold
04c2b32be8
TilemapChunk cleanup (#19795)
# Objective

- Make follow-up changes from #18866 

## Solution

  - Switch from the on add observer to an on insert hook
  - Make the component immutable
  - Remove required components

## Testing

- `tilemap_chunk` example
2025-06-24 22:25:59 +00:00
Aevyrie
a3d406dd49
Upstream raycasting UVs (#19791)
# Objective

- Upstream mesh raycast UV support used in #19199

## Solution

- Compute UVs, debug a bunch of math issues with barycentric coordinates
and add docs.

## Testing

- Tested in diagetic UI in the linked PR.
2025-06-24 18:10:59 +00:00
atlv
bd4258bf5c
add forgotten migration guide (#19800)
# Objective

- Forgot to add a migration guide on #19789

## Solution

- Add one
2025-06-24 11:19:20 +00:00
dependabot[bot]
c7b5bc93c3
Update derive_more requirement from 1 to 2 (#19671)
Updates the requirements on
[derive_more](https://github.com/JelteF/derive_more) to permit the
latest version.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/JelteF/derive_more/releases">derive_more's
releases</a>.</em></p>
<blockquote>
<h2>2.0.1</h2>
<p><a href="https://docs.rs/derive_more/2.0.1">API docs</a>
<a
href="https://github.com/JelteF/derive_more/blob/v2.0.1/CHANGELOG.md#201---2025-02-03">Changelog</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/JelteF/derive_more/blob/master/CHANGELOG.md">derive_more's
changelog</a>.</em></p>
<blockquote>
<h2>2.0.1 - 2025-02-03</h2>
<h3>Added</h3>
<ul>
<li>Add crate metadata for the Rust Playground. This makes sure that the
Rust
Playground will have all <code>derive_more</code> features available
once
<a
href="https://docs.rs/selectors/latest/selectors"><code>selectors</code></a>
crate updates its
<code>derive_more</code> version.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/445">#445</a>)</li>
</ul>
<h2>2.0.0 - 2025-02-03</h2>
<h3>Breaking changes</h3>
<ul>
<li><code>use derive_more::SomeTrait</code> now imports macro only.
Importing macro with
its trait along is possible now via <code>use
derive_more::with_trait::SomeTrait</code>.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/406">#406</a>)</li>
<li>Top-level <code>#[display(&quot;...&quot;)]</code> attribute on an
enum now has defaulting behavior
instead of replacing when no wrapping is possible (no
<code>_variant</code> placeholder).
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/395">#395</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Associated types of type parameters not being treated as generics in
<code>Debug</code>
and <code>Display</code> expansions.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/399">#399</a>)</li>
<li><code>unreachable_code</code> warnings on generated code when
<code>!</code> (never type) is used.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/404">#404</a>)</li>
<li>Ambiguous associated item error when deriving <code>TryFrom</code>,
<code>TryInto</code> or <code>FromStr</code>
with an associated item called <code>Error</code> or <code>Err</code>
respectively.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/410">#410</a>)</li>
<li>Top-level <code>#[display(&quot;...&quot;)]</code> attribute on an
enum being incorrectly treated
as transparent or wrapping.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/395">#395</a>)</li>
<li>Omitted raw identifiers in <code>Debug</code> and
<code>Display</code> expansions.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/431">#431</a>)</li>
<li>Incorrect rendering of raw identifiers as field names in
<code>Debug</code> expansions.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/431">#431</a>)</li>
<li>Top-level <code>#[display(&quot;...&quot;)]</code> attribute on an
enum not working transparently
for directly specified fields.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/438">#438</a>)</li>
<li>Incorrect dereferencing of unsized fields in <code>Debug</code> and
<code>Display</code> expansions.
(<a
href="https://redirect.github.com/JelteF/derive_more/pull/440">#440</a>)</li>
</ul>
<h2>0.99.19 - 2025-02-03</h2>
<ul>
<li>Add crate metadata for the Rust Playground.</li>
</ul>
<h2>1.0.0 - 2024-08-07</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a78d8ee41d"><code>a78d8ee</code></a>
chore: Release</li>
<li><a
href="2aeee4d1c0"><code>2aeee4d</code></a>
Update changelog (<a
href="https://redirect.github.com/JelteF/derive_more/issues/446">#446</a>)</li>
<li><a
href="5afbaa1d8e"><code>5afbaa1</code></a>
Add Rust Playground metadata (<a
href="https://redirect.github.com/JelteF/derive_more/issues/445">#445</a>)</li>
<li><a
href="d6c3315f12"><code>d6c3315</code></a>
Prepare 2.0.0 release (<a
href="https://redirect.github.com/JelteF/derive_more/issues/444">#444</a>)</li>
<li><a
href="c5e5e82c0a"><code>c5e5e82</code></a>
Fix unsized fields usage in <code>Display</code>/<code>Debug</code>
derives (<a
href="https://redirect.github.com/JelteF/derive_more/issues/440">#440</a>,
<a
href="https://redirect.github.com/JelteF/derive_more/issues/432">#432</a>)</li>
<li><a
href="d391493a3c"><code>d391493</code></a>
Fix field transparency for top-level shared attribute in
<code>Display</code> (<a
href="https://redirect.github.com/JelteF/derive_more/issues/438">#438</a>)</li>
<li><a
href="f14c7a759a"><code>f14c7a7</code></a>
Fix raw identifiers usage in <code>Display</code>/<code>Debug</code>
derives (<a
href="https://redirect.github.com/JelteF/derive_more/issues/434">#434</a>,
<a
href="https://redirect.github.com/JelteF/derive_more/issues/431">#431</a>)</li>
<li><a
href="7b23de3d53"><code>7b23de3</code></a>
Update <code>convert_case</code> crate from 0.6 to 0.7 version (<a
href="https://redirect.github.com/JelteF/derive_more/issues/436">#436</a>)</li>
<li><a
href="cc9957e9cd"><code>cc9957e</code></a>
Fix <code>compile_fail</code> tests and make Clippy happy for 1.84 Rust
(<a
href="https://redirect.github.com/JelteF/derive_more/issues/435">#435</a>)</li>
<li><a
href="17d61c3118"><code>17d61c3</code></a>
Fix transparency and behavior of shared formatting on enums (<a
href="https://redirect.github.com/JelteF/derive_more/issues/395">#395</a>,
<a
href="https://redirect.github.com/JelteF/derive_more/issues/377">#377</a>,
<a
href="https://redirect.github.com/JelteF/derive_more/issues/411">#411</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/JelteF/derive_more/compare/v1.0.0...v2.0.1">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-24 11:13:04 +00:00
dependabot[bot]
86f00e8127
Bump cargo-bins/cargo-binstall from 1.12.3 to 1.12.5 (#19289)
Bumps
[cargo-bins/cargo-binstall](https://github.com/cargo-bins/cargo-binstall)
from 1.12.3 to 1.12.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/cargo-bins/cargo-binstall/releases">cargo-bins/cargo-binstall's
releases</a>.</em></p>
<blockquote>
<h2>v1.12.5</h2>
<p><em>Binstall is a tool to fetch and install Rust-based executables as
binaries. It aims to be a drop-in replacement for <code>cargo
install</code> in most cases. Install it today with <code>cargo install
cargo-binstall</code>, from the binaries below, or if you already have
it, upgrade with <code>cargo binstall cargo-binstall</code>.</em></p>
<h4>In this release:</h4>
<ul>
<li>Upgrade dependencies</li>
</ul>
<h2>v1.12.4</h2>
<p><em>Binstall is a tool to fetch and install Rust-based executables as
binaries. It aims to be a drop-in replacement for <code>cargo
install</code> in most cases. Install it today with <code>cargo install
cargo-binstall</code>, from the binaries below, or if you already have
it, upgrade with <code>cargo binstall cargo-binstall</code>.</em></p>
<h4>In this release:</h4>
<ul>
<li>Fix glibc detection on ubuntu 24.02 (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2141">#2141</a>
<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2143">#2143</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5cbf019d8c"><code>5cbf019</code></a>
release: cargo-binstall v1.12.5 (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2156">#2156</a>)</li>
<li><a
href="205aaa5a4f"><code>205aaa5</code></a>
chore: release (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2155">#2155</a>)</li>
<li><a
href="8d438736eb"><code>8d43873</code></a>
dep: Upgrade transitive dependencies (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2154">#2154</a>)</li>
<li><a
href="277269fc8e"><code>277269f</code></a>
build(deps): bump file-format from 0.26.0 to 0.27.0 in the deps group
(<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2149">#2149</a>)</li>
<li><a
href="45abf0e827"><code>45abf0e</code></a>
dep: Upgrade transitive dependencies (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2148">#2148</a>)</li>
<li><a
href="13f9d60d53"><code>13f9d60</code></a>
release: cargo-binstall v1.12.4 (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2146">#2146</a>)</li>
<li><a
href="f95e90d82c"><code>f95e90d</code></a>
chore: release (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2123">#2123</a>)</li>
<li><a
href="15dc05f12b"><code>15dc05f</code></a>
dep: Upgrade transitive dependencies (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2145">#2145</a>)</li>
<li><a
href="1394d1bbda"><code>1394d1b</code></a>
Fix glibc detection on ubuntu 24.02 (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2143">#2143</a>)</li>
<li><a
href="20e9b25913"><code>20e9b25</code></a>
dep: Upgrade transitive dependencies (<a
href="https://redirect.github.com/cargo-bins/cargo-binstall/issues/2142">#2142</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/cargo-bins/cargo-binstall/compare/v1.12.3...v1.12.5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cargo-bins/cargo-binstall&package-manager=github_actions&previous-version=1.12.3&new-version=1.12.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

You can trigger a rebase of this PR by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

> **Note**
> Automatic rebases have been disabled on this pull request as it has
been open for over 30 days.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: François Mockers <francois.mockers@vleue.com>
2025-06-24 11:11:09 +00:00
charlotte 🌸
7b5e4e3be0
Allow images to be resized on the GPU without losing data (#19462)
# Objective

#19410 added support for resizing images "in place" meaning that their
data was copied into the new texture allocation on the CPU. However,
there are some scenarios where an image may be created and populated
entirely on the GPU. Using this method would cause data to disappear, as
it wouldn't be copied into the new texture.

## Solution

When an image is resized in place, if it has no data in it's asset,
we'll opt into a new flag `copy_on_resize` which will issue a
`copy_texture_to_texture` command on the old allocation.

To support this, we require passing the old asset to all `RenderAsset`
implementations. This will be generally useful in the future for
reducing things like buffer re-allocations.

## Testing

Tested using the example in the issue.

---------

Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
2025-06-24 06:22:50 +00:00
atlv
8b6fe34570
remove unneeded dependency from bevy_render (#19794)
# Objective

- yeet cruft

## Solution

- yeet cruft

## Testing

- cargo clippy
2025-06-24 06:21:24 +00:00